| Index: src/core/SkBlitter_Sprite.cpp
|
| diff --git a/src/core/SkBlitter_Sprite.cpp b/src/core/SkBlitter_Sprite.cpp
|
| index 91a3cd1fee1c385acf1ad3ac8d497eb9486f7bab..ab70222c6b0e8976a557e91418f2e5dcf74af6c8 100644
|
| --- a/src/core/SkBlitter_Sprite.cpp
|
| +++ b/src/core/SkBlitter_Sprite.cpp
|
| @@ -8,21 +8,21 @@
|
| #include "SkSmallAllocator.h"
|
| #include "SkSpriteBlitter.h"
|
|
|
| -SkSpriteBlitter::SkSpriteBlitter(const SkBitmap& source)
|
| - : fSource(&source) {
|
| - fSource->lockPixels();
|
| -}
|
| -
|
| -SkSpriteBlitter::~SkSpriteBlitter() {
|
| - fSource->unlockPixels();
|
| +SkSpriteBlitter::SkSpriteBlitter(const SkBitmap& source) : fSource(NULL) {
|
| + if (source.requestLock(&fUnlocker)) {
|
| + fSource = &fUnlocker.pixmap();
|
| + }
|
| }
|
|
|
| -void SkSpriteBlitter::setup(const SkBitmap& device, int left, int top,
|
| - const SkPaint& paint) {
|
| +bool SkSpriteBlitter::setup(const SkBitmap& device, int left, int top, const SkPaint& paint) {
|
| + if (NULL == fSource) {
|
| + return false;
|
| + }
|
| fDevice = &device;
|
| fLeft = left;
|
| fTop = top;
|
| fPaint = &paint;
|
| + return true;
|
| }
|
|
|
| #ifdef SK_DEBUG
|
| @@ -76,7 +76,11 @@ SkBlitter* SkBlitter::ChooseSprite(const SkBitmap& device, const SkPaint& paint,
|
| }
|
|
|
| if (blitter) {
|
| - blitter->setup(device, left, top, paint);
|
| + if (!blitter->setup(device, left, top, paint)) {
|
| + // blitter was allocated by allocator, so we have to manually call its destructor
|
| + blitter->~SkSpriteBlitter();
|
| + blitter = NULL;
|
| + }
|
| }
|
| return blitter;
|
| }
|
|
|