From e77b8bc5b56909b5e2b875e3b5fbbb0ef7b17547 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 16 Nov 2013 18:35:15 -0800 Subject: [PATCH] Check for non-indexed glyph advance values. This change from JPCSP: http://code.google.com/p/jpcsp/source/detail?r=3350 --- Core/Font/PGF.cpp | 22 ++++++++++++++++------ Core/Font/PGF.h | 1 + 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Core/Font/PGF.cpp b/Core/Font/PGF.cpp index 1a7da774a0..211ce65d1a 100644 --- a/Core/Font/PGF.cpp +++ b/Core/Font/PGF.cpp @@ -335,7 +335,7 @@ bool PGF::GetGlyph(const u8 *fontdata, size_t charPtr, int glyphType, Glyph &gly glyph.flags = getBits(6, fontdata, charPtr); charPtr += 6; - if (glyph.flags & FONT_PGF_CHARGLYPH) { + if (glyphType == FONT_PGF_CHARGLYPH) { // Skip magic number charPtr += 7; @@ -419,12 +419,22 @@ bool PGF::GetGlyph(const u8 *fontdata, size_t charPtr, int glyphType, Glyph &gly charPtr += 32; } - int advanceIndex = getBits(8, fontdata, charPtr); - charPtr += 8; + if ((glyph.flags & FONT_PGF_METRIC_ADVANCE_INDEX) == FONT_PGF_METRIC_ADVANCE_INDEX) + { + int advanceIndex = getBits(8, fontdata, charPtr); + charPtr += 8; - if (advanceIndex < header.advanceTableLength) { - glyph.advanceH = advanceTable[0][advanceIndex]; - glyph.advanceV = advanceTable[1][advanceIndex]; + if (advanceIndex < header.advanceTableLength) { + glyph.advanceH = advanceTable[0][advanceIndex]; + glyph.advanceV = advanceTable[1][advanceIndex]; + } + } + else + { + glyph.advanceH = getBits(32, fontdata, charPtr); + charPtr += 32; + glyph.advanceV = getBits(32, fontdata, charPtr); + charPtr += 32; } } else { glyph.shadowID = 65535; diff --git a/Core/Font/PGF.h b/Core/Font/PGF.h index 32ba766278..9bec8293f6 100644 --- a/Core/Font/PGF.h +++ b/Core/Font/PGF.h @@ -39,6 +39,7 @@ enum { FONT_PGF_METRIC_DIMENSION_INDEX = 0x04, FONT_PGF_METRIC_BEARING_X_INDEX = 0x08, FONT_PGF_METRIC_BEARING_Y_INDEX = 0x10, + FONT_PGF_METRIC_ADVANCE_INDEX = 0x20, FONT_PGF_CHARGLYPH = 0x20, FONT_PGF_SHADOWGLYPH = 0x40, };