OLD | NEW |
| (Empty) |
1 // Copyright 2014 PDFium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
6 | |
7 #ifndef CORE_SRC_FPDFAPI_FPDF_PAGE_PAGEINT_H_ | |
8 #define CORE_SRC_FPDFAPI_FPDF_PAGE_PAGEINT_H_ | |
9 | |
10 #include <map> | |
11 #include <memory> | |
12 #include <unordered_map> | |
13 #include <vector> | |
14 | |
15 #include "core/include/fpdfapi/fpdf_page.h" | |
16 #include "core/include/fpdfapi/fpdf_pageobj.h" | |
17 | |
18 class CPDF_AllStates; | |
19 class CPDF_ParseOptions; | |
20 class CPDF_IccProfile; | |
21 | |
22 #define PARSE_STEP_LIMIT 100 | |
23 | |
24 class CPDF_StreamParser { | |
25 public: | |
26 enum SyntaxType { EndOfData, Number, Keyword, Name, Others }; | |
27 | |
28 CPDF_StreamParser(const uint8_t* pData, FX_DWORD dwSize); | |
29 ~CPDF_StreamParser(); | |
30 | |
31 CPDF_Stream* ReadInlineStream(CPDF_Document* pDoc, | |
32 CPDF_Dictionary* pDict, | |
33 CPDF_Object* pCSObj, | |
34 FX_BOOL bDecode); | |
35 SyntaxType ParseNextElement(); | |
36 uint8_t* GetWordBuf() { return m_WordBuffer; } | |
37 FX_DWORD GetWordSize() const { return m_WordSize; } | |
38 CPDF_Object* GetObject() { | |
39 CPDF_Object* pObj = m_pLastObj; | |
40 m_pLastObj = NULL; | |
41 return pObj; | |
42 } | |
43 FX_DWORD GetPos() const { return m_Pos; } | |
44 void SetPos(FX_DWORD pos) { m_Pos = pos; } | |
45 CPDF_Object* ReadNextObject(FX_BOOL bAllowNestedArray = FALSE, | |
46 FX_BOOL bInArray = FALSE); | |
47 void SkipPathObject(); | |
48 | |
49 protected: | |
50 friend class fpdf_page_parser_old_ReadHexString_Test; | |
51 | |
52 void GetNextWord(FX_BOOL& bIsNumber); | |
53 CFX_ByteString ReadString(); | |
54 CFX_ByteString ReadHexString(); | |
55 const uint8_t* m_pBuf; | |
56 | |
57 // Length in bytes of m_pBuf. | |
58 FX_DWORD m_Size; | |
59 | |
60 // Current byte position within m_pBuf. | |
61 FX_DWORD m_Pos; | |
62 | |
63 uint8_t m_WordBuffer[256]; | |
64 FX_DWORD m_WordSize; | |
65 CPDF_Object* m_pLastObj; | |
66 | |
67 private: | |
68 bool PositionIsInBounds() const; | |
69 }; | |
70 | |
71 #define PARAM_BUF_SIZE 16 | |
72 struct ContentParam { | |
73 enum Type { OBJECT = 0, NUMBER, NAME }; | |
74 Type m_Type; | |
75 union { | |
76 struct { | |
77 FX_BOOL m_bInteger; | |
78 union { | |
79 int m_Integer; | |
80 FX_FLOAT m_Float; | |
81 }; | |
82 } m_Number; | |
83 CPDF_Object* m_pObject; | |
84 struct { | |
85 int m_Len; | |
86 char m_Buffer[32]; | |
87 } m_Name; | |
88 }; | |
89 }; | |
90 #define _FPDF_MAX_FORM_LEVEL_ 30 | |
91 #define _FPDF_MAX_TYPE3_FORM_LEVEL_ 4 | |
92 #define _FPDF_MAX_OBJECT_STACK_SIZE_ 512 | |
93 class CPDF_StreamContentParser { | |
94 public: | |
95 CPDF_StreamContentParser(CPDF_Document* pDoc, | |
96 CPDF_Dictionary* pPageResources, | |
97 CPDF_Dictionary* pParentResources, | |
98 CFX_Matrix* pmtContentToUser, | |
99 CPDF_PageObjectHolder* pObjectHolder, | |
100 CPDF_Dictionary* pResources, | |
101 CFX_FloatRect* pBBox, | |
102 CPDF_ParseOptions* pOptions, | |
103 CPDF_AllStates* pAllStates, | |
104 int level); | |
105 ~CPDF_StreamContentParser(); | |
106 | |
107 CPDF_PageObjectHolder* GetPageObjectHolder() const { return m_pObjectHolder; } | |
108 CPDF_AllStates* GetCurStates() const { return m_pCurStates.get(); } | |
109 FX_BOOL IsColored() const { return m_bColored; } | |
110 const FX_FLOAT* GetType3Data() const { return m_Type3Data; } | |
111 | |
112 void AddNumberParam(const FX_CHAR* str, int len); | |
113 void AddObjectParam(CPDF_Object* pObj); | |
114 void AddNameParam(const FX_CHAR* name, int size); | |
115 int GetNextParamPos(); | |
116 void ClearAllParams(); | |
117 CPDF_Object* GetObject(FX_DWORD index); | |
118 CFX_ByteString GetString(FX_DWORD index); | |
119 FX_FLOAT GetNumber(FX_DWORD index); | |
120 FX_FLOAT GetNumber16(FX_DWORD index); | |
121 int GetInteger(FX_DWORD index) { return (int32_t)(GetNumber(index)); } | |
122 void OnOperator(const FX_CHAR* op); | |
123 void BigCaseCaller(int index); | |
124 FX_DWORD GetParsePos() { return m_pSyntax->GetPos(); } | |
125 void AddTextObject(CFX_ByteString* pText, | |
126 FX_FLOAT fInitKerning, | |
127 FX_FLOAT* pKerning, | |
128 int count); | |
129 | |
130 void ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y); | |
131 void ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y); | |
132 void OnChangeTextMatrix(); | |
133 FX_DWORD Parse(const uint8_t* pData, FX_DWORD dwSize, FX_DWORD max_cost); | |
134 void ParsePathObject(); | |
135 void AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag); | |
136 void AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h); | |
137 void AddPathObject(int FillType, FX_BOOL bStroke); | |
138 CPDF_ImageObject* AddImage(CPDF_Stream* pStream, | |
139 CPDF_Image* pImage, | |
140 FX_BOOL bInline); | |
141 void AddDuplicateImage(); | |
142 void AddForm(CPDF_Stream* pStream); | |
143 void SetGraphicStates(CPDF_PageObject* pObj, | |
144 FX_BOOL bColor, | |
145 FX_BOOL bText, | |
146 FX_BOOL bGraph); | |
147 void SaveStates(CPDF_AllStates* pState); | |
148 void RestoreStates(CPDF_AllStates* pState); | |
149 CPDF_Font* FindFont(const CFX_ByteString& name); | |
150 CPDF_ColorSpace* FindColorSpace(const CFX_ByteString& name); | |
151 CPDF_Pattern* FindPattern(const CFX_ByteString& name, FX_BOOL bShading); | |
152 CPDF_Object* FindResourceObj(const CFX_ByteStringC& type, | |
153 const CFX_ByteString& name); | |
154 | |
155 protected: | |
156 using OpCodes = | |
157 std::unordered_map<FX_DWORD, void (CPDF_StreamContentParser::*)()>; | |
158 static OpCodes InitializeOpCodes(); | |
159 | |
160 void Handle_CloseFillStrokePath(); | |
161 void Handle_FillStrokePath(); | |
162 void Handle_CloseEOFillStrokePath(); | |
163 void Handle_EOFillStrokePath(); | |
164 void Handle_BeginMarkedContent_Dictionary(); | |
165 void Handle_BeginImage(); | |
166 void Handle_BeginMarkedContent(); | |
167 void Handle_BeginText(); | |
168 void Handle_CurveTo_123(); | |
169 void Handle_ConcatMatrix(); | |
170 void Handle_SetColorSpace_Fill(); | |
171 void Handle_SetColorSpace_Stroke(); | |
172 void Handle_SetDash(); | |
173 void Handle_SetCharWidth(); | |
174 void Handle_SetCachedDevice(); | |
175 void Handle_ExecuteXObject(); | |
176 void Handle_MarkPlace_Dictionary(); | |
177 void Handle_EndImage(); | |
178 void Handle_EndMarkedContent(); | |
179 void Handle_EndText(); | |
180 void Handle_FillPath(); | |
181 void Handle_FillPathOld(); | |
182 void Handle_EOFillPath(); | |
183 void Handle_SetGray_Fill(); | |
184 void Handle_SetGray_Stroke(); | |
185 void Handle_SetExtendGraphState(); | |
186 void Handle_ClosePath(); | |
187 void Handle_SetFlat(); | |
188 void Handle_BeginImageData(); | |
189 void Handle_SetLineJoin(); | |
190 void Handle_SetLineCap(); | |
191 void Handle_SetCMYKColor_Fill(); | |
192 void Handle_SetCMYKColor_Stroke(); | |
193 void Handle_LineTo(); | |
194 void Handle_MoveTo(); | |
195 void Handle_SetMiterLimit(); | |
196 void Handle_MarkPlace(); | |
197 void Handle_EndPath(); | |
198 void Handle_SaveGraphState(); | |
199 void Handle_RestoreGraphState(); | |
200 void Handle_Rectangle(); | |
201 void Handle_SetRGBColor_Fill(); | |
202 void Handle_SetRGBColor_Stroke(); | |
203 void Handle_SetRenderIntent(); | |
204 void Handle_CloseStrokePath(); | |
205 void Handle_StrokePath(); | |
206 void Handle_SetColor_Fill(); | |
207 void Handle_SetColor_Stroke(); | |
208 void Handle_SetColorPS_Fill(); | |
209 void Handle_SetColorPS_Stroke(); | |
210 void Handle_ShadeFill(); | |
211 void Handle_SetCharSpace(); | |
212 void Handle_MoveTextPoint(); | |
213 void Handle_MoveTextPoint_SetLeading(); | |
214 void Handle_SetFont(); | |
215 void Handle_ShowText(); | |
216 void Handle_ShowText_Positioning(); | |
217 void Handle_SetTextLeading(); | |
218 void Handle_SetTextMatrix(); | |
219 void Handle_SetTextRenderMode(); | |
220 void Handle_SetTextRise(); | |
221 void Handle_SetWordSpace(); | |
222 void Handle_SetHorzScale(); | |
223 void Handle_MoveToNextLine(); | |
224 void Handle_CurveTo_23(); | |
225 void Handle_SetLineWidth(); | |
226 void Handle_Clip(); | |
227 void Handle_EOClip(); | |
228 void Handle_CurveTo_13(); | |
229 void Handle_NextLineShowText(); | |
230 void Handle_NextLineShowText_Space(); | |
231 void Handle_Invalid(); | |
232 | |
233 CPDF_Document* const m_pDocument; | |
234 CPDF_Dictionary* m_pPageResources; | |
235 CPDF_Dictionary* m_pParentResources; | |
236 CPDF_Dictionary* m_pResources; | |
237 CPDF_PageObjectHolder* m_pObjectHolder; | |
238 int m_Level; | |
239 CFX_Matrix m_mtContentToUser; | |
240 CFX_FloatRect m_BBox; | |
241 CPDF_ParseOptions m_Options; | |
242 ContentParam m_ParamBuf[PARAM_BUF_SIZE]; | |
243 FX_DWORD m_ParamStartPos; | |
244 FX_DWORD m_ParamCount; | |
245 CPDF_StreamParser* m_pSyntax; | |
246 std::unique_ptr<CPDF_AllStates> m_pCurStates; | |
247 CPDF_ContentMark m_CurContentMark; | |
248 CFX_ArrayTemplate<CPDF_TextObject*> m_ClipTextList; | |
249 CPDF_TextObject* m_pLastTextObject; | |
250 FX_FLOAT m_DefFontSize; | |
251 FX_PATHPOINT* m_pPathPoints; | |
252 int m_PathPointCount; | |
253 int m_PathAllocSize; | |
254 FX_FLOAT m_PathStartX; | |
255 FX_FLOAT m_PathStartY; | |
256 FX_FLOAT m_PathCurrentX; | |
257 FX_FLOAT m_PathCurrentY; | |
258 int m_PathClipType; | |
259 CFX_ByteString m_LastImageName; | |
260 CPDF_Image* m_pLastImage; | |
261 CFX_BinaryBuf m_LastImageDict; | |
262 CFX_BinaryBuf m_LastImageData; | |
263 CPDF_Dictionary* m_pLastImageDict; | |
264 CPDF_Dictionary* m_pLastCloneImageDict; | |
265 FX_BOOL m_bReleaseLastDict; | |
266 FX_BOOL m_bSameLastDict; | |
267 FX_BOOL m_bColored; | |
268 FX_FLOAT m_Type3Data[6]; | |
269 FX_BOOL m_bResourceMissing; | |
270 std::vector<std::unique_ptr<CPDF_AllStates>> m_StateStack; | |
271 }; | |
272 class CPDF_ContentParser { | |
273 public: | |
274 enum ParseStatus { Ready, ToBeContinued, Done }; | |
275 | |
276 CPDF_ContentParser(); | |
277 ~CPDF_ContentParser(); | |
278 | |
279 ParseStatus GetStatus() const { return m_Status; } | |
280 void Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions); | |
281 void Start(CPDF_Form* pForm, | |
282 CPDF_AllStates* pGraphicStates, | |
283 CFX_Matrix* pParentMatrix, | |
284 CPDF_Type3Char* pType3Char, | |
285 CPDF_ParseOptions* pOptions, | |
286 int level); | |
287 void Continue(IFX_Pause* pPause); | |
288 | |
289 private: | |
290 enum InternalStage { | |
291 STAGE_GETCONTENT = 1, | |
292 STAGE_PARSE, | |
293 STAGE_CHECKCLIP, | |
294 }; | |
295 | |
296 ParseStatus m_Status; | |
297 InternalStage m_InternalStage; | |
298 CPDF_PageObjectHolder* m_pObjectHolder; | |
299 FX_BOOL m_bForm; | |
300 CPDF_ParseOptions m_Options; | |
301 CPDF_Type3Char* m_pType3Char; | |
302 FX_DWORD m_nStreams; | |
303 std::unique_ptr<CPDF_StreamAcc> m_pSingleStream; | |
304 std::vector<std::unique_ptr<CPDF_StreamAcc>> m_StreamArray; | |
305 uint8_t* m_pData; | |
306 FX_DWORD m_Size; | |
307 FX_DWORD m_CurrentOffset; | |
308 std::unique_ptr<CPDF_StreamContentParser> m_pParser; | |
309 }; | |
310 class CPDF_AllStates : public CPDF_GraphicStates { | |
311 public: | |
312 CPDF_AllStates(); | |
313 ~CPDF_AllStates(); | |
314 void Copy(const CPDF_AllStates& src); | |
315 void ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser); | |
316 void SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale); | |
317 CFX_Matrix m_TextMatrix, m_CTM, m_ParentMatrix; | |
318 FX_FLOAT m_TextX, m_TextY, m_TextLineX, m_TextLineY; | |
319 FX_FLOAT m_TextLeading, m_TextRise, m_TextHorzScale; | |
320 }; | |
321 | |
322 class CPDF_DocPageData { | |
323 public: | |
324 explicit CPDF_DocPageData(CPDF_Document* pPDFDoc); | |
325 ~CPDF_DocPageData(); | |
326 | |
327 void Clear(FX_BOOL bRelease = FALSE); | |
328 CPDF_Font* GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly); | |
329 CPDF_Font* GetStandardFont(const CFX_ByteStringC& fontName, | |
330 CPDF_FontEncoding* pEncoding); | |
331 void ReleaseFont(CPDF_Dictionary* pFontDict); | |
332 CPDF_ColorSpace* GetColorSpace(CPDF_Object* pCSObj, | |
333 const CPDF_Dictionary* pResources); | |
334 CPDF_ColorSpace* GetCopiedColorSpace(CPDF_Object* pCSObj); | |
335 void ReleaseColorSpace(CPDF_Object* pColorSpace); | |
336 CPDF_Pattern* GetPattern(CPDF_Object* pPatternObj, | |
337 FX_BOOL bShading, | |
338 const CFX_Matrix* matrix); | |
339 void ReleasePattern(CPDF_Object* pPatternObj); | |
340 CPDF_Image* GetImage(CPDF_Object* pImageStream); | |
341 void ReleaseImage(CPDF_Object* pImageStream); | |
342 CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream); | |
343 void ReleaseIccProfile(CPDF_IccProfile* pIccProfile); | |
344 CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream); | |
345 void ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, | |
346 FX_BOOL bForce = FALSE); | |
347 FX_BOOL IsForceClear() const { return m_bForceClear; } | |
348 CPDF_CountedColorSpace* FindColorSpacePtr(CPDF_Object* pCSObj) const; | |
349 CPDF_CountedPattern* FindPatternPtr(CPDF_Object* pPatternObj) const; | |
350 | |
351 private: | |
352 using CPDF_CountedFont = CPDF_CountedObject<CPDF_Font>; | |
353 using CPDF_CountedIccProfile = CPDF_CountedObject<CPDF_IccProfile>; | |
354 using CPDF_CountedImage = CPDF_CountedObject<CPDF_Image>; | |
355 using CPDF_CountedStreamAcc = CPDF_CountedObject<CPDF_StreamAcc>; | |
356 | |
357 using CPDF_ColorSpaceMap = std::map<CPDF_Object*, CPDF_CountedColorSpace*>; | |
358 using CPDF_FontFileMap = std::map<CPDF_Stream*, CPDF_CountedStreamAcc*>; | |
359 using CPDF_FontMap = std::map<CPDF_Dictionary*, CPDF_CountedFont*>; | |
360 using CPDF_IccProfileMap = std::map<CPDF_Stream*, CPDF_CountedIccProfile*>; | |
361 using CPDF_ImageMap = std::map<FX_DWORD, CPDF_CountedImage*>; | |
362 using CPDF_PatternMap = std::map<CPDF_Object*, CPDF_CountedPattern*>; | |
363 | |
364 CPDF_Document* const m_pPDFDoc; | |
365 FX_BOOL m_bForceClear; | |
366 std::map<CFX_ByteString, CPDF_Stream*> m_HashProfileMap; | |
367 CPDF_ColorSpaceMap m_ColorSpaceMap; | |
368 CPDF_FontFileMap m_FontFileMap; | |
369 CPDF_FontMap m_FontMap; | |
370 CPDF_IccProfileMap m_IccProfileMap; | |
371 CPDF_ImageMap m_ImageMap; | |
372 CPDF_PatternMap m_PatternMap; | |
373 }; | |
374 | |
375 class CPDF_Function { | |
376 public: | |
377 static CPDF_Function* Load(CPDF_Object* pFuncObj); | |
378 virtual ~CPDF_Function(); | |
379 FX_BOOL Call(FX_FLOAT* inputs, | |
380 int ninputs, | |
381 FX_FLOAT* results, | |
382 int& nresults) const; | |
383 int CountInputs() { return m_nInputs; } | |
384 int CountOutputs() { return m_nOutputs; } | |
385 | |
386 protected: | |
387 CPDF_Function(); | |
388 int m_nInputs, m_nOutputs; | |
389 FX_FLOAT* m_pDomains; | |
390 FX_FLOAT* m_pRanges; | |
391 FX_BOOL Init(CPDF_Object* pObj); | |
392 virtual FX_BOOL v_Init(CPDF_Object* pObj) = 0; | |
393 virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0; | |
394 }; | |
395 class CPDF_IccProfile { | |
396 public: | |
397 CPDF_IccProfile(const uint8_t* pData, FX_DWORD dwSize); | |
398 ~CPDF_IccProfile(); | |
399 FX_DWORD GetComponents() const { return m_nSrcComponents; } | |
400 FX_BOOL m_bsRGB; | |
401 void* m_pTransform; | |
402 | |
403 private: | |
404 FX_DWORD m_nSrcComponents; | |
405 }; | |
406 | |
407 class CPDF_DeviceCS : public CPDF_ColorSpace { | |
408 public: | |
409 CPDF_DeviceCS(CPDF_Document* pDoc, int family); | |
410 | |
411 FX_BOOL GetRGB(FX_FLOAT* pBuf, | |
412 FX_FLOAT& R, | |
413 FX_FLOAT& G, | |
414 FX_FLOAT& B) const override; | |
415 FX_BOOL SetRGB(FX_FLOAT* pBuf, | |
416 FX_FLOAT R, | |
417 FX_FLOAT G, | |
418 FX_FLOAT B) const override; | |
419 FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, | |
420 FX_FLOAT& c, | |
421 FX_FLOAT& m, | |
422 FX_FLOAT& y, | |
423 FX_FLOAT& k) const override; | |
424 FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, | |
425 FX_FLOAT c, | |
426 FX_FLOAT m, | |
427 FX_FLOAT y, | |
428 FX_FLOAT k) const override; | |
429 void TranslateImageLine(uint8_t* pDestBuf, | |
430 const uint8_t* pSrcBuf, | |
431 int pixels, | |
432 int image_width, | |
433 int image_height, | |
434 FX_BOOL bTransMask = FALSE) const override; | |
435 }; | |
436 | |
437 class CPDF_PatternCS : public CPDF_ColorSpace { | |
438 public: | |
439 explicit CPDF_PatternCS(CPDF_Document* pDoc) | |
440 : CPDF_ColorSpace(pDoc, PDFCS_PATTERN, 1), | |
441 m_pBaseCS(nullptr), | |
442 m_pCountedBaseCS(nullptr) {} | |
443 ~CPDF_PatternCS() override; | |
444 FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; | |
445 FX_BOOL GetRGB(FX_FLOAT* pBuf, | |
446 FX_FLOAT& R, | |
447 FX_FLOAT& G, | |
448 FX_FLOAT& B) const override; | |
449 CPDF_ColorSpace* GetBaseCS() const override; | |
450 | |
451 private: | |
452 CPDF_ColorSpace* m_pBaseCS; | |
453 CPDF_CountedColorSpace* m_pCountedBaseCS; | |
454 }; | |
455 | |
456 void PDF_ReplaceAbbr(CPDF_Object* pObj); | |
457 bool IsPathOperator(const uint8_t* buf, size_t len); | |
458 | |
459 #endif // CORE_SRC_FPDFAPI_FPDF_PAGE_PAGEINT_H_ | |
OLD | NEW |