• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 fPMColor;
105 
106 private:
107     unsigned fSrcA, fSrcR, fSrcG, fSrcB;
108 
109     // illegal
110     SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
111 
112     typedef SkRasterBlitter INHERITED;
113 };
114 
115 class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
116 public:
SkARGB32_Opaque_Blitter(const SkBitmap & device,const SkPaint & paint)117     SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
118         : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
119     virtual void blitMask(const SkMask&, const SkIRect&);
120 
121 private:
122     typedef SkARGB32_Blitter INHERITED;
123 };
124 
125 class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
126 public:
SkARGB32_Black_Blitter(const SkBitmap & device,const SkPaint & paint)127     SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
128         : INHERITED(device, paint) {}
129     virtual void blitMask(const SkMask&, const SkIRect&);
130     virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
131 
132 private:
133     typedef SkARGB32_Opaque_Blitter INHERITED;
134 };
135 
136 class SkARGB32_Shader_Blitter : public SkShaderBlitter {
137 public:
138     SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
139     virtual ~SkARGB32_Shader_Blitter();
140     virtual void blitH(int x, int y, int width);
141     virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
142 
143 private:
144     SkXfermode*         fXfermode;
145     SkPMColor*          fBuffer;
146     SkBlitRow::Proc32   fProc32;
147     SkBlitRow::Proc32   fProc32Blend;
148 
149     // illegal
150     SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
151 
152     typedef SkShaderBlitter INHERITED;
153 };
154 
155 ////////////////////////////////////////////////////////////////
156 
157 class SkRGB16_Blitter : public SkRasterBlitter {
158 public:
159     SkRGB16_Blitter(const SkBitmap& device, const SkPaint& paint);
160     virtual void blitH(int x, int y, int width);
161     virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
162     virtual void blitV(int x, int y, int height, SkAlpha alpha);
163     virtual void blitRect(int x, int y, int width, int height);
164     virtual void blitMask(const SkMask&, const SkIRect&);
165     virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
166 
167 protected:
168     SkPMColor   fSrcColor32;
169     unsigned    fScale;
170     uint16_t    fColor16;       // already scaled by fScale
171     uint16_t    fRawColor16;    // unscaled
172     uint16_t    fRawDither16;   // unscaled
173     SkBool8     fDoDither;
174 
175     // illegal
176     SkRGB16_Blitter& operator=(const SkRGB16_Blitter&);
177 
178     typedef SkRasterBlitter INHERITED;
179 };
180 
181 class SkRGB16_Opaque_Blitter : public SkRGB16_Blitter {
182 public:
183     SkRGB16_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint);
184     virtual void blitH(int x, int y, int width);
185     virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
186     virtual void blitRect(int x, int y, int width, int height);
187     virtual void blitMask(const SkMask&, const SkIRect&);
188 
189 private:
190     typedef SkRGB16_Blitter INHERITED;
191 };
192 
193 class SkRGB16_Black_Blitter : public SkRGB16_Opaque_Blitter {
194 public:
195     SkRGB16_Black_Blitter(const SkBitmap& device, const SkPaint& paint);
196     virtual void blitMask(const SkMask&, const SkIRect&);
197     virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
198 
199 private:
200     typedef SkRGB16_Opaque_Blitter INHERITED;
201 };
202 
203 class SkRGB16_Shader_Blitter : public SkShaderBlitter {
204 public:
205     SkRGB16_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
206     virtual ~SkRGB16_Shader_Blitter();
207     virtual void blitH(int x, int y, int width);
208     virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
209     virtual void blitRect(int x, int y, int width, int height);
210 
211 protected:
212     SkPMColor*      fBuffer;
213     SkBlitRow::Proc fOpaqueProc;
214     SkBlitRow::Proc fAlphaProc;
215 
216 private:
217     // illegal
218     SkRGB16_Shader_Blitter& operator=(const SkRGB16_Shader_Blitter&);
219 
220     typedef SkShaderBlitter INHERITED;
221 };
222 
223 // used only if the shader can perform shadSpan16
224 class SkRGB16_Shader16_Blitter : public SkRGB16_Shader_Blitter {
225 public:
226     SkRGB16_Shader16_Blitter(const SkBitmap& device, const SkPaint& paint);
227     virtual void blitH(int x, int y, int width);
228     virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
229     virtual void blitRect(int x, int y, int width, int height);
230 
231 private:
232     typedef SkRGB16_Shader_Blitter INHERITED;
233 };
234 
235 class SkRGB16_Shader_Xfermode_Blitter : public SkShaderBlitter {
236 public:
237     SkRGB16_Shader_Xfermode_Blitter(const SkBitmap& device, const SkPaint& paint);
238     virtual ~SkRGB16_Shader_Xfermode_Blitter();
239     virtual void blitH(int x, int y, int width);
240     virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
241 
242 private:
243     SkXfermode* fXfermode;
244     SkPMColor*  fBuffer;
245     uint8_t*    fAAExpand;
246 
247     // illegal
248     SkRGB16_Shader_Xfermode_Blitter& operator=(const SkRGB16_Shader_Xfermode_Blitter&);
249 
250     typedef SkShaderBlitter INHERITED;
251 };
252 
253 /////////////////////////////////////////////////////////////////////////////
254 
255 class SkA1_Blitter : public SkRasterBlitter {
256 public:
257     SkA1_Blitter(const SkBitmap& device, const SkPaint& paint);
258     virtual void blitH(int x, int y, int width);
259 
260 private:
261     uint8_t fSrcA;
262 
263     // illegal
264     SkA1_Blitter& operator=(const SkA1_Blitter&);
265 
266     typedef SkRasterBlitter INHERITED;
267 };
268 
269 
270 extern SkBlitter* SkBlitter_ChooseD4444(const SkBitmap& device,
271                                         const SkPaint& paint,
272                                         void* storage, size_t storageSize);
273 
274 #endif
275 
276