1/* 2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3% % 4% % 5% % 6% CCCC L IIIII PPPP % 7% C L I P P % 8% C L I PPPP % 9% C L I P % 10% CCCC LLLLL IIIII P % 11% % 12% % 13% Write Clip Mask 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/constitute.h" 47#include "MagickCore/exception.h" 48#include "MagickCore/exception-private.h" 49#include "MagickCore/list.h" 50#include "MagickCore/magick.h" 51#include "MagickCore/memory_.h" 52#include "MagickCore/monitor.h" 53#include "MagickCore/monitor-private.h" 54#include "MagickCore/quantum-private.h" 55#include "MagickCore/static.h" 56#include "MagickCore/string_.h" 57#include "MagickCore/module.h" 58 59/* 60 Forward declarations. 61*/ 62static MagickBooleanType 63 WriteCLIPImage(const ImageInfo *,Image *,ExceptionInfo *); 64 65/* 66%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 67% % 68% % 69% % 70% R e a d C L I P I m a g e % 71% % 72% % 73% % 74%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 75% 76% ReadCLIPImage returns the rendered clip path associated with the image. 77% 78% The format of the ReadCLIPImage method is: 79% 80% Image *ReadCLIPImage(const ImageInfo *image_info, 81% ExceptionInfo *exception) 82% 83% A description of each parameter follows: 84% 85% o image_info: the image info. 86% 87% o exception: return any errors or warnings in this structure. 88% 89*/ 90static Image *ReadCLIPImage(const ImageInfo *image_info, 91 ExceptionInfo *exception) 92{ 93 Image 94 *image; 95 96 ImageInfo 97 *read_info; 98 99 /* 100 Initialize Image structure. 101 */ 102 assert(image_info != (const ImageInfo *) NULL); 103 assert(image_info->signature == MagickCoreSignature); 104 if (image_info->debug != MagickFalse) 105 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 106 image_info->filename); 107 assert(exception != (ExceptionInfo *) NULL); 108 assert(exception->signature == MagickCoreSignature); 109 read_info=CloneImageInfo(image_info); 110 SetImageInfoBlob(read_info,(void *) NULL,0); 111 (void) CopyMagickString(read_info->magick,"MIFF",MagickPathExtent); 112 image=ReadImage(read_info,exception); 113 read_info=DestroyImageInfo(read_info); 114 if (image != (Image *) NULL) 115 { 116 Image 117 *clip_image; 118 119 (void) ClipImage(image,exception); 120 clip_image=GetImageMask(image,ReadPixelMask,exception); 121 if (clip_image == (Image *) NULL) 122 ThrowReaderException(CoderError,"ImageDoesNotHaveAClipMask"); 123 image=DestroyImage(image); 124 image=clip_image; 125 } 126 return(GetFirstImageInList(image)); 127} 128 129/* 130%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 131% % 132% % 133% % 134% R e g i s t e r C L I P I m a g e % 135% % 136% % 137% % 138%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 139% 140% RegisterCLIPImage() adds attributes for the CLIP image format to 141% the list of supported formats. The attributes include the image format 142% tag, a method to read and/or write the format, whether the format 143% supports the saving of more than one frame to the same file or blob, 144% whether the format supports native in-memory I/O, and a brief 145% description of the format. 146% 147% The format of the RegisterCLIPImage method is: 148% 149% size_t RegisterCLIPImage(void) 150% 151*/ 152ModuleExport size_t RegisterCLIPImage(void) 153{ 154 MagickInfo 155 *entry; 156 157 entry=AcquireMagickInfo("CLIP","CLIP","Image Clip Mask"); 158 entry->decoder=(DecodeImageHandler *) ReadCLIPImage; 159 entry->encoder=(EncodeImageHandler *) WriteCLIPImage; 160 (void) RegisterMagickInfo(entry); 161 return(MagickImageCoderSignature); 162} 163 164/* 165%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 166% % 167% % 168% % 169% U n r e g i s t e r C L I P I m a g e % 170% % 171% % 172% % 173%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 174% 175% UnregisterCLIPImage() removes format registrations made by the 176% CLIP module from the list of supported formats. 177% 178% The format of the UnregisterCLIPImage method is: 179% 180% UnregisterCLIPImage(void) 181% 182*/ 183ModuleExport void UnregisterCLIPImage(void) 184{ 185 (void) UnregisterMagickInfo("CLIP"); 186} 187 188/* 189%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 190% % 191% % 192% % 193% W r i t e C L I P I m a g e % 194% % 195% % 196% % 197%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 198% 199% WriteCLIPImage() writes an image of clip bytes to a file. It consists of 200% data from the clip mask of the image. 201% 202% The format of the WriteCLIPImage method is: 203% 204% MagickBooleanType WriteCLIPImage(const ImageInfo *image_info, 205% Image *image,ExceptionInfo *exception) 206% 207% A description of each parameter follows. 208% 209% o image_info: the image info. 210% 211% o image: The image. 212% 213% o exception: return any errors or warnings in this structure. 214% 215*/ 216static MagickBooleanType WriteCLIPImage(const ImageInfo *image_info, 217 Image *image,ExceptionInfo *exception) 218{ 219 Image 220 *clip_image; 221 222 ImageInfo 223 *write_info; 224 225 MagickBooleanType 226 status; 227 228 if (image->read_mask == MagickFalse) 229 (void) ClipImage(image,exception); 230 if (image->read_mask == MagickFalse) 231 ThrowWriterException(CoderError,"ImageDoesNotHaveAClipMask"); 232 clip_image=GetImageMask(image,ReadPixelMask,exception); 233 if (clip_image == (Image *) NULL) 234 return(MagickFalse); 235 (void) CopyMagickString(clip_image->filename,image->filename, 236 MagickPathExtent); 237 write_info=CloneImageInfo(image_info); 238 *write_info->magick='\0'; 239 (void) SetImageInfo(write_info,1,exception); 240 if ((*write_info->magick == '\0') || 241 (LocaleCompare(write_info->magick,"CLIP") == 0)) 242 (void) FormatLocaleString(clip_image->filename,MagickPathExtent,"miff:%s", 243 write_info->filename); 244 status=WriteImage(write_info,clip_image,exception); 245 clip_image=DestroyImage(clip_image); 246 write_info=DestroyImageInfo(write_info); 247 return(status); 248} 249