| 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;
|
| }
|
|
|
|
|