Index: src/image/SkImage_Codec.cpp |
diff --git a/src/image/SkImage_Codec.cpp b/src/image/SkImage_Codec.cpp |
index 0b14216a064d9c6d81670f418b25692b58a9c8bf..4e00e267f8f100f26a5cbffa3e72a9b7d7965bea 100644 |
--- a/src/image/SkImage_Codec.cpp |
+++ b/src/image/SkImage_Codec.cpp |
@@ -25,6 +25,8 @@ public: |
virtual bool isOpaque() const SK_OVERRIDE; |
private: |
+ bool ensureBitmapDecoded() const; |
+ |
SkData* fEncodedData; |
SkBitmap fBitmap; |
@@ -42,26 +44,31 @@ SkImage_Codec::~SkImage_Codec() { |
fEncodedData->unref(); |
} |
-void SkImage_Codec::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const { |
+bool SkImage_Codec::ensureBitmapDecoded() const { |
if (!fBitmap.pixelRef()) { |
// todo: this needs to be thread-safe |
SkBitmap* bitmap = const_cast<SkBitmap*>(&fBitmap); |
if (!SkImageDecoder::DecodeMemory(fEncodedData->bytes(), fEncodedData->size(), bitmap)) { |
- return; |
+ return false; |
} |
} |
+ return true; |
+} |
+ |
+void SkImage_Codec::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const { |
+ if(!this->ensureBitmapDecoded()) { |
+ return; |
+ } |
+ |
canvas->drawBitmap(fBitmap, x, y, paint); |
} |
void SkImage_Codec::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst, |
const SkPaint* paint) const { |
- if (!fBitmap.pixelRef()) { |
- // todo: this needs to be thread-safe |
- SkBitmap* bitmap = const_cast<SkBitmap*>(&fBitmap); |
- if (!SkImageDecoder::DecodeMemory(fEncodedData->bytes(), fEncodedData->size(), bitmap)) { |
- return; |
- } |
+ if(!this->ensureBitmapDecoded()) { |
+ return; |
} |
+ |
canvas->drawBitmapRectToRect(fBitmap, src, dst, paint); |
} |