[go: nahoru, domu]

blob: 355658d157c358b2211ff6ab0dd39deff296a693 [file] [log] [blame]
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:501// 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 Cook108e6122017-09-20 19:04:295#include "ash/accessibility/focus_ring_layer.h"
Katie Dektarc0ad2ff2017-11-08 04:42:086#include "ash/accessibility/accessibility_layer.h"
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:507
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:508#include "ui/aura/window.h"
dmazzoni82a45a82016-06-03 22:33:479#include "ui/compositor/compositor_animation_observer.h"
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5010#include "ui/compositor/layer.h"
danakja91b1082015-04-07 20:59:0911#include "ui/compositor/paint_recorder.h"
dmazzoni82a45a82016-06-03 22:33:4712#include "ui/display/display.h"
13#include "ui/display/screen.h"
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5014#include "ui/gfx/canvas.h"
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5015
dmazzoni82a45a82016-06-03 22:33:4716namespace ui {
17class Compositor;
18}
19
James Cook108e6122017-09-20 19:04:2920namespace ash {
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5021
22namespace {
23
dmazzoni@chromium.org34c526a2013-11-08 08:49:4324const int kShadowRadius = 10;
25const int kShadowAlpha = 90;
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5026const SkColor kShadowColor = SkColorSetRGB(77, 144, 254);
27
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5028} // namespace
29
Katie Dektarc0ad2ff2017-11-08 04:42:0830FocusRingLayer::FocusRingLayer(AccessibilityLayerDelegate* delegate)
31 : AccessibilityLayer(delegate) {}
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5032
dmazzoni82a45a82016-06-03 22:33:4733FocusRingLayer::~FocusRingLayer() {
34 if (compositor_ && compositor_->HasAnimationObserver(this))
35 compositor_->RemoveAnimationObserver(this);
36}
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5037
dmazzoni0672582d2017-04-03 19:22:4038void FocusRingLayer::SetColor(SkColor color) {
39 custom_color_ = color;
40}
41
42void FocusRingLayer::ResetColor() {
43 custom_color_.reset();
44}
45
Katie Dektarc0ad2ff2017-11-08 04:42:0846bool FocusRingLayer::CanAnimate() const {
47 return compositor_ && compositor_->HasAnimationObserver(this);
48}
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5049
Katie Dektarc0ad2ff2017-11-08 04:42:0850int FocusRingLayer::GetInset() {
51 return kShadowRadius + 2;
dmazzoni@chromium.org34c526a2013-11-08 08:49:4352}
53
danakj85d970e2015-04-04 00:15:2454void FocusRingLayer::OnPaintLayer(const ui::PaintContext& context) {
Katie Dektarc0ad2ff2017-11-08 04:42:0855 if (!root_window_ || layer_rect_.IsEmpty())
dmazzoni@chromium.org34c526a2013-11-08 08:49:4356 return;
57
weiliangca032f93b2015-07-13 22:39:4758 ui::PaintRecorder recorder(context, layer_->size());
danakja91b1082015-04-07 20:59:0959
enne11266b82017-03-02 01:43:4760 cc::PaintFlags flags;
61 flags.setAntiAlias(true);
dmazzoni0672582d2017-04-03 19:22:4062 flags.setColor(custom_color_ ? *custom_color_ : kShadowColor);
enne11266b82017-03-02 01:43:4763 flags.setStyle(cc::PaintFlags::kStroke_Style);
64 flags.setStrokeWidth(2);
danakja91b1082015-04-07 20:59:0965
Katie Dektarc0ad2ff2017-11-08 04:42:0866 gfx::Rect bounds = layer_rect_ - layer_->bounds().OffsetFromOrigin();
dmazzoni@chromium.org34c526a2013-11-08 08:49:4367 int r = kShadowRadius;
68 for (int i = 0; i < r; i++) {
69 // Fade out alpha quadratically.
enne11266b82017-03-02 01:43:4770 flags.setAlpha((kShadowAlpha * (r - i) * (r - i)) / (r * r));
dmazzoni@chromium.org34c526a2013-11-08 08:49:4371 gfx::Rect outsetRect = bounds;
72 outsetRect.Inset(-i, -i, -i, -i);
enne11266b82017-03-02 01:43:4773 recorder.canvas()->DrawRect(outsetRect, flags);
dmazzoni@chromium.org34c526a2013-11-08 08:49:4374 }
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5075}
76
James Cook108e6122017-09-20 19:04:2977} // namespace ash