Commit b29169d2654776e749de91d65c720003ab4a2e66
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
Showing
4 changed files
with
74 additions
and
8 deletions
cocoa.m
@@ -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) |
sdl.c
@@ -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; |