55 size_t clip_height_floor,
56 Point global_pass_position) {
59 auto& subpass_state = GetCurrentSubpassState();
60 switch (global_clip_coverage.
type) {
67 size_t previous_clip_height = 0;
68 if (!subpass_state.clip_coverage.empty()) {
69 previous_clip_height = subpass_state.clip_coverage.back().clip_height;
73 previous_clip_height = clip_height_floor;
76 subpass_state.clip_coverage.push_back(
78 .clip_height = previous_clip_height + 1});
79 result.clip_did_change =
true;
81 FML_DCHECK(subpass_state.clip_coverage.back().clip_height ==
82 subpass_state.clip_coverage.front().clip_height +
83 subpass_state.clip_coverage.size() - 1);
85 if (!op.has_value()) {
96 if (subpass_state.clip_coverage.back().clip_height <= restore_height) {
101 auto restoration_index =
102 restore_height - subpass_state.clip_coverage.front().clip_height;
103 FML_DCHECK(restoration_index < subpass_state.clip_coverage.size());
107 std::optional<Rect> restore_coverage =
108 (restoration_index + 1 < subpass_state.clip_coverage.size())
109 ? subpass_state.clip_coverage[restoration_index + 1].coverage
111 if (restore_coverage.has_value()) {
113 restore_coverage = restore_coverage->Shift(-global_pass_position);
115 subpass_state.clip_coverage.resize(restoration_index + 1);
116 result.clip_did_change =
true;
119 if (subpass_state.clip_coverage.back().coverage.has_value()) {
127#ifdef IMPELLER_ENABLE_CAPTURE
129 auto element_entity_coverage = entity.
GetCoverage();
130 if (element_entity_coverage.has_value()) {
131 element_entity_coverage =
132 element_entity_coverage->Shift(global_pass_position);
133 entity.
GetCapture().AddRect(
"Coverage", *element_entity_coverage,
140 subpass_state.clip_coverage.back().coverage);
142 result.should_render =
true;
size_t GetRestoreHeight() const
ClipStateResult ApplyClipState(Contents::ClipCoverage global_clip_coverage, Entity &entity, size_t clip_height_floor, Point global_pass_position)
Applies the current clip state to an Entity. If the given Entity is a clip operation,...
std::optional< Rect > coverage