diff options
| -rw-r--r-- | graphics/fonts/bdf.cpp | 57 | ||||
| -rw-r--r-- | graphics/fonts/bdf.h | 1 | ||||
| -rw-r--r-- | graphics/macgui/macfontmanager.cpp | 11 | 
3 files changed, 68 insertions, 1 deletions
| diff --git a/graphics/fonts/bdf.cpp b/graphics/fonts/bdf.cpp index 9c5105d8b5..a783a22f5e 100644 --- a/graphics/fonts/bdf.cpp +++ b/graphics/fonts/bdf.cpp @@ -700,4 +700,61 @@ BdfFont *BdfFont::loadFromCache(Common::SeekableReadStream &stream) {  	return new BdfFont(data, DisposeAfterUse::YES);  } +BdfFont *BdfFont::scaleFont(BdfFont *src, int newSize) { +	if (src->getFontSize()) { +		warning("Requested to scale 0 size font"); +		return NULL; +	} + +	float scale = newSize / src->getFontSize(); + +	BdfFontData data; + +	data.maxAdvance = src->_data.maxAdvance; +	data.height = src->_data.height; +	data.defaultBox.width = src->_data.defaultBox.width; +	data.defaultBox.height = src->_data.defaultBox.height; +	data.defaultBox.xOffset = src->_data.defaultBox.xOffset; +	data.defaultBox.yOffset = src->_data.defaultBox.yOffset; +	data.ascent = src->_data.ascent; +	data.firstCharacter = src->_data.firstCharacter; +	data.defaultCharacter = src->_data.defaultCharacter; +	data.numCharacters = src->_data.numCharacters; + +	BdfBoundingBox *boxes = new BdfBoundingBox[data.numCharacters]; +	for (int i = 0; i < data.numCharacters; ++i) { +		boxes[i].width = src->_data.boxes[i].width; +		boxes[i].height = src->_data.boxes[i].height; +		boxes[i].xOffset = src->_data.boxes[i].xOffset; +		boxes[i].yOffset = src->_data.boxes[i].yOffset; +	} + +	byte *advances = new byte[data.numCharacters]; +	for (int i = 0; i < data.numCharacters; ++i) { +		advances[i] = src->_data.advances[i]; +	} + +	byte **bitmaps = new byte *[data.numCharacters]; + +	for (int i = 0; i < data.numCharacters; ++i) { +		const BdfBoundingBox &box = data.boxes ? data.boxes[i] : data.defaultBox; +		if (src->_data.bitmaps[i]) { +			const int bytes = ((box.width + 7) / 8) * box.height; +			bitmaps[i] = new byte[bytes]; + +			for (int j = 0; j < bytes; j++) +				bitmaps[i][j] = src->_data.bitmaps[i][j]; + +		} else { +			bitmaps[i] = 0; +		} +	} + +	data.bitmaps = bitmaps; +	data.advances = advances; +	data.boxes = boxes; + +	return new BdfFont(data, DisposeAfterUse::YES); +} +  } // End of namespace Graphics diff --git a/graphics/fonts/bdf.h b/graphics/fonts/bdf.h index 9a3b20e14c..d99b5fd401 100644 --- a/graphics/fonts/bdf.h +++ b/graphics/fonts/bdf.h @@ -76,6 +76,7 @@ public:  	static BdfFont *loadFont(Common::SeekableReadStream &stream);  	static bool cacheFontData(const BdfFont &font, const Common::String &filename);  	static BdfFont *loadFromCache(Common::SeekableReadStream &stream); +	static BdfFont *scaleFont(BdfFont *src, int newSize);  private:  	int mapToIndex(uint32 ch) const; diff --git a/graphics/macgui/macfontmanager.cpp b/graphics/macgui/macfontmanager.cpp index bf3532dc51..ce9493580b 100644 --- a/graphics/macgui/macfontmanager.cpp +++ b/graphics/macgui/macfontmanager.cpp @@ -259,9 +259,18 @@ void MacFontManager::generateFontSubstitute(MacFont &macFont) {  	generateFont(macFont, MacFont(macFont.getId(), maxSize, macFont.getSlant()));  } -void MacFontManager::generateFont(MacFont fromFont, MacFont toFont) { +void MacFontManager::generateFont(MacFont toFont, MacFont fromFont) {  	debugN("Found font substitute for font %s ", getFontName(fromFont));  	debug("as %s", getFontName(toFont)); + +	Graphics::BdfFont *bdfFont = (Graphics::BdfFont *)getFont(fromFont); + +	Graphics::BdfFont *font = Graphics::BdfFont::scaleFont(bdfFont, toFont.getSize()); + +	toFont.setGenerated(true); + +	FontMan.assignFontToName(getFontName(toFont), font); +	_fontRegistry.setVal(getFontName(toFont), &toFont);  }  } // End of namespace Graphics | 
