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