#include <stdio.h>
#include <stdlib.h>

#include "SDL.h"

/* This is an example 16x16 cursor
	top left :	black
	top right : inverted color or black
	bottom left: white
	bottom right: transparent
	(swap left and right for different endianness)
*/

Uint16 cursor_data[16] = {
    0xffff,
    0xffff,
    0xffff,
    0xffff,

    0xffff,
    0xffff,
    0xffff,
    0xffff,

    0x0000,
    0x0000,
    0x0000,
    0x0000,

    0x0000,
    0x0000,
    0x0000,
    0x0000
};

Uint16 cursor_mask[16] = {
    0xff00,
    0xff00,
    0xff00,
    0xff00,

    0xff00,
    0xff00,
    0xff00,
    0xff00,

    0xff00,
    0xff00,
    0xff00,
    0xff00,

    0xff00,
    0xff00,
    0xff00,
    0xff00
};

/* another test cursor: smaller than 16x16, and with an odd height */

Uint8 small_cursor_data[11] =
    { 0x00, 0x18, 0x08, 0x38, 0x44, 0x54, 0x44, 0x38, 0x20, 0x20, 0x00 };
Uint8 small_cursor_mask[11] =
    { 0x3C, 0x3C, 0x3C, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x78, 0x70, 0x70 };

/* 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"
};

static SDL_Cursor *
create_arrow_cursor()
{
    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 (arrow[4 + row][col]) {
            case 'X':
                data[i] |= 0x01;
                mask[i] |= 0x01;
                break;
            case '.':
                mask[i] |= 0x01;
                break;
            case ' ':
                break;
            }
        }
    }
    sscanf(arrow[4 + row], "%d,%d", &hot_x, &hot_y);
    return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
}


int
main(int argc, char *argv[])
{
    SDL_Surface *screen;
    SDL_bool quit = SDL_FALSE, first_time = SDL_TRUE;
    SDL_Cursor *cursor[3];
    int current;

    /* Load the SDL library */
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
        return (1);
    }

    screen = SDL_SetVideoMode(320, 200, 8, SDL_ANYFORMAT);
    if (screen == NULL) {
        fprintf(stderr, "Couldn't initialize video mode: %s\n",
                SDL_GetError());
        return (1);
    }

    SDL_FillRect(screen, NULL, 0x664422);

    cursor[0] = SDL_CreateCursor((Uint8 *) cursor_data, (Uint8 *) cursor_mask,
                                 16, 16, 8, 8);
    if (cursor[0] == NULL) {
        fprintf(stderr, "Couldn't initialize test cursor: %s\n",
                SDL_GetError());
        SDL_Quit();
        return (1);
    }
    cursor[1] = create_arrow_cursor();
    if (cursor[1] == NULL) {
        fprintf(stderr, "Couldn't initialize arrow cursor: %s\n",
                SDL_GetError());
        SDL_FreeCursor(cursor[0]);
        SDL_Quit();
        return (1);
    }
    cursor[2] = SDL_CreateCursor(small_cursor_data, small_cursor_mask,
                                 8, 11, 3, 5);
    if (cursor[2] == NULL) {
        fprintf(stderr, "Couldn't initialize test cursor: %s\n",
                SDL_GetError());
        SDL_Quit();
        return (1);
    }

    current = 0;
    SDL_SetCursor(cursor[current]);

    while (!quit) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            switch (event.type) {
            case SDL_MOUSEBUTTONDOWN:
                current = (current + 1) % 3;
                SDL_SetCursor(cursor[current]);
                break;
            case SDL_KEYDOWN:
                if (event.key.keysym.sym == SDLK_ESCAPE) {
                    quit = SDL_TRUE;
                }
                break;
            case SDL_QUIT:
                quit = SDL_TRUE;
                break;
            }
        }
        SDL_Flip(screen);
        SDL_Delay(1);
    }

    SDL_FreeCursor(cursor[0]);
    SDL_FreeCursor(cursor[1]);

    SDL_Quit();
    return (0);
}
