diff options
author | 2013-07-23 19:13:54 +0000 | |
---|---|---|
committer | 2013-07-23 19:13:54 +0000 | |
commit | 602a1d70257eb3fcb746d758577f042d8c94f6d9 (patch) | |
tree | 268b7f22d8e8255e125c3b55dba6fe29fb18cc0d /src/core/SkBitmapProcState.cpp | |
parent | 7699eeb84762b8fea78333a00826c1e9b0da9541 (diff) |
add scaledimagecache
BUG=
Review URL: https://codereview.chromium.org/20005003
git-svn-id: http://skia.googlecode.com/svn/trunk@10286 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkBitmapProcState.cpp')
-rw-r--r-- | src/core/SkBitmapProcState.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp index 991521a95d..f880a86196 100644 --- a/src/core/SkBitmapProcState.cpp +++ b/src/core/SkBitmapProcState.cpp @@ -12,6 +12,7 @@ #include "SkShader.h" // for tilemodes #include "SkUtilsArm.h" #include "SkBitmapScaler.h" +#include "SkScaledImageCache.h" #if !SK_ARM_NEON_IS_NONE // These are defined in src/opts/SkBitmapProcState_arm_neon.cpp @@ -142,14 +143,29 @@ void SkBitmapProcState::possiblyScaleImage() { 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 = SkBitmapScaler::Resize( fOrigBitmap, SkBitmapScaler::RESIZE_BEST, - dest_width, dest_height, fConvolutionProcs ); - + SkScalar invScaleX = fInvMatrix.getScaleX(); + SkScalar invScaleY = fInvMatrix.getScaleY(); + + SkASSERT(NULL == fScaledCacheID); + fScaledCacheID = SkScaledImageCache::FindAndLock(fOrigBitmap, + invScaleX, invScaleY, + &fScaledBitmap); + if (NULL == fScaledCacheID) { + int dest_width = SkScalarCeilToInt(fOrigBitmap.width() / invScaleX); + int dest_height = SkScalarCeilToInt(fOrigBitmap.height() / invScaleY); + + // All the criteria are met; let's make a new bitmap. + + fScaledBitmap = SkBitmapScaler::Resize(fOrigBitmap, + SkBitmapScaler::RESIZE_BEST, + dest_width, + dest_height, + fConvolutionProcs); + fScaledCacheID = SkScaledImageCache::AddAndLock(fOrigBitmap, + invScaleX, + invScaleY, + fScaledBitmap); + } fScaledBitmap.lockPixels(); fBitmap = &fScaledBitmap; @@ -234,6 +250,11 @@ void SkBitmapProcState::endContext() { SkDELETE(fBitmapFilter); fBitmapFilter = NULL; fScaledBitmap.reset(); + + if (fScaledCacheID) { + SkScaledImageCache::Unlock(fScaledCacheID); + fScaledCacheID = NULL; + } } bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { |