Index: core/fxge/ge/cfx_facecache.cpp |
diff --git a/core/fxge/ge/cfx_facecache.cpp b/core/fxge/ge/cfx_facecache.cpp |
index c35830fbdefc821ba79d185a11256984829a0b26..1ec770ec33c4038bef8e3b45b88ff11ba7eefed9 100644 |
--- a/core/fxge/ge/cfx_facecache.cpp |
+++ b/core/fxge/ge/cfx_facecache.cpp |
@@ -22,6 +22,8 @@ |
namespace { |
+constexpr uint32_t kInvalidGlyphIndex = static_cast<uint32_t>(-1); |
+ |
void GammaAdjust(uint8_t* pData, |
int nHeight, |
int src_pitch, |
@@ -225,14 +227,22 @@ CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, |
const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, |
uint32_t glyph_index, |
int dest_width) { |
- if (!m_Face || glyph_index == (uint32_t)-1) |
+ if (!m_Face || glyph_index == kInvalidGlyphIndex || dest_width < 0) |
return nullptr; |
uint32_t key = glyph_index; |
- if (pFont->GetSubstFont()) { |
- key += (((pFont->GetSubstFont()->m_Weight / 16) << 15) + |
- ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) + |
- ((dest_width / 16) << 25) + (pFont->IsVertical() << 31)); |
+ auto* pSubstFont = pFont->GetSubstFont(); |
+ if (pSubstFont) { |
+ if (pSubstFont->m_Weight < 0 || pSubstFont->m_ItalicAngle < 0) |
+ return nullptr; |
+ uint32_t weight = static_cast<uint32_t>(pSubstFont->m_Weight); |
+ uint32_t angle = static_cast<uint32_t>(pSubstFont->m_ItalicAngle); |
+ uint32_t key_modifier = (weight / 16) << 15; |
+ key_modifier += (angle / 2) << 21; |
+ key_modifier += (static_cast<uint32_t>(dest_width) / 16) << 25; |
+ if (pFont->IsVertical()) |
+ key_modifier += 1U << 31; |
+ key += key_modifier; |
} |
auto it = m_PathMap.find(key); |
if (it != m_PathMap.end()) |
@@ -250,8 +260,9 @@ const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, |
int dest_width, |
int anti_alias, |
int& text_flags) { |
- if (glyph_index == (uint32_t)-1) |
+ if (glyph_index == kInvalidGlyphIndex) |
return nullptr; |
+ |
_CFX_UniqueKeyGen keygen; |
int nMatrixA = static_cast<int>(pMatrix->a * 10000); |
int nMatrixB = static_cast<int>(pMatrix->b * 10000); |