blob: 9c220e571b78a3587f2c8ae97a9ef6257503273f [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% H H AAA L DDDD %
7% H H A A L D D %
8% HHHHH AAAAA L D D %
9% H H A A L D D %
10% H H A A LLLLL DDDD %
11% %
12% %
13% Create Identity Hald CLUT Image Format %
14% %
15% Software Design %
16% John Cristy %
17% July 1992 %
18% %
19% %
cristy16af1cb2009-12-11 21:38:29 +000020% Copyright 1999-2010 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*/
42#include "magick/studio.h"
43#include "magick/blob.h"
44#include "magick/blob-private.h"
45#include "magick/cache.h"
46#include "magick/colorspace.h"
47#include "magick/exception.h"
48#include "magick/exception-private.h"
49#include "magick/image.h"
50#include "magick/image-private.h"
51#include "magick/list.h"
52#include "magick/magick.h"
53#include "magick/memory_.h"
cristyf2f27272009-12-17 14:48:46 +000054#include "magick/module.h"
cristy3ed852e2009-09-05 21:47:34 +000055#include "magick/monitor.h"
56#include "magick/monitor-private.h"
57#include "magick/quantum-private.h"
58#include "magick/static.h"
59#include "magick/string_.h"
cristyf2f27272009-12-17 14:48:46 +000060#include "magick/string-private.h"
cristy3ed852e2009-09-05 21:47:34 +000061
62/*
63%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64% %
65% %
66% %
67% R e a d H A L D I m a g e %
68% %
69% %
70% %
71%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
72%
73% ReadHALDImage() creates a Hald color lookup table image and returns it. It
74% allocates the memory necessary for the new Image structure and returns a
75% pointer to the new image.
76%
77% The format of the ReadHALDImage method is:
78%
79% Image *ReadHALDImage(const ImageInfo *image_info,
80% ExceptionInfo *exception)
81%
82% A description of each parameter follows:
83%
84% o image_info: the image info.
85%
86% o exception: return any errors or warnings in this structure.
87%
88*/
89static Image *ReadHALDImage(const ImageInfo *image_info,
90 ExceptionInfo *exception)
91{
92 Image
93 *image;
94
cristybb503372010-05-27 20:51:26 +000095 ssize_t
cristy3ed852e2009-09-05 21:47:34 +000096 y;
97
98 MagickBooleanType
99 status;
100
101 size_t
102 cube_size,
103 level;
104
cristy3ed852e2009-09-05 21:47:34 +0000105 /*
106 Create HALD color lookup table image.
107 */
108 assert(image_info != (const ImageInfo *) NULL);
109 assert(image_info->signature == MagickSignature);
110 if (image_info->debug != MagickFalse)
111 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
112 image_info->filename);
113 assert(exception != (ExceptionInfo *) NULL);
114 assert(exception->signature == MagickSignature);
115 image=AcquireImage(image_info);
116 level=0;
117 if (*image_info->filename != '\0')
cristye27293e2009-12-18 02:53:20 +0000118 level=StringToUnsignedLong(image_info->filename);
cristy3ed852e2009-09-05 21:47:34 +0000119 if (level < 2)
120 level=8;
121 status=MagickTrue;
122 cube_size=level*level;
cristybb503372010-05-27 20:51:26 +0000123 image->columns=(size_t) (level*cube_size);
124 image->rows=(size_t) (level*cube_size);
125 for (y=0; y < (ssize_t) image->rows; y+=(ssize_t) level)
cristy3ed852e2009-09-05 21:47:34 +0000126 {
cristybb503372010-05-27 20:51:26 +0000127 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000128 blue,
129 green,
130 red;
131
132 register PixelPacket
cristyc47d1f82009-11-26 01:44:43 +0000133 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000134
135 if (status == MagickFalse)
136 continue;
cristybb503372010-05-27 20:51:26 +0000137 q=QueueAuthenticPixels(image,0,y,image->columns,(size_t) level,
cristyaa740112010-03-30 17:58:44 +0000138 exception);
cristy3ed852e2009-09-05 21:47:34 +0000139 if (q == (PixelPacket *) NULL)
140 {
141 status=MagickFalse;
142 continue;
143 }
cristybb503372010-05-27 20:51:26 +0000144 blue=y/(ssize_t) level;
145 for (green=0; green < (ssize_t) cube_size; green++)
cristy3ed852e2009-09-05 21:47:34 +0000146 {
cristybb503372010-05-27 20:51:26 +0000147 for (red=0; red < (ssize_t) cube_size; red++)
cristy3ed852e2009-09-05 21:47:34 +0000148 {
cristyce70c172010-01-07 17:15:30 +0000149 q->red=ClampToQuantum(QuantumRange*red/(cube_size-1.0));
150 q->green=ClampToQuantum(QuantumRange*green/(cube_size-1.0));
151 q->blue=ClampToQuantum(QuantumRange*blue/(cube_size-1.0));
152 SetOpacityPixelComponent(q,OpaqueOpacity);
cristy3ed852e2009-09-05 21:47:34 +0000153 q++;
154 }
155 }
cristyaa740112010-03-30 17:58:44 +0000156 if (SyncAuthenticPixels(image,exception) == MagickFalse)
cristy3ed852e2009-09-05 21:47:34 +0000157 status=MagickFalse;
158 }
cristy3ed852e2009-09-05 21:47:34 +0000159 return(GetFirstImageInList(image));
160}
161
162/*
163%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
164% %
165% %
166% %
167% R e g i s t e r H A L D I m a g e %
168% %
169% %
170% %
171%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
172%
173% RegisterHALDImage() adds attributes for the Hald color lookup table image
174% format to the list of supported formats. The attributes include the image
175% format tag, a method to read and/or write the format, whether the format
176% supports the saving of more than one frame to the same file or blob, whether
177% the format supports native in-memory I/O, and a brief description of the
178% format.
179%
180% The format of the RegisterHALDImage method is:
181%
cristybb503372010-05-27 20:51:26 +0000182% size_t RegisterHALDImage(void)
cristy3ed852e2009-09-05 21:47:34 +0000183%
184*/
cristybb503372010-05-27 20:51:26 +0000185ModuleExport size_t RegisterHALDImage(void)
cristy3ed852e2009-09-05 21:47:34 +0000186{
187 MagickInfo
188 *entry;
189
190 entry=SetMagickInfo("HALD");
191 entry->decoder=(DecodeImageHandler *) ReadHALDImage;
192 entry->adjoin=MagickFalse;
cristy009d7392010-07-25 22:08:41 +0000193 entry->format_type=ImplicitFormatType;
cristy3ed852e2009-09-05 21:47:34 +0000194 entry->raw=MagickTrue;
195 entry->endian_support=MagickTrue;
196 entry->description=ConstantString("Identity Hald color lookup table image");
197 (void) RegisterMagickInfo(entry);
198 return(MagickImageCoderSignature);
199}
200
201/*
202%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
203% %
204% %
205% %
206% U n r e g i s t e r H A L D I m a g e %
207% %
208% %
209% %
210%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
211%
212% UnregisterHALDImage() removes format registrations made by the
213% HALD module from the list of supported formats.
214%
215% The format of the UnregisterHALDImage method is:
216%
217% UnregisterHALDImage(void)
218%
219*/
220ModuleExport void UnregisterHALDImage(void)
221{
222 (void) UnregisterMagickInfo("HALD");
223}