SkCoreBlitters.h revision 126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34
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 "SkBlitter.h" 12#include "SkBlitRow.h" 13 14class SkRasterBlitter : public SkBlitter { 15public: 16 SkRasterBlitter(const SkBitmap& device) : fDevice(device) {} 17 18protected: 19 const SkBitmap& fDevice; 20 21private: 22 typedef SkBlitter INHERITED; 23}; 24 25class SkShaderBlitter : public SkRasterBlitter { 26public: 27 SkShaderBlitter(const SkBitmap& device, const SkPaint& paint); 28 virtual ~SkShaderBlitter(); 29 30protected: 31 uint32_t fShaderFlags; 32 SkShader* fShader; 33 34private: 35 // illegal 36 SkShaderBlitter& operator=(const SkShaderBlitter&); 37 38 typedef SkRasterBlitter INHERITED; 39}; 40 41/////////////////////////////////////////////////////////////////////////////// 42 43class SkA8_Coverage_Blitter : public SkRasterBlitter { 44public: 45 SkA8_Coverage_Blitter(const SkBitmap& device, const SkPaint& paint); 46 virtual void blitH(int x, int y, int width) SK_OVERRIDE; 47 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) SK_OVERRIDE; 48 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; 49 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; 50 virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE; 51 virtual const SkBitmap* justAnOpaqueColor(uint32_t*) SK_OVERRIDE; 52}; 53 54class SkA8_Blitter : public SkRasterBlitter { 55public: 56 SkA8_Blitter(const SkBitmap& device, const SkPaint& paint); 57 virtual void blitH(int x, int y, int width); 58 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 59 virtual void blitV(int x, int y, int height, SkAlpha alpha); 60 virtual void blitRect(int x, int y, int width, int height); 61 virtual void blitMask(const SkMask&, const SkIRect&); 62 virtual const SkBitmap* justAnOpaqueColor(uint32_t*); 63 64private: 65 unsigned fSrcA; 66 67 // illegal 68 SkA8_Blitter& operator=(const SkA8_Blitter&); 69 70 typedef SkRasterBlitter INHERITED; 71}; 72 73class SkA8_Shader_Blitter : public SkShaderBlitter { 74public: 75 SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); 76 virtual ~SkA8_Shader_Blitter(); 77 virtual void blitH(int x, int y, int width); 78 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 79 virtual void blitMask(const SkMask&, const SkIRect&); 80 81private: 82 SkXfermode* fXfermode; 83 SkPMColor* fBuffer; 84 uint8_t* fAAExpand; 85 86 // illegal 87 SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&); 88 89 typedef SkShaderBlitter INHERITED; 90}; 91 92//////////////////////////////////////////////////////////////// 93 94class SkARGB32_Blitter : public SkRasterBlitter { 95public: 96 SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint); 97 virtual void blitH(int x, int y, int width); 98 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 99 virtual void blitV(int x, int y, int height, SkAlpha alpha); 100 virtual void blitRect(int x, int y, int width, int height); 101 virtual void blitMask(const SkMask&, const SkIRect&); 102 virtual const SkBitmap* justAnOpaqueColor(uint32_t*); 103 104protected: 105 SkColor fColor; 106 SkPMColor fPMColor; 107 SkBlitRow::ColorProc fColor32Proc; 108 SkBlitRow::ColorRectProc fColorRect32Proc; 109 110private: 111 unsigned fSrcA, fSrcR, fSrcG, fSrcB; 112 113 // illegal 114 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&); 115 116 typedef SkRasterBlitter INHERITED; 117}; 118 119class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter { 120public: 121 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint) 122 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); } 123 virtual void blitMask(const SkMask&, const SkIRect&); 124 125private: 126 typedef SkARGB32_Blitter INHERITED; 127}; 128 129class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter { 130public: 131 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint) 132 : INHERITED(device, paint) {} 133 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 134 135private: 136 typedef SkARGB32_Opaque_Blitter INHERITED; 137}; 138 139class SkARGB32_Shader_Blitter : public SkShaderBlitter { 140public: 141 SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); 142 virtual ~SkARGB32_Shader_Blitter(); 143 virtual void blitH(int x, int y, int width) SK_OVERRIDE; 144 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; 145 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; 146 virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) SK_OVERRIDE; 147 virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE; 148 149private: 150 SkXfermode* fXfermode; 151 SkPMColor* fBuffer; 152 SkBlitRow::Proc32 fProc32; 153 SkBlitRow::Proc32 fProc32Blend; 154 bool fShadeDirectlyIntoDevice; 155 bool fConstInY; 156 157 // illegal 158 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&); 159 160 typedef SkShaderBlitter INHERITED; 161}; 162 163/////////////////////////////////////////////////////////////////////////////// 164 165class SkA1_Blitter : public SkRasterBlitter { 166public: 167 SkA1_Blitter(const SkBitmap& device, const SkPaint& paint); 168 virtual void blitH(int x, int y, int width) SK_OVERRIDE; 169 170private: 171 uint8_t fSrcA; 172 173 // illegal 174 SkA1_Blitter& operator=(const SkA1_Blitter&); 175 176 typedef SkRasterBlitter INHERITED; 177}; 178 179/////////////////////////////////////////////////////////////////////////////// 180 181/* These return the correct subclass of blitter for their device config. 182 183 Currently, they make the following assumptions about the state of the 184 paint: 185 186 1. If there is an xfermode, there will also be a shader 187 2. If there is a colorfilter, there will be a shader that itself handles 188 calling the filter, so the blitter can always ignore the colorfilter obj 189 190 These pre-conditions must be handled by the caller, in our case 191 SkBlitter::Choose(...) 192 */ 193 194extern SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, 195 const SkPaint& paint, 196 void* storage, size_t storageSize); 197 198#endif 199