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_RENDER_H_
      8 #define CORE_INCLUDE_FPDFAPI_FPDF_RENDER_H_
      9 
     10 #include <map>
     11 #include <memory>
     12 
     13 #include "core/include/fpdfapi/fpdf_page.h"
     14 #include "core/include/fxge/fx_ge.h"
     15 
     16 class CFX_GraphStateData;
     17 class CFX_PathData;
     18 class CFX_RenderDevice;
     19 class CPDF_FormObject;
     20 class CPDF_ImageCacheEntry;
     21 class CPDF_ImageObject;
     22 class CPDF_PathObject;
     23 class CPDF_RenderContext;
     24 class CPDF_RenderOptions;
     25 class CPDF_RenderStatus;
     26 class CPDF_ShadingObject;
     27 class CPDF_TextObject;
     28 class IFX_Pause;
     29 
     30 class IPDF_OCContext {
     31  public:
     32   virtual ~IPDF_OCContext() {}
     33 
     34   virtual FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCG) = 0;
     35 
     36   FX_BOOL CheckObjectVisible(const CPDF_PageObject* pObj);
     37 };
     38 #define RENDER_COLOR_NORMAL 0
     39 #define RENDER_COLOR_GRAY 1
     40 #define RENDER_COLOR_TWOCOLOR 2
     41 #define RENDER_COLOR_ALPHA 3
     42 #define RENDER_CLEARTYPE 0x00000001
     43 #define RENDER_PRINTGRAPHICTEXT 0x00000002
     44 #define RENDER_FORCE_DOWNSAMPLE 0x00000004
     45 #define RENDER_PRINTPREVIEW 0x00000008
     46 #define RENDER_BGR_STRIPE 0x00000010
     47 #define RENDER_NO_NATIVETEXT 0x00000020
     48 #define RENDER_FORCE_HALFTONE 0x00000040
     49 #define RENDER_RECT_AA 0x00000080
     50 #define RENDER_FILL_FULLCOVER 0x00000100
     51 #define RENDER_PRINTIMAGETEXT 0x00000200
     52 #define RENDER_OVERPRINT 0x00000400
     53 #define RENDER_THINLINE 0x00000800
     54 #define RENDER_NOTEXTSMOOTH 0x10000000
     55 #define RENDER_NOPATHSMOOTH 0x20000000
     56 #define RENDER_NOIMAGESMOOTH 0x40000000
     57 #define RENDER_LIMITEDIMAGECACHE 0x80000000
     58 class CPDF_RenderOptions {
     59  public:
     60   CPDF_RenderOptions();
     61 
     62   int m_ColorMode;
     63 
     64   FX_COLORREF m_BackColor;
     65 
     66   FX_COLORREF m_ForeColor;
     67 
     68   FX_DWORD m_Flags;
     69 
     70   int m_Interpolation;
     71 
     72   FX_DWORD m_AddFlags;
     73 
     74   IPDF_OCContext* m_pOCContext;
     75 
     76   FX_DWORD m_dwLimitCacheSize;
     77 
     78   int m_HalftoneLimit;
     79 
     80   FX_ARGB TranslateColor(FX_ARGB argb) const;
     81 };
     82 class CPDF_RenderContext {
     83  public:
     84   explicit CPDF_RenderContext(CPDF_Page* pPage);
     85   CPDF_RenderContext(CPDF_Document* pDoc, CPDF_PageRenderCache* pPageCache);
     86   ~CPDF_RenderContext();
     87 
     88   void AppendObjectList(CPDF_PageObjects* pObjs,
     89                         const CFX_Matrix* pObject2Device);
     90 
     91   void Render(CFX_RenderDevice* pDevice,
     92               const CPDF_RenderOptions* pOptions = NULL,
     93               const CFX_Matrix* pFinalMatrix = NULL);
     94 
     95   void DrawObjectList(CFX_RenderDevice* pDevice,
     96                       CPDF_PageObjects* pObjs,
     97                       const CFX_Matrix* pObject2Device,
     98                       const CPDF_RenderOptions* pOptions);
     99 
    100   void GetBackground(CFX_DIBitmap* pBuffer,
    101                      const CPDF_PageObject* pObj,
    102                      const CPDF_RenderOptions* pOptions,
    103                      CFX_Matrix* pFinalMatrix);
    104 
    105   CPDF_PageRenderCache* GetPageCache() const { return m_pPageCache; }
    106 
    107  protected:
    108   void Render(CFX_RenderDevice* pDevice,
    109               const CPDF_PageObject* pStopObj,
    110               const CPDF_RenderOptions* pOptions,
    111               const CFX_Matrix* pFinalMatrix);
    112 
    113   CPDF_Document* const m_pDocument;
    114   CPDF_Dictionary* m_pPageResources;
    115   CPDF_PageRenderCache* m_pPageCache;
    116   CFX_ArrayTemplate<struct _PDF_RenderItem> m_ContentList;
    117   FX_BOOL m_bFirstLayer;
    118 
    119   friend class CPDF_RenderStatus;
    120   friend class CPDF_ProgressiveRenderer;
    121 };
    122 
    123 class CPDF_ProgressiveRenderer {
    124  public:
    125   // Must match FDF_RENDER_* definitions in public/fpdf_progressive.h, but
    126   // cannot #include that header. fpdfsdk/src/fpdf_progressive.cpp has
    127   // static_asserts to make sure the two sets of values match.
    128   enum Status {
    129     Ready,          // FPDF_RENDER_READER
    130     ToBeContinued,  // FPDF_RENDER_TOBECOUNTINUED
    131     Done,           // FPDF_RENDER_DONE
    132     Failed          // FPDF_RENDER_FAILED
    133   };
    134 
    135   static int ToFPDFStatus(Status status) { return static_cast<int>(status); }
    136 
    137   CPDF_ProgressiveRenderer(CPDF_RenderContext* pContext,
    138                            CFX_RenderDevice* pDevice,
    139                            const CPDF_RenderOptions* pOptions);
    140   ~CPDF_ProgressiveRenderer();
    141 
    142   Status GetStatus() const { return m_Status; }
    143   void Start(IFX_Pause* pPause);
    144   void Continue(IFX_Pause* pPause);
    145   int EstimateProgress();
    146 
    147  private:
    148   void RenderStep();
    149 
    150   Status m_Status;
    151   CPDF_RenderContext* const m_pContext;
    152   CFX_RenderDevice* const m_pDevice;
    153   const CPDF_RenderOptions* const m_pOptions;
    154   std::unique_ptr<CPDF_RenderStatus> m_pRenderStatus;
    155   CFX_FloatRect m_ClipRect;
    156   FX_DWORD m_LayerIndex;
    157   FX_DWORD m_ObjectIndex;
    158   FX_POSITION m_ObjectPos;
    159   FX_POSITION m_PrevLastPos;
    160 };
    161 
    162 class CPDF_TextRenderer {
    163  public:
    164   static void DrawTextString(CFX_RenderDevice* pDevice,
    165                              int left,
    166                              int top,
    167                              CPDF_Font* pFont,
    168                              int height,
    169                              const CFX_ByteString& str,
    170                              FX_ARGB argb);
    171 
    172   static void DrawTextString(CFX_RenderDevice* pDevice,
    173                              FX_FLOAT origin_x,
    174                              FX_FLOAT origin_y,
    175                              CPDF_Font* pFont,
    176                              FX_FLOAT font_size,
    177                              const CFX_Matrix* matrix,
    178                              const CFX_ByteString& str,
    179                              FX_ARGB fill_argb,
    180                              FX_ARGB stroke_argb = 0,
    181                              const CFX_GraphStateData* pGraphState = NULL,
    182                              const CPDF_RenderOptions* pOptions = NULL);
    183 
    184   static FX_BOOL DrawTextPath(CFX_RenderDevice* pDevice,
    185                               int nChars,
    186                               FX_DWORD* pCharCodes,
    187                               FX_FLOAT* pCharPos,
    188                               CPDF_Font* pFont,
    189                               FX_FLOAT font_size,
    190                               const CFX_Matrix* pText2User,
    191                               const CFX_Matrix* pUser2Device,
    192                               const CFX_GraphStateData* pGraphState,
    193                               FX_ARGB fill_argb,
    194                               FX_ARGB stroke_argb,
    195                               CFX_PathData* pClippingPath,
    196                               int nFlag = 0);
    197 
    198   static FX_BOOL DrawNormalText(CFX_RenderDevice* pDevice,
    199                                 int nChars,
    200                                 FX_DWORD* pCharCodes,
    201                                 FX_FLOAT* pCharPos,
    202                                 CPDF_Font* pFont,
    203                                 FX_FLOAT font_size,
    204                                 const CFX_Matrix* pText2Device,
    205                                 FX_ARGB fill_argb,
    206                                 const CPDF_RenderOptions* pOptions);
    207 
    208   static FX_BOOL DrawType3Text(CFX_RenderDevice* pDevice,
    209                                int nChars,
    210                                FX_DWORD* pCharCodes,
    211                                FX_FLOAT* pCharPos,
    212                                CPDF_Font* pFont,
    213                                FX_FLOAT font_size,
    214                                const CFX_Matrix* pText2Device,
    215                                FX_ARGB fill_argb);
    216 };
    217 class CPDF_PageRenderCache {
    218  public:
    219   explicit CPDF_PageRenderCache(CPDF_Page* pPage)
    220       : m_pPage(pPage),
    221         m_pCurImageCacheEntry(nullptr),
    222         m_nTimeCount(0),
    223         m_nCacheSize(0),
    224         m_bCurFindCache(FALSE) {}
    225   ~CPDF_PageRenderCache();
    226   void ClearImageData();
    227 
    228   FX_DWORD EstimateSize();
    229   void CacheOptimization(int32_t dwLimitCacheSize);
    230   FX_DWORD GetTimeCount() const { return m_nTimeCount; }
    231   void SetTimeCount(FX_DWORD dwTimeCount) { m_nTimeCount = dwTimeCount; }
    232 
    233   void GetCachedBitmap(CPDF_Stream* pStream,
    234                        CFX_DIBSource*& pBitmap,
    235                        CFX_DIBSource*& pMask,
    236                        FX_DWORD& MatteColor,
    237                        FX_BOOL bStdCS = FALSE,
    238                        FX_DWORD GroupFamily = 0,
    239                        FX_BOOL bLoadMask = FALSE,
    240                        CPDF_RenderStatus* pRenderStatus = NULL,
    241                        int32_t downsampleWidth = 0,
    242                        int32_t downsampleHeight = 0);
    243 
    244   void ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap);
    245   void ClearImageCacheEntry(CPDF_Stream* pStream);
    246   CPDF_Page* GetPage() const { return m_pPage; }
    247   CPDF_ImageCacheEntry* GetCurImageCacheEntry() const {
    248     return m_pCurImageCacheEntry;
    249   }
    250 
    251   FX_BOOL StartGetCachedBitmap(CPDF_Stream* pStream,
    252                                FX_BOOL bStdCS = FALSE,
    253                                FX_DWORD GroupFamily = 0,
    254                                FX_BOOL bLoadMask = FALSE,
    255                                CPDF_RenderStatus* pRenderStatus = NULL,
    256                                int32_t downsampleWidth = 0,
    257                                int32_t downsampleHeight = 0);
    258 
    259   FX_BOOL Continue(IFX_Pause* pPause);
    260 
    261  protected:
    262   friend class CPDF_Page;
    263   CPDF_Page* const m_pPage;
    264   CPDF_ImageCacheEntry* m_pCurImageCacheEntry;
    265   std::map<CPDF_Stream*, CPDF_ImageCacheEntry*> m_ImageCache;
    266   FX_DWORD m_nTimeCount;
    267   FX_DWORD m_nCacheSize;
    268   FX_BOOL m_bCurFindCache;
    269 };
    270 class CPDF_RenderConfig {
    271  public:
    272   CPDF_RenderConfig();
    273   ~CPDF_RenderConfig();
    274   int m_HalftoneLimit;
    275   int m_RenderStepLimit;
    276 };
    277 
    278 FX_BOOL IsAvailableMatrix(const CFX_Matrix& matrix);
    279 
    280 #endif  // CORE_INCLUDE_FPDFAPI_FPDF_RENDER_H_
    281