Commit b29169d2654776e749de91d65c720003ab4a2e66

Authored by blueswir1
1 parent 94470844

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
@@ -164,7 +164,12 @@ static void cocoa_resize(DisplayState *ds, int w, int h) @@ -164,7 +164,12 @@ static void cocoa_resize(DisplayState *ds, int w, int h)
164 ds->depth = device_bpp; 164 ds->depth = device_bpp;
165 ds->width = w; 165 ds->width = w;
166 ds->height = h; 166 ds->height = h;
167 - 167 +#ifdef __LITTLE_ENDIAN__
  168 + ds->bgr = 1;
  169 +#else
  170 + ds->bgr = 0;
  171 +#endif
  172 +
168 current_ds = *ds; 173 current_ds = *ds;
169 } 174 }
170 175
hw/tcx.c
@@ -58,13 +58,22 @@ static void update_palette_entries(TCXState *s, int start, int end) @@ -58,13 +58,22 @@ static void update_palette_entries(TCXState *s, int start, int end)
58 s->palette[i] = rgb_to_pixel8(s->r[i], s->g[i], s->b[i]); 58 s->palette[i] = rgb_to_pixel8(s->r[i], s->g[i], s->b[i]);
59 break; 59 break;
60 case 15: 60 case 15:
61 - s->palette[i] = rgb_to_pixel15(s->r[i], s->g[i], s->b[i]); 61 + if (s->ds->bgr)
  62 + s->palette[i] = rgb_to_pixel15bgr(s->r[i], s->g[i], s->b[i]);
  63 + else
  64 + s->palette[i] = rgb_to_pixel15(s->r[i], s->g[i], s->b[i]);
62 break; 65 break;
63 case 16: 66 case 16:
64 - s->palette[i] = rgb_to_pixel16(s->r[i], s->g[i], s->b[i]); 67 + if (s->ds->bgr)
  68 + s->palette[i] = rgb_to_pixel16bgr(s->r[i], s->g[i], s->b[i]);
  69 + else
  70 + s->palette[i] = rgb_to_pixel16(s->r[i], s->g[i], s->b[i]);
65 break; 71 break;
66 case 32: 72 case 32:
67 - s->palette[i] = rgb_to_pixel32(s->r[i], s->g[i], s->b[i]); 73 + if (s->ds->bgr)
  74 + s->palette[i] = rgb_to_pixel32bgr(s->r[i], s->g[i], s->b[i]);
  75 + else
  76 + s->palette[i] = rgb_to_pixel32(s->r[i], s->g[i], s->b[i]);
68 break; 77 break;
69 } 78 }
70 } 79 }
hw/vga.c
@@ -846,6 +846,15 @@ static unsigned int rgb_to_pixel15_dup(unsigned int r, unsigned int g, unsigned @@ -846,6 +846,15 @@ static unsigned int rgb_to_pixel15_dup(unsigned int r, unsigned int g, unsigned
846 return col; 846 return col;
847 } 847 }
848 848
  849 +static unsigned int rgb_to_pixel15bgr_dup(unsigned int r, unsigned int g,
  850 + unsigned int b)
  851 +{
  852 + unsigned int col;
  853 + col = rgb_to_pixel15bgr(r, g, b);
  854 + col |= col << 16;
  855 + return col;
  856 +}
  857 +
