fix BGR/RGB handling
authorkub <derkub@gmail.com>
Wed, 14 Feb 2024 21:26:18 +0000 (22:26 +0100)
committerkub <derkub@gmail.com>
Wed, 14 Feb 2024 21:26:18 +0000 (22:26 +0100)
menu.c
plat.h
readpng.c

diff --git a/menu.c b/menu.c
index 5d96b7e..04fb381 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -77,9 +77,9 @@ static void text_out16_(int x, int y, const char *text, int color)
 {\r
        int i, lh, tr, tg, tb, len;\r
        unsigned short *dest = (unsigned short *)g_menuscreen_ptr + x + y * g_menuscreen_pp;\r
-       tr = (color & 0xf800) >> 8;\r
-       tg = (color & 0x07e0) >> 3;\r
-       tb = (color & 0x001f) << 3;\r
+       tr = PXGETR(color);\r
+       tg = PXGETG(color);\r
+       tb = PXGETB(color);\r
 \r
        if (text == (void *)1)\r
        {\r
@@ -111,21 +111,21 @@ static void text_out16_(int x, int y, const char *text, int color)
                        {\r
                                int c, r, g, b;\r
                                c = *src >> 4;\r
-                               r = (*dst & 0xf800) >> 8;\r
-                               g = (*dst & 0x07e0) >> 3;\r
-                               b = (*dst & 0x001f) << 3;\r
+                               r = PXGETR(*dst);\r
+                               g = PXGETG(*dst);\r
+                               b = PXGETB(*dst);\r
                                r = (c^0xf)*r/15 + c*tr/15;\r
                                g = (c^0xf)*g/15 + c*tg/15;\r
                                b = (c^0xf)*b/15 + c*tb/15;\r
-                               *dst++ = ((r<<8)&0xf800) | ((g<<3)&0x07e0) | (b>>3);\r
+                               *dst++ = PXMAKE(r, g, b);\r
                                c = *src & 0xf;\r
-                               r = (*dst & 0xf800) >> 8;\r
-                               g = (*dst & 0x07e0) >> 3;\r
-                               b = (*dst & 0x001f) << 3;\r
+                               r = PXGETR(*dst);\r
+                               g = PXGETG(*dst);\r
+                               b = PXGETB(*dst);\r
                                r = (c^0xf)*r/15 + c*tr/15;\r
                                g = (c^0xf)*g/15 + c*tg/15;\r
                                b = (c^0xf)*b/15 + c*tb/15;\r
-                               *dst++ = ((r<<8)&0xf800) | ((g<<3)&0x07e0) | (b>>3);\r
+                               *dst++ = PXMAKE(r, g, b);\r
                        }\r
                }\r
                dest += me_mfont_w;\r
@@ -241,11 +241,7 @@ static int parse_hex_color(char *buff)
        char *endp = buff;\r
        int t = (int) strtoul(buff, &endp, 16);\r
        if (endp != buff)\r
-#ifdef PSP\r
-               return ((t<<8)&0xf800) | ((t>>5)&0x07e0) | ((t>>19)&0x1f);\r
-#else\r
-               return ((t>>8)&0xf800) | ((t>>5)&0x07e0) | ((t>>3)&0x1f);\r
-#endif\r
+               return PXMAKE((t>>16)&0xff, (t>>8)&0xff,t&0xff);\r
        return -1;\r
 }\r
 \r
@@ -367,7 +363,7 @@ static void menu_darken_bg(void *dst, void *src, int pixels, int darker)
                while (pixels--)\r
                {\r
                        unsigned int p = *sorc++;\r
-                       *dest++ = ((p&0xf79ef79e)>>1) - ((p&0xc618c618)>>3);\r
+                       *dest++ = (PXMASKH(p,1)>>1) - (PXMASKH(p,3)>>3);\r
                }\r
        }\r
        else\r
@@ -375,7 +371,7 @@ static void menu_darken_bg(void *dst, void *src, int pixels, int darker)
                while (pixels--)\r
                {\r
                        unsigned int p = *sorc++;\r
-                       *dest++ = (p&0xf79ef79e)>>1;\r
+                       *dest++ = (PXMASKH(p,1)>>1);\r
                }\r
        }\r
 }\r
@@ -400,7 +396,7 @@ static void menu_darken_text_bg(void)
                ymax = g_menuscreen_h - 1;\r
 \r
        for (x = xmin; x <= xmax; x++)\r
