diff --git a/nyx/nyx_gui/frontend/gui.c b/nyx/nyx_gui/frontend/gui.c index dc79e75..4fd18bf 100644 --- a/nyx/nyx_gui/frontend/gui.c +++ b/nyx/nyx_gui/frontend/gui.c @@ -182,7 +182,7 @@ static void _save_fb_to_bmp() static void _disp_fb_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t *color_p) { // Draw to framebuffer. - gfx_set_rect_land_pitch((u32 *)NYX_FB_ADDRESS, (u32 *)color_p, x1, y1, x2, y2); //pitch + gfx_set_rect_land_pitch((u32 *)NYX_FB_ADDRESS, (u32 *)color_p, 720, x1, y1, x2, y2); //pitch // Check if display init was done. If it's the first big draw, init. if (!disp_init_done && ((x2 - x1 + 1) > 600)) diff --git a/nyx/nyx_gui/gfx/gfx.c b/nyx/nyx_gui/gfx/gfx.c index 4a74d43..139259d 100644 --- a/nyx/nyx_gui/gfx/gfx.c +++ b/nyx/nyx_gui/gfx/gfx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2018 naehrwert - * Copyright (c) 2018-2019 CTCaer + * Copyright (c) 2018-2020 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -117,14 +117,6 @@ static const u8 _gfx_font[] = { 0x00, 0x00, 0x00, 0x4C, 0x32, 0x00, 0x00, 0x00 // Char 126 (~) }; -void gfx_init_ctxt(u32 *fb, u32 width, u32 height, u32 stride) -{ - gfx_ctxt.fb = fb; - gfx_ctxt.width = width; - gfx_ctxt.height = height; - gfx_ctxt.stride = stride; -} - void gfx_clear_grey(u8 color) { memset(gfx_ctxt.fb, color, gfx_ctxt.width * gfx_ctxt.height * 4); @@ -136,9 +128,14 @@ void gfx_clear_color(u32 color) gfx_ctxt.fb[i] = color; } -void gfx_clear_partial_grey(u8 color, u32 pos_x, u32 height) +void gfx_init_ctxt(u32 *fb, u32 width, u32 height, u32 stride) { - memset(gfx_ctxt.fb + pos_x * gfx_ctxt.stride, color, height * 4 * gfx_ctxt.stride); + gfx_ctxt.fb = fb; + gfx_ctxt.width = width; + gfx_ctxt.height = height; + gfx_ctxt.stride = stride; + + gfx_clear_grey(0); } void gfx_con_init() @@ -149,9 +146,9 @@ void gfx_con_init() gfx_con.y = 0; gfx_con.savedx = 0; gfx_con.savedy = 0; - gfx_con.fgcol = 0xFFCCCCCC; + gfx_con.fgcol = 0xFFFFFFFF; gfx_con.fillbg = 1; - gfx_con.bgcol = 0xFF1B1B1B; + gfx_con.bgcol = 0xFF000000; gfx_con.mute = 0; } @@ -174,6 +171,7 @@ void gfx_con_setpos(u32 x, u32 y) gfx_con.y = y; } +static int gfx_column = 0; void gfx_putc(char c) { // Duplicate code for performance reasons. @@ -183,33 +181,23 @@ void gfx_putc(char c) if (c >= 32 && c <= 126) { u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)]; - u32 *fb = gfx_ctxt.fb + gfx_con.x + gfx_con.y * gfx_ctxt.stride; - for (u32 i = 0; i < 16; i += 2) { u8 v = *cbuf; for (u32 k = 0; k < 2; k++) { - for (u32 j = 0; j < 8; j++) + u32 fb_off = gfx_con.y + i + k + (gfx_ctxt.width - gfx_con.x) * gfx_ctxt.stride; + for (u32 j = 0; j < 16; j += 2) { - if (v & 1) + for (u32 l = 0; l < 2; l++) { - *fb = gfx_con.fgcol; - fb++; - *fb = gfx_con.fgcol; + if (v & 1) + gfx_ctxt.fb[fb_off - (j + l) * gfx_ctxt.stride] = gfx_con.fgcol; + else if (gfx_con.fillbg) + gfx_ctxt.fb[fb_off - (j + l) * gfx_ctxt.stride] = gfx_con.bgcol; } - else if (gfx_con.fillbg) - { - *fb = gfx_con.bgcol; - fb++; - *fb = gfx_con.bgcol; - } - else - fb++; v >>= 1; - fb++; } - fb += gfx_ctxt.stride - 16; v = *cbuf; } cbuf++; @@ -218,10 +206,18 @@ void gfx_putc(char c) } else if (c == '\n') { - gfx_con.x = 0; + gfx_con.x = gfx_column; gfx_con.y +=16; - if (gfx_con.y > gfx_ctxt.height - 16) + if (gfx_con.y > gfx_ctxt.height - 33) + { gfx_con.y = 0; + + if (!gfx_column) + gfx_column = 640; + else + gfx_column = 0; + gfx_con.x = gfx_column; + } } break; case 8: @@ -229,35 +225,41 @@ void gfx_putc(char c) if (c >= 32 && c <= 126) { u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)]; - u32 *fb = gfx_ctxt.fb + gfx_con.x + gfx_con.y * gfx_ctxt.stride; for (u32 i = 0; i < 8; i++) { u8 v = *cbuf++; + u32 fb_off = gfx_con.y + i + (gfx_ctxt.width - gfx_con.x) * gfx_ctxt.stride; for (u32 j = 0; j < 8; j++) { if (v & 1) - *fb = gfx_con.fgcol; + gfx_ctxt.fb[fb_off - (j * gfx_ctxt.stride)] = gfx_con.fgcol; else if (gfx_con.fillbg) - *fb = gfx_con.bgcol; + gfx_ctxt.fb[fb_off - (j * gfx_ctxt.stride)] = gfx_con.bgcol; v >>= 1; - fb++; } - fb += gfx_ctxt.stride - 8; } gfx_con.x += 8; } else if (c == '\n') { - gfx_con.x = 0; + gfx_con.x = gfx_column; gfx_con.y += 8; - if (gfx_con.y > gfx_ctxt.height - 8) + if (gfx_con.y > gfx_ctxt.height - 33) + { gfx_con.y = 0; + + if (!gfx_column) + gfx_column = 640; + else + gfx_column = 0; + gfx_con.x = gfx_column; + } } break; } } -void gfx_puts(const char *s) +void gfx_puts(char *s) { if (!s || gfx_con.mute) return; @@ -297,22 +299,6 @@ static void _gfx_putn(u32 v, int base, char fill, int fcnt) gfx_puts(p); } -void gfx_put_small_sep() -{ - u8 prevFontSize = gfx_con.fntsz; - gfx_con.fntsz = 8; - gfx_putc('\n'); - gfx_con.fntsz = prevFontSize; -} - -void gfx_put_big_sep() -{ - u8 prevFontSize = gfx_con.fntsz; - gfx_con.fntsz = 16; - gfx_putc('\n'); - gfx_con.fntsz = prevFontSize; -} - void gfx_printf(const char *fmt, ...) { if (gfx_con.mute) @@ -442,108 +428,12 @@ void gfx_hexdump(u32 base, const u8 *buf, u32 len) gfx_con.fntsz = prevFontSize; } -static int abs(int x) -{ - if (x < 0) - return -x; - return x; -} - void gfx_set_pixel(u32 x, u32 y, u32 color) { - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = color; + gfx_ctxt.fb[y + (gfx_ctxt.width - x) * gfx_ctxt.stride] = color; } -void gfx_line(int x0, int y0, int x1, int y1, u32 color) -{ - int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; - int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1; - int err = (dx > dy ? dx : -dy) / 2, e2; - - while (1) - { - gfx_set_pixel(x0, y0, color); - if (x0 == x1 && y0 == y1) - break; - e2 = err; - if (e2 >-dx) - { - err -= dy; - x0 += sx; - } - if (e2 < dy) - { - err += dx; - y0 += sy; - } - } -} - -void gfx_set_rect_grey(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - u32 pos = 0; - for (u32 y = pos_y; y < (pos_y + size_y); y++) - { - for (u32 x = pos_x; x < (pos_x + size_x); x++) - { - memset(&gfx_ctxt.fb[x + y*gfx_ctxt.stride], buf[pos], 4); - pos++; - } - } -} - - -void gfx_set_rect_rgb(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - u32 pos = 0; - for (u32 y = pos_y; y < (pos_y + size_y); y++) - { - for (u32 x = pos_x; x < (pos_x + size_x); x++) - { - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = buf[pos + 2] | (buf[pos + 1] << 8) | (buf[pos] << 16); - pos+=3; - } - } -} - -void gfx_set_rect_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - u32 *ptr = (u32 *)buf; - for (u32 y = pos_y; y < (pos_y + size_y); y++) - for (u32 x = pos_x; x < (pos_x + size_x); x++) - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = *ptr++; -} - -void gfx_set_rect_argb_land(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - u32 pos = 0; - for (u32 y = pos_y; y < (pos_y + size_y); y++) - { - for (u32 x = pos_x; x < (pos_x + size_x); x++) - { - gfx_ctxt.fb[y + (gfx_ctxt.width - x) * gfx_ctxt.stride] = buf[pos]; - pos+=1; - } - } -} - -void gfx_fill_rect_argb(const u32 color, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - for (u32 y = pos_y; y < (pos_y + size_y); y++) - for (u32 x = pos_x; x < (pos_x + size_x); x++) - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = color; -} - -void gfx_render_bmp_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y) -{ - for (u32 y = pos_y; y < (pos_y + size_y); y++) - { - for (u32 x = pos_x; x < (pos_x + size_x); x++) - gfx_ctxt.fb[x + y * gfx_ctxt.stride] = buf[(size_y + pos_y - 1 - y ) * size_x + x - pos_x]; - } -} - -__attribute__((target("arm"))) void gfx_set_rect_land_pitch(u32 *fb, const u32 *buf, u32 pos_x, u32 pos_y, u32 pos_x2, u32 pos_y2) +void __attribute__((optimize("unroll-loops"))) gfx_set_rect_land_pitch(u32 *fb, const u32 *buf, u32 stride, u32 pos_x, u32 pos_y, u32 pos_x2, u32 pos_y2) { u32 *ptr = (u32 *)buf; @@ -554,27 +444,27 @@ __attribute__((target("arm"))) void gfx_set_rect_land_pitch(u32 *fb, const u32 * for (u32 y = pos_y; y < (pos_y2 + 1); y++) for (u32 x = pos_x; x < (pos_x2 + 1); x+=8) { - u32 *fbx = &fb[x * gfx_ctxt.stride + y]; + u32 *fbx = &fb[x * stride + y]; - fbx[0] = *ptr++; - fbx[gfx_ctxt.stride] = *ptr++; - fbx[gfx_ctxt.stride * 2] = *ptr++; - fbx[gfx_ctxt.stride * 3] = *ptr++; - fbx[gfx_ctxt.stride * 4] = *ptr++; - fbx[gfx_ctxt.stride * 5] = *ptr++; - fbx[gfx_ctxt.stride * 6] = *ptr++; - fbx[gfx_ctxt.stride * 7] = *ptr++; + fbx[0] = *ptr++; + fbx[stride] = *ptr++; + fbx[stride * 2] = *ptr++; + fbx[stride * 3] = *ptr++; + fbx[stride * 4] = *ptr++; + fbx[stride * 5] = *ptr++; + fbx[stride * 6] = *ptr++; + fbx[stride * 7] = *ptr++; } } else { for (u32 y = pos_y; y < (pos_y2 + 1); y++) for (u32 x = pos_x; x < (pos_x2 + 1); x++) - fb[x * gfx_ctxt.stride + y] = *ptr++; + fb[x * stride + y] = *ptr++; } } -__attribute__((target("arm"))) void gfx_set_rect_land_block(const u32 *buf, u32 pos_x, u32 pos_y, u32 pos_x2, u32 pos_y2) +void __attribute__((optimize("unroll-loops"))) gfx_set_rect_land_block(u32 *fb, const u32 *buf, u32 pos_x, u32 pos_y, u32 pos_x2, u32 pos_y2) { u32 *ptr = (u32 *)buf; u32 GOB_address = 0; @@ -596,7 +486,7 @@ __attribute__((target("arm"))) void gfx_set_rect_land_block(const u32 *buf, u32 + (((x2 % 32) >> 4) << 5) + ((y % 2) << 4) + (x2 % 16); - *(u32 *)(gfx_ctxt.fb + (addr >> 2)) = *ptr++; + *(u32 *)(fb + (addr >> 2)) = *ptr++; } } diff --git a/nyx/nyx_gui/gfx/gfx.h b/nyx/nyx_gui/gfx/gfx.h index 0d09576..4017ff1 100644 --- a/nyx/nyx_gui/gfx/gfx.h +++ b/nyx/nyx_gui/gfx/gfx.h @@ -28,31 +28,20 @@ void gfx_init_ctxt(u32 *fb, u32 width, u32 height, u32 stride); void gfx_clear_grey(u8 color); -void gfx_clear_partial_grey(u8 color, u32 pos_x, u32 height); void gfx_clear_color(u32 color); void gfx_con_init(); void gfx_con_setcol(u32 fgcol, int fillbg, u32 bgcol); void gfx_con_getpos(u32 *x, u32 *y); void gfx_con_setpos(u32 x, u32 y); void gfx_putc(char c); -void gfx_puts(const char *s); +void gfx_puts(char *s); void gfx_printf(const char *fmt, ...); void gfx_hexdump(u32 base, const u8 *buf, u32 len); void gfx_set_pixel(u32 x, u32 y, u32 color); -void gfx_line(int x0, int y0, int x1, int y1, u32 color); -void gfx_put_small_sep(); -void gfx_put_big_sep(); -void gfx_set_rect_grey(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); -void gfx_set_rect_rgb(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); -void gfx_set_rect_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); -void gfx_set_rect_argb_land(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); -void gfx_fill_rect_argb(const u32 color, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); -void gfx_render_bmp_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y); - -void gfx_set_rect_land_pitch(u32 *fb, const u32 *buf, u32 pos_x, u32 pos_y, u32 pos_x2, u32 pos_y2); -void gfx_set_rect_land_block(const u32 *buf, u32 pos_x, u32 pos_y, u32 pos_x2, u32 pos_y2); +void gfx_set_rect_land_pitch(u32 *fb, const u32 *buf, u32 stride, u32 pos_x, u32 pos_y, u32 pos_x2, u32 pos_y2); +void gfx_set_rect_land_block(u32 *fb, const u32 *buf, u32 pos_x, u32 pos_y, u32 pos_x2, u32 pos_y2); // Global gfx console and context. gfx_ctxt_t gfx_ctxt;