Index: cc/paint/paint_op_buffer.h |
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h |
index d4d69387d21c4e61cef501707f9cef65324a5205..69a8f59679a5ff7845cd956d818eb936bd8ee977 100644 |
--- a/cc/paint/paint_op_buffer.h |
+++ b/cc/paint/paint_op_buffer.h |
@@ -88,6 +88,9 @@ struct CC_PAINT_EXPORT PaintOp { |
int CountSlowPaths() const { return 0; } |
int CountSlowPathsFromFlags() const { return 0; } |
+ bool HasDiscardableImages() const { return false; } |
+ bool HasDiscardableImagesFromFlags() const { return false; } |
+ |
// Returns the number of bytes used by this op in referenced sub records |
// and display lists. This doesn't count other objects like paths or blobs. |
size_t AdditionalBytesUsed() const { return 0; } |
@@ -103,6 +106,14 @@ struct CC_PAINT_EXPORT PaintOpWithFlags : PaintOp { |
explicit PaintOpWithFlags(const PaintFlags& flags) : flags(flags) {} |
int CountSlowPathsFromFlags() const { return flags.getPathEffect() ? 1 : 0; } |
+ bool HasDiscardableImagesFromFlags() const { |
+ if (!IsDrawOp()) |
+ return false; |
+ |
+ SkShader* shader = flags.getShader(); |
+ SkImage* image = shader ? shader->isAImage(nullptr, nullptr) : nullptr; |
+ return image && image->isLazyGenerated(); |
+ } |
PaintFlags flags; |
}; |
@@ -340,6 +351,7 @@ struct CC_PAINT_EXPORT DrawDisplayItemListOp final : PaintOp { |
SkCanvas* canvas, |
const SkMatrix& original_ctm); |
size_t AdditionalBytesUsed() const; |
+ bool HasDiscardableImages() const; |
// TODO(enne): DisplayItemList should know number of slow paths. |
scoped_refptr<DisplayItemList> list; |
@@ -371,6 +383,7 @@ struct CC_PAINT_EXPORT DrawImageOp final : PaintOpWithFlags { |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
const SkMatrix& original_ctm); |
+ bool HasDiscardableImages() const; |
PaintImage image; |
SkScalar left; |
@@ -389,6 +402,7 @@ struct CC_PAINT_EXPORT DrawImageRectOp final : PaintOpWithFlags { |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
const SkMatrix& original_ctm); |
+ bool HasDiscardableImages() const; |
PaintImage image; |
SkRect src; |
@@ -476,6 +490,7 @@ struct CC_PAINT_EXPORT DrawRecordOp final : PaintOp { |
SkCanvas* canvas, |
const SkMatrix& original_ctm); |
size_t AdditionalBytesUsed() const; |
+ bool HasDiscardableImages() const; |
sk_sp<const PaintRecord> record; |
}; |
@@ -654,6 +669,7 @@ class CC_PAINT_EXPORT PaintOpBuffer : public SkRefCnt { |
return sizeof(*this) + reserved_ + subrecord_bytes_used_; |
} |
int numSlowPaths() const { return num_slow_paths_; } |
+ bool HasDiscardableImages() const { return has_discardable_images_; } |
// Resize the PaintOpBuffer to exactly fit the current amount of used space. |
void ShrinkToFit(); |
@@ -816,6 +832,9 @@ class CC_PAINT_EXPORT PaintOpBuffer : public SkRefCnt { |
num_slow_paths_ += op->CountSlowPathsFromFlags(); |
num_slow_paths_ += op->CountSlowPaths(); |
+ has_discardable_images_ |= op->HasDiscardableImages(); |
+ has_discardable_images_ |= op->HasDiscardableImagesFromFlags(); |
+ |
subrecord_bytes_used_ += op->AdditionalBytesUsed(); |
} |
@@ -831,6 +850,7 @@ class CC_PAINT_EXPORT PaintOpBuffer : public SkRefCnt { |
int num_slow_paths_ = 0; |
// Record additional bytes used by referenced sub-records and display lists. |
size_t subrecord_bytes_used_ = 0; |
+ bool has_discardable_images_ = false; |
SkRect cull_rect_; |
DISALLOW_COPY_AND_ASSIGN(PaintOpBuffer); |