Index: src/core/SkBitmapFilter.cpp |
diff --git a/src/core/SkBitmapFilter.cpp b/src/core/SkBitmapFilter.cpp |
index fce4c1d5fbc2f1c9b913e89515bea1481c33e013..82494d9bbecc6b46432c2541f7d11e64e123e49c 100644 |
--- a/src/core/SkBitmapFilter.cpp |
+++ b/src/core/SkBitmapFilter.cpp |
@@ -22,86 +22,6 @@ |
// the image is rotated or has some other complex transformation applied. |
// Scaled images will usually be rescaled directly before rasterization. |
-namespace { |
- |
-template <typename Color, typename ColorPacker> |
-void highQualityFilter(ColorPacker pack, const SkBitmapProcState& s, int x, int y, Color* SK_RESTRICT colors, int count) { |
- const int maxX = s.fBitmap->width(); |
- const int maxY = s.fBitmap->height(); |
- SkAutoTMalloc<SkScalar> xWeights(maxX); |
- const SkBitmapFilter* filter = s.getBitmapFilter(); |
- |
- while (count-- > 0) { |
- SkPoint srcPt; |
- s.fInvProc(s.fInvMatrix, x + 0.5f, |
- y + 0.5f, &srcPt); |
- srcPt.fX -= SK_ScalarHalf; |
- srcPt.fY -= SK_ScalarHalf; |
- |
- SkScalar weight = 0; |
- SkScalar fr = 0, fg = 0, fb = 0, fa = 0; |
- |
- int y0 = SkClampMax(SkScalarCeilToInt(srcPt.fY - filter->width()), maxY); |
- int y1 = SkClampMax(SkScalarFloorToInt(srcPt.fY + filter->width() + 1), maxY); |
- int x0 = SkClampMax(SkScalarCeilToInt(srcPt.fX - filter->width()), maxX); |
- int x1 = SkClampMax(SkScalarFloorToInt(srcPt.fX + filter->width()) + 1, maxX); |
- |
- for (int srcX = x0; srcX < x1 ; srcX++) { |
- // Looking these up once instead of each loop is a ~15% speedup. |
- xWeights[srcX - x0] = filter->lookupScalar((srcPt.fX - srcX)); |
- } |
- |
- for (int srcY = y0; srcY < y1; srcY++) { |
- SkScalar yWeight = filter->lookupScalar((srcPt.fY - srcY)); |
- |
- for (int srcX = x0; srcX < x1 ; srcX++) { |
- SkScalar xWeight = xWeights[srcX - x0]; |
- |
- SkScalar combined_weight = SkScalarMul(xWeight, yWeight); |
- weight += combined_weight; |
- |
- SkPMColor c = *s.fBitmap->getAddr32(srcX, srcY); |
- if (!c) { |
- continue; |
- } |
- fr += combined_weight * SkGetPackedR32(c); |
- fg += combined_weight * SkGetPackedG32(c); |
- fb += combined_weight * SkGetPackedB32(c); |
- fa += combined_weight * SkGetPackedA32(c); |
- } |
- } |
- |
- fr = SkScalarDiv(fr, weight); |
- fg = SkScalarDiv(fg, weight); |
- fb = SkScalarDiv(fb, weight); |
- fa = SkScalarDiv(fa, weight); |
- |
- int a = SkClampMax(SkScalarRoundToInt(fa), 255); |
- int r = SkClampMax(SkScalarRoundToInt(fr), a); |
- int g = SkClampMax(SkScalarRoundToInt(fg), a); |
- int b = SkClampMax(SkScalarRoundToInt(fb), a); |
- |
- *colors++ = pack(a, r, g, b); |
- |
- x++; |
- } |
-} |
- |
-uint16_t PackTo565(int /*a*/, int r, int g, int b) { |
- return SkPack888ToRGB16(r, g, b); |
-} |
- |
-} // namespace |
- |
-void highQualityFilter32(const SkBitmapProcState& s, int x, int y, SkPMColor* SK_RESTRICT colors, int count) { |
- highQualityFilter(&SkPackARGB32, s, x, y, colors, count); |
-} |
- |
-void highQualityFilter16(const SkBitmapProcState& s, int x, int y, uint16_t* SK_RESTRICT colors, int count) { |
- highQualityFilter(&PackTo565, s, x, y, colors, count); |
-} |
- |
- |
SK_CONF_DECLARE(const char *, c_bitmapFilter, "bitmap.filter", "mitchell", "Which scanline bitmap filter to use [mitchell, lanczos, hamming, gaussian, triangle, box]"); |
SkBitmapFilter *SkBitmapFilter::Allocate() { |
@@ -124,35 +44,3 @@ SkBitmapFilter *SkBitmapFilter::Allocate() { |
return NULL; |
} |
-bool SkBitmapProcState::setBitmapFilterProcs() { |
- if (fFilterLevel != SkPaint::kHigh_FilterLevel) { |
- return false; |
- } |
- |
- if (fAlphaScale != 256) { |
- return false; |
- } |
- |
- // TODO: consider supporting other colortypes (e.g. 565, A8) |
- if (fBitmap->colorType() != kN32_SkColorType) { |
- return false; |
- } |
- |
- // TODO: consider supporting repeat and mirror |
- if (SkShader::kClamp_TileMode != fTileModeX || SkShader::kClamp_TileMode != fTileModeY) { |
- return false; |
- } |
- |
- // TODO: is this right? do we want fBitmapFilter allocated even if we can't set shader procs? |
- if (fInvType & (SkMatrix::kAffine_Mask | SkMatrix::kScale_Mask)) { |
- fBitmapFilter = SkBitmapFilter::Allocate(); |
- } |
- |
- if (fInvType & SkMatrix::kScale_Mask) { |
- fShaderProc32 = highQualityFilter32; |
- fShaderProc16 = highQualityFilter16; |
- return true; |
- } else { |
- return false; |
- } |
-} |