Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Unified Diff: core/src/fpdfapi/fpdf_font/fpdf_font.cpp

Issue 1094763002: Make CFX_StockFontArray more robust. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 996c68669df64f350da5d2f0daefc4d9ae4bb359..ea563ec9841acac269d2207dbc2b98e31c47828b 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -10,6 +10,7 @@
#include "font_int.h"
#include "../fpdf_page/pageint.h"
#include "../../../include/fxge/fx_freetype.h"
+
FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id)
{
for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i ++) {
@@ -23,10 +24,10 @@ FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id)
}
extern const FX_WORD* PDF_UnicodesForPredefinedCharSet(int);
CPDF_FontGlobals::CPDF_FontGlobals()
+ : m_pContrastRamps(NULL)
{
- FXSYS_memset32(m_EmbeddedCharsets, 0, sizeof m_EmbeddedCharsets);
- FXSYS_memset32(m_EmbeddedToUnicodes, 0, sizeof m_EmbeddedToUnicodes);
- m_pContrastRamps = NULL;
+ FXSYS_memset32(m_EmbeddedCharsets, 0, sizeof(m_EmbeddedCharsets));
+ FXSYS_memset32(m_EmbeddedToUnicodes, 0, sizeof(m_EmbeddedToUnicodes));
}
CPDF_FontGlobals::~CPDF_FontGlobals()
{
@@ -35,14 +36,39 @@ CPDF_FontGlobals::~CPDF_FontGlobals()
FX_Free(m_pContrastRamps);
}
}
-class CFX_StockFontArray
+class CFX_StockFontArray
{
public:
CFX_StockFontArray()
{
- FXSYS_memset32(m_pStockFonts, 0, sizeof(CPDF_Font*) * 14);
+ FXSYS_memset32(m_pStockFonts, 0, sizeof(m_pStockFonts));
+ }
+ ~CFX_StockFontArray()
+ {
+ for (int 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)
Tom Sepez 2015/04/16 22:50:01 nit: this is probably a const method.
Lei Zhang 2015/04/16 23:48:19 Done.
+ {
+ 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;
}
- CPDF_Font* m_pStockFonts[14];
+private:
+ CPDF_Font* m_pStockFonts[14];
};
CPDF_Font* CPDF_FontGlobals::Find(void* key, int index)
{
@@ -53,18 +79,19 @@ CPDF_Font* CPDF_FontGlobals::Find(void* key, int index)
if (!value) {
return NULL;
}
- return ((CFX_StockFontArray*)value)->m_pStockFonts[index];
+ 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)) {
- ((CFX_StockFontArray*)value)->m_pStockFonts[index] = pFont;
- return;
+ font_array = static_cast<CFX_StockFontArray*>(value);
+ } else {
+ font_array = new CFX_StockFontArray();
+ m_pStockMap.SetAt(key, font_array);
}
- CFX_StockFontArray* pFonts = new CFX_StockFontArray();
- pFonts->m_pStockFonts[index] = pFont;
- m_pStockMap.SetAt(key, pFonts);
+ font_array->SetFont(index, pFont);
}
void CPDF_FontGlobals::Clear(void* key)
{
@@ -72,39 +99,17 @@ void CPDF_FontGlobals::Clear(void* key)
if (!m_pStockMap.Lookup(key, value)) {
return;
}
- if (value) {
- CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;
- for (int i = 0; i < 14; i ++) {
- if (pStockFonts->m_pStockFonts[i]) {
- CPDF_Dictionary* pFontDict = pStockFonts->m_pStockFonts[i]->GetFontDict();
- if (pFontDict)
- pFontDict->Release();
- delete pStockFonts->m_pStockFonts[i];
- }
- }
- delete pStockFonts;
- }
+ delete static_cast<CFX_StockFontArray*>(value);
m_pStockMap.RemoveKey(key);
}
void CPDF_FontGlobals::ClearAll()
{
FX_POSITION pos = m_pStockMap.GetStartPosition();
while (pos) {
- void *key = NULL;
+ void* key = NULL;
void* value = NULL;
m_pStockMap.GetNextAssoc(pos, key, value);
- if (value) {
- CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;
- for (int i = 0; i < 14; i ++) {
- if (pStockFonts->m_pStockFonts[i]) {
- CPDF_Dictionary* pFontDict = pStockFonts->m_pStockFonts[i]->GetFontDict();
- if (pFontDict)
- pFontDict->Release();
- delete pStockFonts->m_pStockFonts[i];
- }
- }
- delete pStockFonts;
- }
+ delete static_cast<CFX_StockFontArray*>(value);
m_pStockMap.RemoveKey(key);
}
}
« core/src/fpdfapi/fpdf_font/font_int.h ('K') | « core/src/fpdfapi/fpdf_font/font_int.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698