[Scummvm-git-logs] scummvm master -> ab46dae8d731f4fa7171505a85c5304ee0585060

bgK bastien.bouclet at gmail.com
Sat Aug 11 08:57:04 CEST 2018


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
ab46dae8d7 MOHAWK: RIVEN: Rework font loading so the TTF font is not leaked


Commit: ab46dae8d731f4fa7171505a85c5304ee0585060
    https://github.com/scummvm/scummvm/commit/ab46dae8d731f4fa7171505a85c5304ee0585060
Author: Bastien Bouclet (bastien.bouclet at gmail.com)
Date: 2018-08-11T08:58:12+02:00

Commit Message:
MOHAWK: RIVEN: Rework font loading so the TTF font is not leaked

Changed paths:
    engines/mohawk/riven_graphics.cpp
    engines/mohawk/riven_graphics.h
    engines/mohawk/riven_stacks/aspit.cpp


diff --git a/engines/mohawk/riven_graphics.cpp b/engines/mohawk/riven_graphics.cpp
index cc5105b..ac42b12 100644
--- a/engines/mohawk/riven_graphics.cpp
+++ b/engines/mohawk/riven_graphics.cpp
@@ -29,7 +29,12 @@
 #include "mohawk/riven_video.h"
 
 #include "common/system.h"
+
 #include "engines/util.h"
