| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/aura/window_occlusion_change_builder.h" |
| |
| #include "base/containers/flat_map.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "third_party/skia/include/core/SkRegion.h" |
| #include "ui/aura/window_tracker.h" |
| |
| namespace aura { |
| |
| // Provide updating of occlusion info on aura::Window. |
| class DefaultWindowOcclusionChangeBuilder |
| : public WindowOcclusionChangeBuilder { |
| public: |
| DefaultWindowOcclusionChangeBuilder() = default; |
| ~DefaultWindowOcclusionChangeBuilder() override { |
| while (!windows_.windows().empty()) { |
| Window* window = windows_.Pop(); |
| auto it = changes_.find(window); |
| if (it == changes_.end()) |
| continue; |
| |
| window->SetOcclusionInfo(it->second.occlusion_state, |
| it->second.occluded_region); |
| } |
| changes_.clear(); |
| } |
| |
| private: |
| struct OcclusionData { |
| Window::OcclusionState occlusion_state; |
| SkRegion occluded_region; |
| }; |
| |
| // WindowOcclusionChangeBuilder: |
| void Add(Window* window, |
| Window::OcclusionState occlusion_state, |
| SkRegion occluded_region) override { |
| // Change back to UNKNOWN is not allowed. |
| DCHECK_NE(occlusion_state, Window::OcclusionState::UNKNOWN); |
| |
| windows_.Add(window); |
| changes_[window] = {occlusion_state, occluded_region}; |
| } |
| |
| // Tracks live windows that has a change. This is needed in addition to the |
| // keys in |changes_| because the window tree may change while changes are |
| // accumulated or being applied. |
| WindowTracker windows_; |
| |
| // Stores the accumulated occlusion changes. |
| base::flat_map<Window*, OcclusionData> changes_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DefaultWindowOcclusionChangeBuilder); |
| }; |
| |
| // static |
| std::unique_ptr<WindowOcclusionChangeBuilder> |
| WindowOcclusionChangeBuilder::Create() { |
| return std::make_unique<DefaultWindowOcclusionChangeBuilder>(); |
| } |
| |
| } // namespace aura |