mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 05:32:47 +00:00
Improved touchscreen playground
This commit is contained in:
parent
dc9dc794b0
commit
1403dc8ef9
@ -25,35 +25,13 @@ static const TouchBox paint9_boxes[] = {
|
||||
{ 7, 10 + ((PAINT9_BRUSH_SIZE+3)*5), PAINT9_BRUSH_SIZE, PAINT9_BRUSH_SIZE, P9BOX_BRUSH_N+5 }
|
||||
};
|
||||
|
||||
static const u8 color_picker_tmp[PAINT9_COLSEL_HEIGHT * BYTES_PER_PIXEL] = {
|
||||
0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x01, 0xF8, 0x02, 0xF8, 0x02, 0xF8, 0x03, 0xF8,
|
||||
0x04, 0xF8, 0x05, 0xF8, 0x06, 0xF8, 0x07, 0xF8, 0x08, 0xF8, 0x09, 0xF8, 0x0A, 0xF8, 0x0C, 0xF8,
|
||||
0x0D, 0xF8, 0x0E, 0xF8, 0x10, 0xF8, 0x11, 0xF8, 0x12, 0xF8, 0x14, 0xF8, 0x16, 0xF8, 0x17, 0xF8,
|
||||
0x17, 0xF8, 0x19, 0xF8, 0x1A, 0xF8, 0x1B, 0xF8, 0x1C, 0xF8, 0x1D, 0xF8, 0x1E, 0xF8, 0x1E, 0xF8,
|
||||
0x1E, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
|
||||
0x1F, 0xF8, 0x1F, 0xF0, 0x1F, 0xF0, 0x1F, 0xE8, 0x1F, 0xE0, 0x1F, 0xE0, 0x1F, 0xD8, 0x1F, 0xC8,
|
||||
0x1F, 0xC0, 0x1F, 0xB8, 0x1F, 0xB0, 0x1F, 0xA8, 0x1F, 0x98, 0x1F, 0x90, 0x1F, 0x88, 0x1F, 0x78,
|
||||
0x1F, 0x70, 0x1F, 0x60, 0x1F, 0x58, 0x1F, 0x48, 0x1F, 0x48, 0x1F, 0x40, 0x1F, 0x30, 0x1F, 0x28,
|
||||
0x1F, 0x20, 0x1F, 0x18, 0x1F, 0x10, 0x1F, 0x10, 0x1F, 0x08, 0x1F, 0x08, 0x1F, 0x00, 0x1F, 0x00,
|
||||
0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x5F, 0x00, 0x7F, 0x00, 0x9F, 0x00,
|
||||
0xBF, 0x00, 0xFF, 0x00, 0x3F, 0x01, 0x7F, 0x01, 0xBF, 0x01, 0x1F, 0x02, 0x5F, 0x02, 0x9F, 0x02,
|
||||
0xFF, 0x02, 0x5F, 0x03, 0x9F, 0x03, 0xFF, 0x03, 0x5F, 0x04, 0xBF, 0x04, 0xFF, 0x04, 0x5F, 0x05,
|
||||
0x9F, 0x05, 0xFF, 0x05, 0x3F, 0x06, 0x7F, 0x06, 0xDF, 0x06, 0x1F, 0x07, 0x3F, 0x07, 0x7F, 0x07,
|
||||
0x9F, 0x07, 0xBF, 0x07, 0xDF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07,
|
||||
0xFF, 0x07, 0xFF, 0x07, 0xFE, 0x07, 0xFE, 0x07, 0xFE, 0x07, 0xFD, 0x07, 0xFC, 0x07, 0xFA, 0x07,
|
||||
0xF9, 0x07, 0xF9, 0x07, 0xF8, 0x07, 0xF6, 0x07, 0xF5, 0x07, 0xF4, 0x07, 0xF2, 0x07, 0xF1, 0x07,
|
||||
0xF0, 0x07, 0xEE, 0x07, 0xED, 0x07, 0xEC, 0x07, 0xEA, 0x07, 0xE9, 0x07, 0xE8, 0x07, 0xE7, 0x07,
|
||||
0xE5, 0x07, 0xE4, 0x07, 0xE4, 0x07, 0xE3, 0x07, 0xE2, 0x07, 0xE2, 0x07, 0xE1, 0x07, 0xE0, 0x07,
|
||||
0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xE0, 0x0F,
|
||||
0xE0, 0x17, 0xE0, 0x17, 0xE0, 0x1F, 0xE0, 0x27, 0xE0, 0x37, 0xE0, 0x37, 0xE0, 0x3F, 0xE0, 0x4F,
|
||||
0xE0, 0x57, 0xE0, 0x5F, 0xE0, 0x67, 0xE0, 0x77, 0xE0, 0x7F, 0xE0, 0x8F, 0xE0, 0x97, 0xE0, 0xA7,
|
||||
0xE0, 0xAF, 0xE0, 0xB7, 0xE0, 0xBF, 0xE0, 0xC7, 0xE0, 0xCF, 0xE0, 0xDF, 0xE0, 0xDF, 0xE0, 0xE7,
|
||||
0xE0, 0xF7, 0xE0, 0xF7, 0xE0, 0xF7, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF,
|
||||
0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0xA0, 0xFF, 0x80, 0xFF, 0x60, 0xFF, 0x40, 0xFF, 0x00, 0xFF,
|
||||
0xC0, 0xFE, 0x80, 0xFE, 0x20, 0xFE, 0xE0, 0xFD, 0xA0, 0xFD, 0x40, 0xFD, 0xE0, 0xFC, 0xA0, 0xFC,
|
||||
0x40, 0xFC, 0xE0, 0xFB, 0x80, 0xFB, 0x40, 0xFB, 0x00, 0xFB, 0xA0, 0xFA, 0x60, 0xFA, 0x00, 0xFA,
|
||||
0xC0, 0xF9, 0x60, 0xF9, 0x20, 0xF9, 0xE0, 0xF8, 0xA0, 0xF8, 0x80, 0xF8, 0x60, 0xF8, 0x40, 0xF8,
|
||||
0x20, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8
|
||||
static const u16 color_picker_tmp[] = { // count must be a divisor of PAINT9_COLSEL_HEIGHT
|
||||
RGB(0xE6, 0x19, 0x4B), RGB(0x3C, 0xB4, 0x4B), RGB(0xFF, 0xE1, 0x19), RGB(0x43, 0x63, 0xD8),
|
||||
RGB(0xF5, 0x82, 0x31), RGB(0x91, 0x1E, 0xB4), RGB(0x46, 0xF0, 0xF0), RGB(0xF0, 0x32, 0xE6),
|
||||
RGB(0xBC, 0xF6, 0x0C), RGB(0xFA, 0xBE, 0xBE), RGB(0x00, 0x80, 0x80), RGB(0xE6, 0xBE, 0xFF),
|
||||
RGB(0x9A, 0x63, 0x24), RGB(0xFF, 0xFA, 0xC8), RGB(0x80, 0x00, 0x00), RGB(0xAA, 0xFF, 0xC3),
|
||||
RGB(0x80, 0x80, 0x00), RGB(0xFF, 0xD8, 0xB1), RGB(0x00, 0x00, 0x75), RGB(0x80, 0x80, 0x80),
|
||||
RGB(0xFF, 0xFF, 0xFF), RGB(0x00, 0x00, 0x00)
|
||||
};
|
||||
|
||||
static const u16 brushes_tmp[PAINT9_N_BRUSHES][PAINT9_BRUSH_SIZE] = {
|
||||
@ -97,13 +75,29 @@ void Paint9_DrawBrush(u16 px, u16 py, u32 color_fg, u32 color_bg, u32 id) {
|
||||
}
|
||||
}
|
||||
|
||||
// Bresenham algorithm, see here:
|
||||
// https://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#C
|
||||
void Paint9_DrawLine(u16 px0, u16 py0, u16 px1, u16 py1, u32 color_fg, u32 id) {
|
||||
const int dx = abs((s16) px1-px0), sx = (px0 < px1) ? 1 : -1;
|
||||
const int dy = abs((s16) py1-py0), sy = (py0 < py1) ? 1 : -1;
|
||||
int err = ((dx > dy) ? dx : -dy) / 2;
|
||||
|
||||
while (true) {
|
||||
Paint9_DrawBrush(px0, py0, color_fg, COLOR_TRANSPARENT, id);
|
||||
if ((px0 == px1) && (py0 == py1)) break;
|
||||
int e2 = err;
|
||||
if (e2 >-dx) { err -= dy; px0 += sx; }
|
||||
if (e2 < dy) { err += dx; py0 += sy; }
|
||||
}
|
||||
}
|
||||
|
||||
u32 Paint9(void) {
|
||||
static u32 brush_bg = RGB(0x20, 0x20, 0x20);
|
||||
static u32 outline_bg = RGB(0x18, 0x18, 0x18);
|
||||
u16 x_cb = paint9_boxes[2].x + (PAINT9_BRUSH_SIZE/2) + 1;
|
||||
u16 y_cb = SCREEN_HEIGHT - 10 - (PAINT9_BRUSH_SIZE/2) - 1;
|
||||
|
||||
u32 color = COLOR_RED;
|
||||
u16 color = *color_picker_tmp;
|
||||
u32 brush_id = 0;
|
||||
|
||||
// clear screens, draw title
|
||||
@ -118,8 +112,9 @@ u32 Paint9(void) {
|
||||
// draw color picker
|
||||
u32 pick_x = paint9_boxes[1].x;
|
||||
u32 pick_y = paint9_boxes[1].y;
|
||||
const u32 palbox_height = PAINT9_COLSEL_HEIGHT / countof(color_picker_tmp);
|
||||
for (u32 y = 0; y < PAINT9_COLSEL_HEIGHT; y++) {
|
||||
const u16* color = (u16*)(void*) (color_picker_tmp + (y * BYTES_PER_PIXEL));
|
||||
const u16* color = color_picker_tmp + (y / palbox_height);
|
||||
for (u32 x = 0; x < PAINT9_COLSEL_WIDTH; x++)
|
||||
DrawPixel(BOT_SCREEN, pick_x + x, pick_y + y, *color);
|
||||
}
|
||||
@ -141,21 +136,27 @@ u32 Paint9(void) {
|
||||
|
||||
u16 tx, ty;
|
||||
u32 tb_id;
|
||||
u16 tx_prev = 0;
|
||||
u16 ty_prev = 0;
|
||||
u32 tb_id_prev = 0;
|
||||
while (HID_ReadTouchState(&tx, &ty)) {
|
||||
DrawStringF(TOP_SCREEN, 16, 16, COLOR_STD_FONT, COLOR_STD_BG,
|
||||
"Touchscreen coordinates (%d/%d) ", tx, ty);
|
||||
TouchBoxGet(&tb_id, tx, ty, paint9_boxes, 8);
|
||||
if (tb_id == P9BOX_CANVAS) {
|
||||
Paint9_DrawBrush(tx, ty, color, COLOR_TRANSPARENT, brush_id);
|
||||
continue;
|
||||
if (tb_id_prev == P9BOX_CANVAS)
|
||||
Paint9_DrawLine(tx_prev, ty_prev, tx, ty, color, brush_id);
|
||||
else Paint9_DrawBrush(tx, ty, color, COLOR_TRANSPARENT, brush_id);
|
||||
} else if (tb_id == P9BOX_PICKER) {
|
||||
color = GetColor(BOT_SCREEN, tx, ty);
|
||||
} else if (tb_id >= P9BOX_BRUSH_N) {
|
||||
brush_id = tb_id - P9BOX_BRUSH_N;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
Paint9_DrawBrush(x_cb, y_cb, color, brush_bg, brush_id);
|
||||
if ((tb_id == P9BOX_PICKER) || (tb_id >= P9BOX_BRUSH_N))
|
||||
Paint9_DrawBrush(x_cb, y_cb, color, brush_bg, brush_id);
|
||||
tb_id_prev = tb_id;
|
||||
tx_prev = tx;
|
||||
ty_prev = ty;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user