[Scummvm-cvs-logs] SF.net SVN: scummvm:[34066] scummvm/branches/branch-0-12-0/engines/cine

buddha_ at users.sourceforge.net buddha_ at users.sourceforge.net
Wed Aug 20 19:52:37 CEST 2008


Revision: 34066
          http://scummvm.svn.sourceforge.net/scummvm/?rev=34066&view=rev
Author:   buddha_
Date:     2008-08-20 17:52:36 +0000 (Wed, 20 Aug 2008)

Log Message:
-----------
Backport of r34065: Fix font loading:
Fixes bug #2058539: OS: Assert starting demo (regression).
May possibly also fix bug #2019344: FW: crash with Amiga Italian version (photocopy room),
but not sure about that because I couldn't reproduce the bug myself.
- Also removed textDataPtr as it was unnecessary.

Modified Paths:
--------------
    scummvm/branches/branch-0-12-0/engines/cine/cine.cpp
    scummvm/branches/branch-0-12-0/engines/cine/gfx.cpp
    scummvm/branches/branch-0-12-0/engines/cine/texte.cpp
    scummvm/branches/branch-0-12-0/engines/cine/texte.h

Modified: scummvm/branches/branch-0-12-0/engines/cine/cine.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/cine/cine.cpp	2008-08-20 17:31:35 UTC (rev 34065)
+++ scummvm/branches/branch-0-12-0/engines/cine/cine.cpp	2008-08-20 17:52:36 UTC (rev 34066)
@@ -76,7 +76,6 @@
 
 	free(palPtr);
 	free(partBuffer);
-	free(textDataPtr);
 }
 
 int CineEngine::init() {
@@ -122,7 +121,6 @@
 	}
 
 	page3Raw = new byte[320 * 200];
-	textDataPtr = (byte *)malloc(8000);
 
 	partBuffer = (PartBuffer *)malloc(NUM_MAX_PARTDATA * sizeof(PartBuffer));
 
@@ -130,7 +128,7 @@
 		readVolCnf();
 	}
 
-	loadTextData("texte.dat", textDataPtr);
+	loadTextData("texte.dat");
 
 	if (g_cine->getGameType() == Cine::GType_OS && !(g_cine->getFeatures() & GF_DEMO)) {
 		loadPoldatDat("poldat.dat");

Modified: scummvm/branches/branch-0-12-0/engines/cine/gfx.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/cine/gfx.cpp	2008-08-20 17:31:35 UTC (rev 34065)
+++ scummvm/branches/branch-0-12-0/engines/cine/gfx.cpp	2008-08-20 17:52:36 UTC (rev 34066)
@@ -340,7 +340,7 @@
 		x += 5;
 	} else if ((width = fontParamTable[(unsigned char)character].characterWidth)) {
 		idx = fontParamTable[(unsigned char)character].characterIdx;
-		drawSpriteRaw(g_cine->_textHandler.textTable[idx][0], g_cine->_textHandler.textTable[idx][1], 16, 8, _backBuffer, x, y);
+		drawSpriteRaw(g_cine->_textHandler.textTable[idx][FONT_DATA], g_cine->_textHandler.textTable[idx][FONT_MASK], FONT_WIDTH, FONT_HEIGHT, _backBuffer, x, y);
 		x += width + 1;
 	}
 
@@ -944,7 +944,7 @@
 		x += 5;
 	} else if ((width = fontParamTable[(unsigned char)character].characterWidth)) {
 		idx = fontParamTable[(unsigned char)character].characterIdx;
-		drawSpriteRaw2(g_cine->_textHandler.textTable[idx][0], 0, 16, 8, _backBuffer, x, y);
+		drawSpriteRaw2(g_cine->_textHandler.textTable[idx][FONT_DATA], 0, FONT_WIDTH, FONT_HEIGHT, _backBuffer, x, y);
 		x += width + 1;
 	}
 

