Index: src/core/SkBitmapProcState.cpp |
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp |
index 30a64ed5a84e7f3b3bef80b5e429cc5d1d83457c..81c14a2ffdcd071f63196fb3a5bde63c9fa6412e 100644 |
--- a/src/core/SkBitmapProcState.cpp |
+++ b/src/core/SkBitmapProcState.cpp |
@@ -98,16 +98,14 @@ static bool valid_for_filtering(unsigned dimension) { |
return (dimension & ~0x3FFF) == 0; |
} |
-static SkScalar effective_matrix_scale_sqrd(const SkMatrix& mat) { |
- SkPoint v1, v2; |
- |
- v1.fX = mat.getScaleX(); |
- v1.fY = mat.getSkewY(); |
- |
- v2.fX = mat.getSkewX(); |
- v2.fY = mat.getScaleY(); |
- |
- return SkMaxScalar(v1.lengthSqd(), v2.lengthSqd()); |
+static SkScalar effective_matrix_scale(const SkMatrix& mat) { |
+ SkScalar dx = SkVector::Length(mat.getScaleX(), mat.getSkewY()); |
+ SkScalar dy = SkVector::Length(mat.getSkewX(), mat.getScaleY()); |
+#ifdef SK_SUPPORT_LEGACY_MIPMAP_EFFECTIVE_SCALE |
+ return SkMaxScalar(dx, dy); |
+#else |
+ return SkScalarSqrt(dx * dy); |
+#endif |
} |
// Check to see that the size of the bitmap that would be produced by |
@@ -210,9 +208,9 @@ void SkBitmapProcState::processMediumRequest() { |
// to a valid bitmap. |
fFilterLevel = SkPaint::kLow_FilterLevel; |
- SkScalar invScaleSqd = effective_matrix_scale_sqrd(fInvMatrix); |
+ SkScalar invScale = effective_matrix_scale(fInvMatrix); |
- if (invScaleSqd > SK_Scalar1) { |
+ if (invScale > SK_Scalar1) { |
fCurrMip.reset(SkMipMapCache::FindAndRef(fOrigBitmap)); |
if (NULL == fCurrMip.get()) { |
fCurrMip.reset(SkMipMapCache::AddAndRef(fOrigBitmap)); |
@@ -225,7 +223,7 @@ void SkBitmapProcState::processMediumRequest() { |
sk_throw(); |
} |
- SkScalar levelScale = SkScalarInvert(SkScalarSqrt(invScaleSqd)); |
+ SkScalar levelScale = SkScalarInvert(invScale); |
SkMipMap::Level level; |
if (fCurrMip->extractLevel(levelScale, &level)) { |
SkScalar invScaleFixup = level.fScale; |