]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Mon, 18 Jul 2011 02:28:38 +0000 (02:28 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Mon, 18 Jul 2011 02:28:38 +0000 (02:28 +0000)
MagickCore/cache.c
MagickCore/effect.c

index ef3dbf259593ee4903c488eb3147819a2777a0dc..bbbba82e05d44c215425fe4b3cd5b1f33b8aefe8 100644 (file)
@@ -3145,7 +3145,7 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
 
   Quantum
     *pixels,
-    *virtual_pixel;
+    virtual_pixel[MaxPixelChannels];
 
   RectangleInfo
     region;
@@ -3160,14 +3160,17 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
     *restrict q;
 
   register ssize_t
-    u,
-    v;
+    i,
+    u;
 
   register unsigned char
     *restrict s;
 
+  ssize_t
+    v;
+
   void
-    *virtual_associated_pixel;
+    *virtual_metacontent;
 
   /*
     Acquire pixels.
@@ -3228,8 +3231,9 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
         "UnableToGetCacheNexus","`%s'",image->filename);
       return((const Quantum *) NULL);
     }
-  virtual_pixel=(Quantum *) NULL;
-  virtual_associated_pixel=(void *) NULL;
+  (void) ResetMagickMemory(virtual_pixel,0,cache_info->number_channels*
+    sizeof(*virtual_pixel));
+  virtual_metacontent=(void *) NULL;
   switch (virtual_pixel_method)
   {
     case BackgroundVirtualPixelMethod:
@@ -3246,64 +3250,48 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
       /*
         Acquire virtual pixel and associated channels.
       */
-      virtual_pixel=(Quantum *) AcquireAlignedMemory(
-        cache_info->number_channels,sizeof(*virtual_pixel));
-      if (virtual_pixel == (Quantum *) NULL)
-        {
-          virtual_nexus=DestroyPixelCacheNexus(virtual_nexus,1);
-          (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
-            "UnableToGetCacheNexus","`%s'",image->filename);
-          return((const Quantum *) NULL);
-        }
-      (void) ResetMagickMemory(virtual_pixel,0,cache_info->number_channels*
-        sizeof(*virtual_pixel));
       if (cache_info->metacontent_extent != 0)
         {
-          virtual_associated_pixel=(void *) AcquireAlignedMemory(1,
+          virtual_metacontent=(void *) AcquireAlignedMemory(1,
             cache_info->metacontent_extent);
-          if (virtual_associated_pixel == (void *) NULL)
+          if (virtual_metacontent == (void *) NULL)
             {
-              virtual_pixel=(Quantum *) RelinquishMagickMemory(virtual_pixel);
               virtual_nexus=DestroyPixelCacheNexus(virtual_nexus,1);
               (void) ThrowMagickException(exception,GetMagickModule(),
                 CacheError,"UnableToGetCacheNexus","`%s'",image->filename);
               return((const Quantum *) NULL);
             }
-          (void) ResetMagickMemory(virtual_associated_pixel,0,
+          (void) ResetMagickMemory(virtual_metacontent,0,
             cache_info->metacontent_extent);
         }
       switch (virtual_pixel_method)
       {
         case BlackVirtualPixelMethod:
         {
-          SetPixelRed(image,0,virtual_pixel);
-          SetPixelGreen(image,0,virtual_pixel);
-          SetPixelBlue(image,0,virtual_pixel);
+          for (i=0; i < cache_info->number_channels; i++)
+            SetPixelChannel(image,i,0,virtual_pixel);
           SetPixelAlpha(image,OpaqueAlpha,virtual_pixel);
           break;
         }
         case GrayVirtualPixelMethod:
         {
-          SetPixelRed(image,QuantumRange/2,virtual_pixel);
-          SetPixelGreen(image,QuantumRange/2,virtual_pixel);
-          SetPixelBlue(image,QuantumRange/2,virtual_pixel);
+          for (i=0; i < cache_info->number_channels; i++)
+            SetPixelChannel(image,i,QuantumRange/2,virtual_pixel);
           SetPixelAlpha(image,OpaqueAlpha,virtual_pixel);
           break;
         }
         case TransparentVirtualPixelMethod:
         {
-          SetPixelRed(image,0,virtual_pixel);
-          SetPixelGreen(image,0,virtual_pixel);
-          SetPixelBlue(image,0,virtual_pixel);
+          for (i=0; i < cache_info->number_channels; i++)
+            SetPixelChannel(image,i,0,virtual_pixel);
           SetPixelAlpha(image,TransparentAlpha,virtual_pixel);
           break;
         }
         case MaskVirtualPixelMethod:
         case WhiteVirtualPixelMethod:
         {
-          SetPixelRed(image,(Quantum) QuantumRange,virtual_pixel);
-          SetPixelGreen(image,(Quantum) QuantumRange,virtual_pixel);
-          SetPixelBlue(image,(Quantum) QuantumRange,virtual_pixel);
+          for (i=0; i < cache_info->number_channels; i++)
+            SetPixelChannel(image,i,QuantumRange,virtual_pixel);
           SetPixelAlpha(image,OpaqueAlpha,virtual_pixel);
           break;
         }
@@ -3312,6 +3300,7 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
           SetPixelRed(image,image->background_color.red,virtual_pixel);
           SetPixelGreen(image,image->background_color.green,virtual_pixel);
           SetPixelBlue(image,image->background_color.blue,virtual_pixel);
+          SetPixelBlack(image,image->background_color.black,virtual_pixel);
           SetPixelAlpha(image,image->background_color.alpha,virtual_pixel);
           break;
         }
@@ -3419,7 +3408,7 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
             case WhiteVirtualPixelMethod:
             {
               p=virtual_pixel;
-              r=virtual_associated_pixel;
+              r=virtual_metacontent;
               break;
             }
             case EdgeVirtualPixelMethod:
@@ -3430,7 +3419,7 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
               if (((x_modulo.quotient ^ y_modulo.quotient) & 0x01) != 0L)
                 {
                   p=virtual_pixel;
-                  r=virtual_associated_pixel;
+                  r=virtual_metacontent;
                   break;
                 }
               p=GetVirtualPixelsFromNexus(image,virtual_pixel_method,
@@ -3444,7 +3433,7 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
               if (((y+v) < 0) || ((y+v) >= (ssize_t) cache_info->rows))
                 {
                   p=virtual_pixel;
-                  r=virtual_associated_pixel;
+                  r=virtual_metacontent;
                   break;
                 }
               x_modulo=VirtualPixelModulo(x+u,cache_info->columns);
@@ -3460,7 +3449,7 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
               if (((x+u) < 0) || ((x+u) >= (ssize_t) cache_info->columns))
                 {
                   p=virtual_pixel;
-                  r=virtual_associated_pixel;
+                  r=virtual_metacontent;
                   break;
                 }
               x_modulo=VirtualPixelModulo(x+u,cache_info->columns);
@@ -3477,8 +3466,7 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
           (void) memcpy(q,p,(size_t) length*cache_info->number_channels*
             sizeof(*p));
           q+=cache_info->number_channels;
-          if ((s != (void *) NULL) &&
-              (r != (const void *) NULL))
+          if ((s != (void *) NULL) && (r != (const void *) NULL))
             {
               (void) memcpy(s,r,(size_t) cache_info->metacontent_extent);
               s+=cache_info->metacontent_extent;
@@ -3495,7 +3483,7 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
       r=GetVirtualMetacontentFromNexus(cache_info,*virtual_nexus);
       (void) memcpy(q,p,(size_t) length*cache_info->number_channels*sizeof(*p));
       q+=length*cache_info->number_channels;
-      if ((s != (void *) NULL) && (r != (const void *) NULL))
+      if ((r != (void *) NULL) && (s != (const void *) NULL))
         {
           (void) memcpy(s,r,(size_t) length);
           s+=length*cache_info->metacontent_extent;
@@ -3505,11 +3493,8 @@ MagickExport const Quantum *GetVirtualPixelsFromNexus(const Image *image,
   /*
     Free resources.
   */
-  if (virtual_associated_pixel != (void *) NULL)
-    virtual_associated_pixel=(void *) RelinquishMagickMemory(
-      virtual_associated_pixel);
-  if (virtual_pixel != (Quantum *) NULL)
-    virtual_pixel=(Quantum *) RelinquishMagickMemory(virtual_pixel);
+  if (virtual_metacontent != (void *) NULL)
+    virtual_metacontent=(void *) RelinquishMagickMemory(virtual_metacontent);
   virtual_nexus=DestroyPixelCacheNexus(virtual_nexus,1);
   return(pixels);
 }
index a526f8a516c2d4f9febc2acd08a6f7eb0aaadb81..30fdb0db4d0e3df82778185c85e02449df7c2a98 100644 (file)
@@ -1208,8 +1208,7 @@ MagickExport Image *ConvolveImage(const Image *image,
 
   CacheView
     *convolve_view,
-    *image_view,
-    *sliding_view;
+    *image_view;
 
   Image
     *convolve_image;
@@ -1284,7 +1283,6 @@ MagickExport Image *ConvolveImage(const Image *image,
   status=MagickTrue;
   progress=0;
   image_view=AcquireCacheView(image);
-  sliding_view=AcquireCacheView(image);
   convolve_view=AcquireCacheView(convolve_image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
@@ -1292,8 +1290,7 @@ MagickExport Image *ConvolveImage(const Image *image,
   for (y=0; y < (ssize_t) image->rows; y++)
   {
     register const Quantum
-      *restrict p,
-      *restrict sliding_pixels;
+      *restrict p;
 
     register Quantum
       *restrict q;
@@ -1307,14 +1304,12 @@ MagickExport Image *ConvolveImage(const Image *image,
 
     if (status == MagickFalse)
       continue;
-    p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-    sliding_pixels=GetCacheViewVirtualPixels(sliding_view,-((ssize_t)
-      kernel_info->width/2L),y-(ssize_t) (kernel_info->height/2L),
-      image->columns+kernel_info->width,kernel_info->height,exception);
+    p=GetCacheViewVirtualPixels(image_view,-((ssize_t) kernel_info->width/2L),y-
+      (ssize_t) (kernel_info->height/2L),image->columns+kernel_info->width,
+      kernel_info->height,exception);
     q=QueueCacheViewAuthenticPixels(convolve_view,0,y,convolve_image->columns,1,
       exception);
-    if ((p == (const Quantum *) NULL) ||
-        (sliding_pixels == (const Quantum *) NULL) || (q == (Quantum *) NULL))
+    if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
       {
         status=MagickFalse;
         continue;
@@ -1361,11 +1356,16 @@ MagickExport Image *ConvolveImage(const Image *image,
           continue;
         if ((convolve_traits & CopyPixelTrait) != 0)
           {
-            SetPixelChannel(convolve_image,channel,p[i],q);
+            ssize_t
+              center;
+
+            center=channels*(image->columns+kernel_info->width)*
+              (kernel_info->height/2L)+channels*(kernel_info->width/2);
+            SetPixelChannel(convolve_image,channel,p[center+i],q);
             continue;
           }
         k=kernel_info->values;
-        pixels=sliding_pixels;
+        pixels=p;
         pixel=kernel_info->bias;
         if (((convolve_traits & BlendPixelTrait) == 0) ||
             (GetPixelAlphaTraits(image) == UndefinedPixelTrait) ||
@@ -1407,7 +1407,6 @@ MagickExport Image *ConvolveImage(const Image *image,
         SetPixelChannel(convolve_image,channel,ClampToQuantum(gamma*pixel),q);
       }
       p+=channels;
-      sliding_pixels+=channels;
       q+=convolve_channels;
     }
     if (SyncCacheViewAuthenticPixels(convolve_view,exception) == MagickFalse)
@@ -1427,7 +1426,6 @@ MagickExport Image *ConvolveImage(const Image *image,
   }
   convolve_image->type=image->type;
   convolve_view=DestroyCacheView(convolve_view);
-  sliding_view=DestroyCacheView(sliding_view);
   image_view=DestroyCacheView(image_view);
   if (status == MagickFalse)
     convolve_image=DestroyImage(convolve_image);