Home | History | Annotate | Download | only in coders
      1 /*
      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 %                                   Cristy                                    %
     17 %                                 July 1999                                   %
     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   Include declarations.
     40 */
     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/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"
     64 #include "MagickCore/xml-tree-private.h"
     65 
     66 /*
     68 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     69 %                                                                             %
     70 %                                                                             %
     71 %                                                                             %
     72 %   R e a d D N G I m a g e                                                   %
     73 %                                                                             %
     74 %                                                                             %
     75 %                                                                             %
     76 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     77 %
     78 %  ReadDNGImage() reads an binary file in the Digital Negative format and
     79 %  returns it.  It allocates the memory necessary for the new Image structure
     80 %  and returns a pointer to the new image.
     81 %
     82 %  The format of the ReadDNGImage method is:
     83 %
     84 %      Image *ReadDNGImage(const ImageInfo *image_info,
     85 %        ExceptionInfo *exception)
     86 %
     87 %  A description of each parameter follows:
     88 %
     89 %    o image_info: the image info.
     90 %
     91 %    o exception: return any errors or warnings in this structure.
     92 %
     93 */
     94 static Image *ReadDNGImage(const ImageInfo *image_info,ExceptionInfo *exception)
     95 {
     96   ExceptionInfo
     97     *sans_exception;
     98 
     99   Image
    100     *image;
    101 
    102   ImageInfo
    103     *read_info;
    104 
    105   MagickBooleanType
    106     status;
    107 
    108   /*
    109     Open image file.
    110   */
    111   assert(image_info != (const ImageInfo *) NULL);
    112   assert(image_info->signature == MagickCoreSignature);
    113   if (image_info->debug != MagickFalse)
    114     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
    115       image_info->filename);
    116   assert(exception != (ExceptionInfo *) NULL);
    117   assert(exception->signature == MagickCoreSignature);
    118   image=AcquireImage(image_info,exception);
    119   status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
    120   if (status == MagickFalse)
    121     {
    122       image=DestroyImageList(image);
    123       return((Image *) NULL);
    124     }
    125   (void) CloseBlob(image);
    126   (void) DestroyImageList(image);
    127   /*
    128     Convert DNG to PPM with delegate.
    129   */
    130   image=AcquireImage(image_info,exception);
    131   read_info=CloneImageInfo(image_info);
    132   SetImageInfoBlob(read_info,(void *) NULL,0);
    133   (void) InvokeDelegate(read_info,image,"dng:decode",(char *) NULL,exception);
    134   image=DestroyImage(image);
    135   (void) FormatLocaleString(read_info->filename,MagickPathExtent,"%s.png",
    136     read_info->unique);
    137   sans_exception=AcquireExceptionInfo();
    138   image=ReadImage(read_info,sans_exception);
    139   sans_exception=DestroyExceptionInfo(sans_exception);
    140   if (image == (Image *) NULL)
    141     {
    142       (void) FormatLocaleString(read_info->filename,MagickPathExtent,"%s.ppm",
    143         read_info->unique);
    144       image=ReadImage(read_info,exception);
    145     }
    146   (void) RelinquishUniqueFileResource(read_info->filename);
    147   if (image != (Image *) NULL)
    148     {
    149       char
    150         filename[MagickPathExtent],
    151         *xml;
    152 
    153       ExceptionInfo
    154         *sans;
    155 
    156       (void) CopyMagickString(image->magick,read_info->magick,MagickPathExtent);
    157       (void) FormatLocaleString(filename,MagickPathExtent,"%s.ufraw",
    158         read_info->unique);
    159       sans=AcquireExceptionInfo();
    160       xml=FileToString(filename,MagickPathExtent,sans);
    161       (void) RelinquishUniqueFileResource(filename);
    162       if (xml != (char *) NULL)
    163         {
    164           XMLTreeInfo
    165             *ufraw;
    166 
    167           /*
    168             Inject
    169           */
    170           ufraw=NewXMLTree(xml,sans);
    171           if (ufraw != (XMLTreeInfo *) NULL)
    172             {
    173               char
    174                 *content,
    175                 property[MagickPathExtent];
    176 
    177               const char
    178                 *tag;
    179 
    180               XMLTreeInfo
    181                 *next;
    182 
    183               if (image->properties == (void *) NULL)
    184                 ((Image *) image)->properties=NewSplayTree(
    185                   CompareSplayTreeString,RelinquishMagickMemory,
    186                   RelinquishMagickMemory);
    187               next=GetXMLTreeChild(ufraw,(const char *) NULL);
    188               while (next != (XMLTreeInfo *) NULL)
    189               {
    190                 tag=GetXMLTreeTag(next);
    191                 if (tag == (char *) NULL)
    192                   tag="unknown";
    193                 (void) FormatLocaleString(property,MagickPathExtent,"dng:%s",tag);
    194                 content=ConstantString(GetXMLTreeContent(next));
    195                 StripString(content);
    196                 if ((LocaleCompare(tag,"log") != 0) &&
    197                     (LocaleCompare(tag,"InputFilename") != 0) &&
    198                     (LocaleCompare(tag,"OutputFilename") != 0) &&
    199                     (LocaleCompare(tag,"OutputType") != 0) &&
    200                     (strlen(content) != 0))
    201                   (void) AddValueToSplayTree((SplayTreeInfo *)
    202                     ((Image *) image)->properties,ConstantString(property),
    203                     content);
    204                 next=GetXMLTreeSibling(next);
    205               }
    206               ufraw=DestroyXMLTree(ufraw);
    207             }
    208           xml=DestroyString(xml);
    209         }
    210       sans=DestroyExceptionInfo(sans);
    211     }
    212   read_info=DestroyImageInfo(read_info);
    213   return(image);
    214 }
    215 
    216 /*
    218 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    219 %                                                                             %
    220 %                                                                             %
    221 %                                                                             %
    222 %   R e g i s t e r D N G I m a g e                                           %
    223 %                                                                             %
    224 %                                                                             %
    225 %                                                                             %
    226 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    227 %
    228 %  RegisterDNGImage() adds attributes for the DNG image format to
    229 %  the list of supported formats.  The attributes include the image format
    230 %  tag, a method to read and/or write the format, whether the format
    231 %  supports the saving of more than one frame to the same file or blob,
    232 %  whether the format supports native in-memory I/O, and a brief
    233 %  description of the format.
    234 %
    235 %  The format of the RegisterDNGImage method is:
    236 %
    237 %      size_t RegisterDNGImage(void)
    238 %
    239 */
    240 ModuleExport size_t RegisterDNGImage(void)
    241 {
    242   MagickInfo
    243     *entry;
    244 
    245   entry=AcquireMagickInfo("DNG","3FR","Hasselblad CFV/H3D39II");
    246   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    247   entry->flags^=CoderBlobSupportFlag;
    248   entry->flags|=CoderSeekableStreamFlag;
    249   entry->format_type=ExplicitFormatType;
    250   (void) RegisterMagickInfo(entry);
    251   entry=AcquireMagickInfo("DNG","ARW","Sony Alpha Raw Image Format");
    252   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    253   entry->flags^=CoderBlobSupportFlag;
    254   entry->flags|=CoderSeekableStreamFlag;
    255   entry->format_type=ExplicitFormatType;
    256   (void) RegisterMagickInfo(entry);
    257   entry=AcquireMagickInfo("DNG","DNG","Digital Negative");
    258   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    259   entry->flags^=CoderBlobSupportFlag;
    260   entry->flags|=CoderSeekableStreamFlag;
    261   entry->format_type=ExplicitFormatType;
    262   (void) RegisterMagickInfo(entry);
    263   entry=AcquireMagickInfo("DNG","CR2","Canon Digital Camera Raw Image Format");
    264   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    265   entry->flags^=CoderBlobSupportFlag;
    266   entry->flags|=CoderSeekableStreamFlag;
    267   entry->format_type=ExplicitFormatType;
    268   (void) RegisterMagickInfo(entry);
    269   entry=AcquireMagickInfo("DNG","CRW","Canon Digital Camera Raw Image Format");
    270   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    271   entry->flags^=CoderBlobSupportFlag;
    272   entry->flags|=CoderSeekableStreamFlag;
    273   entry->format_type=ExplicitFormatType;
    274   (void) RegisterMagickInfo(entry);
    275   entry=AcquireMagickInfo("DNG","DCR","Kodak Digital Camera Raw Image File");
    276   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    277   entry->flags^=CoderBlobSupportFlag;
    278   entry->flags|=CoderSeekableStreamFlag;
    279   entry->format_type=ExplicitFormatType;
    280   (void) RegisterMagickInfo(entry);
    281   entry=AcquireMagickInfo("DNG","ERF","Epson RAW Format");
    282   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    283   entry->flags^=CoderBlobSupportFlag;
    284   entry->flags|=CoderSeekableStreamFlag;
    285   entry->format_type=ExplicitFormatType;
    286   (void) RegisterMagickInfo(entry);
    287   entry=AcquireMagickInfo("DNG","IIQ","Phase One Raw Image Format");
    288   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    289   entry->flags^=CoderBlobSupportFlag;
    290   entry->flags|=CoderSeekableStreamFlag;
    291   entry->format_type=ExplicitFormatType;
    292   entry->module=ConstantString("DNG");
    293   (void) RegisterMagickInfo(entry);
    294   entry=AcquireMagickInfo("DNG","KDC","Kodak Digital Camera Raw Image Format");
    295   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    296   entry->flags^=CoderBlobSupportFlag;
    297   entry->flags|=CoderSeekableStreamFlag;
    298   entry->format_type=ExplicitFormatType;
    299   (void) RegisterMagickInfo(entry);
    300   entry=AcquireMagickInfo("DNG","K25","Kodak Digital Camera Raw Image Format");
    301   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    302   entry->flags^=CoderBlobSupportFlag;
    303   entry->flags|=CoderSeekableStreamFlag;
    304   entry->format_type=ExplicitFormatType;
    305   (void) RegisterMagickInfo(entry);
    306   entry=AcquireMagickInfo("DNG","MEF","Mamiya Raw Image File");
    307   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    308   entry->flags^=CoderBlobSupportFlag;
    309   entry->flags|=CoderSeekableStreamFlag;
    310   entry->format_type=ExplicitFormatType;
    311   (void) RegisterMagickInfo(entry);
    312   entry=AcquireMagickInfo("DNG","MRW","Sony (Minolta) Raw Image File");
    313   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    314   entry->flags^=CoderBlobSupportFlag;
    315   entry->flags|=CoderSeekableStreamFlag;
    316   entry->format_type=ExplicitFormatType;
    317   (void) RegisterMagickInfo(entry);
    318   entry=AcquireMagickInfo("DNG","NEF","Nikon Digital SLR Camera Raw Image File");
    319   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    320   entry->flags^=CoderBlobSupportFlag;
    321   entry->flags|=CoderSeekableStreamFlag;
    322   entry->format_type=ExplicitFormatType;
    323   (void) RegisterMagickInfo(entry);
    324   entry=AcquireMagickInfo("DNG","NRW","Nikon Digital SLR Camera Raw Image File");
    325   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    326   entry->flags^=CoderBlobSupportFlag;
    327   entry->flags|=CoderSeekableStreamFlag;
    328   entry->format_type=ExplicitFormatType;
    329   (void) RegisterMagickInfo(entry);
    330   entry=AcquireMagickInfo("DNG","ORF","Olympus Digital Camera Raw Image File");
    331   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    332   entry->flags^=CoderBlobSupportFlag;
    333   entry->flags|=CoderSeekableStreamFlag;
    334   entry->format_type=ExplicitFormatType;
    335   (void) RegisterMagickInfo(entry);
    336   entry=AcquireMagickInfo("DNG","PEF","Pentax Electronic File");
    337   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    338   entry->flags^=CoderBlobSupportFlag;
    339   entry->flags|=CoderSeekableStreamFlag;
    340   entry->format_type=ExplicitFormatType;
    341   (void) RegisterMagickInfo(entry);
    342   entry=AcquireMagickInfo("DNG","RAF","Fuji CCD-RAW Graphic File");
    343   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    344   entry->flags^=CoderBlobSupportFlag;
    345   entry->flags|=CoderSeekableStreamFlag;
    346   entry->format_type=ExplicitFormatType;
    347   (void) RegisterMagickInfo(entry);
    348   entry=AcquireMagickInfo("DNG","RAW","Raw");
    349   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    350   entry->flags^=CoderBlobSupportFlag;
    351   entry->flags|=CoderSeekableStreamFlag;
    352   entry->format_type=ExplicitFormatType;
    353   (void) RegisterMagickInfo(entry);
    354   entry=AcquireMagickInfo("DNG","RMF","Raw Media Format");
    355   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    356   entry->flags^=CoderBlobSupportFlag;
    357   entry->flags|=CoderSeekableStreamFlag;
    358   entry->format_type=ExplicitFormatType;
    359   (void) RegisterMagickInfo(entry);
    360   entry=AcquireMagickInfo("DNG","RW2","Panasonic Lumix Raw Image");
    361   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    362   entry->flags^=CoderBlobSupportFlag;
    363   entry->flags|=CoderSeekableStreamFlag;
    364   entry->format_type=ExplicitFormatType;
    365   (void) RegisterMagickInfo(entry);
    366   entry=AcquireMagickInfo("DNG","SRF","Sony Raw Format");
    367   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    368   entry->flags^=CoderBlobSupportFlag;
    369   entry->flags|=CoderSeekableStreamFlag;
    370   entry->format_type=ExplicitFormatType;
    371   (void) RegisterMagickInfo(entry);
    372   entry=AcquireMagickInfo("DNG","SR2","Sony Raw Format 2");
    373   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    374   entry->flags^=CoderBlobSupportFlag;
    375   entry->flags|=CoderSeekableStreamFlag;
    376   entry->format_type=ExplicitFormatType;
    377   (void) RegisterMagickInfo(entry);
    378   entry=AcquireMagickInfo("DNG","X3F","Sigma Camera RAW Picture File");
    379   entry->decoder=(DecodeImageHandler *) ReadDNGImage;
    380   entry->flags^=CoderBlobSupportFlag;
    381   entry->flags|=CoderSeekableStreamFlag;
    382   entry->format_type=ExplicitFormatType;
    383   (void) RegisterMagickInfo(entry);
    384   return(MagickImageCoderSignature);
    385 }
    386 
    387 /*
    389 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    390 %                                                                             %
    391 %                                                                             %
    392 %                                                                             %
    393 %   U n r e g i s t e r D N G I m a g e                                       %
    394 %                                                                             %
    395 %                                                                             %
    396 %                                                                             %
    397 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    398 %
    399 %  UnregisterDNGImage() removes format registrations made by the
    400 %  BIM module from the list of supported formats.
    401 %
    402 %  The format of the UnregisterBIMImage method is:
    403 %
    404 %      UnregisterDNGImage(void)
    405 %
    406 */
    407 ModuleExport void UnregisterDNGImage(void)
    408 {
    409   (void) UnregisterMagickInfo("X3F");
    410   (void) UnregisterMagickInfo("SR2");
    411   (void) UnregisterMagickInfo("SRF");
    412   (void) UnregisterMagickInfo("RW2");
    413   (void) UnregisterMagickInfo("RMF");
    414   (void) UnregisterMagickInfo("RAF");
    415   (void) UnregisterMagickInfo("PEF");
    416   (void) UnregisterMagickInfo("ORF");
    417   (void) UnregisterMagickInfo("NRW");
    418   (void) UnregisterMagickInfo("NEF");
    419   (void) UnregisterMagickInfo("MRW");
    420   (void) UnregisterMagickInfo("MEF");
    421   (void) UnregisterMagickInfo("K25");
    422   (void) UnregisterMagickInfo("KDC");
    423   (void) UnregisterMagickInfo("IIQ");
    424   (void) UnregisterMagickInfo("ERF");
    425   (void) UnregisterMagickInfo("DCR");
    426   (void) UnregisterMagickInfo("CRW");
    427   (void) UnregisterMagickInfo("CR2");
    428   (void) UnregisterMagickInfo("DNG");
    429   (void) UnregisterMagickInfo("ARW");
    430   (void) UnregisterMagickInfo("3FR");
    431 }
    432