[Scummvm-cvs-logs] SF.net SVN: scummvm:[41718] scummvm/trunk/engines/kyra

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sun Jun 21 03:14:57 CEST 2009


Revision: 41718
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41718&view=rev
Author:   lordhoto
Date:     2009-06-21 01:14:57 +0000 (Sun, 21 Jun 2009)

Log Message:
-----------
Prevent font code to draw characters not included in the font.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/screen.cpp
    scummvm/trunk/engines/kyra/screen.h

Modified: scummvm/trunk/engines/kyra/screen.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen.cpp	2009-06-20 21:20:39 UTC (rev 41717)
+++ scummvm/trunk/engines/kyra/screen.cpp	2009-06-21 01:14:57 UTC (rev 41718)
@@ -1003,11 +1003,13 @@
 		error("Invalid font data (file '%s', fontSig: %.04X)", filename, fontSig);
 
 	fnt->charWidthTable = fontData + READ_LE_UINT16(fontData + 8);
-	fnt->charSizeOffset = READ_LE_UINT16(fontData + 4);
+	fnt->fontDescOffset = READ_LE_UINT16(fontData + 4);
 	fnt->charBitmapOffset = READ_LE_UINT16(fontData + 6);
 	fnt->charWidthTableOffset = READ_LE_UINT16(fontData + 8);
 	fnt->charHeightTableOffset = READ_LE_UINT16(fontData + 0xC);
 
+	fnt->glyphCount = *(fnt->fontData + fnt->fontDescOffset + 3);
+
 	return true;
 }
 
@@ -1021,14 +1023,14 @@
 	// FIXME: add font support for amiga version
 	if (_vm->gameFlags().platform == Common::kPlatformAmiga)
 		return 0;
-	return *(_fonts[_currentFont].fontData + _fonts[_currentFont].charSizeOffset + 4);
+	return *(_fonts[_currentFont].fontData + _fonts[_currentFont].fontDescOffset + 4);
 }
 
 int Screen::getFontWidth() const {
 	// FIXME: add font support for amiga version
 	if (_vm->gameFlags().platform == Common::kPlatformAmiga)
 		return 0;
-	return *(_fonts[_currentFont].fontData + _fonts[_currentFont].charSizeOffset + 5);
+	return *(_fonts[_currentFont].fontData + _fonts[_currentFont].fontDescOffset + 5);
 }
 
 int Screen::getCharWidth(uint16 c) const {
@@ -1081,7 +1083,7 @@
 	setTextColor(cmap, 0, 1);
 
 	Font *fnt = &_fonts[_currentFont];
-	const uint8 charHeightFnt = *(fnt->fontData + fnt->charSizeOffset + 4);
+	const uint8 charHeightFnt = *(fnt->fontData + fnt->fontDescOffset + 4);
 	uint8 charHeight = 0;
 
 	if (x < 0)
@@ -1131,6 +1133,10 @@
 
 void Screen::drawCharANSI(uint8 c, int x, int y) {
 	Font *fnt = &_fonts[_currentFont];
+
+	if (c >= fnt->glyphCount)
+		return;
+
 	uint8 *dst = getPagePtr(_curPage) + y * SCREEN_W + x;
 
 	uint16 bitmapOffset = READ_LE_UINT16(fnt->fontData + fnt->charBitmapOffset + c * 2);
@@ -1138,15 +1144,16 @@
 		return;
 
 	uint8 charWidth = *(fnt->fontData + fnt->charWidthTableOffset + c);
-	if (charWidth + x > SCREEN_W)
+	if (!charWidth || charWidth + x > SCREEN_W)
 		return;
 
-	uint8 charH0 = *(fnt->fontData + fnt->charSizeOffset + 4);
-	if (charH0 + y > SCREEN_H)
+	uint8 charH0 = *(fnt->fontData + fnt->fontDescOffset + 4);
+	if (!charH0 || charH0 + y > SCREEN_H)
 		return;
 
 	uint8 charH1 = *(fnt->fontData + fnt->charHeightTableOffset + c * 2);
 	uint8 charH2 = *(fnt->fontData + fnt->charHeightTableOffset + c * 2 + 1);
+	
 	charH0 -= charH1 + charH2;
 
 	const uint8 *src = fnt->fontData + bitmapOffset;
@@ -1191,7 +1198,7 @@
 	}
 
 	if (_curPage == 0 || _curPage == 1)
-		addDirtyRect(x, y, charWidth, *(fnt->fontData + fnt->charSizeOffset + 4));
+		addDirtyRect(x, y, charWidth, *(fnt->fontData + fnt->fontDescOffset + 4));
 }
 
 void Screen::drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int sd, int flags, ...) {

Modified: scummvm/trunk/engines/kyra/screen.h
===================================================================
--- scummvm/trunk/engines/kyra/screen.h	2009-06-20 21:20:39 UTC (rev 41717)
+++ scummvm/trunk/engines/kyra/screen.h	2009-06-21 01:14:57 UTC (rev 41718)
@@ -53,10 +53,12 @@
 struct Font {
 	uint8 *fontData;
 	uint8 *charWidthTable;
-	uint16 charSizeOffset;
+	uint16 fontDescOffset;
 	uint16 charBitmapOffset;
 	uint16 charWidthTableOffset;
 	uint16 charHeightTableOffset;
+
+	uint8 glyphCount;
 };
 
 class Screen {


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