diff options
author | reed <reed@google.com> | 2015-05-05 12:54:33 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-05 12:54:33 -0700 |
commit | 14fe8fd3e53b5e988aac189a8bc3ed28904d85c8 (patch) | |
tree | 1f7f2259964a150606e18a4b27c131f76a53a244 /src/core/SkCanvas.cpp | |
parent | beedb81a7fa9bd1274d64b2c000ef6ee23c9a810 (diff) |
Make drawImage a virtual on SkDevice
Now with patch for SkDeferredCanvas
This reverts commit 119468b71f8f4f45657ab30ead331be665de5a57.
BUG=skia:
Review URL: https://codereview.chromium.org/1122643005
Diffstat (limited to 'src/core/SkCanvas.cpp')
-rw-r--r-- | src/core/SkCanvas.cpp | 56 |
1 files changed, 51 insertions, 5 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 3e3f714880..34d6aaa0ab 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1734,12 +1734,15 @@ void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) { this->onDrawPath(path, paint); } -void SkCanvas::drawImage(const SkImage* image, SkScalar dx, SkScalar dy, const SkPaint* paint) { - this->onDrawImage(image, dx, dy, paint); +void SkCanvas::drawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint* paint) { + this->onDrawImage(image, x, y, paint); } void SkCanvas::drawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint) { + if (dst.isEmpty()) { + return; + } this->onDrawImageRect(image, src, dst, paint); } @@ -1959,15 +1962,58 @@ void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { LOOPER_END } -void SkCanvas::onDrawImage(const SkImage* image, SkScalar dx, SkScalar dy, const SkPaint* paint) { +void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint* paint) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()"); - image->draw(this, dx, dy, paint); + SkRect bounds = SkRect::MakeXYWH(x, y, + SkIntToScalar(image->width()), SkIntToScalar(image->height())); + if (NULL == paint || paint->canComputeFastBounds()) { + if (paint) { + paint->computeFastBounds(bounds, &bounds); + } + if (this->quickReject(bounds)) { + return; + } + } + + SkLazyPaint lazy; + if (NULL == paint) { + paint = lazy.init(); + } + + LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, &bounds) + + while (iter.next()) { + iter.fDevice->drawImage(iter, image, x, y, looper.paint()); + } + + LOOPER_END } void SkCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImageRect()"); - image->drawRect(this, src, dst, paint); + SkRect storage; + const SkRect* bounds = &dst; + if (NULL == paint || paint->canComputeFastBounds()) { + if (paint) { + bounds = &paint->computeFastBounds(dst, &storage); + } + if (this->quickReject(*bounds)) { + return; + } + } + SkLazyPaint lazy; + if (NULL == paint) { + paint = lazy.init(); + } + + LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type, bounds) + + while (iter.next()) { + iter.fDevice->drawImageRect(iter, image, src, dst, looper.paint()); + } + + LOOPER_END } void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, const SkPaint* paint) { |