-               screen[y * g_menuscreen_pp + x] = 0xa514;\r
+               screen[y * g_menuscreen_pp + x] = PXMAKE(0xa0, 0xa0, 0xa0);\r
        for (y++; y < ymax; y++)\r
        {\r
                ls = y * g_menuscreen_pp;\r
@@ -409,7 +405,7 @@ static void menu_darken_text_bg(void)
                {\r
                        unsigned int p = screen[ls + x];\r
                        if (p != menu_text_color)\r
-                               screen[ls + x] = ((p&0xf79e)>>1) - ((p&0xc618)>>3);\r
+                               screen[ls + x] = (PXMASKH(p,1)>>1) - (PXMASKH(p,3)>>3);\r
                }\r
                screen[ls + xmax] = 0xffff;\r
        }\r
@@ -664,7 +660,7 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
                        tmp = strchr(tmp + 1, '\n');\r
                if (h >= l * me_sfont_h + 4)\r
                        for (tmp = ent_sel->help; l > 0; l--, tmp = strchr(tmp, '\n') + 1)\r
-                               smalltext_out16(5, g_menuscreen_h - (l * me_sfont_h + 4), tmp, 0xffff);\r
+                               smalltext_out16(5, g_menuscreen_h - (l * me_sfont_h + 4), tmp, PXMAKE(0xff, 0xff, 0xff));\r
        }\r
 \r
        menu_separation();\r
@@ -845,7 +841,7 @@ static void do_delete(const char *fpath, const char *fname)
 \r
        mid = g_menuscreen_w / 2;\r
        text_out16(mid - me_mfont_w * 15 / 2,  8 * me_mfont_h, "About to delete");\r
-       smalltext_out16(mid - len * me_sfont_w / 2, 9 * me_mfont_h + 5, fname, 0xbdff);\r
+       smalltext_out16(mid - len * me_sfont_w / 2, 9 * me_mfont_h + 5, fname, PXMAKE(0xbf, 0xbf, 0xff));\r
        text_out16(mid - me_mfont_w * 13 / 2, 11 * me_mfont_h, "Are you sure?");\r
 \r
        nm = in_get_key_name(-1, -PBTN_MA3);\r
