| 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 |