Commit 688ea2eb9b251c73c78a8b60c8d5800730927be2

Authored by blueswir1
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];
... ...