Chromium Code Reviews| Index: src/core/SkBitmapFilter.cpp |
| diff --git a/src/core/SkBitmapFilter.cpp b/src/core/SkBitmapFilter.cpp |
| index 20a05142506c1890e2c4eea964299def656da068..fce4c1d5fbc2f1c9b913e89515bea1481c33e013 100644 |
| --- a/src/core/SkBitmapFilter.cpp |
| +++ b/src/core/SkBitmapFilter.cpp |
| @@ -29,6 +29,7 @@ void highQualityFilter(ColorPacker pack, const SkBitmapProcState& s, int x, int |
| 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; |
| @@ -40,30 +41,33 @@ void highQualityFilter(ColorPacker pack, const SkBitmapProcState& s, int x, int |
| SkScalar weight = 0; |
| SkScalar fr = 0, fg = 0, fb = 0, fa = 0; |
| - int y0 = SkClampMax(SkScalarCeilToInt(srcPt.fY-s.getBitmapFilter()->width()), maxY); |
| - int y1 = SkClampMax(SkScalarFloorToInt(srcPt.fY+s.getBitmapFilter()->width()+1), maxY); |
| - int x0 = SkClampMax(SkScalarCeilToInt(srcPt.fX-s.getBitmapFilter()->width()), maxX); |
| - int x1 = SkClampMax(SkScalarFloorToInt(srcPt.fX+s.getBitmapFilter()->width())+1, maxX); |
| + 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] = s.getBitmapFilter()->lookupScalar((srcPt.fX - srcX)); |
| + xWeights[srcX - x0] = filter->lookupScalar((srcPt.fX - srcX)); |
| } |
| for (int srcY = y0; srcY < y1; srcY++) { |
| - SkScalar yWeight = s.getBitmapFilter()->lookupScalar((srcPt.fY - 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); |
|
reed1
2014/11/25 14:34:33
boy oh boy, this seems to beg for Sk4f ...
mtklein
2014/11/25 15:02:22
Yep, I will certainly try this out.
|
| fg += combined_weight * SkGetPackedG32(c); |
| fb += combined_weight * SkGetPackedB32(c); |
| fa += combined_weight * SkGetPackedA32(c); |
| - weight += combined_weight; |
| } |
| } |