@@ -886,20 +882,20 @@ static void draw_dirlist(char *curdir, struct dirent **namelist,
 \r
        x = 5 + me_mfont_w + 1;\r
        if (start - 2 >= 0)\r
-               smalltext_out16(14, (start - 2) * me_sfont_h, curdir, 0xffff);\r
+               smalltext_out16(14, (start - 2) * me_sfont_h, curdir, PXMAKE(0xff, 0xff, 0xff));\r
        for (i = 0; i < n; i++) {\r
                pos = start + i;\r
                if (pos < 0)  continue;\r
                if (pos >= max_cnt) break;\r
                if (namelist[i]->d_type == DT_DIR) {\r
-                       smalltext_out16(x, pos * me_sfont_h, "/", 0xfff6);\r
-                       smalltext_out16(x + me_sfont_w, pos * me_sfont_h, namelist[i]->d_name, 0xfff6);\r
+                       smalltext_out16(x, pos * me_sfont_h, "/", PXMAKE(0xff, 0xff, 0xb0));\r
+                       smalltext_out16(x + me_sfont_w, pos * me_sfont_h, namelist[i]->d_name, PXMAKE(0xff, 0xff, 0xb0));\r
                } else {\r
                        unsigned short color = fname2color(namelist[i]->d_name);\r
                        smalltext_out16(x, pos * me_sfont_h, namelist[i]->d_name, color);\r
                }\r
        }\r
-       smalltext_out16(5, max_cnt/2 * me_sfont_h, ">", 0xffff);\r
+       smalltext_out16(5, max_cnt/2 * me_sfont_h, ">", PXMAKE(0xff, 0xff, 0xff));\r
 \r
        if (show_help) {\r
                darken_ptr = (short *)g_menuscreen_ptr\r
@@ -909,17 +905,17 @@ static void draw_dirlist(char *curdir, struct dirent **namelist,
 \r
                snprintf(buff, sizeof(buff), "%s - select, %s - back",\r
                        in_get_key_name(-1, -PBTN_MOK), in_get_key_name(-1, -PBTN_MBACK));\r
-               smalltext_out16(x, g_menuscreen_h - me_sfont_h * 3 - 2, buff, 0xe78c);\r
+               smalltext_out16(x, g_menuscreen_h - me_sfont_h * 3 - 2, buff, PXMAKE(0xe0, 0xf0, 0x60));\r
 \r
                snprintf(buff, sizeof(buff), g_menu_filter_off ?\r
                         "%s - hide unknown files" : "%s - show all files",\r
                        in_get_key_name(-1, -PBTN_MA3));\r
-               smalltext_out16(x, g_menuscreen_h - me_sfont_h * 2 - 2, buff, 0xe78c);\r
+               smalltext_out16(x, g_menuscreen_h - me_sfont_h * 2 - 2, buff, PXMAKE(0xe0, 0xf0, 0x60));\r
 \r
                snprintf(buff, sizeof(buff), g_autostateld_opt ?\r
                         "%s - autoload save is ON" : "%s - autoload save is OFF",\r
                        in_get_key_name(-1, -PBTN_MA2));\r
-               smalltext_out16(x, g_menuscreen_h - me_sfont_h * 1 - 2, buff, 0xe78c);\r
+               smalltext_out16(x, g_menuscreen_h - me_sfont_h * 1 - 2, buff, PXMAKE(0xe0, 0xf0, 0x60));\r
        }\r
 \r
        menu_draw_end();\r
diff --git a/plat.h b/plat.h
index 03949d6..ba4e0eb 100644 (file)
--- a/plat.h
+++ b/plat.h
@@ -7,6 +7,30 @@
 extern "C" {
 #endif
 
+// platform dependend color handling
+#if defined(USE_BGR555)
+#define PXMAKE(r,g,b) ((((b)<<7) & 0x7c00)|(((g)<<2) & 0x03e0)|((r)>>3))
+#define PXMASKL(t,c) ((t) &  (((1<<(c))-1)*0x04210421))
+#define PXMASKH(t,c) ((t) & ~(((1<<(c))-1)*0x04210421) & 0x7fff)
+#define PXGETR(t)    (((t) & 0x001f)<<3)
+#define PXGETG(t)    (((t) & 0x03e0)>>2)
+#define PXGETB(t)    (((t) & 0x7c00)>>7)
+#elif defined(USE_BGR565)
+#define PXMAKE(r,g,b) ((((b)<<8) & 0xf800)|(((g)<<3) & 0x07e0)|((r)>>3))
+#define PXMASKL(t,c) ((t) &  (((1<<(c))-1)*0x08210821))
+#define PXMASKH(t,c) ((t) & ~(((1<<(c))-1)*0x08210821))
+#define PXGETR(t)    (((t) & 0x001f)<<3)
+#define PXGETG(t)    (((t) & 0x07e0)>>3)
+#define PXGETB(t)    (((t) & 0xf800)>>8)
+#else // RGB565
+#define PXMAKE(r,g,b) ((((r)<<8) & 0xf800)|(((g)<<3) & 0x07e0)|((b)>>3))
+#define PXMASKL(t,c) ((t) &  (((1<<(c))-1)*0x08210821))
+#define PXMASKH(t,c) ((t) & ~(((1<<(c))-1)*0x08210821))
+#define PXGETR(t)    (((t) & 0xf800)>>8)
+#define PXGETG(t)    (((t) & 0x07e0)>>3)
+#define PXGETB(t)    (((t) & 0x001f)<<3)
+#endif
+
 /* target device, everything is optional */
 struct plat_target {
        int (*cpu_clock_get)(void);
index ac24dd4..d0714ed 100644 (file)
--- a/readpng.c
+++ b/readpng.c
@@ -13,6 +13,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <png.h>
+#include "plat.h"
 #include "readpng.h"
 #include "lprintf.h"
 
@@ -95,11 +96,7 @@ int readpng(void *dest, const char *fname, readpng_what what, int req_w, int req
                                int len = width;
                                while (len--)
                                {
-#ifdef PSP
-                                       *dst++ = ((src[2]&0xf8)<<8) | ((src[1]&0xf8)<<3) | (src[0] >> 3); // BGR
-#else
-                                       *dst++ = ((src[0]&0xf8)<<8) | ((src[1]&0xf8)<<3) | (src[2] >> 3); // RGB
-#endif
+                                       *dst++ = PXMAKE(src[0], src[1], src[2]);
                                        src += 3;
                                }
                                dst += req_w - width;
@@ -224,9 +221,9 @@ int writepng(const char *fname, unsigned short *src, int w, int h)
                        goto end2;
                row_pointers[i] = dst;
                for (j = 0; j < w; j++, src++, dst += 3) {
-                       dst[0] = (*src & 0xf800) >> 8;
-                       dst[1] = (*src & 0x07e0) >> 3;
-                       dst[2] = (*src & 0x001f) << 3;
+                       dst[0] = PXGETR(*src);
+                       dst[1] = PXGETG(*src);
+                       dst[2] = PXGETB(*src);
                }
        }