Fix 24 bit mode

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4937 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
blueswir1 2008-07-24 11:26:38 +00:00
parent 749ecd9953
commit 688ea2eb9b

View File

@ -124,19 +124,34 @@ static void tcx_draw_line8(TCXState *s1, uint8_t *d,
} }
} }
/*
XXX Could be much more optimal:
* detect if line/page/whole screen is in 24 bit mode
* if destination is also BGR, use memcpy
*/
static inline void tcx24_draw_line32(TCXState *s1, uint8_t *d, static inline void tcx24_draw_line32(TCXState *s1, uint8_t *d,
const uint8_t *s, int width, const uint8_t *s, int width,
const uint32_t *cplane, const uint32_t *cplane,
const uint32_t *s24) const uint32_t *s24)
{ {
int x; int x, bgr, r, g, b;
uint8_t val; uint8_t val, *p8;
uint32_t *p = (uint32_t *)d; uint32_t *p = (uint32_t *)d;
uint32_t dval; uint32_t dval;
bgr = s1->ds->bgr;
for(x = 0; x < width; x++, s++, s24++) { for(x = 0; x < width; x++, s++, s24++) {
if ((bswap32(*cplane++) & 0xff000000) == 0x03000000) { // 24-bit direct if ((be32_to_cpu(*cplane++) & 0xff000000) == 0x03000000) {
dval = bswap32(*s24) & 0x00ffffff; // 24-bit direct, BGR order
p8 = (uint8_t *)s24;
p8++;
b = *p8++;
g = *p8++;
r = *p8++;
if (bgr)
dval = rgb_to_pixel32bgr(r, g, b);
else
dval = rgb_to_pixel32(r, g, b);
} else { } else {
val = *s; val = *s;
dval = s1->palette[val]; dval = s1->palette[val];