aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-05-06 07:54:38 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-05-06 07:54:38 -0700
commit620ba3afe09d4173c87537040fe50c1c1895fb1a (patch)
tree0f0fb4d37186651d783bd794390f950e7adaaac0 /src/utils
parent7882924c10fadaed427b6aa65dc7aa6577b94f32 (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.cpp59
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) {