|
1 /* |
|
2 * Copyright 2006 The Android Open Source Project |
|
3 * |
|
4 * Use of this source code is governed by a BSD-style license that can be |
|
5 * found in the LICENSE file. |
|
6 */ |
|
7 |
|
8 #ifndef SkCoreBlitters_DEFINED |
|
9 #define SkCoreBlitters_DEFINED |
|
10 |
|
11 #include "SkBitmapProcShader.h" |
|
12 #include "SkBlitter.h" |
|
13 #include "SkBlitRow.h" |
|
14 #include "SkShader.h" |
|
15 #include "SkSmallAllocator.h" |
|
16 |
|
17 class SkRasterBlitter : public SkBlitter { |
|
18 public: |
|
19 SkRasterBlitter(const SkBitmap& device) : fDevice(device) {} |
|
20 |
|
21 protected: |
|
22 const SkBitmap& fDevice; |
|
23 |
|
24 private: |
|
25 typedef SkBlitter INHERITED; |
|
26 }; |
|
27 |
|
28 class SkShaderBlitter : public SkRasterBlitter { |
|
29 public: |
|
30 SkShaderBlitter(const SkBitmap& device, const SkPaint& paint); |
|
31 virtual ~SkShaderBlitter(); |
|
32 |
|
33 protected: |
|
34 uint32_t fShaderFlags; |
|
35 SkShader* fShader; |
|
36 |
|
37 private: |
|
38 // illegal |
|
39 SkShaderBlitter& operator=(const SkShaderBlitter&); |
|
40 |
|
41 typedef SkRasterBlitter INHERITED; |
|
42 }; |
|
43 |
|
44 /////////////////////////////////////////////////////////////////////////////// |
|
45 |
|
46 class SkA8_Coverage_Blitter : public SkRasterBlitter { |
|
47 public: |
|
48 SkA8_Coverage_Blitter(const SkBitmap& device, const SkPaint& paint); |
|
49 virtual void blitH(int x, int y, int width) SK_OVERRIDE; |
|
50 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) SK_OVERRIDE; |
|
51 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; |
|
52 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; |
|
53 virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE; |
|
54 virtual const SkBitmap* justAnOpaqueColor(uint32_t*) SK_OVERRIDE; |
|
55 }; |
|
56 |
|
57 class SkA8_Blitter : public SkRasterBlitter { |
|
58 public: |
|
59 SkA8_Blitter(const SkBitmap& device, const SkPaint& paint); |
|
60 virtual void blitH(int x, int y, int width); |
|
61 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); |
|
62 virtual void blitV(int x, int y, int height, SkAlpha alpha); |
|
63 virtual void blitRect(int x, int y, int width, int height); |
|
64 virtual void blitMask(const SkMask&, const SkIRect&); |
|
65 virtual const SkBitmap* justAnOpaqueColor(uint32_t*); |
|
66 |
|
67 private: |
|
68 unsigned fSrcA; |
|
69 |
|
70 // illegal |
|
71 SkA8_Blitter& operator=(const SkA8_Blitter&); |
|
72 |
|
73 typedef SkRasterBlitter INHERITED; |
|
74 }; |
|
75 |
|
76 class SkA8_Shader_Blitter : public SkShaderBlitter { |
|
77 public: |
|
78 SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); |
|
79 virtual ~SkA8_Shader_Blitter(); |
|
80 virtual void blitH(int x, int y, int width); |
|
81 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); |
|
82 virtual void blitMask(const SkMask&, const SkIRect&); |
|
83 |
|
84 private: |
|
85 SkXfermode* fXfermode; |
|
86 SkPMColor* fBuffer; |
|
87 uint8_t* fAAExpand; |
|
88 |
|
89 // illegal |
|
90 SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&); |
|
91 |
|
92 typedef SkShaderBlitter INHERITED; |
|
93 }; |
|
94 |
|
95 //////////////////////////////////////////////////////////////// |
|
96 |
|
97 class SkARGB32_Blitter : public SkRasterBlitter { |
|
98 public: |
|
99 SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint); |
|
100 virtual void blitH(int x, int y, int width); |
|
101 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); |
|
102 virtual void blitV(int x, int y, int height, SkAlpha alpha); |
|
103 virtual void blitRect(int x, int y, int width, int height); |
|
104 virtual void blitMask(const SkMask&, const SkIRect&); |
|
105 virtual const SkBitmap* justAnOpaqueColor(uint32_t*); |
|
106 |
|
107 protected: |
|
108 SkColor fColor; |
|
109 SkPMColor fPMColor; |
|
110 SkBlitRow::ColorProc fColor32Proc; |
|
111 SkBlitRow::ColorRectProc fColorRect32Proc; |
|
112 |
|
113 private: |
|
114 unsigned fSrcA, fSrcR, fSrcG, fSrcB; |
|
115 |
|
116 // illegal |
|
117 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&); |
|
118 |
|
119 typedef SkRasterBlitter INHERITED; |
|
120 }; |
|
121 |
|
122 class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter { |
|
123 public: |
|
124 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint) |
|
125 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); } |
|
126 virtual void blitMask(const SkMask&, const SkIRect&); |
|
127 |
|
128 private: |
|
129 typedef SkARGB32_Blitter INHERITED; |
|
130 }; |
|
131 |
|
132 class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter { |
|
133 public: |
|
134 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint) |
|
135 : INHERITED(device, paint) {} |
|
136 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); |
|
137 |
|
138 private: |
|
139 typedef SkARGB32_Opaque_Blitter INHERITED; |
|
140 }; |
|
141 |
|
142 class SkARGB32_Shader_Blitter : public SkShaderBlitter { |
|
143 public: |
|
144 SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); |
|
145 virtual ~SkARGB32_Shader_Blitter(); |
|
146 virtual void blitH(int x, int y, int width) SK_OVERRIDE; |
|
147 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; |
|
148 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; |
|
149 virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) SK_OVERRIDE; |
|
150 virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE; |
|
151 |
|
152 private: |
|
153 SkXfermode* fXfermode; |
|
154 SkPMColor* fBuffer; |
|
155 SkBlitRow::Proc32 fProc32; |
|
156 SkBlitRow::Proc32 fProc32Blend; |
|
157 bool fShadeDirectlyIntoDevice; |
|
158 bool fConstInY; |
|
159 |
|
160 // illegal |
|
161 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&); |
|
162 |
|
163 typedef SkShaderBlitter INHERITED; |
|
164 }; |
|
165 |
|
166 /////////////////////////////////////////////////////////////////////////////// |
|
167 |
|
168 /* These return the correct subclass of blitter for their device config. |
|
169 |
|
170 Currently, they make the following assumptions about the state of the |
|
171 paint: |
|
172 |
|
173 1. If there is an xfermode, there will also be a shader |
|
174 2. If there is a colorfilter, there will be a shader that itself handles |
|
175 calling the filter, so the blitter can always ignore the colorfilter obj |
|
176 |
|
177 These pre-conditions must be handled by the caller, in our case |
|
178 SkBlitter::Choose(...) |
|
179 */ |
|
180 |
|
181 SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint, |
|
182 SkTBlitterAllocator* allocator); |
|
183 |
|
184 #endif |