[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