+
+#include "graphics/fontman.h"
+#include "graphics/font.h"
+#include "graphics/fonts/ttf.h"
 #include "graphics/colormasks.h"
 
 namespace Mohawk {
@@ -317,6 +322,7 @@ RivenGraphics::RivenGraphics(MohawkEngine_Riven* vm) :
 		_transitionOffset(-1),
 		_waterEffect(nullptr),
 		_fliesEffect(nullptr),
+		_menuFont(nullptr),
 		_transitionFrames(0),
 		_transitionDuration(0) {
 	_bitmapDecoder = new MohawkBitmap();
@@ -332,6 +338,8 @@ RivenGraphics::RivenGraphics(MohawkEngine_Riven* vm) :
 
 	_effectScreen = new Graphics::Surface();
 	_effectScreen->create(608, 392, _pixelFormat);
+
+	loadMenuFont();
 }
 
 RivenGraphics::~RivenGraphics() {
@@ -342,6 +350,7 @@ RivenGraphics::~RivenGraphics() {
 	delete _bitmapDecoder;
 	clearFliesEffect();
 	clearWaterEffect();
+	delete _menuFont;
 }
 
 MohawkSurface *RivenGraphics::decodeImage(uint16 id) {
@@ -366,26 +375,6 @@ void RivenGraphics::copyImageToScreen(uint16 image, uint32 left, uint32 top, uin
 	applyScreenUpdate();
 }
 
-void RivenGraphics::copySurfaceToScreen(Graphics::Surface *src, uint32 x, uint32 y) {
-	beginScreenUpdate();
-
-	int w = src->w;
-	int h = src->h;
-
-	// Clip the width to fit on the screen. Fixes some images.
-	if (x + w > 608)
-		w = 608 - x;
-
-	if (y + h > 436)
-		h = 346 - y;
-
-	for (uint16 i = 0; i < h; i++)
-		memcpy(_mainScreen->getBasePtr(x, i + y), src->getBasePtr(0, i), w * src->format.bytesPerPixel);
-
-	_dirtyScreen = true;
-	applyScreenUpdate();
-}
-
 void RivenGraphics::updateScreen() {
 	if (_dirtyScreen) {
 		// Copy to screen if there's no transition. Otherwise transition.
@@ -782,6 +771,59 @@ void RivenGraphics::enableCardUpdateScript(bool enable) {
 	_enableCardUpdateScript = enable;
 }
 
+void RivenGraphics::drawText(const Common::U32String &text, const Common::Rect &dest, uint8 greyLevel) {
+	_mainScreen->fillRect(dest, _pixelFormat.RGBToColor(0, 0, 0));
+
+	uint32 color = _pixelFormat.RGBToColor(greyLevel, greyLevel, greyLevel);
+
+	const Graphics::Font *font = getMenuFont();
+	font->drawString(_mainScreen, text, dest.left, dest.top, dest.width(), color);
+
+	_dirtyScreen = true;
+}
+
+void RivenGraphics::loadMenuFont() {
+	const char *fontName;
+
+	if (_vm->getLanguage() != Common::JA_JPN) {
+		fontName = "FreeSans.ttf";
+	} else {
+		fontName = "mplus-2c-regular.ttf";
+	}
+
+#if defined(USE_FREETYPE2)
+	int fontHeight;
+
+	if (_vm->getLanguage() != Common::JA_JPN) {
+		fontHeight = 12;
+	} else {
+		fontHeight = 11;
+	}
+
+	Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(fontName);
+	if (stream) {
+		_menuFont = Graphics::loadTTFFont(*stream, fontHeight);
+		delete stream;
+	}
+#endif
+
+	if (!_menuFont) {
+		warning("Cannot load font %s", fontName);
+	}
+}
+
+const Graphics::Font *RivenGraphics::getMenuFont() const {
+	const Graphics::Font *font;
+
+	if (_menuFont) {
+		font = _menuFont;
+	} else {
+		font = FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont);
+	}
+
+	return font;
+}
+
 const FliesEffect::FliesEffectData FliesEffect::_firefliesParameters = {
 		true,
 		true,
diff --git a/engines/mohawk/riven_graphics.h b/engines/mohawk/riven_graphics.h
index 69a3182..83d987d 100644
--- a/engines/mohawk/riven_graphics.h
+++ b/engines/mohawk/riven_graphics.h
@@ -25,6 +25,12 @@
 
 #include "mohawk/graphics.h"
 
+#include "common/ustr.h"
+
+namespace Graphics {
+struct Font;
+}
+
 namespace Mohawk {
 
 class MohawkEngine_Riven;
@@ -68,8 +74,6 @@ public:
 	void drawExtrasImage(uint16 id, const Common::Rect &dstRect);
 	void drawExtrasImageToScreen(uint16 id, const Common::Rect &rect);
 
-	void copySurfaceToScreen(Graphics::Surface *src, uint32 x, uint32 y);
-
 	/** Copy a rect from the system screen to the game screen */
 	void copySystemRectToScreen(const Common::Rect &rect);
 
@@ -93,6 +97,9 @@ public:
 	void fadeToBlack();
 	void setTransitionMode(RivenTransitionMode mode);
 
+	// Main menu
+	void drawText(const Common::U32String &text, const Common::Rect &dest, uint8 greyLevel);
+
 	// Credits
 	void beginCredits();
 	void updateCredits();
@@ -130,6 +137,11 @@ private:
 	void updateScreen();
 	void clearMainScreen();
 
+	// Main menu
+	Graphics::Font *_menuFont;
+	void loadMenuFont();
+	const Graphics::Font *getMenuFont() const;
+
 	// Credits
 	uint _creditsImage, _creditsPos;
 };
diff --git a/engines/mohawk/riven_stacks/aspit.cpp b/engines/mohawk/riven_stacks/aspit.cpp
index 6f22786..ba36dcc 100644
--- a/engines/mohawk/riven_stacks/aspit.cpp
+++ b/engines/mohawk/riven_stacks/aspit.cpp
@@ -93,42 +93,6 @@ void ASpit::xastartupbtnhide(const ArgumentArray &args) {
 	if (!(_vm->getFeatures() & GF_25TH))
 		return;
 
-	Common::File file;
-
-	const char *fontname;
-	const Graphics::Font *font = nullptr;
-
-	if (_vm->getLanguage() != Common::JA_JPN) {
-		fontname = "FreeSans.ttf";
-	} else {
-		fontname = "mplus-2c-regular.ttf";
-	}
-
-#if defined(USE_FREETYPE2)
-	int fontHeight;
-
-	if (_vm->getLanguage() != Common::JA_JPN) {
-		fontHeight = 12;
-	} else {
-		fontHeight = 11;
-	}
-
-	if (file.open(fontname)) {
-		font = Graphics::loadTTFFont(file, fontHeight);
-	}
-#endif
-
-	if (!font) {
-		warning("Cannot load font %s directly", fontname);
-		font = FontMan.getFontByName(fontname);
-	}
-
-	if (!font) {
-		warning("Cannot load font %s", fontname);
-
-		font = FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont);
-	}
-
 	int lang = -1;
 	for (int i = 0; menuItems[i].language != -1; i++) {
 		if (menuItems[i].language == _vm->getLanguage()) {
@@ -168,24 +132,11 @@ void ASpit::xastartupbtnhide(const ArgumentArray &args) {
 		bool enabled = !items[i].requiresStartedGame || _vm->isGameStarted();
 		hotspot->enable(enabled);
 
-		Common::Rect hotspotRect = hotspot->getRect();
-
-		Graphics::Surface surface;
-		surface.create(hotspotRect.width(), hotspotRect.height(), _vm->_gfx->getBackScreen()->format);
-
-		uint32 textColor;
-		if (enabled) {
-			textColor = surface.format.RGBToColor(164, 164, 164);
-		} else {
-			textColor = surface.format.RGBToColor(96, 96, 96);
-		}
-
 		Common::U32String str = Common::convertUtf8ToUtf32(menuItems[lang].items[i]);
+		Common::Rect hotspotRect = hotspot->getRect();
+		uint8 greyLevel = enabled ? 164 : 96;
 
-		font->drawString(&surface, str, 0, 0, surface.w, textColor);
-
-		_vm->_gfx->copySurfaceToScreen(&surface, hotspotRect.left, hotspotRect.top);
-		surface.free();
+		_vm->_gfx->drawText(str, hotspotRect, greyLevel);
 	}
 }
 





More information about the Scummvm-git-logs mailing list