From bd5b613c91c4a1b87706d8559114d5e231a4eff7 Mon Sep 17 00:00:00 2001 From: Fierelier Date: Sat, 11 May 2024 02:58:17 +0200 Subject: [PATCH] Generate quick palette --- src/platform/dos/graphics.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/platform/dos/graphics.c b/src/platform/dos/graphics.c index 0888766..99d4756 100644 --- a/src/platform/dos/graphics.c +++ b/src/platform/dos/graphics.c @@ -219,6 +219,8 @@ unigi_type_uint8 unigi_platform_palette_dos[unigi_platform_palette_dos_colors * 63, 63, 63 }; +unigi_type_uint8 unigi_platform_palette[65536]; + static inline void unigi_platform_color_16_to_32(unigi_type_uint16 color16,unigi_type_uint8 * r, unigi_type_uint8 * g, unigi_type_uint8 * b, unigi_type_uint8 * a) { *r = (color16 >> 12) & 0xF; *g = (color16 >> 8) & 0xF; @@ -251,7 +253,21 @@ unigi_type_uint8 unigi_platform_color_find(unigi_type_uint8 r, unigi_type_uint8 return color; } +#include unigi_type_error unigi_graphics_init() { + // Create palette + unigi_type_uint32 index = 0; + while (index < 65536) { + unigi_type_uint8 r,g,b,a; + unigi_platform_color_16_to_32(index,&r,&g,&b,&a); + if (index % 500 == 0) { + printf("Generating palette %ld ...\r",index); + fflush(stdout); + } + unigi_platform_palette[index] = unigi_platform_color_find(r,g,b); + index++; + } + // Create a list of compatible resolutions unigi_status_resolutions = malloc(sizeof(unigi_type_resolution_range) * 2); if (unigi_status_resolutions == NULL) { return 1; } @@ -315,9 +331,7 @@ unigi_type_error unigi_graphics_mode(unigi_type_resolution * resolution, char * static inline void unigi_graphics_draw_pixel(unigi_type_resolution_pixel_index pixel, unigi_type_color color) { // This is horribly slow, for now unsigned char far *unigi_platform_vidbuf = (unsigned char far *)0xA0000000L; - unigi_type_uint8 r,g,b,a; - unigi_platform_color_16_to_32(color,&r,&g,&b,&a); - unigi_platform_vidbuf[pixel] = unigi_platform_color_find(r,g,b); + unigi_platform_vidbuf[pixel] = unigi_platform_palette[color]; } static inline void unigi_graphics_flush() {