diff src/pixelarray.c @ 959:cbb061b8ff4c

Fixed array assignments in PixelArray.
author marcus
date Mon, 10 Mar 2008 21:59:17 +0000
parents 55cbc4a11f22
children 3e118ec659d7
line wrap: on
line diff
--- a/src/pixelarray.c	Mon Mar 10 03:22:36 2008 +0000
+++ b/src/pixelarray.c	Mon Mar 10 21:59:17 2008 +0000
@@ -646,7 +646,7 @@
     PyPixelArray *val)
 {
     SDL_Surface *surface;
-    SDL_Surface *valsf;
+    SDL_Surface *valsf = NULL;
     Uint32 x;
     Uint32 y;
     Uint32 vx;
@@ -669,7 +669,7 @@
     surface = PySurface_AsSurface (array->surface);
     GET_SLICE_VALS (array, start, end, ylen, ystep, xlen, xstep, padding,
         low, high, 1, surface->pitch);
-    
+
     if (val->ylen / val->ystep != ylen / ystep ||
         val->xlen / val->xstep != xlen / xstep)
     {
@@ -685,47 +685,48 @@
 
     if (bpp != valbpp)
     {
-        /* bpp do not match. */
-        /* TODO */
+        /* bpp do not match. We cannot guarantee that the padding and co
+         * would be set correctly. */
         PyErr_SetString (PyExc_ValueError, "bit depths do not match");
         return -1;
     }
 
     vx = 0;
     vy = 0;
+
     /* Single value assignment. */
     switch (bpp)
     {
     case 1:
         for (y = 0; y < ylen; y += ystep)
         {
-            vy += val->ystep;
             vx = 0;
             for (x = 0; x < xlen; x += xstep)
             {
                 offset = start + x;
-                vx += val->xstep;
 
                 *((Uint8 *) pixels + y * padding + offset) =
                     (Uint8)*((Uint8 *)
                         valsf->pixels + vy * val->padding + val->start + vx);
+                vx += val->xstep;
             }
+            vy += val->ystep;
         }
         break;
     case 2:
         for (y = 0; y < ylen; y += ystep)
         {
-            vy += val->ystep;
             vx = 0;
             for (x = 0; x < xlen; x += xstep)
             {
                 offset = start + x;
-                vx += val->xstep;
 
                 *((Uint16 *) (pixels + y * padding) + offset) =
                     (Uint16)*((Uint16 *)
-                        ((Uint8*)valsf->pixels + vy * val->padding) + val->start + vy);
+                        ((Uint8*)valsf->pixels + vy * val->padding) + val->start + vx);
+                vx += val->xstep;
             }
+            vy += val->ystep;
         }
         break;
     case 3:
@@ -736,12 +737,10 @@
         SDL_PixelFormat *vformat = valsf->format;
         for (y = 0; y < ylen; y += ystep)
         {
-            vy += val->ystep;
             vx = 0;
             for (x = 0; x < xlen; x += xstep)
             {
                 offset = start + x;
-                vx += val->xstep;
 
                 px = (Uint8 *) (pixels + y * padding) + offset * 3;
                 vpx = (Uint8 *) ((Uint8*)valsf->pixels + y * val->padding) +
@@ -759,24 +758,26 @@
                 *(px + 2 - (format->Bshift >> 3)) =
                     *(vpx + 2 - (vformat->Bshift >> 3));
 #endif
+                vx += val->xstep;
             }
+            vy += val->ystep;
         }
         break;
     }
     default:
         for (y = 0; y < ylen; y += ystep)
         {
-            vy += val->ystep;
             vx = 0;
             for (x = 0; x < xlen; x += xstep)
             {
                 offset = start + x;
-                vx += val->xstep;
 
                 *((Uint32 *) (pixels + y * padding) + offset) =
                     *((Uint32 *)
                         ((Uint8*)valsf->pixels + y * val->padding) + val->start + vx);
+                vx += val->xstep;
             }
+            vy += val->ystep;
         }
         break;
     }
@@ -1060,13 +1061,19 @@
             high = array->ylen;
     }
 
-    for (i = low; i < high; i++)
+    if (PyPixelArray_Check (value))
+    {
+        return _array_assign_array (array, low, high, (PyPixelArray *) value);
+    }
+    else
     {
-        val = _pxarray_ass_item (array, i, value);
-        if (val != 0)
-            return val;
+        for (i = low; i < high; i++)
+        {
+            val = _pxarray_ass_item (array, i, value);
+            if (val != 0)
+                return val;
+        }
     }
-
     return 0;
 }