test/testcursor.c
author Sam Lantinga <slouken@libsdl.org>
Tue, 20 Jun 2006 04:04:25 +0000
changeset 1862 fe99535ac064
parent 1859 2fce7697adca
child 1883 2780f547f5e7
permissions -rw-r--r--
Test case for bug #240
     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 
    59 /* XPM */
    60 static const char *arrow[] = {
    61   /* width height num_colors chars_per_pixel */
    62   "    32    32        3            1",
    63   /* colors */
    64   "X c #000000",
    65   ". c #ffffff",
    66   "  c None",
    67   /* pixels */
    68   "X                               ",
    69   "XX                              ",
    70   "X.X                             ",
    71   "X..X                            ",
    72   "X...X                           ",
    73   "X....X                          ",
    74   "X.....X                         ",
    75   "X......X                        ",
    76   "X.......X                       ",
    77   "X........X                      ",
    78   "X.....XXXXX                     ",
    79   "X..X..X                         ",
    80   "X.X X..X                        ",
    81   "XX  X..X                        ",
    82   "X    X..X                       ",
    83   "     X..X                       ",
    84   "      X..X                      ",
    85   "      X..X                      ",
    86   "       XX                       ",
    87   "                                ",
    88   "                                ",
    89   "                                ",
    90   "                                ",
    91   "                                ",
    92   "                                ",
    93   "                                ",
    94   "                                ",
    95   "                                ",
    96   "                                ",
    97   "                                ",
    98   "                                ",
    99   "                                ",
   100   "0,0"
   101 };
   102 
   103 static SDL_Cursor *create_arrow_cursor()
   104 {
   105   int i, row, col;
   106   Uint8 data[4*32];
   107   Uint8 mask[4*32];
   108   int hot_x, hot_y;
   109 
   110   i = -1;
   111   for ( row=0; row<32; ++row ) {
   112     for ( col=0; col<32; ++col ) {
   113       if ( col % 8 ) {
   114         data[i] <<= 1;
   115         mask[i] <<= 1;
   116       } else {
   117         ++i;
   118         data[i] = mask[i] = 0;
   119       }
   120       switch (arrow[4+row][col]) {
   121         case 'X':
   122           data[i] |= 0x01;
   123           mask[i] |= 0x01;
   124           break;
   125         case '.':
   126           mask[i] |= 0x01;
   127           break;
   128         case ' ':
   129           break;
   130       }
   131     }
   132   }
   133   sscanf(arrow[4+row], "%d,%d", &hot_x, &hot_y);
   134   return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
   135 }
   136 
   137 
   138 int main(int argc, char *argv[])
   139 {
   140 	SDL_Surface *screen;
   141 	SDL_bool quit = SDL_FALSE, first_time = SDL_TRUE;
   142 	SDL_Cursor *cursor[2];
   143 	int current;
   144 
   145 	/* Load the SDL library */
   146 	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
   147 		fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
   148 		return(1);
   149 	}
   150 
   151 	screen = SDL_SetVideoMode(320,200,8,SDL_ANYFORMAT);
   152 	if (screen==NULL) {
   153 		fprintf(stderr, "Couldn't initialize video mode: %s\n",SDL_GetError());
   154 		return(1);
   155 	}
   156 
   157 	SDL_FillRect(screen, NULL, 0x664422);
   158 
   159 	cursor[0] = SDL_CreateCursor((Uint8 *)cursor_data, (Uint8 *)cursor_mask,
   160 		16, 16, 8, 8);
   161 	if (cursor[0]==NULL) {
   162 		fprintf(stderr, "Couldn't initialize test cursor: %s\n",SDL_GetError());
   163 		SDL_Quit();
   164 		return(1);
   165 	}
   166 	cursor[1] = create_arrow_cursor();
   167 	if (cursor[1]==NULL) {
   168 		fprintf(stderr, "Couldn't initialize arrow cursor: %s\n",SDL_GetError());
   169 		SDL_FreeCursor(cursor[0]);
   170 		SDL_Quit();
   171 		return(1);
   172 	}
   173 
   174 	current = 0;
   175 	SDL_SetCursor(cursor[current]);
   176 
   177 	while (!quit) {
   178 		SDL_Event	event;
   179 		while (SDL_PollEvent(&event)) {
   180 			switch(event.type) {
   181 				case SDL_MOUSEBUTTONDOWN:
   182 					current = !current;
   183 					SDL_SetCursor(cursor[current]);
   184 					break;
   185 				case SDL_KEYDOWN:
   186 					if (event.key.keysym.sym == SDLK_ESCAPE) {
   187 						quit = SDL_TRUE;
   188 					}
   189 					break;
   190 				case SDL_QUIT:
   191 					quit = SDL_TRUE;
   192 					break;
   193 			}
   194 		}	
   195 		SDL_Flip(screen);
   196 		SDL_Delay(1);
   197 	}
   198 
   199 	SDL_FreeCursor(cursor[0]);
   200 	SDL_FreeCursor(cursor[1]);
   201 
   202 	SDL_Quit();
   203 	return(0);
   204 }