CFX_MapByteStringToPtr considered harmful.
[pdfium.git] / core / src / fpdfapi / fpdf_page / pageint.h
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
12 #include "../../../../third_party/base/nonstd_unique_ptr.h"
13 #include "../../../include/fpdfapi/fpdf_pageobj.h"
14
15 #define PARSE_STEP_LIMIT 100
16
17 class CPDF_StreamParser {
18  public:
19   CPDF_StreamParser(const uint8_t* pData, FX_DWORD dwSize);
20   ~CPDF_StreamParser();
21
22   CPDF_Stream* ReadInlineStream(CPDF_Document* pDoc,
23                                 CPDF_Dictionary* pDict,
24                                 CPDF_Object* pCSObj,
25                                 FX_BOOL bDecode);
26   typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType;
27
28   SyntaxType ParseNextElement();
29   uint8_t* GetWordBuf() { return m_WordBuffer; }
30   FX_DWORD GetWordSize() { return m_WordSize; }
31   CPDF_Object* GetObject() {
32     CPDF_Object* pObj = m_pLastObj;
33     m_pLastObj = NULL;
34     return pObj;
35   }
36   FX_DWORD GetPos() { return m_Pos; }
37   void SetPos(FX_DWORD pos) { m_Pos = pos; }
38
39   CPDF_Object* ReadNextObject(FX_BOOL bAllowNestedArray = FALSE,
40                               FX_BOOL bInArray = FALSE);
41   void SkipPathObject();
42
43  protected:
44   void GetNextWord(FX_BOOL& bIsNumber);
45   CFX_ByteString ReadString();
46   CFX_ByteString ReadHexString();
47   const uint8_t* m_pBuf;
48   FX_DWORD m_Size;
49   FX_DWORD m_Pos;
50   uint8_t m_WordBuffer[256];
51   FX_DWORD m_WordSize;
52   CPDF_Object* m_pLastObj;
53 };
54 typedef enum {
55   PDFOP_CloseFillStrokePath = 0,
56   PDFOP_FillStrokePath,
57   PDFOP_CloseEOFillStrokePath,
58   PDFOP_EOFillStrokePath,
59   PDFOP_BeginMarkedContent_Dictionary,
60   PDFOP_BeginImage,
61   PDFOP_BeginMarkedContent,
62   PDFOP_BeginText,
63   PDFOP_BeginSectionUndefined,
64   PDFOP_CurveTo_123,
65   PDFOP_ConcatMatrix,
66   PDFOP_SetColorSpace_Fill,
67   PDFOP_SetColorSpace_Stroke,
68   PDFOP_SetDash,
69   PDFOP_SetCharWidth,
70   PDFOP_SetCachedDevice,
71   PDFOP_ExecuteXObject,
72   PDFOP_MarkPlace_Dictionary,
73   PDFOP_EndImage,
74   PDFOP_EndMarkedContent,
75   PDFOP_EndText,
76   PDFOP_EndSectionUndefined,
77   PDFOP_FillPath,
78   PDFOP_FillPathOld,
79   PDFOP_EOFillPath,
80   PDFOP_SetGray_Fill,
81   PDFOP_SetGray_Stroke,
82   PDFOP_SetExtendGraphState,
83   PDFOP_ClosePath,
84   PDFOP_SetFlat,
85   PDFOP_BeginImageData,
86   PDFOP_SetLineJoin,
87   PDFOP_SetLineCap,
88   PDFOP_SetCMYKColor_Fill,
89   PDFOP_SetCMYKColor_Stroke,
90   PDFOP_LineTo,
91   PDFOP_MoveTo,
92   PDFOP_SetMiterLimit,
93   PDFOP_MarkPlace,
94   PDFOP_EndPath,
95   PDFOP_SaveGraphState,
96   PDFOP_RestoreGraphState,
97   PDFOP_Rectangle,
98   PDFOP_SetRGBColor_Fill,
99   PDFOP_SetRGBColor_Stroke,
100   PDFOP_SetRenderIntent,
101   PDFOP_CloseStrokePath,
102   PDFOP_StrokePath,
103   PDFOP_SetColor_Fill,
104   PDFOP_SetColor_Stroke,
105   PDFOP_SetColorPS_Fill,
106   PDFOP_SetColorPS_Stroke,
107   PDFOP_ShadeFill,
108   PDFOP_SetCharSpace,
109   PDFOP_MoveTextPoint,
110   PDFOP_MoveTextPoint_SetLeading,
111   PDFOP_SetFont,
112   PDFOP_ShowText,
113   PDFOP_ShowText_Positioning,
114   PDFOP_SetTextLeading,
115   PDFOP_SetTextMatrix,
116   PDFOP_SetTextRenderMode,
117   PDFOP_SetTextRise,
118   PDFOP_SetWordSpace,
119   PDFOP_SetHorzScale,
120   PDFOP_MoveToNextLine,
121   PDFOP_CurveTo_23,
122   PDFOP_SetLineWidth,
123   PDFOP_Clip,
124   PDFOP_EOClip,
125   PDFOP_CurveTo_13,
126   PDFOP_NextLineShowText,
127   PDFOP_NextLineShowText_Space,
128   PDFOP_Invalid
129 } PDFOP;
130 #define PARAM_BUF_SIZE 16
131 typedef struct {
132   int m_Type;
133   union {
134     struct {
135       FX_BOOL m_bInteger;
136       union {
137         int m_Integer;
138         FX_FLOAT m_Float;
139       };
140     } m_Number;
141     CPDF_Object* m_pObject;
142     struct {
143       int m_Len;
144       char m_Buffer[32];
145     } m_Name;
146   };
147 } _ContentParam;
148 #define _FPDF_MAX_FORM_LEVEL_ 30
149 #define _FPDF_MAX_TYPE3_FORM_LEVEL_ 4
150 #define _FPDF_MAX_OBJECT_STACK_SIZE_ 512
151 class CPDF_StreamContentParser {
152  public:
153   CPDF_StreamContentParser(CPDF_Document* pDoc,
154                            CPDF_Dictionary* pPageResources,
155                            CPDF_Dictionary* pParentResources,
156                            CFX_AffineMatrix* pmtContentToUser,
157                            CPDF_PageObjects* pObjList,
158                            CPDF_Dictionary* pResources,
159                            CFX_FloatRect* pBBox,
160                            CPDF_ParseOptions* pOptions,
161                            CPDF_AllStates* pAllStates,
162                            int level);
163   ~CPDF_StreamContentParser();
164
165   FX_BOOL ShouldAbort() const { return m_bAbort; }
166   CPDF_PageObjects* GetObjectList() const { return m_pObjectList; }
167   CPDF_AllStates* GetCurStates() const { return m_pCurStates.get(); }
168   FX_BOOL IsColored() const { return m_bColored; }
169   const FX_FLOAT* GetType3Data() const { return m_Type3Data; }
170
171   void AddNumberParam(const FX_CHAR* str, int len);
172   void AddObjectParam(CPDF_Object* pObj);
173   void AddNameParam(const FX_CHAR* name, int size);
174   int GetNextParamPos();
175   void ClearAllParams();
176   CPDF_Object* GetObject(FX_DWORD index);
177   CFX_ByteString GetString(FX_DWORD index);
178   FX_FLOAT GetNumber(FX_DWORD index);
179   FX_FLOAT GetNumber16(FX_DWORD index);
180   int GetInteger(FX_DWORD index) { return (int32_t)(GetNumber(index)); }
181   FX_BOOL OnOperator(const FX_CHAR* op);
182   void BigCaseCaller(int index);
183   FX_DWORD GetParsePos() { return m_pSyntax->GetPos(); }
184   void AddTextObject(CFX_ByteString* pText,
185                      FX_FLOAT fInitKerning,
186                      FX_FLOAT* pKerning,
187                      int count);
188
189   void ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);
190   void ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);
191   void OnChangeTextMatrix();
192   FX_DWORD Parse(const uint8_t* pData, FX_DWORD dwSize, FX_DWORD max_cost);
193   void ParsePathObject();
194   void AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag);
195   void AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h);
196   void AddPathObject(int FillType, FX_BOOL bStroke);
197   CPDF_ImageObject* AddImage(CPDF_Stream* pStream,
198                              CPDF_Image* pImage,
199                              FX_BOOL bInline);
200   void AddDuplicateImage();
201   void AddForm(CPDF_Stream*);
202   void SetGraphicStates(CPDF_PageObject* pObj,
203                         FX_BOOL bColor,
204                         FX_BOOL bText,
205                         FX_BOOL bGraph);
206   void SaveStates(CPDF_AllStates*);
207   void RestoreStates(CPDF_AllStates*);
208   CPDF_Font* FindFont(const CFX_ByteString& name);
209   CPDF_ColorSpace* FindColorSpace(const CFX_ByteString& name);
210   CPDF_Pattern* FindPattern(const CFX_ByteString& name, FX_BOOL bShading);
211   CPDF_Object* FindResourceObj(const CFX_ByteStringC& type,
212                                const CFX_ByteString& name);
213
214  protected:
215   struct OpCode {
216     FX_DWORD m_OpId;
217     void (CPDF_StreamContentParser::*m_OpHandler)();
218   };
219   static const OpCode g_OpCodes[];
220
221   void Handle_CloseFillStrokePath();
222   void Handle_FillStrokePath();
223   void Handle_CloseEOFillStrokePath();
224   void Handle_EOFillStrokePath();
225   void Handle_BeginMarkedContent_Dictionary();
226   void Handle_BeginImage();
227   void Handle_BeginMarkedContent();
228   void Handle_BeginText();
229   void Handle_BeginSectionUndefined();
230   void Handle_CurveTo_123();
231   void Handle_ConcatMatrix();
232   void Handle_SetColorSpace_Fill();
233   void Handle_SetColorSpace_Stroke();
234   void Handle_SetDash();
235   void Handle_SetCharWidth();
236   void Handle_SetCachedDevice();
237   void Handle_ExecuteXObject();
238   void Handle_MarkPlace_Dictionary();
239   void Handle_EndImage();
240   void Handle_EndMarkedContent();
241   void Handle_EndText();
242   void Handle_EndSectionUndefined();
243   void Handle_FillPath();
244   void Handle_FillPathOld();
245   void Handle_EOFillPath();
246   void Handle_SetGray_Fill();
247   void Handle_SetGray_Stroke();
248   void Handle_SetExtendGraphState();
249   void Handle_ClosePath();
250   void Handle_SetFlat();
251   void Handle_BeginImageData();
252   void Handle_SetLineJoin();
253   void Handle_SetLineCap();
254   void Handle_SetCMYKColor_Fill();
255   void Handle_SetCMYKColor_Stroke();
256   void Handle_LineTo();
257   void Handle_MoveTo();
258   void Handle_SetMiterLimit();
259   void Handle_MarkPlace();
260   void Handle_EndPath();
261   void Handle_SaveGraphState();
262   void Handle_RestoreGraphState();
263   void Handle_Rectangle();
264   void Handle_SetRGBColor_Fill();
265   void Handle_SetRGBColor_Stroke();
266   void Handle_SetRenderIntent();
267   void Handle_CloseStrokePath();
268   void Handle_StrokePath();
269   void Handle_SetColor_Fill();
270   void Handle_SetColor_Stroke();
271   void Handle_SetColorPS_Fill();
272   void Handle_SetColorPS_Stroke();
273   void Handle_ShadeFill();
274   void Handle_SetCharSpace();
275   void Handle_MoveTextPoint();
276   void Handle_MoveTextPoint_SetLeading();
277   void Handle_SetFont();
278   void Handle_ShowText();
279   void Handle_ShowText_Positioning();
280   void Handle_SetTextLeading();
281   void Handle_SetTextMatrix();
282   void Handle_SetTextRenderMode();
283   void Handle_SetTextRise();
284   void Handle_SetWordSpace();
285   void Handle_SetHorzScale();
286   void Handle_MoveToNextLine();
287   void Handle_CurveTo_23();
288   void Handle_SetLineWidth();
289   void Handle_Clip();
290   void Handle_EOClip();
291   void Handle_CurveTo_13();
292   void Handle_NextLineShowText();
293   void Handle_NextLineShowText_Space();
294   void Handle_Invalid();
295
296   CPDF_Document* const m_pDocument;
297   CPDF_Dictionary* m_pPageResources;
298   CPDF_Dictionary* m_pParentResources;
299   CPDF_Dictionary* m_pResources;
300   CPDF_PageObjects* m_pObjectList;
301   int m_Level;
302   CFX_AffineMatrix m_mtContentToUser;
303   CFX_FloatRect m_BBox;
304   CPDF_ParseOptions m_Options;
305   _ContentParam m_ParamBuf1[PARAM_BUF_SIZE];
306   FX_DWORD m_ParamStartPos;
307   FX_DWORD m_ParamCount;
308   FX_BOOL m_bAbort;
309   CPDF_StreamParser* m_pSyntax;
310   nonstd::unique_ptr<CPDF_AllStates> m_pCurStates;
311   CPDF_ContentMark m_CurContentMark;
312   CFX_PtrArray m_ClipTextList;
313   CPDF_TextObject* m_pLastTextObject;
314   FX_FLOAT m_DefFontSize;
315   int m_CompatCount;
316   FX_PATHPOINT* m_pPathPoints;
317   int m_PathPointCount;
318   int m_PathAllocSize;
319   FX_FLOAT m_PathStartX;
320   FX_FLOAT m_PathStartY;
321   FX_FLOAT m_PathCurrentX;
322   FX_FLOAT m_PathCurrentY;
323   int m_PathClipType;
324   CFX_ByteString m_LastImageName;
325   CPDF_Image* m_pLastImage;
326   CFX_BinaryBuf m_LastImageDict;
327   CFX_BinaryBuf m_LastImageData;
328   CPDF_Dictionary* m_pLastImageDict;
329   CPDF_Dictionary* m_pLastCloneImageDict;
330   FX_BOOL m_bReleaseLastDict;
331   FX_BOOL m_bSameLastDict;
332   FX_BOOL m_bColored;
333   FX_FLOAT m_Type3Data[6];
334   FX_BOOL m_bResourceMissing;
335   CFX_PtrArray m_StateStack;
336 };
337 class CPDF_ContentParser {
338  public:
339   enum ParseStatus { Ready, ToBeContinued, Done };
340
341   CPDF_ContentParser();
342   ~CPDF_ContentParser();
343
344   ParseStatus GetStatus() { return m_Status; }
345   void Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions);
346   void Start(CPDF_Form* pForm,
347              CPDF_AllStates* pGraphicStates,
348              CFX_AffineMatrix* pParentMatrix,
349              CPDF_Type3Char* pType3Char,
350              CPDF_ParseOptions* pOptions,
351              int level);
352   void Continue(IFX_Pause* pPause);
353
354  protected:
355   void Clear();
356   ParseStatus m_Status;
357   CPDF_PageObjects* m_pObjects;
358   FX_BOOL m_bForm;
359   CPDF_ParseOptions m_Options;
360   CPDF_Type3Char* m_pType3Char;
361   int m_InternalStage;
362   CPDF_StreamAcc* m_pSingleStream;
363   CPDF_StreamAcc** m_pStreamArray;
364   FX_DWORD m_nStreams;
365   uint8_t* m_pData;
366   FX_DWORD m_Size;
367   class CPDF_StreamContentParser* m_pParser;
368   FX_DWORD m_CurrentOffset;
369 };
370 class CPDF_AllStates : public CPDF_GraphicStates {
371  public:
372   CPDF_AllStates();
373   ~CPDF_AllStates();
374   void Copy(const CPDF_AllStates& src);
375   void ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser);
376   void SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale);
377   CFX_AffineMatrix m_TextMatrix, m_CTM, m_ParentMatrix;
378   FX_FLOAT m_TextX, m_TextY, m_TextLineX, m_TextLineY;
379   FX_FLOAT m_TextLeading, m_TextRise, m_TextHorzScale;
380 };
381
382 class CPDF_DocPageData {
383  public:
384   explicit CPDF_DocPageData(CPDF_Document* pPDFDoc);
385   ~CPDF_DocPageData();
386
387   void Clear(FX_BOOL bRelease = FALSE);
388   CPDF_Font* GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);
389   CPDF_Font* GetStandardFont(const CFX_ByteStringC& fontName,
390                              CPDF_FontEncoding* pEncoding);
391   void ReleaseFont(CPDF_Dictionary* pFontDict);
392   CPDF_ColorSpace* GetColorSpace(CPDF_Object* pCSObj,
393                                  CPDF_Dictionary* pResources);
394   CPDF_ColorSpace* GetCopiedColorSpace(CPDF_Object* pCSObj);
395   void ReleaseColorSpace(CPDF_Object* pColorSpace);
396   CPDF_Pattern* GetPattern(CPDF_Object* pPatternObj,
397                            FX_BOOL bShading,
398                            const CFX_AffineMatrix* matrix);
399   void ReleasePattern(CPDF_Object* pPatternObj);
400   CPDF_Image* GetImage(CPDF_Object* pImageStream);
401   void ReleaseImage(CPDF_Object* pImageStream);
402   CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream);
403   void ReleaseIccProfile(CPDF_IccProfile* pIccProfile);
404   CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream);
405   void ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream,
406                                 FX_BOOL bForce = FALSE);
407   FX_BOOL IsForceClear() const { return m_bForceClear; }
408   CPDF_CountedColorSpace* FindColorSpacePtr(CPDF_Object* pCSObj) const;
409   CPDF_CountedPattern* FindPatternPtr(CPDF_Object* pPatternObj) const;
410
411  private:
412   using CPDF_CountedFont = CPDF_CountedObject<CPDF_Font>;
413   using CPDF_CountedIccProfile = CPDF_CountedObject<CPDF_IccProfile>;
414   using CPDF_CountedImage = CPDF_CountedObject<CPDF_Image>;
415   using CPDF_CountedStreamAcc = CPDF_CountedObject<CPDF_StreamAcc>;
416
417   using CPDF_ColorSpaceMap = std::map<CPDF_Object*, CPDF_CountedColorSpace*>;
418   using CPDF_FontFileMap = std::map<CPDF_Stream*, CPDF_CountedStreamAcc*>;
419   using CPDF_FontMap = std::map<CPDF_Dictionary*, CPDF_CountedFont*>;
420   using CPDF_IccProfileMap = std::map<CPDF_Stream*, CPDF_CountedIccProfile*>;
421   using CPDF_ImageMap = std::map<FX_DWORD, CPDF_CountedImage*>;
422   using CPDF_PatternMap = std::map<CPDF_Object*, CPDF_CountedPattern*>;
423
424   CPDF_Document* const m_pPDFDoc;
425   FX_BOOL m_bForceClear;
426   std::map<CFX_ByteString, CPDF_Stream*> m_HashProfileMap;
427   CPDF_ColorSpaceMap m_ColorSpaceMap;
428   CPDF_FontFileMap m_FontFileMap;
429   CPDF_FontMap m_FontMap;
430   CPDF_IccProfileMap m_IccProfileMap;
431   CPDF_ImageMap m_ImageMap;
432   CPDF_PatternMap m_PatternMap;
433 };
434
435 class CPDF_Function {
436  public:
437   static CPDF_Function* Load(CPDF_Object* pFuncObj);
438   virtual ~CPDF_Function();
439   FX_BOOL Call(FX_FLOAT* inputs,
440                int ninputs,
441                FX_FLOAT* results,
442                int& nresults) const;
443   int CountInputs() { return m_nInputs; }
444   int CountOutputs() { return m_nOutputs; }
445
446  protected:
447   CPDF_Function();
448   int m_nInputs, m_nOutputs;
449   FX_FLOAT* m_pDomains;
450   FX_FLOAT* m_pRanges;
451   FX_BOOL Init(CPDF_Object* pObj);
452   virtual FX_BOOL v_Init(CPDF_Object* pObj) = 0;
453   virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0;
454 };
455 class CPDF_IccProfile {
456  public:
457   CPDF_IccProfile(const uint8_t* pData, FX_DWORD dwSize);
458   ~CPDF_IccProfile();
459   int32_t GetComponents() const { return m_nSrcComponents; }
460   FX_BOOL m_bsRGB;
461   void* m_pTransform;
462
463  private:
464   int32_t m_nSrcComponents;
465 };
466
467 class CPDF_DeviceCS : public CPDF_ColorSpace {
468  public:
469   CPDF_DeviceCS(CPDF_Document* pDoc, int family);
470
471   FX_BOOL GetRGB(FX_FLOAT* pBuf,
472                  FX_FLOAT& R,
473                  FX_FLOAT& G,
474                  FX_FLOAT& B) const override;
475   FX_BOOL SetRGB(FX_FLOAT* pBuf,
476                  FX_FLOAT R,
477                  FX_FLOAT G,
478                  FX_FLOAT B) const override;
479   FX_BOOL v_GetCMYK(FX_FLOAT* pBuf,
480                     FX_FLOAT& c,
481                     FX_FLOAT& m,
482                     FX_FLOAT& y,
483                     FX_FLOAT& k) const override;
484   FX_BOOL v_SetCMYK(FX_FLOAT* pBuf,
485                     FX_FLOAT c,
486                     FX_FLOAT m,
487                     FX_FLOAT y,
488                     FX_FLOAT k) const override;
489   void TranslateImageLine(uint8_t* pDestBuf,
490                           const uint8_t* pSrcBuf,
491                           int pixels,
492                           int image_width,
493                           int image_height,
494                           FX_BOOL bTransMask = FALSE) const override;
495 };
496
497 class CPDF_PatternCS : public CPDF_ColorSpace {
498  public:
499   explicit CPDF_PatternCS(CPDF_Document* pDoc)
500       : CPDF_ColorSpace(pDoc, PDFCS_PATTERN, 1),
501         m_pBaseCS(nullptr),
502         m_pCountedBaseCS(nullptr) {}
503   ~CPDF_PatternCS() override;
504   FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
505   FX_BOOL GetRGB(FX_FLOAT* pBuf,
506                  FX_FLOAT& R,
507                  FX_FLOAT& G,
508                  FX_FLOAT& B) const override;
509   CPDF_ColorSpace* GetBaseCS() const override;
510
511  private:
512   CPDF_ColorSpace* m_pBaseCS;
513   CPDF_CountedColorSpace* m_pCountedBaseCS;
514 };
515
516 #endif  // CORE_SRC_FPDFAPI_FPDF_PAGE_PAGEINT_H_