Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
103 lines (86 loc) · 3.65 KB

SDL_windowsshape.c

File metadata and controls

103 lines (86 loc) · 3.65 KB
 
Apr 8, 2011
Apr 8, 2011
2
3
Simple DirectMedia Layer
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
Apr 8, 2011
Apr 8, 2011
5
6
7
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Apr 8, 2011
Apr 8, 2011
9
10
11
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
Apr 8, 2011
Apr 8, 2011
13
14
15
16
17
18
19
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Aug 14, 2010
Aug 14, 2010
22
#include <stdio.h>
Aug 15, 2010
Aug 15, 2010
23
#include "SDL_assert.h"
Jan 21, 2011
Jan 21, 2011
24
25
#include "SDL_windowsshape.h"
#include "SDL_windowsvideo.h"
Jun 5, 2010
Jun 5, 2010
26
Aug 9, 2010
Aug 9, 2010
27
28
29
30
31
32
33
SDL_WindowShaper*
Win32_CreateShaper(SDL_Window * window) {
int resized_properly;
SDL_WindowShaper* result = (SDL_WindowShaper *)SDL_malloc(sizeof(SDL_WindowShaper));
result->window = window;
result->mode.mode = ShapeModeDefault;
result->mode.parameters.binarizationCutoff = 1;
Aug 15, 2010
Aug 15, 2010
34
result->userx = result->usery = 0;
Aug 9, 2010
Aug 9, 2010
35
36
37
38
39
40
41
result->driverdata = (SDL_ShapeData*)SDL_malloc(sizeof(SDL_ShapeData));
((SDL_ShapeData*)result->driverdata)->mask_tree = NULL;
//Put some driver-data here.
window->shaper = result;
resized_properly = Win32_ResizeWindowShape(window);
if (resized_properly != 0)
return NULL;
Aug 16, 2010
Aug 16, 2010
42
Aug 9, 2010
Aug 9, 2010
43
return result;
Jul 7, 2010
Jul 7, 2010
44
45
}
Aug 9, 2010
Aug 9, 2010
46
void
Aug 10, 2010
Aug 10, 2010
47
CombineRectRegions(SDL_ShapeTree* node,void* closure) {
Aug 15, 2010
Aug 15, 2010
48
HRGN mask_region = *((HRGN*)closure),temp_region = NULL;
Aug 9, 2010
Aug 9, 2010
49
if(node->kind == OpaqueShape) {
Aug 15, 2010
Aug 15, 2010
50
//Win32 API regions exclude their outline, so we widen the region by one pixel in each direction to include the real outline.
Aug 16, 2010
Aug 16, 2010
51
temp_region = CreateRectRgn(node->data.shape.x,node->data.shape.y,node->data.shape.x + node->data.shape.w + 1,node->data.shape.y + node->data.shape.h + 1);
Aug 15, 2010
Aug 15, 2010
52
53
54
55
56
57
58
if(mask_region != NULL) {
CombineRgn(mask_region,mask_region,temp_region,RGN_OR);
DeleteObject(temp_region);
}
else
*((HRGN*)closure) = temp_region;
}
Aug 10, 2010
Aug 10, 2010
59
60
}
Aug 9, 2010
Aug 9, 2010
61
int
Aug 14, 2010
Aug 14, 2010
62
Win32_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) {
Aug 9, 2010
Aug 9, 2010
63
SDL_ShapeData *data;
Aug 15, 2010
Aug 15, 2010
64
HRGN mask_region = NULL;
Jul 30, 2010
Jul 30, 2010
65
Aug 9, 2010
Aug 9, 2010
66
67
if (shaper == NULL || shape == NULL)
return SDL_INVALID_SHAPE_ARGUMENT;
Aug 14, 2010
Aug 14, 2010
68
if(shape->format->Amask == 0 && shape_mode->mode != ShapeModeColorKey || shape->w != shaper->window->w || shape->h != shaper->window->h)
Aug 9, 2010
Aug 9, 2010
69
70
71
72
73
return SDL_INVALID_SHAPE_ARGUMENT;
data = (SDL_ShapeData*)shaper->driverdata;
if(data->mask_tree != NULL)
SDL_FreeShapeTree(&data->mask_tree);
Aug 14, 2010
Aug 14, 2010
74
data->mask_tree = SDL_CalculateShapeTree(*shape_mode,shape);
Aug 9, 2010
Aug 9, 2010
75
Aug 15, 2010
Aug 15, 2010
76
77
SDL_TraverseShapeTree(data->mask_tree,&CombineRectRegions,&mask_region);
SDL_assert(mask_region != NULL);
Aug 10, 2010
Aug 10, 2010
78
79
SetWindowRgn(((SDL_WindowData *)(shaper->window->driverdata))->hwnd, mask_region, TRUE);
Aug 9, 2010
Aug 9, 2010
80
81
return 0;
Jul 7, 2010
Jul 7, 2010
82
83
}
Aug 9, 2010
Aug 9, 2010
84
85
86
int
Win32_ResizeWindowShape(SDL_Window *window) {
SDL_ShapeData* data;
Jul 30, 2010
Jul 30, 2010
87
Aug 9, 2010
Aug 9, 2010
88
89
90
91
92
93
94
95
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);
Aug 16, 2010
Aug 16, 2010
96
97
98
99
100
if(window->shaper->hasshape == SDL_TRUE) {
window->shaper->userx = window->x;
window->shaper->usery = window->y;
SDL_SetWindowPosition(window,-1000,-1000);
}
Aug 9, 2010
Aug 9, 2010
101
102
return 0;
Jul 7, 2010
Jul 7, 2010
103
}