| Index: src/core/SkCanvas.cpp
|
| diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
|
| index 04ecf139e684c32fa786e151def36ecf75260936..f09d2ab60d742db46a996c68463dcff340c98970 100644
|
| --- a/src/core/SkCanvas.cpp
|
| +++ b/src/core/SkCanvas.cpp
|
| @@ -1849,15 +1849,64 @@ 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 dx, SkScalar dy,
|
| + const SkPaint* paint) {
|
| TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawImage()");
|
| - image->draw(this, dx, dy, paint);
|
| +
|
| + SkRect bounds = SkRect::MakeXYWH(dx, dy, image->width(), image->height());
|
| + if (NULL == paint || paint->canComputeFastBounds()) {
|
| + if (NULL != paint) {
|
| + paint->computeFastBounds(bounds, &bounds);
|
| + }
|
| + if (this->quickReject(bounds)) {
|
| + return;
|
| + }
|
| + }
|
| +
|
| + SkLazyPaint lazy;
|
| + if (NULL == paint) {
|
| + paint = lazy.init();
|
| + }
|
| +
|
| + LOOPER_BEGIN(*paint, SkDrawFilter::kImage_Type, &bounds)
|
| +
|
| + while (iter.next()) {
|
| + SkPaint p = looper.paint();
|
| + p.setLooper(NULL);
|
| + image->draw(this, dx, dy, &p);
|
| + }
|
| +
|
| + 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 (NULL != paint) {
|
| + bounds = &paint->computeFastBounds(dst, &storage);
|
| + }
|
| + if (this->quickReject(*bounds)) {
|
| + return;
|
| + }
|
| + }
|
| +
|
| + SkLazyPaint lazy;
|
| + if (NULL == paint) {
|
| + paint = lazy.init();
|
| + }
|
| +
|
| + LOOPER_BEGIN(*paint, SkDrawFilter::kImage_Type, bounds)
|
| +
|
| + while (iter.next()) {
|
| + SkPaint p = looper.paint();
|
| + p.setLooper(NULL);
|
| + image->drawRect(this, src, dst, &p);
|
| + }
|
| +
|
| + LOOPER_END
|
| }
|
|
|
| void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, const SkPaint* paint) {
|
|
|