| Index: src/core/SkBitmapProcState.cpp
|
| diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
|
| index a8a9b03d9ad7e13e00eb991d005114040c957849..57af1440347899a13a29a8522e72b6935c965b53 100644
|
| --- a/src/core/SkBitmapProcState.cpp
|
| +++ b/src/core/SkBitmapProcState.cpp
|
| @@ -11,6 +11,7 @@
|
| #include "SkPaint.h"
|
| #include "SkShader.h" // for tilemodes
|
| #include "SkUtilsArm.h"
|
| +#include "SkBitmapScaler.h"
|
|
|
| #if !SK_ARM_NEON_IS_NONE
|
| // These are defined in src/opts/SkBitmapProcState_arm_neon.cpp
|
| @@ -99,23 +100,45 @@ void SkBitmapProcState::possiblyScaleImage() {
|
| if (fFilterQuality != kHQ_BitmapFilter) {
|
| return;
|
| }
|
| -
|
| - // STEP 1: UPSAMPLE?
|
| -
|
| - // Check to see if the transformation matrix is scaling up, and if
|
| - // the matrix is simple, and if we're doing high quality scaling.
|
| - // If so, do the bitmap scale here and remove the scaling component from the matrix.
|
| -
|
| - if (fInvMatrix.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask) &&
|
| - (fInvMatrix.getScaleX() < 1 || fInvMatrix.getScaleY() < 1) &&
|
| +
|
| + // see if our platform has any specialized convolution code.
|
| +
|
| +
|
| + // Set up a pointer to a local (instead of storing the structure in the
|
| + // proc state) to avoid introducing a header dependency; this makes
|
| + // recompiles a lot less painful.
|
| +
|
| + SkConvolutionProcs simd;
|
| + fConvolutionProcs = &simd;
|
| +
|
| + fConvolutionProcs->fExtraHorizontalReads = 0;
|
| + fConvolutionProcs->fConvolveVertically = NULL;
|
| + fConvolutionProcs->fConvolve4RowsHorizontally = NULL;
|
| + fConvolutionProcs->fConvolveHorizontally = NULL;
|
| + fConvolutionProcs->fApplySIMDPadding = NULL;
|
| +
|
| + this->platformConvolutionProcs();
|
| +
|
| + // STEP 1: Highest quality direct scale?
|
| +
|
| + // 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 scaling component from the matrix.
|
| +
|
| + if (fFilterQuality == kHQ_BitmapFilter &&
|
| + fInvMatrix.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask) &&
|
| fOrigBitmap.config() == SkBitmap::kARGB_8888_Config) {
|
| -
|
| +
|
| + int dest_width = SkScalarCeilToInt(fOrigBitmap.width() / fInvMatrix.getScaleX());
|
| + int dest_height = SkScalarCeilToInt(fOrigBitmap.height() / fInvMatrix.getScaleY());
|
| +
|
| // All the criteria are met; let's make a new bitmap.
|
| - fScaledBitmap.setConfig(SkBitmap::kARGB_8888_Config,
|
| - (int)(fOrigBitmap.width() / fInvMatrix.getScaleX()),
|
| - (int)(fOrigBitmap.height() / fInvMatrix.getScaleY()));
|
| - fScaledBitmap.allocPixels();
|
| - fOrigBitmap.scale(&fScaledBitmap);
|
| +
|
| + fScaledBitmap = SkBitmapScaler::Resize( fOrigBitmap, SkBitmapScaler::RESIZE_BEST,
|
| + dest_width, dest_height, fConvolutionProcs );
|
| +
|
| + fScaledBitmap.lockPixels();
|
| +
|
| fBitmap = &fScaledBitmap;
|
|
|
| // set the inv matrix type to translate-only;
|
| @@ -130,9 +153,9 @@ void SkBitmapProcState::possiblyScaleImage() {
|
| return;
|
| }
|
|
|
| - if (!fOrigBitmap.hasMipMap()) {
|
| + if (!fOrigBitmap.hasMipMap() && fFilterQuality != kNone_BitmapFilter) {
|
|
|
| - // STEP 2: DOWNSAMPLE
|
| + // STEP 2: MIPMAP DOWNSAMPLE?
|
|
|
| // Check to see if the transformation matrix is scaling *down*.
|
| // If so, automatically build mipmaps.
|
|
|