Improved touchscreen playground

This commit is contained in:
d0k3 2019-06-11 01:26:51 +02:00
parent dc9dc794b0
commit 1403dc8ef9

View File

@ -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;
}
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;
}
}