[go: nahoru, domu]

blob: 6c97a9b41718bef0b13250601c2bbe461e1f3cb8 [file] [log] [blame]
Avi Drissman3a215d1e2022-09-07 19:43:091// Copyright 2013 The Chromium Authors
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:502// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
David Tsengb774097e2021-03-24 17:31:105#include "ash/accessibility/ui/focus_ring_layer.h"
6#include "ash/accessibility/ui/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;
Scott Little40b0037c2022-07-08 22:23:5625const 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
David Tseng63e73872021-06-29 20:24:5133FocusRingLayer::~FocusRingLayer() = default;
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5034
dmazzoni0672582d2017-04-03 19:22:4035void FocusRingLayer::SetColor(SkColor color) {
36 custom_color_ = color;
37}
38
39void FocusRingLayer::ResetColor() {
40 custom_color_.reset();
41}
42
Katie Dektar9fa180d2017-11-14 23:45:3543int FocusRingLayer::GetInset() const {
Katie Dektarc0ad2ff2017-11-08 04:42:0844 return kShadowRadius + 2;
dmazzoni@chromium.org34c526a2013-11-08 08:49:4345}
46
danakj85d970e2015-04-04 00:15:2447void FocusRingLayer::OnPaintLayer(const ui::PaintContext& context) {
Katie Dektarc0ad2ff2017-11-08 04:42:0848 if (!root_window_ || layer_rect_.IsEmpty())
dmazzoni@chromium.org34c526a2013-11-08 08:49:4349 return;
50
weiliangca032f93b2015-07-13 22:39:4751 ui::PaintRecorder recorder(context, layer_->size());
danakja91b1082015-04-07 20:59:0952
enne11266b82017-03-02 01:43:4753 cc::PaintFlags flags;
54 flags.setAntiAlias(true);
dmazzoni0672582d2017-04-03 19:22:4055 flags.setColor(custom_color_ ? *custom_color_ : kShadowColor);
enne11266b82017-03-02 01:43:4756 flags.setStyle(cc::PaintFlags::kStroke_Style);
57 flags.setStrokeWidth(2);
danakja91b1082015-04-07 20:59:0958
Katie Dektarc0ad2ff2017-11-08 04:42:0859 gfx::Rect bounds = layer_rect_ - layer_->bounds().OffsetFromOrigin();
dmazzoni@chromium.org34c526a2013-11-08 08:49:4360 int r = kShadowRadius;
61 for (int i = 0; i < r; i++) {
62 // Fade out alpha quadratically.
Juanmi Huertas48873b52023-01-17 23:03:4363 flags.setAlphaf((kShadowAlpha * (r - i) * (r - i)) / (r * r) / 255.0f);
dmazzoni@chromium.org34c526a2013-11-08 08:49:4364 gfx::Rect outsetRect = bounds;
Xianzhu Wang549ddc42022-04-04 17:05:5565 outsetRect.Inset(-i);
enne11266b82017-03-02 01:43:4766 recorder.canvas()->DrawRect(outsetRect, flags);
dmazzoni@chromium.org34c526a2013-11-08 08:49:4367 }
xiyuan@chromium.orgefbcfdf2013-06-05 00:04:5068}
69
James Cook108e6122017-09-20 19:04:2970} // namespace ash