2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13 % Read the Digital Negative Image Format %
20 % Copyright 1999-2018 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % https://www.imagemagick.org/script/license.php %
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. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41 #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/monitor.h"
57 #include "MagickCore/monitor-private.h"
58 #include "MagickCore/opencl.h"
59 #include "MagickCore/pixel-accessor.h"
60 #include "MagickCore/profile.h"
61 #include "MagickCore/property.h"
62 #include "MagickCore/quantum-private.h"
63 #include "MagickCore/resource_.h"
64 #include "MagickCore/static.h"
65 #include "MagickCore/string_.h"
66 #include "MagickCore/module.h"
67 #include "MagickCore/transform.h"
68 #include "MagickCore/utility.h"
69 #include "MagickCore/xml-tree.h"
70 #include "MagickCore/xml-tree-private.h"
71 #if defined(MAGICKCORE_RAW_R_DELEGATE)
76 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80 % R e a d D N G I m a g e %
84 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
86 % ReadDNGImage() reads an binary file in the Digital Negative format and
87 % returns it. It allocates the memory necessary for the new Image structure
88 % and returns a pointer to the new image.
90 % The format of the ReadDNGImage method is:
92 % Image *ReadDNGImage(const ImageInfo *image_info,
93 % ExceptionInfo *exception)
95 % A description of each parameter follows:
97 % o image_info: the image info.
99 % o exception: return any errors or warnings in this structure.
103 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(MAGICKCORE_OPENCL_SUPPORT)
104 static void InitializeDcrawOpenCL(ExceptionInfo *exception)
118 (void) SetEnvironmentVariable("DCR_CL_PLATFORM",NULL);
119 (void) SetEnvironmentVariable("DCR_CL_DEVICE",NULL);
120 (void) SetEnvironmentVariable("DCR_CL_DISABLED",NULL);
121 if (GetOpenCLEnabled() == MagickFalse)
123 (void) SetEnvironmentVariable("DCR_CL_DISABLED","1");
126 devices=GetOpenCLDevices(&length,exception);
127 if (devices == (MagickCLDevice *) NULL)
129 for (i=0; i < (ssize_t) length; i++)
138 if (GetOpenCLDeviceEnabled(device) == MagickFalse)
140 name=GetOpenCLDeviceVendorName(device);
141 if (name != (const char *) NULL)
142 (void) SetEnvironmentVariable("DCR_CL_PLATFORM",name);
143 name=GetOpenCLDeviceName(device);
144 if (name != (const char *) NULL)
145 (void) SetEnvironmentVariable("DCR_CL_DEVICE",name);
150 static void InitializeDcrawOpenCL(ExceptionInfo *magick_unused(exception))
152 magick_unreferenced(exception);
153 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
154 (void) SetEnvironmentVariable("DCR_CL_DISABLED","1");
159 #if defined(MAGICKCORE_RAW_R_DELEGATE)
160 static void SetDNGProperties(Image *image,const libraw_data_t *raw_info,
161 ExceptionInfo *exception)
164 property[MagickPathExtent],
165 timestamp[MagickPathExtent];
167 (void) SetImageProperty(image,"dng:make",raw_info->idata.make,exception);
168 (void) SetImageProperty(image,"dng:camera.model.name",raw_info->idata.model,
170 (void) FormatMagickTime(raw_info->other.timestamp,MagickPathExtent,timestamp);
171 (void) SetImageProperty(image,"dng:create.date",timestamp,exception);
172 (void) FormatLocaleString(property,MagickPathExtent,"%0.1f",
173 raw_info->other.iso_speed);
174 (void) SetImageProperty(image,"dng:iso.setting",property,exception);
175 #if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,18)
176 (void) SetImageProperty(image,"dng:software",raw_info->idata.software,
178 if (*raw_info->shootinginfo.BodySerial != '\0')
179 (void) SetImageProperty(image,"dng:serial.number",
180 raw_info->shootinginfo.BodySerial,exception);
181 (void) FormatLocaleString(property,MagickPathExtent,"%0.2f",
182 raw_info->other.FlashEC);
183 (void) SetImageProperty(image,"dng:flash.exposure.compensation",property,
185 (void) FormatLocaleString(property,MagickPathExtent,"1/%0.1f",
186 1.0/raw_info->other.shutter);
187 (void) SetImageProperty(image,"dng:exposure.time",property,exception);
188 (void) FormatLocaleString(property,MagickPathExtent,"%0.1f",
189 raw_info->other.aperture);
190 (void) SetImageProperty(image,"dng:f.number",property,exception);
191 (void) FormatLocaleString(property,MagickPathExtent,"%0.1f",
192 raw_info->lens.EXIF_MaxAp);
193 (void) SetImageProperty(image,"dng:max.aperture.value",property,exception);
194 (void) FormatLocaleString(property,MagickPathExtent,"%0.1f",
195 raw_info->other.focal_len);
196 (void) SetImageProperty(image,"dng:focal.length",property,exception);
197 (void) FormatLocaleString(property,MagickPathExtent,"%f %f %f %f",
198 raw_info->color.cam_mul[0],raw_info->color.cam_mul[2],
199 raw_info->color.cam_mul[1],raw_info->color.cam_mul[3]);
200 (void) SetImageProperty(image,"dng:wb.rb.levels",property,exception);
201 (void) SetImageProperty(image,"dng:lens.type",
202 raw_info->lens.makernotes.LensFeatures_suf,exception);
203 (void) FormatLocaleString(property,MagickPathExtent,
204 "%0.1f-%0.1fmm f/%0.1f-%0.1f",raw_info->lens.makernotes.MinFocal,
205 raw_info->lens.makernotes.MaxFocal,raw_info->lens.makernotes.MaxAp4MinFocal,
206 raw_info->lens.makernotes.MaxAp4MaxFocal);
207 (void) SetImageProperty(image,"dng:lens",property,exception);
208 (void) FormatLocaleString(property,MagickPathExtent,"%0.2f",
209 raw_info->lens.makernotes.LensFStops);
210 (void) SetImageProperty(image,"dng:lens.f.stops",property,exception);
211 (void) FormatLocaleString(property,MagickPathExtent,"%0.1f mm",
212 raw_info->lens.makernotes.MinFocal);
213 (void) SetImageProperty(image,"dng:min.focal.length",property,exception);
214 (void) FormatLocaleString(property,MagickPathExtent,"%0.1f mm",
215 raw_info->lens.makernotes.MaxFocal);
216 (void) SetImageProperty(image,"dng:max.focal.length",property,exception);
217 (void) FormatLocaleString(property,MagickPathExtent,"%0.1f",
218 raw_info->lens.makernotes.MaxAp4MinFocal);
219 (void) SetImageProperty(image,"dng:max.aperture.at.min.focal",property,
221 (void) FormatLocaleString(property,MagickPathExtent,"%0.1f",
222 raw_info->lens.makernotes.MaxAp4MaxFocal);
223 (void) SetImageProperty(image,"dng:max.aperture.at.max.focal",property,
225 (void) FormatLocaleString(property,MagickPathExtent,"%d mm",
226 raw_info->lens.FocalLengthIn35mmFormat);
227 (void) SetImageProperty(image,"dng:focal.length.in.35mm.format",property,
233 static Image *InvokeDNGDelegate(const ImageInfo *image_info,Image *image,
234 ExceptionInfo *exception)
243 Convert DNG to PPM with delegate.
245 (void) DestroyImageList(image);
246 InitializeDcrawOpenCL(exception);
247 image=AcquireImage(image_info,exception);
248 read_info=CloneImageInfo(image_info);
249 SetImageInfoBlob(read_info,(void *) NULL,0);
250 (void) InvokeDelegate(read_info,image,"dng:decode",(char *) NULL,exception);
251 image=DestroyImage(image);
252 (void) FormatLocaleString(read_info->filename,MagickPathExtent,"%s.png",
254 sans_exception=AcquireExceptionInfo();
255 image=ReadImage(read_info,sans_exception);
256 sans_exception=DestroyExceptionInfo(sans_exception);
257 if (image == (Image *) NULL)
259 (void) FormatLocaleString(read_info->filename,MagickPathExtent,"%s.ppm",
261 image=ReadImage(read_info,exception);
263 (void) RelinquishUniqueFileResource(read_info->filename);
264 if (image != (Image *) NULL)
267 filename[MagickPathExtent],
273 (void) CopyMagickString(image->magick,read_info->magick,
275 (void) FormatLocaleString(filename,MagickPathExtent,"%s.ufraw",
277 sans=AcquireExceptionInfo();
278 xml=FileToString(filename,MagickPathExtent,sans);
279 (void) RelinquishUniqueFileResource(filename);
280 if (xml != (char *) NULL)
288 ufraw=NewXMLTree(xml,sans);
289 if (ufraw != (XMLTreeInfo *) NULL)
293 property[MagickPathExtent];
301 if (image->properties == (void *) NULL)
302 image->properties=NewSplayTree(CompareSplayTreeString,
303 RelinquishMagickMemory,RelinquishMagickMemory);
304 next=GetXMLTreeChild(ufraw,(const char *) NULL);
305 while (next != (XMLTreeInfo *) NULL)
307 tag=GetXMLTreeTag(next);
308 if (tag == (char *) NULL)
310 (void) FormatLocaleString(property,MagickPathExtent,"dng:%s",
312 content=ConstantString(GetXMLTreeContent(next));
313 StripString(content);
314 if ((LocaleCompare(tag,"log") != 0) &&
315 (LocaleCompare(tag,"InputFilename") != 0) &&
316 (LocaleCompare(tag,"OutputFilename") != 0) &&
317 (LocaleCompare(tag,"OutputType") != 0) &&
318 (strlen(content) != 0))
319 (void) AddValueToSplayTree((SplayTreeInfo *)
320 image->properties,ConstantString(property),content);
321 next=GetXMLTreeSibling(next);
323 ufraw=DestroyXMLTree(ufraw);
325 xml=DestroyString(xml);
327 sans=DestroyExceptionInfo(sans);
329 read_info=DestroyImageInfo(read_info);
333 static Image *ReadDNGImage(const ImageInfo *image_info,ExceptionInfo *exception)
344 assert(image_info != (const ImageInfo *) NULL);
345 assert(image_info->signature == MagickCoreSignature);
346 if (image_info->debug != MagickFalse)
347 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
348 image_info->filename);
349 assert(exception != (ExceptionInfo *) NULL);
350 assert(exception->signature == MagickCoreSignature);
351 image=AcquireImage(image_info,exception);
352 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
353 if (status == MagickFalse)
355 image=DestroyImageList(image);
356 return((Image *) NULL);
358 (void) CloseBlob(image);
359 if (LocaleCompare(image_info->magick,"DCRAW") == 0)
360 return(InvokeDNGDelegate(image_info,image,exception));
361 #if defined(MAGICKCORE_RAW_R_DELEGATE)
369 libraw_processed_image_t
382 raw_info=libraw_init(0);
383 if (raw_info == (libraw_data_t *) NULL)
385 (void) ThrowMagickException(exception,GetMagickModule(),CoderError,
386 libraw_strerror(errcode),"`%s'",image->filename);
387 libraw_close(raw_info);
388 return(DestroyImageList(image));
390 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_MSC_VER) && (_MSC_VER > 1310)
393 fileName[MagickPathExtent];
395 MultiByteToWideChar(CP_UTF8,0,image->filename,-1,fileName,
397 errcode=libraw_open_wfile(raw_info,fileName);
400 errcode=libraw_open_file(raw_info,image->filename);
402 if (errcode != LIBRAW_SUCCESS)
404 (void) ThrowMagickException(exception,GetMagickModule(),CoderError,
405 libraw_strerror(errcode),"`%s'",image->filename);
406 libraw_close(raw_info);
407 return(DestroyImageList(image));
409 image->columns=raw_info->sizes.width;
410 image->rows=raw_info->sizes.height;
411 image->page.width=raw_info->sizes.raw_width;
412 image->page.height=raw_info->sizes.raw_height;
413 image->page.x=raw_info->sizes.left_margin;
414 image->page.y=raw_info->sizes.top_margin;
415 if (image_info->ping != MagickFalse)
417 libraw_close(raw_info);
420 status=SetImageExtent(image,image->columns,image->rows,exception);
421 if (status == MagickFalse)
423 libraw_close(raw_info);
426 errcode=libraw_unpack(raw_info);
427 if (errcode != LIBRAW_SUCCESS)
429 (void) ThrowMagickException(exception,GetMagickModule(),CoderError,
430 libraw_strerror(errcode),"`%s'",image->filename);
431 libraw_close(raw_info);
432 return(DestroyImageList(image));
434 raw_info->params.output_bps=16;
435 errcode=libraw_dcraw_process(raw_info);
436 if (errcode != LIBRAW_SUCCESS)
438 (void) ThrowMagickException(exception,GetMagickModule(),CoderError,
439 libraw_strerror(errcode),"`%s'",image->filename);
440 libraw_close(raw_info);
441 return(DestroyImageList(image));
443 raw_image=libraw_dcraw_make_mem_image(raw_info,&errcode);
444 if ((errcode != LIBRAW_SUCCESS) ||
445 (raw_image == (libraw_processed_image_t *) NULL) ||
446 (raw_image->type != LIBRAW_IMAGE_BITMAP) || (raw_image->bits != 16) ||
447 (raw_image->colors < 3) || (raw_image->colors > 4))
449 if (raw_image != (libraw_processed_image_t *) NULL)
450 libraw_dcraw_clear_mem(raw_image);
451 (void) ThrowMagickException(exception,GetMagickModule(),CoderError,
452 libraw_strerror(errcode),"`%s'",image->filename);
453 libraw_close(raw_info);
454 return(DestroyImageList(image));
456 image->columns=raw_image->width;
457 image->rows=raw_image->height;
458 image->depth=raw_image->bits;
459 status=SetImageExtent(image,image->columns,image->rows,exception);
460 if (status == MagickFalse)
462 libraw_dcraw_clear_mem(raw_image);
463 libraw_close(raw_info);
464 return(DestroyImageList(image));
466 p=(unsigned short *) raw_image->data;
467 for (y=0; y < (ssize_t) image->rows; y++)
475 q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
476 if (q == (Quantum *) NULL)
478 for (x=0; x < (ssize_t) image->columns; x++)
480 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
481 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
482 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
483 if (raw_image->colors > 3)
484 SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
485 q+=GetPixelChannels(image);
487 if (SyncAuthenticPixels(image,exception) == MagickFalse)
489 if (image->previous == (Image *) NULL)
491 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
493 if (status == MagickFalse)
497 libraw_dcraw_clear_mem(raw_image);
499 Set DNG image metadata.
501 if (raw_info->color.profile != NULL)
503 profile=BlobToStringInfo(raw_info->color.profile,
504 raw_info->color.profile_length);
505 if (profile != (StringInfo *) NULL)
507 SetImageProfile(image,"ICC",profile,exception);
508 profile=DestroyStringInfo(profile);
511 #if LIBRAW_COMPILE_CHECK_VERSION_NOTLESS(0,18)
512 if (raw_info->idata.xmpdata != NULL)
514 profile=BlobToStringInfo(raw_info->idata.xmpdata,
515 raw_info->idata.xmplen);
516 if (profile != (StringInfo *) NULL)
518 SetImageProfile(image,"XMP",profile,exception);
519 profile=DestroyStringInfo(profile);
523 SetDNGProperties(image,raw_info,exception);
524 libraw_close(raw_info);
528 return(InvokeDNGDelegate(image_info,image,exception));
533 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
537 % R e g i s t e r D N G I m a g e %
541 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
543 % RegisterDNGImage() adds attributes for the DNG image format to
544 % the list of supported formats. The attributes include the image format
545 % tag, a method to read and/or write the format, whether the format
546 % supports the saving of more than one frame to the same file or blob,
547 % whether the format supports native in-memory I/O, and a brief
548 % description of the format.
550 % The format of the RegisterDNGImage method is:
552 % size_t RegisterDNGImage(void)
555 ModuleExport size_t RegisterDNGImage(void)
560 entry=AcquireMagickInfo("DNG","3FR","Hasselblad CFV/H3D39II");
561 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
562 entry->flags|=CoderDecoderSeekableStreamFlag;
563 entry->flags^=CoderBlobSupportFlag;
564 entry->format_type=ExplicitFormatType;
565 (void) RegisterMagickInfo(entry);
566 entry=AcquireMagickInfo("DNG","ARW","Sony Alpha Raw Image Format");
567 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
568 entry->flags|=CoderDecoderSeekableStreamFlag;
569 entry->flags^=CoderBlobSupportFlag;
570 entry->format_type=ExplicitFormatType;
571 (void) RegisterMagickInfo(entry);
572 entry=AcquireMagickInfo("DNG","DNG","Digital Negative");
573 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
574 entry->flags|=CoderDecoderSeekableStreamFlag;
575 entry->flags^=CoderBlobSupportFlag;
576 entry->format_type=ExplicitFormatType;
577 (void) RegisterMagickInfo(entry);
578 entry=AcquireMagickInfo("DNG","CR2","Canon Digital Camera Raw Image Format");
579 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
580 entry->flags|=CoderDecoderSeekableStreamFlag;
581 entry->flags^=CoderBlobSupportFlag;
582 entry->format_type=ExplicitFormatType;
583 (void) RegisterMagickInfo(entry);
584 entry=AcquireMagickInfo("DNG","CRW","Canon Digital Camera Raw Image Format");
585 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
586 entry->flags|=CoderDecoderSeekableStreamFlag;
587 entry->flags^=CoderBlobSupportFlag;
588 entry->format_type=ExplicitFormatType;
589 (void) RegisterMagickInfo(entry);
590 entry=AcquireMagickInfo("DNG","DCR","Kodak Digital Camera Raw Image File");
591 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
592 entry->flags|=CoderDecoderSeekableStreamFlag;
593 entry->flags^=CoderBlobSupportFlag;
594 entry->format_type=ExplicitFormatType;
595 (void) RegisterMagickInfo(entry);
596 entry=AcquireMagickInfo("DNG","DCRAW","Raw Photo Decoder (dcraw)");
597 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
598 entry->flags|=CoderDecoderSeekableStreamFlag;
599 entry->flags^=CoderBlobSupportFlag;
600 entry->format_type=ExplicitFormatType;
601 (void) RegisterMagickInfo(entry);
602 entry=AcquireMagickInfo("DNG","ERF","Epson RAW Format");
603 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
604 entry->flags|=CoderDecoderSeekableStreamFlag;
605 entry->flags^=CoderBlobSupportFlag;
606 entry->format_type=ExplicitFormatType;
607 (void) RegisterMagickInfo(entry);
608 entry=AcquireMagickInfo("DNG","IIQ","Phase One Raw Image Format");
609 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
610 entry->flags|=CoderDecoderSeekableStreamFlag;
611 entry->flags^=CoderBlobSupportFlag;
612 entry->format_type=ExplicitFormatType;
613 (void) RegisterMagickInfo(entry);
614 entry=AcquireMagickInfo("DNG","KDC","Kodak Digital Camera Raw Image Format");
615 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
616 entry->flags|=CoderDecoderSeekableStreamFlag;
617 entry->flags^=CoderBlobSupportFlag;
618 entry->format_type=ExplicitFormatType;
619 (void) RegisterMagickInfo(entry);
620 entry=AcquireMagickInfo("DNG","K25","Kodak Digital Camera Raw Image Format");
621 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
622 entry->flags|=CoderDecoderSeekableStreamFlag;
623 entry->flags^=CoderBlobSupportFlag;
624 entry->format_type=ExplicitFormatType;
625 (void) RegisterMagickInfo(entry);
626 entry=AcquireMagickInfo("DNG","MEF","Mamiya Raw Image File");
627 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
628 entry->flags|=CoderDecoderSeekableStreamFlag;
629 entry->flags^=CoderBlobSupportFlag;
630 entry->format_type=ExplicitFormatType;
631 (void) RegisterMagickInfo(entry);
632 entry=AcquireMagickInfo("DNG","MRW","Sony (Minolta) Raw Image File");
633 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
634 entry->flags|=CoderDecoderSeekableStreamFlag;
635 entry->flags^=CoderBlobSupportFlag;
636 entry->format_type=ExplicitFormatType;
637 (void) RegisterMagickInfo(entry);
638 entry=AcquireMagickInfo("DNG","NEF",
639 "Nikon Digital SLR Camera Raw Image File");
640 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
641 entry->flags|=CoderDecoderSeekableStreamFlag;
642 entry->flags^=CoderBlobSupportFlag;
643 entry->format_type=ExplicitFormatType;
644 (void) RegisterMagickInfo(entry);
645 entry=AcquireMagickInfo("DNG","NRW",
646 "Nikon Digital SLR Camera Raw Image File");
647 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
648 entry->flags|=CoderDecoderSeekableStreamFlag;
649 entry->flags^=CoderBlobSupportFlag;
650 entry->format_type=ExplicitFormatType;
651 (void) RegisterMagickInfo(entry);
652 entry=AcquireMagickInfo("DNG","ORF","Olympus Digital Camera Raw Image File");
653 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
654 entry->flags|=CoderDecoderSeekableStreamFlag;
655 entry->flags^=CoderBlobSupportFlag;
656 entry->format_type=ExplicitFormatType;
657 (void) RegisterMagickInfo(entry);
658 entry=AcquireMagickInfo("DNG","PEF","Pentax Electronic File");
659 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
660 entry->flags|=CoderDecoderSeekableStreamFlag;
661 entry->flags^=CoderBlobSupportFlag;
662 entry->format_type=ExplicitFormatType;
663 (void) RegisterMagickInfo(entry);
664 entry=AcquireMagickInfo("DNG","RAF","Fuji CCD-RAW Graphic File");
665 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
666 entry->flags|=CoderDecoderSeekableStreamFlag;
667 entry->flags^=CoderBlobSupportFlag;
668 entry->format_type=ExplicitFormatType;
669 (void) RegisterMagickInfo(entry);
670 entry=AcquireMagickInfo("DNG","RAW","Raw");
671 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
672 entry->flags|=CoderDecoderSeekableStreamFlag;
673 entry->flags^=CoderBlobSupportFlag;
674 entry->format_type=ExplicitFormatType;
675 (void) RegisterMagickInfo(entry);
676 entry=AcquireMagickInfo("DNG","RMF","Raw Media Format");
677 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
678 entry->flags|=CoderDecoderSeekableStreamFlag;
679 entry->flags^=CoderBlobSupportFlag;
680 entry->format_type=ExplicitFormatType;
681 (void) RegisterMagickInfo(entry);
682 entry=AcquireMagickInfo("DNG","RW2","Panasonic Lumix Raw Image");
683 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
684 entry->flags|=CoderDecoderSeekableStreamFlag;
685 entry->flags^=CoderBlobSupportFlag;
686 entry->format_type=ExplicitFormatType;
687 (void) RegisterMagickInfo(entry);
688 entry=AcquireMagickInfo("DNG","SRF","Sony Raw Format");
689 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
690 entry->flags|=CoderDecoderSeekableStreamFlag;
691 entry->flags^=CoderBlobSupportFlag;
692 entry->format_type=ExplicitFormatType;
693 (void) RegisterMagickInfo(entry);
694 entry=AcquireMagickInfo("DNG","SR2","Sony Raw Format 2");
695 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
696 entry->flags|=CoderDecoderSeekableStreamFlag;
697 entry->flags^=CoderBlobSupportFlag;
698 entry->format_type=ExplicitFormatType;
699 (void) RegisterMagickInfo(entry);
700 entry=AcquireMagickInfo("DNG","X3F","Sigma Camera RAW Picture File");
701 entry->decoder=(DecodeImageHandler *) ReadDNGImage;
702 entry->flags|=CoderDecoderSeekableStreamFlag;
703 entry->flags^=CoderBlobSupportFlag;
704 entry->format_type=ExplicitFormatType;
705 (void) RegisterMagickInfo(entry);
706 return(MagickImageCoderSignature);
710 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
714 % U n r e g i s t e r D N G I m a g e %
718 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
720 % UnregisterDNGImage() removes format registrations made by the
721 % BIM module from the list of supported formats.
723 % The format of the UnregisterBIMImage method is:
725 % UnregisterDNGImage(void)
728 ModuleExport void UnregisterDNGImage(void)
730 (void) UnregisterMagickInfo("X3F");
731 (void) UnregisterMagickInfo("SR2");
732 (void) UnregisterMagickInfo("SRF");
733 (void) UnregisterMagickInfo("RW2");
734 (void) UnregisterMagickInfo("RMF");
735 (void) UnregisterMagickInfo("RAF");
736 (void) UnregisterMagickInfo("PEF");
737 (void) UnregisterMagickInfo("ORF");
738 (void) UnregisterMagickInfo("NRW");
739 (void) UnregisterMagickInfo("NEF");
740 (void) UnregisterMagickInfo("MRW");
741 (void) UnregisterMagickInfo("MEF");
742 (void) UnregisterMagickInfo("K25");
743 (void) UnregisterMagickInfo("KDC");
744 (void) UnregisterMagickInfo("IIQ");
745 (void) UnregisterMagickInfo("ERF");
746 (void) UnregisterMagickInfo("DCR");
747 (void) UnregisterMagickInfo("CRW");
748 (void) UnregisterMagickInfo("CR2");
749 (void) UnregisterMagickInfo("DNG");
750 (void) UnregisterMagickInfo("ARW");
751 (void) UnregisterMagickInfo("3FR");