Index: src/codec/SkScaledCodec.cpp |
diff --git a/src/codec/SkScaledCodec.cpp b/src/codec/SkScaledCodec.cpp |
index e0158b6b4ef005d035ac6ef54576debdb28b7b98..0f0d12993c87f4acc645047d349e06b594cce73e 100644 |
--- a/src/codec/SkScaledCodec.cpp |
+++ b/src/codec/SkScaledCodec.cpp |
@@ -53,7 +53,7 @@ static int get_scaled_dimension(int srcDimension, int sampleSize) { |
return srcDimension / sampleSize; |
} |
-static SkISize best_scaled_dimensions(const SkISize& origDims, const SkISize& nativeDims, |
+static SkISize best_scaled_dimensions(const SkISize& origDims, const SkISize& nativeDims, |
const SkISize& scaledCodecDims, float desiredScale) { |
if (nativeDims == scaledCodecDims) { |
// does not matter which to return if equal. Return here to skip below calculations |
@@ -65,18 +65,24 @@ static SkISize best_scaled_dimensions(const SkISize& origDims, const SkISize& na |
// calculate difference between native dimensions and ideal dimensions |
float nativeWDiff = SkTAbs(idealWidth - nativeDims.width()); |
float nativeHDiff = SkTAbs(idealHeight - nativeDims.height()); |
- float nativeDiff = (nativeWDiff + nativeHDiff) / 2; |
+ float nativeDiff = nativeWDiff + nativeHDiff; |
+ |
+ // Native scaling is preferred to sampling. If we can scale natively to |
+ // within one of the ideal value, we should choose to scale natively. |
+ if (nativeWDiff < 1.0f && nativeHDiff < 1.0f) { |
+ return nativeDims; |
+ } |
// calculate difference between scaledCodec dimensions and ideal dimensions |
float scaledCodecWDiff = SkTAbs(idealWidth - scaledCodecDims.width()); |
float scaledCodecHDiff = SkTAbs(idealHeight - scaledCodecDims.height()); |
- float scaledCodecDiff = (scaledCodecWDiff + scaledCodecHDiff) / 2; |
+ float scaledCodecDiff = scaledCodecWDiff + scaledCodecHDiff; |
// return dimensions closest to ideal dimensions. |
// If the differences are equal, return nativeDims, as native scaling is more efficient. |
return nativeDiff > scaledCodecDiff ? scaledCodecDims : nativeDims; |
+} |
-} |
/* |
* Return a valid set of output dimensions for this decoder, given an input scale |
*/ |
@@ -98,7 +104,7 @@ SkISize SkScaledCodec::onGetScaledDimensions(float desiredScale) const { |
// Return the calculated output dimensions for the given scale |
scaledCodecDimensions = SkISize::Make(scaledWidth, scaledHeight); |
- return best_scaled_dimensions(this->getInfo().dimensions(), nativeDimensions, |
+ return best_scaled_dimensions(this->getInfo().dimensions(), nativeDimensions, |
scaledCodecDimensions, desiredScale); |
} |