comparison src/video/SDL_shape.c @ 4852:c19c729eb201

Added hiding-as-positioning trick and finally fixed flags.
author egottlieb
date Sun, 15 Aug 2010 21:46:04 -0400
parents 5624fb0190b5
children 6d4d6605a0d3
comparison
equal deleted inserted replaced
4851:5624fb0190b5 4852:c19c729eb201
30 #include "SDL_shape.h" 30 #include "SDL_shape.h"
31 #include "SDL_shape_internals.h" 31 #include "SDL_shape_internals.h"
32 32
33 SDL_Window* 33 SDL_Window*
34 SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) { 34 SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) {
35 SDL_Window *result = SDL_CreateWindow(title,x,y,w,h,flags | SDL_WINDOW_BORDERLESS & !SDL_WINDOW_FULLSCREEN & !SDL_WINDOW_RESIZABLE); 35 SDL_Window *result = SDL_CreateWindow(title,x,y,w,h,flags | SDL_WINDOW_BORDERLESS & ~SDL_WINDOW_FULLSCREEN & ~SDL_WINDOW_RESIZABLE);
36 if(result != NULL) { 36 if(result != NULL) {
37 result->shaper = result->display->device->shape_driver.CreateShaper(result); 37 result->shaper = result->display->device->shape_driver.CreateShaper(result);
38 if(result->shaper != NULL) { 38 if(result->shaper != NULL) {
39 result->shaper->userx = x; 39 result->shaper->userx = x;
40 result->shaper->usery = y; 40 result->shaper->usery = y;
124 SDL_bool pixel_opaque = SDL_FALSE; 124 SDL_bool pixel_opaque = SDL_FALSE;
125 int last_opaque = -1; 125 int last_opaque = -1;
126 SDL_Color key; 126 SDL_Color key;
127 SDL_ShapeTree* result = (SDL_ShapeTree*)SDL_malloc(sizeof(SDL_ShapeTree)); 127 SDL_ShapeTree* result = (SDL_ShapeTree*)SDL_malloc(sizeof(SDL_ShapeTree));
128 SDL_Rect next = {0,0,0,0}; 128 SDL_Rect next = {0,0,0,0};
129 for(y=dimensions.y;y<dimensions.y + dimensions.h;y++) 129 for(y=dimensions.y;y<dimensions.y + dimensions.h;y++) {
130 for(x=dimensions.x;x<dimensions.x + dimensions.w;x++) { 130 for(x=dimensions.x;x<dimensions.x + dimensions.w;x++) {
131 pixel_value = 0; 131 pixel_value = 0;
132 pixel = (Uint8 *)(mask->pixels) + (y*mask->pitch) + (x*mask->format->BytesPerPixel); 132 pixel = (Uint8 *)(mask->pixels) + (y*mask->pitch) + (x*mask->format->BytesPerPixel);
133 switch(mask->format->BytesPerPixel) { 133 switch(mask->format->BytesPerPixel) {
134 case(1): 134 case(1):
181 //Unneeded: next.y = dimensions.y + dimensions.h /2; 181 //Unneeded: next.y = dimensions.y + dimensions.h /2;
182 result->data.children.downright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next); 182 result->data.children.downright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
183 return result; 183 return result;
184 } 184 }
185 } 185 }
186 }
186 //If we never recursed, all the pixels in this quadrant have the same "value". 187 //If we never recursed, all the pixels in this quadrant have the same "value".
187 result->kind = (last_opaque == SDL_TRUE ? OpaqueShape : TransparentShape); 188 result->kind = (last_opaque == SDL_TRUE ? OpaqueShape : TransparentShape);
188 result->data.shape = dimensions; 189 result->data.shape = dimensions;
189 return result; 190 return result;
190 } 191 }
238 239
239 if(shape_mode != NULL) 240 if(shape_mode != NULL)
240 window->shaper->mode = *shape_mode; 241 window->shaper->mode = *shape_mode;
241 result = window->display->device->shape_driver.SetWindowShape(window->shaper,shape,shape_mode); 242 result = window->display->device->shape_driver.SetWindowShape(window->shaper,shape,shape_mode);
242 window->shaper->hasshape = SDL_TRUE; 243 window->shaper->hasshape = SDL_TRUE;
243 if(window->shaper->userx == 0 && window->shaper->usery == 0) { 244 if(window->shaper->userx != 0 && window->shaper->usery != 0) {
244 SDL_SetWindowPosition(window,window->shaper->userx,window->shaper->usery); 245 SDL_SetWindowPosition(window,window->shaper->userx,window->shaper->usery);
245 window->shaper->userx = 0; 246 window->shaper->userx = 0;
246 window->shaper->usery = 0; 247 window->shaper->usery = 0;
247 } 248 }
248 return result; 249 return result;