summaryrefslogtreecommitdiff
path: root/chromium/cc/paint/paint_op_buffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/paint/paint_op_buffer.h')
-rw-r--r--chromium/cc/paint/paint_op_buffer.h46
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