]> granicus.if.org Git - imagemagick/commitdiff
Improved detection of JPEG 2000 code streams and added j2c file extension.
authordirk <dirk@git.imagemagick.org>
Sun, 16 Feb 2014 10:21:39 +0000 (10:21 +0000)
committerdirk <dirk@git.imagemagick.org>
Sun, 16 Feb 2014 10:21:39 +0000 (10:21 +0000)
coders/jp2.c

index fd36379e17681b967e36edaddf4b48a0cdf94be0..ebce595ac3def332c8484d49b6002de348349e9d 100644 (file)
@@ -141,12 +141,14 @@ static MagickBooleanType IsJ2K(const unsigned char *magick,const size_t length)
 */
 static MagickBooleanType IsJP2(const unsigned char *magick,const size_t length)
 {
+  if (length < 4)
+    return(MagickFalse);
+  if (memcmp(magick,"\x0d\x0a\x87\x0a",4) == 0)
+    return(MagickTrue);
   if (length < 12)
     return(MagickFalse);
   if (memcmp(magick,"\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a",12) == 0)
     return(MagickTrue);
-  if (memcmp(magick,"\x0d\x0a\x87\x0a",12) == 0)
-    return(MagickTrue);
   return(MagickFalse);
 }
 \f
@@ -177,12 +179,14 @@ static MagickBooleanType IsJP2(const unsigned char *magick,const size_t length)
 */
 static MagickBooleanType IsJPC(const unsigned char *magick,const size_t length)
 {
+  if (length < 4)
+    return(MagickFalse);
+  if (memcmp(magick,"\x0d\x0a\x87\x0a",4) == 0)
+    return(MagickTrue);
   if (length < 12)
     return(MagickFalse);
   if (memcmp(magick,"\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a",12) == 0)
     return(MagickTrue);
-  if (memcmp(magick,"\x0d\x0a\x87\x0a",12) == 0)
-    return(MagickTrue);
   return(MagickFalse);
 }
 \f
@@ -318,6 +322,9 @@ static Image *ReadJP2Image(const ImageInfo *image_info,ExceptionInfo *exception)
   ssize_t
     y;
 
+  unsigned char
+    sans[4];
+
   /*
     Open image file.
   */
@@ -338,10 +345,17 @@ static Image *ReadJP2Image(const ImageInfo *image_info,ExceptionInfo *exception)
   /*
     Initialize JP2 codec.
   */
+  if (ReadBlob(image,4,sans) != 4)
+    {
+      image=DestroyImageList(image);
+      return((Image *) NULL);
+    }
+  (void) SeekBlob(image,SEEK_SET,0);
   if (LocaleCompare(image_info->magick,"JPT") == 0)
     jp2_codec=opj_create_decompress(OPJ_CODEC_JPT);
   else
-    if (LocaleCompare(image_info->magick,"J2K") == 0)
+    if (IsJ2K(sans,4) != MagickFalse || LocaleCompare(image_info->magick,
+        "J2K") == 0)
       jp2_codec=opj_create_decompress(OPJ_CODEC_J2K);
     else
       jp2_codec=opj_create_decompress(OPJ_CODEC_JP2);
@@ -563,6 +577,21 @@ ModuleExport size_t RegisterJP2Image(void)
 #if defined(MAGICKCORE_LIBOPENJP2_DELEGATE)
   entry->decoder=(DecodeImageHandler *) ReadJP2Image;
   entry->encoder=(EncodeImageHandler *) WriteJP2Image;
+#endif
+  (void) RegisterMagickInfo(entry);
+  entry=SetMagickInfo("J2C");
+  entry->description=ConstantString("JPEG-2000 Code Stream Syntax");
+  if (*version != '\0')
+    entry->version=ConstantString(version);
+  entry->mime_type=ConstantString("image/jp2");
+  entry->module=ConstantString("JP2");
+  entry->magick=(IsImageFormatHandler *) IsJ2K;
+  entry->adjoin=MagickFalse;
+  entry->seekable_stream=MagickTrue;
+  entry->thread_support=NoThreadSupport;
+#if defined(MAGICKCORE_LIBOPENJP2_DELEGATE)
+  entry->decoder=(DecodeImageHandler *) ReadJP2Image;
+  entry->encoder=(EncodeImageHandler *) WriteJP2Image;
 #endif
   (void) RegisterMagickInfo(entry);
   entry=SetMagickInfo("J2K");