Home | History | Annotate | Download | only in fpdfapi
      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 "../fxge/fx_ge.h"
     11 #include "fpdf_resource.h"
     12 
     13 class CPDF_Path;
     14 class CPDF_ClipPathData;
     15 class CPDF_ClipPath;
     16 class CPDF_ColorStateData;
     17 class CPDF_ColorState;
     18 class CPDF_GraphState;
     19 class CPDF_TextStateData;
     20 class CPDF_TextState;
     21 class CPDF_GeneralStateData;
     22 class CPDF_GeneralState;
     23 class CPDF_ContentMarkItem;
     24 class CPDF_ContentMark;
     25 class CPDF_GraphicStates;
     26 class CPDF_PageObject;
     27 class CPDF_TextObject;
     28 class CPDF_PathObject;
     29 class CPDF_ImageObject;
     30 class CPDF_ShadingObject;
     31 class CPDF_FormObject;
     32 class CPDF_InlineImages;
     33 typedef CFX_PathData CPDF_PathData;
     34 class CPDF_Path : public CFX_CountRef<CFX_PathData>
     35 {
     36 public:
     37 
     38 
     39 
     40 
     41     int					GetPointCount()
     42     {
     43         return m_pObject->m_PointCount;
     44     }
     45 
     46     int					GetFlag(int index)
     47     {
     48         return m_pObject->m_pPoints[index].m_Flag;
     49     }
     50 
     51     FX_FLOAT			GetPointX(int index)
     52     {
     53         return m_pObject->m_pPoints[index].m_PointX;
     54     }
     55 
     56     FX_FLOAT			GetPointY(int index)
     57     {
     58         return m_pObject->m_pPoints[index].m_PointY;
     59     }
     60 
     61 
     62 
     63 
     64     FX_PATHPOINT*		GetPoints()
     65     {
     66         return m_pObject->m_pPoints;
     67     }
     68 
     69 
     70     CFX_FloatRect		GetBoundingBox() const
     71     {
     72         return m_pObject->GetBoundingBox();
     73     }
     74 
     75     CFX_FloatRect		GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const
     76     {
     77         return m_pObject->GetBoundingBox(line_width, miter_limit);
     78     }
     79 
     80     void				Transform(const CFX_AffineMatrix* pMatrix)
     81     {
     82         GetModify()->Transform(pMatrix);
     83     }
     84 
     85     void				Append(CPDF_Path src, const CFX_AffineMatrix* pMatrix)
     86     {
     87         m_pObject->Append(src.m_pObject, pMatrix);
     88     }
     89 
     90     void				AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
     91     {
     92         m_pObject->AppendRect(left, bottom, right, top);
     93     }
     94 
     95     FX_BOOL				IsRect() const
     96     {
     97         return m_pObject->IsRect();
     98     }
     99 };
    100 class CPDF_ClipPathData
    101 {
    102 public:
    103 
    104     CPDF_ClipPathData();
    105 
    106     CPDF_ClipPathData(const CPDF_ClipPathData&);
    107 
    108     ~CPDF_ClipPathData();
    109 
    110     void				SetCount(int path_count, int text_count);
    111 public:
    112 
    113     int					m_PathCount;
    114 
    115     CPDF_Path*			m_pPathList;
    116 
    117     FX_BYTE*			m_pTypeList;
    118 
    119     int					m_TextCount;
    120 
    121     CPDF_TextObject**	m_pTextList;
    122 };
    123 class CPDF_ClipPath : public CFX_CountRef<CPDF_ClipPathData>
    124 {
    125 public:
    126 
    127     FX_DWORD			GetPathCount() const
    128     {
    129         return m_pObject->m_PathCount;
    130     }
    131 
    132     CPDF_Path			GetPath(int i) const
    133     {
    134         return m_pObject->m_pPathList[i];
    135     }
    136 
    137     int					GetClipType(int i) const
    138     {
    139         return m_pObject->m_pTypeList[i];
    140     }
    141 
    142     FX_DWORD			GetTextCount() const
    143     {
    144         return m_pObject->m_TextCount;
    145     }
    146 
    147     CPDF_TextObject*	GetText(int i) const
    148     {
    149         return m_pObject->m_pTextList[i];
    150     }
    151 
    152     CFX_FloatRect		GetClipBox() const;
    153 
    154     void				AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);
    155 
    156     void				DeletePath(int layer_index);
    157 
    158     void				AppendTexts(CPDF_TextObject** pTexts, int count);
    159 
    160     void				Transform(const CFX_AffineMatrix& matrix);
    161 };
    162 class CPDF_ColorStateData
    163 {
    164 public:
    165 
    166     CPDF_ColorStateData(): m_FillRGB(0), m_StrokeRGB(0) {}
    167 
    168     CPDF_ColorStateData(const CPDF_ColorStateData& src);
    169 
    170     void				Default();
    171 
    172     CPDF_Color			m_FillColor;
    173 
    174     FX_DWORD			m_FillRGB;
    175 
    176     CPDF_Color			m_StrokeColor;
    177 
    178     FX_DWORD			m_StrokeRGB;
    179 };
    180 class CPDF_ColorState : public CFX_CountRef<CPDF_ColorStateData>
    181 {
    182 public:
    183 
    184     CPDF_Color*			GetFillColor() const
    185     {
    186         return m_pObject ? &m_pObject->m_FillColor : NULL;
    187     }
    188 
    189     CPDF_Color*			GetStrokeColor() const
    190     {
    191         return m_pObject ? &m_pObject->m_StrokeColor : NULL;
    192     }
    193 
    194     void				SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
    195 
    196     void				SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
    197 
    198     void				SetFillPattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);
    199 
    200     void				SetStrokePattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);
    201 private:
    202     void				SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
    203 };
    204 typedef CFX_GraphStateData CPDF_GraphStateData;
    205 class CPDF_GraphState : public CFX_CountRef<CFX_GraphStateData>
    206 {
    207 public:
    208 };
    209 class CPDF_TextStateData
    210 {
    211 public:
    212 
    213     CPDF_TextStateData();
    214 
    215     CPDF_TextStateData(const CPDF_TextStateData& src);
    216 
    217     ~CPDF_TextStateData();
    218 
    219     CPDF_Font*			m_pFont;
    220 
    221     CPDF_Document*		m_pDocument;
    222 
    223     FX_FLOAT			m_FontSize;
    224 
    225     FX_FLOAT			m_CharSpace;
    226 
    227     FX_FLOAT			m_WordSpace;
    228 
    229     FX_FLOAT		m_Matrix[4];
    230 
    231     int					m_TextMode;
    232 
    233     FX_FLOAT		m_CTM[4];
    234 };
    235 class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData>
    236 {
    237 public:
    238 
    239     CPDF_Font*			GetFont() const
    240     {
    241         return m_pObject->m_pFont;
    242     }
    243 
    244     void				SetFont(CPDF_Font* pFont);
    245 
    246     FX_FLOAT			GetFontSize() const
    247     {
    248         return m_pObject->m_FontSize;
    249     }
    250 
    251     FX_FLOAT*			GetMatrix() const
    252     {
    253         return m_pObject->m_Matrix;
    254     }
    255 
    256 
    257 
    258     FX_FLOAT			GetFontSizeV() const;
    259 
    260     FX_FLOAT			GetFontSizeH() const;
    261 
    262     FX_FLOAT			GetBaselineAngle() const;
    263 
    264     FX_FLOAT			GetShearAngle() const;
    265 
    266 };
    267 class CPDF_TransferFunc;
    268 class CPDF_GeneralStateData
    269 {
    270 public:
    271 
    272     CPDF_GeneralStateData();
    273 
    274     CPDF_GeneralStateData(const CPDF_GeneralStateData& src);
    275     ~CPDF_GeneralStateData();
    276 
    277     void				SetBlendMode(FX_BSTR blend_mode);
    278 
    279     char				m_BlendMode[16];
    280 
    281     int					m_BlendType;
    282 
    283     CPDF_Object*		m_pSoftMask;
    284 
    285     FX_FLOAT			m_SMaskMatrix[6];
    286 
    287     FX_FLOAT			m_StrokeAlpha;
    288 
    289     FX_FLOAT			m_FillAlpha;
    290 
    291     CPDF_Object*		m_pTR;
    292 
    293     CPDF_TransferFunc*	m_pTransferFunc;
    294 
    295     CFX_Matrix			m_Matrix;
    296 
    297     int					m_RenderIntent;
    298 
    299     FX_BOOL				m_StrokeAdjust;
    300 
    301     FX_BOOL				m_AlphaSource;
    302 
    303     FX_BOOL				m_TextKnockout;
    304 
    305     FX_BOOL				m_StrokeOP;
    306 
    307     FX_BOOL				m_FillOP;
    308 
    309     int					m_OPMode;
    310 
    311     CPDF_Object*		m_pBG;
    312 
    313     CPDF_Object*		m_pUCR;
    314 
    315     CPDF_Object*		m_pHT;
    316 
    317     FX_FLOAT			m_Flatness;
    318 
    319     FX_FLOAT			m_Smoothness;
    320 };
    321 class CPDF_GeneralState : public CFX_CountRef<CPDF_GeneralStateData>
    322 {
    323 public:
    324 
    325     void				SetRenderIntent(const CFX_ByteString& ri);
    326 
    327     int					GetBlendType() const
    328     {
    329         return m_pObject ? m_pObject->m_BlendType : FXDIB_BLEND_NORMAL;
    330     }
    331 
    332     int					GetAlpha(FX_BOOL bStroke) const
    333     {
    334         return m_pObject ? FXSYS_round((bStroke ? m_pObject->m_StrokeAlpha : m_pObject->m_FillAlpha) * 255) : 255;
    335     }
    336 };
    337 class CPDF_ContentMarkItem
    338 {
    339 public:
    340 
    341     typedef enum {
    342         None,
    343         PropertiesDict,
    344         DirectDict,
    345         MCID
    346     } ParamType;
    347 
    348     CPDF_ContentMarkItem();
    349 
    350     CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src);
    351 
    352     ~CPDF_ContentMarkItem();
    353 
    354     inline const CFX_ByteString&	GetName() const
    355     {
    356         return m_MarkName;
    357     }
    358 
    359     inline ParamType	GetParamType() const
    360     {
    361         return m_ParamType;
    362     }
    363 
    364     inline void*		GetParam() const
    365     {
    366         return m_pParam;
    367     }
    368 
    369     inline FX_BOOL		HasMCID() const;
    370 
    371     inline void			SetName(const CFX_ByteString& name)
    372     {
    373         m_MarkName = name;
    374     }
    375 
    376     inline void			SetParam(ParamType type, void* param)
    377     {
    378         m_ParamType = type;
    379         m_pParam = param;
    380     }
    381 private:
    382 
    383     CFX_ByteString		m_MarkName;
    384 
    385     ParamType			m_ParamType;
    386 
    387     void*				m_pParam;
    388 };
    389 class CPDF_ContentMarkData
    390 {
    391 public:
    392 
    393     CPDF_ContentMarkData() { }
    394 
    395     CPDF_ContentMarkData(const CPDF_ContentMarkData& src);
    396 
    397     inline int			CountItems() const
    398     {
    399         return m_Marks.GetSize();
    400     }
    401 
    402     inline CPDF_ContentMarkItem&	GetItem(int index) const
    403     {
    404         return m_Marks[index];
    405     }
    406 
    407     int					GetMCID() const;
    408 
    409     void				AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDictNeedClone);
    410 
    411     void				DeleteLastMark();
    412 private:
    413 
    414     CFX_ObjectArray<CPDF_ContentMarkItem>	m_Marks;
    415 };
    416 class CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData>
    417 {
    418 public:
    419 
    420     int					GetMCID() const
    421     {
    422         return m_pObject ? m_pObject->GetMCID() : -1;
    423     }
    424 
    425     FX_BOOL				HasMark(FX_BSTR mark) const;
    426 
    427     FX_BOOL				LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const;
    428 };
    429 #define PDFPAGE_TEXT		1
    430 #define PDFPAGE_PATH		2
    431 #define PDFPAGE_IMAGE		3
    432 #define PDFPAGE_SHADING		4
    433 #define PDFPAGE_FORM		5
    434 #define PDFPAGE_INLINES		6
    435 class CPDF_GraphicStates
    436 {
    437 public:
    438 
    439     void				CopyStates(const CPDF_GraphicStates& src);
    440 
    441     void				DefaultStates();
    442 
    443     CPDF_ClipPath		m_ClipPath;
    444 
    445     CPDF_GraphState		m_GraphState;
    446 
    447     CPDF_ColorState		m_ColorState;
    448 
    449     CPDF_TextState		m_TextState;
    450 
    451     CPDF_GeneralState	m_GeneralState;
    452 };
    453 class CPDF_PageObject : public CPDF_GraphicStates
    454 {
    455 public:
    456     static CPDF_PageObject* Create(int type);
    457     virtual ~CPDF_PageObject();
    458 
    459     CPDF_PageObject*	Clone() const;
    460 
    461     void				Copy(const CPDF_PageObject* pSrcObject);
    462 
    463     virtual void		Transform(const CFX_AffineMatrix& matrix) = 0;
    464 
    465 
    466 
    467     void				RemoveClipPath();
    468 
    469     void				AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);
    470 
    471     void				CopyClipPath(CPDF_PageObject* pObj);
    472 
    473     void				TransformClipPath(CFX_AffineMatrix& matrix);
    474 
    475     void				TransformGeneralState(CFX_AffineMatrix& matrix);
    476 
    477 
    478     void				SetColorState(CPDF_ColorState state)
    479     {
    480         m_ColorState = state;
    481     }
    482 
    483     FX_RECT				GetBBox(const CFX_AffineMatrix* pMatrix) const;
    484 
    485     int					m_Type;
    486 
    487     FX_FLOAT			m_Left;
    488 
    489     FX_FLOAT			m_Right;
    490 
    491     FX_FLOAT			m_Top;
    492 
    493     FX_FLOAT			m_Bottom;
    494 
    495     CPDF_ContentMark	m_ContentMark;
    496 protected:
    497 
    498     virtual void		CopyData(const CPDF_PageObject* pSrcObject) {}
    499 
    500     void				RecalcBBox();
    501 
    502     CPDF_PageObject() {}
    503 
    504 };
    505 struct CPDF_TextObjectItem  {
    506 
    507     FX_DWORD			m_CharCode;
    508 
    509     FX_FLOAT			m_OriginX;
    510 
    511     FX_FLOAT			m_OriginY;
    512 };
    513 class CPDF_TextObject : public CPDF_PageObject
    514 {
    515 public:
    516 
    517     CPDF_TextObject();
    518 
    519     virtual ~CPDF_TextObject();
    520 
    521     int					CountItems() const
    522     {
    523         return m_nChars;
    524     }
    525 
    526     void				GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const;
    527 
    528     int					CountChars() const;
    529 
    530     void				GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const;
    531     void				GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const;
    532 
    533     void				GetCharRect(int index, CFX_FloatRect& rect) const;
    534 
    535 
    536     FX_FLOAT			GetCharWidth(FX_DWORD charcode) const;
    537     FX_FLOAT			GetSpaceCharWidth() const;
    538 
    539     FX_FLOAT			GetPosX() const
    540     {
    541         return m_PosX;
    542     }
    543 
    544     FX_FLOAT			GetPosY() const
    545     {
    546         return m_PosY;
    547     }
    548 
    549     void				GetTextMatrix(CFX_AffineMatrix* pMatrix) const;
    550 
    551     CPDF_Font*			GetFont() const
    552     {
    553         return m_TextState.GetFont();
    554     }
    555 
    556     FX_FLOAT			GetFontSize() const
    557     {
    558         return m_TextState.GetFontSize();
    559     }
    560 
    561     void				SetEmpty();
    562 
    563     void				SetText(const CFX_ByteString& text);
    564 
    565     void				SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
    566 
    567     void				SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings);
    568 
    569     void				SetPosition(FX_FLOAT x, FX_FLOAT y);
    570 
    571     void				SetTextState(CPDF_TextState TextState);
    572     virtual void		Transform(const CFX_AffineMatrix& matrix);
    573 
    574     void				CalcCharPos(FX_FLOAT* pPosArray) const;
    575 
    576 
    577 
    578     void				SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y);
    579 
    580     void				GetData(int& nChars, FX_DWORD*& pCharCodes, FX_FLOAT*& pCharPos)
    581     {
    582         nChars = m_nChars;
    583         pCharCodes = m_pCharCodes;
    584         pCharPos = m_pCharPos;
    585     }
    586 
    587 
    588     void				RecalcPositionData()
    589     {
    590         CalcPositionData(NULL, NULL, 1);
    591     }
    592 protected:
    593     virtual void		CopyData(const CPDF_PageObject* pSrcObject);
    594 
    595     FX_FLOAT			m_PosX;
    596 
    597     FX_FLOAT			m_PosY;
    598 
    599     int					m_nChars;
    600 
    601     FX_DWORD*			m_pCharCodes;
    602 
    603     FX_FLOAT*		m_pCharPos;
    604 
    605     void				SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
    606 
    607     void				CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level = 0);
    608     friend class		CPDF_StreamContentParser;
    609     friend class		CPDF_RenderStatus;
    610     friend class		CPDF_QuickDrawer;
    611     friend class		CPDF_TextRenderer;
    612     friend class		CTextPage;
    613     friend class		CPDF_ContentGenerator;
    614 };
    615 class CPDF_PathObject : public CPDF_PageObject
    616 {
    617 public:
    618 
    619     CPDF_PathObject()
    620     {
    621         m_Type = PDFPAGE_PATH;
    622     }
    623 
    624     virtual ~CPDF_PathObject() {}
    625     virtual void		Transform(const CFX_AffineMatrix& maxtrix);
    626 
    627     void				SetGraphState(CPDF_GraphState GraphState);
    628 
    629     CPDF_Path			m_Path;
    630 
    631     int					m_FillType;
    632 
    633     FX_BOOL				m_bStroke;
    634 
    635     CFX_AffineMatrix	m_Matrix;
    636 
    637 
    638     void				CalcBoundingBox();
    639 protected:
    640     virtual void		CopyData(const CPDF_PageObject* pSrcObjet);
    641 };
    642 class CPDF_ImageObject : public CPDF_PageObject
    643 {
    644 public:
    645 
    646     CPDF_ImageObject();
    647 
    648     virtual ~CPDF_ImageObject();
    649     virtual void		Transform(const CFX_AffineMatrix& matrix);
    650 
    651     CPDF_Image*			m_pImage;
    652 
    653     CFX_AffineMatrix	m_Matrix;
    654 
    655     void				CalcBoundingBox();
    656 private:
    657     virtual void		CopyData(const CPDF_PageObject* pSrcObjet);
    658 };
    659 class CPDF_ShadingObject : public CPDF_PageObject
    660 {
    661 public:
    662 
    663     CPDF_ShadingObject();
    664 
    665     virtual ~CPDF_ShadingObject();
    666 
    667     CPDF_ShadingPattern*	m_pShading;
    668 
    669     CFX_AffineMatrix	m_Matrix;
    670 
    671     CPDF_Page*			m_pPage;
    672     virtual void		Transform(const CFX_AffineMatrix& matrix);
    673 
    674     void				CalcBoundingBox();
    675 protected:
    676     virtual void		CopyData(const CPDF_PageObject* pSrcObjet);
    677 };
    678 class CPDF_FormObject : public CPDF_PageObject
    679 {
    680 public:
    681 
    682     CPDF_FormObject()
    683     {
    684         m_Type = PDFPAGE_FORM;
    685         m_pForm = NULL;
    686     }
    687 
    688     virtual ~CPDF_FormObject();
    689     virtual void		Transform(const CFX_AffineMatrix& matrix);
    690 
    691     CPDF_Form*			m_pForm;
    692 
    693     CFX_AffineMatrix	m_FormMatrix;
    694 
    695     void				CalcBoundingBox();
    696 protected:
    697     virtual void		CopyData(const CPDF_PageObject* pSrcObjet);
    698 };
    699 class CPDF_InlineImages : public CPDF_PageObject
    700 {
    701 public:
    702 
    703     CPDF_InlineImages();
    704 
    705     virtual ~CPDF_InlineImages();
    706 
    707     CPDF_Stream*		m_pStream;
    708 
    709     CFX_DIBitmap*		m_pBitmap;
    710 
    711     CFX_ArrayTemplate<CFX_AffineMatrix>	m_Matrices;
    712 
    713     void				AddMatrix(CFX_AffineMatrix& matrix);
    714 protected:
    715     virtual void		Transform(const CFX_AffineMatrix& matrix) {}
    716     virtual void		CopyData(const CPDF_PageObject* pSrcObjet) {}
    717 };
    718 
    719 #endif  // CORE_INCLUDE_FPDFAPI_FPDF_PAGEOBJ_H_
    720