diff options
Diffstat (limited to 'chromium/cc/paint/paint_op_buffer.h')
-rw-r--r-- | chromium/cc/paint/paint_op_buffer.h | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/chromium/cc/paint/paint_op_buffer.h b/chromium/cc/paint/paint_op_buffer.h index ef564407da9..24459b52dd3 100644 --- a/chromium/cc/paint/paint_op_buffer.h +++ b/chromium/cc/paint/paint_op_buffer.h @@ -12,10 +12,11 @@ #include <type_traits> #include "base/callback.h" +#include "base/check_op.h" #include "base/containers/stack_container.h" #include "base/debug/alias.h" -#include "base/logging.h" #include "base/memory/aligned_memory.h" +#include "base/notreached.h" #include "base/optional.h" #include "cc/base/math_util.h" #include "cc/paint/node_id.h" @@ -124,6 +125,7 @@ struct CC_PAINT_EXPORT PlaybackParams { SkMatrix original_ctm; CustomDataRasterCallback custom_callback; DidDrawOpCallback did_draw_op_callback; + base::Optional<bool> save_layer_alpha_should_preserve_lcd_text; }; class CC_PAINT_EXPORT PaintOp { @@ -252,6 +254,11 @@ class CC_PAINT_EXPORT PaintOp { int CountSlowPathsFromFlags() const { return 0; } bool HasNonAAPaint() const { return false; } + bool HasDrawTextOps() const { return false; } + bool HasSaveLayerAlphaOps() const { return false; } + // Returns true if effects are present that would break LCD text or be broken + // by the flags for SaveLayerAlpha to preserving LCD text. + bool HasEffectsPreventingLCDTextForSaveLayerAlpha() const { return false; } bool HasDiscardableImages() const { return false; } bool HasDiscardableImagesFromFlags() const { return false; } @@ -534,7 +541,7 @@ class CC_PAINT_EXPORT DrawImageRectOp final : public PaintOpWithFlags { const SkRect& src, const SkRect& dst, const PaintFlags* flags, - PaintCanvas::SrcRectConstraint constraint); + SkCanvas::SrcRectConstraint constraint); ~DrawImageRectOp(); static void RasterWithFlags(const DrawImageRectOp* op, const PaintFlags* flags, @@ -552,7 +559,7 @@ class CC_PAINT_EXPORT DrawImageRectOp final : public PaintOpWithFlags { PaintImage image; SkRect src; SkRect dst; - PaintCanvas::SrcRectConstraint constraint; + SkCanvas::SrcRectConstraint constraint; private: DrawImageRectOp(); @@ -672,6 +679,9 @@ class CC_PAINT_EXPORT DrawRecordOp final : public PaintOp { bool HasDiscardableImages() const; int CountSlowPaths() const; bool HasNonAAPaint() const; + bool HasDrawTextOps() const; + bool HasSaveLayerAlphaOps() const; + bool HasEffectsPreventingLCDTextForSaveLayerAlpha() const; HAS_SERIALIZATION_FUNCTIONS(); sk_sp<const PaintRecord> record; @@ -759,6 +769,7 @@ class CC_PAINT_EXPORT DrawTextBlobOp final : public PaintOpWithFlags { SkCanvas* canvas, const PlaybackParams& params); bool IsValid() const { return flags.IsValid(); } + bool HasDrawTextOps() const { return true; } static bool AreEqual(const PaintOp* left, const PaintOp* right); HAS_SERIALIZATION_FUNCTIONS(); @@ -835,6 +846,10 @@ class CC_PAINT_EXPORT SaveLayerOp final : public PaintOpWithFlags { bool IsValid() const { return flags.IsValid() && IsValidOrUnsetRect(bounds); } static bool AreEqual(const PaintOp* left, const PaintOp* right); bool HasNonAAPaint() const { return false; } + // We simply assume any effects (or even no effects -- just starting an empty + // transparent layer) would break LCD text or be broken by the flags for + // SaveLayerAlpha to preserve LCD text. + bool HasEffectsPreventingLCDTextForSaveLayerAlpha() const { return true; } HAS_SERIALIZATION_FUNCTIONS(); SkRect bounds; @@ -853,6 +868,7 @@ class CC_PAINT_EXPORT SaveLayerAlphaOp final : public PaintOp { const PlaybackParams& params); bool IsValid() const { return IsValidOrUnsetRect(bounds); } static bool AreEqual(const PaintOp* left, const PaintOp* right); + bool HasSaveLayerAlphaOps() const { return true; } HAS_SERIALIZATION_FUNCTIONS(); SkRect bounds; @@ -985,6 +1001,16 @@ class CC_PAINT_EXPORT PaintOpBuffer : public SkRefCnt { bool HasNonAAPaint() const { return has_non_aa_paint_; } bool HasDiscardableImages() const { return has_discardable_images_; } + bool has_draw_ops() const { return has_draw_ops_; } + bool has_draw_text_ops() const { return has_draw_text_ops_; } + bool has_save_layer_alpha_ops() const { return has_save_layer_alpha_ops_; } + bool has_effects_preventing_lcd_text_for_save_layer_alpha() const { + return has_effects_preventing_lcd_text_for_save_layer_alpha_; + } + + bool NeedsAdditionalInvalidationForLCDText( + const PaintOpBuffer& old_buffer) const; + bool operator==(const PaintOpBuffer& other) const; bool operator!=(const PaintOpBuffer& other) const { return !(*this == other); @@ -1047,6 +1073,12 @@ class CC_PAINT_EXPORT PaintOpBuffer : public SkRefCnt { subrecord_bytes_used_ += op->AdditionalBytesUsed(); subrecord_op_count_ += op->AdditionalOpCount(); + + has_draw_ops_ |= op->IsDrawOp(); + has_draw_text_ops_ |= op->HasDrawTextOps(); + has_save_layer_alpha_ops_ |= op->HasSaveLayerAlphaOps(); + has_effects_preventing_lcd_text_for_save_layer_alpha_ |= + op->HasEffectsPreventingLCDTextForSaveLayerAlpha(); } template <typename T> @@ -1263,15 +1295,19 @@ class CC_PAINT_EXPORT PaintOpBuffer : public SkRefCnt { size_t reserved_ = 0; size_t op_count_ = 0; - // Record paths for veto-to-msaa for gpu raster. - int num_slow_paths_ = 0; // Record additional bytes used by referenced sub-records and display lists. size_t subrecord_bytes_used_ = 0; // Record total op count of referenced sub-record and display lists. size_t subrecord_op_count_ = 0; + // Record paths for veto-to-msaa for gpu raster. + int num_slow_paths_ = 0; bool has_non_aa_paint_ : 1; bool has_discardable_images_ : 1; + bool has_draw_ops_ : 1; + bool has_draw_text_ops_ : 1; + bool has_save_layer_alpha_ops_ : 1; + bool has_effects_preventing_lcd_text_for_save_layer_alpha_ : 1; }; } // namespace cc |