Index: cc/playback/image_hijack_canvas.cc |
diff --git a/cc/playback/image_hijack_canvas.cc b/cc/playback/image_hijack_canvas.cc |
index 8262d51bdbfe3d720bcf0096615ab04690e8c61f..bd26d3237c31fa9e9864a6317bcb6978344da80f 100644 |
--- a/cc/playback/image_hijack_canvas.cc |
+++ b/cc/playback/image_hijack_canvas.cc |
@@ -119,12 +119,20 @@ class ScopedImagePaint { |
SkPaint paint_; |
}; |
+const SkImage* GetImageInPaint(const SkPaint& paint) { |
+ SkShader* shader = paint.getShader(); |
+ return shader ? shader->isAImage(nullptr, nullptr) : nullptr; |
+} |
+ |
} // namespace |
ImageHijackCanvas::ImageHijackCanvas(int width, |
int height, |
- ImageDecodeCache* image_decode_cache) |
- : SkNWayCanvas(width, height), image_decode_cache_(image_decode_cache) {} |
+ ImageDecodeCache* image_decode_cache, |
+ const ImageIdFlatSet* images_to_skip) |
+ : SkNWayCanvas(width, height), |
+ image_decode_cache_(image_decode_cache), |
+ images_to_skip_(images_to_skip) {} |
void ImageHijackCanvas::onDrawPicture(const SkPicture* picture, |
const SkMatrix* matrix, |
@@ -139,10 +147,14 @@ void ImageHijackCanvas::onDrawImage(const SkImage* image, |
SkScalar y, |
const SkPaint* paint) { |
if (!image->isLazyGenerated()) { |
+ DCHECK(!ShouldSkipImage(image)); |
SkNWayCanvas::onDrawImage(image, x, y, paint); |
return; |
} |
+ if (ShouldSkipImage(image)) |
+ return; |
+ |
SkMatrix ctm = getTotalMatrix(); |
ScopedDecodedImageLock scoped_lock( |
@@ -173,10 +185,14 @@ void ImageHijackCanvas::onDrawImageRect(const SkImage* image, |
const SkPaint* paint, |
SrcRectConstraint constraint) { |
if (!image->isLazyGenerated()) { |
+ DCHECK(!ShouldSkipImage(image)); |
SkNWayCanvas::onDrawImageRect(image, src, dst, paint, constraint); |
return; |
} |
+ if (ShouldSkipImage(image)) |
+ return; |
+ |
SkRect src_storage; |
if (!src) { |
src_storage = SkRect::MakeIWH(image->width(), image->height()); |
@@ -209,6 +225,9 @@ void ImageHijackCanvas::onDrawImageRect(const SkImage* image, |
} |
void ImageHijackCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { |
+ if (ShouldSkipImageInPaint(paint)) |
+ return; |
+ |
base::Optional<ScopedImagePaint> image_paint = |
ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
if (!image_paint.has_value()) { |
@@ -219,6 +238,9 @@ void ImageHijackCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { |
} |
void ImageHijackCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { |
+ if (ShouldSkipImageInPaint(paint)) |
+ return; |
+ |
base::Optional<ScopedImagePaint> image_paint = |
ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
if (!image_paint.has_value()) { |
@@ -229,6 +251,9 @@ void ImageHijackCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { |
} |
void ImageHijackCanvas::onDrawOval(const SkRect& r, const SkPaint& paint) { |
+ if (ShouldSkipImageInPaint(paint)) |
+ return; |
+ |
base::Optional<ScopedImagePaint> image_paint = |
ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
if (!image_paint.has_value()) { |
@@ -243,6 +268,9 @@ void ImageHijackCanvas::onDrawArc(const SkRect& r, |
SkScalar sweep_angle, |
bool use_center, |
const SkPaint& paint) { |
+ if (ShouldSkipImageInPaint(paint)) |
+ return; |
+ |
base::Optional<ScopedImagePaint> image_paint = |
ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
if (!image_paint.has_value()) { |
@@ -254,6 +282,9 @@ void ImageHijackCanvas::onDrawArc(const SkRect& r, |
} |
void ImageHijackCanvas::onDrawRRect(const SkRRect& rr, const SkPaint& paint) { |
+ if (ShouldSkipImageInPaint(paint)) |
+ return; |
+ |
base::Optional<ScopedImagePaint> image_paint = |
ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
if (!image_paint.has_value()) { |
@@ -271,4 +302,13 @@ void ImageHijackCanvas::onDrawImageNine(const SkImage* image, |
NOTREACHED(); |
} |
+bool ImageHijackCanvas::ShouldSkipImage(const SkImage* image) const { |
+ return images_to_skip_->find(image->uniqueID()) != images_to_skip_->end(); |
+} |
+ |
+bool ImageHijackCanvas::ShouldSkipImageInPaint(const SkPaint& paint) const { |
+ const SkImage* image = GetImageInPaint(paint); |
+ return image ? ShouldSkipImage(image) : false; |
+} |
+ |
} // namespace cc |