From 782d590b77aa8273e7f11f6e916bc693d36dea90 Mon Sep 17 00:00:00 2001 From: J?rgen Tjern? Date: Tue, 2 Sep 2014 14:14:23 -0700 Subject: [PATCH] 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. --- src/video/SDL_shape.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/video/SDL_shape.c b/src/video/SDL_shape.c index 97248bbc8..147c60a5b 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;ykind = 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;