• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 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_FPDFAPI_PAGE_CPDF_STREAMCONTENTPARSER_H_
8 #define CORE_FPDFAPI_PAGE_CPDF_STREAMCONTENTPARSER_H_
9 
10 #include <map>
11 #include <memory>
12 #include <set>
13 #include <vector>
14 
15 #include "core/fpdfapi/page/cpdf_contentmark.h"
16 #include "core/fpdfapi/parser/cpdf_stream.h"
17 #include "core/fxcrt/fx_string.h"
18 #include "core/fxge/cfx_pathdata.h"
19 
20 class CPDF_AllStates;
21 class CPDF_Dictionary;
22 class CPDF_Document;
23 class CPDF_Font;
24 class CPDF_Image;
25 class CPDF_ImageObject;
26 class CPDF_PageObject;
27 class CPDF_PageObjectHolder;
28 class CPDF_StreamParser;
29 class CPDF_TextObject;
30 class CPDF_ColorSpace;
31 class CPDF_Pattern;
32 
33 class CPDF_StreamContentParser {
34  public:
35   CPDF_StreamContentParser(CPDF_Document* pDoc,
36                            CPDF_Dictionary* pPageResources,
37                            CPDF_Dictionary* pParentResources,
38                            const CFX_Matrix* pmtContentToUser,
39                            CPDF_PageObjectHolder* pObjectHolder,
40                            CPDF_Dictionary* pResources,
41                            const CFX_FloatRect& rcBBox,
42                            CPDF_AllStates* pAllStates,
43                            std::set<const uint8_t*>* parsedSet);
44   ~CPDF_StreamContentParser();
45 
46   uint32_t Parse(const uint8_t* pData, uint32_t dwSize, uint32_t max_cost);
GetPageObjectHolder()47   CPDF_PageObjectHolder* GetPageObjectHolder() const {
48     return m_pObjectHolder.Get();
49   }
GetCurStates()50   CPDF_AllStates* GetCurStates() const { return m_pCurStates.get(); }
IsColored()51   bool IsColored() const { return m_bColored; }
GetType3Data()52   const float* GetType3Data() const { return m_Type3Data; }
53   CPDF_Font* FindFont(const ByteString& name);
54 
55   static ByteStringView FindKeyAbbreviationForTesting(
56       const ByteStringView& abbr);
57   static ByteStringView FindValueAbbreviationForTesting(
58       const ByteStringView& abbr);
59 
60  private:
61   struct ContentParam {
62     enum Type { OBJECT = 0, NUMBER, NAME };
63 
64     ContentParam();
65     ~ContentParam();
66 
67     Type m_Type;
68     std::unique_ptr<CPDF_Object> m_pObject;
69     struct {
70       bool m_bInteger;
71       union {
72         int m_Integer;
73         float m_Float;
74       };
75     } m_Number;
76     struct {
77       int m_Len;
78       char m_Buffer[32];
79     } m_Name;
80   };
81 
82   static const int kParamBufSize = 16;
83 
84   using OpCodes = std::map<uint32_t, void (CPDF_StreamContentParser::*)()>;
85   static OpCodes InitializeOpCodes();
86 
87   void AddNameParam(const ByteStringView& str);
88   void AddNumberParam(const ByteStringView& str);
89   void AddObjectParam(std::unique_ptr<CPDF_Object> pObj);
90   int GetNextParamPos();
91   void ClearAllParams();
92   CPDF_Object* GetObject(uint32_t index);
93   ByteString GetString(uint32_t index);
94   float GetNumber(uint32_t index);
GetInteger(uint32_t index)95   int GetInteger(uint32_t index) { return (int32_t)(GetNumber(index)); }
96   void OnOperator(const ByteStringView& op);
97   void AddTextObject(ByteString* pText,
98                      float fInitKerning,
99                      float* pKerning,
100                      int count);
101 
102   void OnChangeTextMatrix();
103   void ParsePathObject();
104   void AddPathPoint(float x, float y, FXPT_TYPE type, bool close);
105   void AddPathRect(float x, float y, float w, float h);
106   void AddPathObject(int FillType, bool bStroke);
107   CPDF_ImageObject* AddImage(std::unique_ptr<CPDF_Stream> pStream);
108   CPDF_ImageObject* AddImage(uint32_t streamObjNum);
109   CPDF_ImageObject* AddImage(const RetainPtr<CPDF_Image>& pImage);
110 
111   void AddForm(CPDF_Stream* pStream);
112   void SetGraphicStates(CPDF_PageObject* pObj,
113                         bool bColor,
114                         bool bText,
115                         bool bGraph);
116   CPDF_ColorSpace* FindColorSpace(const ByteString& name);
117   CPDF_Pattern* FindPattern(const ByteString& name, bool bShading);
118   CPDF_Object* FindResourceObj(const ByteString& type, const ByteString& name);
119 
120   // Takes ownership of |pImageObj|, returns unowned pointer to it.
121   CPDF_ImageObject* AddImageObject(std::unique_ptr<CPDF_ImageObject> pImageObj);
122 
123   void Handle_CloseFillStrokePath();
124   void Handle_FillStrokePath();
125   void Handle_CloseEOFillStrokePath();
126   void Handle_EOFillStrokePath();
127   void Handle_BeginMarkedContent_Dictionary();
128   void Handle_BeginImage();
129   void Handle_BeginMarkedContent();
130   void Handle_BeginText();
131   void Handle_CurveTo_123();
132   void Handle_ConcatMatrix();
133   void Handle_SetColorSpace_Fill();
134   void Handle_SetColorSpace_Stroke();
135   void Handle_SetDash();
136   void Handle_SetCharWidth();
137   void Handle_SetCachedDevice();
138   void Handle_ExecuteXObject();
139   void Handle_MarkPlace_Dictionary();
140   void Handle_EndImage();
141   void Handle_EndMarkedContent();
142   void Handle_EndText();
143   void Handle_FillPath();
144   void Handle_FillPathOld();
145   void Handle_EOFillPath();
146   void Handle_SetGray_Fill();
147   void Handle_SetGray_Stroke();
148   void Handle_SetExtendGraphState();
149   void Handle_ClosePath();
150   void Handle_SetFlat();
151   void Handle_BeginImageData();
152   void Handle_SetLineJoin();
153   void Handle_SetLineCap();
154   void Handle_SetCMYKColor_Fill();
155   void Handle_SetCMYKColor_Stroke();
156   void Handle_LineTo();
157   void Handle_MoveTo();
158   void Handle_SetMiterLimit();
159   void Handle_MarkPlace();
160   void Handle_EndPath();
161   void Handle_SaveGraphState();
162   void Handle_RestoreGraphState();
163   void Handle_Rectangle();
164   void Handle_SetRGBColor_Fill();
165   void Handle_SetRGBColor_Stroke();
166   void Handle_SetRenderIntent();
167   void Handle_CloseStrokePath();
168   void Handle_StrokePath();
169   void Handle_SetColor_Fill();
170   void Handle_SetColor_Stroke();
171   void Handle_SetColorPS_Fill();
172   void Handle_SetColorPS_Stroke();
173   void Handle_ShadeFill();
174   void Handle_SetCharSpace();
175   void Handle_MoveTextPoint();
176   void Handle_MoveTextPoint_SetLeading();
177   void Handle_SetFont();
178   void Handle_ShowText();
179   void Handle_ShowText_Positioning();
180   void Handle_SetTextLeading();
181   void Handle_SetTextMatrix();
182   void Handle_SetTextRenderMode();
183   void Handle_SetTextRise();
184   void Handle_SetWordSpace();
185   void Handle_SetHorzScale();
186   void Handle_MoveToNextLine();
187   void Handle_CurveTo_23();
188   void Handle_SetLineWidth();
189   void Handle_Clip();
190   void Handle_EOClip();
191   void Handle_CurveTo_13();
192   void Handle_NextLineShowText();
193   void Handle_NextLineShowText_Space();
194   void Handle_Invalid();
195 
196   UnownedPtr<CPDF_Document> const m_pDocument;
197   UnownedPtr<CPDF_Dictionary> const m_pPageResources;
198   UnownedPtr<CPDF_Dictionary> const m_pParentResources;
199   UnownedPtr<CPDF_Dictionary> m_pResources;
200   UnownedPtr<CPDF_PageObjectHolder> const m_pObjectHolder;
201   UnownedPtr<std::set<const uint8_t*>> const m_ParsedSet;
202   CFX_Matrix m_mtContentToUser;
203   const CFX_FloatRect m_BBox;
204   ContentParam m_ParamBuf[kParamBufSize];
205   uint32_t m_ParamStartPos;
206   uint32_t m_ParamCount;
207   CPDF_StreamParser* m_pSyntax;
208   std::unique_ptr<CPDF_AllStates> m_pCurStates;
209   CPDF_ContentMark m_CurContentMark;
210   std::vector<std::unique_ptr<CPDF_TextObject>> m_ClipTextList;
211   UnownedPtr<CPDF_TextObject> m_pLastTextObject;
212   float m_DefFontSize;
213   std::vector<FX_PATHPOINT> m_PathPoints;
214   float m_PathStartX;
215   float m_PathStartY;
216   float m_PathCurrentX;
217   float m_PathCurrentY;
218   uint8_t m_PathClipType;
219   ByteString m_LastImageName;
220   RetainPtr<CPDF_Image> m_pLastImage;
221   bool m_bColored;
222   float m_Type3Data[6];
223   bool m_bResourceMissing;
224   std::vector<std::unique_ptr<CPDF_AllStates>> m_StateStack;
225 };
226 
227 #endif  // CORE_FPDFAPI_PAGE_CPDF_STREAMCONTENTPARSER_H_
228