Ticket #8598: nut-renderer.diff
File nut-renderer.diff, 7.2 KB (added by , 17 years ago) |
---|
-
engines/scumm/smush/smush_font.cpp
30 30 namespace Scumm { 31 31 32 32 SmushFont::SmushFont(ScummEngine *vm, const char *filename, bool use_original_colors, bool new_colors) : 33 NutRenderer(vm, filename, false),33 NutRenderer(vm, filename, 8), 34 34 _color(-1), 35 35 _new_colors(new_colors), 36 36 _original(use_original_colors) { -
engines/scumm/charset.cpp
1621 1621 if (!_fr[id]) { 1622 1622 char fontname[11]; 1623 1623 sprintf(fontname, "font%d.nut", id); 1624 _fr[id] = new NutRenderer(_vm, fontname, true);1624 _fr[id] = new NutRenderer(_vm, fontname, 1); 1625 1625 } 1626 1626 _current = _fr[id]; 1627 1627 assert(_current); -
engines/scumm/nut_renderer.cpp
27 27 28 28 namespace Scumm { 29 29 30 NutRenderer::NutRenderer(ScummEngine *vm, const char *filename, b ool bitmap) :30 NutRenderer::NutRenderer(ScummEngine *vm, const char *filename, byte bpp) : 31 31 _vm(vm), 32 _b itmapFont(bitmap),32 _bpp(bpp), 33 33 _numChars(0), 34 34 _decodedData(0) { 35 35 memset(_chars, 0, sizeof(_chars)); … … 40 40 delete [] _decodedData; 41 41 } 42 42 43 void NutRenderer::write2Bits(byte *dst, byte bit, byte val) { 44 switch (val) { 45 case 0: // 00 46 break; 47 case 1: // 01 48 *dst |= (bit >> 1); 49 break; 50 case 224: // 10 51 *dst |= bit; 52 break; 53 case 225: // 11 54 *dst |= (bit | (bit >> 1)); 55 break; 56 default: 57 error("NutRenderer::write2Bits: Unexpected value %d\n", val); 58 } 59 } 60 61 byte NutRenderer::read2Bits(const byte *src, int offset) { 62 const byte val[] = { 0, 1, 224, 225 }; 63 byte bits = 0; 64 65 const byte *srcPtr = src + (offset / 4); 66 byte bit = 0x80 >> (2 * (offset % 4)); 67 68 if (*srcPtr & bit) 69 bits |= 2; 70 if (*srcPtr & (bit >> 1)) 71 bits |= 1; 72 73 return val[bits]; 74 } 75 43 76 void NutRenderer::codec1(byte *dst, const byte *src, int width, int height, int pitch) { 44 77 byte val, code; 45 78 int32 length; … … 57 90 if (code & 1) { 58 91 val = *src++; 59 92 size_line--; 60 if (_bitmapFont) { 61 for (int i = 0; i < length; i++) { 93 switch (_bpp) { 94 case 1: 95 while (length--) { 62 96 if (val) 63 97 *dst |= bit; 64 98 bit >>= 1; … … 67 101 dst++; 68 102 } 69 103 } 70 } else { 104 break; 105 case 2: 106 while (length--) { 107 write2Bits(dst, bit, val); 108 bit >>= 2; 109 if (!bit) { 110 bit = 0x80; 111 dst++; 112 } 113 } 114 break; 115 case 8: 71 116 if (val) 72 117 memset(dst, val, length); 73 118 dst += length; 119 break; 74 120 } 75 121 } else { 76 122 size_line -= length; 77 123 while (length--) { 78 124 val = *src++; 79 if (_bitmapFont) { 125 switch (_bpp) { 126 case 1: 80 127 if (val) 81 128 *dst |= bit; 82 129 bit >>= 1; … … 84 131 bit = 0x80; 85 132 dst++; 86 133 } 87 } else { 134 break; 135 case 2: 136 write2Bits(dst, bit, val); 137 bit >>= 2; 138 if (!bit) { 139 bit = 0x80; 140 dst++; 141 } 142 break; 143 case 8: 88 144 if (val) 89 145 *dst = val; 90 146 dst++; 147 break; 91 148 } 92 149 } 93 150 } … … 106 163 do { 107 164 int i; 108 165 int offs = READ_LE_UINT16(src); src += 2; 109 if (_bitmapFont) { 166 switch (_bpp) { 167 case 1: 168 case 2: 110 169 for (i = 0; i < offs; i++) { 111 bit >>= 1;170 bit >>= _bpp; 112 171 if (!bit) { 113 172 bit = 0x80; 114 173 dst++; 115 174 } 116 175 } 117 } else { 176 break; 177 case 8: 118 178 dst += offs; 179 break; 119 180 } 120 181 len -= offs; 121 182 if (len <= 0) { … … 130 191 // src bytes equal to 255 are replaced by 0 in dst 131 192 // src bytes equal to 1 are replaced by a color passed as an argument in the original function 132 193 // other src bytes values are copied as-is 133 if (_bitmapFont) { 194 switch (_bpp) { 195 case 1: 134 196 for (i = 0; i < w; i++) { 135 197 if (src[i]) 136 198 *dst |= bit; … … 140 202 dst++; 141 203 } 142 204 } 143 } else { 205 break; 206 case 2: 207 for (i = 0; i < w; i++) { 208 write2Bits(dst, bit, src[i]); 209 bit >>= 2; 210 if (!bit) { 211 bit = 0x80; 212 dst++; 213 } 214 } 215 break; 216 case 8: 144 217 memcpy(dst, src, w); 145 218 dst += w; 219 break; 146 220 } 147 221 src += w; 148 222 } while (len > 0); … … 185 259 offset += READ_BE_UINT32(dataSrc + offset + 4) + 16; 186 260 int width = READ_LE_UINT16(dataSrc + offset + 14); 187 261 int height = READ_LE_UINT16(dataSrc + offset + 16); 188 if (_bitmapFont) { 189 decodedLength += (((width + 7) / 8) * height); 190 } else { 191 decodedLength += (width * height); 192 } 262 decodedLength += (((_bpp * width + 7) / 8) * height); 193 263 } 194 264 195 265 // If characters have transparency, then bytes just get skipped and … … 220 290 _chars[l].height = READ_LE_UINT16(dataSrc + offset + 16); 221 291 _chars[l].src = decodedPtr; 222 292 223 int pitch ;293 int pitch = (_bpp * _chars[l].width + 7) / 8; 224 294 225 if (_bitmapFont) {226 pitch = (_chars[l].width + 7) / 8;227 } else {228 pitch = _chars[l].width;229 }230 231 295 decodedPtr += (pitch * _chars[l].height); 232 296 233 297 const uint8 *fobjptr = dataSrc + offset + 22; … … 302 366 } 303 367 304 368 void NutRenderer::drawFrame(byte *dst, int c, int x, int y) { 305 assert( !_bitmapFont);369 assert(_bpp == 8); 306 370 307 371 const int width = MIN((int)_chars[c].width, _vm->_screenWidth - x); 308 372 const int height = MIN((int)_chars[c].height, _vm->_screenHeight - y); … … 342 406 const byte *src = _chars[c].src; 343 407 int srcPitch; 344 408 345 if (_bitmapFont) { 346 srcPitch = (_chars[c].width + 7) / 8; 347 } else { 348 srcPitch = _chars[c].width; 349 } 409 srcPitch = (_bpp * _chars[c].width + 7) / 8; 350 410 351 411 const int minX = x < 0 ? -x : 0; 352 412 const int minY = y < 0 ? -y : 0; … … 364 424 int tx; 365 425 366 426 for (tx = minX; tx < width; tx++) { 367 if (_bitmapFont) { 427 switch (_bpp) { 428 case 1: 368 429 if (src[tx / 8] & (0x80 >> (tx % 8))) { 369 430 dst[tx] = color; 370 431 } 371 } else { 432 break; 433 case 2: 434 if (read2Bits(src, tx)) { 435 dst[tx] = color; 436 } 437 break; 438 case 8: 372 439 if (src[tx] != 0) { 373 440 dst[tx] = color; 374 441 } 442 break; 375 443 } 376 444 } 377 445 src += srcPitch; -
engines/scumm/nut_renderer.h
32 32 class NutRenderer { 33 33 protected: 34 34 ScummEngine *_vm; 35 b ool _bitmapFont;35 byte _bpp; 36 36 int _numChars; 37 37 byte *_decodedData; 38 38 struct { … … 41 41 byte *src; 42 42 } _chars[256]; 43 43 44 void write2Bits(byte *dst, byte bit, byte val); 45 byte read2Bits(const byte *src, int offset); 46 44 47 void codec1(byte *dst, const byte *src, int width, int height, int pitch); 45 48 void codec21(byte *dst, const byte *src, int width, int height, int pitch); 46 49 … … 50 53 void loadFont(const char *filename); 51 54 52 55 public: 53 NutRenderer(ScummEngine *vm, const char *filename, b ool bitmap);56 NutRenderer(ScummEngine *vm, const char *filename, byte bpp); 54 57 virtual ~NutRenderer(); 55 58 int getNumChars() const { return _numChars; } 56 59