Home | History | Annotate | Download | only in fxge
      1 // Copyright 2016 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_FXGE_CFX_RENDERDEVICE_H_
      8 #define CORE_FXGE_CFX_RENDERDEVICE_H_
      9 
     10 #include <memory>
     11 
     12 #include "core/fxcrt/unowned_ptr.h"
     13 #include "core/fxge/cfx_color.h"
     14 #include "core/fxge/fx_dib.h"
     15 
     16 class CFX_DIBitmap;
     17 class CFX_Font;
     18 class CFX_GraphStateData;
     19 class CFX_ImageRenderer;
     20 class IFX_PauseIndicator;
     21 class IFX_RenderDeviceDriver;
     22 
     23 #define FXDC_DEVICE_CLASS 1
     24 #define FXDC_PIXEL_WIDTH 2
     25 #define FXDC_PIXEL_HEIGHT 3
     26 #define FXDC_BITS_PIXEL 4
     27 #define FXDC_HORZ_SIZE 5
     28 #define FXDC_VERT_SIZE 6
     29 #define FXDC_RENDER_CAPS 7
     30 #define FXDC_DISPLAY 1
     31 #define FXDC_PRINTER 2
     32 
     33 #define FXRC_GET_BITS 0x01
     34 #define FXRC_BIT_MASK 0x02
     35 #define FXRC_ALPHA_PATH 0x10
     36 #define FXRC_ALPHA_IMAGE 0x20
     37 #define FXRC_ALPHA_OUTPUT 0x40
     38 #define FXRC_BLEND_MODE 0x80
     39 #define FXRC_SOFT_CLIP 0x100
     40 #define FXRC_CMYK_OUTPUT 0x200
     41 #define FXRC_BITMASK_OUTPUT 0x400
     42 #define FXRC_BYTEMASK_OUTPUT 0x800
     43 #define FXRENDER_IMAGE_LOSSY 0x1000
     44 #define FXRC_FILLSTROKE_PATH 0x2000
     45 #define FXRC_SHADING 0x4000
     46 
     47 #define FXFILL_ALTERNATE 1
     48 #define FXFILL_WINDING 2
     49 #define FXFILL_FULLCOVER 4
     50 #define FXFILL_RECT_AA 8
     51 #define FX_FILL_STROKE 16
     52 #define FX_STROKE_ADJUST 32
     53 #define FX_STROKE_TEXT_MODE 64
     54 #define FX_FILL_TEXT_MODE 128
     55 #define FX_ZEROAREA_FILL 256
     56 #define FXFILL_NOPATHSMOOTH 512
     57 
     58 #define FXTEXT_CLEARTYPE 0x01
     59 #define FXTEXT_BGR_STRIPE 0x02
     60 #define FXTEXT_PRINTGRAPHICTEXT 0x04
     61 #define FXTEXT_NO_NATIVETEXT 0x08
     62 #define FXTEXT_PRINTIMAGETEXT 0x10
     63 #define FXTEXT_NOSMOOTH 0x20
     64 
     65 class CFX_PathData;
     66 
     67 enum class FXPT_TYPE : uint8_t { LineTo, BezierTo, MoveTo };
     68 
     69 class FXTEXT_CHARPOS {
     70  public:
     71   FXTEXT_CHARPOS();
     72   FXTEXT_CHARPOS(const FXTEXT_CHARPOS&);
     73   ~FXTEXT_CHARPOS();
     74 
     75   float m_AdjustMatrix[4];
     76   CFX_PointF m_Origin;
     77   uint32_t m_Unicode;
     78   uint32_t m_GlyphIndex;
     79   int32_t m_FontCharWidth;
     80 #if _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
     81   uint32_t m_ExtGID;
     82 #endif
     83   int32_t m_FallbackFontPosition;
     84   bool m_bGlyphAdjust;
     85   bool m_bFontStyle;
     86 };
     87 
     88 class CFX_RenderDevice {
     89  public:
     90   class StateRestorer {
     91    public:
     92     explicit StateRestorer(CFX_RenderDevice* pDevice);
     93     ~StateRestorer();
     94 
     95    private:
     96     UnownedPtr<CFX_RenderDevice> m_pDevice;
     97   };
     98 
     99   CFX_RenderDevice();
    100   virtual ~CFX_RenderDevice();
    101 
    102   // Take ownership of |pDriver|.
    103   void SetDeviceDriver(std::unique_ptr<IFX_RenderDeviceDriver> pDriver);
    104   IFX_RenderDeviceDriver* GetDeviceDriver() const {
    105     return m_pDeviceDriver.get();
    106   }
    107 
    108   void SaveState();
    109   void RestoreState(bool bKeepSaved);
    110 
    111   int GetWidth() const { return m_Width; }
    112   int GetHeight() const { return m_Height; }
    113   int GetDeviceClass() const { return m_DeviceClass; }
    114   int GetRenderCaps() const { return m_RenderCaps; }
    115   int GetDeviceCaps(int id) const;
    116   CFX_Matrix GetCTM() const;
    117   RetainPtr<CFX_DIBitmap> GetBitmap() const;
    118   void SetBitmap(const RetainPtr<CFX_DIBitmap>& pBitmap);
    119   bool CreateCompatibleBitmap(const RetainPtr<CFX_DIBitmap>& pDIB,
    120                               int width,
    121                               int height) const;
    122   const FX_RECT& GetClipBox() const { return m_ClipBox; }
    123   bool SetClip_PathFill(const CFX_PathData* pPathData,
    124                         const CFX_Matrix* pObject2Device,
    125                         int fill_mode);
    126   bool SetClip_Rect(const CFX_RectF& pRect);
    127   bool SetClip_Rect(const FX_RECT& pRect);
    128   bool SetClip_PathStroke(const CFX_PathData* pPathData,
    129                           const CFX_Matrix* pObject2Device,
    130                           const CFX_GraphStateData* pGraphState);
    131   bool DrawPath(const CFX_PathData* pPathData,
    132                 const CFX_Matrix* pObject2Device,
    133                 const CFX_GraphStateData* pGraphState,
    134                 uint32_t fill_color,
    135                 uint32_t stroke_color,
    136                 int fill_mode) {
    137     return DrawPathWithBlend(pPathData, pObject2Device, pGraphState, fill_color,
    138                              stroke_color, fill_mode, FXDIB_BLEND_NORMAL);
    139   }
    140   bool DrawPathWithBlend(const CFX_PathData* pPathData,
    141                          const CFX_Matrix* pObject2Device,
    142                          const CFX_GraphStateData* pGraphState,
    143                          uint32_t fill_color,
    144                          uint32_t stroke_color,
    145                          int fill_mode,
    146                          int blend_type);
    147   bool FillRect(const FX_RECT* pRect, uint32_t color) {
    148     return FillRectWithBlend(pRect, color, FXDIB_BLEND_NORMAL);
    149   }
    150 
    151   RetainPtr<CFX_DIBitmap> GetBackDrop();
    152   bool GetDIBits(const RetainPtr<CFX_DIBitmap>& pBitmap, int left, int top);
    153   bool SetDIBits(const RetainPtr<CFX_DIBSource>& pBitmap, int left, int top) {
    154     return SetDIBitsWithBlend(pBitmap, left, top, FXDIB_BLEND_NORMAL);
    155   }
    156   bool SetDIBitsWithBlend(const RetainPtr<CFX_DIBSource>& pBitmap,
    157                           int left,
    158                           int top,
    159                           int blend_type);
    160   bool StretchDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
    161                      int left,
    162                      int top,
    163                      int dest_width,
    164                      int dest_height) {
    165     return StretchDIBitsWithFlagsAndBlend(pBitmap, left, top, dest_width,
    166                                           dest_height, 0, FXDIB_BLEND_NORMAL);
    167   }
    168   bool StretchDIBitsWithFlagsAndBlend(const RetainPtr<CFX_DIBSource>& pBitmap,
    169                                       int left,
    170                                       int top,
    171                                       int dest_width,
    172                                       int dest_height,
    173                                       uint32_t flags,
    174                                       int blend_type);
    175   bool SetBitMask(const RetainPtr<CFX_DIBSource>& pBitmap,
    176                   int left,
    177                   int top,
    178                   uint32_t color);
    179   bool StretchBitMask(const RetainPtr<CFX_DIBSource>& pBitmap,
    180                       int left,
    181                       int top,
    182                       int dest_width,
    183                       int dest_height,
    184                       uint32_t color);
    185   bool StretchBitMaskWithFlags(const RetainPtr<CFX_DIBSource>& pBitmap,
    186                                int left,
    187                                int top,
    188                                int dest_width,
    189                                int dest_height,
    190                                uint32_t color,
    191                                uint32_t flags);
    192   bool StartDIBits(const RetainPtr<CFX_DIBSource>& pBitmap,
    193                    int bitmap_alpha,
    194                    uint32_t color,
    195                    const CFX_Matrix* pMatrix,
    196                    uint32_t flags,
    197                    std::unique_ptr<CFX_ImageRenderer>* handle) {
    198     return StartDIBitsWithBlend(pBitmap, bitmap_alpha, color, pMatrix, flags,
    199                                 handle, FXDIB_BLEND_NORMAL);
    200   }
    201   bool StartDIBitsWithBlend(const RetainPtr<CFX_DIBSource>& pBitmap,
    202                             int bitmap_alpha,
    203                             uint32_t color,
    204                             const CFX_Matrix* pMatrix,
    205                             uint32_t flags,
    206                             std::unique_ptr<CFX_ImageRenderer>* handle,
    207                             int blend_type);
    208   bool ContinueDIBits(CFX_ImageRenderer* handle, IFX_PauseIndicator* pPause);
    209 
    210   bool DrawNormalText(int nChars,
    211                       const FXTEXT_CHARPOS* pCharPos,
    212                       CFX_Font* pFont,
    213                       float font_size,
    214                       const CFX_Matrix* pText2Device,
    215                       uint32_t fill_color,
    216                       uint32_t text_flags);
    217   bool DrawTextPath(int nChars,
    218                     const FXTEXT_CHARPOS* pCharPos,
    219                     CFX_Font* pFont,
    220                     float font_size,
    221                     const CFX_Matrix* pText2User,
    222                     const CFX_Matrix* pUser2Device,
    223                     const CFX_GraphStateData* pGraphState,
    224                     uint32_t fill_color,
    225                     uint32_t stroke_color,
    226                     CFX_PathData* pClippingPath,
    227                     int nFlag);
    228 
    229   void DrawFillRect(const CFX_Matrix* pUser2Device,
    230                     const CFX_FloatRect& rect,
    231                     const CFX_Color& color,
    232                     int32_t nTransparency);
    233   void DrawFillRect(const CFX_Matrix* pUser2Device,
    234                     const CFX_FloatRect& rect,
    235                     const FX_COLORREF& color);
    236   void DrawStrokeRect(const CFX_Matrix* pUser2Device,
    237                       const CFX_FloatRect& rect,
    238                       const FX_COLORREF& color,
    239                       float fWidth);
    240   void DrawStrokeLine(const CFX_Matrix* pUser2Device,
    241                       const CFX_PointF& ptMoveTo,
    242                       const CFX_PointF& ptLineTo,
    243                       const FX_COLORREF& color,
    244                       float fWidth);
    245   void DrawBorder(const CFX_Matrix* pUser2Device,
    246                   const CFX_FloatRect& rect,
    247                   float fWidth,
    248                   const CFX_Color& color,
    249                   const CFX_Color& crLeftTop,
    250                   const CFX_Color& crRightBottom,
    251                   BorderStyle nStyle,
    252                   int32_t nTransparency);
    253   void DrawFillArea(const CFX_Matrix* pUser2Device,
    254                     const CFX_PointF* pPts,
    255                     int32_t nCount,
    256                     const FX_COLORREF& color);
    257   void DrawShadow(const CFX_Matrix* pUser2Device,
    258                   bool bVertical,
    259                   bool bHorizontal,
    260                   CFX_FloatRect rect,
    261                   int32_t nTransparency,
    262                   int32_t nStartGray,
    263                   int32_t nEndGray);
    264 
    265 #ifdef _SKIA_SUPPORT_
    266   virtual void DebugVerifyBitmapIsPreMultiplied() const;
    267   virtual bool SetBitsWithMask(const RetainPtr<CFX_DIBSource>& pBitmap,
    268                                const RetainPtr<CFX_DIBSource>& pMask,
    269                                int left,
    270                                int top,
    271                                int bitmap_alpha,
    272                                int blend_type);
    273 #endif
    274 #if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_
    275   void Flush(bool release);
    276 #endif
    277 
    278  private:
    279   void InitDeviceInfo();
    280   void UpdateClipBox();
    281   bool DrawFillStrokePath(const CFX_PathData* pPathData,
    282                           const CFX_Matrix* pObject2Device,
    283                           const CFX_GraphStateData* pGraphState,
    284                           uint32_t fill_color,
    285                           uint32_t stroke_color,
    286                           int fill_mode,
    287                           int blend_type);
    288   bool DrawCosmeticLine(const CFX_PointF& ptMoveTo,
    289                         const CFX_PointF& ptLineTo,
    290                         uint32_t color,
    291                         int fill_mode,
    292                         int blend_type);
    293   bool FillRectWithBlend(const FX_RECT* pRect, uint32_t color, int blend_type);
    294 
    295   RetainPtr<CFX_DIBitmap> m_pBitmap;
    296   int m_Width;
    297   int m_Height;
    298   int m_bpp;
    299   int m_RenderCaps;
    300   int m_DeviceClass;
    301   FX_RECT m_ClipBox;
    302   std::unique_ptr<IFX_RenderDeviceDriver> m_pDeviceDriver;
    303 };
    304 
    305 #endif  // CORE_FXGE_CFX_RENDERDEVICE_H_
    306