Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/magnifier/partial_magnification_controller.h" | 5 #include "ash/magnifier/partial_magnification_controller.h" |
| 6 | 6 |
| 7 #include "ash/shell.h" | 7 #include "ash/shell.h" |
| 8 #include "ui/aura/window_event_dispatcher.h" | 8 #include "ui/aura/window_event_dispatcher.h" |
| 9 #include "ui/aura/window_tree_host.h" | 9 #include "ui/aura/window_tree_host.h" |
| 10 #include "ui/compositor/layer.h" | 10 #include "ui/compositor/layer.h" |
| 11 #include "ui/compositor/paint_recorder.h" | 11 #include "ui/compositor/paint_recorder.h" |
| 12 #include "ui/events/event.h" | 12 #include "ui/events/event.h" |
| 13 #include "ui/events/event_constants.h" | 13 #include "ui/events/event_constants.h" |
| 14 #include "ui/views/widget/widget.h" | 14 #include "ui/views/widget/widget.h" |
| 15 #include "ui/wm/core/coordinate_conversion.h" | 15 #include "ui/wm/core/coordinate_conversion.h" |
| 16 | 16 |
| 17 namespace ash { | 17 namespace ash { |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 // Ratio of magnifier scale. | 20 // Ratio of magnifier scale. |
| 21 const float kMagnificationScale = 2.f; | 21 const float kMagnificationScale = 2.f; |
| 22 // Radius of the magnifying glass in DIP. | 22 // Radius of the magnifying glass in DIP. |
| 23 const int kMagnifierRadius = 200; | 23 const int kMagnifierRadius = 200; |
| 24 // Size of the border around the magnifying glass in DIP. | 24 // Size of the border around the magnifying glass in DIP. |
| 25 const int kBorderSize = 10; | 25 const int kBorderSize = 10; |
| 26 // Thickness of the outline around magnifiying glass border. | |
|
jdufault
2016/08/26 22:56:46
specify units (DIP)
sammiequon
2016/08/29 17:28:25
Done.
| |
| 27 const int kBorderOutlineThickness = 2; | |
| 28 const SkColor kBorderColor = SK_ColorWHITE; | |
| 29 const SkColor kBorderOutlineColor = SK_ColorBLACK; | |
| 26 // Inset on the zoom filter. | 30 // Inset on the zoom filter. |
| 27 const int kZoomInset = 0; | 31 const int kZoomInset = 0; |
| 28 // Vertical offset between the center of the magnifier and the tip of the | 32 // Vertical offset between the center of the magnifier and the tip of the |
| 29 // pointer. TODO(jdufault): The vertical offset should only apply to the window | 33 // pointer. TODO(jdufault): The vertical offset should only apply to the window |
| 30 // location, not the magnified contents. See crbug.com/637617. | 34 // location, not the magnified contents. See crbug.com/637617. |
| 31 const int kVerticalOffset = 0; | 35 const int kVerticalOffset = 0; |
| 32 | 36 |
| 33 // Name of the magnifier window. | 37 // Name of the magnifier window. |
| 34 const char kPartialMagniferWindowName[] = "PartialMagnifierWindow"; | 38 const char kPartialMagniferWindowName[] = "PartialMagnifierWindow"; |
| 35 | 39 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 67 layer_.set_delegate(this); | 71 layer_.set_delegate(this); |
| 68 layer_.SetFillsBoundsOpaquely(false); | 72 layer_.SetFillsBoundsOpaquely(false); |
| 69 layer_.SetBounds(gfx::Rect(mask_bounds)); | 73 layer_.SetBounds(gfx::Rect(mask_bounds)); |
| 70 } | 74 } |
| 71 | 75 |
| 72 ~ContentMask() override { layer_.set_delegate(nullptr); } | 76 ~ContentMask() override { layer_.set_delegate(nullptr); } |
| 73 | 77 |
| 74 ui::Layer* layer() { return &layer_; } | 78 ui::Layer* layer() { return &layer_; } |
| 75 | 79 |
| 76 private: | 80 private: |
| 77 // Overridden from LayerDelegate. | 81 // ui::LayerDelegate. |
| 78 void OnPaintLayer(const ui::PaintContext& context) override { | 82 void OnPaintLayer(const ui::PaintContext& context) override { |
| 79 ui::PaintRecorder recorder(context, layer()->size()); | 83 ui::PaintRecorder recorder(context, layer()->size()); |
| 80 | 84 |
| 81 SkPaint paint; | 85 SkPaint paint; |
| 82 paint.setAlpha(255); | 86 paint.setAlpha(255); |
| 83 paint.setAntiAlias(true); | 87 paint.setAntiAlias(true); |
| 84 paint.setStrokeWidth(kBorderSize); | 88 paint.setStrokeWidth(kBorderSize); |
| 85 paint.setStyle(stroke_ ? SkPaint::kStroke_Style : SkPaint::kFill_Style); | 89 paint.setStyle(stroke_ ? SkPaint::kStroke_Style : SkPaint::kFill_Style); |
| 86 | 90 |
| 87 gfx::Rect rect(layer()->bounds().size()); | 91 gfx::Rect rect(layer()->bounds().size()); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 98 base::Closure PrepareForLayerBoundsChange() override { | 102 base::Closure PrepareForLayerBoundsChange() override { |
| 99 return base::Closure(); | 103 return base::Closure(); |
| 100 } | 104 } |
| 101 | 105 |
| 102 ui::Layer layer_; | 106 ui::Layer layer_; |
| 103 bool stroke_; | 107 bool stroke_; |
| 104 | 108 |
| 105 DISALLOW_COPY_AND_ASSIGN(ContentMask); | 109 DISALLOW_COPY_AND_ASSIGN(ContentMask); |
| 106 }; | 110 }; |
| 107 | 111 |
| 112 // The border render draws the border as well as outline on both the outer and | |
| 113 // inner radius to increase visibility. | |
| 114 class PartialMagnificationController::BorderRenderer | |
| 115 : public ui::LayerDelegate { | |
|
jdufault
2016/08/26 22:56:46
Is this from git cl format? Can you run it just in
sammiequon
2016/08/29 17:28:26
Yes, ran it again. It is 81 long if one line.
| |
| 116 public: | |
| 117 BorderRenderer(const gfx::Rect& bounds) : bounds_(bounds) {} | |
| 118 | |
| 119 ~BorderRenderer() override {} | |
| 120 | |
| 121 private: | |
| 122 // ui::LayerDelegate. | |
| 123 void OnPaintLayer(const ui::PaintContext& context) override { | |
| 124 ui::PaintRecorder recorder(context, bounds_.size()); | |
| 125 | |
| 126 // Draw the border. | |
|
jdufault
2016/08/26 22:56:46
What about adding inner to make it more clear that
sammiequon
2016/08/29 17:28:26
Done.
| |
| 127 SkPaint paint; | |
| 128 paint.setAntiAlias(true); | |
| 129 paint.setStrokeWidth(kBorderSize); | |
| 130 paint.setStyle(SkPaint::kStroke_Style); | |
|
jdufault
2016/08/26 22:56:46
Move all of the common paint config options away f
sammiequon
2016/08/29 17:28:25
Done.
| |
| 131 paint.setColor(kBorderColor); | |
| 132 recorder.canvas()->DrawCircle(bounds_.CenterPoint(), | |
| 133 bounds_.width() / 2 - kBorderSize / 2, paint); | |
| 134 | |
| 135 paint.setStrokeWidth(kBorderOutlineThickness); | |
| 136 paint.setColor(kBorderOutlineColor); | |
| 137 // Draw border outer outline. | |
|
jdufault
2016/08/26 22:56:46
What about moving these comments above setStrokeWi
sammiequon
2016/08/29 17:28:25
Done.
| |
| 138 recorder.canvas()->DrawCircle( | |
| 139 bounds_.CenterPoint(), | |
| 140 bounds_.width() / 2 - kBorderOutlineThickness / 2, paint); | |
| 141 // Draw border inner outline. | |
| 142 recorder.canvas()->DrawCircle( | |
| 143 bounds_.CenterPoint(), | |
| 144 bounds_.width() / 2 - kBorderSize + kBorderOutlineThickness / 2, paint); | |
| 145 } | |
| 146 | |
| 147 void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {} | |
| 148 | |
| 149 void OnDeviceScaleFactorChanged(float device_scale_factor) override {} | |
| 150 | |
| 151 base::Closure PrepareForLayerBoundsChange() override { | |
| 152 return base::Closure(); | |
| 153 } | |
| 154 | |
| 155 gfx::Rect bounds_; | |
| 156 | |
| 157 DISALLOW_COPY_AND_ASSIGN(BorderRenderer); | |
| 158 }; | |
| 159 | |
| 108 PartialMagnificationController::PartialMagnificationController() { | 160 PartialMagnificationController::PartialMagnificationController() { |
| 109 Shell::GetInstance()->AddPreTargetHandler(this); | 161 Shell::GetInstance()->AddPreTargetHandler(this); |
| 110 } | 162 } |
| 111 | 163 |
| 112 PartialMagnificationController::~PartialMagnificationController() { | 164 PartialMagnificationController::~PartialMagnificationController() { |
| 113 CloseMagnifierWindow(); | 165 CloseMagnifierWindow(); |
| 114 | 166 |
| 115 Shell::GetInstance()->RemovePreTargetHandler(this); | 167 Shell::GetInstance()->RemovePreTargetHandler(this); |
| 116 } | 168 } |
| 117 | 169 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 236 aura::Window* window = host_widget_->GetNativeView(); | 288 aura::Window* window = host_widget_->GetNativeView(); |
| 237 window->SetName(kPartialMagniferWindowName); | 289 window->SetName(kPartialMagniferWindowName); |
| 238 | 290 |
| 239 ui::Layer* root_layer = host_widget_->GetNativeView()->layer(); | 291 ui::Layer* root_layer = host_widget_->GetNativeView()->layer(); |
| 240 | 292 |
| 241 zoom_layer_.reset(new ui::Layer(ui::LayerType::LAYER_SOLID_COLOR)); | 293 zoom_layer_.reset(new ui::Layer(ui::LayerType::LAYER_SOLID_COLOR)); |
| 242 zoom_layer_->SetBounds(gfx::Rect(GetWindowSize())); | 294 zoom_layer_->SetBounds(gfx::Rect(GetWindowSize())); |
| 243 zoom_layer_->SetBackgroundZoom(kMagnificationScale, kZoomInset); | 295 zoom_layer_->SetBackgroundZoom(kMagnificationScale, kZoomInset); |
| 244 root_layer->Add(zoom_layer_.get()); | 296 root_layer->Add(zoom_layer_.get()); |
| 245 | 297 |
| 246 border_layer_.reset(new ui::Layer(ui::LayerType::LAYER_SOLID_COLOR)); | 298 border_layer_.reset(new ui::Layer(ui::LayerType::LAYER_TEXTURED)); |
| 247 border_layer_->SetBounds(gfx::Rect(GetWindowSize())); | 299 border_layer_->SetBounds(gfx::Rect(GetWindowSize())); |
| 248 border_layer_->SetColor(SK_ColorWHITE); | 300 border_layer_->set_delegate(new BorderRenderer(gfx::Rect(GetWindowSize()))); |
| 249 root_layer->Add(border_layer_.get()); | 301 root_layer->Add(border_layer_.get()); |
| 250 | 302 |
| 251 border_mask_.reset(new ContentMask(true, GetWindowSize())); | 303 border_mask_.reset(new ContentMask(true, GetWindowSize())); |
| 252 border_layer_->SetMaskLayer(border_mask_->layer()); | 304 border_layer_->SetMaskLayer(border_mask_->layer()); |
| 253 | 305 |
| 254 zoom_mask_.reset(new ContentMask(false, GetWindowSize())); | 306 zoom_mask_.reset(new ContentMask(false, GetWindowSize())); |
| 255 zoom_layer_->SetMaskLayer(zoom_mask_->layer()); | 307 zoom_layer_->SetMaskLayer(zoom_mask_->layer()); |
| 256 | 308 |
| 257 host_widget_->AddObserver(this); | 309 host_widget_->AddObserver(this); |
| 258 } | 310 } |
| 259 | 311 |
| 260 void PartialMagnificationController::CloseMagnifierWindow() { | 312 void PartialMagnificationController::CloseMagnifierWindow() { |
| 261 if (host_widget_) { | 313 if (host_widget_) { |
| 262 RemoveZoomWidgetObservers(); | 314 RemoveZoomWidgetObservers(); |
| 263 host_widget_->Close(); | 315 host_widget_->Close(); |
| 264 host_widget_ = nullptr; | 316 host_widget_ = nullptr; |
| 265 } | 317 } |
| 266 } | 318 } |
| 267 | 319 |
| 268 void PartialMagnificationController::RemoveZoomWidgetObservers() { | 320 void PartialMagnificationController::RemoveZoomWidgetObservers() { |
| 269 DCHECK(host_widget_); | 321 DCHECK(host_widget_); |
| 270 host_widget_->RemoveObserver(this); | 322 host_widget_->RemoveObserver(this); |
| 271 aura::Window* root_window = host_widget_->GetNativeView()->GetRootWindow(); | 323 aura::Window* root_window = host_widget_->GetNativeView()->GetRootWindow(); |
| 272 DCHECK(root_window); | 324 DCHECK(root_window); |
| 273 root_window->RemoveObserver(this); | 325 root_window->RemoveObserver(this); |
| 274 } | 326 } |
| 275 | 327 |
| 276 } // namespace ash | 328 } // namespace ash |
| OLD | NEW |