xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 1 | // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
James Cook | 108e612 | 2017-09-20 19:04:29 | [diff] [blame] | 5 | #include "ash/accessibility/focus_ring_layer.h" |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame^] | 6 | #include "ash/accessibility/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; |
| 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 | |
dmazzoni | 82a45a8 | 2016-06-03 22:33:47 | [diff] [blame] | 33 | FocusRingLayer::~FocusRingLayer() { |
| 34 | if (compositor_ && compositor_->HasAnimationObserver(this)) |
| 35 | compositor_->RemoveAnimationObserver(this); |
| 36 | } |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 37 | |
dmazzoni | 0672582d | 2017-04-03 19:22:40 | [diff] [blame] | 38 | void FocusRingLayer::SetColor(SkColor color) { |
| 39 | custom_color_ = color; |
| 40 | } |
| 41 | |
| 42 | void FocusRingLayer::ResetColor() { |
| 43 | custom_color_.reset(); |
| 44 | } |
| 45 | |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame^] | 46 | bool FocusRingLayer::CanAnimate() const { |
| 47 | return compositor_ && compositor_->HasAnimationObserver(this); |
| 48 | } |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 49 | |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame^] | 50 | int FocusRingLayer::GetInset() { |
| 51 | return kShadowRadius + 2; |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 52 | } |
| 53 | |
danakj | 85d970e | 2015-04-04 00:15:24 | [diff] [blame] | 54 | void FocusRingLayer::OnPaintLayer(const ui::PaintContext& context) { |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame^] | 55 | if (!root_window_ || layer_rect_.IsEmpty()) |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 56 | return; |
| 57 | |
weiliangc | a032f93b | 2015-07-13 22:39:47 | [diff] [blame] | 58 | ui::PaintRecorder recorder(context, layer_->size()); |
danakj | a91b108 | 2015-04-07 20:59:09 | [diff] [blame] | 59 | |
enne | 11266b8 | 2017-03-02 01:43:47 | [diff] [blame] | 60 | cc::PaintFlags flags; |
| 61 | flags.setAntiAlias(true); |
dmazzoni | 0672582d | 2017-04-03 19:22:40 | [diff] [blame] | 62 | flags.setColor(custom_color_ ? *custom_color_ : kShadowColor); |
enne | 11266b8 | 2017-03-02 01:43:47 | [diff] [blame] | 63 | flags.setStyle(cc::PaintFlags::kStroke_Style); |
| 64 | flags.setStrokeWidth(2); |
danakj | a91b108 | 2015-04-07 20:59:09 | [diff] [blame] | 65 | |
Katie Dektar | c0ad2ff | 2017-11-08 04:42:08 | [diff] [blame^] | 66 | gfx::Rect bounds = layer_rect_ - layer_->bounds().OffsetFromOrigin(); |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 67 | int r = kShadowRadius; |
| 68 | for (int i = 0; i < r; i++) { |
| 69 | // Fade out alpha quadratically. |
enne | 11266b8 | 2017-03-02 01:43:47 | [diff] [blame] | 70 | flags.setAlpha((kShadowAlpha * (r - i) * (r - i)) / (r * r)); |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 71 | gfx::Rect outsetRect = bounds; |
| 72 | outsetRect.Inset(-i, -i, -i, -i); |
enne | 11266b8 | 2017-03-02 01:43:47 | [diff] [blame] | 73 | recorder.canvas()->DrawRect(outsetRect, flags); |
dmazzoni@chromium.org | 34c526a | 2013-11-08 08:49:43 | [diff] [blame] | 74 | } |
xiyuan@chromium.org | efbcfdf | 2013-06-05 00:04:50 | [diff] [blame] | 75 | } |
| 76 | |
James Cook | 108e612 | 2017-09-20 19:04:29 | [diff] [blame] | 77 | } // namespace ash |