Chromium Code Reviews| Index: src/utils/SkDeferredCanvas.cpp |
| diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp |
| index 09494c9aaa04428a437a88c83c878ede07a8c3bd..ddecc02da842a0a34f3e50a1f034e58e23cacdeb 100644 |
| --- a/src/utils/SkDeferredCanvas.cpp |
| +++ b/src/utils/SkDeferredCanvas.cpp |
| @@ -30,8 +30,7 @@ enum PlaybackMode { |
| kSilent_PlaybackMode, |
| }; |
| -namespace { |
| -bool shouldDrawImmediately(const SkBitmap* bitmap, const SkPaint* paint, |
| +static bool shouldDrawImmediately(const SkBitmap* bitmap, const SkPaint* paint, |
| size_t bitmapSizeThreshold) { |
| if (bitmap && ((bitmap->getTexture() && !bitmap->isImmutable()) || |
| (bitmap->getSize() > bitmapSizeThreshold))) { |
| @@ -54,7 +53,6 @@ bool shouldDrawImmediately(const SkBitmap* bitmap, const SkPaint* paint, |
| } |
| return false; |
| } |
| -} |
| //----------------------------------------------------------------------------- |
| // DeferredPipeController |
| @@ -170,9 +168,10 @@ public: |
| virtual SkBaseDevice* onCreateDevice(const SkImageInfo&, Usage) SK_OVERRIDE; |
| +#ifdef SK_SUPPORT_LEGACY_WRITEPIXELSCONFIG |
| virtual void writePixels(const SkBitmap& bitmap, int x, int y, |
| SkCanvas::Config8888 config8888) SK_OVERRIDE; |
| - |
| +#endif |
| virtual SkSurface* newSurface(const SkImageInfo&) SK_OVERRIDE; |
| protected: |
| @@ -180,6 +179,7 @@ protected: |
| virtual bool onReadPixels(const SkBitmap& bitmap, |
| int x, int y, |
| SkCanvas::Config8888 config8888) SK_OVERRIDE; |
| + virtual bool onWritePixels(const SkImageInfo&, const void*, size_t, int x, int y) SK_OVERRIDE; |
| // The following methods are no-ops on a deferred device |
| virtual bool filterTextFlags(const SkPaint& paint, TextFlags*) SK_OVERRIDE { |
| @@ -478,8 +478,9 @@ void DeferredDevice::prepareForImmediatePixelWrite() { |
| fImmediateCanvas->flush(); |
| } |
| -void DeferredDevice::writePixels(const SkBitmap& bitmap, |
| - int x, int y, SkCanvas::Config8888 config8888) { |
| +#ifdef SK_SUPPORT_LEGACY_WRITEPIXELSCONFIG |
| +void DeferredDevice::writePixels(const SkBitmap& bitmap, int x, int y, |
| + SkCanvas::Config8888 config8888) { |
| if (x <= 0 && y <= 0 && (x + bitmap.width()) >= width() && |
| (y + bitmap.height()) >= height()) { |
| @@ -506,6 +507,22 @@ void DeferredDevice::writePixels(const SkBitmap& bitmap, |
| } |
| } |
| +#endif |
| + |
| +bool DeferredDevice::onWritePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes, |
| + int x, int y) { |
| + SkASSERT(x >= 0 && y >= 0); |
| + SkASSERT(info.width() <= width()); |
| + SkASSERT(info.height() <= height()); |
| + |
| + const SkImageInfo deviceInfo = this->imageInfo(); |
| + if (info.width() == deviceInfo.width() && info.height() == deviceInfo.height()) { |
|
Justin Novosad
2014/03/06 17:57:24
This logic has a built-in assumption that the sour
reed1
2014/03/06 20:21:29
I will update the above asserts to make that assum
|
| + this->skipPendingCommands(); |
| + } |
| + |
| + this->prepareForImmediatePixelWrite(); |
| + return immediateDevice()->onWritePixels(info, pixels, rowBytes, x, y); |
| +} |
| const SkBitmap& DeferredDevice::onAccessBitmap() { |
| this->flushPendingCommands(kNormal_PlaybackMode); |