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

Latest commit

 

History

History
204 lines (183 loc) · 6.52 KB

testshape.c

File metadata and controls

204 lines (183 loc) · 6.52 KB
 
Jul 25, 2013
Jul 25, 2013
2
Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely.
*/
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include "SDL.h"
#include "SDL_shape.h"
#define SHAPED_WINDOW_X 150
#define SHAPED_WINDOW_Y 150
#define SHAPED_WINDOW_DIMENSION 640
#define TICK_INTERVAL 1000/10
typedef struct LoadedPicture {
SDL_Surface *surface;
SDL_Texture *texture;
SDL_WindowShapeMode mode;
} LoadedPicture;
void render(SDL_Renderer *renderer,SDL_Texture *texture,SDL_Rect texture_dimensions)
{
//Clear render-target to blue.
SDL_SetRenderDrawColor(renderer,0x00,0x00,0xff,0xff);
SDL_RenderClear(renderer);
May 18, 2013
May 18, 2013
35
36
37
//Render the texture.
SDL_RenderCopy(renderer,texture,&texture_dimensions,&texture_dimensions);
May 18, 2013
May 18, 2013
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
SDL_RenderPresent(renderer);
}
static Uint32 next_time;
Uint32 time_left()
{
Uint32 now = SDL_GetTicks();
if(next_time <= now)
return 0;
else
return next_time - now;
}
int main(int argc,char** argv)
{
Uint8 num_pictures;
LoadedPicture* pictures;
int i, j;
SDL_PixelFormat* format = NULL;
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Color black = {0,0,0,0xff};
SDL_Event event;
int event_pending = 0;
int should_exit = 0;
unsigned int current_picture;
int button_down;
Uint32 pixelFormat = 0;
int access = 0;
SDL_Rect texture_dimensions;;
if(argc < 2) {
printf("SDL_Shape requires at least one bitmap file as argument.\n");
exit(-1);
}
May 18, 2013
May 18, 2013
75
76
77
78
79
if(SDL_VideoInit(NULL) == -1) {
printf("Could not initialize SDL video.\n");
exit(-2);
}
May 18, 2013
May 18, 2013
80
81
num_pictures = argc - 1;
Jul 20, 2013
Jul 20, 2013
82
pictures = (LoadedPicture *)SDL_malloc(sizeof(LoadedPicture)*num_pictures);
83
84
85
86
87
88
89
90
91
for(i=0;i<num_pictures;i++)
pictures[i].surface = NULL;
for(i=0;i<num_pictures;i++) {
pictures[i].surface = SDL_LoadBMP(argv[i+1]);
if(pictures[i].surface == NULL) {
j = 0;
for(j=0;j<num_pictures;j++)
if(pictures[j].surface != NULL)
SDL_FreeSurface(pictures[j].surface);
Jul 20, 2013
Jul 20, 2013
92
SDL_free(pictures);
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
SDL_VideoQuit();
printf("Could not load surface from named bitmap file.\n");
exit(-3);
}
format = pictures[i].surface->format;
if(format->Amask != 0) {
pictures[i].mode.mode = ShapeModeBinarizeAlpha;
pictures[i].mode.parameters.binarizationCutoff = 255;
}
else {
pictures[i].mode.mode = ShapeModeColorKey;
pictures[i].mode.parameters.colorKey = black;
}
}
May 18, 2013
May 18, 2013
108
Jul 20, 2013
Jul 20, 2013
109
window = SDL_CreateShapedWindow("SDL_Shape test",SHAPED_WINDOW_X,SHAPED_WINDOW_Y,SHAPED_WINDOW_DIMENSION,SHAPED_WINDOW_DIMENSION,SDL_WINDOW_RESIZABLE);
110
111
112
if(window == NULL) {
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
Jul 20, 2013
Jul 20, 2013
113
SDL_free(pictures);
114
115
116
117
118
119
120
121
122
SDL_VideoQuit();
printf("Could not create shaped window for SDL_Shape.\n");
exit(-4);
}
renderer = SDL_CreateRenderer(window,-1,0);
if (!renderer) {
SDL_DestroyWindow(window);
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
Jul 20, 2013
Jul 20, 2013
123
SDL_free(pictures);
124
125
126
127
SDL_VideoQuit();
printf("Could not create rendering context for SDL_Shape window.\n");
exit(-5);
}
May 18, 2013
May 18, 2013
128
129
130
131
132
133
134
135
136
137
138
139
for(i=0;i<num_pictures;i++)
pictures[i].texture = NULL;
for(i=0;i<num_pictures;i++) {
pictures[i].texture = SDL_CreateTextureFromSurface(renderer,pictures[i].surface);
if(pictures[i].texture == NULL) {
j = 0;
for(j=0;j<num_pictures;i++)
if(pictures[i].texture != NULL)
SDL_DestroyTexture(pictures[i].texture);
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
Jul 20, 2013
Jul 20, 2013
140
SDL_free(pictures);
141
142
143
144
145
146
147
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_VideoQuit();
printf("Could not create texture for SDL_shape.\n");
exit(-6);
}
}
May 18, 2013
May 18, 2013
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
event_pending = 0;
should_exit = 0;
event_pending = SDL_PollEvent(&event);
current_picture = 0;
button_down = 0;
texture_dimensions.h = 0;
texture_dimensions.w = 0;
texture_dimensions.x = 0;
texture_dimensions.y = 0;
SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h);
SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h);
SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode);
next_time = SDL_GetTicks() + TICK_INTERVAL;
while(should_exit == 0) {
event_pending = SDL_PollEvent(&event);
if(event_pending == 1) {
if(event.type == SDL_KEYDOWN) {
button_down = 1;
if(event.key.keysym.sym == SDLK_ESCAPE)
should_exit = 1;
}
if(button_down && event.type == SDL_KEYUP) {
button_down = 0;
current_picture += 1;
if(current_picture >= num_pictures)
current_picture = 0;
SDL_QueryTexture(pictures[current_picture].texture,(Uint32 *)&pixelFormat,(int *)&access,&texture_dimensions.w,&texture_dimensions.h);
SDL_SetWindowSize(window,texture_dimensions.w,texture_dimensions.h);
SDL_SetWindowShape(window,pictures[current_picture].surface,&pictures[current_picture].mode);
}
if(event.type == SDL_QUIT)
should_exit = 1;
event_pending = 0;
}
render(renderer,pictures[current_picture].texture,texture_dimensions);
SDL_Delay(time_left());
next_time += TICK_INTERVAL;
}
May 18, 2013
May 18, 2013
187
188
189
190
191
192
193
194
195
196
//Free the textures.
for(i=0;i<num_pictures;i++)
SDL_DestroyTexture(pictures[i].texture);
SDL_DestroyRenderer(renderer);
//Destroy the window.
SDL_DestroyWindow(window);
//Free the original surfaces backing the textures.
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
Jul 20, 2013
Jul 20, 2013
197
SDL_free(pictures);
198
199
200
201
202
203
204
//Call SDL_VideoQuit() before quitting.
SDL_VideoQuit();
return 0;
}
/* vi: set ts=4 sw=4 expandtab: */