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 */
65 static 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 */
RegisterMATTEImage(void)91 ModuleExport 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 */
UnregisterMATTEImage(void)122 ModuleExport 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 */
WriteMATTEImage(const ImageInfo * image_info,Image * image,ExceptionInfo * exception)155 static 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