forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
raster_scale_controller.cc
119 lines (96 loc) · 3.37 KB
/
raster_scale_controller.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/wm/raster_scale_controller.h"
#include <memory>
#include "ash/public/cpp/window_properties.h"
#include "ash/shell.h"
#include "ui/aura/client/aura_constants.h"
namespace ash {
ScopedSetRasterScale::ScopedSetRasterScale(aura::Window* window,
float raster_scale)
: window_(window), raster_scale_(raster_scale) {
window_->AddObserver(this);
Shell::Get()->raster_scale_controller()->PushRasterScale(window_,
raster_scale_);
}
ScopedSetRasterScale::~ScopedSetRasterScale() {
Shutdown();
}
void ScopedSetRasterScale::UpdateScale(float raster_scale) {
if (window_) {
auto* controller = Shell::Get()->raster_scale_controller();
controller->PushRasterScale(window_, raster_scale);
controller->PopRasterScale(window_, raster_scale_);
}
raster_scale_ = raster_scale;
}
// static
void ScopedSetRasterScale::SetOrUpdateRasterScale(
aura::Window* window,
float raster_scale,
std::unique_ptr<ScopedSetRasterScale>* p) {
if (*p) {
DCHECK_EQ(window, (*p)->window_);
(*p)->UpdateScale(raster_scale);
} else {
*p = std::make_unique<ScopedSetRasterScale>(window, raster_scale);
}
}
void ScopedSetRasterScale::Shutdown() {
if (window_) {
Shell::Get()->raster_scale_controller()->PopRasterScale(window_,
raster_scale_);
window_->RemoveObserver(this);
window_ = nullptr;
}
}
void ScopedSetRasterScale::OnWindowDestroying(aura::Window* window) {
DCHECK_EQ(window_, window);
Shutdown();
}
RasterScaleController::RasterScaleController() = default;
RasterScaleController::~RasterScaleController() = default;
void RasterScaleController::PushRasterScale(aura::Window* window,
float raster_scale) {
if (!windows_observation_.IsObservingSource(window)) {
windows_observation_.AddObservation(window);
}
window_scales_[window].push_back(raster_scale);
window->SetProperty(aura::client::kRasterScale,
GetRasterScaleForWindow(window));
}
void RasterScaleController::PopRasterScale(aura::Window* window,
float raster_scale) {
auto iter = window_scales_.find(window);
// This may happen if the window has been destroyed.
if (iter == window_scales_.end()) {
return;
}
auto& scales = iter->second;
DCHECK(base::Contains(scales, raster_scale));
base::Erase(scales, raster_scale);
if (scales.empty()) {
window_scales_.erase(window);
windows_observation_.RemoveObservation(window);
}
window->SetProperty(aura::client::kRasterScale,
GetRasterScaleForWindow(window));
}
float RasterScaleController::GetRasterScaleForWindow(aura::Window* window) {
auto iter = window_scales_.find(window);
if (iter == window_scales_.end()) {
return 1.0f;
}
DCHECK(!iter->second.empty());
float raster_scale = 0.0;
for (auto scale : iter->second) {
raster_scale = std::max(raster_scale, scale);
}
return raster_scale;
}
void RasterScaleController::OnWindowDestroying(aura::Window* window) {
windows_observation_.RemoveObservation(window);
window_scales_.erase(window);
}
} // namespace ash