| Index: src/core/SkBitmapProcState.cpp | 
| diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp | 
| index 64a8d3b1e1de20753eb50a20c4d9a6707aa9924a..30a64ed5a84e7f3b3bef80b5e429cc5d1d83457c 100644 | 
| --- a/src/core/SkBitmapProcState.cpp | 
| +++ b/src/core/SkBitmapProcState.cpp | 
| @@ -243,12 +243,43 @@ | 
| } | 
| } | 
|  | 
| +static bool get_locked_pixels(const SkBitmap& src, int pow2, SkBitmap* dst) { | 
| +    SkPixelRef* pr = src.pixelRef(); | 
| +    if (pr && pr->decodeInto(pow2, dst)) { | 
| +        return true; | 
| +    } | 
| + | 
| +    /* | 
| +     *  If decodeInto() fails, it is possibe that we have an old subclass that | 
| +     *  does not, or cannot, implement that. In that case we fall back to the | 
| +     *  older protocol of having the pixelRef handle the caching for us. | 
| +     */ | 
| +    *dst = src; | 
| +    dst->lockPixels(); | 
| +    return SkToBool(dst->getPixels()); | 
| +} | 
| + | 
| bool SkBitmapProcState::lockBaseBitmap() { | 
| -    // TODO(reed): use bitmap cache here? | 
| -    fScaledBitmap = fOrigBitmap; | 
| -    fScaledBitmap.lockPixels(); | 
| -    if (NULL == fScaledBitmap.getPixels()) { | 
| -        return false; | 
| +    SkPixelRef* pr = fOrigBitmap.pixelRef(); | 
| + | 
| +    if (pr->isLocked() || !pr->implementsDecodeInto()) { | 
| +        // fast-case, no need to look in our cache | 
| +        fScaledBitmap = fOrigBitmap; | 
| +        fScaledBitmap.lockPixels(); | 
| +        if (NULL == fScaledBitmap.getPixels()) { | 
| +            return false; | 
| +        } | 
| +    } else { | 
| +        if (!SkBitmapCache::Find(fOrigBitmap, 1, 1, &fScaledBitmap)) { | 
| +            if (!get_locked_pixels(fOrigBitmap, 0, &fScaledBitmap)) { | 
| +                return false; | 
| +            } | 
| + | 
| +            // TODO: if fScaled comes back at a different width/height than fOrig, | 
| +            // we need to update the matrix we are using to sample from this guy. | 
| + | 
| +            SkBitmapCache::Add(fOrigBitmap, 1, 1, fScaledBitmap); | 
| +        } | 
| } | 
| fBitmap = &fScaledBitmap; | 
| return true; | 
| @@ -358,7 +389,7 @@ | 
| fShaderProc16 = NULL; | 
| fSampleProc32 = NULL; | 
| fSampleProc16 = NULL; | 
| - | 
| + | 
| // recompute the triviality of the matrix here because we may have | 
| // changed it! | 
|  | 
| @@ -532,10 +563,10 @@ | 
| fShaderProc32 = this->chooseShaderProc32(); | 
| } | 
| } | 
| - | 
| + | 
| // see if our platform has any accelerated overrides | 
| this->platformProcs(); | 
| - | 
| + | 
| return true; | 
| } | 
|  | 
|  |