diff options
Diffstat (limited to 'graphics/fonts')
-rw-r--r-- | graphics/fonts/bdf.cpp | 57 | ||||
-rw-r--r-- | graphics/fonts/bdf.h | 1 |
2 files changed, 58 insertions, 0 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; |