Commit 688ea2eb9b251c73c78a8b60c8d5800730927be2
1 parent
749ecd99
Fix 24 bit mode
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4937 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
19 additions
and
4 deletions
hw/tcx.c
... | ... | @@ -124,19 +124,34 @@ static void tcx_draw_line8(TCXState *s1, uint8_t *d, |
124 | 124 | } |
125 | 125 | } |
126 | 126 | |
127 | +/* | |
128 | + XXX Could be much more optimal: | |
129 | + * detect if line/page/whole screen is in 24 bit mode | |
130 | + * if destination is also BGR, use memcpy | |
131 | + */ | |
127 | 132 | static inline void tcx24_draw_line32(TCXState *s1, uint8_t *d, |
128 | 133 | const uint8_t *s, int width, |
129 | 134 | const uint32_t *cplane, |
130 | 135 | const uint32_t *s24) |
131 | 136 | { |
132 | - int x; | |
133 | - uint8_t val; | |
137 | + int x, bgr, r, g, b; | |
138 | + uint8_t val, *p8; | |
134 | 139 | uint32_t *p = (uint32_t *)d; |
135 | 140 | uint32_t dval; |
136 | 141 | |
142 | + bgr = s1->ds->bgr; | |
137 | 143 | for(x = 0; x < width; x++, s++, s24++) { |
138 | - if ((bswap32(*cplane++) & 0xff000000) == 0x03000000) { // 24-bit direct | |
139 | - dval = bswap32(*s24) & 0x00ffffff; | |
144 | + if ((be32_to_cpu(*cplane++) & 0xff000000) == 0x03000000) { | |
145 | + // 24-bit direct, BGR order | |
146 | + p8 = (uint8_t *)s24; | |
147 | + p8++; | |
148 | + b = *p8++; | |
149 | + g = *p8++; | |
150 | + r = *p8++; | |
151 | + if (bgr) | |
152 | + dval = rgb_to_pixel32bgr(r, g, b); | |
153 | + else | |
154 | + dval = rgb_to_pixel32(r, g, b); | |
140 | 155 | } else { |
141 | 156 | val = *s; |
142 | 157 | dval = s1->palette[val]; | ... | ... |