Avi Drissman | 3a215d1e | 2022-09-07 19:43:09 | [diff] [blame] | 1 | // Copyright 2013 The Chromium Authors |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
David Tseng | b774097e | 2021-03-24 17:31:10 | [diff] [blame] | 5 | #include "ash/accessibility/ui/focus_ring_layer.h" |
| 6 | #include "ash/accessibility/ui/accessibility_layer.h" |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 7 | |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 8 | #include "ui/aura/window.h" |
dmazzoni | 82a45a8 | 2016-06-03 22:33:47 | [diff] [blame] | 9 | #include "ui/compositor/compositor_animation_observer.h" |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 10 | #include "ui/compositor/layer.h" |
danakj | a91b108 | 2015-04-07 20:59:09 | [diff] [blame] | 11 | #include "ui/compositor/paint_recorder.h" |
dmazzoni | 82a45a8 | 2016-06-03 22:33:47 | [diff] [blame] | 12 | #include "ui/display/display.h" |
| 13 | #include "ui/display/screen.h" |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 14 | #include "ui/gfx/canvas.h" |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 15 | |
dmazzoni | 82a45a8 | 2016-06-03 22:33:47 | [diff] [blame] | 16 | namespace ui { |
| 17 | class Compositor; |
| 18 | } |
| 19 | |
James Cook | 108e612 | 2017-09-20 19:04:29 | [diff] [blame] | 20 | namespace ash { |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 21 | |
| 22 | namespace { |
| 23 | |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 24 | const int kShadowRadius = 10; |
Scott Little | 40b0037c | 2022-07-08 22:23:56 | [diff] [blame] | 25 | const int kShadowAlpha = 90; |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 26 | const SkColor kShadowColor = SkColorSetRGB(77, 144, 254); |
| 27 | |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 28 | } // namespace |
| 29 | |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame] | 30 | FocusRingLayer::FocusRingLayer(AccessibilityLayerDelegate* delegate) |
| 31 | : AccessibilityLayer(delegate) {} |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 32 | |
David Tseng | 63e7387 | 2021-06-29 20:24:51 | [diff] [blame] | 33 | FocusRingLayer::~FocusRingLayer() = default; |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 34 | |
dmazzoni | 0672582d | 2017-04-03 19:22:40 | [diff] [blame] | 35 | void FocusRingLayer::SetColor(SkColor color) { |
| 36 | custom_color_ = color; |
| 37 | } |
| 38 | |
| 39 | void FocusRingLayer::ResetColor() { |
| 40 | custom_color_.reset(); |
| 41 | } |
| 42 | |
Katie Dektar | 9fa180d | 2017-11-14 23:45:35 | [diff] [blame] | 43 | int FocusRingLayer::GetInset() const { |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame] | 44 | return kShadowRadius + 2; |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 45 | } |
| 46 | |
danakj | 85d970e | 2015-04-04 00:15:24 | [diff] [blame] | 47 | void FocusRingLayer::OnPaintLayer(const ui::PaintContext& context) { |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame] | 48 | if (!root_window_ || layer_rect_.IsEmpty()) |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 49 | return; |
| 50 | |
weiliangc | a032f93b | 2015-07-13 22:39:47 | [diff] [blame] | 51 | ui::PaintRecorder recorder(context, layer_->size()); |
danakj | a91b108 | 2015-04-07 20:59:09 | [diff] [blame] | 52 | |
enne | 11266b8 | 2017-03-02 01:43:47 | [diff] [blame] | 53 | cc::PaintFlags flags; |
| 54 | flags.setAntiAlias(true); |
dmazzoni | 0672582d | 2017-04-03 19:22:40 | [diff] [blame] | 55 | flags.setColor(custom_color_ ? *custom_color_ : kShadowColor); |
enne | 11266b8 | 2017-03-02 01:43:47 | [diff] [blame] | 56 | flags.setStyle(cc::PaintFlags::kStroke_Style); |
| 57 | flags.setStrokeWidth(2); |
danakj | a91b108 | 2015-04-07 20:59:09 | [diff] [blame] | 58 | |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame] | 59 | gfx::Rect bounds = layer_rect_ - layer_->bounds().OffsetFromOrigin(); |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 60 | int r = kShadowRadius; |
| 61 | for (int i = 0; i < r; i++) { |
| 62 | // Fade out alpha quadratically. |
Juanmi Huertas | 48873b5 | 2023-01-17 23:03:43 | [diff] [blame] | 63 | flags.setAlphaf((kShadowAlpha * (r - i) * (r - i)) / (r * r) / 255.0f); |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 64 | gfx::Rect outsetRect = bounds; |
Xianzhu Wang | 549ddc4 | 2022-04-04 17:05:55 | [diff] [blame] | 65 | outsetRect.Inset(-i); |
enne | 11266b8 | 2017-03-02 01:43:47 | [diff] [blame] | 66 | recorder.canvas()->DrawRect(outsetRect, flags); |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 67 | } |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 68 | } |
| 69 | |
James Cook | 108e612 | 2017-09-20 19:04:29 | [diff] [blame] | 70 | } // namespace ash |