Commit 90419216 authored by sammiequon's avatar sammiequon Committed by Commit bot

chromeos: Magnifier border is now more visible on light backgrounds.

Previously the partial magnifier border was difficult to see on white colored backgrounds. I add a textured layer instead of a solid color, so the border is outlined in black, so that it is visible on all backgrounds.

BUG=638996
TEST=none

https://screenshot.googleplex.com/htWDLX1Bxdp

Committed: https://crrev.com/da331ee46dfead28a5b2af2379f9fad320509957
Review-Url: https://codereview.chromium.org/2269383002
Cr-Original-Commit-Position: refs/heads/master@{#418785}
Cr-Commit-Position: refs/heads/master@{#419199}
parent bc10609f
......@@ -27,6 +27,12 @@ const float kMagnificationScale = 2.f;
const int kMagnifierRadius = 200;
// Size of the border around the magnifying glass in DIP.
const int kBorderSize = 10;
// Thickness of the outline around magnifying glass border in DIP.
const int kBorderOutlineThickness = 2;
// The color of the border and its outlines. The border has an outline on both
// sides, producing a black/white/black ring.
const SkColor kBorderColor = SK_ColorWHITE;
const SkColor kBorderOutlineColor = SK_ColorBLACK;
// Inset on the zoom filter.
const int kZoomInset = 0;
// Vertical offset between the center of the magnifier and the tip of the
......@@ -88,7 +94,7 @@ class PartialMagnificationController::ContentMask : public ui::LayerDelegate {
ui::Layer* layer() { return &layer_; }
private:
// Overridden from LayerDelegate.
// ui::LayerDelegate:
void OnPaintLayer(const ui::PaintContext& context) override {
ui::PaintRecorder recorder(context, layer()->size());
......@@ -119,6 +125,56 @@ class PartialMagnificationController::ContentMask : public ui::LayerDelegate {
DISALLOW_COPY_AND_ASSIGN(ContentMask);
};
// The border renderer draws the border as well as outline on both the outer and
// inner radius to increase visibility.
class PartialMagnificationController::BorderRenderer
: public ui::LayerDelegate {
public:
explicit BorderRenderer(const gfx::Rect& magnifier_bounds)
: magnifier_bounds_(magnifier_bounds) {}
~BorderRenderer() override {}
private:
// ui::LayerDelegate:
void OnPaintLayer(const ui::PaintContext& context) override {
ui::PaintRecorder recorder(context, magnifier_bounds_.size());
SkPaint paint;
paint.setAntiAlias(true);
paint.setStyle(SkPaint::kStroke_Style);
const int magnifier_radius = magnifier_bounds_.width() / 2;
// Draw the inner border.
paint.setStrokeWidth(kBorderSize);
paint.setColor(kBorderColor);
recorder.canvas()->DrawCircle(magnifier_bounds_.CenterPoint(),
magnifier_radius - kBorderSize / 2, paint);
// Draw border outer outline and then draw the border inner outline.
paint.setStrokeWidth(kBorderOutlineThickness);
paint.setColor(kBorderOutlineColor);
recorder.canvas()->DrawCircle(
magnifier_bounds_.CenterPoint(),
magnifier_radius - kBorderOutlineThickness / 2, paint);
recorder.canvas()->DrawCircle(
magnifier_bounds_.CenterPoint(),
magnifier_radius - kBorderSize + kBorderOutlineThickness / 2, paint);
}
void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {}
void OnDeviceScaleFactorChanged(float device_scale_factor) override {}
base::Closure PrepareForLayerBoundsChange() override {
return base::Closure();
}
gfx::Rect magnifier_bounds_;
DISALLOW_COPY_AND_ASSIGN(BorderRenderer);
};
PartialMagnificationController::PartialMagnificationController() {
Shell::GetInstance()->AddPreTargetHandler(this);
}
......@@ -262,9 +318,10 @@ void PartialMagnificationController::CreateMagnifierWindow(
zoom_layer_->SetBackgroundZoom(kMagnificationScale, kZoomInset);
root_layer->Add(zoom_layer_.get());
border_layer_.reset(new ui::Layer(ui::LayerType::LAYER_SOLID_COLOR));
border_layer_.reset(new ui::Layer(ui::LayerType::LAYER_TEXTURED));
border_layer_->SetBounds(gfx::Rect(GetWindowSize()));
border_layer_->SetColor(SK_ColorWHITE);
border_renderer_.reset(new BorderRenderer(gfx::Rect(GetWindowSize())));
border_layer_->set_delegate(border_renderer_.get());
root_layer->Add(border_layer_.get());
border_mask_.reset(new ContentMask(true, GetWindowSize()));
......
......@@ -47,6 +47,7 @@ class ASH_EXPORT PartialMagnificationController : public ui::EventHandler,
private:
friend class PartialMagnificationControllerTestApi;
class BorderRenderer;
class ContentMask;
// ui::EventHandler:
......@@ -84,6 +85,11 @@ class ASH_EXPORT PartialMagnificationController : public ui::EventHandler,
std::unique_ptr<ui::Layer> zoom_layer_;
// Draws an outline that is overlayed on top of |zoom_layer_|.
std::unique_ptr<ui::Layer> border_layer_;
// Draws a multicolored black/white/black border on top of |border_layer_|.
// This must be ordered after |border_layer_| so that it gets destroyed after
// |border_layer_|, otherwise |border_layer_| will have a pointer to a deleted
// delegate.
std::unique_ptr<BorderRenderer> border_renderer_;
// Masks the content of |zoom_layer_| so that only a circle is magnified.
std::unique_ptr<ContentMask> zoom_mask_;
// Masks the content of |border_layer_| so that only a circle outline is
......
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