blob: 5b3497e089726932c44721fb573b2b112ac7afac [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:
41 SkShader* fShader;
42
43private:
44 // illegal
45 SkShaderBlitter& operator=(const SkShaderBlitter&);
46
47 typedef SkRasterBlitter INHERITED;
48};
49
50///////////////////////////////////////////////////////////////////////////////
51
52class SkA8_Blitter : public SkRasterBlitter {
53public:
54 SkA8_Blitter(const SkBitmap& device, const SkPaint& paint);
55 virtual void blitH(int x, int y, int width);
56 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
57 virtual void blitV(int x, int y, int height, SkAlpha alpha);
58 virtual void blitRect(int x, int y, int width, int height);
59 virtual void blitMask(const SkMask&, const SkIRect&);
60 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
61
62private:
63 unsigned fSrcA;
64
65 // illegal
66 SkA8_Blitter& operator=(const SkA8_Blitter&);
67
68 typedef SkRasterBlitter INHERITED;
69};
70
71class SkA8_Shader_Blitter : public SkShaderBlitter {
72public:
73 SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
74 virtual ~SkA8_Shader_Blitter();
75 virtual void blitH(int x, int y, int width);
76 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
77 virtual void blitMask(const SkMask&, const SkIRect&);
78
79private:
80 SkXfermode* fXfermode;
81 SkPMColor* fBuffer;
82 uint8_t* fAAExpand;
83
84 // illegal
85 SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
86
87 typedef SkShaderBlitter INHERITED;
88};
89
90////////////////////////////////////////////////////////////////
91
92class SkARGB32_Blitter : public SkRasterBlitter {
93public:
94 SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint);
95 virtual void blitH(int x, int y, int width);
96 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
97 virtual void blitV(int x, int y, int height, SkAlpha alpha);
98 virtual void blitRect(int x, int y, int width, int height);
99 virtual void blitMask(const SkMask&, const SkIRect&);
100 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
101
102protected:
103 SkColor fPMColor;
104
105private:
106 unsigned fSrcA, fSrcR, fSrcG, fSrcB;
107
108 // illegal
109 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
110
111 typedef SkRasterBlitter INHERITED;
112};
113
114class SkARGB32_Black_Blitter : public SkARGB32_Blitter {
115public:
116 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
117 : SkARGB32_Blitter(device, paint) {}
118 virtual void blitMask(const SkMask&, const SkIRect&);
119 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
120
121private:
122 typedef SkARGB32_Blitter INHERITED;
123};
124
125class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
126public:
127 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
128 : SkARGB32_Blitter(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
129 virtual void blitMask(const SkMask&, const SkIRect&);
130
131private:
132 typedef SkARGB32_Blitter INHERITED;
133};
134
135class SkARGB32_Shader_Blitter : public SkShaderBlitter {
136public:
137 SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
138 virtual ~SkARGB32_Shader_Blitter();
139 virtual void blitH(int x, int y, int width);
140 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
141
142private:
143 SkXfermode* fXfermode;
144 SkPMColor* fBuffer;
145
146 // illegal
147 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
148
149 typedef SkShaderBlitter INHERITED;
150};
151
152////////////////////////////////////////////////////////////////
153
154class SkRGB16_Blitter : public SkRasterBlitter {
155public:
156 SkRGB16_Blitter(const SkBitmap& device, const SkPaint& paint);
157 virtual void blitH(int x, int y, int width);
158 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
159 virtual void blitV(int x, int y, int height, SkAlpha alpha);
160 virtual void blitRect(int x, int y, int width, int height);
161 virtual void blitMask(const SkMask&, const SkIRect&);
162 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
163
164private:
165 SkPMColor fSrcColor32;
166 unsigned fScale;
167 uint16_t fColor16; // already scaled by fScale
168 uint16_t fRawColor16; // unscaled
169 uint16_t fRawDither16; // unscaled
170 SkBool8 fDoDither;
171
172 // illegal
173 SkRGB16_Blitter& operator=(const SkRGB16_Blitter&);
174
175 typedef SkRasterBlitter INHERITED;
176};
177
178class SkRGB16_Black_Blitter : public SkRGB16_Blitter {
179public:
180 SkRGB16_Black_Blitter(const SkBitmap& device, const SkPaint& paint);
181
182 virtual void blitMask(const SkMask&, const SkIRect&);
183 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
184
185private:
186 typedef SkRGB16_Blitter INHERITED;
187};
188
189class SkRGB16_Shader_Blitter : public SkShaderBlitter {
190public:
191 SkRGB16_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
192 virtual ~SkRGB16_Shader_Blitter();
193 virtual void blitH(int x, int y, int width);
194 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
195
196protected:
197 SkPMColor* fBuffer;
198 SkBlitRow::Proc fOpaqueProc;
199 SkBlitRow::Proc fAlphaProc;
200
201private:
202 // illegal
203 SkRGB16_Shader_Blitter& operator=(const SkRGB16_Shader_Blitter&);
204
205 typedef SkShaderBlitter INHERITED;
206};
207
208// used only if the shader can perform shadSpan16
209class SkRGB16_Shader16_Blitter : public SkRGB16_Shader_Blitter {
210public:
211 SkRGB16_Shader16_Blitter(const SkBitmap& device, const SkPaint& paint);
212 virtual void blitH(int x, int y, int width);
213 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
214
215private:
216 typedef SkRGB16_Shader_Blitter INHERITED;
217};
218
219class SkRGB16_Shader_Xfermode_Blitter : public SkShaderBlitter {
220public:
221 SkRGB16_Shader_Xfermode_Blitter(const SkBitmap& device, const SkPaint& paint);
222 virtual ~SkRGB16_Shader_Xfermode_Blitter();
223 virtual void blitH(int x, int y, int width);
224 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
225
226private:
227 SkXfermode* fXfermode;
228 SkPMColor* fBuffer;
229 uint8_t* fAAExpand;
230
231 // illegal
232 SkRGB16_Shader_Xfermode_Blitter& operator=(const SkRGB16_Shader_Xfermode_Blitter&);
233
234 typedef SkShaderBlitter INHERITED;
235};
236
237/////////////////////////////////////////////////////////////////////////////
238
239class SkA1_Blitter : public SkRasterBlitter {
240public:
241 SkA1_Blitter(const SkBitmap& device, const SkPaint& paint);
242 virtual void blitH(int x, int y, int width);
243
244private:
245 uint8_t fSrcA;
246
247 // illegal
248 SkA1_Blitter& operator=(const SkA1_Blitter&);
249
250 typedef SkRasterBlitter INHERITED;
251};
252
253
254extern SkBlitter* SkBlitter_ChooseD4444(const SkBitmap& device,
255 const SkPaint& paint,
256 void* storage, size_t storageSize);
257
258#endif
259