OLD | NEW |
| (Empty) |
1 | |
2 /* | |
3 * Copyright 2006 The Android Open Source Project | |
4 * | |
5 * Use of this source code is governed by a BSD-style license that can be | |
6 * found in the LICENSE file. | |
7 */ | |
8 | |
9 | |
10 #include "SkFilterProc.h" | |
11 | |
12 class BILERP_BITMAP16_SHADER_CLASS : public HasSpan16_Sampler_BitmapShader { | |
13 public: | |
14 BILERP_BITMAP16_SHADER_CLASS(const SkBitmap& src) | |
15 : HasSpan16_Sampler_BitmapShader(src, true, | |
16 SkShader::kClamp_TileMode, | |
17 SkShader::kClamp_TileMode) | |
18 { | |
19 } | |
20 | |
21 virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) | |
22 { | |
23 SkASSERT(count > 0); | |
24 | |
25 U8CPU alpha = this->getPaintAlpha(); | |
26 | |
27 const SkMatrix& inv = this->getTotalInverse(); | |
28 const SkBitmap& srcBitmap = this->getSrcBitmap(); | |
29 unsigned srcMaxX = srcBitmap.width() - 1; | |
30 unsigned srcMaxY = srcBitmap.height() - 1; | |
31 unsigned srcRB = srcBitmap.rowBytes(); | |
32 | |
33 BILERP_BITMAP16_SHADER_PREAMBLE(srcBitmap); | |
34 | |
35 const SkFilterProc* proc_table = SkGetBilinearFilterProcTable(); | |
36 const BILERP_BITMAP16_SHADER_TYPE* srcPixels = (const BILERP_BITMAP16_SH
ADER_TYPE*)srcBitmap.getPixels(); | |
37 | |
38 if (this->getInverseClass() == kPerspective_MatrixClass) | |
39 { | |
40 SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
41 SkIntToScalar(y) + SK_ScalarHalf, count); | |
42 while ((count = iter.next()) != 0) | |
43 { | |
44 const SkFixed* srcXY = iter.getXY(); | |
45 while (--count >= 0) | |
46 { | |
47 SkFixed fx = *srcXY++ - SK_FixedHalf; | |
48 SkFixed fy = *srcXY++ - SK_FixedHalf; | |
49 int ix = fx >> 16; | |
50 int iy = fy >> 16; | |
51 int x = SkClampMax(ix, srcMaxX); | |
52 int y = SkClampMax(iy, srcMaxY); | |
53 | |
54 const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; | |
55 | |
56 p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const cha
r*)srcPixels + y * srcRB)) + x; | |
57 if ((unsigned)ix < srcMaxX) | |
58 p01 += 1; | |
59 p10 = p00; | |
60 p11 = p01; | |
61 if ((unsigned)iy < srcMaxY) | |
62 { | |
63 p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)
p10 + srcRB); | |
64 p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)
p11 + srcRB); | |
65 } | |
66 | |
67 SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx,
fy); | |
68 uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p00)), | |
69 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p01)), | |
70 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p10)), | |
71 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p11))); | |
72 | |
73 *dstC++ = expanded_rgb16_to_8888(c, alpha); | |
74 } | |
75 } | |
76 } | |
77 else // linear case | |
78 { | |
79 SkFixed fx, fy, dx, dy; | |
80 | |
81 // now init fx, fy, dx, dy | |
82 { | |
83 SkPoint srcPt; | |
84 this->getInverseMapPtProc()(inv, SkIntToScalar(x) + SK_ScalarHal
f, | |
85 SkIntToScalar(y) + SK_ScalarHal
f, &srcPt); | |
86 | |
87 fx = SkScalarToFixed(srcPt.fX) - SK_FixedHalf; | |
88 fy = SkScalarToFixed(srcPt.fY) - SK_FixedHalf; | |
89 | |
90 if (this->getInverseClass() == kFixedStepInX_MatrixClass) | |
91 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); | |
92 else | |
93 { | |
94 dx = SkScalarToFixed(inv.getScaleX()); | |
95 dy = SkScalarToFixed(inv.getSkewY()); | |
96 } | |
97 } | |
98 | |
99 do { | |
100 int ix = fx >> 16; | |
101 int iy = fy >> 16; | |
102 | |
103 const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; | |
104 | |
105 p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const char*)s
rcPixels + | |
106 SkClampMax(iy
, srcMaxY) * srcRB)) + | |
107 SkClampMax(ix
, srcMaxX); | |
108 if ((unsigned)ix < srcMaxX) | |
109 p01 += 1; | |
110 p10 = p00; | |
111 p11 = p01; | |
112 if ((unsigned)iy < srcMaxY) | |
113 { | |
114 p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p10
+ srcRB); | |
115 p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p11
+ srcRB); | |
116 } | |
117 | |
118 SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx, fy); | |
119 uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p00)), | |
120 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p01)), | |
121 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p10)), | |
122 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p11))); | |
123 *dstC++ = expanded_rgb16_to_8888(c, alpha); | |
124 | |
125 fx += dx; | |
126 fy += dy; | |
127 } while (--count != 0); | |
128 } | |
129 BILERP_BITMAP16_SHADER_POSTAMBLE(srcBitmap); | |
130 } | |
131 | |
132 virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) | |
133 { | |
134 SkASSERT(count > 0); | |
135 | |
136 const SkMatrix& inv = this->getTotalInverse(); | |
137 const SkBitmap& srcBitmap = this->getSrcBitmap(); | |
138 unsigned srcMaxX = srcBitmap.width() - 1; | |
139 unsigned srcMaxY = srcBitmap.height() - 1; | |
140 unsigned srcRB = srcBitmap.rowBytes(); | |
141 | |
142 BILERP_BITMAP16_SHADER_PREAMBLE(srcBitmap); | |
143 | |
144 const SkFilterProc* proc_table = SkGetBilinearFilterProcTable(); | |
145 const BILERP_BITMAP16_SHADER_TYPE* srcPixels = (const BILERP_BITMAP16_SH
ADER_TYPE*)srcBitmap.getPixels(); | |
146 | |
147 if (this->getInverseClass() == kPerspective_MatrixClass) | |
148 { | |
149 SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
150 SkIntToScalar(y) + SK_ScalarHalf, count); | |
151 while ((count = iter.next()) != 0) | |
152 { | |
153 const SkFixed* srcXY = iter.getXY(); | |
154 while (--count >= 0) | |
155 { | |
156 SkFixed fx = *srcXY++ - SK_FixedHalf; | |
157 SkFixed fy = *srcXY++ - SK_FixedHalf; | |
158 int ix = fx >> 16; | |
159 int iy = fy >> 16; | |
160 | |
161 const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; | |
162 | |
163 p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const cha
r*)srcPixels + | |
164 SkClampMax
(iy, srcMaxY) * srcRB)) + | |
165 SkClampMax
(ix, srcMaxX); | |
166 if ((unsigned)ix < srcMaxX) | |
167 p01 += 1; | |
168 p10 = p00; | |
169 p11 = p01; | |
170 if ((unsigned)iy < srcMaxY) | |
171 { | |
172 p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)
p10 + srcRB); | |
173 p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)
p11 + srcRB); | |
174 } | |
175 | |
176 SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx,
fy); | |
177 uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p00)), | |
178 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p01)), | |
179 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p10)), | |
180 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIX
EL(*p11))); | |
181 *dstC++ = SkCompact_rgb_16(c); | |
182 } | |
183 } | |
184 } | |
185 else // linear case | |
186 { | |
187 SkFixed fx, fy, dx, dy; | |
188 | |
189 // now init fx, fy, dx, dy | |
190 { | |
191 SkPoint srcPt; | |
192 this->getInverseMapPtProc()(inv, SkIntToScalar(x) + SK_ScalarHal
f, | |
193 SkIntToScalar(y) + SK_ScalarHal
f, &srcPt); | |
194 | |
195 fx = SkScalarToFixed(srcPt.fX) - SK_FixedHalf; | |
196 fy = SkScalarToFixed(srcPt.fY) - SK_FixedHalf; | |
197 | |
198 if (this->getInverseClass() == kFixedStepInX_MatrixClass) | |
199 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); | |
200 else | |
201 { | |
202 dx = SkScalarToFixed(inv.getScaleX()); | |
203 dy = SkScalarToFixed(inv.getSkewY()); | |
204 } | |
205 } | |
206 | |
207 do { | |
208 int ix = fx >> 16; | |
209 int iy = fy >> 16; | |
210 | |
211 const BILERP_BITMAP16_SHADER_TYPE *p00, *p01, *p10, *p11; | |
212 | |
213 p00 = p01 = ((const BILERP_BITMAP16_SHADER_TYPE*)((const char*)s
rcPixels + | |
214 SkClampMax(iy,
srcMaxY) * srcRB)) + | |
215 SkClampMax(ix,
srcMaxX); | |
216 if ((unsigned)ix < srcMaxX) | |
217 p01 += 1; | |
218 p10 = p00; | |
219 p11 = p01; | |
220 if ((unsigned)iy < srcMaxY) | |
221 { | |
222 p10 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p10
+ srcRB); | |
223 p11 = (const BILERP_BITMAP16_SHADER_TYPE*)((const char*)p11
+ srcRB); | |
224 } | |
225 | |
226 SkFilterProc proc = SkGetBilinearFilterProc(proc_table, fx, fy); | |
227 uint32_t c = proc(SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p00)), | |
228 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p01)), | |
229 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p10)), | |
230 SkExpand_rgb_16(BILERP_BITMAP16_SHADER_PIXEL(*
p11))); | |
231 *dstC++ = SkCompact_rgb_16(c); | |
232 | |
233 fx += dx; | |
234 fy += dy; | |
235 } while (--count != 0); | |
236 } | |
237 BILERP_BITMAP16_SHADER_POSTAMBLE(srcBitmap); | |
238 } | |
239 }; | |
240 | |
241 #undef BILERP_BITMAP16_SHADER_CLASS | |
242 #undef BILERP_BITMAP16_SHADER_TYPE | |
243 #undef BILERP_BITMAP16_SHADER_PREAMBLE | |
244 #undef BILERP_BITMAP16_SHADER_PIXEL | |
245 #undef BILERP_BITMAP16_SHADER_POSTAMBLE | |
OLD | NEW |