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
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    uint32_t    fShaderFlags;
42    SkShader*   fShader;
43
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
115class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
116public:
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
121private:
122    typedef SkARGB32_Blitter INHERITED;
123};
124
125class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
126public:
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
132private:
133    typedef SkARGB32_Opaque_Blitter INHERITED;
134};
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    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
157class SkA1_Blitter : public SkRasterBlitter {
158public:
159    SkA1_Blitter(const SkBitmap& device, const SkPaint& paint);
160    virtual void blitH(int x, int y, int width);
161
162private:
163    uint8_t fSrcA;
164
165    // illegal
166    SkA1_Blitter& operator=(const SkA1_Blitter&);
167
168    typedef SkRasterBlitter INHERITED;
169};
170
171///////////////////////////////////////////////////////////////////////////////
172
173/*  These return the correct subclass of blitter for their device config.
174
175    Currently, they make the following assumptions about the state of the
176    paint:
177
178    1. If there is an xfermode, there will also be a shader
179    2. If there is a colorfilter, there will be a shader that itself handles
180       calling the filter, so the blitter can always ignore the colorfilter obj
181
182    These pre-conditions must be handled by the caller, in our case
183    SkBlitter::Choose(...)
184 */
185
186extern SkBlitter* SkBlitter_ChooseD4444(const SkBitmap& device,
187                                        const SkPaint& paint,
188                                        void* storage, size_t storageSize);
189
190extern SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device,
191                                       const SkPaint& paint,
192                                       void* storage, size_t storageSize);
193
194#endif
195
196