blob: 7864121038bd3787e28f480da654f4ed5ef76e81 [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% DDDD N N GGGG %
7% D D NN N GS %
8% D D N N N G GG %
9% D D N NN G G %
10% DDDD N N GGGG %
11% %
12% %
13% Read the Digital Negative Image Format %
14% %
15% Software Design %
16% John Cristy %
17% July 1999 %
18% %
19% %
cristy7e41fe82010-12-04 23:12:08 +000020% Copyright 1999-2011 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 Include declarations.
40*/
cristy4c08aed2011-07-01 19:47:50 +000041#include "MagickCore/studio.h"
42#include "MagickCore/blob.h"
43#include "MagickCore/blob-private.h"
44#include "MagickCore/constitute.h"
45#include "MagickCore/delegate.h"
46#include "MagickCore/exception.h"
47#include "MagickCore/exception-private.h"
48#include "MagickCore/geometry.h"
49#include "MagickCore/image.h"
50#include "MagickCore/image-private.h"
51#include "MagickCore/layer.h"
52#include "MagickCore/list.h"
53#include "MagickCore/log.h"
54#include "MagickCore/magick.h"
55#include "MagickCore/memory_.h"
56#include "MagickCore/resource_.h"
57#include "MagickCore/quantum-private.h"
58#include "MagickCore/static.h"
59#include "MagickCore/string_.h"
60#include "MagickCore/module.h"
61#include "MagickCore/transform.h"
62#include "MagickCore/utility.h"
63#include "MagickCore/xml-tree.h"
cristy3ed852e2009-09-05 21:47:34 +000064
65/*
66%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67% %
68% %
69% %
70% R e a d D N G I m a g e %
71% %
72% %
73% %
74%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75%
76% ReadDNGImage() reads an binary file in the Digital Negative format and
77% returns it. It allocates the memory necessary for the new Image structure
78% and returns a pointer to the new image.
79%
80% The format of the ReadDNGImage method is:
81%
82% Image *ReadDNGImage(const ImageInfo *image_info,
83% ExceptionInfo *exception)
84%
85% A description of each parameter follows:
86%
87% o image_info: the image info.
88%
89% o exception: return any errors or warnings in this structure.
90%
91*/
92static Image *ReadDNGImage(const ImageInfo *image_info,ExceptionInfo *exception)
93{
94 ExceptionInfo
95 *sans_exception;
96
97 Image
98 *image;
99
100 ImageInfo
101 *read_info;
102
103 MagickBooleanType
104 status;
105
106 /*
107 Open image file.
108 */
109 assert(image_info != (const ImageInfo *) NULL);
110 assert(image_info->signature == MagickSignature);
111 if (image_info->debug != MagickFalse)
112 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
113 image_info->filename);
114 assert(exception != (ExceptionInfo *) NULL);
115 assert(exception->signature == MagickSignature);
116 image=AcquireImage(image_info);
117 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
118 if (status == MagickFalse)
119 {
120 image=DestroyImageList(image);
121 return((Image *) NULL);
122 }
123 (void) CloseBlob(image);
124 (void) DestroyImageList(image);
125 /*
126 Convert DNG to PPM with delegate.
127 */
128 image=AcquireImage(image_info);
129 read_info=CloneImageInfo(image_info);
cristy98f91ec2011-02-03 01:15:48 +0000130 SetImageInfoBlob(read_info,(void *) NULL,0);
cristy3ed852e2009-09-05 21:47:34 +0000131 (void) InvokeDelegate(read_info,image,"dng:decode",(char *) NULL,exception);
132 image=DestroyImage(image);
cristyb51dff52011-05-19 16:55:47 +0000133 (void) FormatLocaleString(read_info->filename,MaxTextExtent,"%s.png",
cristy3ed852e2009-09-05 21:47:34 +0000134 read_info->unique);
135 sans_exception=AcquireExceptionInfo();
136 image=ReadImage(read_info,sans_exception);
137 sans_exception=DestroyExceptionInfo(sans_exception);
138 if (image == (Image *) NULL)
139 {
cristyb51dff52011-05-19 16:55:47 +0000140 (void) FormatLocaleString(read_info->filename,MaxTextExtent,"%s.ppm",
cristy3ed852e2009-09-05 21:47:34 +0000141 read_info->unique);
142 image=ReadImage(read_info,exception);
143 }
144 (void) RelinquishUniqueFileResource(read_info->filename);
145 if (image != (Image *) NULL)
146 {
147 char
148 filename[MaxTextExtent],
149 *xml;
150
151 ExceptionInfo
152 *sans;
153
154 (void) CopyMagickString(image->magick,read_info->magick,MaxTextExtent);
cristyb51dff52011-05-19 16:55:47 +0000155 (void) FormatLocaleString(filename,MaxTextExtent,"%s.ufraw",
cristy3ed852e2009-09-05 21:47:34 +0000156 read_info->unique);
157 sans=AcquireExceptionInfo();
158 xml=FileToString(filename,MaxTextExtent,sans);
159 (void) RelinquishUniqueFileResource(filename);
160 if (xml != (char *) NULL)
161 {
162 XMLTreeInfo
cristyddbc41b2011-04-24 14:27:48 +0000163 *ufraw;
cristy3ed852e2009-09-05 21:47:34 +0000164
165 /*
166 Inject
167 */
168 ufraw=NewXMLTree(xml,sans);
169 if (ufraw != (XMLTreeInfo *) NULL)
170 {
171 char
172 *content,
173 property[MaxTextExtent];
174
175 const char
176 *tag;
177
178 XMLTreeInfo
179 *next;
180
181 if (image->properties == (void *) NULL)
182 ((Image *) image)->properties=NewSplayTree(
183 CompareSplayTreeString,RelinquishMagickMemory,
184 RelinquishMagickMemory);
185 next=GetXMLTreeChild(ufraw,(const char *) NULL);
186 while (next != (XMLTreeInfo *) NULL)
187 {
188 tag=GetXMLTreeTag(next);
189 if (tag == (char *) NULL)
190 tag="unknown";
cristyb51dff52011-05-19 16:55:47 +0000191 (void) FormatLocaleString(property,MaxTextExtent,"dng:%s",tag);
cristy3ed852e2009-09-05 21:47:34 +0000192 content=ConstantString(GetXMLTreeContent(next));
193 StripString(content);
194 if ((LocaleCompare(tag,"log") != 0) &&
195 (LocaleCompare(tag,"InputFilename") != 0) &&
196 (LocaleCompare(tag,"OutputFilename") != 0) &&
197 (LocaleCompare(tag,"OutputType") != 0) &&
198 (strlen(content) != 0))
199 (void) AddValueToSplayTree((SplayTreeInfo *)
200 ((Image *) image)->properties,ConstantString(property),
201 content);
202 next=GetXMLTreeSibling(next);
203 }
204 ufraw=DestroyXMLTree(ufraw);
205 }
206 xml=DestroyString(xml);
207 }
208 sans=DestroyExceptionInfo(sans);
209 }
210 read_info=DestroyImageInfo(read_info);
211 return(image);
212}
213
214/*
215%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
216% %
217% %
218% %
219% R e g i s t e r D N G I m a g e %
220% %
221% %
222% %
223%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
224%
225% RegisterDNGImage() adds attributes for the DNG image format to
226% the list of supported formats. The attributes include the image format
227% tag, a method to read and/or write the format, whether the format
228% supports the saving of more than one frame to the same file or blob,
229% whether the format supports native in-memory I/O, and a brief
230% description of the format.
231%
232% The format of the RegisterDNGImage method is:
233%
cristybb503372010-05-27 20:51:26 +0000234% size_t RegisterDNGImage(void)
cristy3ed852e2009-09-05 21:47:34 +0000235%
236*/
cristybb503372010-05-27 20:51:26 +0000237ModuleExport size_t RegisterDNGImage(void)
cristy3ed852e2009-09-05 21:47:34 +0000238{
239 MagickInfo
240 *entry;
241
cristy94c8fe42009-10-06 01:57:36 +0000242 entry=SetMagickInfo("3FR");
243 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
244 entry->blob_support=MagickFalse;
245 entry->seekable_stream=MagickTrue;
246 entry->format_type=ExplicitFormatType;
247 entry->description=ConstantString("Hasselblad CFV/H3D39II");
248 entry->module=ConstantString("DNG");
249 (void) RegisterMagickInfo(entry);
cristy3ed852e2009-09-05 21:47:34 +0000250 entry=SetMagickInfo("ARW");
251 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
252 entry->blob_support=MagickFalse;
253 entry->seekable_stream=MagickTrue;
254 entry->format_type=ExplicitFormatType;
255 entry->description=ConstantString("Sony Alpha Raw Image Format");
256 entry->module=ConstantString("DNG");
257 (void) RegisterMagickInfo(entry);
258 entry=SetMagickInfo("DNG");
259 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
260 entry->blob_support=MagickFalse;
261 entry->seekable_stream=MagickTrue;
262 entry->format_type=ExplicitFormatType;
263 entry->description=ConstantString("Digital Negative");
264 entry->module=ConstantString("DNG");
265 (void) RegisterMagickInfo(entry);
266 entry=SetMagickInfo("CR2");
267 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
268 entry->blob_support=MagickFalse;
269 entry->seekable_stream=MagickTrue;
270 entry->format_type=ExplicitFormatType;
271 entry->description=ConstantString("Canon Digital Camera Raw Image Format");
272 entry->module=ConstantString("DNG");
273 (void) RegisterMagickInfo(entry);
274 entry=SetMagickInfo("CRW");
275 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
276 entry->blob_support=MagickFalse;
277 entry->seekable_stream=MagickTrue;
278 entry->format_type=ExplicitFormatType;
279 entry->description=ConstantString("Canon Digital Camera Raw Image Format");
280 entry->module=ConstantString("DNG");
281 (void) RegisterMagickInfo(entry);
282 entry=SetMagickInfo("DCR");
283 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
284 entry->blob_support=MagickFalse;
285 entry->seekable_stream=MagickTrue;
286 entry->format_type=ExplicitFormatType;
287 entry->description=ConstantString("Kodak Digital Camera Raw Image File");
288 entry->module=ConstantString("DNG");
289 (void) RegisterMagickInfo(entry);
290 entry=SetMagickInfo("ERF");
291 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
292 entry->blob_support=MagickFalse;
293 entry->seekable_stream=MagickTrue;
294 entry->format_type=ExplicitFormatType;
295 entry->description=ConstantString("Epson RAW Format");
296 entry->module=ConstantString("DNG");
297 (void) RegisterMagickInfo(entry);
298 entry=SetMagickInfo("KDC");
299 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
300 entry->blob_support=MagickFalse;
301 entry->seekable_stream=MagickTrue;
302 entry->format_type=ExplicitFormatType;
303 entry->description=ConstantString("Kodak Digital Camera Raw Image Format");
304 entry->module=ConstantString("DNG");
305 (void) RegisterMagickInfo(entry);
306 entry=SetMagickInfo("K25");
307 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
308 entry->blob_support=MagickFalse;
309 entry->seekable_stream=MagickTrue;
310 entry->format_type=ExplicitFormatType;
311 entry->description=ConstantString("Kodak Digital Camera Raw Image Format");
312 entry->module=ConstantString("DNG");
313 (void) RegisterMagickInfo(entry);
314 entry=SetMagickInfo("MRW");
315 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
316 entry->blob_support=MagickFalse;
317 entry->seekable_stream=MagickTrue;
318 entry->format_type=ExplicitFormatType;
319 entry->description=ConstantString("Sony (Minolta) Raw Image File");
320 entry->module=ConstantString("DNG");
321 (void) RegisterMagickInfo(entry);
322 entry=SetMagickInfo("NEF");
323 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
324 entry->blob_support=MagickFalse;
325 entry->seekable_stream=MagickTrue;
326 entry->format_type=ExplicitFormatType;
327 entry->description=ConstantString("Nikon Digital SLR Camera Raw Image File");
328 entry->module=ConstantString("DNG");
329 (void) RegisterMagickInfo(entry);
330 entry=SetMagickInfo("ORF");
331 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
332 entry->blob_support=MagickFalse;
333 entry->seekable_stream=MagickTrue;
334 entry->format_type=ExplicitFormatType;
335 entry->description=ConstantString("Olympus Digital Camera Raw Image File");
336 entry->module=ConstantString("DNG");
337 (void) RegisterMagickInfo(entry);
338 entry=SetMagickInfo("PEF");
339 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
340 entry->blob_support=MagickFalse;
341 entry->seekable_stream=MagickTrue;
342 entry->format_type=ExplicitFormatType;
343 entry->description=ConstantString("Pentax Electronic File");
344 entry->module=ConstantString("DNG");
345 (void) RegisterMagickInfo(entry);
346 entry=SetMagickInfo("RAF");
347 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
348 entry->blob_support=MagickFalse;
349 entry->seekable_stream=MagickTrue;
350 entry->format_type=ExplicitFormatType;
351 entry->description=ConstantString("Fuji CCD-RAW Graphic File");
352 entry->module=ConstantString("DNG");
353 (void) RegisterMagickInfo(entry);
354 entry=SetMagickInfo("SRF");
355 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
356 entry->blob_support=MagickFalse;
357 entry->seekable_stream=MagickTrue;
358 entry->format_type=ExplicitFormatType;
359 entry->description=ConstantString("Sony Raw Format");
360 entry->module=ConstantString("DNG");
361 (void) RegisterMagickInfo(entry);
362 entry=SetMagickInfo("SR2");
363 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
364 entry->blob_support=MagickFalse;
365 entry->seekable_stream=MagickTrue;
366 entry->format_type=ExplicitFormatType;
367 entry->description=ConstantString("Sony Raw Format 2");
368 entry->module=ConstantString("DNG");
369 (void) RegisterMagickInfo(entry);
370 entry=SetMagickInfo("X3F");
371 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
372 entry->blob_support=MagickFalse;
373 entry->seekable_stream=MagickTrue;
374 entry->format_type=ExplicitFormatType;
375 entry->description=ConstantString("Sigma Camera RAW Picture File");
376 entry->module=ConstantString("DNG");
377 (void) RegisterMagickInfo(entry);
378 return(MagickImageCoderSignature);
379}
380
381/*
382%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
383% %
384% %
385% %
386% U n r e g i s t e r D N G I m a g e %
387% %
388% %
389% %
390%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
391%
392% UnregisterDNGImage() removes format registrations made by the
393% BIM module from the list of supported formats.
394%
395% The format of the UnregisterBIMImage method is:
396%
397% UnregisterDNGImage(void)
398%
399*/
400ModuleExport void UnregisterDNGImage(void)
401{
402 (void) UnregisterMagickInfo("X3F");
403 (void) UnregisterMagickInfo("SR2");
404 (void) UnregisterMagickInfo("SRF");
405 (void) UnregisterMagickInfo("RAF");
406 (void) UnregisterMagickInfo("PEF");
407 (void) UnregisterMagickInfo("ORF");
408 (void) UnregisterMagickInfo("NEF");
409 (void) UnregisterMagickInfo("MRW");
410 (void) UnregisterMagickInfo("K25");
411 (void) UnregisterMagickInfo("KDC");
412 (void) UnregisterMagickInfo("DCR");
413 (void) UnregisterMagickInfo("CRW");
414 (void) UnregisterMagickInfo("CR2");
415 (void) UnregisterMagickInfo("DNG");
416 (void) UnregisterMagickInfo("ARW");
cristy94c8fe42009-10-06 01:57:36 +0000417 (void) UnregisterMagickInfo("3FR");
cristy3ed852e2009-09-05 21:47:34 +0000418}