From b29169d2654776e749de91d65c720003ab4a2e66 Mon Sep 17 00:00:00 2001 From: blueswir1 Date: Sun, 10 Jun 2007 16:07:38 +0000 Subject: [PATCH] Attempt to fix incorrect colours on some BGR displays git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2974 c046a42c-6fe2-441c-8c8c-71466251a162 --- cocoa.m | 7 ++++++- hw/tcx.c | 15 ++++++++++++--- hw/vga.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- sdl.c | 2 +- 4 files changed, 74 insertions(+), 8 deletions(-) diff --git a/cocoa.m b/cocoa.m index 9551affa34..501fb705b0 100644 --- a/cocoa.m +++ b/cocoa.m @@ -164,7 +164,12 @@ static void cocoa_resize(DisplayState *ds, int w, int h) ds->depth = device_bpp; ds->width = w; ds->height = h; - +#ifdef __LITTLE_ENDIAN__ + ds->bgr = 1; +#else + ds->bgr = 0; +#endif + current_ds = *ds; } diff --git a/hw/tcx.c b/hw/tcx.c index 2c65a0568e..675c74d9fe 100644 --- a/hw/tcx.c +++ b/hw/tcx.c @@ -58,13 +58,22 @@ static void update_palette_entries(TCXState *s, int start, int end) s->palette[i] = rgb_to_pixel8(s->r[i], s->g[i], s->b[i]); break; case 15: - s->palette[i] = rgb_to_pixel15(s->r[i], s->g[i], s->b[i]); + if (s->ds->bgr) + s->palette[i] = rgb_to_pixel15bgr(s->r[i], s->g[i], s->b[i]); + else + s->palette[i] = rgb_to_pixel15(s->r[i], s->g[i], s->b[i]); break; case 16: - s->palette[i] = rgb_to_pixel16(s->r[i], s->g[i], s->b[i]); + if (s->ds->bgr) + s->palette[i] = rgb_to_pixel16bgr(s->r[i], s->g[i], s->b[i]); + else + s->palette[i] = rgb_to_pixel16(s->r[i], s->g[i], s->b[i]); break; case 32: - s->palette[i] = rgb_to_pixel32(s->r[i], s->g[i], s->b[i]); + if (s->ds->bgr) + s->palette[i] = rgb_to_pixel32bgr(s->r[i], s->g[i], s->b[i]); + else + s->palette[i] = rgb_to_pixel32(s->r[i], s->g[i], s->b[i]); break; } } diff --git a/hw/vga.c b/hw/vga.c index 028a483055..efae5c7223 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -846,6 +846,15 @@ static unsigned int rgb_to_pixel15_dup(unsigned int r, unsigned int g, unsigned return col; } +static unsigned int rgb_to_pixel15bgr_dup(unsigned int r, unsigned int g, + unsigned int b) +{ + unsigned int col; + col = rgb_to_pixel15bgr(r, g, b); + col |= col << 16; + return col; +} + static unsigned int rgb_to_pixel16_dup(unsigned int r, unsigned int g, unsigned b) { unsigned int col; @@ -854,6 +863,15 @@ static unsigned int rgb_to_pixel16_dup(unsigned int r, unsigned int g, unsigned return col; } +static unsigned int rgb_to_pixel16bgr_dup(unsigned int r, unsigned int g, + unsigned int b) +{ + unsigned int col; + col = rgb_to_pixel16bgr(r, g, b); + col |= col << 16; + return col; +} + static unsigned int rgb_to_pixel32_dup(unsigned int r, unsigned int g, unsigned b) { unsigned int col; @@ -974,7 +992,7 @@ static int update_basic_params(VGAState *s) return full_update; } -#define NB_DEPTHS 5 +#define NB_DEPTHS 7 static inline int get_depth_index(DisplayState *s) { @@ -983,9 +1001,15 @@ static inline int get_depth_index(DisplayState *s) case 8: return 0; case 15: - return 1; + if (s->bgr) + return 5; + else + return 1; case 16: - return 2; + if (s->bgr) + return 6; + else + return 2; case 32: if (s->bgr) return 4; @@ -1000,6 +1024,8 @@ static vga_draw_glyph8_func *vga_draw_glyph8_table[NB_DEPTHS] = { vga_draw_glyph8_16, vga_draw_glyph8_32, vga_draw_glyph8_32, + vga_draw_glyph8_16, + vga_draw_glyph8_16, }; static vga_draw_glyph8_func *vga_draw_glyph16_table[NB_DEPTHS] = { @@ -1008,6 +1034,8 @@ static vga_draw_glyph8_func *vga_draw_glyph16_table[NB_DEPTHS] = { vga_draw_glyph16_16, vga_draw_glyph16_32, vga_draw_glyph16_32, + vga_draw_glyph16_16, + vga_draw_glyph16_16, }; static vga_draw_glyph9_func *vga_draw_glyph9_table[NB_DEPTHS] = { @@ -1016,6 +1044,8 @@ static vga_draw_glyph9_func *vga_draw_glyph9_table[NB_DEPTHS] = { vga_draw_glyph9_16, vga_draw_glyph9_32, vga_draw_glyph9_32, + vga_draw_glyph9_16, + vga_draw_glyph9_16, }; static const uint8_t cursor_glyph[32 * 4] = { @@ -1236,60 +1266,80 @@ static vga_draw_line_func *vga_draw_line_table[NB_DEPTHS * VGA_DRAW_LINE_NB] = { vga_draw_line2_16, vga_draw_line2_32, vga_draw_line2_32, + vga_draw_line2_16, + vga_draw_line2_16, vga_draw_line2d2_8, vga_draw_line2d2_16, vga_draw_line2d2_16, vga_draw_line2d2_32, vga_draw_line2d2_32, + vga_draw_line2d2_16, + vga_draw_line2d2_16, vga_draw_line4_8, vga_draw_line4_16, vga_draw_line4_16, vga_draw_line4_32, vga_draw_line4_32, + vga_draw_line4_16, + vga_draw_line4_16, vga_draw_line4d2_8, vga_draw_line4d2_16, vga_draw_line4d2_16, vga_draw_line4d2_32, vga_draw_line4d2_32, + vga_draw_line4d2_16, + vga_draw_line4d2_16, vga_draw_line8d2_8, vga_draw_line8d2_16, vga_draw_line8d2_16, vga_draw_line8d2_32, vga_draw_line8d2_32, + vga_draw_line8d2_16, + vga_draw_line8d2_16, vga_draw_line8_8, vga_draw_line8_16, vga_draw_line8_16, vga_draw_line8_32, vga_draw_line8_32, + vga_draw_line8_16, + vga_draw_line8_16, vga_draw_line15_8, vga_draw_line15_15, vga_draw_line15_16, vga_draw_line15_32, vga_draw_line15_32bgr, + vga_draw_line15_15bgr, + vga_draw_line15_16bgr, vga_draw_line16_8, vga_draw_line16_15, vga_draw_line16_16, vga_draw_line16_32, vga_draw_line16_32bgr, + vga_draw_line16_15bgr, + vga_draw_line16_16bgr, vga_draw_line24_8, vga_draw_line24_15, vga_draw_line24_16, vga_draw_line24_32, vga_draw_line24_32bgr, + vga_draw_line24_15bgr, + vga_draw_line24_16bgr, vga_draw_line32_8, vga_draw_line32_15, vga_draw_line32_16, vga_draw_line32_32, vga_draw_line32_32bgr, + vga_draw_line32_15bgr, + vga_draw_line32_16bgr, }; typedef unsigned int rgb_to_pixel_dup_func(unsigned int r, unsigned int g, unsigned b); @@ -1300,6 +1350,8 @@ static rgb_to_pixel_dup_func *rgb_to_pixel_dup_table[NB_DEPTHS] = { rgb_to_pixel16_dup, rgb_to_pixel32_dup, rgb_to_pixel32bgr_dup, + rgb_to_pixel15bgr_dup, + rgb_to_pixel16bgr_dup, }; static int vga_get_bpp(VGAState *s) diff --git a/sdl.c b/sdl.c index dc11937cf2..326935a78f 100644 --- a/sdl.c +++ b/sdl.c @@ -87,7 +87,7 @@ static void sdl_resize(DisplayState *ds, int w, int h) ds->data = screen->pixels; ds->linesize = screen->pitch; ds->depth = screen->format->BitsPerPixel; - if (ds->depth == 32 && screen->format->Rshift == 0) { + if (screen->format->Bshift > screen->format->Rshift) { ds->bgr = 1; } else { ds->bgr = 0;