Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(777)

Side by Side Diff: core/src/fpdfapi/fpdf_page/pageint.h

Issue 1800523005: Move core/src/ up to core/. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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_
OLDNEW
« no previous file with comments | « core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp ('k') | core/src/fpdfapi/fpdf_parser/cfdf_document.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698