diff options
author | 2015-05-06 07:54:38 -0700 | |
---|---|---|
committer | 2015-05-06 07:54:38 -0700 | |
commit | 620ba3afe09d4173c87537040fe50c1c1895fb1a (patch) | |
tree | 0f0fb4d37186651d783bd794390f950e7adaaac0 /src/utils | |
parent | 7882924c10fadaed427b6aa65dc7aa6577b94f32 (diff) |
Revert of Revert of Make drawImage a virtual on SkDevice (patchset #1 id:1 of https://codereview.chromium.org/1124003002/)
Reason for revert:
retry now that some fixes (onDrawImage overrides) have landed in chrome/blink
Original issue's description:
> Revert of Make drawImage a virtual on SkDevice (patchset #4 id:60001 of https://codereview.chromium.org/1122643005/)
>
> Reason for revert:
> speculative to see if it unblocks DEPS roll
>
> Original issue's description:
> > Make drawImage a virtual on SkDevice
> >
> > Now with patch for SkDeferredCanvas
> >
> > This reverts commit 119468b71f8f4f45657ab30ead331be665de5a57.
> >
> > BUG=skia:
> >
> > Committed: https://skia.googlesource.com/skia/+/14fe8fd3e53b5e988aac189a8bc3ed28904d85c8
>
> TBR=robertphillips@google.com,mtklein@google.com,reed@google.com
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/3538e3bfe2e00bc1b5b48d977fa7adff64d8c96b
TBR=robertphillips@google.com,mtklein@google.com,reed@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review URL: https://codereview.chromium.org/1126273002
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/SkDeferredCanvas.cpp | 59 |
1 files changed, 52 insertions, 7 deletions
diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index d5cf97bd04..7e4539a5a7 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -32,10 +32,17 @@ enum PlaybackMode { kSilent_PlaybackMode, }; -static bool should_draw_immediately(const SkBitmap* bitmap, const SkPaint* paint, - size_t bitmapSizeThreshold) { +static uint64_t image_area(const SkImage* image) { + return sk_64_mul(image->width(), image->height()); +} + +static bool should_draw_immediately(const SkBitmap* bitmap, const SkImage* image, + const SkPaint* paint, size_t bitmapSizeThreshold) { if (bitmap && ((bitmap->getTexture() && !bitmap->isImmutable()) || - (bitmap->getSize() > bitmapSizeThreshold))) { + (bitmap->getSize() > bitmapSizeThreshold))) { + return true; + } + if (image && (image_area(image) > bitmapSizeThreshold)) { return true; } if (paint) { @@ -202,6 +209,11 @@ protected: void drawSprite(const SkDraw&, const SkBitmap& bitmap, int x, int y, const SkPaint& paint) override {SkASSERT(0);} + void drawImage(const SkDraw&, const SkImage*, SkScalar, SkScalar, const SkPaint&) override + {SkASSERT(0);} + void drawImageRect(const SkDraw&, const SkImage*, const SkRect*, const SkRect&, + const SkPaint&) override + {SkASSERT(0);} void drawText(const SkDraw&, const void* text, size_t len, SkScalar x, SkScalar y, const SkPaint& paint) override {SkASSERT(0);} @@ -481,11 +493,15 @@ class AutoImmediateDrawIfNeeded { public: AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkBitmap* bitmap, const SkPaint* paint) { - this->init(canvas, bitmap, paint); + this->init(canvas, bitmap, NULL, paint); + } + AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkImage* image, + const SkPaint* paint) { + this->init(canvas, NULL, image, paint); } AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkPaint* paint) { - this->init(canvas, NULL, paint); + this->init(canvas, NULL, NULL, paint); } ~AutoImmediateDrawIfNeeded() { @@ -494,9 +510,10 @@ public: } } private: - void init(SkDeferredCanvas& canvas, const SkBitmap* bitmap, const SkPaint* paint) { + void init(SkDeferredCanvas& canvas, const SkBitmap* bitmap, const SkImage* image, + const SkPaint* paint) { if (canvas.isDeferredDrawing() && - should_draw_immediately(bitmap, paint, canvas.getBitmapSizeThreshold())) { + should_draw_immediately(bitmap, image, paint, canvas.getBitmapSizeThreshold())) { canvas.setDeferredDrawing(false); fCanvas = &canvas; } else { @@ -836,6 +853,34 @@ void SkDeferredCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* sr this->recordedDrawCommand(); } + +void SkDeferredCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, + const SkPaint* paint) { + SkRect bounds = SkRect::MakeXYWH(x, y, + SkIntToScalar(image->width()), SkIntToScalar(image->height())); + if (fDeferredDrawing && + this->isFullFrame(&bounds, paint) && + isPaintOpaque(paint, image)) { + this->getDeferredDevice()->skipPendingCommands(); + } + + AutoImmediateDrawIfNeeded autoDraw(*this, image, paint); + this->drawingCanvas()->drawImage(image, x, y, paint); + this->recordedDrawCommand(); +} +void SkDeferredCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, + const SkPaint* paint) { + if (fDeferredDrawing && + this->isFullFrame(&dst, paint) && + isPaintOpaque(paint, image)) { + this->getDeferredDevice()->skipPendingCommands(); + } + + AutoImmediateDrawIfNeeded autoDraw(*this, image, paint); + this->drawingCanvas()->drawImageRect(image, src, dst, paint); + this->recordedDrawCommand(); +} + void SkDeferredCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, const SkPaint* paint) { |