Mercurial > sdl-ios-xcode
comparison test/testcursor.c @ 1708:cd14138a8703 SDL-1.3
Merged fix for bug #240 from SDL 1.2
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 24 Jun 2006 17:31:46 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1707:57ce47f033a5 | 1708:cd14138a8703 |
---|---|
1 #include <stdio.h> | |
2 #include <stdlib.h> | |
3 | |
4 #include "SDL.h" | |
5 | |
6 /* This is an example 16x16 cursor | |
7 top left : black | |
8 top right : inverted color or black | |
9 bottom left: white | |
10 bottom right: transparent | |
11 (swap left and right for different endianness) | |
12 */ | |
13 | |
14 Uint16 cursor_data[16] = { | |
15 0xffff, | |
16 0xffff, | |
17 0xffff, | |
18 0xffff, | |
19 | |
20 0xffff, | |
21 0xffff, | |
22 0xffff, | |
23 0xffff, | |
24 | |
25 0x0000, | |
26 0x0000, | |
27 0x0000, | |
28 0x0000, | |
29 | |
30 0x0000, | |
31 0x0000, | |
32 0x0000, | |
33 0x0000 | |
34 }; | |
35 | |
36 Uint16 cursor_mask[16] = { | |
37 0xff00, | |
38 0xff00, | |
39 0xff00, | |
40 0xff00, | |
41 | |
42 0xff00, | |
43 0xff00, | |
44 0xff00, | |
45 0xff00, | |
46 | |
47 0xff00, | |
48 0xff00, | |
49 0xff00, | |
50 0xff00, | |
51 | |
52 0xff00, | |
53 0xff00, | |
54 0xff00, | |
55 0xff00 | |
56 }; | |
57 | |
58 /* another test cursor: smaller than 16x16, and with an odd height */ | |
59 | |
60 Uint8 small_cursor_data[11] = | |
61 { 0x00, 0x18, 0x08, 0x38, 0x44, 0x54, 0x44, 0x38, 0x20, 0x20, 0x00 }; | |
62 Uint8 small_cursor_mask[11] = | |
63 { 0x3C, 0x3C, 0x3C, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x78, 0x70, 0x70 }; | |
64 | |
65 /* XPM */ | |
66 static const char *arrow[] = { | |
67 /* width height num_colors chars_per_pixel */ | |
68 " 32 32 3 1", | |
69 /* colors */ | |
70 "X c #000000", | |
71 ". c #ffffff", | |
72 " c None", | |
73 /* pixels */ | |
74 "X ", | |
75 "XX ", | |
76 "X.X ", | |
77 "X..X ", | |
78 "X...X ", | |
79 "X....X ", | |
80 "X.....X ", | |
81 "X......X ", | |
82 "X.......X ", | |
83 "X........X ", | |
84 "X.....XXXXX ", | |
85 "X..X..X ", | |
86 "X.X X..X ", | |
87 "XX X..X ", | |
88 "X X..X ", | |
89 " X..X ", | |
90 " X..X ", | |
91 " X..X ", | |
92 " XX ", | |
93 " ", | |
94 " ", | |
95 " ", | |
96 " ", | |
97 " ", | |
98 " ", | |
99 " ", | |
100 " ", | |
101 " ", | |
102 " ", | |
103 " ", | |
104 " ", | |
105 " ", | |
106 "0,0" | |
107 }; | |
108 | |
109 static SDL_Cursor * | |
110 create_arrow_cursor() | |
111 { | |
112 int i, row, col; | |
113 Uint8 data[4 * 32]; | |
114 Uint8 mask[4 * 32]; | |
115 int hot_x, hot_y; | |
116 | |
117 i = -1; | |
118 for (row = 0; row < 32; ++row) { | |
119 for (col = 0; col < 32; ++col) { | |
120 if (col % 8) { | |
121 data[i] <<= 1; | |
122 mask[i] <<= 1; | |
123 } else { | |
124 ++i; | |
125 data[i] = mask[i] = 0; | |
126 } | |
127 switch (arrow[4 + row][col]) { | |
128 case 'X': | |
129 data[i] |= 0x01; | |
130 mask[i] |= 0x01; | |
131 break; | |
132 case '.': | |
133 mask[i] |= 0x01; | |
134 break; | |
135 case ' ': | |
136 break; | |
137 } | |
138 } | |
139 } | |
140 sscanf(arrow[4 + row], "%d,%d", &hot_x, &hot_y); | |
141 return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y); | |
142 } | |
143 | |
144 | |
145 int | |
146 main(int argc, char *argv[]) | |
147 { | |
148 SDL_Surface *screen; | |
149 SDL_bool quit = SDL_FALSE, first_time = SDL_TRUE; | |
150 SDL_Cursor *cursor[3]; | |
151 int current; | |
152 | |
153 /* Load the SDL library */ | |
154 if (SDL_Init(SDL_INIT_VIDEO) < 0) { | |
155 fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); | |
156 return (1); | |
157 } | |
158 | |
159 screen = SDL_SetVideoMode(320, 200, 8, SDL_ANYFORMAT); | |
160 if (screen == NULL) { | |
161 fprintf(stderr, "Couldn't initialize video mode: %s\n", | |
162 SDL_GetError()); | |
163 return (1); | |
164 } | |
165 | |
166 SDL_FillRect(screen, NULL, 0x664422); | |
167 | |
168 cursor[0] = SDL_CreateCursor((Uint8 *) cursor_data, (Uint8 *) cursor_mask, | |
169 16, 16, 8, 8); | |
170 if (cursor[0] == NULL) { | |
171 fprintf(stderr, "Couldn't initialize test cursor: %s\n", | |
172 SDL_GetError()); | |
173 SDL_Quit(); | |
174 return (1); | |
175 } | |
176 cursor[1] = create_arrow_cursor(); | |
177 if (cursor[1] == NULL) { | |
178 fprintf(stderr, "Couldn't initialize arrow cursor: %s\n", | |
179 SDL_GetError()); | |
180 SDL_FreeCursor(cursor[0]); | |
181 SDL_Quit(); | |
182 return (1); | |
183 } | |
184 cursor[2] = SDL_CreateCursor(small_cursor_data, small_cursor_mask, | |
185 8, 11, 3, 5); | |
186 if (cursor[2] == NULL) { | |
187 fprintf(stderr, "Couldn't initialize test cursor: %s\n", | |
188 SDL_GetError()); | |
189 SDL_Quit(); | |
190 return (1); | |
191 } | |
192 | |
193 current = 0; | |
194 SDL_SetCursor(cursor[current]); | |
195 | |
196 while (!quit) { | |
197 SDL_Event event; | |
198 while (SDL_PollEvent(&event)) { | |
199 switch (event.type) { | |
200 case SDL_MOUSEBUTTONDOWN: | |
201 current = (current + 1) % 3; | |
202 SDL_SetCursor(cursor[current]); | |
203 break; | |
204 case SDL_KEYDOWN: | |
205 if (event.key.keysym.sym == SDLK_ESCAPE) { | |
206 quit = SDL_TRUE; | |
207 } | |
208 break; | |
209 case SDL_QUIT: | |
210 quit = SDL_TRUE; | |
211 break; | |
212 } | |
213 } | |
214 SDL_Flip(screen); | |
215 SDL_Delay(1); | |
216 } | |
217 | |
218 SDL_FreeCursor(cursor[0]); | |
219 SDL_FreeCursor(cursor[1]); | |
220 | |
221 SDL_Quit(); | |
222 return (0); | |
223 } |