#include "gintdemo.h" #include #include #include #include #include /* test_bopti() Displays and moves many kinds of bitmaps. Here are the images used: Name Size Color Alpha --------------------------------------------------------- items.bmp 266 * 124 Gray - sprites.bmp 66 * 33 Gray - swords.bmp 88 * 16 Gray Full --------------------------------------------------------- zelda.bmp 86 * 280 Mono - isometric.bmp 37 * 27 Mono Full - - Mono Greater --------------------------------------------------------- */ static void getwh(image_t *img, int *width, int *height) { const uint8_t *data; if(!img) { *width = 0; *height = 0; return; } *width = img->width; *height = img->height; if(*width && *height) return; data = (uint8_t *)img->data; *width = (data[0] << 8) | data[1]; *height = (data[2] << 8) | data[3]; } static void getxy(image_t *img, int *x, int *y) { int width, height; getwh(img, &width, &height); *x = 64 - (width >> 1); *y = 28 - (height >> 1); } static image_t *select(image_t *current) { extern image_t res_bopti_thumbs; extern image_t res_items, res_sprites, res_swords, res_zelda, res_isometric; extern image_t res_screen; struct { image_t *img; const char *name; const char *info; } images[] = { { &res_items, "Items", "Gray" }, { &res_sprites, "Sprites", "Gray" }, { &res_swords, "Swords", "Gray Alpha" }, { &res_zelda, "Zelda", "Mono" }, { &res_isometric, "Isometric", "Mono Alpha" }, { &res_screen, "TLT", "Mono" }, { NULL, NULL, NULL } }; image_t *thumbs = &res_bopti_thumbs; int items = 0; static int row = 0; int leave = 1, i; while(images[items].img) items++; keyboard_setRepeatRate(625, 125); gray_start(); while(1) { gclear(); locate(1, 1, "Select an image:"); for(i = 0; i < items && i < 7; i++) { locate(2, 2 + i + (i > row), images[i].name); gimage_part(100, 8 + 8 * (i + (i > row)), thumbs, 0, 8 * i, 7, 7); if(i == row) { int width, height; getwh(images[i].img, &width, &height); print(2, 2 + i + 1, "%d\x04%d", width, height); locate(10, 2 + i + 1, images[i].info); } } grect(0, 8 * row + 8, 128, 8 * row + 23, color_invert); gupdate(); do { leave = 1; switch(getkey()) { case KEY_UP: row = (row + items - 1) % items; break; case KEY_DOWN: row = (row + 1) % items; break; case KEY_EXE: return images[row].img; case KEY_EXIT: return current; default: leave = 0; break; } } while(!leave); } gray_stop(); } void test_bopti(void) { extern image_t res_opt_bitmap; image_t *img = NULL; int leave = 1; int black_bg = 0; int x = 0, y = 0; while(1) { keyboard_setRepeatRate(25, 25); if(img && (img->format & channel_light)) { gray_start(); gclear(); if(black_bg) grect(0, 0, 127, 63, color_invert); if(img) gimage(x, y, img); grect(0, 55, 127, 63, color_white); gimage_part(0, 56, &res_opt_bitmap, 0, 0, 96, 8); } else if(img) { gray_stop(); dclear(); if(black_bg) drect(0, 0, 127, 63, color_invert); if(img) dimage(x, y, img); drect(0, 55, 127, 63, color_white); dimage_part(0, 56, &res_opt_bitmap, 0, 0, 96, 8); } else { gray_stop(); dclear(); locate(3, 3, "No image selected"); dimage_part(0, 56, &res_opt_bitmap, 0, 0, 96, 8); dupdate(); } if(img) { int width, height; getwh(img, &width, &height); if(x < 0) print(1, 4, "\x01"); if(x + width > 128) print(21, 4, "\x02"); if(img->format & channel_light) { if(y < 0) gimage_part(61, 0, &res_opt_bitmap, 122, 0, 6, 8); if(y + height > 64) gimage_part(61, 48, &res_opt_bitmap, 116, 0, 6, 8); gupdate(); } else { if(y < 0) dimage_part(61, 0, &res_opt_bitmap, 122, 0, 6, 8); if(y + height > 64) dimage_part(61, 48, &res_opt_bitmap, 116, 0, 6, 8); dupdate(); } } do { leave = 1; switch(getkey()) { case KEY_EXIT: keyboard_setRepeatRate(625, 125); gray_stop(); return; case KEY_F1: img = select(img); getxy(img, &x, &y); break; case KEY_F2: black_bg = !black_bg; break; case KEY_UP: y++; break; case KEY_DOWN: y--; break; case KEY_LEFT: x++; break; case KEY_RIGHT: x--; break; default: leave = 0; } } while(!leave); } keyboard_setRepeatRate(625, 125); gray_stop(); return; }