Skip to content

Latest commit

 

History

History
259 lines (233 loc) · 6.62 KB

testcustomcursor.c

File metadata and controls

259 lines (233 loc) · 6.62 KB
 
Jan 5, 2019
Jan 5, 2019
2
Copyright (C) 1997-2019 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
35
36
37
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
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 <stdio.h>
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#endif
#include "SDL_test_common.h"
/* Stolen from the mailing list */
/* Creates a new mouse cursor from an XPM */
/* XPM */
static const char *arrow[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
"X ",
"XX ",
"X.X ",
"X..X ",
"X...X ",
"X....X ",
"X.....X ",
"X......X ",
"X.......X ",
"X........X ",
"X.....XXXXX ",
"X..X..X ",
"X.X X..X ",
"XX X..X ",
"X X..X ",
" X..X ",
" X..X ",
" X..X ",
" XX ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"0,0"
};
Oct 4, 2016
Oct 4, 2016
70
71
72
73
74
75
static SDL_Cursor*
init_color_cursor(const char *file)
{
SDL_Cursor *cursor = NULL;
SDL_Surface *surface = SDL_LoadBMP(file);
if (surface) {
Mar 16, 2018
Mar 16, 2018
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
if (surface->format->palette) {
SDL_SetColorKey(surface, 1, *(Uint8 *) surface->pixels);
} else {
switch (surface->format->BitsPerPixel) {
case 15:
SDL_SetColorKey(surface, 1, (*(Uint16 *)surface->pixels) & 0x00007FFF);
break;
case 16:
SDL_SetColorKey(surface, 1, *(Uint16 *)surface->pixels);
break;
case 24:
SDL_SetColorKey(surface, 1, (*(Uint32 *)surface->pixels) & 0x00FFFFFF);
break;
case 32:
SDL_SetColorKey(surface, 1, *(Uint32 *)surface->pixels);
break;
}
}
Oct 4, 2016
Oct 4, 2016
94
95
96
97
98
99
cursor = SDL_CreateColorCursor(surface, 0, 0);
SDL_FreeSurface(surface);
}
return cursor;
}
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
static SDL_Cursor*
init_system_cursor(const char *image[])
{
int i, row, col;
Uint8 data[4*32];
Uint8 mask[4*32];
int hot_x, hot_y;
i = -1;
for (row=0; row<32; ++row) {
for (col=0; col<32; ++col) {
if (col % 8) {
data[i] <<= 1;
mask[i] <<= 1;
} else {
++i;
data[i] = mask[i] = 0;
}
switch (image[4+row][col]) {
case 'X':
data[i] |= 0x01;
mask[i] |= 0x01;
break;
case '.':
mask[i] |= 0x01;
break;
case ' ':
break;
}
}
}
sscanf(image[4+row], "%d,%d", &hot_x, &hot_y);
return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
}
static SDLTest_CommonState *state;
int done;
Mar 16, 2018
Mar 16, 2018
137
138
139
static SDL_Cursor *cursors[1+SDL_NUM_SYSTEM_CURSORS];
static int current_cursor;
static int show_cursor;
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void
quit(int rc)
{
SDLTest_CommonQuit(state);
exit(rc);
}
void
loop()
{
int i;
SDL_Event event;
/* Check for events */
while (SDL_PollEvent(&event)) {
SDLTest_CommonEvent(state, &event, &done);
Mar 16, 2018
Mar 16, 2018
157
158
159
160
161
162
163
164
165
166
167
168
if (event.type == SDL_MOUSEBUTTONDOWN) {
if (event.button.button == SDL_BUTTON_LEFT) {
++current_cursor;
if (current_cursor == SDL_arraysize(cursors)) {
current_cursor = 0;
}
SDL_SetCursor(cursors[current_cursor]);
} else {
show_cursor = !show_cursor;
SDL_ShowCursor(show_cursor);
}
}
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
}
for (i = 0; i < state->num_windows; ++i) {
SDL_Renderer *renderer = state->renderers[i];
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
}
#ifdef __EMSCRIPTEN__
if (done) {
emscripten_cancel_main_loop();
}
#endif
}
int
main(int argc, char *argv[])
{
int i;
Oct 4, 2016
Oct 4, 2016
187
const char *color_cursor = NULL;
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/* Enable standard application logging */
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
/* Initialize test framework */
state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
if (!state) {
return 1;
}
for (i = 1; i < argc;) {
int consumed;
consumed = SDLTest_CommonArg(state, i);
if (consumed == 0) {
Oct 4, 2016
Oct 4, 2016
202
203
color_cursor = argv[i];
break;
204
205
}
if (consumed < 0) {
May 28, 2019
May 28, 2019
206
SDLTest_CommonLogUsage(state, argv[0], NULL);
207
208
209
210
211
212
213
214
215
quit(1);
}
i += consumed;
}
if (!SDLTest_CommonInit(state)) {
quit(2);
}
Jul 13, 2016
Jul 13, 2016
216
217
218
219
220
for (i = 0; i < state->num_windows; ++i) {
SDL_Renderer *renderer = state->renderers[i];
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
}
Oct 4, 2016
Oct 4, 2016
222
if (color_cursor) {
Mar 16, 2018
Mar 16, 2018
223
cursors[0] = init_color_cursor(color_cursor);
Oct 4, 2016
Oct 4, 2016
224
} else {
Mar 16, 2018
Mar 16, 2018
225
cursors[0] = init_system_cursor(arrow);
Oct 4, 2016
Oct 4, 2016
226
}
Mar 16, 2018
Mar 16, 2018
227
if (!cursors[0]) {
Oct 4, 2016
Oct 4, 2016
228
229
230
SDL_Log("Error, couldn't create cursor\n");
quit(2);
}
Mar 16, 2018
Mar 16, 2018
231
232
233
234
235
236
237
238
for (i = 0; i < SDL_NUM_SYSTEM_CURSORS; ++i) {
cursors[1+i] = SDL_CreateSystemCursor((SDL_SystemCursor)i);
if (!cursors[1+i]) {
SDL_Log("Error, couldn't create system cursor %d\n", i);
quit(2);
}
}
SDL_SetCursor(cursors[0]);
239
240
241
242
243
244
245
246
247
248
249
/* Main render loop */
done = 0;
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(loop, 0, 1);
#else
while (!done) {
loop();
}
#endif
Mar 16, 2018
Mar 16, 2018
250
251
252
for (i = 0; i < SDL_arraysize(cursors); ++i) {
SDL_FreeCursor(cursors[i]);
}
253
254
255
256
257
quit(0);
/* keep the compiler happy ... */
return(0);
}
Mar 16, 2018
Mar 16, 2018
258
259
/* vi: set ts=4 sw=4 expandtab: */