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_INCLUDE_FPDFAPI_FPDF_PAGEOBJ_H_ | |
8 #define CORE_INCLUDE_FPDFAPI_FPDF_PAGEOBJ_H_ | |
9 | |
10 #include <vector> | |
11 | |
12 #include "core/include/fpdfapi/fpdf_resource.h" | |
13 #include "core/include/fxge/fx_ge.h" | |
14 | |
15 class CPDF_ClipPath; | |
16 class CPDF_ClipPathData; | |
17 class CPDF_ColorState; | |
18 class CPDF_ColorStateData; | |
19 class CPDF_ContentMark; | |
20 class CPDF_ContentMarkItem; | |
21 class CPDF_FormObject; | |
22 class CPDF_GeneralState; | |
23 class CPDF_GeneralStateData; | |
24 class CPDF_GraphicStates; | |
25 class CPDF_GraphState; | |
26 class CPDF_ImageObject; | |
27 class CPDF_PageObject; | |
28 class CPDF_Path; | |
29 class CPDF_PathObject; | |
30 class CPDF_ShadingObject; | |
31 class CPDF_TextObject; | |
32 class CPDF_TextState; | |
33 class CPDF_TextStateData; | |
34 class CPDF_TransferFunc; | |
35 | |
36 class CPDF_Path : public CFX_CountRef<CFX_PathData> { | |
37 public: | |
38 int GetPointCount() const { return m_pObject->m_PointCount; } | |
39 int GetFlag(int index) const { return m_pObject->m_pPoints[index].m_Flag; } | |
40 FX_FLOAT GetPointX(int index) const { | |
41 return m_pObject->m_pPoints[index].m_PointX; | |
42 } | |
43 FX_FLOAT GetPointY(int index) const { | |
44 return m_pObject->m_pPoints[index].m_PointY; | |
45 } | |
46 FX_PATHPOINT* GetPoints() const { return m_pObject->m_pPoints; } | |
47 CFX_FloatRect GetBoundingBox() const { return m_pObject->GetBoundingBox(); } | |
48 CFX_FloatRect GetBoundingBox(FX_FLOAT line_width, | |
49 FX_FLOAT miter_limit) const { | |
50 return m_pObject->GetBoundingBox(line_width, miter_limit); | |
51 } | |
52 FX_BOOL IsRect() const { return m_pObject->IsRect(); } | |
53 | |
54 void Transform(const CFX_Matrix* pMatrix) { GetModify()->Transform(pMatrix); } | |
55 void Append(CPDF_Path src, const CFX_Matrix* pMatrix) { | |
56 m_pObject->Append(src.m_pObject, pMatrix); | |
57 } | |
58 void AppendRect(FX_FLOAT left, | |
59 FX_FLOAT bottom, | |
60 FX_FLOAT right, | |
61 FX_FLOAT top) { | |
62 m_pObject->AppendRect(left, bottom, right, top); | |
63 } | |
64 }; | |
65 | |
66 class CPDF_ClipPathData { | |
67 public: | |
68 CPDF_ClipPathData(); | |
69 CPDF_ClipPathData(const CPDF_ClipPathData&); | |
70 ~CPDF_ClipPathData(); | |
71 | |
72 void SetCount(int path_count, int text_count); | |
73 | |
74 int m_PathCount; | |
75 CPDF_Path* m_pPathList; | |
76 uint8_t* m_pTypeList; | |
77 int m_TextCount; | |
78 CPDF_TextObject** m_pTextList; | |
79 }; | |
80 | |
81 class CPDF_ClipPath : public CFX_CountRef<CPDF_ClipPathData> { | |
82 public: | |
83 FX_DWORD GetPathCount() const { return m_pObject->m_PathCount; } | |
84 CPDF_Path GetPath(int i) const { return m_pObject->m_pPathList[i]; } | |
85 int GetClipType(int i) const { return m_pObject->m_pTypeList[i]; } | |
86 FX_DWORD GetTextCount() const { return m_pObject->m_TextCount; } | |
87 CPDF_TextObject* GetText(int i) const { return m_pObject->m_pTextList[i]; } | |
88 CFX_FloatRect GetClipBox() const; | |
89 void AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge); | |
90 void DeletePath(int layer_index); | |
91 void AppendTexts(CPDF_TextObject** pTexts, int count); | |
92 void Transform(const CFX_Matrix& matrix); | |
93 }; | |
94 | |
95 class CPDF_ColorStateData { | |
96 public: | |
97 CPDF_ColorStateData() : m_FillRGB(0), m_StrokeRGB(0) {} | |
98 CPDF_ColorStateData(const CPDF_ColorStateData& src); | |
99 | |
100 void Default(); | |
101 | |
102 CPDF_Color m_FillColor; | |
103 FX_DWORD m_FillRGB; | |
104 CPDF_Color m_StrokeColor; | |
105 FX_DWORD m_StrokeRGB; | |
106 }; | |
107 | |
108 class CPDF_ColorState : public CFX_CountRef<CPDF_ColorStateData> { | |
109 public: | |
110 CPDF_Color* GetFillColor() const { | |
111 return m_pObject ? &m_pObject->m_FillColor : nullptr; | |
112 } | |
113 | |
114 CPDF_Color* GetStrokeColor() const { | |
115 return m_pObject ? &m_pObject->m_StrokeColor : nullptr; | |
116 } | |
117 | |
118 void SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues); | |
119 void SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues); | |
120 void SetFillPattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues); | |
121 void SetStrokePattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues); | |
122 | |
123 private: | |
124 void SetColor(CPDF_Color& color, | |
125 FX_DWORD& rgb, | |
126 CPDF_ColorSpace* pCS, | |
127 FX_FLOAT* pValue, | |
128 int nValues); | |
129 }; | |
130 | |
131 class CPDF_GraphState : public CFX_CountRef<CFX_GraphStateData> { | |
132 }; | |
133 | |
134 class CPDF_TextStateData { | |
135 public: | |
136 CPDF_TextStateData(); | |
137 CPDF_TextStateData(const CPDF_TextStateData& src); | |
138 ~CPDF_TextStateData(); | |
139 | |
140 CPDF_Font* m_pFont; | |
141 CPDF_Document* m_pDocument; | |
142 FX_FLOAT m_FontSize; | |
143 FX_FLOAT m_CharSpace; | |
144 FX_FLOAT m_WordSpace; | |
145 FX_FLOAT m_Matrix[4]; | |
146 int m_TextMode; | |
147 FX_FLOAT m_CTM[4]; | |
148 }; | |
149 | |
150 class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData> { | |
151 public: | |
152 CPDF_Font* GetFont() const { return m_pObject->m_pFont; } | |
153 void SetFont(CPDF_Font* pFont); | |
154 FX_FLOAT GetFontSize() const { return m_pObject->m_FontSize; } | |
155 FX_FLOAT* GetMatrix() const { return m_pObject->m_Matrix; } | |
156 FX_FLOAT GetFontSizeV() const; | |
157 FX_FLOAT GetFontSizeH() const; | |
158 FX_FLOAT GetBaselineAngle() const; | |
159 FX_FLOAT GetShearAngle() const; | |
160 }; | |
161 | |
162 class CPDF_GeneralStateData { | |
163 public: | |
164 CPDF_GeneralStateData(); | |
165 CPDF_GeneralStateData(const CPDF_GeneralStateData& src); | |
166 ~CPDF_GeneralStateData(); | |
167 | |
168 void SetBlendMode(const CFX_ByteStringC& blend_mode); | |
169 | |
170 char m_BlendMode[16]; | |
171 int m_BlendType; | |
172 CPDF_Object* m_pSoftMask; | |
173 FX_FLOAT m_SMaskMatrix[6]; | |
174 FX_FLOAT m_StrokeAlpha; | |
175 FX_FLOAT m_FillAlpha; | |
176 CPDF_Object* m_pTR; | |
177 CPDF_TransferFunc* m_pTransferFunc; | |
178 CFX_Matrix m_Matrix; | |
179 int m_RenderIntent; | |
180 FX_BOOL m_StrokeAdjust; | |
181 FX_BOOL m_AlphaSource; | |
182 FX_BOOL m_TextKnockout; | |
183 FX_BOOL m_StrokeOP; | |
184 FX_BOOL m_FillOP; | |
185 int m_OPMode; | |
186 CPDF_Object* m_pBG; | |
187 CPDF_Object* m_pUCR; | |
188 CPDF_Object* m_pHT; | |
189 FX_FLOAT m_Flatness; | |
190 FX_FLOAT m_Smoothness; | |
191 }; | |
192 | |
193 class CPDF_GeneralState : public CFX_CountRef<CPDF_GeneralStateData> { | |
194 public: | |
195 void SetRenderIntent(const CFX_ByteString& ri); | |
196 | |
197 int GetBlendType() const { | |
198 return m_pObject ? m_pObject->m_BlendType : FXDIB_BLEND_NORMAL; | |
199 } | |
200 | |
201 int GetAlpha(FX_BOOL bStroke) const { | |
202 return m_pObject ? FXSYS_round((bStroke ? m_pObject->m_StrokeAlpha | |
203 : m_pObject->m_FillAlpha) * | |
204 255) | |
205 : 255; | |
206 } | |
207 }; | |
208 | |
209 class CPDF_ContentMarkItem { | |
210 public: | |
211 enum ParamType { None, PropertiesDict, DirectDict }; | |
212 | |
213 CPDF_ContentMarkItem(); | |
214 CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src); | |
215 ~CPDF_ContentMarkItem(); | |
216 | |
217 const CFX_ByteString& GetName() const { return m_MarkName; } | |
218 ParamType GetParamType() const { return m_ParamType; } | |
219 CPDF_Dictionary* GetParam() const { return m_pParam; } | |
220 FX_BOOL HasMCID() const; | |
221 void SetName(const CFX_ByteString& name) { m_MarkName = name; } | |
222 void SetParam(ParamType type, CPDF_Dictionary* param) { | |
223 m_ParamType = type; | |
224 m_pParam = param; | |
225 } | |
226 | |
227 private: | |
228 CFX_ByteString m_MarkName; | |
229 ParamType m_ParamType; | |
230 CPDF_Dictionary* m_pParam; | |
231 }; | |
232 | |
233 class CPDF_ContentMarkData { | |
234 public: | |
235 CPDF_ContentMarkData() {} | |
236 CPDF_ContentMarkData(const CPDF_ContentMarkData& src); | |
237 | |
238 int CountItems() const; | |
239 CPDF_ContentMarkItem& GetItem(int index) { return m_Marks[index]; } | |
240 const CPDF_ContentMarkItem& GetItem(int index) const { | |
241 return m_Marks[index]; | |
242 } | |
243 | |
244 int GetMCID() const; | |
245 void AddMark(const CFX_ByteString& name, | |
246 CPDF_Dictionary* pDict, | |
247 FX_BOOL bDictNeedClone); | |
248 void DeleteLastMark(); | |
249 | |
250 private: | |
251 std::vector<CPDF_ContentMarkItem> m_Marks; | |
252 }; | |
253 | |
254 class CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData> { | |
255 public: | |
256 int GetMCID() const { return m_pObject ? m_pObject->GetMCID() : -1; } | |
257 | |
258 FX_BOOL HasMark(const CFX_ByteStringC& mark) const; | |
259 | |
260 FX_BOOL LookupMark(const CFX_ByteStringC& mark, | |
261 CPDF_Dictionary*& pDict) const; | |
262 }; | |
263 | |
264 class CPDF_GraphicStates { | |
265 public: | |
266 void CopyStates(const CPDF_GraphicStates& src); | |
267 | |
268 void DefaultStates(); | |
269 | |
270 CPDF_ClipPath m_ClipPath; | |
271 | |
272 CPDF_GraphState m_GraphState; | |
273 | |
274 CPDF_ColorState m_ColorState; | |
275 | |
276 CPDF_TextState m_TextState; | |
277 | |
278 CPDF_GeneralState m_GeneralState; | |
279 }; | |
280 | |
281 class CPDF_PageObject : public CPDF_GraphicStates { | |
282 public: | |
283 enum Type { | |
284 TEXT = 1, | |
285 PATH, | |
286 IMAGE, | |
287 SHADING, | |
288 FORM, | |
289 }; | |
290 | |
291 CPDF_PageObject(); | |
292 virtual ~CPDF_PageObject(); | |
293 | |
294 virtual CPDF_PageObject* Clone() const = 0; | |
295 virtual Type GetType() const = 0; | |
296 virtual void Transform(const CFX_Matrix& matrix) = 0; | |
297 virtual bool IsText() const { return false; } | |
298 virtual bool IsPath() const { return false; } | |
299 virtual bool IsImage() const { return false; } | |
300 virtual bool IsShading() const { return false; } | |
301 virtual bool IsForm() const { return false; } | |
302 virtual CPDF_TextObject* AsText() { return nullptr; } | |
303 virtual const CPDF_TextObject* AsText() const { return nullptr; } | |
304 virtual CPDF_PathObject* AsPath() { return nullptr; } | |
305 virtual const CPDF_PathObject* AsPath() const { return nullptr; } | |
306 virtual CPDF_ImageObject* AsImage() { return nullptr; } | |
307 virtual const CPDF_ImageObject* AsImage() const { return nullptr; } | |
308 virtual CPDF_ShadingObject* AsShading() { return nullptr; } | |
309 virtual const CPDF_ShadingObject* AsShading() const { return nullptr; } | |
310 virtual CPDF_FormObject* AsForm() { return nullptr; } | |
311 virtual const CPDF_FormObject* AsForm() const { return nullptr; } | |
312 | |
313 void TransformClipPath(CFX_Matrix& matrix); | |
314 void TransformGeneralState(CFX_Matrix& matrix); | |
315 FX_RECT GetBBox(const CFX_Matrix* pMatrix) const; | |
316 | |
317 FX_FLOAT m_Left; | |
318 FX_FLOAT m_Right; | |
319 FX_FLOAT m_Top; | |
320 FX_FLOAT m_Bottom; | |
321 CPDF_ContentMark m_ContentMark; | |
322 | |
323 protected: | |
324 void CopyData(const CPDF_PageObject* pSrcObject); | |
325 | |
326 private: | |
327 CPDF_PageObject(const CPDF_PageObject& src) = delete; | |
328 void operator=(const CPDF_PageObject& src) = delete; | |
329 }; | |
330 | |
331 struct CPDF_TextObjectItem { | |
332 FX_DWORD m_CharCode; | |
333 FX_FLOAT m_OriginX; | |
334 FX_FLOAT m_OriginY; | |
335 }; | |
336 | |
337 class CPDF_TextObject : public CPDF_PageObject { | |
338 public: | |
339 CPDF_TextObject(); | |
340 ~CPDF_TextObject() override; | |
341 | |
342 // CPDF_PageObject: | |
343 CPDF_TextObject* Clone() const override; | |
344 Type GetType() const override { return TEXT; }; | |
345 void Transform(const CFX_Matrix& matrix) override; | |
346 bool IsText() const override { return true; }; | |
347 CPDF_TextObject* AsText() override { return this; }; | |
348 const CPDF_TextObject* AsText() const override { return this; }; | |
349 | |
350 int CountItems() const { return m_nChars; } | |
351 void GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const; | |
352 int CountChars() const; | |
353 void GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const; | |
354 void GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const; | |
355 FX_FLOAT GetCharWidth(FX_DWORD charcode) const; | |
356 FX_FLOAT GetPosX() const { return m_PosX; } | |
357 FX_FLOAT GetPosY() const { return m_PosY; } | |
358 void GetTextMatrix(CFX_Matrix* pMatrix) const; | |
359 CPDF_Font* GetFont() const { return m_TextState.GetFont(); } | |
360 FX_FLOAT GetFontSize() const { return m_TextState.GetFontSize(); } | |
361 | |
362 void SetText(const CFX_ByteString& text); | |
363 void SetPosition(FX_FLOAT x, FX_FLOAT y); | |
364 | |
365 void RecalcPositionData() { CalcPositionData(nullptr, nullptr, 1); } | |
366 | |
367 protected: | |
368 friend class CPDF_RenderStatus; | |
369 friend class CPDF_StreamContentParser; | |
370 friend class CPDF_TextRenderer; | |
371 | |
372 void SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs); | |
373 | |
374 void CalcPositionData(FX_FLOAT* pTextAdvanceX, | |
375 FX_FLOAT* pTextAdvanceY, | |
376 FX_FLOAT horz_scale, | |
377 int level = 0); | |
378 | |
379 FX_FLOAT m_PosX; | |
380 FX_FLOAT m_PosY; | |
381 int m_nChars; | |
382 FX_DWORD* m_pCharCodes; | |
383 FX_FLOAT* m_pCharPos; | |
384 }; | |
385 | |
386 class CPDF_PathObject : public CPDF_PageObject { | |
387 public: | |
388 CPDF_PathObject(); | |
389 ~CPDF_PathObject() override; | |
390 | |
391 // CPDF_PageObject: | |
392 CPDF_PathObject* Clone() const override; | |
393 Type GetType() const override { return PATH; }; | |
394 void Transform(const CFX_Matrix& maxtrix) override; | |
395 bool IsPath() const override { return true; }; | |
396 CPDF_PathObject* AsPath() override { return this; }; | |
397 const CPDF_PathObject* AsPath() const override { return this; }; | |
398 | |
399 void CalcBoundingBox(); | |
400 | |
401 CPDF_Path m_Path; | |
402 int m_FillType; | |
403 FX_BOOL m_bStroke; | |
404 CFX_Matrix m_Matrix; | |
405 }; | |
406 | |
407 class CPDF_ImageObject : public CPDF_PageObject { | |
408 public: | |
409 CPDF_ImageObject(); | |
410 ~CPDF_ImageObject() override; | |
411 | |
412 // CPDF_PageObject: | |
413 CPDF_ImageObject* Clone() const override; | |
414 Type GetType() const override { return IMAGE; }; | |
415 void Transform(const CFX_Matrix& matrix) override; | |
416 bool IsImage() const override { return true; }; | |
417 CPDF_ImageObject* AsImage() override { return this; }; | |
418 const CPDF_ImageObject* AsImage() const override { return this; }; | |
419 | |
420 void CalcBoundingBox(); | |
421 | |
422 CPDF_Image* m_pImage; | |
423 CFX_Matrix m_Matrix; | |
424 }; | |
425 | |
426 class CPDF_ShadingObject : public CPDF_PageObject { | |
427 public: | |
428 CPDF_ShadingObject(); | |
429 ~CPDF_ShadingObject() override; | |
430 | |
431 // CPDF_PageObject: | |
432 CPDF_ShadingObject* Clone() const override; | |
433 Type GetType() const override { return SHADING; }; | |
434 void Transform(const CFX_Matrix& matrix) override; | |
435 bool IsShading() const override { return true; }; | |
436 CPDF_ShadingObject* AsShading() override { return this; }; | |
437 const CPDF_ShadingObject* AsShading() const override { return this; }; | |
438 | |
439 void CalcBoundingBox(); | |
440 | |
441 CPDF_ShadingPattern* m_pShading; | |
442 CFX_Matrix m_Matrix; | |
443 }; | |
444 | |
445 class CPDF_FormObject : public CPDF_PageObject { | |
446 public: | |
447 CPDF_FormObject(); | |
448 ~CPDF_FormObject() override; | |
449 | |
450 // CPDF_PageObject: | |
451 CPDF_FormObject* Clone() const override; | |
452 Type GetType() const override { return FORM; }; | |
453 void Transform(const CFX_Matrix& matrix) override; | |
454 bool IsForm() const override { return true; }; | |
455 CPDF_FormObject* AsForm() override { return this; }; | |
456 const CPDF_FormObject* AsForm() const override { return this; }; | |
457 | |
458 void CalcBoundingBox(); | |
459 | |
460 CPDF_Form* m_pForm; | |
461 CFX_Matrix m_FormMatrix; | |
462 }; | |
463 | |
464 #endif // CORE_INCLUDE_FPDFAPI_FPDF_PAGEOBJ_H_ | |
OLD | NEW |