From ad02964dc0bdba4001037fa83f0b9714544f4786 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 23 Feb 2016 15:05:45 -0800 Subject: Store opcode function pointers in an unordered_map R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1725673002 . --- core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp | 38 ++++--------------------- 1 file changed, 6 insertions(+), 32 deletions(-) (limited to 'core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp') diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp index fe07a63bca..3018630463 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp @@ -340,7 +340,7 @@ void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, } } -const CPDF_StreamContentParser::OpCode CPDF_StreamContentParser::g_OpCodes[] = { +const CPDF_StreamContentParser::OpCodes CPDF_StreamContentParser::s_OpCodes = { {FXBSTR_ID('"', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText_Space}, {FXBSTR_ID('\'', 0, 0, 0), @@ -354,8 +354,6 @@ const CPDF_StreamContentParser::OpCode CPDF_StreamContentParser::g_OpCodes[] = { {FXBSTR_ID('B', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent}, {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText}, - {FXBSTR_ID('B', 'X', 0, 0), - &CPDF_StreamContentParser::Handle_BeginSectionUndefined}, {FXBSTR_ID('C', 'S', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke}, {FXBSTR_ID('D', 'P', 0, 0), @@ -366,8 +364,6 @@ const CPDF_StreamContentParser::OpCode CPDF_StreamContentParser::g_OpCodes[] = { {FXBSTR_ID('E', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_EndMarkedContent}, {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText}, - {FXBSTR_ID('E', 'X', 0, 0), - &CPDF_StreamContentParser::Handle_EndSectionUndefined}, {FXBSTR_ID('F', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPathOld}, {FXBSTR_ID('G', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Stroke}, {FXBSTR_ID('I', 'D', 0, 0), @@ -451,7 +447,7 @@ const CPDF_StreamContentParser::OpCode CPDF_StreamContentParser::g_OpCodes[] = { {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13}, }; -FX_BOOL CPDF_StreamContentParser::OnOperator(const FX_CHAR* op) { +void CPDF_StreamContentParser::OnOperator(const FX_CHAR* op) { int i = 0; FX_DWORD opid = 0; while (i < 4 && op[i]) { @@ -462,21 +458,10 @@ FX_BOOL CPDF_StreamContentParser::OnOperator(const FX_CHAR* op) { opid <<= 8; i++; } - int low = 0, high = sizeof g_OpCodes / sizeof(OpCode) - 1; - while (low <= high) { - int middle = (low + high) / 2; - int compare = opid - g_OpCodes[middle].m_OpId; - if (compare == 0) { - (this->*g_OpCodes[middle].m_OpHandler)(); - return TRUE; - } - if (compare < 0) { - high = middle - 1; - } else { - low = middle + 1; - } - } - return m_CompatCount != 0; + + auto it = s_OpCodes.find(opid); + if (it != s_OpCodes.end()) + (this->*it->second)(); } void CPDF_StreamContentParser::Handle_CloseFillStrokePath() { @@ -625,10 +610,6 @@ void CPDF_StreamContentParser::Handle_BeginText() { m_pCurStates->m_TextLineY = 0; } -void CPDF_StreamContentParser::Handle_BeginSectionUndefined() { - m_CompatCount++; -} - void CPDF_StreamContentParser::Handle_CurveTo_123() { if (m_Options.m_bTextOnly) { return; @@ -863,12 +844,6 @@ void CPDF_StreamContentParser::Handle_EndText() { m_ClipTextList.RemoveAll(); } -void CPDF_StreamContentParser::Handle_EndSectionUndefined() { - if (m_CompatCount) { - m_CompatCount--; - } -} - void CPDF_StreamContentParser::Handle_FillPath() { if (m_Options.m_bTextOnly) { return; @@ -1642,7 +1617,6 @@ FX_DWORD CPDF_StreamContentParser::Parse(const uint8_t* pData, FX_DWORD InitObjCount = m_pObjectHolder->GetPageObjectList()->size(); CPDF_StreamParser syntax(pData, dwSize); CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax); - m_CompatCount = 0; while (1) { FX_DWORD cost = m_pObjectHolder->GetPageObjectList()->size() - InitObjCount; if (max_cost && cost >= max_cost) { -- cgit v1.2.3