1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 % %
4 % %
5 % %
6 % N N U U L L %
7 % NN N U U L L %
8 % N N N U U L L %
9 % N NN U U L L %
10 % N N UUU LLLLL LLLLL %
11 % %
12 % %
13 % Read/Write Image Of Uniform Color. %
14 % %
15 % Software Design %
16 % Cristy %
17 % July 1992 %
18 % %
19 % %
20 % Copyright 1999-2019 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 % https://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/blob.h"
44 #include "MagickCore/blob-private.h"
45 #include "MagickCore/cache.h"
46 #include "MagickCore/color.h"
47 #include "MagickCore/color-private.h"
48 #include "MagickCore/colorspace-private.h"
49 #include "MagickCore/exception.h"
50 #include "MagickCore/exception-private.h"
51 #include "MagickCore/image.h"
52 #include "MagickCore/image-private.h"
53 #include "MagickCore/list.h"
54 #include "MagickCore/magick.h"
55 #include "MagickCore/memory_.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 WriteNULLImage(const ImageInfo *,Image *,ExceptionInfo *)
67 magick_attribute((__pure__));
68
69 /*
70 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71 % %
72 % %
73 % %
74 % R e a d N U L L I m a g e %
75 % %
76 % %
77 % %
78 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
79 %
80 % ReadNULLImage creates a constant image and initializes it to the
81 % X server color as specified by the filename. It allocates the memory
82 % necessary for the new Image structure and returns a pointer to the new
83 % image.
84 %
85 % The format of the ReadNULLImage method is:
86 %
87 % Image *ReadNULLImage(const ImageInfo *image_info,
88 % ExceptionInfo *exception)
89 %
90 % A description of each parameter follows:
91 %
92 % o image_info: the image info.
93 %
94 % o exception: return any errors or warnings in this structure.
95 %
96 */
ReadNULLImage(const ImageInfo * image_info,ExceptionInfo * exception)97 static Image *ReadNULLImage(const ImageInfo *image_info,
98 ExceptionInfo *exception)
99 {
100 Image
101 *image;
102
103 MagickBooleanType
104 status;
105
106 PixelInfo
107 background;
108
109 register ssize_t
110 x;
111
112 register Quantum
113 *q;
114
115 ssize_t
116 y;
117
118 /*
119 Initialize Image structure.
120 */
121 assert(image_info != (const ImageInfo *) NULL);
122 assert(image_info->signature == MagickCoreSignature);
123 if (image_info->debug != MagickFalse)
124 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
125 image_info->filename);
126 assert(exception != (ExceptionInfo *) NULL);
127 assert(exception->signature == MagickCoreSignature);
128 image=AcquireImage(image_info,exception);
129 if (image->columns == 0)
130 image->columns=1;
131 if (image->rows == 0)
132 image->rows=1;
133 status=SetImageExtent(image,image->columns,image->rows,exception);
134 if (status == MagickFalse)
135 return(DestroyImageList(image));
136 ConformPixelInfo(image,&image->background_color,&background,exception);
137 image->alpha_trait=BlendPixelTrait;
138 background.alpha=(double) TransparentAlpha;
139 for (y=0; y < (ssize_t) image->rows; y++)
140 {
141 q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
142 if (q == (Quantum *) NULL)
143 break;
144 for (x=0; x < (ssize_t) image->columns; x++)
145 {
146 SetPixelViaPixelInfo(image,&background,q);
147 q+=GetPixelChannels(image);
148 }
149 if (SyncAuthenticPixels(image,exception) == MagickFalse)
150 break;
151 }
152 return(GetFirstImageInList(image));
153 }
154
155 /*
156 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
157 % %
158 % %
159 % %
160 % R e g i s t e r N U L L I m a g e %
161 % %
162 % %
163 % %
164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
165 %
166 % RegisterNULLImage() adds attributes for the NULL image format to
167 % the list of supported formats. The attributes include the image format
168 % tag, a method to read and/or write the format, whether the format
169 % supports the saving of more than one frame to the same file or blob,
170 % whether the format supports native in-memory I/O, and a brief
171 % description of the format.
172 %
173 % The format of the RegisterNULLImage method is:
174 %
175 % size_t RegisterNULLImage(void)
176 %
177 */
RegisterNULLImage(void)178 ModuleExport size_t RegisterNULLImage(void)
179 {
180 MagickInfo
181 *entry;
182
183 entry=AcquireMagickInfo("NULL","NULL","Constant image of uniform color");
184 entry->decoder=(DecodeImageHandler *) ReadNULLImage;
185 entry->encoder=(EncodeImageHandler *) WriteNULLImage;
186 entry->flags^=CoderAdjoinFlag;
187 entry->format_type=ImplicitFormatType;
188 (void) RegisterMagickInfo(entry);
189 return(MagickImageCoderSignature);
190 }
191
192 /*
193 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
194 % %
195 % %
196 % %
197 % U n r e g i s t e r N U L L I m a g e %
198 % %
199 % %
200 % %
201 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
202 %
203 % UnregisterNULLImage() removes format registrations made by the
204 % NULL module from the list of supported formats.
205 %
206 % The format of the UnregisterNULLImage method is:
207 %
208 % UnregisterNULLImage(void)
209 %
210 */
UnregisterNULLImage(void)211 ModuleExport void UnregisterNULLImage(void)
212 {
213 (void) UnregisterMagickInfo("NULL");
214 }
215
216 /*
217 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
218 % %
219 % %
220 % %
221 % W r i t e N U L L I m a g e %
222 % %
223 % %
224 % %
225 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
226 %
227 % WriteNULLImage writes no output at all. It is useful when specified
228 % as an output format when profiling.
229 %
230 % The format of the WriteNULLImage method is:
231 %
232 % MagickBooleanType WriteNULLImage(const ImageInfo *image_info,
233 % Image *image,ExceptionInfo *exception)
234 %
235 % A description of each parameter follows.
236 %
237 % o image_info: the image info.
238 %
239 % o image: The image.
240 %
241 % o exception: return any errors or warnings in this structure.
242 %
243 */
WriteNULLImage(const ImageInfo * image_info,Image * image,ExceptionInfo * exception)244 static MagickBooleanType WriteNULLImage(const ImageInfo *image_info,
245 Image *image,ExceptionInfo *exception)
246 {
247 assert(image_info != (const ImageInfo *) NULL);
248 assert(image_info->signature == MagickCoreSignature);
249 assert(image != (Image *) NULL);
250 assert(image->signature == MagickCoreSignature);
251 assert(exception != (ExceptionInfo *) NULL);
252 (void) exception;
253 if (image->debug != MagickFalse)
254 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
255 return(MagickTrue);
256 }
257