diff options
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/SkDeferredCanvas.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index 06f7bb089a..c20aa62b00 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -866,6 +866,43 @@ void SkDeferredCanvas::drawBitmapNine(const SkBitmap& bitmap, this->recordedDrawCommand(); } +void SkDeferredCanvas::drawImage(const SkImage* image, SkScalar left, SkScalar top, + const SkPaint* paint) { + SkRect imageRect = SkRect::MakeXYWH(left, top, + SkIntToScalar(image->width()), SkIntToScalar(image->height())); + bool isImageOpaque = image->isOpaque(); + SkPaintBitmapOpacity pct = isImageOpaque + ? kOpaque_SkPaintBitmapOpacity : kUnknown_SkPaintBitmapOpacity; + + if (fDeferredDrawing && + this->isFullFrame(&imageRect, paint) && + (isImageOpaque ||isPaintOpaque(paint, pct))) { + this->getDeferredDevice()->skipPendingCommands(); + } + + AutoImmediateDrawIfNeeded autoDraw(*this, paint); + this->drawingCanvas()->drawImage(image, left, top, paint); + this->recordedDrawCommand(); +} + +void SkDeferredCanvas::drawImageRect(const SkImage* image, const SkRect* src, + const SkRect& dst, + const SkPaint* paint) { + bool isImageOpaque = image->isOpaque(); + SkPaintBitmapOpacity pct = isImageOpaque + ? kOpaque_SkPaintBitmapOpacity : kUnknown_SkPaintBitmapOpacity; + + if (fDeferredDrawing && + this->isFullFrame(&dst, paint) && + (isImageOpaque || isPaintOpaque(paint, pct))) { + this->getDeferredDevice()->skipPendingCommands(); + } + + AutoImmediateDrawIfNeeded autoDraw(*this, paint); + this->drawingCanvas()->drawImageRect(image, src, dst, paint); + this->recordedDrawCommand(); +} + void SkDeferredCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, const SkPaint* paint) { SkRect bitmapRect = SkRect::MakeXYWH( |