]> granicus.if.org Git - imagemagick/blobdiff - coders/xcf.c
(no commit message)
[imagemagick] / coders / xcf.c
index 394f52aaf54e42a279a16512522feb0b18490a8d..5ec3d721139e622969e08646332670b41d041fdb 100644 (file)
@@ -17,7 +17,7 @@
 %                               November 2001                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2015 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -237,28 +237,27 @@ static CompositeOperator GIMPBlendModeToCompositeOperator(
 {
   switch ( blendMode )
   {
-    case GIMP_NORMAL_MODE:    return( OverCompositeOp );
-    case GIMP_DISSOLVE_MODE:  return( DissolveCompositeOp );
-    case GIMP_MULTIPLY_MODE:  return( MultiplyCompositeOp );
-    case GIMP_SCREEN_MODE:    return( ScreenCompositeOp );
-    case GIMP_OVERLAY_MODE:    return( OverlayCompositeOp );
-    case GIMP_DIFFERENCE_MODE:  return( DifferenceCompositeOp );
-    case GIMP_ADDITION_MODE:  return( ModulusAddCompositeOp );
-    case GIMP_SUBTRACT_MODE:  return( ModulusSubtractCompositeOp );
-    case GIMP_DARKEN_ONLY_MODE:  return( DarkenCompositeOp );
-    case GIMP_LIGHTEN_ONLY_MODE:return( LightenCompositeOp );
-    case GIMP_HUE_MODE:      return( HueCompositeOp );
-    case GIMP_SATURATION_MODE:  return( SaturateCompositeOp );
-    case GIMP_COLOR_MODE:    return( ColorizeCompositeOp );
-    case GIMP_DODGE_MODE:    return( ColorDodgeCompositeOp );
-    case GIMP_BURN_MODE:    return( ColorBurnCompositeOp );
-    case GIMP_HARDLIGHT_MODE:  return( HardLightCompositeOp );
-    case GIMP_DIVIDE_MODE:    return( DivideDstCompositeOp );
+    case GIMP_NORMAL_MODE:       return(OverCompositeOp);
+    case GIMP_DISSOLVE_MODE:     return(DissolveCompositeOp);
+    case GIMP_MULTIPLY_MODE:     return(MultiplyCompositeOp);
+    case GIMP_SCREEN_MODE:       return(ScreenCompositeOp);
+    case GIMP_OVERLAY_MODE:      return(OverlayCompositeOp);
+    case GIMP_DIFFERENCE_MODE:   return(DifferenceCompositeOp);
+    case GIMP_ADDITION_MODE:     return(ModulusAddCompositeOp);
+    case GIMP_SUBTRACT_MODE:     return(ModulusSubtractCompositeOp);
+    case GIMP_DARKEN_ONLY_MODE:  return(DarkenCompositeOp);
+    case GIMP_LIGHTEN_ONLY_MODE: return(LightenCompositeOp);
+    case GIMP_HUE_MODE:          return(HueCompositeOp);
+    case GIMP_SATURATION_MODE:   return(SaturateCompositeOp);
+    case GIMP_COLOR_MODE:        return(ColorizeCompositeOp);
+    case GIMP_DODGE_MODE:        return(ColorDodgeCompositeOp);
+    case GIMP_BURN_MODE:         return(ColorBurnCompositeOp);
+    case GIMP_HARDLIGHT_MODE:    return(HardLightCompositeOp);
+    case GIMP_DIVIDE_MODE:       return(DivideDstCompositeOp);
     /* these are the ones we don't support...yet */
-    case GIMP_BEHIND_MODE:    return( OverCompositeOp );
-    case GIMP_VALUE_MODE:    return( OverCompositeOp );
-    default:
-      return(OverCompositeOp);
+    case GIMP_BEHIND_MODE:       return(OverCompositeOp);
+    case GIMP_VALUE_MODE:        return(OverCompositeOp);
+    default:                     return(OverCompositeOp);
   }
 }
 \f
@@ -288,13 +287,6 @@ static CompositeOperator GIMPBlendModeToCompositeOperator(
 %
 */
 
-static inline size_t MagickMin(const size_t x,const size_t y)
-{
-  if (x < y)
-    return(x);
-  return(y);
-}
-
 static char *ReadBlobStringWithLongSize(Image *image,char *string,size_t max,
   ExceptionInfo *exception)
 {
@@ -462,117 +454,111 @@ static MagickBooleanType load_tile_rle(Image *image,Image *tile_image,
               length=(size_t) ((*xcfdata << 8) + xcfdata[1]);
               xcfdata+=2;
             }
-            size-=length;
-            if (size < 0)
-              goto bogus_rle;
-            if (&xcfdata[length-1] > xcfdatalimit)
-              goto bogus_rle;
-            while (length-- > 0)
+          size-=length;
+          if (size < 0)
+            goto bogus_rle;
+          if (&xcfdata[length-1] > xcfdatalimit)
+            goto bogus_rle;
+          while (length-- > 0)
+          {
+            data=(*xcfdata++);
+            switch (i)
             {
-              data=(*xcfdata++);
-              switch (i)
+              case 0:
               {
-                case 0:
-                {
-                  if (inDocInfo->image_type != GIMP_GRAY)
-                    {
-                      SetPixelRed(tile_image,ScaleCharToQuantum(data),q);
-                      SetPixelGreen(tile_image,ScaleCharToQuantum(data),q);
-                      SetPixelBlue(tile_image,ScaleCharToQuantum(data),q);
-                      SetPixelAlpha(tile_image,data == 255U ? alpha :
-                        ScaleCharToQuantum(data),q);
-                    }
-                  else
-                    {
-                      SetPixelGray(tile_image,ScaleCharToQuantum(data),q);
-                      SetPixelAlpha(tile_image,data == 255U ? alpha :
-                        ScaleCharToQuantum(data),q);
-                    }
-                  break;
-                }
-                case 1:
-                {
+                if (inDocInfo->image_type == GIMP_GRAY)
+                  SetPixelGray(tile_image,ScaleCharToQuantum(data),q);
+                else
+                  {
+                    SetPixelRed(tile_image,ScaleCharToQuantum(data),q);
+                    SetPixelGreen(tile_image,ScaleCharToQuantum(data),q);
+                    SetPixelBlue(tile_image,ScaleCharToQuantum(data),q);
+                  }
+                SetPixelAlpha(tile_image,alpha,q);
+                break;
+              }
+              case 1:
+              {
+                if (inDocInfo->image_type == GIMP_GRAY)
+                  SetPixelAlpha(tile_image,ScaleCharToQuantum(data),q);
+                else
                   SetPixelGreen(tile_image,ScaleCharToQuantum(data),q);
-                  break;
-                }
-                case 2:
-                {
-                  SetPixelBlue(tile_image,ScaleCharToQuantum(data),q);
-                  break;
-                }
-                case 3:
-                {
-                  SetPixelAlpha(tile_image,data == 255U ? alpha :
-                    ScaleCharToQuantum(data),q);
-                  break;
-                }
+                break;
+              }
+              case 2:
+              {
+                SetPixelBlue(tile_image,ScaleCharToQuantum(data),q);
+                break;
+              }
+              case 3:
+              {
+                SetPixelAlpha(tile_image,ScaleCharToQuantum(data),q);
+                break;
               }
-              q+=GetPixelChannels(tile_image);
             }
+            q+=GetPixelChannels(tile_image);
           }
-        else
+        }
+      else
+        {
+          length+=1;
+          if (length == 128)
+            {
+              if (xcfdata >= xcfdatalimit)
+                goto bogus_rle;
+              length=(size_t) ((*xcfdata << 8) + xcfdata[1]);
+              xcfdata+=2;
+            }
+          size-=length;
+          if (size < 0)
+            goto bogus_rle;
+          if (xcfdata > xcfdatalimit)
+            goto bogus_rle;
+          pixel=(*xcfdata++);
+          for (j=0; j < (ssize_t) length; j++)
           {
-            length+=1;
-            if (length == 128)
+            data=pixel;
+            switch (i)
+            {
+              case 0:
               {
-                if (xcfdata >= xcfdatalimit)
-                  goto bogus_rle;
-                length=(size_t) ((*xcfdata << 8) + xcfdata[1]);
-                xcfdata+=2;
+                if (inDocInfo->image_type == GIMP_GRAY)
+                  SetPixelGray(tile_image,ScaleCharToQuantum(data),q);
+                else
+                  {
+                    SetPixelRed(tile_image,ScaleCharToQuantum(data),q);
+                    SetPixelGreen(tile_image,ScaleCharToQuantum(data),q);
+                    SetPixelBlue(tile_image,ScaleCharToQuantum(data),q);
+                  }
+                SetPixelAlpha(tile_image,alpha,q);
+                break;
               }
-            size-=length;
-            if (size < 0)
-              goto bogus_rle;
-            if (xcfdata > xcfdatalimit)
-              goto bogus_rle;
-            pixel=(*xcfdata++);
-            for (j=0; j < (ssize_t) length; j++)
-            {
-              data=pixel;
-              switch (i)
+              case 1:
               {
-                case 0:
-                {
-                  if (inDocInfo->image_type != GIMP_GRAY)
-                    {
-                      SetPixelRed(tile_image,ScaleCharToQuantum(data),q);
-                      SetPixelGreen(tile_image,ScaleCharToQuantum(data),q);
-                      SetPixelBlue(tile_image,ScaleCharToQuantum(data),q);
-                      SetPixelAlpha(tile_image,data == 255U ? alpha :
-                        ScaleCharToQuantum(data),q);
-                    }
-                  else
-                    {
-                      SetPixelGray(tile_image,ScaleCharToQuantum(data),q);
-                      SetPixelAlpha(tile_image,data == 255U ? alpha :
-                        ScaleCharToQuantum(data),q);
-                    }
-                  break;
-                }
-                case 1:
-                {
+                if (inDocInfo->image_type == GIMP_GRAY)
+                  SetPixelAlpha(tile_image,ScaleCharToQuantum(data),q);
+                else
                   SetPixelGreen(tile_image,ScaleCharToQuantum(data),q);
-                  break;
-                }
-                case 2:
-                {
-                  SetPixelBlue(tile_image,ScaleCharToQuantum(data),q);
-                  break;
-                }
-                case 3:
-                {
-                  SetPixelAlpha(tile_image,data == 255U ? alpha :
-                    ScaleCharToQuantum(data),q);
-                  break;
-                }
+                break;
+              }
+              case 2:
+              {
+                SetPixelBlue(tile_image,ScaleCharToQuantum(data),q);
+                break;
+              }
+              case 3:
+              {
+                SetPixelAlpha(tile_image,ScaleCharToQuantum(data),q);
+                break;
               }
-              q+=GetPixelChannels(tile_image);
             }
+            q+=GetPixelChannels(tile_image);
           }
-      }
-      if (SyncAuthenticPixels(tile_image,exception) == MagickFalse)
-        break;
+        }
     }
+    if (SyncAuthenticPixels(tile_image,exception) == MagickFalse)
+      break;
+  }
   xcfodata=(unsigned char *) RelinquishMagickMemory(xcfodata);
   return(MagickTrue);
 
@@ -1036,7 +1022,7 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
       return((Image *) NULL);
     }
   count=ReadBlob(image,14,(unsigned char *) magick);
-  if ((count == 0) ||
+  if ((count != 14) ||
       (LocaleNCompare((char *) magick,"gimp xcf",8) != 0))
     ThrowReaderException(CorruptImageError,"ImproperImageHeader");
   (void) ResetMagickMemory(&doc_info,0,sizeof(XCFDocInfo));
@@ -1261,6 +1247,9 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
       XCFLayerInfo
         *layer_info;
 
+      status=SetImageExtent(image,image->columns,image->rows,exception);
+      if (status == MagickFalse)
+        return(DestroyImageList(image));
       /* 
         the read pointer
       */
@@ -1463,7 +1452,7 @@ ModuleExport size_t RegisterXCFImage(void)
   entry->magick=(IsImageFormatHandler *) IsXCF;
   entry->description=ConstantString("GIMP image");
   entry->module=ConstantString("XCF");
-  entry->seekable_stream=MagickTrue;
+  entry->flags|=CoderSeekableStreamFlag;
   (void) RegisterMagickInfo(entry);
   return(MagickImageCoderSignature);
 }