Modified: scummvm/branches/branch-0-12-0/engines/cine/texte.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/cine/texte.cpp	2008-08-20 17:31:35 UTC (rev 34065)
+++ scummvm/branches/branch-0-12-0/engines/cine/texte.cpp	2008-08-20 17:52:36 UTC (rev 34066)
@@ -29,8 +29,6 @@
 
 namespace Cine {
 
-byte *textDataPtr;
-
 const char **failureMessages;
 const CommandeType *defaultActionCommand;
 const CommandeType *systemMenu;
@@ -40,54 +38,46 @@
 
 void generateMask(const byte *sprite, byte *mask, uint16 size, byte transparency);
 
-void loadTextData(const char *pFileName, byte *pDestinationBuffer) {
-	Common::File pFileHandle;
-	uint16 entrySize;
-	uint16 numEntry;
-	uint16 i;
-	byte *tempBuffer;
-	uint16 dataSize;
+/*! \brief Loads font data from the given file.
+ * The number of characters used in the font varies between game versions:
+ * 78 (Most PC, Amiga and Atari ST versions of Future Wars, but also Operation Stealth's Amiga demo),
+ * 85 (All observed versions of German Future Wars (Amiga and PC), possibly Spanish Future Wars too),
+ * 90 (Most PC, Amiga and Atari ST versions of Operation Stealth),
+ * 93 (All observed versions of German Operation Stealth (Amiga and PC)).
+ */
+void loadTextData(const char *filename) {
+	Common::File fileHandle;
+	assert(filename);
 
-	assert(pFileName);
-	assert(pDestinationBuffer);
+	if (!fileHandle.open(filename))
+		error("loadTextData(): Cannot open file %s", filename);
 
-	if (!pFileHandle.open(pFileName))
-		error("loadTextData(): Cannot open file %s", pFileName);
+	static const uint headerSize = 2 + 2;              // The entry size (16-bit) and entry count (16-bit).
+	const uint entrySize = fileHandle.readUint16BE();  // Observed values: 8.
+	const uint entryCount = fileHandle.readUint16BE(); // Observed values: 624, 680, 720, 744.
+	const uint fontDataSize = entryCount * entrySize;  // Observed values: 4992, 5440, 5760, 5952.
+	const uint numChars = entryCount / entrySize;      // Observed values: 78, 85, 90, 93.
+	const uint bytesPerChar = fontDataSize / numChars; // Observed values: 64.
+	static const uint bytesPerRow = FONT_WIDTH / 2;    // The input font data is 4-bit so it takes only half the space
 
-	entrySize = pFileHandle.readUint16BE();
-	numEntry = pFileHandle.readUint16BE();
+	if (headerSize + fontDataSize != fileHandle.size()) {
+		warning("loadTextData: file '%s' (entrySize = %d, entryCount = %d) is of incorrect size %d", filename, entrySize, entryCount, fileHandle.size());
+	}
 
-	dataSize = numEntry * entrySize;
-	pFileHandle.read(pDestinationBuffer, numEntry * entrySize);
+	Common::Array<byte> source;
+	source.resize(fontDataSize);
+	fileHandle.read(source.begin(), fontDataSize);
 
-	tempBuffer = pDestinationBuffer;
-
 	if (g_cine->getGameType() == Cine::GType_FW) {
-		int numCharacters;
-		if (g_cine->getFeatures() & GF_ALT_FONT) {
-			numCharacters = 85;
-		} else {
-			numCharacters = 78;
-		}
+		loadRelatedPalette(filename);
+	}
 
-		dataSize = dataSize / numCharacters;
-
-		loadRelatedPalette(pFileName);
-
-		for (i = 0; i < numCharacters; i++) {
-			gfxConvertSpriteToRaw(g_cine->_textHandler.textTable[i][0], tempBuffer, 16, 8);
-			generateMask(g_cine->_textHandler.textTable[i][0], g_cine->_textHandler.textTable[i][1], 16 * 8, 0);
-			tempBuffer += dataSize;
-		}
-	} else {
-		for (i = 0; i < 90; i++) {
-			gfxConvertSpriteToRaw(g_cine->_textHandler.textTable[i][0], tempBuffer, 8, 8);
-			generateMask(g_cine->_textHandler.textTable[i][0], g_cine->_textHandler.textTable[i][1], 8 * 8, 0);
-			tempBuffer += 0x40;
-		}
+	for (uint i = 0; i < numChars; i++) {
+		gfxConvertSpriteToRaw(g_cine->_textHandler.textTable[i][FONT_DATA], &source[i * bytesPerChar], bytesPerRow, FONT_HEIGHT);
+		generateMask(g_cine->_textHandler.textTable[i][FONT_DATA], g_cine->_textHandler.textTable[i][FONT_MASK], FONT_WIDTH * FONT_HEIGHT, 0);
 	}
 
-	pFileHandle.close();
+	fileHandle.close();
 }
 
 const CharacterEntry *fontParamTable;

Modified: scummvm/branches/branch-0-12-0/engines/cine/texte.h
===================================================================
--- scummvm/branches/branch-0-12-0/engines/cine/texte.h	2008-08-20 17:31:35 UTC (rev 34065)
+++ scummvm/branches/branch-0-12-0/engines/cine/texte.h	2008-08-20 17:52:36 UTC (rev 34066)
@@ -33,10 +33,18 @@
 
 typedef char CommandeType[20];
 
-extern byte *textDataPtr;
+// Number of characters in a font
+#define NUM_FONT_CHARS 256
 
+#define FONT_WIDTH 16
+#define FONT_HEIGHT 8
+
+// Used for choosing between font's data and font's mask
+#define FONT_DATA 0
+#define FONT_MASK 1
+
 struct TextHandler {
-	byte textTable[256][2][16 * 8];
+	byte textTable[NUM_FONT_CHARS][2][FONT_WIDTH * FONT_HEIGHT];
 };
 
 extern const char **failureMessages;
@@ -53,7 +61,7 @@
 
 extern const CharacterEntry *fontParamTable;
 
-void loadTextData(const char *pFileName, byte *pDestinationBuffer);
+void loadTextData(const char *filename);
 void loadErrmessDat(const char *fname);
 void freeErrmessDat(void);
 void loadPoldatDat(const char *fname);


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