Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/core/SkBitmapShader16BilerpTemplate.h

Issue 225023028: Remove SkBitmapShaderTemplate. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/core/SkBitmapShaderTemplate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « no previous file | src/core/SkBitmapShaderTemplate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698