[Image-SIG] Pasting with pixmaps broken in 1.0 final? [PATCH]

Fredrik Lundh fredrik@pythonware.com
Wed, 8 Dec 1999 22:32:25 +0100


I wrote:
 
> > Robert Kern <kern@its.caltech.edu> wrote:
> > > Under 1.0b1, the image is a square gradient going from red to green on a
> > > red background.  Under 1.0 final, the image has the left half of the
> > > gradient the same as previous, but the right half is a solid light blue,
> > > no gradient at all.
> 
> I'll post patches for Paste.c during this weekend
> (and update our regression test suite...)

a little late, but here's the patch.  this will
be fixed in the upcoming 1.0.2 release.

</F>

--- libImaging/Paste.c.orig Mon Jul 26 23:02:14 1999
+++ libImaging/Paste.c Wed Dec 08 22:27:59 1999
@@ -13,6 +13,7 @@
  * 98-02-02 fl Fixed MULDIV255 macro for gcc
  * 99-02-02 fl Added "RGBa" mask support
  * 99-02-06 fl Rewritten.  Added support for masked fill operations.
+ * 99-12-03 fl Fixed matte fill.
  *
  * Copyright (c) Fredrik Lundh 1996-97.
  * Copyright (c) Secret Labs AB 1997-99.
@@ -345,7 +346,7 @@
 }
 
 static inline void
-fill_mask_L(Imaging imOut, const void* ink_, Imaging imMask,
+fill_mask_L(Imaging imOut, const UINT8* ink, Imaging imMask,
             int dx, int dy, int sx, int sy,
             int xsize, int ysize, int pixelsize)
 {
@@ -353,8 +354,6 @@
 
     int x, y, i;
     unsigned int tmp1, tmp2;
-    INT32 ink = 0L;
-    memcpy(&ink, ink_, pixelsize);
 
     if (imOut->image8) {
 
@@ -362,7 +361,7 @@
             UINT8* out = imOut->image8[y+dy]+dx;
             UINT8* mask = imMask->image8[y+sy]+sx;
             for (x = 0; x < xsize; x++) {
-                *out = BLEND(*mask, *out, ink, tmp1, tmp2);
+                *out = BLEND(*mask, *out, ink[0], tmp1, tmp2);
                 out++, mask++;
             }
         }
@@ -374,7 +373,7 @@
             UINT8* mask = (UINT8*) imMask->image[y+sy]+sx;
             for (x = 0; x < xsize; x++) {
                 for (i = 0; i < pixelsize; i++) {
-                    *out = BLEND(*mask, *out, ink, tmp1, tmp2);
+                    *out = BLEND(*mask, *out, ink[i], tmp1, tmp2);
                     out++;
                 }
                 mask++;
@@ -384,7 +383,7 @@
 }
 
 static inline void
-fill_mask_RGBA(Imaging imOut, const void* ink_, Imaging imMask,
+fill_mask_RGBA(Imaging imOut, const UINT8* ink, Imaging imMask,
                int dx, int dy, int sx, int sy,
                int xsize, int ysize, int pixelsize)
 {
@@ -392,8 +391,6 @@
 
     int x, y, i;
     unsigned int tmp1, tmp2;
-    INT32 ink = 0L;
-    memcpy(&ink, ink_, pixelsize);
 
     if (imOut->image8) {
 
@@ -402,7 +399,7 @@
             UINT8* out = imOut->image8[y+dy]+dx;
             UINT8* mask = (UINT8*) imMask->image[y+sy]+sx;
             for (x = 0; x < xsize; x++) {
-                *out = BLEND(*mask, *out, ink, tmp1, tmp2);
+                *out = BLEND(*mask, *out, ink[0], tmp1, tmp2);
                 out++, mask += 4;
             }
         }
@@ -416,7 +413,7 @@
             UINT8* mask = (UINT8*) imMask->image[y+sy]+sx;
             for (x = 0; x < xsize; x++) {
                 for (i = 0; i < pixelsize; i++) {
-                    *out = BLEND(*mask, *out, ink, tmp1, tmp2);
+                    *out = BLEND(*mask, *out, ink[i], tmp1, tmp2);
                     out++;
                 }
                 mask += 4;
@@ -426,7 +423,7 @@
 }
 
 static inline void
-fill_mask_RGBa(Imaging imOut, const void* ink_, Imaging imMask,
+fill_mask_RGBa(Imaging imOut, const UINT8* ink, Imaging imMask,
                int dx, int dy, int sx, int sy,
                int xsize, int ysize, int pixelsize)
 {
@@ -434,8 +431,6 @@
 
     int x, y, i;
     unsigned int tmp1;
-    INT32 ink = 0L;
-    memcpy(&ink, ink_, pixelsize);
 
     if (imOut->image8) {
 
@@ -444,7 +439,7 @@
             UINT8* out = imOut->image8[y+dy]+dx;
             UINT8* mask = (UINT8*) imMask->image[y+sy]+sx;
             for (x = 0; x < xsize; x++) {
-                *out = PREBLEND(*mask, *out, ink, tmp1);
+                *out = PREBLEND(*mask, *out, ink[0], tmp1);
                 out++, mask += 4;
             }
         }
@@ -458,7 +453,7 @@
             UINT8* mask = (UINT8*) imMask->image[y+sy]+sx;
             for (x = 0; x < xsize; x++) {
                 for (i = 0; i < pixelsize; i++) {
-                    *out = PREBLEND(*mask, *out, ink, tmp1);
+                    *out = PREBLEND(*mask, *out, ink[i], tmp1);
                     out++;
                 }
                 mask += 4;