Commit 0f6c1bd7 authored by Anastasia Helfinstein's avatar Anastasia Helfinstein Committed by Commit Bot

Add support for two color accessibility focus rings

This change is to support the Switch Access focus ring style described
in this spec: https://gallery.googleplex.com/projects/MCHbtQVoQ2HCZQBEKUk1sS_U/files/MCHtA7U1iMGr6-mR9r6ArPGAjSutDL__KP4

Bug: 925103
Change-Id: I6aeda730fd8717282cb49867840010aea7a92f83
Reviewed-on: https://chromium-review.googlesource.com/c/1435435
Commit-Queue: Anastasia Helfinstein <anastasi@google.com>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#626224}
parent 773e8566
......@@ -10,7 +10,6 @@
#include "third_party/skia/include/core/SkPath.h"
#include "ui/aura/window.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/paint_recorder.h"
#include "ui/gfx/canvas.h"
namespace ash {
......@@ -20,10 +19,8 @@ namespace {
// The number of pixels in the color gradient that fades to transparent.
const int kGradientWidth = 6;
// The color of the focus ring. In the future this might be a parameter.
const int kFocusRingColorRed = 247;
const int kFocusRingColorGreen = 152;
const int kFocusRingColorBlue = 58;
// The default color of the focus ring.
const SkColor kDefaultFocusRingColor = SkColorSetARGB(255, 247, 152, 58);
int sign(int x) {
return ((x > 0) ? 1 : (x == 0) ? 0 : -1);
......@@ -106,6 +103,15 @@ void AccessibilityFocusRingLayer::Set(const AccessibilityFocusRing& ring) {
CreateOrUpdateLayer(root_window, "AccessibilityFocusRing", bounds);
}
void AccessibilityFocusRingLayer::EnableDoubleFocusRing(
SkColor secondary_color) {
secondary_color_ = secondary_color;
}
void AccessibilityFocusRingLayer::DisableDoubleFocusRing() {
secondary_color_.reset();
}
void AccessibilityFocusRingLayer::OnPaintLayer(
const ui::PaintContext& context) {
ui::PaintRecorder recorder(context, layer()->size());
......@@ -115,11 +121,33 @@ void AccessibilityFocusRingLayer::OnPaintLayer(
flags.setStyle(cc::PaintFlags::kStroke_Style);
flags.setStrokeWidth(2);
if (secondary_color_)
DrawDoubleFocusRing(recorder, flags);
else
DrawFocusRing(recorder, flags);
}
void AccessibilityFocusRingLayer::DrawDoubleFocusRing(
ui::PaintRecorder& recorder,
cc::PaintFlags& flags) {
SkColor base_color =
has_custom_color() ? custom_color() : kDefaultFocusRingColor;
SkPath path;
gfx::Vector2d offset = layer()->bounds().OffsetFromOrigin();
flags.setColor(base_color);
path = MakePath(ring_, 0, offset);
recorder.canvas()->DrawPath(path, flags);
flags.setColor(*(secondary_color_));
path = MakePath(ring_, 2, offset);
recorder.canvas()->DrawPath(path, flags);
}
void AccessibilityFocusRingLayer::DrawFocusRing(ui::PaintRecorder& recorder,
cc::PaintFlags& flags) {
SkColor base_color =
has_custom_color()
? custom_color()
: SkColorSetARGB(255, kFocusRingColorRed, kFocusRingColorGreen,
kFocusRingColorBlue);
has_custom_color() ? custom_color() : kDefaultFocusRingColor;
SkPath path;
gfx::Vector2d offset = layer()->bounds().OffsetFromOrigin();
......
......@@ -9,6 +9,7 @@
#include "ash/accessibility/focus_ring_layer.h"
#include "ash/ash_export.h"
#include "base/macros.h"
#include "ui/compositor/paint_recorder.h"
namespace ash {
......@@ -23,12 +24,20 @@ class ASH_EXPORT AccessibilityFocusRingLayer : public FocusRingLayer {
// Create the layer and update its bounds and position in the hierarchy.
void Set(const AccessibilityFocusRing& ring);
void EnableDoubleFocusRing(SkColor secondary_color);
void DisableDoubleFocusRing();
private:
// ui::LayerDelegate overrides:
void OnPaintLayer(const ui::PaintContext& context) override;
void DrawFocusRing(ui::PaintRecorder& recorder, cc::PaintFlags& flags);
void DrawDoubleFocusRing(ui::PaintRecorder& recorder, cc::PaintFlags& flags);
// The outline of the current focus ring.
AccessibilityFocusRing ring_;
// The secondary color, if there is a double focus ring.
base::Optional<SkColor> secondary_color_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityFocusRingLayer);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment