OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../../include/fpdfapi/fpdf_page.h" | 7 #include "../../../include/fpdfapi/fpdf_page.h" |
8 #include "../../../include/fpdfapi/fpdf_module.h" | 8 #include "../../../include/fpdfapi/fpdf_module.h" |
9 #include "../../../include/fpdfapi/fpdf_serial.h" | 9 #include "../../../include/fpdfapi/fpdf_serial.h" |
10 #include "pageint.h" | 10 #include "pageint.h" |
| 11 |
11 #define REQUIRE_PARAMS(count) if (m_ParamCount != count) { m_bAbort = TRUE; retu
rn; } | 12 #define REQUIRE_PARAMS(count) if (m_ParamCount != count) { m_bAbort = TRUE; retu
rn; } |
12 CPDF_StreamContentParser::CPDF_StreamContentParser() | 13 |
| 14 CPDF_StreamContentParser::CPDF_StreamContentParser( |
| 15 CPDF_Document* pDocument, |
| 16 CPDF_Dictionary* pPageResources, |
| 17 CPDF_Dictionary* pParentResources, |
| 18 CFX_AffineMatrix* pmtContentToUser, |
| 19 CPDF_PageObjects* pObjList, |
| 20 CPDF_Dictionary* pResources, |
| 21 CPDF_Rect* pBBox, |
| 22 CPDF_ParseOptions* pOptions, |
| 23 CPDF_AllStates* pStates, |
| 24 int level) |
| 25 : m_pDocument(pDocument), |
| 26 m_pPageResources(pPageResources), |
| 27 m_pParentResources(pParentResources), |
| 28 m_pResources(pResources), |
| 29 m_pObjectList(pObjList), |
| 30 m_Level(level), |
| 31 m_ParamStartPos(0), |
| 32 m_ParamCount(0), |
| 33 m_bAbort(FALSE), |
| 34 m_pCurStates(new CPDF_AllStates), |
| 35 m_pLastTextObject(nullptr), |
| 36 m_DefFontSize(0), |
| 37 m_pPathPoints(nullptr), |
| 38 m_PathPointCount(0), |
| 39 m_PathAllocSize(0), |
| 40 m_PathCurrentX(0.0f), |
| 41 m_PathCurrentY(0.0f), |
| 42 m_PathClipType(0), |
| 43 m_pLastImage(nullptr), |
| 44 m_pLastImageDict(nullptr), |
| 45 m_pLastCloneImageDict(nullptr), |
| 46 m_bReleaseLastDict(TRUE), |
| 47 m_bColored(FALSE), |
| 48 m_bResourceMissing(FALSE) |
13 { | 49 { |
14 m_DefFontSize = 0; | |
15 m_pCurStates = NULL; | |
16 m_pLastTextObject = NULL; | |
17 m_pPathPoints = NULL; | |
18 m_PathClipType = 0; | |
19 m_PathPointCount = m_PathAllocSize = 0; | |
20 m_PathCurrentX = m_PathCurrentY = 0.0f; | |
21 m_bResourceMissing = FALSE; | |
22 m_bColored = FALSE; | |
23 FXSYS_memset(m_Type3Data, 0, sizeof(FX_FLOAT) * 6); | |
24 m_ParamCount = 0; | |
25 m_ParamStartPos = 0; | |
26 m_bAbort = FALSE; | |
27 m_pLastImageDict = NULL; | |
28 m_pLastCloneImageDict = NULL; | |
29 m_pLastImage = NULL; | |
30 m_bReleaseLastDict = TRUE; | |
31 m_pParentResources = NULL; | |
32 } | |
33 FX_BOOL CPDF_StreamContentParser::Initialize() | |
34 { | |
35 return TRUE; | |
36 } | |
37 CPDF_StreamContentParser::~CPDF_StreamContentParser() | |
38 { | |
39 ClearAllParams(); | |
40 int i = 0; | |
41 for (i = 0; i < m_StateStack.GetSize(); i ++) { | |
42 delete (CPDF_AllStates*)m_StateStack[i]; | |
43 } | |
44 if (m_pPathPoints) { | |
45 FX_Free(m_pPathPoints); | |
46 } | |
47 delete m_pCurStates; | |
48 if (m_pLastImageDict) { | |
49 m_pLastImageDict->Release(); | |
50 } | |
51 if (m_pLastCloneImageDict) { | |
52 m_pLastCloneImageDict->Release(); | |
53 } | |
54 } | |
55 void CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument, | |
56 CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, CFX_
AffineMatrix* pmtContentToUser, CPDF_PageObjects* pObjList, | |
57 CPDF_Dictionary* pResources, CPDF_Rect* pBBox, CPDF_ParseOptions* pOptio
ns, | |
58 CPDF_AllStates* pStates, int level) | |
59 { | |
60 for (int i = 0; i < 6; i ++) { | |
61 m_Type3Data[i] = 0; | |
62 } | |
63 m_pDocument = pDocument; | |
64 m_pPageResources = pPageResources; | |
65 m_pParentResources = pParentResources; | |
66 if (pmtContentToUser) { | 50 if (pmtContentToUser) { |
67 m_mtContentToUser = *pmtContentToUser; | 51 m_mtContentToUser = *pmtContentToUser; |
68 } | 52 } |
69 if (pOptions) { | 53 if (pOptions) { |
70 m_Options = *pOptions; | 54 m_Options = *pOptions; |
71 } | 55 } |
72 m_pObjectList = pObjList; | 56 if (!m_pResources) { |
73 m_pResources = pResources; | |
74 if (pResources == NULL) { | |
75 m_pResources = m_pParentResources; | 57 m_pResources = m_pParentResources; |
76 } | 58 } |
77 if (m_pResources == NULL) { | 59 if (!m_pResources) { |
78 m_pResources = pPageResources; | 60 m_pResources = m_pPageResources; |
79 } | 61 } |
80 if (pBBox) { | 62 if (pBBox) { |
81 m_BBox = *pBBox; | 63 m_BBox = *pBBox; |
82 } | 64 } |
83 m_Level = level; | |
84 m_pCurStates = new CPDF_AllStates; | |
85 if (pStates) { | 65 if (pStates) { |
86 m_pCurStates->Copy(*pStates); | 66 m_pCurStates->Copy(*pStates); |
87 } else { | 67 } else { |
88 m_pCurStates->m_GeneralState.New(); | 68 m_pCurStates->m_GeneralState.New(); |
89 m_pCurStates->m_GraphState.New(); | 69 m_pCurStates->m_GraphState.New(); |
90 m_pCurStates->m_TextState.New(); | 70 m_pCurStates->m_TextState.New(); |
91 m_pCurStates->m_ColorState.New(); | 71 m_pCurStates->m_ColorState.New(); |
92 } | 72 } |
| 73 for (int i = 0; i < FX_ArraySize(m_Type3Data); ++i) { |
| 74 m_Type3Data[i] = 0.0; |
| 75 } |
| 76 } |
| 77 |
| 78 CPDF_StreamContentParser::~CPDF_StreamContentParser() |
| 79 { |
| 80 ClearAllParams(); |
| 81 for (int i = 0; i < m_StateStack.GetSize(); ++i) { |
| 82 delete (CPDF_AllStates*)m_StateStack[i]; |
| 83 } |
| 84 if (m_pPathPoints) { |
| 85 FX_Free(m_pPathPoints); |
| 86 } |
| 87 if (m_pLastImageDict) { |
| 88 m_pLastImageDict->Release(); |
| 89 } |
| 90 if (m_pLastCloneImageDict) { |
| 91 m_pLastCloneImageDict->Release(); |
| 92 } |
93 } | 93 } |
94 int CPDF_StreamContentParser::GetNextParamPos() | 94 int CPDF_StreamContentParser::GetNextParamPos() |
95 { | 95 { |
96 if (m_ParamCount == PARAM_BUF_SIZE) { | 96 if (m_ParamCount == PARAM_BUF_SIZE) { |
97 m_ParamStartPos ++; | 97 m_ParamStartPos ++; |
98 if (m_ParamStartPos == PARAM_BUF_SIZE) { | 98 if (m_ParamStartPos == PARAM_BUF_SIZE) { |
99 m_ParamStartPos = 0; | 99 m_ParamStartPos = 0; |
100 } | 100 } |
101 if (m_ParamBuf1[m_ParamStartPos].m_Type == 0) { | 101 if (m_ParamBuf1[m_ParamStartPos].m_Type == 0) { |
102 if (CPDF_Object* pObject = m_ParamBuf1[m_ParamStartPos].m_pObject) | 102 if (CPDF_Object* pObject = m_ParamBuf1[m_ParamStartPos].m_pObject) |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 if (bColor) { | 234 if (bColor) { |
235 pObj->m_ColorState = m_pCurStates->m_ColorState; | 235 pObj->m_ColorState = m_pCurStates->m_ColorState; |
236 } | 236 } |
237 if (bGraph) { | 237 if (bGraph) { |
238 pObj->m_GraphState = m_pCurStates->m_GraphState; | 238 pObj->m_GraphState = m_pCurStates->m_GraphState; |
239 } | 239 } |
240 if (bText) { | 240 if (bText) { |
241 pObj->m_TextState = m_pCurStates->m_TextState; | 241 pObj->m_TextState = m_pCurStates->m_TextState; |
242 } | 242 } |
243 } | 243 } |
244 const struct _OpCode { | 244 |
245 FX_DWORD» m_OpId; | 245 const CPDF_StreamContentParser::OpCode CPDF_StreamContentParser::g_OpCodes[] = |
246 void (CPDF_StreamContentParser::*m_OpHandler)(); | 246 { |
247 } g_OpCodes[] = { | |
248 {FXBSTR_ID('"', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLi
neShowText_Space}, | 247 {FXBSTR_ID('"', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLi
neShowText_Space}, |
249 {FXBSTR_ID('\'', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLi
neShowText}, | 248 {FXBSTR_ID('\'', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLi
neShowText}, |
250 {FXBSTR_ID('B', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillSt
rokePath}, | 249 {FXBSTR_ID('B', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillSt
rokePath}, |
251 {FXBSTR_ID('B', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillStrokePa
th}, | 250 {FXBSTR_ID('B', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillStrokePa
th}, |
252 {FXBSTR_ID('B', 'D', 'C', 0), &CPDF_StreamContentParser::Handle_BeginM
arkedContent_Dictionary}, | 251 {FXBSTR_ID('B', 'D', 'C', 0), &CPDF_StreamContentParser::Handle_BeginM
arkedContent_Dictionary}, |
253 {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage}, | 252 {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage}, |
254 {FXBSTR_ID('B', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_BeginM
arkedContent}, | 253 {FXBSTR_ID('B', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_BeginM
arkedContent}, |
255 {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText}, | 254 {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText}, |
256 {FXBSTR_ID('B', 'X', 0, 0), &CPDF_StreamContentParser::Handle_BeginSectionUn
defined}, | 255 {FXBSTR_ID('B', 'X', 0, 0), &CPDF_StreamContentParser::Handle_BeginSectionUn
defined}, |
257 {FXBSTR_ID('C', 'S', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_
Stroke}, | 256 {FXBSTR_ID('C', 'S', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_
Stroke}, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 int i = 0; | 323 int i = 0; |
325 FX_DWORD opid = 0; | 324 FX_DWORD opid = 0; |
326 while (i < 4 && op[i]) { | 325 while (i < 4 && op[i]) { |
327 opid = (opid << 8) + op[i]; | 326 opid = (opid << 8) + op[i]; |
328 i ++; | 327 i ++; |
329 } | 328 } |
330 while (i < 4) { | 329 while (i < 4) { |
331 opid <<= 8; | 330 opid <<= 8; |
332 i ++; | 331 i ++; |
333 }; | 332 }; |
334 int low = 0, high = sizeof g_OpCodes / sizeof(struct _OpCode) - 1; | 333 int low = 0, high = sizeof g_OpCodes / sizeof(OpCode) - 1; |
335 while (low <= high) { | 334 while (low <= high) { |
336 int middle = (low + high) / 2; | 335 int middle = (low + high) / 2; |
337 int compare = opid - g_OpCodes[middle].m_OpId; | 336 int compare = opid - g_OpCodes[middle].m_OpId; |
338 if (compare == 0) { | 337 if (compare == 0) { |
339 (this->*g_OpCodes[middle].m_OpHandler)(); | 338 (this->*g_OpCodes[middle].m_OpHandler)(); |
340 return TRUE; | 339 return TRUE; |
341 } else if (compare < 0) { | 340 } else if (compare < 0) { |
342 high = middle - 1; | 341 high = middle - 1; |
343 } else { | 342 } else { |
344 low = middle + 1; | 343 low = middle + 1; |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 CPDF_Array* pBBox = pStream->GetDict()->GetArray(FX_BSTRC("BBox")); | 705 CPDF_Array* pBBox = pStream->GetDict()->GetArray(FX_BSTRC("BBox")); |
707 CFX_FloatRect form_bbox; | 706 CFX_FloatRect form_bbox; |
708 CPDF_Path ClipPath; | 707 CPDF_Path ClipPath; |
709 if (pBBox) { | 708 if (pBBox) { |
710 form_bbox = pStream->GetDict()->GetRect(FX_BSTRC("BBox")); | 709 form_bbox = pStream->GetDict()->GetRect(FX_BSTRC("BBox")); |
711 ClipPath.New(); | 710 ClipPath.New(); |
712 ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.righ
t, form_bbox.top); | 711 ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.righ
t, form_bbox.top); |
713 ClipPath.Transform(&form_matrix); | 712 ClipPath.Transform(&form_matrix); |
714 form_bbox.Transform(&form_matrix); | 713 form_bbox.Transform(&form_matrix); |
715 } | 714 } |
716 CPDF_StreamContentParser parser; | 715 CPDF_StreamContentParser parser( |
717 parser.Initialize(); | 716 m_pDocument, m_pPageResources, m_pResources, &m_mtContentToUser, |
718 parser.PrepareParse(m_pDocument, m_pPageResources, m_pResources, &m_mtCo
ntentToUser, | 717 m_pObjectList, pResources, &form_bbox, &m_Options, |
719 m_pObjectList, pResources, &form_bbox, &m_Options, m
_pCurStates, m_Level + 1); | 718 m_pCurStates.get(), m_Level + 1); |
720 parser.m_pCurStates->m_CTM = form_matrix; | 719 parser.m_pCurStates->m_CTM = form_matrix; |
721 if (ClipPath.NotNull()) { | 720 if (ClipPath.NotNull()) { |
722 parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING,
TRUE); | 721 parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING,
TRUE); |
723 } | 722 } |
724 CPDF_StreamAcc stream; | 723 CPDF_StreamAcc stream; |
725 stream.LoadAllData(pStream, FALSE); | 724 stream.LoadAllData(pStream, FALSE); |
726 if (stream.GetSize() == 0) { | 725 if (stream.GetSize() == 0) { |
727 return; | 726 return; |
728 } | 727 } |
729 parser.Parse(stream.GetData(), stream.GetSize(), 0); | 728 parser.Parse(stream.GetData(), stream.GetSize(), 0); |
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1574 buf.AppendChar((char)code); | 1573 buf.AppendChar((char)code); |
1575 } | 1574 } |
1576 bFirst = !bFirst; | 1575 bFirst = !bFirst; |
1577 } | 1576 } |
1578 } | 1577 } |
1579 if (!bFirst) { | 1578 if (!bFirst) { |
1580 buf.AppendChar((char)code); | 1579 buf.AppendChar((char)code); |
1581 } | 1580 } |
1582 return buf.GetByteString(); | 1581 return buf.GetByteString(); |
1583 } | 1582 } |
OLD | NEW |