[Scummvm-cvs-logs] SF.net SVN: scummvm:[41454] scummvm/branches/gsoc2009-draci/engines/draci

dkasak13 at users.sourceforge.net dkasak13 at users.sourceforge.net
Thu Jun 11 22:31:36 CEST 2009


Revision: 41454
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41454&view=rev
Author:   dkasak13
Date:     2009-06-11 20:31:36 +0000 (Thu, 11 Jun 2009)

Log Message:
-----------
Implemented font handling via the DraciFont class. Reprogrammed the test animation to use the original game fonts. Removed the old drawString() hack.

Modified Paths:
--------------
    scummvm/branches/gsoc2009-draci/engines/draci/draci.cpp
    scummvm/branches/gsoc2009-draci/engines/draci/module.mk

Added Paths:
-----------
    scummvm/branches/gsoc2009-draci/engines/draci/font.cpp
    scummvm/branches/gsoc2009-draci/engines/draci/font.h

Modified: scummvm/branches/gsoc2009-draci/engines/draci/draci.cpp
===================================================================
--- scummvm/branches/gsoc2009-draci/engines/draci/draci.cpp	2009-06-11 18:32:35 UTC (rev 41453)
+++ scummvm/branches/gsoc2009-draci/engines/draci/draci.cpp	2009-06-11 20:31:36 UTC (rev 41454)
@@ -34,6 +34,7 @@
 #include "draci/draci.h"
 #include "draci/barchive.h"
 #include "draci/gpldisasm.h"
+#include "draci/font.h"
 
 namespace Draci {
 
@@ -57,17 +58,6 @@
 	syst->getEventManager()->registerRandomSource(_rnd, "draci");
 }
 
-void drawString(Graphics::Surface *surf, Common::String str, int x, int y, byte color) {
-	Graphics::ScummFont temp;
-	int curx = x;
-	const int space = 0;
-	uint len = str.size();
-	for (unsigned int i = 0; i < len; ++i) {
-		temp.drawChar(surf, str.c_str()[i], curx, y, color);
-		curx += temp.getCharWidth(str.c_str()[i]) + space;
-	}
-}
-
 int DraciEngine::init() {
 	// Initialize graphics using following:
 	initGraphics(320, 200, false);
@@ -129,18 +119,34 @@
 
 	_system->setPalette(palette, 0, 256);
 	
-	// Draw a test string
+	// Fill screen with white
+	_system->fillScreen(255);
+
+	// Draw big string
+	path = "Big.fon";	
+	DraciFont font(path);
+	Common::String testString = "Testing, testing, read all about it!";
 	Graphics::Surface *surf = _system->lockScreen();
-	drawString(surf, "Testing, testing, read all about it!", 5, 60, 3);
+	font.drawString(surf, testString, 
+		(320 - font.getStringWidth(testString, 1)) / 2, 130, 1);
+
+	// Draw small string
+	path = "Small.fon";
+	font.setFont(path);
+	testString = "I'm smaller than the font above me";
+	font.drawString(surf, testString, 
+		(320 - font.getStringWidth(testString, 1)) / 2, 150, 1);
 	_system->unlockScreen();
 
+	_system->updateScreen();
+
 	// Draw and animate the dragon
 	path = "OBR_AN.DFW";
 	ar.closeArchive();
 	ar.openArchive(path);
 
-	for (unsigned int t = 0; t < 25; ++t) {	
-		debugC(5, kDraciGeneralDebugLevel, "Drawing frame %d...", t); 	
+	for (unsigned int t = 0; t < 25; ++t) {
+		debugC(5, kDraciGeneralDebugLevel, "Drawing frame %d...", t);
 
 		// Load frame to memory
 		f = ar[t];
@@ -159,7 +165,7 @@
 				scr[j * w + i] = reader.readByte();
 			}
 		}
-		_system->copyRectToScreen(scr, w, 0, 0, w, h);
+		_system->copyRectToScreen(scr, w, (320 - w) / 2, 60, w, h);
 		_system->updateScreen();
 		_system->delayMillis(100);
 
@@ -168,6 +174,7 @@
 		// Free frame memory
 		delete[] scr;
 	}	
+
 	getchar();
 
 	return 0;

