blob: e7db28ec7a3d43399e27432d779debfcfeeccd8a [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
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 %
cristyde984cd2013-12-01 14:49:27 +000016% Cristy %
cristy3ed852e2009-09-05 21:47:34 +000017% July 1992 %
18% %
19% %
Cristy7ce65e72015-12-12 18:03:16 -050020% Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization %
cristy3ed852e2009-09-05 21:47:34 +000021% 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*/
cristy4c08aed2011-07-01 19:47:50 +000042#include "MagickCore/studio.h"
cristy15338662012-06-21 01:45:37 +000043#include "MagickCore/attribute.h"
cristy4c08aed2011-07-01 19:47:50 +000044#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"
cristya7f89062013-03-30 21:53:44 +000049#include "MagickCore/list.h"
cristy4c08aed2011-07-01 19:47:50 +000050#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"
cristy3ed852e2009-09-05 21:47:34 +000058
59/*
60 Forward declarations.
61*/
62static MagickBooleanType
cristy1e178e72011-08-28 19:44:34 +000063 WriteCLIPImage(const ImageInfo *,Image *,ExceptionInfo *);
cristy3ed852e2009-09-05 21:47:34 +000064
65/*
66%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67% %
68% %
69% %
cristya7f89062013-03-30 21:53:44 +000070% 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
cristya7f89062013-03-30 21:53:44 +000094 *image;
95
96 ImageInfo
97 *read_info;
98
99 /*
100 Initialize Image structure.
101 */
102 assert(image_info != (const ImageInfo *) NULL);
cristye1c94d92015-06-28 12:16:33 +0000103 assert(image_info->signature == MagickCoreSignature);
cristya7f89062013-03-30 21:53:44 +0000104 if (image_info->debug != MagickFalse)
105 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
106 image_info->filename);
107 assert(exception != (ExceptionInfo *) NULL);
cristye1c94d92015-06-28 12:16:33 +0000108 assert(exception->signature == MagickCoreSignature);
cristya7f89062013-03-30 21:53:44 +0000109 read_info=CloneImageInfo(image_info);
110 SetImageInfoBlob(read_info,(void *) NULL,0);
cristy151b66d2015-04-15 10:50:31 +0000111 (void) CopyMagickString(read_info->magick,"MIFF",MagickPathExtent);
cristy20425982015-03-15 22:14:05 +0000112 image=ReadImage(read_info,exception);
cristya7f89062013-03-30 21:53:44 +0000113 read_info=DestroyImageInfo(read_info);
cristy20425982015-03-15 22:14:05 +0000114 if (image != (Image *) NULL)
115 {
116 Image
117 *clip_image;
118
119 (void) ClipImage(image,exception);
dirkaf131f12016-01-10 01:29:22 +0100120 clip_image=GetImageMask(image,ReadPixelMask,exception);
cristy20425982015-03-15 22:14:05 +0000121 if (clip_image == (Image *) NULL)
122 ThrowReaderException(CoderError,"ImageDoesNotHaveAClipMask");
123 image=DestroyImage(image);
124 image=clip_image;
125 }
cristya7f89062013-03-30 21:53:44 +0000126 return(GetFirstImageInList(image));
127}
128
129/*
130%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
131% %
132% %
133% %
cristy3ed852e2009-09-05 21:47:34 +0000134% 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%
cristybb503372010-05-27 20:51:26 +0000149% size_t RegisterCLIPImage(void)
cristy3ed852e2009-09-05 21:47:34 +0000150%
151*/
cristybb503372010-05-27 20:51:26 +0000152ModuleExport size_t RegisterCLIPImage(void)
cristy3ed852e2009-09-05 21:47:34 +0000153{
154 MagickInfo
155 *entry;
156
dirk06b627a2015-04-06 18:59:17 +0000157 entry=AcquireMagickInfo("CLIP","CLIP","Image Clip Mask");
cristya7f89062013-03-30 21:53:44 +0000158 entry->decoder=(DecodeImageHandler *) ReadCLIPImage;
cristy3ed852e2009-09-05 21:47:34 +0000159 entry->encoder=(EncodeImageHandler *) WriteCLIPImage;
cristy3ed852e2009-09-05 21:47:34 +0000160 (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,
cristy1e178e72011-08-28 19:44:34 +0000205% Image *image,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000206%
207% A description of each parameter follows.
208%
209% o image_info: the image info.
210%
211% o image: The image.
212%
cristy1e178e72011-08-28 19:44:34 +0000213% o exception: return any errors or warnings in this structure.
214%
cristy3ed852e2009-09-05 21:47:34 +0000215*/
216static MagickBooleanType WriteCLIPImage(const ImageInfo *image_info,
cristy1e178e72011-08-28 19:44:34 +0000217 Image *image,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +0000218{
219 Image
220 *clip_image;
221
222 ImageInfo
223 *write_info;
224
225 MagickBooleanType
226 status;
227
cristy883fde12013-04-08 00:50:13 +0000228 if (image->read_mask == MagickFalse)
cristy018f07f2011-09-04 21:15:19 +0000229 (void) ClipImage(image,exception);
cristy883fde12013-04-08 00:50:13 +0000230 if (image->read_mask == MagickFalse)
cristy3ed852e2009-09-05 21:47:34 +0000231 ThrowWriterException(CoderError,"ImageDoesNotHaveAClipMask");
dirkaf131f12016-01-10 01:29:22 +0100232 clip_image=GetImageMask(image,ReadPixelMask,exception);
cristy3ed852e2009-09-05 21:47:34 +0000233 if (clip_image == (Image *) NULL)
234 return(MagickFalse);
Cristye6fb02d2015-09-27 10:47:45 -0400235 (void) CopyMagickString(clip_image->filename,image->filename,
236 MagickPathExtent);
cristy3ed852e2009-09-05 21:47:34 +0000237 write_info=CloneImageInfo(image_info);
Cristye6fb02d2015-09-27 10:47:45 -0400238 *write_info->magick='\0';
cristy1e178e72011-08-28 19:44:34 +0000239 (void) SetImageInfo(write_info,1,exception);
cristy3ed852e2009-09-05 21:47:34 +0000240 if (LocaleCompare(write_info->magick,"CLIP") == 0)
cristy151b66d2015-04-15 10:50:31 +0000241 (void) FormatLocaleString(clip_image->filename,MagickPathExtent,"miff:%s",
cristy3ed852e2009-09-05 21:47:34 +0000242 write_info->filename);
cristy1e178e72011-08-28 19:44:34 +0000243 status=WriteImage(write_info,clip_image,exception);
cristy3ed852e2009-09-05 21:47:34 +0000244 clip_image=DestroyImage(clip_image);
245 write_info=DestroyImageInfo(write_info);
246 return(status);
247}