2
class ARGB32_Clamp_Bilinear_BitmapShader : public SkBitmapShader {
4
ARGB32_Clamp_Bilinear_BitmapShader(const SkBitmap& src)
5
: SkBitmapShader(src, true,
6
SkShader::kClamp_TileMode, SkShader::kClamp_TileMode)
9
virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count);
12
SkPMColor sample_bilerp(SkFixed fx, SkFixed fy, unsigned srcMaxX, unsigned srcMaxY,
13
const SkPMColor* srcPixels, int srcRB, const SkFilterPtrProc* proc_table);
14
SkPMColor sample_bilerp(SkFixed fx, SkFixed fy, unsigned srcMaxX, unsigned srcMaxY,
15
const SkPMColor* srcPixels, int srcRB, const SkFilterPtrProc* proc_table)
20
const SkPMColor *p00, *p01, *p10, *p11;
22
p00 = p01 = ((const SkPMColor*)((const char*)srcPixels
23
+ SkClampMax(iy, srcMaxY) * srcRB))
24
+ SkClampMax(ix, srcMaxX);
26
if ((unsigned)ix < srcMaxX)
30
if ((unsigned)iy < srcMaxY)
32
p10 = (const SkPMColor*)((const char*)p10 + srcRB);
33
p11 = (const SkPMColor*)((const char*)p11 + srcRB);
36
SkFilterPtrProc proc = SkGetBilinearFilterPtrProc(proc_table, fx, fy);
37
return proc(p00, p01, p10, p11);
40
static inline SkPMColor sample_bilerpx(SkFixed fx, unsigned srcMaxX, const SkPMColor* srcPixels,
41
int srcRB, const SkFilterPtrProc* proc_table)
45
const SkPMColor *p00, *p01, *p10, *p11;
47
p00 = p01 = srcPixels + SkClampMax(ix, srcMaxX);
48
if ((unsigned)ix < srcMaxX)
51
p10 = (const SkPMColor*)((const char*)p00 + srcRB);
52
p11 = (const SkPMColor*)((const char*)p01 + srcRB);
54
SkFilterPtrProc proc = SkGetBilinearFilterPtrXProc(proc_table, fx);
55
return proc(p00, p01, p10, p11);
58
void ARGB32_Clamp_Bilinear_BitmapShader::shadeSpan(int x, int y, SkPMColor dstC[], int count)
62
unsigned srcScale = SkAlpha255To256(this->getPaintAlpha());
64
const SkMatrix& inv = this->getTotalInverse();
65
const SkBitmap& srcBitmap = this->getSrcBitmap();
66
unsigned srcMaxX = srcBitmap.width() - 1;
67
unsigned srcMaxY = srcBitmap.height() - 1;
68
unsigned srcRB = srcBitmap.rowBytes();
70
const SkFilterPtrProc* proc_table = SkGetBilinearFilterPtrProcTable();
71
const SkPMColor* srcPixels = (const SkPMColor*)srcBitmap.getPixels();
73
if (this->getInverseClass() == kPerspective_MatrixClass)
75
SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf,
76
SkIntToScalar(y) + SK_ScalarHalf, count);
80
while ((count = iter.next()) != 0)
82
const SkFixed* srcXY = iter.getXY();
85
SkFixed fx = *srcXY++ - SK_FixedHalf;
86
SkFixed fy = *srcXY++ - SK_FixedHalf;
87
*dstC++ = sample_bilerp(fx, fy, srcMaxX, srcMaxY, srcPixels, srcRB, proc_table);
91
else // scale by srcScale
93
while ((count = iter.next()) != 0)
95
const SkFixed* srcXY = iter.getXY();
98
SkFixed fx = *srcXY++ - SK_FixedHalf;
99
SkFixed fy = *srcXY++ - SK_FixedHalf;
100
SkPMColor c = sample_bilerp(fx, fy, srcMaxX, srcMaxY, srcPixels, srcRB, proc_table);
101
*dstC++ = SkAlphaMulQ(c, srcScale);
108
SkFixed fx, fy, dx, dy;
110
// now init fx, fy, dx, dy
113
this->getInverseMapPtProc()(inv, SkIntToScalar(x) + SK_ScalarHalf,
114
SkIntToScalar(y) + SK_ScalarHalf,
117
fx = SkScalarToFixed(srcPt.fX) - SK_FixedHalf;
118
fy = SkScalarToFixed(srcPt.fY) - SK_FixedHalf;
120
if (this->getInverseClass() == kFixedStepInX_MatrixClass)
121
(void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy);
124
dx = SkScalarToFixed(inv.getScaleX());
125
dy = SkScalarToFixed(inv.getSkewY());
129
if (dy == 0 && (unsigned)(fy >> 16) < srcMaxY)
131
srcPixels = (const SkPMColor*)((const char*)srcPixels + (fy >> 16) * srcRB);
132
proc_table = SkGetBilinearFilterPtrProcYTable(proc_table, fy);
136
*dstC++ = sample_bilerpx(fx, srcMaxX, srcPixels, srcRB, proc_table);
138
} while (--count != 0);
143
SkPMColor c = sample_bilerpx(fx, srcMaxX, srcPixels, srcRB, proc_table);
144
*dstC++ = SkAlphaMulQ(c, srcScale);
146
} while (--count != 0);
154
*dstC++ = sample_bilerp(fx, fy, srcMaxX, srcMaxY, srcPixels, srcRB, proc_table);
157
} while (--count != 0);
162
SkPMColor c = sample_bilerp(fx, fy, srcMaxX, srcMaxY, srcPixels, srcRB, proc_table);
163
*dstC++ = SkAlphaMulQ(c, srcScale);
166
} while (--count != 0);