7 #include "flutter/fml/logging.h"
14 subpass_state_.push_back(SubpassState{
26 return subpass_state_.back().clip_coverage.back().coverage;
30 return !subpass_state_.back().clip_coverage.empty();
35 subpass_state_.push_back(SubpassState{
39 .clip_height = clip_height},
42 next_replay_index_ = 0;
46 subpass_state_.pop_back();
47 next_replay_index_ = subpass_state_.back().rendered_clip_entities.size();
50 const std::vector<ClipCoverageLayer>
52 return subpass_state_.back().clip_coverage;
58 size_t clip_height_floor,
59 Point global_pass_position) {
62 auto& subpass_state = GetCurrentSubpassState();
63 switch (global_clip_coverage.
type) {
70 size_t previous_clip_height = 0;
71 if (!subpass_state.clip_coverage.empty()) {
72 previous_clip_height = subpass_state.clip_coverage.back().clip_height;
76 previous_clip_height = clip_height_floor;
79 if (!maybe_coverage.has_value()) {
84 auto op = maybe_coverage.value();
89 global_clip_coverage.
coverage.has_value() &&
90 global_clip_coverage.
coverage.value().Contains(op)) {
92 .
coverage = op, .clip_height = previous_clip_height + 1});
97 subpass_state.clip_coverage.push_back(
99 .clip_height = previous_clip_height + 1});
102 FML_DCHECK(subpass_state.clip_coverage.back().clip_height ==
103 subpass_state.clip_coverage.front().clip_height +
104 subpass_state.clip_coverage.size() - 1);
112 if (subpass_state.clip_coverage.back().clip_height <= restore_height) {
117 auto restoration_index =
118 restore_height - subpass_state.clip_coverage.front().clip_height;
119 FML_DCHECK(restoration_index < subpass_state.clip_coverage.size());
123 std::optional<Rect> restore_coverage =
124 (restoration_index + 1 < subpass_state.clip_coverage.size())
125 ? subpass_state.clip_coverage[restoration_index + 1].coverage
127 if (restore_coverage.has_value()) {
129 restore_coverage = restore_coverage->Shift(-global_pass_position);
131 subpass_state.clip_coverage.resize(restoration_index + 1);
135 if (subpass_state.clip_coverage.back().coverage.has_value()) {
144 subpass_state.clip_coverage.back().coverage);
152 std::optional<Rect> clip_coverage) {
153 auto& subpass_state = GetCurrentSubpassState();
158 FML_DCHECK(next_replay_index_ ==
159 subpass_state.rendered_clip_entities.size())
160 <<
"Not all clips have been replayed before appending new clip.";
161 subpass_state.rendered_clip_entities.push_back(
162 {.entity = entity.
Clone(), .clip_coverage = clip_coverage});
163 next_replay_index_++;
166 FML_DCHECK(next_replay_index_ <=
167 subpass_state.rendered_clip_entities.size());
168 if (!subpass_state.rendered_clip_entities.empty()) {
169 subpass_state.rendered_clip_entities.pop_back();
171 if (next_replay_index_ > subpass_state.rendered_clip_entities.size()) {
172 next_replay_index_ = subpass_state.rendered_clip_entities.size();
179 EntityPassClipStack::SubpassState&
180 EntityPassClipStack::GetCurrentSubpassState() {
181 return subpass_state_.back();
184 const std::vector<EntityPassClipStack::ReplayResult>&
186 return subpass_state_.back().rendered_clip_entities;
190 next_replay_index_ = 0;
195 if (next_replay_index_ >=
196 subpass_state_.back().rendered_clip_entities.size()) {
201 &subpass_state_.back().rendered_clip_entities[next_replay_index_];
208 next_replay_index_++;