]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Thu, 29 Dec 2011 03:45:45 +0000 (03:45 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Thu, 29 Dec 2011 03:45:45 +0000 (03:45 +0000)
MagickCore/cache.c
MagickCore/image.c
MagickCore/utility-private.h

index 2034e3dee6754e7a1262654cb6fb39c44ef97b19..0745074aa4ababdd776195233d89961fc81756a7 100644 (file)
@@ -998,6 +998,9 @@ static MagickBooleanType UnoptimizedPixelCacheClone(CacheInfo *clone_info,
   {
     for (x=0; x < (ssize_t) cache_info->columns; x++)
     {
+      register ssize_t
+        i;
+
       /*
         Read a set of pixel channels.
       */
@@ -1017,24 +1020,42 @@ static MagickBooleanType UnoptimizedPixelCacheClone(CacheInfo *clone_info,
       cache_offset+=length;
       if ((y < (ssize_t) clone_info->rows) &&
           (x < (ssize_t) clone_info->columns))
+        for (i=0; i < (ssize_t) clone_info->number_channels; i++)
         {
+          PixelChannel
+            channel;
+
+          PixelTrait
+            traits;
+
+          ssize_t
+            offset;
+
           /*
-            Write a set of pixel channels.
+            Write a set of pixel channels .
           */
-          length=clone_info->number_channels*sizeof(Quantum);
+          channel=clone_info->channel_map[i].channel;
+          traits=cache_info->channel_map[channel].traits;
+          if (traits == UndefinedPixelTrait)
+            {
+              clone_offset+=sizeof(Quantum);
+              continue;
+            }
+          offset=cache_info->channel_map[channel].offset;
           if (clone_info->type != DiskCache)
             (void) memcpy((unsigned char *) clone_info->pixels+clone_offset,
-              blob,length);
+              blob+offset*sizeof(Quantum),sizeof(Quantum));
           else
             {
-              count=WritePixelCacheRegion(clone_info,clone_offset,length,blob);
-              if ((MagickSizeType) count != length)
+              count=WritePixelCacheRegion(clone_info,clone_offset,
+                sizeof(Quantum),blob+offset*sizeof(Quantum));
+              if ((MagickSizeType) count != sizeof(Quantum))
                 {
                   status=MagickFalse;
                   break;
                 }
             }
-          clone_offset+=length;
+          clone_offset+=sizeof(Quantum);
         }
     }
     length=clone_info->number_channels*sizeof(Quantum);
@@ -1042,7 +1063,7 @@ static MagickBooleanType UnoptimizedPixelCacheClone(CacheInfo *clone_info,
     for ( ; x < (ssize_t) clone_info->columns; x++)
     {
       /*
-        Set remaining columns with transparent pixel channels.
+        Set remaining columns as undefined.
       */
       if (clone_info->type != DiskCache)
         (void) memcpy((unsigned char *) clone_info->pixels+clone_offset,blob,
@@ -1064,7 +1085,7 @@ static MagickBooleanType UnoptimizedPixelCacheClone(CacheInfo *clone_info,
   for ( ; y < (ssize_t) clone_info->rows; y++)
   {
     /*
-      Set remaining rows with transparent pixels.
+      Set remaining rows as undefined.
     */
     for (x=0; x < (ssize_t) clone_info->columns; x++)
     {
@@ -1083,7 +1104,7 @@ static MagickBooleanType UnoptimizedPixelCacheClone(CacheInfo *clone_info,
       clone_offset+=length;
     }
   }
-  if ((cache_info->metacontent_extent != 0) &&
+  if ((cache_info->metacontent_extent != 0) ||
       (clone_info->metacontent_extent != 0))
     {
       /*
@@ -1138,7 +1159,7 @@ static MagickBooleanType UnoptimizedPixelCacheClone(CacheInfo *clone_info,
         for ( ; x < (ssize_t) clone_info->columns; x++)
         {
           /*
-            Set remaining columns with metacontent.
+            Set remaining columns as undefined.
           */
           if (clone_info->type != DiskCache)
             (void) memcpy((unsigned char *) clone_info->pixels+clone_offset,
@@ -1160,7 +1181,7 @@ static MagickBooleanType UnoptimizedPixelCacheClone(CacheInfo *clone_info,
       for ( ; y < (ssize_t) clone_info->rows; y++)
       {
         /*
-          Set remaining rows with metacontent.
+          Set remaining rows as undefined.
         */
         for (x=0; x < (ssize_t) clone_info->columns; x++)
         {
@@ -1205,8 +1226,6 @@ static MagickBooleanType ClonePixelCachePixels(CacheInfo *clone_info,
       (memcmp(p,q,cache_info->number_channels*sizeof(*p)) == 0) &&
       (cache_info->metacontent_extent == clone_info->metacontent_extent))
     return(OptimizedPixelCacheClone(clone_info,cache_info,exception));
-  if (memcmp(p,q,cache_info->number_channels*sizeof(*p)) != 0)
-    ;
   return(UnoptimizedPixelCacheClone(clone_info,cache_info,exception));
 }
 \f
@@ -1973,16 +1992,23 @@ static inline MagickBooleanType ValidatePixelCacheMorphology(const Image *image)
   CacheInfo
     *cache_info;
 
+  PixelChannelMap
+    *p,
+    *q;
+
   /*
     Does the image match the pixel cache morphology?
   */
   cache_info=(CacheInfo *) image->cache;
+  p=image->channel_map;
+  q=cache_info->channel_map;
   if ((image->storage_class != cache_info->storage_class) ||
       (image->colorspace != cache_info->colorspace) ||
       (image->matte != cache_info->matte) ||
       (image->columns != cache_info->columns) ||
       (image->rows != cache_info->rows) ||
       (image->number_channels != cache_info->number_channels) ||
+      (memcmp(p,q,image->number_channels*sizeof(*p)) != 0) ||
       (image->metacontent_extent != cache_info->metacontent_extent) ||
       (cache_info->nexus_info == (NexusInfo **) NULL) ||
       (cache_info->number_threads < GetOpenMPMaximumThreads()))
@@ -2153,11 +2179,11 @@ MagickExport MagickBooleanType GetOneAuthenticPixel(Image *image,
   q=GetAuthenticPixelsCache(image,x,y,1UL,1UL,exception);
   if (q == (Quantum *) NULL)
     {
-      pixel[RedPixelChannel]=image->background_color.red;
-      pixel[GreenPixelChannel]=image->background_color.green;
-      pixel[BluePixelChannel]=image->background_color.blue;
-      pixel[BlackPixelChannel]=image->background_color.black;
-      pixel[AlphaPixelChannel]=image->background_color.alpha;
+      pixel[RedPixelChannel]=ClampToQuantum(image->background_color.red);
+      pixel[GreenPixelChannel]=ClampToQuantum(image->background_color.green);
+      pixel[BluePixelChannel]=ClampToQuantum(image->background_color.blue);
+      pixel[BlackPixelChannel]=ClampToQuantum(image->background_color.black);
+      pixel[AlphaPixelChannel]=ClampToQuantum(image->background_color.alpha);
       return(MagickFalse);
     }
   for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
@@ -2228,11 +2254,11 @@ static MagickBooleanType GetOneAuthenticPixelFromCache(Image *image,
     exception);
   if (q == (Quantum *) NULL)
     {
-      pixel[RedPixelChannel]=image->background_color.red;
-      pixel[GreenPixelChannel]=image->background_color.green;
-      pixel[BluePixelChannel]=image->background_color.blue;
-      pixel[BlackPixelChannel]=image->background_color.black;
-      pixel[AlphaPixelChannel]=image->background_color.alpha;
+      pixel[RedPixelChannel]=ClampToQuantum(image->background_color.red);
+      pixel[GreenPixelChannel]=ClampToQuantum(image->background_color.green);
+      pixel[BluePixelChannel]=ClampToQuantum(image->background_color.blue);
+      pixel[BlackPixelChannel]=ClampToQuantum(image->background_color.black);
+      pixel[AlphaPixelChannel]=ClampToQuantum(image->background_color.alpha);
       return(MagickFalse);
     }
   for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
@@ -2307,11 +2333,11 @@ MagickExport MagickBooleanType GetOneVirtualPixel(const Image *image,
     1UL,1UL,cache_info->nexus_info[id],exception);
   if (p == (const Quantum *) NULL)
     {
-      pixel[RedPixelChannel]=image->background_color.red;
-      pixel[GreenPixelChannel]=image->background_color.green;
-      pixel[BluePixelChannel]=image->background_color.blue;
-      pixel[BlackPixelChannel]=image->background_color.black;
-      pixel[AlphaPixelChannel]=image->background_color.alpha;
+      pixel[RedPixelChannel]=ClampToQuantum(image->background_color.red);
+      pixel[GreenPixelChannel]=ClampToQuantum(image->background_color.green);
+      pixel[BluePixelChannel]=ClampToQuantum(image->background_color.blue);
+      pixel[BlackPixelChannel]=ClampToQuantum(image->background_color.black);
+      pixel[AlphaPixelChannel]=ClampToQuantum(image->background_color.alpha);
       return(MagickFalse);
     }
   for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
@@ -2386,11 +2412,11 @@ static MagickBooleanType GetOneVirtualPixelFromCache(const Image *image,
     cache_info->nexus_info[id],exception);
   if (p == (const Quantum *) NULL)
     {
-      pixel[RedPixelChannel]=image->background_color.red;
-      pixel[GreenPixelChannel]=image->background_color.green;
-      pixel[BluePixelChannel]=image->background_color.blue;
-      pixel[BlackPixelChannel]=image->background_color.black;
-      pixel[AlphaPixelChannel]=image->background_color.alpha;
+      pixel[RedPixelChannel]=ClampToQuantum(image->background_color.red);
+      pixel[GreenPixelChannel]=ClampToQuantum(image->background_color.green);
+      pixel[BluePixelChannel]=ClampToQuantum(image->background_color.blue);
+      pixel[BlackPixelChannel]=ClampToQuantum(image->background_color.black);
+      pixel[AlphaPixelChannel]=ClampToQuantum(image->background_color.alpha);
       return(MagickFalse);
     }
   for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
@@ -3305,12 +3331,17 @@ MagickPrivate const Quantum *GetVirtualPixelsFromNexus(const Image *image,
         }
         default:
         {
-          SetPixelRed(image,image->background_color.red,virtual_pixel);
-          SetPixelGreen(image,image->background_color.green,virtual_pixel);
-          SetPixelBlue(image,image->background_color.blue,virtual_pixel);
+          SetPixelRed(image,ClampToQuantum(image->background_color.red),
+            virtual_pixel);
+          SetPixelGreen(image,ClampToQuantum(image->background_color.green),
+            virtual_pixel);
+          SetPixelBlue(image,ClampToQuantum(image->background_color.blue),
+            virtual_pixel);
           if (image->colorspace == CMYKColorspace)
-            SetPixelBlack(image,image->background_color.black,virtual_pixel);
-          SetPixelAlpha(image,image->background_color.alpha,virtual_pixel);
+            SetPixelBlack(image,ClampToQuantum(image->background_color.black),
+              virtual_pixel);
+          SetPixelAlpha(image,ClampToQuantum(image->background_color.alpha),
+            virtual_pixel);
           break;
         }
       }
@@ -4015,7 +4046,7 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode,
   InitializePixelChannelMap(image);
   cache_info->number_channels=GetPixelChannels(image);
   (void) memcpy(cache_info->channel_map,image->channel_map,
-    cache_info->number_channels*sizeof(*image->channel_map));
+    MaxPixelChannels*sizeof(*image->channel_map));
   cache_info->metacontent_extent=image->metacontent_extent;
   cache_info->mode=mode;
   if (image->ping != MagickFalse)
index a1f8e511ddbdf8b1e962e2b4db9f399f3fdb43c7..5fe997b1da12f84e6f57db266fd217981d0be11b 100644 (file)
@@ -984,7 +984,6 @@ MagickExport ImageInfo *CloneImageInfo(const ImageInfo *image_info)
   (void) CopyMagickString(clone_info->filename,image_info->filename,
     MaxTextExtent);
   clone_info->channel=image_info->channel;
-
   (void) CloneImageOptions(clone_info,image_info);
   clone_info->debug=IsEventLogging();
   clone_info->signature=image_info->signature;
index 4cc4bc2e7889b57c55f0753816006a7e9a2f9c6a..922985e0c09c14fbc9ff9fc8e21b9c58a72d2dbc 100644 (file)
@@ -104,7 +104,7 @@ static inline FILE *fopen_utf8(const char *path,const char *mode)
 #endif
 }
 
-static inline int open_utf8(const char *path,int flags,int mode)
+static inline int open_utf8(const char *path,int flags,mode_t mode)
 {
 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__)
   return(open(path,flags,mode));