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 "SkShaderBase.h"
     15 #include "SkXfermodePriv.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                     SkShaderBase::Context* shaderContext);
     37     virtual ~SkShaderBlitter();
     38 
     39 protected:
     40     uint32_t                fShaderFlags;
     41     const SkShader*         fShader;
     42     SkShaderBase::Context*  fShaderContext;
     43     bool                    fConstInY;
     44 
     45 private:
     46     // illegal
     47     SkShaderBlitter& operator=(const SkShaderBlitter&);
     48 
     49     typedef SkRasterBlitter INHERITED;
     50 };
     51 
     52 ///////////////////////////////////////////////////////////////////////////////
     53 
     54 class SkA8_Coverage_Blitter : public SkRasterBlitter {
     55 public:
     56     SkA8_Coverage_Blitter(const SkPixmap& device, const SkPaint& paint);
     57     void blitH(int x, int y, int width) override;
     58     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
     59     void blitV(int x, int y, int height, SkAlpha alpha) override;
     60     void blitRect(int x, int y, int width, int height) override;
     61     void blitMask(const SkMask&, const SkIRect&) override;
     62     const SkPixmap* justAnOpaqueColor(uint32_t*) override;
     63 };
     64 
     65 ////////////////////////////////////////////////////////////////
     66 
     67 class SkARGB32_Blitter : public SkRasterBlitter {
     68 public:
     69     SkARGB32_Blitter(const SkPixmap& device, const SkPaint& paint);
     70     void blitH(int x, int y, int width) override;
     71     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
     72     void blitV(int x, int y, int height, SkAlpha alpha) override;
     73     void blitRect(int x, int y, int width, int height) override;
     74     void blitMask(const SkMask&, const SkIRect&) override;
     75     const SkPixmap* justAnOpaqueColor(uint32_t*) override;
     76     void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
     77     void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
     78 
     79 protected:
     80     SkColor                fColor;
     81     SkPMColor              fPMColor;
     82 
     83 private:
     84     unsigned fSrcA, fSrcR, fSrcG, fSrcB;
     85 
     86     // illegal
     87     SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
     88 
     89     typedef SkRasterBlitter INHERITED;
     90 };
     91 
     92 class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
     93 public:
     94     SkARGB32_Opaque_Blitter(const SkPixmap& device, const SkPaint& paint)
     95         : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
     96     void blitMask(const SkMask&, const SkIRect&) override;
     97     void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
     98     void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
     99 
    100 private:
    101     typedef SkARGB32_Blitter INHERITED;
    102 };
    103 
    104 class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
    105 public:
    106     SkARGB32_Black_Blitter(const SkPixmap& device, const SkPaint& paint)
    107         : INHERITED(device, paint) {}
    108     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
    109     void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
    110     void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
    111 
    112 private:
    113     typedef SkARGB32_Opaque_Blitter INHERITED;
    114 };
    115 
    116 class SkARGB32_Shader_Blitter : public SkShaderBlitter {
    117 public:
    118     SkARGB32_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
    119                             SkShaderBase::Context* shaderContext);
    120     ~SkARGB32_Shader_Blitter() override;
    121     void blitH(int x, int y, int width) override;
    122     void blitV(int x, int y, int height, SkAlpha alpha) override;
    123     void blitRect(int x, int y, int width, int height) override;
    124     void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
    125     void blitMask(const SkMask&, const SkIRect&) override;
    126 
    127 private:
    128     SkXfermode*         fXfermode;
    129     SkPMColor*          fBuffer;
    130     SkBlitRow::Proc32   fProc32;
    131     SkBlitRow::Proc32   fProc32Blend;
    132     bool                fShadeDirectlyIntoDevice;
    133 
    134     // illegal
    135     SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
    136 
    137     typedef SkShaderBlitter INHERITED;
    138 };
    139 
    140 ///////////////////////////////////////////////////////////////////////////////////////////////////
    141 
    142 typedef void (*SkS32D16BlendProc)(uint16_t*, const SkPMColor*, int, uint8_t);
    143 
    144 class SkRGB565_Shader_Blitter : public SkShaderBlitter {
    145 public:
    146     SkRGB565_Shader_Blitter(const SkPixmap& device, const SkPaint&, SkShaderBase::Context*);
    147     ~SkRGB565_Shader_Blitter() override;
    148     void blitH(int x, int y, int width) override;
    149     void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
    150 
    151     static bool Supports(const SkPixmap& device, const SkPaint&);
    152 
    153 private:
    154     SkPMColor*          fBuffer;
    155     SkS32D16BlendProc   fBlend;
    156     SkS32D16BlendProc   fBlendCoverage;
    157 
    158     typedef SkShaderBlitter INHERITED;
    159 };
    160 
    161 ///////////////////////////////////////////////////////////////////////////////
    162 
    163 // Neither of these ever returns nullptr, but this first factory may return a SkNullBlitter.
    164 SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&, const SkMatrix& ctm,
    165                                          SkArenaAlloc*);
    166 // Use this if you've pre-baked a shader pipeline, including modulating with paint alpha.
    167 // This factory never returns an SkNullBlitter.
    168 SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&,
    169                                          const SkRasterPipeline& shaderPipeline,
    170                                          bool shader_is_opaque,
    171                                          SkArenaAlloc*);
    172 
    173 #endif
    174