Commit 782d590b77aa8273e7f11f6e916bc693d36dea90

J?rgen Tjern? 2014-09-02T14:14:23

Fix non-power-of-two shaped windows. This fixes a bug where SDL_SetWindowShape would render artifacts if the image was not a power of two image, due to rounding of width / 2.

diff --git a/src/video/SDL_shape.c b/src/video/SDL_shape.c
index 97248bb..147c60a 100644
--- a/src/video/SDL_shape.c
+++ b/src/video/SDL_shape.c
@@ -128,6 +128,7 @@ RecursivelyCalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* mask,SDL_Rec
     SDL_Color key;
     SDL_ShapeTree* result = (SDL_ShapeTree*)SDL_malloc(sizeof(SDL_ShapeTree));
     SDL_Rect next = {0,0,0,0};
+
     for(y=dimensions.y;y<dimensions.y + dimensions.h;y++) {
         for(x=dimensions.x;x<dimensions.x + dimensions.w;x++) {
             pixel_value = 0;
@@ -165,27 +166,37 @@ RecursivelyCalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* mask,SDL_Rec
             if(last_opaque == -1)
                 last_opaque = pixel_opaque;
             if(last_opaque != pixel_opaque) {
+                const int halfwidth = dimensions.w / 2;
+                const int halfheight = dimensions.h / 2;
+
                 result->kind = QuadShape;
-                /* These will stay the same. */
-                next.w = dimensions.w / 2;
-                next.h = dimensions.h / 2;
-                /* These will change from recursion to recursion. */
+
                 next.x = dimensions.x;
                 next.y = dimensions.y;
+                next.w = halfwidth;
+                next.h = halfheight;
                 result->data.children.upleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
-                next.x += next.w;
-                /* Unneeded: next.y = dimensions.y; */
+
+                next.x = dimensions.x + halfwidth;
+                next.w = dimensions.w - halfwidth;
                 result->data.children.upright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
+
                 next.x = dimensions.x;
-                next.y += next.h;
+                next.w = halfwidth;
+                next.y = dimensions.y + halfheight;
+                next.h = dimensions.h - halfheight;
                 result->data.children.downleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
-                next.x += next.w;
-                /* Unneeded: next.y = dimensions.y + dimensions.h /2; */
+
+                next.x = dimensions.x + halfwidth;
+                next.w = dimensions.w - halfwidth;
                 result->data.children.downright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
+
                 return result;
             }
         }
     }
+
+
     /* If we never recursed, all the pixels in this quadrant have the same "value". */
     result->kind = (last_opaque == SDL_TRUE ? OpaqueShape : TransparentShape);
     result->data.shape = dimensions;