[Scummvm-cvs-logs] SF.net SVN: scummvm: [28529] scummvm/trunk/engines/parallaction
peres001 at users.sourceforge.net
peres001 at users.sourceforge.net
Sat Aug 11 16:26:12 CEST 2007
Revision: 28529
http://scummvm.svn.sourceforge.net/scummvm/?rev=28529&view=rev
Author: peres001
Date: 2007-08-11 07:26:12 -0700 (Sat, 11 Aug 2007)
Log Message:
-----------
Added preliminary font support for Big Red Adventure.
Modified Paths:
--------------
scummvm/trunk/engines/parallaction/disk.h
scummvm/trunk/engines/parallaction/disk_br.cpp
scummvm/trunk/engines/parallaction/font.cpp
Modified: scummvm/trunk/engines/parallaction/disk.h
===================================================================
--- scummvm/trunk/engines/parallaction/disk.h 2007-08-11 14:22:39 UTC (rev 28528)
+++ scummvm/trunk/engines/parallaction/disk.h 2007-08-11 14:26:12 UTC (rev 28529)
@@ -203,6 +203,7 @@
protected:
void errorFileNotFound(const char *s);
+ Font *createFont(const char *name, Common::ReadStream &stream);
public:
DosDisk_br(Parallaction *vm);
Modified: scummvm/trunk/engines/parallaction/disk_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk_br.cpp 2007-08-11 14:22:39 UTC (rev 28528)
+++ scummvm/trunk/engines/parallaction/disk_br.cpp 2007-08-11 14:26:12 UTC (rev 28529)
@@ -83,7 +83,15 @@
Font* DosDisk_br::loadFont(const char* name) {
debugC(5, kDebugDisk, "DosDisk_br::loadFont");
- return 0;
+
+ char path[PATH_LEN];
+ sprintf(path, "%s.fnt", name);
+
+ Common::File stream;
+ if (!stream.open(path))
+ errorFileNotFound(path);
+
+ return createFont(name, stream);
}
Modified: scummvm/trunk/engines/parallaction/font.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/font.cpp 2007-08-11 14:22:39 UTC (rev 28528)
+++ scummvm/trunk/engines/parallaction/font.cpp 2007-08-11 14:26:12 UTC (rev 28529)
@@ -34,6 +34,146 @@
extern byte _amigaTopazFont[];
+class BraFont : public Font {
+
+ byte *_cp;
+ uint _bufPitch;
+
+ uint32 _height;
+ byte _numGlyphs;
+
+ byte *_widths;
+ uint *_offsets;
+
+ byte *_data;
+
+ static byte _charMap[];
+
+ byte mapChar(byte c) {
+ return _charMap[c];
+ }
+
+public:
+ BraFont(Common::ReadStream &stream) {
+
+ _numGlyphs = stream.readByte();
+ _height = stream.readUint32BE();
+
+ _widths = (byte*)malloc(_numGlyphs);
+ stream.read(_widths, _numGlyphs);
+
+ _offsets = (uint*)malloc(_numGlyphs * sizeof(uint));
+ _offsets[0] = 0;
+ for (uint i = 1; i < _numGlyphs; i++)
+ _offsets[i] = _offsets[i-1] + _widths[i-1] * _height;
+
+ uint size = _offsets[_numGlyphs-1] + _widths[_numGlyphs-1] * _height;
+
+ _data = (byte*)malloc(size);
+ stream.read(_data, size);
+
+ }
+
+ ~BraFont() {
+ free(_widths);
+ free(_offsets);
+ free(_data);
+ }
+
+
+ uint32 getStringWidth(const char *s) {
+ uint32 len = 0;
+
+ while (*s) {
+ byte c = mapChar(*s);
+ len += (_widths[c] + 2);
+ s++;
+ }
+
+ return len;
+ }
+
+ uint16 height() {
+ return (uint16)_height;
+ }
+
+ uint16 drawChar(char c) {
+ assert(c < _numGlyphs);
+
+ byte *src = _data + _offsets[c];
+ byte *dst = _cp;
+ uint16 w = _widths[c];
+
+ for (uint16 j = 0; j < height(); j++) {
+ for (uint16 k = 0; k < w; k++) {
+
+ if (*src) {
+ *dst = (_color) ? _color : *src;
+ }
+
+ dst++;
+ src++;
+ }
+
+ dst += (_bufPitch - w);
+ }
+
+ return w + 2;
+
+ }
+
+ void drawString(byte* buffer, uint32 pitch, const char *s) {
+ if (s == NULL)
+ return;
+
+ _bufPitch = pitch;
+
+ _cp = buffer;
+ while (*s) {
+ byte c = mapChar(*s);
+ _cp += drawChar(c);
+ s++;
+ }
+ }
+
+};
+
+byte BraFont::_charMap[] = {
+// 0
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
+// 1
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
+// 2
+ 0x34, 0x49, 0x48, 0x34, 0x34, 0x34, 0x34, 0x47, 0x34, 0x34, 0x34, 0x34, 0x40, 0x34, 0x3F, 0x34,
+// 3
+ 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x46, 0x45, 0x34, 0x34, 0x34, 0x42,
+// 4
+ 0x34, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
+// 5
+ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x34, 0x34, 0x34, 0x34, 0x34,
+// 6
+ 0x34, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
+// 7
+ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34,
+// 8
+ 0x5E, 0x5D, 0x4E, 0x4B, 0x4D, 0x4C, 0x34, 0x5E, 0x4F, 0x51, 0x50, 0x34, 0x34, 0x34, 0x34, 0x34,
+// 9
+ 0x34, 0x34, 0x34, 0x57, 0x59, 0x58, 0x5B, 0x5C, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
+// A
+ 0x4A, 0x52, 0x34, 0x5A, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
+// B
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
+// C
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
+// D
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
+// E
+ 0x34, 0x5F, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
+// F
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34
+};
+
+
class DosFont : public Font {
protected:
@@ -430,19 +570,30 @@
return new AmigaFont(stream);
}
+Font *DosDisk_br::createFont(const char *name, Common::ReadStream &stream) {
+ printf("DosDisk_br::createFont(%s)\n", name);
+ return new BraFont(stream);
+}
+
+
void Gfx::initFonts() {
- if (_vm->getPlatform() == Common::kPlatformPC) {
- _fonts[kFontDialogue] = _vm->_disk->loadFont("comic");
- _fonts[kFontLabel] = _vm->_disk->loadFont("topaz");
- _fonts[kFontMenu] = _vm->_disk->loadFont("slide");
- } else {
- _fonts[kFontDialogue] = _vm->_disk->loadFont("comic");
+ if (_vm->getGameType() == GType_Nippon) {
+ if (_vm->getPlatform() == Common::kPlatformPC) {
+ _fonts[kFontDialogue] = _vm->_disk->loadFont("comic");
+ _fonts[kFontLabel] = _vm->_disk->loadFont("topaz");
+ _fonts[kFontMenu] = _vm->_disk->loadFont("slide");
+ } else {
+ _fonts[kFontDialogue] = _vm->_disk->loadFont("comic");
- Common::MemoryReadStream stream(_amigaTopazFont, 2600, false);
- _fonts[kFontLabel] = new AmigaFont(stream);
+ Common::MemoryReadStream stream(_amigaTopazFont, 2600, false);
+ _fonts[kFontLabel] = new AmigaFont(stream);
- _fonts[kFontMenu] = _vm->_disk->loadFont("slide");
+ _fonts[kFontMenu] = _vm->_disk->loadFont("slide");
+ }
+ } else
+ if (_vm->getGameType() == GType_BRA) {
+ _fonts[kFontMenu] = _vm->_disk->loadFont("russia");
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list