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