blob: b8724c281aa8fee9b8a753984e227fffddb4cc8b [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**
reed@google.com981d4792011-03-09 12:55:47 +00005** 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
reed@android.com8a1c16f2008-12-17 15:59:43 +00008**
reed@google.com981d4792011-03-09 12:55:47 +00009** http://www.apache.org/licenses/LICENSE-2.0
reed@android.com8a1c16f2008-12-17 15:59:43 +000010**
reed@google.com981d4792011-03-09 12:55:47 +000011** 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
reed@android.com8a1c16f2008-12-17 15:59:43 +000015** 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:
reed@google.comee467ee2011-03-09 13:23:57 +0000104 SkColor fColor;
105 SkPMColor fPMColor;
senorblanco@chromium.org29e50542010-12-16 19:07:45 +0000106 SkBlitRow::ColorProc fColor32Proc;
reed@google.com981d4792011-03-09 12:55:47 +0000107 SkBlitMask::Proc fBlitMaskProc;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000108
109private:
110 unsigned fSrcA, fSrcR, fSrcG, fSrcB;
111
112 // illegal
113 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
114
115 typedef SkRasterBlitter INHERITED;
116};
117
reed@android.comdafaf7a2009-07-10 03:05:59 +0000118class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000119public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000120 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
121 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000122 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000123
reed@android.com8a1c16f2008-12-17 15:59:43 +0000124private:
125 typedef SkARGB32_Blitter INHERITED;
126};
127
reed@android.comdafaf7a2009-07-10 03:05:59 +0000128class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000129public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000130 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
131 : INHERITED(device, paint) {}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000132 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000133 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
reed@android.comb602b8e2009-07-10 15:58:53 +0000134
reed@android.com8a1c16f2008-12-17 15:59:43 +0000135private:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000136 typedef SkARGB32_Opaque_Blitter INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000137};
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);
144 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
145
146private:
reed@android.comc4cae852009-09-23 15:06:10 +0000147 SkXfermode* fXfermode;
148 SkPMColor* fBuffer;
149 SkBlitRow::Proc32 fProc32;
150 SkBlitRow::Proc32 fProc32Blend;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000151
152 // illegal
153 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
154
155 typedef SkShaderBlitter INHERITED;
156};
157
reed@android.com1fc4c602009-10-02 16:34:57 +0000158///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000159
160class SkA1_Blitter : public SkRasterBlitter {
161public:
162 SkA1_Blitter(const SkBitmap& device, const SkPaint& paint);
163 virtual void blitH(int x, int y, int width);
164
165private:
166 uint8_t fSrcA;
167
168 // illegal
169 SkA1_Blitter& operator=(const SkA1_Blitter&);
reed@google.com981d4792011-03-09 12:55:47 +0000170
reed@android.com8a1c16f2008-12-17 15:59:43 +0000171 typedef SkRasterBlitter INHERITED;
172};
173
reed@android.com1fc4c602009-10-02 16:34:57 +0000174///////////////////////////////////////////////////////////////////////////////
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:
reed@google.com981d4792011-03-09 12:55:47 +0000180
reed@android.com1fc4c602009-10-02 16:34:57 +0000181 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 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000188
189extern SkBlitter* SkBlitter_ChooseD4444(const SkBitmap& device,
190 const SkPaint& paint,
191 void* storage, size_t storageSize);
192
reed@android.com1fc4c602009-10-02 16:34:57 +0000193extern SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device,
194 const SkPaint& paint,
195 void* storage, size_t storageSize);
196
reed@android.com8a1c16f2008-12-17 15:59:43 +0000197#endif
198