1/* 2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3% % 4% % 5% % 6% M M AAA TTTTT TTTTT EEEEE % 7% MM MM A A T T E % 8% M M M AAAAA T T EEE % 9% M M A A T T E % 10% M M A A T T EEEEE % 11% % 12% % 13% Write Matte Channel To MIFF File. % 14% % 15% Software Design % 16% Cristy % 17% July 1992 % 18% % 19% % 20% Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization % 21% dedicated to making software imaging solutions freely available. % 22% % 23% You may not use this file except in compliance with the License. You may % 24% obtain a copy of the License at % 25% % 26% http://www.imagemagick.org/script/license.php % 27% % 28% Unless required by applicable law or agreed to in writing, software % 29% distributed under the License is distributed on an "AS IS" BASIS, % 30% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 31% See the License for the specific language governing permissions and % 32% limitations under the License. % 33% % 34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 35% 36% 37*/ 38 39/* 40 Include declarations. 41*/ 42#include "MagickCore/studio.h" 43#include "MagickCore/attribute.h" 44#include "MagickCore/blob.h" 45#include "MagickCore/blob-private.h" 46#include "MagickCore/cache.h" 47#include "MagickCore/constitute.h" 48#include "MagickCore/exception.h" 49#include "MagickCore/exception-private.h" 50#include "MagickCore/image-private.h" 51#include "MagickCore/list.h" 52#include "MagickCore/magick.h" 53#include "MagickCore/memory_.h" 54#include "MagickCore/monitor.h" 55#include "MagickCore/monitor-private.h" 56#include "MagickCore/pixel-accessor.h" 57#include "MagickCore/quantum-private.h" 58#include "MagickCore/static.h" 59#include "MagickCore/string_.h" 60#include "MagickCore/module.h" 61 62/* 63 Forward declarations. 64*/ 65static MagickBooleanType 66 WriteMATTEImage(const ImageInfo *,Image *,ExceptionInfo *); 67 68/* 69%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 70% % 71% % 72% % 73% R e g i s t e r M A T T E I m a g e % 74% % 75% % 76% % 77%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 78% 79% RegisterMATTEImage() adds attributes for the MATTE image format to 80% the list of supported formats. The attributes include the image format 81% tag, a method to read and/or write the format, whether the format 82% supports the saving of more than one frame to the same file or blob, 83% whether the format supports native in-memory I/O, and a brief 84% description of the format. 85% 86% The format of the RegisterMATTEImage method is: 87% 88% size_t RegisterMATTEImage(void) 89% 90*/ 91ModuleExport size_t RegisterMATTEImage(void) 92{ 93 MagickInfo 94 *entry; 95 96 entry=AcquireMagickInfo("MATTE","MATTE","MATTE format"); 97 entry->encoder=(EncodeImageHandler *) WriteMATTEImage; 98 entry->format_type=ExplicitFormatType; 99 (void) RegisterMagickInfo(entry); 100 return(MagickImageCoderSignature); 101} 102 103/* 104%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 105% % 106% % 107% % 108% U n r e g i s t e r M A T T E I m a g e % 109% % 110% % 111% % 112%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 113% 114% UnregisterMATTEImage() removes format registrations made by the 115% MATTE module from the list of supported formats. 116% 117% The format of the UnregisterMATTEImage method is: 118% 119% UnregisterMATTEImage(void) 120% 121*/ 122ModuleExport void UnregisterMATTEImage(void) 123{ 124 (void) UnregisterMagickInfo("MATTE"); 125} 126 127/* 128%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 129% % 130% % 131% % 132% W r i t e M A T T E I m a g e % 133% % 134% % 135% % 136%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 137% 138% WriteMATTEImage() writes an image of matte bytes to a file. It consists of 139% data from the matte component of the image [0..255]. 140% 141% The format of the WriteMATTEImage method is: 142% 143% MagickBooleanType WriteMATTEImage(const ImageInfo *image_info, 144% Image *image,ExceptionInfo *exception) 145% 146% A description of each parameter follows. 147% 148% o image_info: the image info. 149% 150% o image: The image. 151% 152% o exception: return any errors or warnings in this structure. 153% 154*/ 155static MagickBooleanType WriteMATTEImage(const ImageInfo *image_info, 156 Image *image,ExceptionInfo *exception) 157{ 158 Image 159 *matte_image; 160 161 ImageInfo 162 *write_info; 163 164 MagickBooleanType 165 status; 166 167 register const Quantum 168 *p; 169 170 register ssize_t 171 x; 172 173 register Quantum 174 *q; 175 176 ssize_t 177 y; 178 179 if (image->alpha_trait == UndefinedPixelTrait) 180 ThrowWriterException(CoderError,"ImageDoesNotHaveAnAlphaChannel"); 181 matte_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception); 182 if (matte_image == (Image *) NULL) 183 return(MagickFalse); 184 (void) SetImageType(matte_image,TrueColorAlphaType,exception); 185 matte_image->alpha_trait=UndefinedPixelTrait; 186 /* 187 Convert image to matte pixels. 188 */ 189 for (y=0; y < (ssize_t) image->rows; y++) 190 { 191 p=GetVirtualPixels(image,0,y,image->columns,1,exception); 192 q=QueueAuthenticPixels(matte_image,0,y,matte_image->columns,1,exception); 193 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) 194 break; 195 for (x=0; x < (ssize_t) image->columns; x++) 196 { 197 SetPixelRed(matte_image,GetPixelAlpha(image,p),q); 198 SetPixelGreen(matte_image,GetPixelAlpha(image,p),q); 199 SetPixelBlue(matte_image,GetPixelAlpha(image,p),q); 200 SetPixelAlpha(matte_image,OpaqueAlpha,q); 201 p+=GetPixelChannels(image); 202 q+=GetPixelChannels(matte_image); 203 } 204 if (SyncAuthenticPixels(matte_image,exception) == MagickFalse) 205 break; 206 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, 207 image->rows); 208 if (status == MagickFalse) 209 break; 210 } 211 write_info=CloneImageInfo(image_info); 212 if ((*write_info->magick == '\0') || 213 (LocaleCompare(write_info->magick,"MATTE") == 0)) 214 (void) FormatLocaleString(matte_image->filename,MagickPathExtent, 215 "MIFF:%s",image->filename); 216 status=WriteImage(write_info,matte_image,exception); 217 write_info=DestroyImageInfo(write_info); 218 matte_image=DestroyImage(matte_image); 219 return(status); 220} 221