15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/painter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/effects/SkGradientShader.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/nine_image_painter.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/view.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// DashedFocusPainter ----------------------------------------------------------
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class DashedFocusPainter : public Painter {
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  explicit DashedFocusPainter(const gfx::Insets& insets);
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~DashedFocusPainter();
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Painter:
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void Paint(gfx::Canvas* canvas, const gfx::Size& size) OVERRIDE;
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const gfx::Insets insets_;
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DashedFocusPainter);
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)DashedFocusPainter::DashedFocusPainter(const gfx::Insets& insets)
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : insets_(insets) {
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)DashedFocusPainter::~DashedFocusPainter() {
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Size DashedFocusPainter::GetMinimumSize() const {
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return gfx::Size();
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void DashedFocusPainter::Paint(gfx::Canvas* canvas, const gfx::Size& size) {
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect rect(size);
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  rect.Inset(insets_);
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  canvas->DrawFocusRect(rect);
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// SolidFocusPainter -----------------------------------------------------------
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class SolidFocusPainter : public Painter {
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SolidFocusPainter(SkColor color, const gfx::Insets& insets);
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~SolidFocusPainter();
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Painter:
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void Paint(gfx::Canvas* canvas, const gfx::Size& size) OVERRIDE;
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const SkColor color_;
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const gfx::Insets insets_;
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SolidFocusPainter);
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SolidFocusPainter::SolidFocusPainter(SkColor color,
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                     const gfx::Insets& insets)
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : color_(color),
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      insets_(insets) {
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SolidFocusPainter::~SolidFocusPainter() {
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Size SolidFocusPainter::GetMinimumSize() const {
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return gfx::Size();
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SolidFocusPainter::Paint(gfx::Canvas* canvas, const gfx::Size& size) {
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect rect(size);
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  rect.Inset(insets_);
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  canvas->DrawSolidFocusRect(rect, color_);
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// GradientPainter ------------------------------------------------------------
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GradientPainter : public Painter {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GradientPainter(bool horizontal,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  SkColor* colors,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  SkScalar* pos,
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                  size_t count);
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~GradientPainter();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Painter:
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Paint(gfx::Canvas* canvas, const gfx::Size& size) OVERRIDE;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If |horizontal_| is true then the gradient is painted horizontally.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool horizontal_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The gradient colors.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SkColor[]> colors_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The relative positions of the corresponding gradient colors.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SkScalar[]> pos_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of elements in |colors_| and |pos_|.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t count_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GradientPainter);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)GradientPainter::GradientPainter(bool horizontal,
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 SkColor* colors,
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 SkScalar* pos,
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 size_t count)
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : horizontal_(horizontal),
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      colors_(new SkColor[count]),
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      pos_(new SkScalar[count]),
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      count_(count) {
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (size_t i = 0; i < count_; ++i) {
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    pos_[i] = pos[i];
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    colors_[i] = colors[i];
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)GradientPainter::~GradientPainter() {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size GradientPainter::GetMinimumSize() const {
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return gfx::Size();
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void GradientPainter::Paint(gfx::Canvas* canvas, const gfx::Size& size) {
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SkPaint paint;
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SkPoint p[2];
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  p[0].iset(0, 0);
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (horizontal_)
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    p[1].iset(size.width(), 0);
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    p[1].iset(0, size.height());
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  skia::RefPtr<SkShader> s = skia::AdoptRef(SkGradientShader::CreateLinear(
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      p, colors_.get(), pos_.get(), count_, SkShader::kClamp_TileMode));
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  paint.setStyle(SkPaint::kFill_Style);
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  paint.setShader(s.get());
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  canvas->sk_canvas()->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      SkIntToScalar(size.width()),
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      SkIntToScalar(size.height()), paint);
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// ImagePainter ---------------------------------------------------------------
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ImagePainter stores and paints nine images as a scalable grid.
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ImagePainter : public Painter {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Constructs an ImagePainter with the specified image resource ids.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // See CreateImageGridPainter()'s comment regarding image ID count and order.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ImagePainter(const int image_ids[]);
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Constructs an ImagePainter with the specified image and insets.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ImagePainter(const gfx::ImageSkia& image, const gfx::Insets& insets);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ImagePainter();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Painter:
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Paint(gfx::Canvas* canvas, const gfx::Size& size) OVERRIDE;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<gfx::NineImagePainter> nine_painter_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ImagePainter);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ImagePainter::ImagePainter(const int image_ids[])
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : nine_painter_(ui::CreateNineImagePainter(image_ids)) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ImagePainter::ImagePainter(const gfx::ImageSkia& image,
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const gfx::Insets& insets)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : nine_painter_(new gfx::NineImagePainter(image, insets)) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ImagePainter::~ImagePainter() {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size ImagePainter::GetMinimumSize() const {
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return nine_painter_->GetMinimumSize();
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ImagePainter::Paint(gfx::Canvas* canvas, const gfx::Size& size) {
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  nine_painter_->Paint(canvas, gfx::Rect(size));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Painter --------------------------------------------------------------------
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Painter::Painter() {
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Painter::~Painter() {
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Painter::PaintPainterAt(gfx::Canvas* canvas,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Painter* painter,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const gfx::Rect& rect) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(canvas && painter);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->Save();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->Translate(rect.OffsetFromOrigin());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  painter->Paint(canvas, rect.size());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->Restore();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void Painter::PaintFocusPainter(View* view,
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                gfx::Canvas* canvas,
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                Painter* focus_painter) {
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (focus_painter && view->HasFocus())
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    PaintPainterAt(canvas, focus_painter, view->GetLocalBounds());
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Painter* Painter::CreateHorizontalGradient(SkColor c1, SkColor c2) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor colors[2];
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  colors[0] = c1;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  colors[1] = c2;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkScalar pos[] = {0, 1};
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new GradientPainter(true, colors, pos, 2);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Painter* Painter::CreateVerticalGradient(SkColor c1, SkColor c2) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor colors[2];
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  colors[0] = c1;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  colors[1] = c2;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkScalar pos[] = {0, 1};
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new GradientPainter(false, colors, pos, 2);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Painter* Painter::CreateVerticalMultiColorGradient(SkColor* colors,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   SkScalar* pos,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   size_t count) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new GradientPainter(false, colors, pos, count);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Painter* Painter::CreateImagePainter(const gfx::ImageSkia& image,
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Insets& insets) {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new ImagePainter(image, insets);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Painter* Painter::CreateImageGridPainter(const int image_ids[]) {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new ImagePainter(image_ids);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_ptr<Painter> Painter::CreateDashedFocusPainter() {
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return scoped_ptr<Painter>(new DashedFocusPainter(gfx::Insets())).Pass();
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_ptr<Painter> Painter::CreateDashedFocusPainterWithInsets(
280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const gfx::Insets& insets) {
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return scoped_ptr<Painter>(new DashedFocusPainter(insets)).Pass();
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_ptr<Painter> Painter::CreateSolidFocusPainter(
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SkColor color,
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const gfx::Insets& insets) {
288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return scoped_ptr<Painter>(new SolidFocusPainter(color, insets)).Pass();
289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HorizontalPainter ----------------------------------------------------------
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HorizontalPainter::HorizontalPainter(const int image_resource_names[]) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 3; ++i)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    images_[i] = rb.GetImageNamed(image_resource_names[i]).ToImageSkia();
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_EQ(images_[LEFT]->height(), images_[CENTER]->height());
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK_EQ(images_[LEFT]->height(), images_[RIGHT]->height());
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)HorizontalPainter::~HorizontalPainter() {
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)gfx::Size HorizontalPainter::GetMinimumSize() const {
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return gfx::Size(
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      images_[LEFT]->width() + images_[CENTER]->width() +
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          images_[RIGHT]->width(), images_[LEFT]->height());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HorizontalPainter::Paint(gfx::Canvas* canvas, const gfx::Size& size) {
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (size.width() < GetMinimumSize().width())
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;  // No room to paint.
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->DrawImageInt(*images_[LEFT], 0, 0);
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  canvas->DrawImageInt(*images_[RIGHT], size.width() - images_[RIGHT]->width(),
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       0);
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  canvas->TileImageInt(
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      *images_[CENTER], images_[LEFT]->width(), 0,
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      size.width() - images_[LEFT]->width() - images_[RIGHT]->width(),
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      images_[LEFT]->height());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
324