Index: src/core/SkBitmapScaler.cpp |
diff --git a/src/core/SkBitmapScaler.cpp b/src/core/SkBitmapScaler.cpp |
index 599e9d8eb54eba79645da0d353d651d2a3b58c93..ebcccf2fe0eabc6bfd38d53974d347d9cc6695da 100644 |
--- a/src/core/SkBitmapScaler.cpp |
+++ b/src/core/SkBitmapScaler.cpp |
@@ -13,8 +13,8 @@ class SkResizeFilter { |
public: |
SkResizeFilter(SkBitmapScaler::ResizeMethod method, |
int srcFullWidth, int srcFullHeight, |
- int destWidth, int destHeight, |
- const SkIRect& destSubset, |
+ float destWidth, float destHeight, |
+ const SkRect& destSubset, |
const SkConvolutionProcs& convolveProcs); |
~SkResizeFilter() { |
SkDELETE( fBitmapFilter ); |
@@ -40,7 +40,7 @@ private: |
// for the transform is also specified. |
void computeFilters(int srcSize, |
- int destSubsetLo, int destSubsetSize, |
+ float destSubsetLo, float destSubsetSize, |
float scale, |
SkConvolutionFilter1D* output, |
const SkConvolutionProcs& convolveProcs); |
@@ -51,8 +51,8 @@ private: |
SkResizeFilter::SkResizeFilter(SkBitmapScaler::ResizeMethod method, |
int srcFullWidth, int srcFullHeight, |
- int destWidth, int destHeight, |
- const SkIRect& destSubset, |
+ float destWidth, float destHeight, |
+ const SkRect& destSubset, |
const SkConvolutionProcs& convolveProcs) { |
// method will only ever refer to an "algorithm method". |
@@ -82,10 +82,8 @@ SkResizeFilter::SkResizeFilter(SkBitmapScaler::ResizeMethod method, |
} |
- float scaleX = static_cast<float>(destWidth) / |
- static_cast<float>(srcFullWidth); |
- float scaleY = static_cast<float>(destHeight) / |
- static_cast<float>(srcFullHeight); |
+ float scaleX = destWidth / srcFullWidth; |
+ float scaleY = destHeight / srcFullHeight; |
this->computeFilters(srcFullWidth, destSubset.fLeft, destSubset.width(), |
scaleX, &fXFilter, convolveProcs); |
@@ -112,11 +110,11 @@ SkResizeFilter::SkResizeFilter(SkBitmapScaler::ResizeMethod method, |
// the coefficients can be shared. For periods of 1 we can consider |
// loading the factors only once outside the borders. |
void SkResizeFilter::computeFilters(int srcSize, |
- int destSubsetLo, int destSubsetSize, |
+ float destSubsetLo, float destSubsetSize, |
float scale, |
SkConvolutionFilter1D* output, |
const SkConvolutionProcs& convolveProcs) { |
- int destSubsetHi = destSubsetLo + destSubsetSize; // [lo, hi) |
+ float destSubsetHi = destSubsetLo + destSubsetSize; // [lo, hi) |
// When we're doing a magnification, the scale will be larger than one. This |
// means the destination pixels are much smaller than the source pixels, and |
@@ -138,7 +136,7 @@ void SkResizeFilter::computeFilters(int srcSize, |
// Loop over all pixels in the output range. We will generate one set of |
// filter values for each one. Those values will tell us how to blend the |
// source pixels to compute the destination pixel. |
- for (int destSubsetI = destSubsetLo; destSubsetI < destSubsetHi; |
+ for (int destSubsetI = SkScalarFloorToInt(destSubsetLo); destSubsetI < SkScalarCeilToInt(destSubsetHi); |
destSubsetI++) { |
// Reset the arrays. We don't declare them inside so they can re-use the |
// same malloc-ed buffer. |
@@ -247,22 +245,23 @@ static SkBitmapScaler::ResizeMethod ResizeMethodToAlgorithmMethod( |
bool SkBitmapScaler::Resize(SkBitmap* resultPtr, |
const SkBitmap& source, |
ResizeMethod method, |
- int destWidth, int destHeight, |
- const SkIRect& destSubset, |
+ float destWidth, float destHeight, |
const SkConvolutionProcs& convolveProcs, |
SkBitmap::Allocator* allocator) { |
+ |
+ SkRect destSubset = { 0, 0, destWidth, destHeight }; |
+ |
// Ensure that the ResizeMethod enumeration is sound. |
SkASSERT(((RESIZE_FIRST_QUALITY_METHOD <= method) && |
(method <= RESIZE_LAST_QUALITY_METHOD)) || |
((RESIZE_FIRST_ALGORITHM_METHOD <= method) && |
(method <= RESIZE_LAST_ALGORITHM_METHOD))); |
- SkIRect dest = { 0, 0, destWidth, destHeight }; |
+ SkRect dest = { 0, 0, destWidth, destHeight }; |
if (!dest.contains(destSubset)) { |
SkErrorInternals::SetError( kInvalidArgument_SkError, |
- "Sorry, you passed me a bitmap resize " |
- " method I have never heard of: %d", |
- method ); |
+ "Sorry, the destination bitmap scale subset " |
+ "falls outside the full destination bitmap." ); |
} |
// If the size of source or destination is 0, i.e. 0x0, 0xN or Nx0, just |
@@ -297,8 +296,8 @@ bool SkBitmapScaler::Resize(SkBitmap* resultPtr, |
// Convolve into the result. |
SkBitmap result; |
- result.setConfig(SkImageInfo::MakeN32(destSubset.width(), |
- destSubset.height(), |
+ result.setConfig(SkImageInfo::MakeN32(SkScalarCeilToInt(destSubset.width()), |
+ SkScalarCeilToInt(destSubset.height()), |
source.alphaType())); |
result.allocPixels(allocator, NULL); |
if (!result.readyToDraw()) { |
@@ -316,15 +315,3 @@ bool SkBitmapScaler::Resize(SkBitmap* resultPtr, |
SkASSERT(NULL != resultPtr->getPixels()); |
return true; |
} |
- |
-// static |
-bool SkBitmapScaler::Resize(SkBitmap* resultPtr, |
- const SkBitmap& source, |
- ResizeMethod method, |
- int destWidth, int destHeight, |
- const SkConvolutionProcs& convolveProcs, |
- SkBitmap::Allocator* allocator) { |
- SkIRect destSubset = { 0, 0, destWidth, destHeight }; |
- return Resize(resultPtr, source, method, destWidth, destHeight, destSubset, |
- convolveProcs, allocator); |
-} |