From 60cc7d353b2adc8fcc1712e1f7a965e70121ebcc Mon Sep 17 00:00:00 2001 From: humper Date: Thu, 28 Aug 2014 09:54:41 -0700 Subject: [PATCH] manual revert of bitmap scale change while I investigate failures on chromeos TBR=reed NOTREECHECKS=True Author: humper@google.com Review URL: https://codereview.chromium.org/516923003 --- expectations/gm/ignored-tests.txt | 17 ----------- gyp/skia_for_chromium_defines.gypi | 1 - src/core/SkBitmapProcState.cpp | 46 +++++++++--------------------- src/core/SkBitmapProcState.h | 1 - tests/ScaledImageCache.cpp | 4 +-- 5 files changed, 14 insertions(+), 55 deletions(-) diff --git a/expectations/gm/ignored-tests.txt b/expectations/gm/ignored-tests.txt index 58bc8955c8..443626c9c5 100644 --- a/expectations/gm/ignored-tests.txt +++ b/expectations/gm/ignored-tests.txt @@ -38,20 +38,3 @@ textblob # reed matrixconvolution - -#humper: https://codereview.chromium.org/470233002/ -downsamplebitmap_checkerboard_high_512_256 -downsamplebitmap_image_high_mandrill_512.png -downsamplebitmap_text_high_72.00pt -filterbitmap_checkerboard_192_192 -filterbitmap_checkerboard_32_2 -filterbitmap_checkerboard_32_32 -filterbitmap_checkerboard_32_8 -filterbitmap_checkerboard_4_4 -filterbitmap_image_mandrill_128.png -filterbitmap_image_mandrill_16.png -filterbitmap_image_mandrill_256.png -filterbitmap_image_mandrill_32.png -filterbitmap_image_mandrill_64.png -filterbitmap_text_3.00pt -filterbitmap_text_7.00pt diff --git a/gyp/skia_for_chromium_defines.gypi b/gyp/skia_for_chromium_defines.gypi index 53fc7b9c63..93674ef8f5 100644 --- a/gyp/skia_for_chromium_defines.gypi +++ b/gyp/skia_for_chromium_defines.gypi @@ -13,7 +13,6 @@ # If these become 'permanent', they should be moved into skia_common.gypi # 'skia_for_chromium_defines': [ - 'SK_IGNORE_PROPER_FRACTIONAL_SCALING', 'SK_SUPPORT_LEGACY_PICTURE_CLONE', 'SK_SUPPORT_LEGACY_GETDEVICE', 'SK_IGNORE_ETC1_SUPPORT', diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp index 2583cb5011..7640573596 100644 --- a/src/core/SkBitmapProcState.cpp +++ b/src/core/SkBitmapProcState.cpp @@ -149,34 +149,21 @@ static inline bool cache_size_okay(const SkBitmap& bm, const SkMatrix& invMat) { bool SkBitmapProcState::possiblyScaleImage() { SkASSERT(NULL == fBitmap); - fAdjustedMatrix = false; - if (fFilterLevel <= SkPaint::kLow_FilterLevel) { return false; } // Check to see if the transformation matrix is simple, and if we're // doing high quality scaling. If so, do the bitmap scale here and - // remove the (non-fractional) scaling component from the matrix. - - SkScalar invScaleX = fInvMatrix.getScaleX(); - SkScalar invScaleY = fInvMatrix.getScaleY(); - - float trueDestWidth = fOrigBitmap.width() / invScaleX; - float trueDestHeight = fOrigBitmap.height() / invScaleY; - -#ifndef SK_IGNORE_PROPER_FRACTIONAL_SCALING - float roundedDestWidth = SkScalarRoundToScalar(trueDestWidth); - float roundedDestHeight = SkScalarRoundToScalar(trueDestHeight); -#else - float roundedDestWidth = trueDestWidth; - float roundedDestHeight = trueDestHeight; -#endif + // remove the scaling component from the matrix. if (SkPaint::kHigh_FilterLevel == fFilterLevel && fInvMatrix.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask) && kN32_SkColorType == fOrigBitmap.colorType() && cache_size_okay(fOrigBitmap, fInvMatrix)) { + SkScalar invScaleX = fInvMatrix.getScaleX(); + SkScalar invScaleY = fInvMatrix.getScaleY(); + if (SkScalarNearlyEqual(invScaleX,1.0f) && SkScalarNearlyEqual(invScaleY,1.0f)) { // short-circuit identity scaling; the output is supposed to @@ -193,14 +180,17 @@ bool SkBitmapProcState::possiblyScaleImage() { return false; } - if (!SkBitmapCache::Find(fOrigBitmap, roundedDestWidth, roundedDestHeight, &fScaledBitmap)) { + if (!SkBitmapCache::Find(fOrigBitmap, invScaleX, invScaleY, &fScaledBitmap)) { + float dest_width = fOrigBitmap.width() / invScaleX; + float dest_height = fOrigBitmap.height() / invScaleY; + // All the criteria are met; let's make a new bitmap. if (!SkBitmapScaler::Resize(&fScaledBitmap, fOrigBitmap, SkBitmapScaler::RESIZE_BEST, - roundedDestWidth, - roundedDestHeight, + dest_width, + dest_height, SkScaledImageCache::GetAllocator())) { // we failed to create fScaledBitmap, so just return and let // the scanline proc handle it. @@ -209,7 +199,7 @@ bool SkBitmapProcState::possiblyScaleImage() { } SkASSERT(NULL != fScaledBitmap.getPixels()); - SkBitmapCache::Add(fOrigBitmap, roundedDestWidth, roundedDestHeight, fScaledBitmap); + SkBitmapCache::Add(fOrigBitmap, invScaleX, invScaleY, fScaledBitmap); } SkASSERT(NULL != fScaledBitmap.getPixels()); @@ -219,19 +209,9 @@ bool SkBitmapProcState::possiblyScaleImage() { fInvMatrix.setTranslate(fInvMatrix.getTranslateX() / fInvMatrix.getScaleX(), fInvMatrix.getTranslateY() / fInvMatrix.getScaleY()); -#ifndef SK_IGNORE_PROPER_FRACTIONAL_SCALING - // reintroduce any fractional scaling missed by our integral scale done above. - - float fractionalScaleX = trueDestWidth/roundedDestWidth; - float fractionalScaleY = trueDestHeight/roundedDestHeight; - - fInvMatrix.postScale(fractionalScaleX, fractionalScaleY); -#endif - fAdjustedMatrix = true; - // Set our filter level to low -- the only post-filtering this // image might require is some interpolation if the translation - // is fractional or if there's any remaining scaling to be done. + // is fractional. fFilterLevel = SkPaint::kLow_FilterLevel; return true; } @@ -387,7 +367,7 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { bool clampClamp = SkShader::kClamp_TileMode == fTileModeX && SkShader::kClamp_TileMode == fTileModeY; - if (!(fAdjustedMatrix || clampClamp || trivialMatrix)) { + if (!(clampClamp || trivialMatrix)) { fInvMatrix.postIDiv(fOrigBitmap.width(), fOrigBitmap.height()); } diff --git a/src/core/SkBitmapProcState.h b/src/core/SkBitmapProcState.h index 4e4eded202..64dda2ecb3 100644 --- a/src/core/SkBitmapProcState.h +++ b/src/core/SkBitmapProcState.h @@ -144,7 +144,6 @@ private: SkBitmap fScaledBitmap; // chooseProcs SkAutoTUnref fCurrMip; - bool fAdjustedMatrix; // set by possiblyScaleImage MatrixProc chooseMatrixProc(bool trivial_matrix); bool chooseProcs(const SkMatrix& inv, const SkPaint&); diff --git a/tests/ScaledImageCache.cpp b/tests/ScaledImageCache.cpp index ffab2adee7..276a3cc17a 100644 --- a/tests/ScaledImageCache.cpp +++ b/tests/ScaledImageCache.cpp @@ -17,9 +17,7 @@ static bool is_in_scaled_image_cache(const SkBitmap& orig, SkScalar xScale, SkScalar yScale) { SkBitmap scaled; - float roundedImageWidth = SkScalarRoundToScalar(orig.width() * xScale); - float roundedImageHeight = SkScalarRoundToScalar(orig.height() * xScale); - return SkBitmapCache::Find(orig, roundedImageWidth, roundedImageHeight, &scaled); + return SkBitmapCache::Find(orig, SkScalarInvert(xScale), SkScalarInvert(yScale), &scaled); } // Draw a scaled bitmap, then return true iff it has been cached.