849 static unsigned int rgb_to_pixel16_dup(unsigned int r, unsigned int g, unsigned b) 858 static unsigned int rgb_to_pixel16_dup(unsigned int r, unsigned int g, unsigned b)
850 { 859 {
851 unsigned int col; 860 unsigned int col;
@@ -854,6 +863,15 @@ static unsigned int rgb_to_pixel16_dup(unsigned int r, unsigned int g, unsigned @@ -854,6 +863,15 @@ static unsigned int rgb_to_pixel16_dup(unsigned int r, unsigned int g, unsigned
854 return col; 863 return col;
855 } 864 }
856 865
  866 +static unsigned int rgb_to_pixel16bgr_dup(unsigned int r, unsigned int g,
  867 + unsigned int b)
  868 +{
  869 + unsigned int col;
  870 + col = rgb_to_pixel16bgr(r, g, b);
  871 + col |= col << 16;
  872 + return col;
  873 +}
  874 +
857 static unsigned int rgb_to_pixel32_dup(unsigned int r, unsigned int g, unsigned b) 875 static unsigned int rgb_to_pixel32_dup(unsigned int r, unsigned int g, unsigned b)
858 { 876 {
859 unsigned int col; 877 unsigned int col;
@@ -974,7 +992,7 @@ static int update_basic_params(VGAState *s) @@ -974,7 +992,7 @@ static int update_basic_params(VGAState *s)
974 return full_update; 992 return full_update;
975 } 993 }
976 994
977 -#define NB_DEPTHS 5 995 +#define NB_DEPTHS 7
978 996
979 static inline int get_depth_index(DisplayState *s) 997 static inline int get_depth_index(DisplayState *s)
980 { 998 {
@@ -983,9 +1001,15 @@ static inline int get_depth_index(DisplayState *s) @@ -983,9 +1001,15 @@ static inline int get_depth_index(DisplayState *s)
983 case 8: 1001 case 8:
984 return 0; 1002 return 0;
985 case 15: 1003 case 15:
986 - return 1; 1004 + if (s->bgr)
  1005 + return 5;
  1006 + else
  1007 + return 1;
987 case 16: 1008 case 16:
988 - return 2; 1009 + if (s->bgr)
  1010 + return 6;
  1011 + else
  1012 + return 2;
989 case 32: 1013 case 32:
990 if (s->bgr) 1014 if (s->bgr)
991 return 4; 1015 return 4;
@@ -1000,6 +1024,8 @@ static vga_draw_glyph8_func *vga_draw_glyph8_table[NB_DEPTHS] = { @@ -1000,6 +1024,8 @@ static vga_draw_glyph8_func *vga_draw_glyph8_table[NB_DEPTHS] = {
1000 vga_draw_glyph8_16, 1024 vga_draw_glyph8_16,
1001 vga_draw_glyph8_32, 1025 vga_draw_glyph8_32,
1002 vga_draw_glyph8_32, 1026 vga_draw_glyph8_32,
  1027 + vga_draw_glyph8_16,
  1028 + vga_draw_glyph8_16,
1003 }; 1029 };
1004 1030
1005 static vga_draw_glyph8_func *vga_draw_glyph16_table[NB_DEPTHS] = { 1031 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] = { @@ -1008,6 +1034,8 @@ static vga_draw_glyph8_func *vga_draw_glyph16_table[NB_DEPTHS] = {
1008 vga_draw_glyph16_16, 1034 vga_draw_glyph16_16,
1009 vga_draw_glyph16_32, 1035 vga_draw_glyph16_32,
1010 vga_draw_glyph16_32, 1036 vga_draw_glyph16_32,
  1037 + vga_draw_glyph16_16,
  1038 + vga_draw_glyph16_16,
1011 }; 1039 };
1012 1040
1013 static vga_draw_glyph9_func *vga_draw_glyph9_table[NB_DEPTHS] = { 1041 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] = { @@ -1016,6 +1044,8 @@ static vga_draw_glyph9_func *vga_draw_glyph9_table[NB_DEPTHS] = {
1016 vga_draw_glyph9_16, 1044 vga_draw_glyph9_16,
1017 vga_draw_glyph9_32, 1045 vga_draw_glyph9_32,
1018 vga_draw_glyph9_32, 1046 vga_draw_glyph9_32,
  1047 + vga_draw_glyph9_16,
  1048 + vga_draw_glyph9_16,
1019 }; 1049 };
1020 1050
1021 static const uint8_t cursor_glyph[32 * 4] = { 1051 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] = { @@ -1236,60 +1266,80 @@ static vga_draw_line_func *vga_draw_line_table[NB_DEPTHS * VGA_DRAW_LINE_NB] = {
1236 vga_draw_line2_16, 1266 vga_draw_line2_16,
1237 vga_draw_line2_32, 1267 vga_draw_line2_32,
1238 vga_draw_line2_32, 1268 vga_draw_line2_32,
  1269 + vga_draw_line2_16,
  1270 + vga_draw_line2_16,
1239 1271
1240 vga_draw_line2d2_8, 1272 vga_draw_line2d2_8,
1241 vga_draw_line2d2_16, 1273 vga_draw_line2d2_16,
1242 vga_draw_line2d2_16, 1274 vga_draw_line2d2_16,
1243 vga_draw_line2d2_32, 1275 vga_draw_line2d2_32,
1244 vga_draw_line2d2_32, 1276 vga_draw_line2d2_32,
  1277 + vga_draw_line2d2_16,
  1278 + vga_draw_line2d2_16,
1245 1279
1246 vga_draw_line4_8, 1280 vga_draw_line4_8,
1247 vga_draw_line4_16, 1281 vga_draw_line4_16,
1248 vga_draw_line4_16, 1282 vga_draw_line4_16,
1249 vga_draw_line4_32, 1283 vga_draw_line4_32,
1250 vga_draw_line4_32, 1284 vga_draw_line4_32,
  1285 + vga_draw_line4_16,
  1286 + vga_draw_line4_16,
1251 1287
1252 vga_draw_line4d2_8, 1288 vga_draw_line4d2_8,
1253 vga_draw_line4d2_16, 1289 vga_draw_line4d2_16,
1254 vga_draw_line4d2_16, 1290 vga_draw_line4d2_16,
1255 vga_draw_line4d2_32, 1291 vga_draw_line4d2_32,
1256 vga_draw_line4d2_32, 1292 vga_draw_line4d2_32,
  1293 + vga_draw_line4d2_16,
  1294 + vga_draw_line4d2_16,
1257 1295
1258 vga_draw_line8d2_8, 1296 vga_draw_line8d2_8,
1259 vga_draw_line8d2_16, 1297 vga_draw_line8d2_16,
1260 vga_draw_line8d2_16, 1298 vga_draw_line8d2_16,
1261 vga_draw_line8d2_32, 1299 vga_draw_line8d2_32,
1262 vga_draw_line8d2_32, 1300 vga_draw_line8d2_32,
  1301 + vga_draw_line8d2_16,
  1302 + vga_draw_line8d2_16,
1263 1303
1264 vga_draw_line8_8, 1304 vga_draw_line8_8,
1265 vga_draw_line8_16, 1305 vga_draw_line8_16,
1266 vga_draw_line8_16, 1306 vga_draw_line8_16,
1267 vga_draw_line8_32, 1307 vga_draw_line8_32,
1268 vga_draw_line8_32, 1308 vga_draw_line8_32,
  1309 + vga_draw_line8_16,
  1310 + vga_draw_line8_16,
1269 1311
1270 vga_draw_line15_8, 1312 vga_draw_line15_8,
1271 vga_draw_line15_15, 1313 vga_draw_line15_15,
1272 vga_draw_line15_16, 1314 vga_draw_line15_16,
1273 vga_draw_line15_32, 1315 vga_draw_line15_32,
1274 vga_draw_line15_32bgr, 1316 vga_draw_line15_32bgr,
  1317 + vga_draw_line15_15bgr,
  1318 + vga_draw_line15_16bgr,
1275 1319
1276 vga_draw_line16_8, 1320 vga_draw_line16_8,
1277 vga_draw_line16_15, 1321 vga_draw_line16_15,
1278 vga_draw_line16_16, 1322 vga_draw_line16_16,
1279 vga_draw_line16_32, 1323 vga_draw_line16_32,
1280 vga_draw_line16_32bgr, 1324 vga_draw_line16_32bgr,
  1325 + vga_draw_line16_15bgr,
  1326 + vga_draw_line16_16bgr,
1281 1327
1282 vga_draw_line24_8, 1328 vga_draw_line24_8,
1283 vga_draw_line24_15, 1329 vga_draw_line24_15,
1284 vga_draw_line24_16, 1330 vga_draw_line24_16,
1285 vga_draw_line24_32, 1331 vga_draw_line24_32,
1286 vga_draw_line24_32bgr, 1332 vga_draw_line24_32bgr,
  1333 + vga_draw_line24_15bgr,
  1334 + vga_draw_line24_16bgr,
1287 1335
1288 vga_draw_line32_8, 1336 vga_draw_line32_8,
1289 vga_draw_line32_15, 1337 vga_draw_line32_15,
1290 vga_draw_line32_16, 1338 vga_draw_line32_16,
1291 vga_draw_line32_32, 1339 vga_draw_line32_32,
1292 vga_draw_line32_32bgr, 1340 vga_draw_line32_32bgr,
  1341 + vga_draw_line32_15bgr,
  1342 + vga_draw_line32_16bgr,
1293 }; 1343 };
1294 1344
1295 typedef unsigned int rgb_to_pixel_dup_func(unsigned int r, unsigned int g, unsigned b); 1345 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] = { @@ -1300,6 +1350,8 @@ static rgb_to_pixel_dup_func *rgb_to_pixel_dup_table[NB_DEPTHS] = {
1300 rgb_to_pixel16_dup, 1350 rgb_to_pixel16_dup,
1301 rgb_to_pixel32_dup, 1351 rgb_to_pixel32_dup,
1302 rgb_to_pixel32bgr_dup, 1352 rgb_to_pixel32bgr_dup,
  1353 + rgb_to_pixel15bgr_dup,
  1354 + rgb_to_pixel16bgr_dup,
1303 }; 1355 };
1304 1356
1305 static int vga_get_bpp(VGAState *s) 1357 static int vga_get_bpp(VGAState *s)
@@ -87,7 +87,7 @@ static void sdl_resize(DisplayState *ds, int w, int h) @@ -87,7 +87,7 @@ static void sdl_resize(DisplayState *ds, int w, int h)
87 ds->data = screen->pixels; 87 ds->data = screen->pixels;
88 ds->linesize = screen->pitch; 88 ds->linesize = screen->pitch;
89 ds->depth = screen->format->BitsPerPixel; 89 ds->depth = screen->format->BitsPerPixel;
90 - if (ds->depth == 32 && screen->format->Rshift == 0) { 90 + if (screen->format->Bshift > screen->format->Rshift) {
91 ds->bgr = 1; 91 ds->bgr = 1;
92 } else { 92 } else {
93 ds->bgr = 0; 93 ds->bgr = 0;