Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2006 The Android Open Source Project
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkCoreBlitters_DEFINED
      9 #define SkCoreBlitters_DEFINED
     10 
     11 #include "SkBitmapProcShader.h"
     12 #include "SkBlitter.h"
     13 #include "SkBlitRow.h"
     14 #include "SkShader.h"
     15 #include "SkSmallAllocator.h"
     16 
     17 class SkRasterBlitter : public SkBlitter {
     18 public:
     19     SkRasterBlitter(const SkPixmap& device) : fDevice(device) {}
     20 
     21 protected:
     22     const SkPixmap fDevice;
     23 
     24 private:
     25     typedef SkBlitter INHERITED;
     26 };
     27 
     28 class SkShaderBlitter : public SkRasterBlitter {
     29 public:
     30     /**
     31       *  The storage for shaderContext is owned by the caller, but the object itself is not.
     32       *  The blitter only ensures that the storage always holds a live object, but it may
     33       *  exchange that object.
     34       */
     35     SkShaderBlitter(const SkPixmap& device, const SkPaint& paint,
     36                     SkShader::Context* shaderContext);
     37     virtual ~SkShaderBlitter();
     38 
     39     /**
     40       *  Create a new shader context and uses it instead of the old one if successful.
     41       *  Will create the context at the same location as the old one (this is safe
     42       *  because the shader itself is unchanged).
     43       */
     44     bool resetShaderContext(const SkShader::ContextRec&) override;
     45 
     46     SkShader::Context* getShaderContext() const override { return fShaderContext; }
     47 
     48 protected:
     49     uint32_t            fShaderFlags;
     50     const SkShader*     fShader;
     51     SkShader::Context*  fShaderContext;
     52     bool                fConstInY;
     53 
     54 private:
     55     // illegal
     56     SkShaderBlitter& operator=(const SkShaderBlitter&);
     57 
     58     typedef SkRasterBlitter INHERITED;
     59 };
     60 
     61 ///////////////////////////////////////////////////////////////////////////////
     62 
     63 class SkA8_Coverage_Blitter : public SkRasterBlitter {
     64 public:
     65     SkA8_Coverage_Blitter(const SkPixmap& device, const SkPaint& paint);
     66     void blitH(int x, int y, int width) override;
     67     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
     68     void blitV(int x, int y, int height, SkAlpha alpha) override;
     69     void blitRect(int x, int y, int width, int height) override;
     70     void blitMask(const SkMask&, const SkIRect&) override;
     71     const SkPixmap* justAnOpaqueColor(uint32_t*) override;
     72 };
     73 
     74 class SkA8_Blitter : public SkRasterBlitter {
     75 public:
     76     SkA8_Blitter(const SkPixmap& device, const SkPaint& paint);
     77     void blitH(int x, int y, int width) override;
     78     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
     79     void blitV(int x, int y, int height, SkAlpha alpha) override;
     80     void blitRect(int x, int y, int width, int height) override;
     81     void blitMask(const SkMask&, const SkIRect&) override;
     82     const SkPixmap* justAnOpaqueColor(uint32_t*) override;
     83 
     84 private:
     85     unsigned fSrcA;
     86 
     87     // illegal
     88     SkA8_Blitter& operator=(const SkA8_Blitter&);
     89 
     90     typedef SkRasterBlitter INHERITED;
     91 };
     92 
     93 class SkA8_Shader_Blitter : public SkShaderBlitter {
     94 public:
     95     SkA8_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
     96                         SkShader::Context* shaderContext);
     97     virtual ~SkA8_Shader_Blitter();
     98     void blitH(int x, int y, int width) override;
     99     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
    100     void blitMask(const SkMask&, const SkIRect&) override;
    101 
    102 private:
    103     SkXfermode* fXfermode;
    104     SkPMColor*  fBuffer;
    105     uint8_t*    fAAExpand;
    106 
    107     // illegal
    108     SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
    109 
    110     typedef SkShaderBlitter INHERITED;
    111 };
    112 
    113 ////////////////////////////////////////////////////////////////
    114 
    115 class SkARGB32_Blitter : public SkRasterBlitter {
    116 public:
    117     SkARGB32_Blitter(const SkPixmap& device, const SkPaint& paint);
    118     void blitH(int x, int y, int width) override;
    119     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
    120     void blitV(int x, int y, int height, SkAlpha alpha) override;
    121     void blitRect(int x, int y, int width, int height) override;
    122     void blitMask(const SkMask&, const SkIRect&) override;
    123     const SkPixmap* justAnOpaqueColor(uint32_t*) override;
    124     void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
    125     void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
    126 
    127 protected:
    128     SkColor                fColor;
    129     SkPMColor              fPMColor;
    130 
    131 private:
    132     unsigned fSrcA, fSrcR, fSrcG, fSrcB;
    133 
    134     // illegal
    135     SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
    136 
    137     typedef SkRasterBlitter INHERITED;
    138 };
    139 
    140 class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
    141 public:
    142     SkARGB32_Opaque_Blitter(const SkPixmap& device, const SkPaint& paint)
    143         : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
    144     void blitMask(const SkMask&, const SkIRect&) override;
    145     void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
    146     void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
    147 
    148 private:
    149     typedef SkARGB32_Blitter INHERITED;
    150 };
    151 
    152 class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
    153 public:
    154     SkARGB32_Black_Blitter(const SkPixmap& device, const SkPaint& paint)
    155         : INHERITED(device, paint) {}
    156     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
    157     void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
    158     void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
    159 
    160 private:
    161     typedef SkARGB32_Opaque_Blitter INHERITED;
    162 };
    163 
    164 class SkARGB32_Shader_Blitter : public SkShaderBlitter {
    165 public:
    166     SkARGB32_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
    167                             SkShader::Context* shaderContext);
    168     virtual ~SkARGB32_Shader_Blitter();
    169     void blitH(int x, int y, int width) override;
    170     void blitV(int x, int y, int height, SkAlpha alpha) override;
    171     void blitRect(int x, int y, int width, int height) override;
    172     void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
    173     void blitMask(const SkMask&, const SkIRect&) override;
    174 
    175 private:
    176     SkXfermode*         fXfermode;
    177     SkPMColor*          fBuffer;
    178     SkBlitRow::Proc32   fProc32;
    179     SkBlitRow::Proc32   fProc32Blend;
    180     bool                fShadeDirectlyIntoDevice;
    181 
    182     // illegal
    183     SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
    184 
    185     typedef SkShaderBlitter INHERITED;
    186 };
    187 
    188 SkBlitter* SkBlitter_ARGB32_Create(const SkPixmap& device, const SkPaint& paint,
    189                                    SkShader::Context* shaderContext,
    190                                    SkTBlitterAllocator* allocator);
    191 
    192 SkBlitter* SkBlitter_ARGB64_Create(const SkPixmap& device, const SkPaint& paint,
    193                                    SkShader::Context* shaderContext,
    194                                    SkTBlitterAllocator* allocator);
    195 
    196 ///////////////////////////////////////////////////////////////////////////////
    197 
    198 /*  These return the correct subclass of blitter for their device config.
    199 
    200     Currently, they make the following assumptions about the state of the
    201     paint:
    202 
    203     1. If there is an xfermode, there will also be a shader
    204     2. If there is a colorfilter, there will be a shader that itself handles
    205        calling the filter, so the blitter can always ignore the colorfilter obj
    206 
    207     These pre-conditions must be handled by the caller, in our case
    208     SkBlitter::Choose(...)
    209  */
    210 
    211 SkBlitter* SkBlitter_ChooseD565(const SkPixmap& device, const SkPaint& paint,
    212                                 SkShader::Context* shaderContext,
    213                                 SkTBlitterAllocator* allocator);
    214 
    215 #endif
    216