1 /* libs/graphics/sgl/SkCoreBlitters.h 2 ** 3 ** Copyright 2006, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #ifndef SkCoreBlitters_DEFINED 19 #define SkCoreBlitters_DEFINED 20 21 #include "SkBlitter.h" 22 #include "SkBlitRow.h" 23 24 class SkRasterBlitter : public SkBlitter { 25 public: SkRasterBlitter(const SkBitmap & device)26 SkRasterBlitter(const SkBitmap& device) : fDevice(device) {} 27 28 protected: 29 const SkBitmap& fDevice; 30 31 private: 32 typedef SkBlitter INHERITED; 33 }; 34 35 class SkShaderBlitter : public SkRasterBlitter { 36 public: 37 SkShaderBlitter(const SkBitmap& device, const SkPaint& paint); 38 virtual ~SkShaderBlitter(); 39 40 protected: 41 uint32_t fShaderFlags; 42 SkShader* fShader; 43 44 private: 45 // illegal 46 SkShaderBlitter& operator=(const SkShaderBlitter&); 47 48 typedef SkRasterBlitter INHERITED; 49 }; 50 51 /////////////////////////////////////////////////////////////////////////////// 52 53 class SkA8_Blitter : public SkRasterBlitter { 54 public: 55 SkA8_Blitter(const SkBitmap& device, const SkPaint& paint); 56 virtual void blitH(int x, int y, int width); 57 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 58 virtual void blitV(int x, int y, int height, SkAlpha alpha); 59 virtual void blitRect(int x, int y, int width, int height); 60 virtual void blitMask(const SkMask&, const SkIRect&); 61 virtual const SkBitmap* justAnOpaqueColor(uint32_t*); 62 63 private: 64 unsigned fSrcA; 65 66 // illegal 67 SkA8_Blitter& operator=(const SkA8_Blitter&); 68 69 typedef SkRasterBlitter INHERITED; 70 }; 71 72 class SkA8_Shader_Blitter : public SkShaderBlitter { 73 public: 74 SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); 75 virtual ~SkA8_Shader_Blitter(); 76 virtual void blitH(int x, int y, int width); 77 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 78 virtual void blitMask(const SkMask&, const SkIRect&); 79 80 private: 81 SkXfermode* fXfermode; 82 SkPMColor* fBuffer; 83 uint8_t* fAAExpand; 84 85 // illegal 86 SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&); 87 88 typedef SkShaderBlitter INHERITED; 89 }; 90 91 //////////////////////////////////////////////////////////////// 92 93 class SkARGB32_Blitter : public SkRasterBlitter { 94 public: 95 SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint); 96 virtual void blitH(int x, int y, int width); 97 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 98 virtual void blitV(int x, int y, int height, SkAlpha alpha); 99 virtual void blitRect(int x, int y, int width, int height); 100 virtual void blitMask(const SkMask&, const SkIRect&); 101 virtual const SkBitmap* justAnOpaqueColor(uint32_t*); 102 103 protected: 104 SkColor fColor; 105 SkPMColor fPMColor; 106 SkBlitRow::ColorProc fColor32Proc; 107 SkBlitMask::Proc fBlitMaskProc; 108 109 private: 110 unsigned fSrcA, fSrcR, fSrcG, fSrcB; 111 112 // illegal 113 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&); 114 115 typedef SkRasterBlitter INHERITED; 116 }; 117 118 class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter { 119 public: SkARGB32_Opaque_Blitter(const SkBitmap & device,const SkPaint & paint)120 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint) 121 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); } 122 virtual void blitMask(const SkMask&, const SkIRect&); 123 124 private: 125 typedef SkARGB32_Blitter INHERITED; 126 }; 127 128 class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter { 129 public: SkARGB32_Black_Blitter(const SkBitmap & device,const SkPaint & paint)130 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint) 131 : INHERITED(device, paint) {} 132 virtual void blitMask(const SkMask&, const SkIRect&); 133 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 134 135 private: 136 typedef SkARGB32_Opaque_Blitter INHERITED; 137 }; 138 139 class SkARGB32_Shader_Blitter : public SkShaderBlitter { 140 public: 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); 144 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 145 146 private: 147 SkXfermode* fXfermode; 148 SkPMColor* fBuffer; 149 SkBlitRow::Proc32 fProc32; 150 SkBlitRow::Proc32 fProc32Blend; 151 152 // illegal 153 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&); 154 155 typedef SkShaderBlitter INHERITED; 156 }; 157 158 /////////////////////////////////////////////////////////////////////////////// 159 160 class SkA1_Blitter : public SkRasterBlitter { 161 public: 162 SkA1_Blitter(const SkBitmap& device, const SkPaint& paint); 163 virtual void blitH(int x, int y, int width); 164 165 private: 166 uint8_t fSrcA; 167 168 // illegal 169 SkA1_Blitter& operator=(const SkA1_Blitter&); 170 171 typedef SkRasterBlitter INHERITED; 172 }; 173 174 /////////////////////////////////////////////////////////////////////////////// 175 176 /* These return the correct subclass of blitter for their device config. 177 178 Currently, they make the following assumptions about the state of the 179 paint: 180 181 1. If there is an xfermode, there will also be a shader 182 2. If there is a colorfilter, there will be a shader that itself handles 183 calling the filter, so the blitter can always ignore the colorfilter obj 184 185 These pre-conditions must be handled by the caller, in our case 186 SkBlitter::Choose(...) 187 */ 188 189 extern SkBlitter* SkBlitter_ChooseD4444(const SkBitmap& device, 190 const SkPaint& paint, 191 void* storage, size_t storageSize); 192 193 extern SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, 194 const SkPaint& paint, 195 void* storage, size_t storageSize); 196 197 #endif 198 199