void SDL_FreeShapeTree(SDL_ShapeTree** shape_tree) { if((*shape_tree)->kind == QuadShape) { SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upleft); SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upright); SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downleft); SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downright); } SDL_free(*shape_tree); *shape_tree = NULL; }
int Win32_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) { SDL_ShapeData *data; HRGN mask_region = NULL; if( (shaper == NULL) || (shape == NULL) || ((shape->format->Amask == 0) && (shape_mode->mode != ShapeModeColorKey)) || (shape->w != shaper->window->w) || (shape->h != shaper->window->h) ) { return SDL_INVALID_SHAPE_ARGUMENT; } data = (SDL_ShapeData*)shaper->driverdata; if(data->mask_tree != NULL) SDL_FreeShapeTree(&data->mask_tree); data->mask_tree = SDL_CalculateShapeTree(*shape_mode,shape); SDL_TraverseShapeTree(data->mask_tree,&CombineRectRegions,&mask_region); SDL_assert(mask_region != NULL); SetWindowRgn(((SDL_WindowData *)(shaper->window->driverdata))->hwnd, mask_region, TRUE); return 0; }
int Win32_ResizeWindowShape(SDL_Window *window) { SDL_ShapeData* data; if (window == NULL) return -1; data = (SDL_ShapeData *)window->shaper->driverdata; if (data == NULL) return -1; if(data->mask_tree != NULL) SDL_FreeShapeTree(&data->mask_tree); if(window->shaper->hasshape == SDL_TRUE) { window->shaper->userx = window->x; window->shaper->usery = window->y; SDL_SetWindowPosition(window,-1000,-1000); } return 0; }