[Scummvm-cvs-logs] SF.net SVN: scummvm:[42361] scummvm/trunk/engines/saga/font.cpp

wjpalenstijn at users.sourceforge.net wjpalenstijn at users.sourceforge.net
Sat Jul 11 02:47:32 CEST 2009


Revision: 42361
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42361&view=rev
Author:   wjpalenstijn
Date:     2009-07-11 00:47:32 +0000 (Sat, 11 Jul 2009)

Log Message:
-----------
Fix SAGA outline generation algorithm for characters
that are copies of earlier characters. (5 characters in IHNM.)
This fixes #1904624.

Modified Paths:
--------------
    scummvm/trunk/engines/saga/font.cpp

Modified: scummvm/trunk/engines/saga/font.cpp
===================================================================
--- scummvm/trunk/engines/saga/font.cpp	2009-07-11 00:38:50 UTC (rev 42360)
+++ scummvm/trunk/engines/saga/font.cpp	2009-07-11 00:47:32 UTC (rev 42361)
@@ -165,6 +165,25 @@
 			index += indexOffset;
 		}
 
+		bool skip = false;
+
+		if (i > 0 && font->normal.fontCharEntry[i].width != 0 && font->normal.fontCharEntry[i].index < font->normal.fontCharEntry[i-1].index) {
+			// Some characters are copies of earlier characters.
+			// Look up the original, and make sure not to grow the size of
+			// the outline font twice.
+			skip = true;
+			bool found = false;
+			for (int j = 0; j < i; j++) {
+				if (font->normal.fontCharEntry[i].index == font->normal.fontCharEntry[j].index) {
+					index = font->outline.fontCharEntry[j].index;
+					found = true;
+					break;
+				}
+			}
+			if (!found)
+				error("Invalid index backreference in font char %d", i);
+		}
+
 		font->outline.fontCharEntry[i].index = index;
 		font->outline.fontCharEntry[i].tracking = font->normal.fontCharEntry[i].tracking;
 		font->outline.fontCharEntry[i].flag = font->normal.fontCharEntry[i].flag;
@@ -173,14 +192,16 @@
 			newByteWidth = getByteLen(font->normal.fontCharEntry[i].width + 2);
 			oldByteWidth = getByteLen(font->normal.fontCharEntry[i].width);
 
-			if (newByteWidth > oldByteWidth) {
+			if (!skip && newByteWidth > oldByteWidth) {
 				indexOffset++;
 			}
 		}
 
 		font->outline.fontCharEntry[i].width = font->normal.fontCharEntry[i].width + 2;
 		font->outline.fontCharEntry[i].byteWidth = newByteWidth;
-		newRowLength += newByteWidth;
+
+		if (!skip)
+			newRowLength += newByteWidth;
 	}
 
 	debug(2, "New row length: %d", newRowLength);
@@ -196,6 +217,10 @@
 
 	// Generate outline font representation
 	for (i = 0; i < FONT_CHARCOUNT; i++) {
+		if (i > 0 && font->normal.fontCharEntry[i].index < font->normal.fontCharEntry[i-1].index) {
+			// Skip copies
+			continue;
+		}
 		for (row = 0; row < font->normal.header.charHeight; row++) {
 			for (currentByte = 0; currentByte < font->outline.fontCharEntry[i].byteWidth; currentByte++) {
 				basePointer = font->outline.font + font->outline.fontCharEntry[i].index + currentByte;


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