• 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                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