]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Thu, 24 May 2012 18:47:10 +0000 (18:47 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Thu, 24 May 2012 18:47:10 +0000 (18:47 +0000)
coders/jp2.c

index bea364ffa7e3dfd254db479fa720ddd130c77e92..eed0131aa6550354b82ab9bf1476ff1947e6b665 100644 (file)
@@ -462,6 +462,48 @@ static Image *ReadJP2Image(const ImageInfo *image_info,ExceptionInfo *exception)
         }
       break;
     }
+    case JAS_CLRSPC_FAM_XYZ:
+    {
+      SetImageColorspace(image,XYZColorspace,exception);
+      components[0]=jas_image_getcmptbytype(jp2_image,0);
+      components[1]=jas_image_getcmptbytype(jp2_image,1);
+      components[2]=jas_image_getcmptbytype(jp2_image,2);
+      if ((components[0] < 0) || (components[1] < 0) || (components[2] < 0))
+        {
+          (void) jas_stream_close(jp2_stream);
+          jas_image_destroy(jp2_image);
+          ThrowReaderException(CorruptImageError,"MissingImageChannel");
+        }
+      number_components=3;
+      components[3]=jas_image_getcmptbytype(jp2_image,JAS_IMAGE_CT_UNKNOWN);
+      if (components[3] > 0)
+        {
+          image->matte=MagickTrue;
+          number_components++;
+        }
+      break;
+    }
+    case JAS_CLRSPC_FAM_LAB:
+    {
+      SetImageColorspace(image,LabColorspace,exception);
+      components[0]=jas_image_getcmptbytype(jp2_image,0);
+      components[1]=jas_image_getcmptbytype(jp2_image,1);
+      components[2]=jas_image_getcmptbytype(jp2_image,2);
+      if ((components[0] < 0) || (components[1] < 0) || (components[2] < 0))
+        {
+          (void) jas_stream_close(jp2_stream);
+          jas_image_destroy(jp2_image);
+          ThrowReaderException(CorruptImageError,"MissingImageChannel");
+        }
+      number_components=3;
+      components[3]=jas_image_getcmptbytype(jp2_image,JAS_IMAGE_CT_UNKNOWN);
+      if (components[3] > 0)
+        {
+          image->matte=MagickTrue;
+          number_components++;
+        }
+      break;
+    }
     default:
     {
       (void) jas_stream_close(jp2_stream);
@@ -875,8 +917,7 @@ static MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image,
   if (jp2_stream == (jas_stream_t *) NULL)
     ThrowWriterException(DelegateError,"UnableToManageJP2Stream");
   number_components=image->matte ? 4UL : 3UL;
-  if ((image_info->type != TrueColorType) &&
-      (IsImageGray(image,exception) != MagickFalse))
+  if (IsGrayColorspace(image->colorspace) != MagickFalse)
     number_components=1;
   if ((image->columns != (unsigned int) image->columns) ||
       (image->rows != (unsigned int) image->rows))
@@ -897,19 +938,13 @@ static MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image,
     JAS_CLRSPC_UNKNOWN);
   if (jp2_image == (jas_image_t *) NULL)
     ThrowWriterException(DelegateError,"UnableToCreateImage");
-  if (number_components == 1)
-    {
-      /*
-        sRGB Grayscale.
-      */
-      jas_image_setclrspc(jp2_image,JAS_CLRSPC_SGRAY);
-      jas_image_setcmpttype(jp2_image,0,
-        JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_GRAY_Y));
-    }
-  else
+  switch (image->colorspace)
+  {
+    case RGBColorspace:
+    case sRGBColorspace:
     {
       /*
-        sRGB.
+        RGB.
       */
       jas_image_setclrspc(jp2_image,JAS_CLRSPC_SRGB);
       jas_image_setcmpttype(jp2_image,0,
@@ -920,7 +955,83 @@ static MagickBooleanType WriteJP2Image(const ImageInfo *image_info,Image *image,
         (jas_image_cmpttype_t) JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_B));
       if (number_components == 4)
         jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
+    }
+    case GRAYColorspace:
+    {
+      /*
+        Grayscale.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_SGRAY);
+      jas_image_setcmpttype(jp2_image,0,
+        JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_GRAY_Y));
+      break;
+    }
+    case YCbCrColorspace:
+    {
+      /*
+        YCbCr.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_SYCBCR);
+      jas_image_setcmpttype(jp2_image,0,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(0));
+      jas_image_setcmpttype(jp2_image,1,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(1));
+      jas_image_setcmpttype(jp2_image,2,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(2));
+      if (number_components == 4)
+        jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
+    }
+    case XYZColorspace:
+    {
+      /*
+        YCbCr.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_CIEXYZ);
+      jas_image_setcmpttype(jp2_image,0,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(0));
+      jas_image_setcmpttype(jp2_image,1,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(1));
+      jas_image_setcmpttype(jp2_image,2,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(2));
+      if (number_components == 4)
+        jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
+    }
+    case LabColorspace:
+    {
+      /*
+        Lab.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_CIELAB);
+      jas_image_setcmpttype(jp2_image,0,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(0));
+      jas_image_setcmpttype(jp2_image,1,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(1));
+      jas_image_setcmpttype(jp2_image,2,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(2));
+      if (number_components == 4)
+        jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
+    }
+    default:
+    {
+      /*
+        Unknow.
+      */
+      jas_image_setclrspc(jp2_image,JAS_CLRSPC_UNKNOWN);
+      jas_image_setcmpttype(jp2_image,0,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(0));
+      jas_image_setcmpttype(jp2_image,1,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(1));
+      jas_image_setcmpttype(jp2_image,2,(jas_image_cmpttype_t)
+        JAS_IMAGE_CT_COLOR(2));
+      if (number_components == 4)
+        jas_image_setcmpttype(jp2_image,3,JAS_IMAGE_CT_OPACITY);
+      break;
     }
+  }
   /*
     Convert to JPEG 2000 pixels.
   */