blob: 7da7cad967092b9bcc56c86202b438d70167a11a [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/* 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
24class SkRasterBlitter : public SkBlitter {
25public:
26 SkRasterBlitter(const SkBitmap& device) : fDevice(device) {}
27
28protected:
29 const SkBitmap& fDevice;
30
31private:
32 typedef SkBlitter INHERITED;
33};
34
35class SkShaderBlitter : public SkRasterBlitter {
36public:
37 SkShaderBlitter(const SkBitmap& device, const SkPaint& paint);
38 virtual ~SkShaderBlitter();
39
40protected:
reed@android.com5119bdb2009-06-12 21:27:03 +000041 uint32_t fShaderFlags;
42 SkShader* fShader;
reed@android.com8a1c16f2008-12-17 15:59:43 +000043
44private:
45 // illegal
46 SkShaderBlitter& operator=(const SkShaderBlitter&);
47
48 typedef SkRasterBlitter INHERITED;
49};
50
51///////////////////////////////////////////////////////////////////////////////
52
53class SkA8_Blitter : public SkRasterBlitter {
54public:
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
63private:
64 unsigned fSrcA;
65
66 // illegal
67 SkA8_Blitter& operator=(const SkA8_Blitter&);
68
69 typedef SkRasterBlitter INHERITED;
70};
71
72class SkA8_Shader_Blitter : public SkShaderBlitter {
73public:
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
80private:
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
93class SkARGB32_Blitter : public SkRasterBlitter {
94public:
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
103protected:
104 SkColor fPMColor;
105
106private:
107 unsigned fSrcA, fSrcR, fSrcG, fSrcB;
108
109 // illegal
110 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
111
112 typedef SkRasterBlitter INHERITED;
113};
114
reed@android.comdafaf7a2009-07-10 03:05:59 +0000115class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000116public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000117 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
118 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000119 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000120
reed@android.com8a1c16f2008-12-17 15:59:43 +0000121private:
122 typedef SkARGB32_Blitter INHERITED;
123};
124
reed@android.comdafaf7a2009-07-10 03:05:59 +0000125class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000126public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000127 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
128 : INHERITED(device, paint) {}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000129 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000130 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
131
reed@android.com8a1c16f2008-12-17 15:59:43 +0000132private:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000133 typedef SkARGB32_Opaque_Blitter INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000134};
135
136class SkARGB32_Shader_Blitter : public SkShaderBlitter {
137public:
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
143private:
144 SkXfermode* fXfermode;
145 SkPMColor* fBuffer;
146
147 // illegal
148 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
149
150 typedef SkShaderBlitter INHERITED;
151};
152
153////////////////////////////////////////////////////////////////
154
155class SkRGB16_Blitter : public SkRasterBlitter {
156public:
157 SkRGB16_Blitter(const SkBitmap& device, const SkPaint& paint);
158 virtual void blitH(int x, int y, int width);
159 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
160 virtual void blitV(int x, int y, int height, SkAlpha alpha);
161 virtual void blitRect(int x, int y, int width, int height);
162 virtual void blitMask(const SkMask&, const SkIRect&);
163 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
164
reed@android.com9a74d312009-06-15 15:56:35 +0000165protected:
reed@android.com8a1c16f2008-12-17 15:59:43 +0000166 SkPMColor fSrcColor32;
167 unsigned fScale;
168 uint16_t fColor16; // already scaled by fScale
169 uint16_t fRawColor16; // unscaled
170 uint16_t fRawDither16; // unscaled
171 SkBool8 fDoDither;
172
173 // illegal
174 SkRGB16_Blitter& operator=(const SkRGB16_Blitter&);
175
176 typedef SkRasterBlitter INHERITED;
177};
178
reed@android.com9a74d312009-06-15 15:56:35 +0000179class SkRGB16_Opaque_Blitter : public SkRGB16_Blitter {
180public:
181 SkRGB16_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint);
182 virtual void blitH(int x, int y, int width);
183 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
184 virtual void blitRect(int x, int y, int width, int height);
185 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.com31d1c642009-06-15 18:45:19 +0000186
187private:
reed@android.com9a74d312009-06-15 15:56:35 +0000188 typedef SkRGB16_Blitter INHERITED;
189};
190
reed@android.comdafaf7a2009-07-10 03:05:59 +0000191class SkRGB16_Black_Blitter : public SkRGB16_Opaque_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000192public:
193 SkRGB16_Black_Blitter(const SkBitmap& device, const SkPaint& paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000194 virtual void blitMask(const SkMask&, const SkIRect&);
195 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
196
197private:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000198 typedef SkRGB16_Opaque_Blitter INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000199};
200
201class SkRGB16_Shader_Blitter : public SkShaderBlitter {
202public:
203 SkRGB16_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
204 virtual ~SkRGB16_Shader_Blitter();
205 virtual void blitH(int x, int y, int width);
206 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
reed@android.com5119bdb2009-06-12 21:27:03 +0000207 virtual void blitRect(int x, int y, int width, int height);
208
reed@android.com8a1c16f2008-12-17 15:59:43 +0000209protected:
210 SkPMColor* fBuffer;
211 SkBlitRow::Proc fOpaqueProc;
212 SkBlitRow::Proc fAlphaProc;
213
214private:
215 // illegal
216 SkRGB16_Shader_Blitter& operator=(const SkRGB16_Shader_Blitter&);
217
218 typedef SkShaderBlitter INHERITED;
219};
220
221// used only if the shader can perform shadSpan16
222class SkRGB16_Shader16_Blitter : public SkRGB16_Shader_Blitter {
223public:
224 SkRGB16_Shader16_Blitter(const SkBitmap& device, const SkPaint& paint);
225 virtual void blitH(int x, int y, int width);
226 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000227 virtual void blitRect(int x, int y, int width, int height);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000228
229private:
230 typedef SkRGB16_Shader_Blitter INHERITED;
231};
232
233class SkRGB16_Shader_Xfermode_Blitter : public SkShaderBlitter {
234public:
235 SkRGB16_Shader_Xfermode_Blitter(const SkBitmap& device, const SkPaint& paint);
236 virtual ~SkRGB16_Shader_Xfermode_Blitter();
237 virtual void blitH(int x, int y, int width);
238 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
239
240private:
241 SkXfermode* fXfermode;
242 SkPMColor* fBuffer;
243 uint8_t* fAAExpand;
244
245 // illegal
246 SkRGB16_Shader_Xfermode_Blitter& operator=(const SkRGB16_Shader_Xfermode_Blitter&);
247
248 typedef SkShaderBlitter INHERITED;
249};
250
251/////////////////////////////////////////////////////////////////////////////
252
253class SkA1_Blitter : public SkRasterBlitter {
254public:
255 SkA1_Blitter(const SkBitmap& device, const SkPaint& paint);
256 virtual void blitH(int x, int y, int width);
257
258private:
259 uint8_t fSrcA;
260
261 // illegal
262 SkA1_Blitter& operator=(const SkA1_Blitter&);
263
264 typedef SkRasterBlitter INHERITED;
265};
266
267
268extern SkBlitter* SkBlitter_ChooseD4444(const SkBitmap& device,
269 const SkPaint& paint,
270 void* storage, size_t storageSize);
271
272#endif
273