| Index: src/core/SkBitmapProcState.cpp
|
| diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
|
| index 720a30f05c4a72b77365237c929755e0c1a4cf17..0b50fbc32dc8f4d160a78bc54e4b46de300ff14b 100644
|
| --- a/src/core/SkBitmapProcState.cpp
|
| +++ b/src/core/SkBitmapProcState.cpp
|
| @@ -98,12 +98,6 @@ static bool valid_for_filtering(unsigned dimension) {
|
| return (dimension & ~0x3FFF) == 0;
|
| }
|
|
|
| -static SkScalar effective_matrix_scale(const SkMatrix& mat) {
|
| - SkScalar dx = SkVector::Length(mat.getScaleX(), mat.getSkewY());
|
| - SkScalar dy = SkVector::Length(mat.getSkewX(), mat.getScaleY());
|
| - return SkScalarSqrt(dx * dy);
|
| -}
|
| -
|
| // Check to see that the size of the bitmap that would be produced by
|
| // scaling by the given inverted matrix is less than the maximum allowed.
|
| static inline bool cache_size_okay(const SkBitmap& bm, const SkMatrix& invMat) {
|
| @@ -119,22 +113,6 @@ static inline bool cache_size_okay(const SkBitmap& bm, const SkMatrix& invMat) {
|
| }
|
|
|
| /*
|
| - * Extract the "best" scale factors from a matrix.
|
| - */
|
| -static bool extract_scale(const SkMatrix& matrix, SkVector* scale) {
|
| - SkASSERT(!matrix.hasPerspective());
|
| - SkScalar sx = SkPoint::Length(matrix[SkMatrix::kMScaleX], matrix[SkMatrix::kMSkewY]);
|
| - SkScalar sy = SkPoint::Length(matrix[SkMatrix::kMSkewX], matrix[SkMatrix::kMScaleY]);
|
| - if (!SkScalarIsFinite(sx) || !SkScalarIsFinite(sy) ||
|
| - SkScalarNearlyZero(sx) || SkScalarNearlyZero(sy))
|
| - {
|
| - return false;
|
| - }
|
| - scale->set(sx, sy);
|
| - return true;
|
| -}
|
| -
|
| -/*
|
| * High quality is implemented by performing up-right scale-only filtering and then
|
| * using bilerp for any remaining transformations.
|
| */
|
| @@ -154,12 +132,12 @@ void SkBitmapProcState::processHQRequest() {
|
| SkScalar invScaleX = fInvMatrix.getScaleX();
|
| SkScalar invScaleY = fInvMatrix.getScaleY();
|
| if (fInvMatrix.getType() & SkMatrix::kAffine_Mask) {
|
| - SkVector scale;
|
| - if (!extract_scale(fInvMatrix, &scale)) {
|
| - return; // can't find suitable scale factors
|
| + SkSize scale;
|
| + if (!fInvMatrix.decomposeScale(&scale)) {
|
| + return;
|
| }
|
| - invScaleX = scale.x();
|
| - invScaleY = scale.y();
|
| + invScaleX = scale.width();
|
| + invScaleY = scale.height();
|
| }
|
| if (SkScalarNearlyEqual(invScaleX, 1) && SkScalarNearlyEqual(invScaleY, 1)) {
|
| return; // no need for HQ
|
| @@ -204,7 +182,11 @@ void SkBitmapProcState::processMediumRequest() {
|
| // to a valid bitmap.
|
| fFilterLevel = kLow_SkFilterQuality;
|
|
|
| - SkScalar invScale = effective_matrix_scale(fInvMatrix);
|
| + SkSize invScaleSize;
|
| + if (!fInvMatrix.decomposeScale(&invScaleSize, NULL)) {
|
| + return;
|
| + }
|
| + SkScalar invScale = SkScalarSqrt(invScaleSize.width() * invScaleSize.height());
|
|
|
| if (invScale > SK_Scalar1) {
|
| fCurrMip.reset(SkMipMapCache::FindAndRef(fOrigBitmap));
|
|
|