Index: core/src/fpdfapi/fpdf_font/fpdf_font.cpp |
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp |
index 003825b898b2f63184a93b2f249b57106c733568..b90d1147d68143224644871f5d93d45214d14ead 100644 |
--- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp |
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp |
@@ -31,83 +31,56 @@ FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id) { |
} |
return FALSE; |
} |
-CPDF_FontGlobals::CPDF_FontGlobals() : m_pContrastRamps(NULL) { |
+ |
+CFX_StockFontArray::CFX_StockFontArray() {} |
+ |
+CFX_StockFontArray::~CFX_StockFontArray() { |
+ for (size_t i = 0; i < FX_ArraySize(m_StockFonts); ++i) { |
+ if (!m_StockFonts[i]) |
+ continue; |
+ CPDF_Dictionary* pFontDict = m_StockFonts[i]->GetFontDict(); |
+ if (pFontDict) |
+ pFontDict->Release(); |
+ } |
+} |
+ |
+CPDF_Font* CFX_StockFontArray::GetFont(int index) const { |
+ if (index < 0 || index >= FX_ArraySize(m_StockFonts)) |
+ return nullptr; |
+ return m_StockFonts[index].get(); |
+} |
+ |
+void CFX_StockFontArray::SetFont(int index, CPDF_Font* font) { |
+ if (index < 0 || index >= FX_ArraySize(m_StockFonts)) |
+ return; |
+ m_StockFonts[index].reset(font); |
+} |
+ |
+CPDF_FontGlobals::CPDF_FontGlobals() { |
FXSYS_memset(m_EmbeddedCharsets, 0, sizeof(m_EmbeddedCharsets)); |
FXSYS_memset(m_EmbeddedToUnicodes, 0, sizeof(m_EmbeddedToUnicodes)); |
} |
+ |
CPDF_FontGlobals::~CPDF_FontGlobals() { |
- ClearAll(); |
- FX_Free(m_pContrastRamps); |
} |
-class CFX_StockFontArray { |
- public: |
- CFX_StockFontArray() { |
- FXSYS_memset(m_pStockFonts, 0, sizeof(m_pStockFonts)); |
- } |
- ~CFX_StockFontArray() { |
- for (size_t i = 0; i < FX_ArraySize(m_pStockFonts); i++) { |
- if (!m_pStockFonts[i]) |
- continue; |
- CPDF_Dictionary* pFontDict = m_pStockFonts[i]->GetFontDict(); |
- if (pFontDict) |
- pFontDict->Release(); |
- delete m_pStockFonts[i]; |
- } |
- } |
- CPDF_Font* GetFont(int index) const { |
- if (index < 0 || index >= FX_ArraySize(m_pStockFonts)) |
- return NULL; |
- return m_pStockFonts[index]; |
- } |
- void SetFont(int index, CPDF_Font* font) { |
- if (index < 0 || index >= FX_ArraySize(m_pStockFonts)) |
- return; |
- delete m_pStockFonts[index]; |
- m_pStockFonts[index] = font; |
- } |
- private: |
- CPDF_Font* m_pStockFonts[14]; |
-}; |
-CPDF_Font* CPDF_FontGlobals::Find(void* key, int index) { |
- void* value = NULL; |
- if (!m_pStockMap.Lookup(key, value)) { |
- return NULL; |
- } |
- if (!value) { |
- return NULL; |
- } |
- return static_cast<CFX_StockFontArray*>(value)->GetFont(index); |
-} |
-void CPDF_FontGlobals::Set(void* key, int index, CPDF_Font* pFont) { |
- void* value = NULL; |
- CFX_StockFontArray* font_array = NULL; |
- if (m_pStockMap.Lookup(key, value)) { |
- font_array = static_cast<CFX_StockFontArray*>(value); |
- } else { |
- font_array = new CFX_StockFontArray(); |
- m_pStockMap.SetAt(key, font_array); |
- } |
- font_array->SetFont(index, pFont); |
+CPDF_Font* CPDF_FontGlobals::Find(CPDF_Document* pDoc, int index) { |
+ auto it = m_StockMap.find(pDoc); |
+ if (it == m_StockMap.end()) |
+ return nullptr; |
+ return it->second ? it->second->GetFont(index) : nullptr; |
} |
-void CPDF_FontGlobals::Clear(void* key) { |
- void* value = NULL; |
- if (!m_pStockMap.Lookup(key, value)) { |
- return; |
- } |
- delete static_cast<CFX_StockFontArray*>(value); |
- m_pStockMap.RemoveKey(key); |
+ |
+void CPDF_FontGlobals::Set(CPDF_Document* pDoc, int index, CPDF_Font* pFont) { |
+ if (!pdfium::ContainsKey(m_StockMap, pDoc)) |
+ m_StockMap[pDoc].reset(new CFX_StockFontArray); |
+ m_StockMap[pDoc]->SetFont(index, pFont); |
} |
-void CPDF_FontGlobals::ClearAll() { |
- FX_POSITION pos = m_pStockMap.GetStartPosition(); |
- while (pos) { |
- void* key = NULL; |
- void* value = NULL; |
- m_pStockMap.GetNextAssoc(pos, key, value); |
- delete static_cast<CFX_StockFontArray*>(value); |
- m_pStockMap.RemoveKey(key); |
- } |
+ |
+void CPDF_FontGlobals::Clear(CPDF_Document* pDoc) { |
+ m_StockMap.erase(pDoc); |
} |
+ |
CPDF_Font::CPDF_Font(int fonttype) : m_FontType(fonttype) { |
m_FontBBox.left = m_FontBBox.right = m_FontBBox.top = m_FontBBox.bottom = 0; |
m_StemV = m_Ascent = m_Descent = m_ItalicAngle = 0; |