| 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 fdc4a279897b7fc6d89323a78764330a66fa9233..5b5703b868c5b09263b124ab709c85284eee8438 100644
|
| --- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
|
| @@ -8,80 +8,60 @@
|
| #include "../../../include/fpdfapi/fpdf_module.h"
|
| #include "../../../include/fpdfapi/fpdf_serial.h"
|
| #include "pageint.h"
|
| +
|
| #define REQUIRE_PARAMS(count) if (m_ParamCount != count) { m_bAbort = TRUE; return; }
|
| -CPDF_StreamContentParser::CPDF_StreamContentParser()
|
| -{
|
| - m_DefFontSize = 0;
|
| - m_pCurStates = NULL;
|
| - m_pLastTextObject = NULL;
|
| - m_pPathPoints = NULL;
|
| - m_PathClipType = 0;
|
| - m_PathPointCount = m_PathAllocSize = 0;
|
| - m_PathCurrentX = m_PathCurrentY = 0.0f;
|
| - m_bResourceMissing = FALSE;
|
| - m_bColored = FALSE;
|
| - FXSYS_memset(m_Type3Data, 0, sizeof(FX_FLOAT) * 6);
|
| - m_ParamCount = 0;
|
| - m_ParamStartPos = 0;
|
| - m_bAbort = FALSE;
|
| - m_pLastImageDict = NULL;
|
| - m_pLastCloneImageDict = NULL;
|
| - m_pLastImage = NULL;
|
| - m_bReleaseLastDict = TRUE;
|
| - m_pParentResources = NULL;
|
| -}
|
| -FX_BOOL CPDF_StreamContentParser::Initialize()
|
| -{
|
| - return TRUE;
|
| -}
|
| -CPDF_StreamContentParser::~CPDF_StreamContentParser()
|
| -{
|
| - ClearAllParams();
|
| - int i = 0;
|
| - for (i = 0; i < m_StateStack.GetSize(); i ++) {
|
| - delete (CPDF_AllStates*)m_StateStack[i];
|
| - }
|
| - if (m_pPathPoints) {
|
| - FX_Free(m_pPathPoints);
|
| - }
|
| - delete m_pCurStates;
|
| - if (m_pLastImageDict) {
|
| - m_pLastImageDict->Release();
|
| - }
|
| - if (m_pLastCloneImageDict) {
|
| - m_pLastCloneImageDict->Release();
|
| - }
|
| -}
|
| -void CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument,
|
| - CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, CFX_AffineMatrix* pmtContentToUser, CPDF_PageObjects* pObjList,
|
| - CPDF_Dictionary* pResources, CPDF_Rect* pBBox, CPDF_ParseOptions* pOptions,
|
| - CPDF_AllStates* pStates, int level)
|
| +
|
| +CPDF_StreamContentParser::CPDF_StreamContentParser(
|
| + CPDF_Document* pDocument,
|
| + CPDF_Dictionary* pPageResources,
|
| + CPDF_Dictionary* pParentResources,
|
| + CFX_AffineMatrix* pmtContentToUser,
|
| + CPDF_PageObjects* pObjList,
|
| + CPDF_Dictionary* pResources,
|
| + CPDF_Rect* pBBox,
|
| + CPDF_ParseOptions* pOptions,
|
| + CPDF_AllStates* pStates,
|
| + int level)
|
| + : m_pDocument(pDocument),
|
| + m_pPageResources(pPageResources),
|
| + m_pParentResources(pParentResources),
|
| + m_pResources(pResources),
|
| + m_pObjectList(pObjList),
|
| + m_Level(level),
|
| + m_ParamStartPos(0),
|
| + m_ParamCount(0),
|
| + m_bAbort(FALSE),
|
| + m_pCurStates(new CPDF_AllStates),
|
| + m_pLastTextObject(nullptr),
|
| + m_DefFontSize(0),
|
| + m_pPathPoints(nullptr),
|
| + m_PathPointCount(0),
|
| + m_PathAllocSize(0),
|
| + m_PathCurrentX(0.0f),
|
| + m_PathCurrentY(0.0f),
|
| + m_PathClipType(0),
|
| + m_pLastImage(nullptr),
|
| + m_pLastImageDict(nullptr),
|
| + m_pLastCloneImageDict(nullptr),
|
| + m_bReleaseLastDict(TRUE),
|
| + m_bColored(FALSE),
|
| + m_bResourceMissing(FALSE)
|
| {
|
| - for (int i = 0; i < 6; i ++) {
|
| - m_Type3Data[i] = 0;
|
| - }
|
| - m_pDocument = pDocument;
|
| - m_pPageResources = pPageResources;
|
| - m_pParentResources = pParentResources;
|
| if (pmtContentToUser) {
|
| m_mtContentToUser = *pmtContentToUser;
|
| }
|
| if (pOptions) {
|
| m_Options = *pOptions;
|
| }
|
| - m_pObjectList = pObjList;
|
| - m_pResources = pResources;
|
| - if (pResources == NULL) {
|
| + if (!m_pResources) {
|
| m_pResources = m_pParentResources;
|
| }
|
| - if (m_pResources == NULL) {
|
| - m_pResources = pPageResources;
|
| + if (!m_pResources) {
|
| + m_pResources = m_pPageResources;
|
| }
|
| if (pBBox) {
|
| m_BBox = *pBBox;
|
| }
|
| - m_Level = level;
|
| - m_pCurStates = new CPDF_AllStates;
|
| if (pStates) {
|
| m_pCurStates->Copy(*pStates);
|
| } else {
|
| @@ -90,6 +70,26 @@ void CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument,
|
| m_pCurStates->m_TextState.New();
|
| m_pCurStates->m_ColorState.New();
|
| }
|
| + for (int i = 0; i < FX_ArraySize(m_Type3Data); ++i) {
|
| + m_Type3Data[i] = 0.0;
|
| + }
|
| +}
|
| +
|
| +CPDF_StreamContentParser::~CPDF_StreamContentParser()
|
| +{
|
| + ClearAllParams();
|
| + for (int i = 0; i < m_StateStack.GetSize(); ++i) {
|
| + delete (CPDF_AllStates*)m_StateStack[i];
|
| + }
|
| + if (m_pPathPoints) {
|
| + FX_Free(m_pPathPoints);
|
| + }
|
| + if (m_pLastImageDict) {
|
| + m_pLastImageDict->Release();
|
| + }
|
| + if (m_pLastCloneImageDict) {
|
| + m_pLastCloneImageDict->Release();
|
| + }
|
| }
|
| int CPDF_StreamContentParser::GetNextParamPos()
|
| {
|
| @@ -241,10 +241,9 @@ void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL b
|
| pObj->m_TextState = m_pCurStates->m_TextState;
|
| }
|
| }
|
| -const struct _OpCode {
|
| - FX_DWORD m_OpId;
|
| - void (CPDF_StreamContentParser::*m_OpHandler)();
|
| -} g_OpCodes[] = {
|
| +
|
| +const CPDF_StreamContentParser::OpCode CPDF_StreamContentParser::g_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},
|
| @@ -331,7 +330,7 @@ FX_BOOL CPDF_StreamContentParser::OnOperator(const FX_CHAR* op)
|
| opid <<= 8;
|
| i ++;
|
| };
|
| - int low = 0, high = sizeof g_OpCodes / sizeof(struct _OpCode) - 1;
|
| + 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;
|
| @@ -713,10 +712,10 @@ void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream)
|
| ClipPath.Transform(&form_matrix);
|
| form_bbox.Transform(&form_matrix);
|
| }
|
| - CPDF_StreamContentParser parser;
|
| - parser.Initialize();
|
| - parser.PrepareParse(m_pDocument, m_pPageResources, m_pResources, &m_mtContentToUser,
|
| - m_pObjectList, pResources, &form_bbox, &m_Options, m_pCurStates, m_Level + 1);
|
| + CPDF_StreamContentParser parser(
|
| + m_pDocument, m_pPageResources, m_pResources, &m_mtContentToUser,
|
| + m_pObjectList, pResources, &form_bbox, &m_Options,
|
| + m_pCurStates.get(), m_Level + 1);
|
| parser.m_pCurStates->m_CTM = form_matrix;
|
| if (ClipPath.NotNull()) {
|
| parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
|
|
|