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
This commit is contained in:
blueswir1 2007-06-10 16:07:38 +00:00
parent 9447084492
commit b29169d265
4 changed files with 74 additions and 8 deletions

View File

@ -164,7 +164,12 @@ static void cocoa_resize(DisplayState *ds, int w, int h)
ds->depth = device_bpp; ds->depth = device_bpp;
ds->width = w; ds->width = w;
ds->height = h; ds->height = h;
#ifdef __LITTLE_ENDIAN__
ds->bgr = 1;
#else
ds->bgr = 0;
#endif
current_ds = *ds; current_ds = *ds;
} }

View File

@ -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]); s->palette[i] = rgb_to_pixel8(s->r[i], s->g[i], s->b[i]);
break; break;
case 15: 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; break;
case 16: 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; break;
case 32: 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; break;
} }
} }

View File

@ -846,6 +846,15 @@ static unsigned int rgb_to_pixel15_dup(unsigned int r, unsigned int g, unsigned
return col; 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) static unsigned int rgb_to_pixel16_dup(unsigned int r, unsigned int g, unsigned b)
{ {
unsigned int col; unsigned int col;
@ -854,6 +863,15 @@ static unsigned int rgb_to_pixel16_dup(unsigned int r, unsigned int g, unsigned
return col; 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) static unsigned int rgb_to_pixel32_dup(unsigned int r, unsigned int g, unsigned b)
{ {
unsigned int col; unsigned int col;
@ -974,7 +992,7 @@ static int update_basic_params(VGAState *s)
return full_update; return full_update;
} }
#define NB_DEPTHS 5 #define NB_DEPTHS 7
static inline int get_depth_index(DisplayState *s) static inline int get_depth_index(DisplayState *s)
{ {
@ -983,9 +1001,15 @@ static inline int get_depth_index(DisplayState *s)
case 8: case 8:
return 0; return 0;
case 15: case 15:
return 1; if (s->bgr)
return 5;
else
return 1;
case 16: case 16:
return 2; if (s->bgr)
return 6;
else
return 2;
case 32: case 32:
if (s->bgr) if (s->bgr)
return 4; return 4;
@ -1000,6 +1024,8 @@ static vga_draw_glyph8_func *vga_draw_glyph8_table[NB_DEPTHS] = {
vga_draw_glyph8_16, vga_draw_glyph8_16,
vga_draw_glyph8_32, vga_draw_glyph8_32,
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] = { 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_16,
vga_draw_glyph16_32, vga_draw_glyph16_32,
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] = { 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_16,
vga_draw_glyph9_32, vga_draw_glyph9_32,
vga_draw_glyph9_32, vga_draw_glyph9_32,
vga_draw_glyph9_16,
vga_draw_glyph9_16,
}; };
static const uint8_t cursor_glyph[32 * 4] = { 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_16,
vga_draw_line2_32, vga_draw_line2_32,
vga_draw_line2_32, vga_draw_line2_32,
vga_draw_line2_16,
vga_draw_line2_16,
vga_draw_line2d2_8, vga_draw_line2d2_8,
vga_draw_line2d2_16, vga_draw_line2d2_16,
vga_draw_line2d2_16, vga_draw_line2d2_16,
vga_draw_line2d2_32, vga_draw_line2d2_32,
vga_draw_line2d2_32, vga_draw_line2d2_32,
vga_draw_line2d2_16,
vga_draw_line2d2_16,
vga_draw_line4_8, vga_draw_line4_8,
vga_draw_line4_16, vga_draw_line4_16,
vga_draw_line4_16, vga_draw_line4_16,
vga_draw_line4_32, vga_draw_line4_32,
vga_draw_line4_32, vga_draw_line4_32,
vga_draw_line4_16,
vga_draw_line4_16,
vga_draw_line4d2_8, vga_draw_line4d2_8,
vga_draw_line4d2_16, vga_draw_line4d2_16,
vga_draw_line4d2_16, vga_draw_line4d2_16,
vga_draw_line4d2_32, vga_draw_line4d2_32,
vga_draw_line4d2_32, vga_draw_line4d2_32,
vga_draw_line4d2_16,
vga_draw_line4d2_16,
vga_draw_line8d2_8, vga_draw_line8d2_8,
vga_draw_line8d2_16, vga_draw_line8d2_16,
vga_draw_line8d2_16, vga_draw_line8d2_16,
vga_draw_line8d2_32, vga_draw_line8d2_32,
vga_draw_line8d2_32, vga_draw_line8d2_32,
vga_draw_line8d2_16,
vga_draw_line8d2_16,
vga_draw_line8_8, vga_draw_line8_8,
vga_draw_line8_16, vga_draw_line8_16,
vga_draw_line8_16, vga_draw_line8_16,
vga_draw_line8_32, vga_draw_line8_32,
vga_draw_line8_32, vga_draw_line8_32,
vga_draw_line8_16,
vga_draw_line8_16,
vga_draw_line15_8, vga_draw_line15_8,
vga_draw_line15_15, vga_draw_line15_15,
vga_draw_line15_16, vga_draw_line15_16,
vga_draw_line15_32, vga_draw_line15_32,
vga_draw_line15_32bgr, vga_draw_line15_32bgr,
vga_draw_line15_15bgr,
vga_draw_line15_16bgr,
vga_draw_line16_8, vga_draw_line16_8,
vga_draw_line16_15, vga_draw_line16_15,
vga_draw_line16_16, vga_draw_line16_16,
vga_draw_line16_32, vga_draw_line16_32,
vga_draw_line16_32bgr, vga_draw_line16_32bgr,
vga_draw_line16_15bgr,
vga_draw_line16_16bgr,
vga_draw_line24_8, vga_draw_line24_8,
vga_draw_line24_15, vga_draw_line24_15,
vga_draw_line24_16, vga_draw_line24_16,
vga_draw_line24_32, vga_draw_line24_32,
vga_draw_line24_32bgr, vga_draw_line24_32bgr,
vga_draw_line24_15bgr,
vga_draw_line24_16bgr,
vga_draw_line32_8, vga_draw_line32_8,
vga_draw_line32_15, vga_draw_line32_15,
vga_draw_line32_16, vga_draw_line32_16,
vga_draw_line32_32, vga_draw_line32_32,
vga_draw_line32_32bgr, 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); 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_pixel16_dup,
rgb_to_pixel32_dup, rgb_to_pixel32_dup,
rgb_to_pixel32bgr_dup, rgb_to_pixel32bgr_dup,
rgb_to_pixel15bgr_dup,
rgb_to_pixel16bgr_dup,
}; };
static int vga_get_bpp(VGAState *s) static int vga_get_bpp(VGAState *s)

2
sdl.c
View File

@ -87,7 +87,7 @@ static void sdl_resize(DisplayState *ds, int w, int h)
ds->data = screen->pixels; ds->data = screen->pixels;
ds->linesize = screen->pitch; ds->linesize = screen->pitch;
ds->depth = screen->format->BitsPerPixel; ds->depth = screen->format->BitsPerPixel;
if (ds->depth == 32 && screen->format->Rshift == 0) { if (screen->format->Bshift > screen->format->Rshift) {
ds->bgr = 1; ds->bgr = 1;
} else { } else {
ds->bgr = 0; ds->bgr = 0;