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 _REFLOWED_PAGE_H 8 #define _REFLOWED_PAGE_H 9 #include "../../include/reflow/reflowengine.h" 10 #define GET_SIGNED(a) ( (a)>0 ? a/a : (a==0 ? 0 : -a/a) ) 11 class CRF_Data; 12 class CRF_LineData; 13 class CRF_CharData; 14 class CRF_PathData; 15 class CRF_ImageData; 16 class CRF_Table; 17 class CRF_AttrOperation; 18 class CRF_OperationDate; 19 class CPDF_ReflowedPage; 20 class CPDF_Rect; 21 class CFX_Object; 22 typedef CFX_SegmentedArray<CRF_Data*> CRF_DataPtrArray; 23 class CRF_CharState; 24 typedef CFX_SegmentedArray<CRF_CharState> CRF_CharStateArray; 25 #define SST_GE 1 26 #define SST_BLSE 2 27 #define SST_ILSE 3 28 #define SST_IE 4 29 class CPDF_LayoutProcessor_Reflow : public IPDF_LayoutProcessor, public CFX_Object 30 { 31 public: 32 CPDF_LayoutProcessor_Reflow(); 33 ~CPDF_LayoutProcessor_Reflow(); 34 void Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace); 35 36 LayoutStatus StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL); 37 LayoutStatus Continue(); 38 int GetPosition(); 39 protected: 40 void FitPageMode(); 41 void ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth); 42 FX_FLOAT GetElmWidth(IPDF_LayoutElement* pElement); 43 CFX_FloatRect GetElmBBox(IPDF_LayoutElement* pElement); 44 void ProcessTable(FX_FLOAT dx); 45 void ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth); 46 void ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); 47 void ProcessTextObject(CPDF_TextObject *pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); 48 void ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth); 49 void ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); 50 FX_INT32 LogicPreObj(CPDF_TextObject* pObj); 51 int ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix); 52 FX_WCHAR GetPreChar(); 53 FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2); 54 int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const; 55 FX_BOOL IsCanBreakAfter(FX_DWORD unicode); 56 FX_BOOL IsCanBreakBefore(FX_DWORD unicode); 57 FX_INT32 GetElementTypes(LayoutType layoutType); 58 void CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pMatrix = NULL); 59 CRF_CharState* GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color); 60 FX_FLOAT ConverWidth(FX_FLOAT width); 61 void AddData2CurrLine(CRF_Data* pData); 62 void AddTemp2CurrLine(int begin, int count ); 63 void Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData); 64 void Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count = 0); 65 FX_FLOAT GetDatasWidth( int beginPos, int endpos); 66 void UpdateCurrLine(); 67 FX_BOOL FinishedCurrLine(); 68 int m_flags; 69 CFX_AffineMatrix m_PDFMatrix; 70 LayoutStatus m_Status; 71 CPDF_TextObject* m_pPreObj; 72 CFX_AffineMatrix m_perMatrix; 73 IPDF_LayoutElement* m_pLayoutElement; 74 IPDF_LayoutElement* m_pRootElement; 75 FX_FLOAT m_CurrRefWidth; 76 IFX_Pause* m_pPause; 77 LayoutEnum m_CurrWritingMode; 78 CPDF_ReflowedPage* m_pReflowedPage; 79 FX_FLOAT m_fRefWidth; 80 FX_FLOAT m_TopIndent; 81 FX_FLOAT m_fLineSpace; 82 FX_FLOAT m_fScreenHeight; 83 FX_FLOAT m_fCurrMaxWidth; 84 FX_FLOAT m_fCurrLineWidth; 85 FX_FLOAT m_fCurrLineHeight; 86 CRF_DataPtrArray* m_pCurrLine; 87 CRF_DataPtrArray* m_pTempLine; 88 FX_BOOL m_bIllustration; 89 FX_FLOAT m_fLineHeight; 90 LayoutEnum m_TextAlign; 91 FX_FLOAT m_StartIndent; 92 CFX_ArrayTemplate<CRF_Table*> m_TableArray; 93 int m_PausePosition; 94 }; 95 struct RF_TableCell { 96 int m_BeginPos; 97 int m_EndPos; 98 FX_FLOAT m_MaxWidth; 99 FX_FLOAT m_PosX; 100 FX_FLOAT m_PosY; 101 FX_FLOAT m_CellWidth; 102 FX_FLOAT m_CellHeight; 103 int m_RowSpan; 104 int m_ColSpan; 105 LayoutEnum m_BlockAlign; 106 LayoutEnum m_InlineAlign; 107 }; 108 typedef CFX_ArrayTemplate<RF_TableCell*> CRF_TableCellArray; 109 class CRF_Table : public CFX_Object 110 { 111 public: CRF_Table()112 CRF_Table() 113 { 114 m_TableWidth = 0; 115 m_nCol = 0; 116 } 117 CRF_TableCellArray m_pCellArray; 118 CFX_WordArray m_nCell; 119 int m_nCol; 120 FX_FLOAT m_TableWidth; 121 FX_FLOAT m_ReflowPageHeight; 122 }; 123 class CRF_CharState : public CFX_Object 124 { 125 public: 126 CPDF_Font* m_pFont; 127 FX_ARGB m_Color; 128 FX_BOOL m_bVert; 129 FX_FLOAT m_fFontSize; 130 FX_FLOAT m_fAscent; 131 FX_FLOAT m_fDescent; 132 133 CPDF_TextObject* m_pTextObj; 134 }; 135 class CRF_PageInfo : public CFX_Object 136 { 137 public: 138 CRF_PageInfo(CPDF_PageObject* pPageObj, CRF_PageInfo* pParent = NULL) m_pPageObj(pPageObj)139 : m_pPageObj(pPageObj) , m_pParent(pParent) 140 { 141 } GetPageObj()142 CPDF_PageObject* GetPageObj() 143 { 144 return m_pPageObj; 145 } GetFormDict()146 CPDF_Dictionary* GetFormDict() 147 { 148 if (NULL == m_pParent) { 149 return NULL; 150 } 151 CPDF_PageObject* pParentObj = m_pParent->GetPageObj(); 152 if (NULL == pParentObj || PDFPAGE_FORM != pParentObj->m_Type) { 153 return NULL; 154 } 155 return ((CPDF_FormObject*)pParentObj)->m_pForm->m_pResources; 156 } 157 protected: 158 CPDF_PageObject* m_pPageObj; 159 CRF_PageInfo* m_pParent; 160 }; 161 class CPDF_ReflowedPage : public IPDF_ReflowedPage, public CFX_PrivateData, public CFX_Object 162 { 163 public: 164 165 CPDF_ReflowedPage(CFX_GrowOnlyPool* pMemoryPool); 166 ~CPDF_ReflowedPage(); GetPrivateDataCtrl()167 CFX_PrivateData* GetPrivateDataCtrl() 168 { 169 return this; 170 }; 171 void GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix); 172 173 FX_FLOAT GetPageHeight() ; GetPageWidth()174 FX_FLOAT GetPageWidth() 175 { 176 return m_PageWidth; 177 }; 178 void FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str); 179 FX_BOOL FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y); 180 CRF_DataPtrArray* m_pReflowed; 181 FX_FLOAT m_PageWidth; 182 FX_FLOAT m_PageHeight; 183 FX_BOOL m_bWaiting; 184 CRF_CharStateArray* m_pCharState; 185 CFX_GrowOnlyPool* m_pMemoryPool; 186 FX_BOOL m_bCreateMemoryPool; 187 CPDF_Page* m_pPDFPage; 188 FX_BOOL RetainPageObjsMemberShip(); 189 void MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent); 190 void ReleasePageObjsMemberShip(); 191 CPDF_Dictionary* GetFormResDict(CPDF_PageObject* pObj); 192 193 CFX_MapPtrToPtr* m_pPageInfos; 194 }; 195 class CPDF_ProgressiveReflowPageParser : public IPDF_ProgressiveReflowPageParser, public CFX_Object 196 { 197 public: 198 CPDF_ProgressiveReflowPageParser(); 199 ~CPDF_ProgressiveReflowPageParser() ; 200 void Init(); 201 GetStatus()202 ParseStatus GetStatus() 203 { 204 return m_Status; 205 }; 206 SetParserStyle(RF_ParseStyle style)207 void SetParserStyle(RF_ParseStyle style) 208 { 209 m_ParseStyle = style; 210 }; 211 void Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags); 212 void Continue(IFX_Pause* pPause); 213 int GetPosition() ; 214 215 void Clear(); 216 ParseStatus m_Status; 217 protected: 218 RF_ParseStyle m_ParseStyle; 219 CPDF_Page* m_pPDFPage; 220 IFX_Pause* m_pPause; 221 CPDF_ReflowedPage* m_pReflowPage; 222 FX_FLOAT m_TopIndent; 223 FX_FLOAT m_ReflowedWidth; 224 FX_FLOAT m_fScreenHeight; 225 IPDF_LayoutProvider* m_pProvider; 226 IPDF_LayoutProcessor* m_pReflowEngine; 227 int m_nObjProcessed; 228 int m_flags; 229 }; 230 class CPDF_ProgressiveReflowPageRender : public IPDF_ProgressiveReflowPageRender, public CFX_Object 231 { 232 public: 233 CPDF_ProgressiveReflowPageRender(); 234 ~CPDF_ProgressiveReflowPageRender() ; 235 GetStatus()236 RenderStatus GetStatus() 237 { 238 return m_Status; 239 }; 240 241 242 void SetDisplayColor(FX_COLORREF color); 243 void Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits); 244 void Continue(IFX_Pause* pPause); 245 int GetPosition(); 246 247 248 void Clear(); 249 protected: 250 void Display(IFX_Pause* pPause); 251 RenderStatus m_Status; 252 CPDF_ReflowedPage* m_pReflowPage; 253 CFX_AffineMatrix* m_pDisplayMatrix; 254 int m_CurrNum; 255 IFX_FontEncoding* m_pFontEncoding; 256 CFX_RenderDevice* m_pFXDevice; 257 int m_DitherBits; 258 FX_COLORREF m_DisplayColor; 259 typedef struct CRF_TextDataAtt { CRF_TextDataAttCRF_TextDataAtt260 CRF_TextDataAtt() 261 { 262 pFont = NULL; 263 fFontSize = 0.0f; 264 Color = 0; 265 } CRF_TextDataAttCRF_TextDataAtt266 CRF_TextDataAtt(CPDF_Font* font, FX_FLOAT fontSize, FX_ARGB color) 267 { 268 pFont = font; 269 fFontSize = fontSize; 270 Color = color; 271 } 272 CPDF_Font* pFont; 273 FX_FLOAT fFontSize; 274 FX_ARGB Color; 275 } CRF_TEXTDATAATT; isTextDataAttSame(CRF_TEXTDATAATT data1,CRF_TEXTDATAATT data2)276 inline bool isTextDataAttSame(CRF_TEXTDATAATT data1, CRF_TEXTDATAATT data2) 277 { 278 if (data1.pFont != data2.pFont) { 279 return false; 280 } 281 if (data1.Color != data2.Color) { 282 return false; 283 } 284 if (fabs(data1.fFontSize - data2.fFontSize) > 0.0f) { 285 return false; 286 } 287 return true; 288 }; 289 }; 290 #define TYPE_UNKNOW 0 291 #define TYPE_TEXT 1 292 #define TYPE_PATH 2 293 #define TYPE_IMAGE 3 294 #define TYPE_LINE 4 295 class CRF_Data : public CFX_Object 296 { 297 public: 298 typedef enum {Unknow, Text, Image, Path, Line, paragraph} RF_DataType; CRF_Data()299 CRF_Data() 300 { 301 m_Type = Unknow; 302 m_Width = 0; 303 m_PosY = 0; 304 m_PosX = 0; 305 m_Height = 0; 306 } GetType()307 RF_DataType GetType() 308 { 309 return m_Type; 310 } ~CRF_Data()311 virtual ~CRF_Data() {} 312 RF_DataType m_Type; 313 FX_FLOAT m_PosX; 314 FX_FLOAT m_PosY; 315 FX_FLOAT m_Width; 316 FX_FLOAT m_Height; 317 }; 318 class CRF_LineData : public CRF_Data 319 { 320 public: CRF_LineData()321 CRF_LineData() 322 { 323 m_Type = Line; 324 } 325 }; 326 class CRF_CharData : public CRF_Data 327 { 328 public: CRF_CharData()329 CRF_CharData() 330 { 331 m_Type = Text; 332 m_CharCode = -1; 333 } 334 CRF_CharState* m_pCharState; 335 FX_DWORD m_CharCode; 336 }; 337 class CRF_ImageData : public CRF_Data 338 { 339 public: CRF_ImageData()340 CRF_ImageData() 341 { 342 m_Type = Image; 343 m_pBitmap = NULL; 344 } ~CRF_ImageData()345 ~CRF_ImageData() 346 { 347 if(m_pBitmap) { 348 delete m_pBitmap; 349 } 350 m_pBitmap = NULL; 351 } 352 CFX_AffineMatrix m_Matrix; 353 CFX_DIBitmap* m_pBitmap; 354 }; 355 class CRF_PathData : public CRF_Data 356 { 357 public: CRF_PathData()358 CRF_PathData() 359 { 360 m_Type = Path; 361 m_bDecoration = FALSE; 362 } ~CRF_PathData()363 ~CRF_PathData() {}; 364 FX_BOOL m_bDecoration; 365 CPDF_Path m_pPathData; 366 CFX_AffineMatrix m_pPath2Device; 367 CPDF_GraphState m_pGraphState; 368 FX_ARGB m_fill_argb; 369 FX_ARGB m_stroke_argb; 370 int m_fill_mode; 371 }; 372 #endif 373