Index: 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 465c74a425b417e0a1b3b533c7250c9cb99475a1..c47fe8bd73ec95ea9b32e2cf3433903395173f45 100644 |
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp |
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp |
@@ -340,112 +340,126 @@ void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, |
} |
} |
-const CPDF_StreamContentParser::OpCodes CPDF_StreamContentParser::s_OpCodes = { |
- {FXBSTR_ID('"', 0, 0, 0), |
- &CPDF_StreamContentParser::Handle_NextLineShowText_Space}, |
- {FXBSTR_ID('\'', 0, 0, 0), |
- &CPDF_StreamContentParser::Handle_NextLineShowText}, |
- {FXBSTR_ID('B', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillStrokePath}, |
- {FXBSTR_ID('B', '*', 0, 0), |
- &CPDF_StreamContentParser::Handle_EOFillStrokePath}, |
- {FXBSTR_ID('B', 'D', 'C', 0), |
- &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary}, |
- {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage}, |
- {FXBSTR_ID('B', 'M', 'C', 0), |
- &CPDF_StreamContentParser::Handle_BeginMarkedContent}, |
- {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText}, |
- {FXBSTR_ID('C', 'S', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke}, |
- {FXBSTR_ID('D', 'P', 0, 0), |
- &CPDF_StreamContentParser::Handle_MarkPlace_Dictionary}, |
- {FXBSTR_ID('D', 'o', 0, 0), |
- &CPDF_StreamContentParser::Handle_ExecuteXObject}, |
- {FXBSTR_ID('E', 'I', 0, 0), &CPDF_StreamContentParser::Handle_EndImage}, |
- {FXBSTR_ID('E', 'M', 'C', 0), |
- &CPDF_StreamContentParser::Handle_EndMarkedContent}, |
- {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText}, |
- {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), |
- &CPDF_StreamContentParser::Handle_BeginImageData}, |
- {FXBSTR_ID('J', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineCap}, |
- {FXBSTR_ID('K', 0, 0, 0), |
- &CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke}, |
- {FXBSTR_ID('M', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetMiterLimit}, |
- {FXBSTR_ID('M', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace}, |
- {FXBSTR_ID('Q', 0, 0, 0), |
- &CPDF_StreamContentParser::Handle_RestoreGraphState}, |
- {FXBSTR_ID('R', 'G', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetRGBColor_Stroke}, |
- {FXBSTR_ID('S', 0, 0, 0), &CPDF_StreamContentParser::Handle_StrokePath}, |
- {FXBSTR_ID('S', 'C', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetColor_Stroke}, |
- {FXBSTR_ID('S', 'C', 'N', 0), |
- &CPDF_StreamContentParser::Handle_SetColorPS_Stroke}, |
- {FXBSTR_ID('T', '*', 0, 0), |
- &CPDF_StreamContentParser::Handle_MoveToNextLine}, |
- {FXBSTR_ID('T', 'D', 0, 0), |
- &CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading}, |
- {FXBSTR_ID('T', 'J', 0, 0), |
- &CPDF_StreamContentParser::Handle_ShowText_Positioning}, |
- {FXBSTR_ID('T', 'L', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetTextLeading}, |
- {FXBSTR_ID('T', 'c', 0, 0), &CPDF_StreamContentParser::Handle_SetCharSpace}, |
- {FXBSTR_ID('T', 'd', 0, 0), |
- &CPDF_StreamContentParser::Handle_MoveTextPoint}, |
- {FXBSTR_ID('T', 'f', 0, 0), &CPDF_StreamContentParser::Handle_SetFont}, |
- {FXBSTR_ID('T', 'j', 0, 0), &CPDF_StreamContentParser::Handle_ShowText}, |
- {FXBSTR_ID('T', 'm', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetTextMatrix}, |
- {FXBSTR_ID('T', 'r', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetTextRenderMode}, |
- {FXBSTR_ID('T', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetTextRise}, |
- {FXBSTR_ID('T', 'w', 0, 0), &CPDF_StreamContentParser::Handle_SetWordSpace}, |
- {FXBSTR_ID('T', 'z', 0, 0), &CPDF_StreamContentParser::Handle_SetHorzScale}, |
- {FXBSTR_ID('W', 0, 0, 0), &CPDF_StreamContentParser::Handle_Clip}, |
- {FXBSTR_ID('W', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOClip}, |
- {FXBSTR_ID('b', 0, 0, 0), |
- &CPDF_StreamContentParser::Handle_CloseFillStrokePath}, |
- {FXBSTR_ID('b', '*', 0, 0), |
- &CPDF_StreamContentParser::Handle_CloseEOFillStrokePath}, |
- {FXBSTR_ID('c', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_123}, |
- {FXBSTR_ID('c', 'm', 0, 0), &CPDF_StreamContentParser::Handle_ConcatMatrix}, |
- {FXBSTR_ID('c', 's', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetColorSpace_Fill}, |
- {FXBSTR_ID('d', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetDash}, |
- {FXBSTR_ID('d', '0', 0, 0), &CPDF_StreamContentParser::Handle_SetCharWidth}, |
- {FXBSTR_ID('d', '1', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetCachedDevice}, |
- {FXBSTR_ID('f', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPath}, |
- {FXBSTR_ID('f', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillPath}, |
- {FXBSTR_ID('g', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Fill}, |
- {FXBSTR_ID('g', 's', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetExtendGraphState}, |
- {FXBSTR_ID('h', 0, 0, 0), &CPDF_StreamContentParser::Handle_ClosePath}, |
- {FXBSTR_ID('i', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetFlat}, |
- {FXBSTR_ID('j', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineJoin}, |
- {FXBSTR_ID('k', 0, 0, 0), |
- &CPDF_StreamContentParser::Handle_SetCMYKColor_Fill}, |
- {FXBSTR_ID('l', 0, 0, 0), &CPDF_StreamContentParser::Handle_LineTo}, |
- {FXBSTR_ID('m', 0, 0, 0), &CPDF_StreamContentParser::Handle_MoveTo}, |
- {FXBSTR_ID('n', 0, 0, 0), &CPDF_StreamContentParser::Handle_EndPath}, |
- {FXBSTR_ID('q', 0, 0, 0), &CPDF_StreamContentParser::Handle_SaveGraphState}, |
- {FXBSTR_ID('r', 'e', 0, 0), &CPDF_StreamContentParser::Handle_Rectangle}, |
- {FXBSTR_ID('r', 'g', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetRGBColor_Fill}, |
- {FXBSTR_ID('r', 'i', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetRenderIntent}, |
- {FXBSTR_ID('s', 0, 0, 0), |
- &CPDF_StreamContentParser::Handle_CloseStrokePath}, |
- {FXBSTR_ID('s', 'c', 0, 0), |
- &CPDF_StreamContentParser::Handle_SetColor_Fill}, |
- {FXBSTR_ID('s', 'c', 'n', 0), |
- &CPDF_StreamContentParser::Handle_SetColorPS_Fill}, |
- {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill}, |
- {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23}, |
- {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth}, |
- {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13}, |
-}; |
+// static |
+CPDF_StreamContentParser::OpCodes |
+CPDF_StreamContentParser::InitializeOpCodes() { |
+ return OpCodes({ |
+ {FXBSTR_ID('"', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_NextLineShowText_Space}, |
+ {FXBSTR_ID('\'', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_NextLineShowText}, |
+ {FXBSTR_ID('B', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_FillStrokePath}, |
+ {FXBSTR_ID('B', '*', 0, 0), |
+ &CPDF_StreamContentParser::Handle_EOFillStrokePath}, |
+ {FXBSTR_ID('B', 'D', 'C', 0), |
+ &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary}, |
+ {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage}, |
+ {FXBSTR_ID('B', 'M', 'C', 0), |
+ &CPDF_StreamContentParser::Handle_BeginMarkedContent}, |
+ {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText}, |
+ {FXBSTR_ID('C', 'S', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke}, |
+ {FXBSTR_ID('D', 'P', 0, 0), |
+ &CPDF_StreamContentParser::Handle_MarkPlace_Dictionary}, |
+ {FXBSTR_ID('D', 'o', 0, 0), |
+ &CPDF_StreamContentParser::Handle_ExecuteXObject}, |
+ {FXBSTR_ID('E', 'I', 0, 0), &CPDF_StreamContentParser::Handle_EndImage}, |
+ {FXBSTR_ID('E', 'M', 'C', 0), |
+ &CPDF_StreamContentParser::Handle_EndMarkedContent}, |
+ {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText}, |
+ {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), |
+ &CPDF_StreamContentParser::Handle_BeginImageData}, |
+ {FXBSTR_ID('J', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineCap}, |
+ {FXBSTR_ID('K', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke}, |
+ {FXBSTR_ID('M', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetMiterLimit}, |
+ {FXBSTR_ID('M', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace}, |
+ {FXBSTR_ID('Q', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_RestoreGraphState}, |
+ {FXBSTR_ID('R', 'G', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetRGBColor_Stroke}, |
+ {FXBSTR_ID('S', 0, 0, 0), &CPDF_StreamContentParser::Handle_StrokePath}, |
+ {FXBSTR_ID('S', 'C', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetColor_Stroke}, |
+ {FXBSTR_ID('S', 'C', 'N', 0), |
+ &CPDF_StreamContentParser::Handle_SetColorPS_Stroke}, |
+ {FXBSTR_ID('T', '*', 0, 0), |
+ &CPDF_StreamContentParser::Handle_MoveToNextLine}, |
+ {FXBSTR_ID('T', 'D', 0, 0), |
+ &CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading}, |
+ {FXBSTR_ID('T', 'J', 0, 0), |
+ &CPDF_StreamContentParser::Handle_ShowText_Positioning}, |
+ {FXBSTR_ID('T', 'L', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetTextLeading}, |
+ {FXBSTR_ID('T', 'c', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetCharSpace}, |
+ {FXBSTR_ID('T', 'd', 0, 0), |
+ &CPDF_StreamContentParser::Handle_MoveTextPoint}, |
+ {FXBSTR_ID('T', 'f', 0, 0), &CPDF_StreamContentParser::Handle_SetFont}, |
+ {FXBSTR_ID('T', 'j', 0, 0), &CPDF_StreamContentParser::Handle_ShowText}, |
+ {FXBSTR_ID('T', 'm', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetTextMatrix}, |
+ {FXBSTR_ID('T', 'r', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetTextRenderMode}, |
+ {FXBSTR_ID('T', 's', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetTextRise}, |
+ {FXBSTR_ID('T', 'w', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetWordSpace}, |
+ {FXBSTR_ID('T', 'z', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetHorzScale}, |
+ {FXBSTR_ID('W', 0, 0, 0), &CPDF_StreamContentParser::Handle_Clip}, |
+ {FXBSTR_ID('W', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOClip}, |
+ {FXBSTR_ID('b', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_CloseFillStrokePath}, |
+ {FXBSTR_ID('b', '*', 0, 0), |
+ &CPDF_StreamContentParser::Handle_CloseEOFillStrokePath}, |
+ {FXBSTR_ID('c', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_123}, |
+ {FXBSTR_ID('c', 'm', 0, 0), |
+ &CPDF_StreamContentParser::Handle_ConcatMatrix}, |
+ {FXBSTR_ID('c', 's', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetColorSpace_Fill}, |
+ {FXBSTR_ID('d', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetDash}, |
+ {FXBSTR_ID('d', '0', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetCharWidth}, |
+ {FXBSTR_ID('d', '1', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetCachedDevice}, |
+ {FXBSTR_ID('f', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPath}, |
+ {FXBSTR_ID('f', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillPath}, |
+ {FXBSTR_ID('g', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Fill}, |
+ {FXBSTR_ID('g', 's', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetExtendGraphState}, |
+ {FXBSTR_ID('h', 0, 0, 0), &CPDF_StreamContentParser::Handle_ClosePath}, |
+ {FXBSTR_ID('i', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetFlat}, |
+ {FXBSTR_ID('j', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineJoin}, |
+ {FXBSTR_ID('k', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetCMYKColor_Fill}, |
+ {FXBSTR_ID('l', 0, 0, 0), &CPDF_StreamContentParser::Handle_LineTo}, |
+ {FXBSTR_ID('m', 0, 0, 0), &CPDF_StreamContentParser::Handle_MoveTo}, |
+ {FXBSTR_ID('n', 0, 0, 0), &CPDF_StreamContentParser::Handle_EndPath}, |
+ {FXBSTR_ID('q', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_SaveGraphState}, |
+ {FXBSTR_ID('r', 'e', 0, 0), &CPDF_StreamContentParser::Handle_Rectangle}, |
+ {FXBSTR_ID('r', 'g', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetRGBColor_Fill}, |
+ {FXBSTR_ID('r', 'i', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetRenderIntent}, |
+ {FXBSTR_ID('s', 0, 0, 0), |
+ &CPDF_StreamContentParser::Handle_CloseStrokePath}, |
+ {FXBSTR_ID('s', 'c', 0, 0), |
+ &CPDF_StreamContentParser::Handle_SetColor_Fill}, |
+ {FXBSTR_ID('s', 'c', 'n', 0), |
+ &CPDF_StreamContentParser::Handle_SetColorPS_Fill}, |
+ {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill}, |
+ {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23}, |
+ {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth}, |
+ {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13}, |
+ }); |
+} |
void CPDF_StreamContentParser::OnOperator(const FX_CHAR* op) { |
int i = 0; |
@@ -459,6 +473,8 @@ void CPDF_StreamContentParser::OnOperator(const FX_CHAR* op) { |
i++; |
} |
+ static const OpCodes s_OpCodes = InitializeOpCodes(); |
+ |
auto it = s_OpCodes.find(opid); |
if (it != s_OpCodes.end()) |
(this->*it->second)(); |