[Scummvm-cvs-logs] CVS: scummvm/scumm nut_renderer.cpp,1.30,1.31 nut_renderer.h,1.12,1.13
Pawel Kolodziejski
aquadran at users.sourceforge.net
Sat Sep 6 09:43:05 CEST 2003
Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv7989
Modified Files:
nut_renderer.cpp nut_renderer.h
Log Message:
added support for codec1 in nut renderer
Index: nut_renderer.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/nut_renderer.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -d -r1.30 -r1.31
--- nut_renderer.cpp 7 Jun 2003 00:49:36 -0000 1.30
+++ nut_renderer.cpp 6 Sep 2003 16:42:28 -0000 1.31
@@ -21,6 +21,7 @@
#include "stdafx.h"
#include "scumm.h"
#include "nut_renderer.h"
+#include "bomp.h"
NutRenderer::NutRenderer(Scumm *vm) :
@@ -71,6 +72,37 @@
} while (length > 1);
}
+static void codec1(byte *dst, byte *src, int height) {
+ byte val, code;
+ int32 length;
+ int h = height, size_line;
+
+ for (h = 0; h < height; h++) {
+ size_line = READ_LE_UINT16(src);
+ src += 2;
+ while (size_line > 0) {
+ code = *src++;
+ size_line--;
+ length = (code >> 1) + 1;
+ if (code & 1) {
+ val = *src++;
+ size_line--;
+ if (val)
+ memset(dst, val, length);
+ dst += length;
+ } else {
+ size_line -= length;
+ while (length--) {
+ val = *src++;
+ if (val)
+ *dst = val;
+ dst++;
+ }
+ }
+ }
+ }
+}
+
bool NutRenderer::loadFont(const char *filename, const char *directory) {
debug(8, "NutRenderer::loadFont() called");
if (_loaded) {
@@ -104,13 +136,24 @@
_nbChars = READ_LE_UINT16(dataSrc + 10);
uint32 offset = READ_BE_UINT32(dataSrc + 4) + 8;
for (int l = 0; l < _nbChars; l++) {
- if (READ_BE_UINT32(dataSrc + offset) == 'FRME') {
- offset += 8;
+ if ((READ_BE_UINT32(dataSrc + offset) == 'FRME') || (READ_BE_UINT32(dataSrc + offset + 1) == 'FRME')) {
+ if (READ_BE_UINT32(dataSrc + offset) == 'FRME')
+ offset += 8;
+ else if (READ_BE_UINT32(dataSrc + offset + 1) == 'FRME') // hack for proper offset
+ offset += 9;
if (READ_BE_UINT32(dataSrc + offset) == 'FOBJ') {
+ int codec = READ_LE_UINT16(dataSrc + offset + 8);
+ _chars[l].xoffs = READ_LE_UINT16(dataSrc + offset + 10);
+ _chars[l].yoffs = READ_LE_UINT16(dataSrc + offset + 12);
_chars[l].width = READ_LE_UINT16(dataSrc + offset + 14);
_chars[l].height = READ_LE_UINT16(dataSrc + offset + 16);
_chars[l].src = new byte[_chars[l].width * _chars[l].height + 1000];
- decodeCodec44(_chars[l].src, dataSrc + offset + 22, READ_BE_UINT32(dataSrc + offset + 4) - 14);
+ if ((codec == 44) || (codec == 21))
+ decodeCodec44(_chars[l].src, dataSrc + offset + 22, READ_BE_UINT32(dataSrc + offset + 4) - 14);
+ else if (codec == 1) {
+ codec1(_chars[l].src, dataSrc + offset + 22, _chars[l].height);
+ } else
+ error("NutRenderer::loadFont: unknown codec: %d", codec);
offset += READ_BE_UINT32(dataSrc + offset + 4) + 8;
} else {
warning("NutRenderer::loadFont(%s, %s) there is no FOBJ chunk in FRME chunk %d (offset %x)", filename, directory, l, offset);
@@ -206,6 +249,26 @@
x -= offsetX[i];
y -= offsetY[i];
+ }
+}
+
+void NutRenderer::drawFrame(byte *dst, int c, int x, int y) {
+ const int width = _chars[c].width;
+ const int height = _chars[c].height;
+ const byte *src = _chars[c].src;
+ byte bits = 0;
+
+ dst += _vm->_screenWidth * y + x;
+ for (int ty = 0; ty < height; ty++) {
+ for (int tx = 0; tx < width; tx++) {
+ bits = *src++;
+ if (x + tx < 0 || x + tx >= _vm->_screenWidth || y + ty < 0 || y + ty >= _vm->_screenHeight)
+ continue;
+ if (bits != 231) {
+ dst[tx] = bits;
+ }
+ }
+ dst += _vm->_screenWidth;
}
}
Index: nut_renderer.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/nut_renderer.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- nut_renderer.h 4 Jul 2003 11:19:25 -0000 1.12
+++ nut_renderer.h 6 Sep 2003 16:42:28 -0000 1.13
@@ -32,6 +32,8 @@
bool _loaded;
int _nbChars;
struct {
+ int xoffs;
+ int yoffs;
int width;
int height;
byte *src;
@@ -39,15 +41,17 @@
void decodeCodec44(byte *dst, const byte *src, uint32 length);
- void draw2byte(byte *dst, byte *mask, int c, int x, int y, byte color);
void drawChar(byte *dst, byte *mask, byte c, int x, int y, byte color);
+ void draw2byte(byte *dst, byte *mask, int c, int x, int y, byte color);
public:
NutRenderer(Scumm *vm);
virtual ~NutRenderer();
+ int getNbChars() { return _nbChars; }
bool loadFont(const char *filename, const char *dir);
+ void drawFrame(byte *dst, int c, int x, int y);
void drawShadowChar(int c, int x, int y, byte color, bool useMask);
int getCharWidth(byte c);
More information about the Scummvm-git-logs
mailing list