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; |