1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/helper.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/effects/SkBlurMaskFilter.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/skia/include/effects/SkGradientShader.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas_skia.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/border.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/painter.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkColor kScreenTopColor = SkColorSetRGB(250, 251, 251);
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkColor kScreenBottomColor = SkColorSetRGB(204, 209, 212);
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkColor kScreenShadowColor = SkColorSetARGB(64, 34, 54, 115);
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkColor kShadowStrokeColor = 0;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kScreenShadow = 10;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void DrawRoundedRect(
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gfx::Canvas* canvas,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int x, int y,
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int w, int h,
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int corner_radius,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkColor top_color, SkColor bottom_color,
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkColor stroke_color) {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkRect rect;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rect.set(
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkIntToScalar(x), SkIntToScalar(y),
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkIntToScalar(x + w), SkIntToScalar(y + h));
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkPath path;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  path.addRoundRect(
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      rect, SkIntToScalar(corner_radius), SkIntToScalar(corner_radius));
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkPaint paint;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  paint.setStyle(SkPaint::kFill_Style);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  paint.setFlags(SkPaint::kAntiAlias_Flag);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (top_color != bottom_color) {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkPoint p[2];
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p[0].set(SkIntToScalar(x), SkIntToScalar(y));
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p[1].set(SkIntToScalar(x), SkIntToScalar(y + h));
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkColor colors[2] = { top_color, bottom_color };
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkShader* s =
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SkGradientShader::CreateLinear(p, colors, NULL, 2,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       SkShader::kClamp_TileMode, NULL);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setShader(s);
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Need to unref shader, otherwise never deleted.
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    s->unref();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setColor(top_color);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  canvas->AsCanvasSkia()->drawPath(path, paint);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (stroke_color != 0) {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Expand rect by 0.5px so resulting stroke will take the whole pixel.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rect.set(
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SkIntToScalar(x) - SK_ScalarHalf,
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SkIntToScalar(y) - SK_ScalarHalf,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SkIntToScalar(x + w) + SK_ScalarHalf,
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SkIntToScalar(y + h) + SK_ScalarHalf);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setShader(NULL);
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setStyle(SkPaint::kStroke_Style);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setStrokeWidth(SkIntToScalar(SK_Scalar1));
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setColor(stroke_color);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    canvas->AsCanvasSkia()->drawRoundRect(
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      rect,
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkIntToScalar(corner_radius), SkIntToScalar(corner_radius),
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      paint);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void DrawRoundedRectShadow(
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gfx::Canvas* canvas,
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int x, int y,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int w, int h,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int corner_radius,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int shadow,
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkColor color) {
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkPaint paint;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  paint.setFlags(SkPaint::kAntiAlias_Flag);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  paint.setStyle(SkPaint::kFill_Style);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  paint.setColor(color);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkMaskFilter* filter = SkBlurMaskFilter::Create(
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      shadow / 2, SkBlurMaskFilter::kNormal_BlurStyle);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  paint.setMaskFilter(filter)->unref();
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkRect rect;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rect.set(
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkIntToScalar(x + shadow / 2), SkIntToScalar(y + shadow / 2),
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkIntToScalar(x + w - shadow / 2), SkIntToScalar(y + h - shadow / 2));
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  canvas->AsCanvasSkia()->drawRoundRect(
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      rect,
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkIntToScalar(corner_radius), SkIntToScalar(corner_radius),
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      paint);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  paint.setMaskFilter(NULL);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void DrawRectWithBorder(int w,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               int h,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               const BorderDefinition* const border,
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               gfx::Canvas* canvas) {
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int padding = border->padding;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor padding_color = border->padding_color;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int shadow = border->shadow;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor shadow_color = border->shadow_color;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int corner_radius = border->corner_radius;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor top_color = border->top_color;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor bottom_color = border->bottom_color;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (padding > 0) {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SkPaint paint;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    paint.setColor(padding_color);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    canvas->AsCanvasSkia()->drawRectCoords(
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(w), SkIntToScalar(h),
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        paint);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (border->shadow > 0) {
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DrawRoundedRectShadow(
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        canvas,
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        padding, padding,
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        w - 2 * padding, h - 2 * padding,
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        corner_radius,
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        shadow, shadow_color);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DrawRoundedRect(
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        canvas,
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        padding + shadow,
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        padding + shadow - shadow / 3,
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        w - 2 * padding - 2 * shadow,
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        h - 2 * padding - 2 * shadow,
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        corner_radius,
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        top_color, bottom_color,
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        shadow ? kShadowStrokeColor : 0);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This Painter can be used to draw a background consistent cross all login
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// screens. It draws a rect with padding, shadow and rounded corners.
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RoundedRectPainter : public views::Painter {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit RoundedRectPainter(const BorderDefinition* const border)
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : border_(border) {
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Paint(int w, int h, gfx::Canvas* canvas) {
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DrawRectWithBorder(w, h, border_, canvas);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BorderDefinition* const border_;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(RoundedRectPainter);
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This border can be used to draw shadow and rounded corners across all
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// login screens.
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RoundedRectBorder : public views::Border {
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit RoundedRectBorder(const BorderDefinition* const border)
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : border_(border) {
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Paint(const views::View& view, gfx::Canvas* canvas) const;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void GetInsets(gfx::Insets* insets) const;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BorderDefinition* const border_;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(RoundedRectBorder);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RoundedRectBorder::Paint(const views::View& view,
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              gfx::Canvas* canvas) const {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't paint anything. RoundedRectBorder is used to provide insets only.
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RoundedRectBorder::GetInsets(gfx::Insets* insets) const {
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(insets);
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int shadow = border_->shadow;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int inset = border_->corner_radius / 2 + border_->padding + shadow;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  insets->Set(inset - shadow / 3, inset, inset + shadow / 3, inset);
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Simple solid round background.
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RoundedBackground : public views::Background {
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  explicit RoundedBackground(int corner_radius,
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             int stroke_width,
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             const SkColor& background_color,
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             const SkColor& stroke_color)
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : corner_radius_(corner_radius),
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        stroke_width_(stroke_width),
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        stroke_color_(stroke_color) {
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SetNativeControlColor(background_color);
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Paint(gfx::Canvas* canvas, views::View* view) const {
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SkRect rect;
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    rect.iset(0, 0, view->width(), view->height());
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SkPath path;
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    path.addRoundRect(rect,
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      SkIntToScalar(corner_radius_),
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      SkIntToScalar(corner_radius_));
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Draw interior.
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SkPaint paint;
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    paint.setStyle(SkPaint::kFill_Style);
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    paint.setFlags(SkPaint::kAntiAlias_Flag);
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    paint.setColor(get_color());
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    canvas->AsCanvasSkia()->drawPath(path, paint);
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Redraw boundary region with correspoinding color.
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    paint.setStyle(SkPaint::kStroke_Style);
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    paint.setStrokeWidth(SkIntToScalar(stroke_width_));
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    paint.setColor(stroke_color_);
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    canvas->AsCanvasSkia()->drawPath(path, paint);
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int corner_radius_;
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int stroke_width_;
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SkColor stroke_color_;
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(RoundedBackground);
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst BorderDefinition BorderDefinition::kScreenBorder = {
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  0,
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SK_ColorBLACK,
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  kScreenShadow,
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  kScreenShadowColor,
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login::kScreenCornerRadius,
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  kScreenTopColor,
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  kScreenBottomColor
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst BorderDefinition BorderDefinition::kUserBorder = {
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  0,
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SK_ColorBLACK,
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  0,
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  kScreenShadowColor,
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  login::kUserCornerRadius,
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  kScreenTopColor,
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  kScreenBottomColor
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::Painter* CreateWizardPainter(const BorderDefinition* const border) {
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new RoundedRectPainter(border);
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::Border* CreateWizardBorder(const BorderDefinition* const border) {
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new RoundedRectBorder(border);
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickviews::Background* CreateRoundedBackground(int corner_radius,
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int stroke_width,
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           SkColor background_color,
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           SkColor stroke_color) {
2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return new RoundedBackground(
2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      corner_radius, stroke_width, background_color, stroke_color);
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
266