Added: scummvm/branches/gsoc2009-draci/engines/draci/font.cpp
===================================================================
--- scummvm/branches/gsoc2009-draci/engines/draci/font.cpp	                        (rev 0)
+++ scummvm/branches/gsoc2009-draci/engines/draci/font.cpp	2009-06-11 20:31:36 UTC (rev 41454)
@@ -0,0 +1,148 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/file.h"
+
+#include "draci/draci.h"
+#include "draci/font.h"
+
+namespace Draci {
+
+DraciFont::DraciFont(Common::String &filename) : 
+	_fontHeight(0), _maxCharWidth(0), 
+	_charWidths(NULL), _charData(0) { 
+	setFont(filename); 
+}
+
+DraciFont::~DraciFont() {
+	 freeFont(); 
+}
+
+bool DraciFont::setFont(Common::String &filename) {
+	
+	// If there is a font already loaded, free it
+	if (_charData) {
+		freeFont();
+	}
+
+	Common::File f;
+
+	f.open(filename);
+	if (f.isOpen()) {
+		debugC(6, kDraciGeneralDebugLevel, "Opened font file %s", 
+			filename.c_str());
+	} else {
+		debugC(6, kDraciGeneralDebugLevel, "Error opening font file %s", 
+			filename.c_str());
+		return false;
+	}
+
+	_maxCharWidth = f.readByte();
+	_fontHeight = f.readByte();
+
+	// Read in the widths of the glyphs	
+	_charWidths = new uint8[kCharNum];
+	for (unsigned int i = 0; i < kCharNum; ++i) {
+		_charWidths[i] = f.readByte();
+	}
+
+	// Calculate size of font data
+	unsigned int fontDataSize = kCharNum * _maxCharWidth * _fontHeight;
+
+	// Read in all glyphs
+	_charData = new byte[fontDataSize];
+	f.read(_charData, fontDataSize);
+
+	debugC(5, kDraciGeneralDebugLevel, "Font %s loaded", filename.c_str()); 
+
+	return true;
+}
+
+void DraciFont::freeFont() {
+	delete[] _charWidths;
+	delete[] _charData;
+}
+
+uint8 DraciFont::getCharWidth(uint8 chr) const {
+	return _charWidths[chr - kCharIndexOffset];
+}
+
+void DraciFont::drawChar(Graphics::Surface *dst, uint8 chr, int tx, int ty) const {
+	assert(dst != NULL);
+	byte *ptr = (byte *)dst->getBasePtr(tx, ty);
+	uint8 charIndex = chr - kCharIndexOffset;
+	int charOffset = charIndex * _fontHeight * _maxCharWidth;
+	uint8 currentWidth = _charWidths[charIndex];
+
+	for (uint8 y = 0; y < _fontHeight; ++y) {
+
+		// Check for vertical overflow
+		if (ty + y < 0 || ty + y >= dst->h) {
+			continue;
+		}
+
+		for (uint8 x = 0; x <= currentWidth; ++x) {
+			
+			// Check for horizontal overflow
+			if (tx + x < 0 || tx + x >= dst->w) {
+				continue;
+			}
+			
+			// Paint pixel
+			int curr = ((int)y) * _maxCharWidth + x;
+			ptr[x] = _charData[charOffset + curr];
+		}
+
+		// Advance to next row
+		ptr += dst->pitch;	
+	}
+}
+
+void DraciFont::drawString(Graphics::Surface *dst, Common::String str, 
+							int x, int y, int spacing) const {
+	assert(dst != NULL);	
+	int curx = x;
+	uint len = str.size();
+	for (unsigned int i = 0; i < len; ++i) {
+		drawChar(dst, str[i], curx, y);
+		curx += getCharWidth(str[i]) + spacing;
+	}
+}
+
+int DraciFont::getStringWidth(Common::String &str, int spacing) const {
+	int width = 0;	
+	uint len = str.size();
+	for (unsigned int i = 0; i < len; ++i) {
+		uint8 charIndex = str[i] - kCharIndexOffset;
+		width += _charWidths[charIndex];
+	}
+
+	// Add width of spaces, if any
+	width += (len - 1) * spacing;
+
+	return width;
+}
+
+} // End of namespace Draci


Property changes on: scummvm/branches/gsoc2009-draci/engines/draci/font.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Added: scummvm/branches/gsoc2009-draci/engines/draci/font.h
===================================================================
--- scummvm/branches/gsoc2009-draci/engines/draci/font.h	                        (rev 0)
+++ scummvm/branches/gsoc2009-draci/engines/draci/font.h	2009-06-11 20:31:36 UTC (rev 41454)
@@ -0,0 +1,59 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "graphics/font.h"
+
+namespace Draci {
+
+class DraciFont {
+	
+public: 
+	DraciFont(Common::String &filename);
+	~DraciFont();
+	bool setFont(Common::String &filename);
+	uint8 getFontHeight() const { return _fontHeight; };
+	uint8 getMaxCharWidth() const { return _maxCharWidth; };
+	uint8 getCharWidth(byte chr) const;
+	void drawChar(Graphics::Surface *dst, uint8 chr, int tx, int ty) const;
+	void drawString(Graphics::Surface *dst, Common::String str, 
+					int x, int y, int spacing = 0) const;
+	int getStringWidth(Common::String &str, int spacing = 0) const;
+
+private:
+	uint8 _fontHeight;
+	uint8 _maxCharWidth;
+	uint8 *_charWidths;
+	byte *_charData;
+	
+	// Number of glyphs in the font
+	static const unsigned int kCharNum = 138;
+
+	// Chars are indexed from the ASCII space (decimal value 32)
+	static const unsigned int kCharIndexOffset = 32;
+
+	void freeFont();
+};
+
+} // End of namespace Draci


Property changes on: scummvm/branches/gsoc2009-draci/engines/draci/font.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Modified: scummvm/branches/gsoc2009-draci/engines/draci/module.mk
===================================================================
--- scummvm/branches/gsoc2009-draci/engines/draci/module.mk	2009-06-11 18:32:35 UTC (rev 41453)
+++ scummvm/branches/gsoc2009-draci/engines/draci/module.mk	2009-06-11 20:31:36 UTC (rev 41454)
@@ -4,7 +4,8 @@
 	draci.o \
 	detection.o \
 	barchive.o \
-	gpldisasm.o
+	gpldisasm.o \
+	font.o
  
 MODULE_DIRS += \
 	engines/draci


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