]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Wed, 24 Aug 2011 13:17:19 +0000 (13:17 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Wed, 24 Aug 2011 13:17:19 +0000 (13:17 +0000)
MagickCore/shear.c

index 68e4f290d81daa508caf0ff8c5d2bbd27062680d..5f81146687c1e4e16f12c7ac0ad3fe90af0b7d82 100644 (file)
@@ -1111,12 +1111,10 @@ static Image *IntegralRotateImage(const Image *image,size_t rotations,
 
           width=tile_width;
           if ((tile_x+(ssize_t) tile_width) > (ssize_t) image->columns)
-            width=(size_t) (tile_width-(tile_x+tile_width-
-              image->columns));
+            width=(size_t) (tile_width-(tile_x+tile_width-image->columns));
           height=tile_height;
           if ((tile_y+(ssize_t) tile_height) > (ssize_t) image->rows)
-            height=(size_t) (tile_height-(tile_y+tile_height-
-              image->rows));
+            height=(size_t) (tile_height-(tile_y+tile_height-image->rows));
           p=GetCacheViewVirtualPixels(image_view,tile_x,tile_y,width,height,
             exception);
           if (p == (const Quantum *) NULL)
@@ -1143,10 +1141,32 @@ static Image *IntegralRotateImage(const Image *image,size_t rotations,
             tile_pixels=p+((height-1)*width+y)*GetPixelChannels(image);
             for (x=0; x < (ssize_t) height; x++)
             {
-              SetPixelRed(rotate_image,GetPixelRed(image,tile_pixels),q);
-              SetPixelGreen(rotate_image,GetPixelGreen(image,tile_pixels),q);
-              SetPixelBlue(rotate_image,GetPixelBlue(image,tile_pixels),q);
-              SetPixelAlpha(rotate_image,GetPixelAlpha(image,tile_pixels),q);
+              register ssize_t
+                i;
+
+              for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+              {
+                PixelChannel
+                  channel;
+
+                PixelTrait
+                  rotate_traits,
+                  traits;
+
+                traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+                if (traits == UndefinedPixelTrait)
+                  continue;
+                channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+                rotate_traits=GetPixelChannelMapTraits(rotate_image,channel);
+                if (rotate_traits == UndefinedPixelTrait)
+                  continue;
+                if ((rotate_traits & CopyPixelTrait) != 0)
+                  {
+                    q[channel]=tile_pixels[i];
+                    continue;
+                  }
+                q[channel]=tile_pixels[i];
+              }
               tile_pixels-=width*GetPixelChannels(image);
               q+=GetPixelChannels(rotate_image);
             }
@@ -1198,10 +1218,9 @@ static Image *IntegralRotateImage(const Image *image,size_t rotations,
 
         if (status == MagickFalse)
           continue;
-        p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,
-          exception);
-        q=QueueCacheViewAuthenticPixels(rotate_view,0,(ssize_t) (image->rows-
-          y-1),image->columns,1,exception);
+        p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
+        q=QueueCacheViewAuthenticPixels(rotate_view,0,(ssize_t) (image->rows-y-
+          1),image->columns,1,exception);
         if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
           {
             status=MagickFalse;
@@ -1210,11 +1229,33 @@ static Image *IntegralRotateImage(const Image *image,size_t rotations,
         q+=GetPixelChannels(rotate_image)*image->columns;
         for (x=0; x < (ssize_t) image->columns; x++)
         {
+          register ssize_t
+            i;
+
           q-=GetPixelChannels(rotate_image);
-          SetPixelRed(rotate_image,GetPixelRed(image,p),q);
-          SetPixelGreen(rotate_image,GetPixelGreen(image,p),q);
-          SetPixelBlue(rotate_image,GetPixelBlue(image,p),q);
-          SetPixelAlpha(rotate_image,GetPixelAlpha(image,p),q);
+          for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+          {
+            PixelChannel
+              channel;
+
+            PixelTrait
+              rotate_traits,
+              traits;
+
+            traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+            if (traits == UndefinedPixelTrait)
+              continue;
+            channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+            rotate_traits=GetPixelChannelMapTraits(rotate_image,channel);
+            if (rotate_traits == UndefinedPixelTrait)
+              continue;
+            if ((rotate_traits & CopyPixelTrait) != 0)
+              {
+                q[channel]=p[i];
+                continue;
+              }
+            q[channel]=p[i];
+          }
           p+=GetPixelChannels(image);
         }
         sync=SyncCacheViewAuthenticPixels(rotate_view,exception);
@@ -1280,14 +1321,12 @@ static Image *IntegralRotateImage(const Image *image,size_t rotations,
 
           width=tile_width;
           if ((tile_x+(ssize_t) tile_width) > (ssize_t) image->columns)
-            width=(size_t) (tile_width-(tile_x+tile_width-
-              image->columns));
+            width=(size_t) (tile_width-(tile_x+tile_width-image->columns));
           height=tile_height;
           if ((tile_y+(ssize_t) tile_height) > (ssize_t) image->rows)
-            height=(size_t) (tile_height-(tile_y+tile_height-
-              image->rows));
-          p=GetCacheViewVirtualPixels(image_view,tile_x,tile_y,width,
-            height,exception);
+            height=(size_t) (tile_height-(tile_y+tile_height-image->rows));
+          p=GetCacheViewVirtualPixels(image_view,tile_x,tile_y,width,height,
+            exception);
           if (p == (const Quantum *) NULL)
             {
               status=MagickFalse;
@@ -1301,8 +1340,8 @@ static Image *IntegralRotateImage(const Image *image,size_t rotations,
             register ssize_t
               x;
 
-            q=QueueCacheViewAuthenticPixels(rotate_view,tile_y,(ssize_t)
-              (y+rotate_image->rows-(tile_x+width)),height,1,exception);
+            q=QueueCacheViewAuthenticPixels(rotate_view,tile_y,(ssize_t) (y+
+              rotate_image->rows-(tile_x+width)),height,1,exception);
             if (q == (const Quantum *) NULL)
               {
                 status=MagickFalse;
@@ -1311,10 +1350,32 @@ static Image *IntegralRotateImage(const Image *image,size_t rotations,
             tile_pixels=p+((width-1)-y)*GetPixelChannels(image);
             for (x=0; x < (ssize_t) height; x++)
             {
-              SetPixelRed(rotate_image,GetPixelRed(image,tile_pixels),q);
-              SetPixelGreen(rotate_image,GetPixelGreen(image,tile_pixels),q);
-              SetPixelBlue(rotate_image,GetPixelBlue(image,tile_pixels),q);
-              SetPixelAlpha(rotate_image,GetPixelAlpha(image,tile_pixels),q);
+              register ssize_t
+                i;
+
+              for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+              {
+                PixelChannel
+                  channel;
+
+                PixelTrait
+                  rotate_traits,
+                  traits;
+
+                traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+                if (traits == UndefinedPixelTrait)
+                  continue;
+                channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+                rotate_traits=GetPixelChannelMapTraits(rotate_image,channel);
+                if (rotate_traits == UndefinedPixelTrait)
+                  continue;
+                if ((rotate_traits & CopyPixelTrait) != 0)
+                  {
+                    q[channel]=tile_pixels[i];
+                    continue;
+                  }
+                q[channel]=tile_pixels[i];
+              }
               tile_pixels+=width*GetPixelChannels(image);
               q+=GetPixelChannels(rotate_image);
             }