1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_NATIVE_THEME_NATIVE_THEME_BASE_H_
6#define UI_NATIVE_THEME_NATIVE_THEME_BASE_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "skia/ext/platform_canvas.h"
11#include "ui/native_theme/native_theme.h"
12
13namespace gfx {
14class ImageSkia;
15class Rect;
16class Size;
17}
18
19namespace ui {
20
21// Theme support for non-Windows toolkits.
22class NATIVE_THEME_EXPORT NativeThemeBase : public NativeTheme {
23 public:
24  // NativeTheme implementation:
25  virtual gfx::Size GetPartSize(Part part,
26                                State state,
27                                const ExtraParams& extra) const OVERRIDE;
28  virtual void Paint(SkCanvas* canvas,
29                     Part part,
30                     State state,
31                     const gfx::Rect& rect,
32                     const ExtraParams& extra) const OVERRIDE;
33
34 protected:
35  NativeThemeBase();
36  virtual ~NativeThemeBase();
37
38  // Draw the arrow. Used by scrollbar and inner spin button.
39  virtual void PaintArrowButton(
40      SkCanvas* gc,
41      const gfx::Rect& rect,
42      Part direction,
43      State state) const;
44  // Paint the scrollbar track. Done before the thumb so that it can contain
45  // alpha.
46  virtual void PaintScrollbarTrack(
47      SkCanvas* canvas,
48      Part part,
49      State state,
50      const ScrollbarTrackExtraParams& extra_params,
51      const gfx::Rect& rect) const;
52  // Draw the scrollbar thumb over the track.
53  virtual void PaintScrollbarThumb(
54      SkCanvas* canvas,
55      Part part,
56      State state,
57      const gfx::Rect& rect) const;
58
59  virtual void PaintCheckbox(
60      SkCanvas* canvas,
61      State state,
62      const gfx::Rect& rect,
63      const ButtonExtraParams& button) const;
64
65  virtual void PaintRadio(
66      SkCanvas* canvas,
67      State state,
68      const gfx::Rect& rect,
69      const ButtonExtraParams& button) const;
70
71  virtual void PaintButton(
72      SkCanvas* canvas,
73      State state,
74      const gfx::Rect& rect,
75      const ButtonExtraParams& button) const;
76
77  virtual void PaintTextField(
78      SkCanvas* canvas,
79      State state,
80      const gfx::Rect& rect,
81      const TextFieldExtraParams& text) const;
82
83  virtual void PaintMenuList(
84      SkCanvas* canvas,
85      State state,
86      const gfx::Rect& rect,
87      const MenuListExtraParams& menu_list) const;
88
89  virtual void PaintMenuPopupBackground(
90      SkCanvas* canvas,
91      const gfx::Size& size,
92      const MenuBackgroundExtraParams& menu_background) const;
93
94  virtual void PaintMenuItemBackground(
95      SkCanvas* canvas,
96      State state,
97      const gfx::Rect& rect,
98      const MenuListExtraParams& menu_list) const;
99
100  virtual void PaintSliderTrack(
101      SkCanvas* canvas,
102      State state,
103      const gfx::Rect& rect,
104      const SliderExtraParams& slider) const;
105
106  virtual void PaintSliderThumb(
107      SkCanvas* canvas,
108      State state,
109      const gfx::Rect& rect,
110      const SliderExtraParams& slider) const;
111
112  virtual void PaintInnerSpinButton(
113      SkCanvas* canvas,
114      State state,
115      const gfx::Rect& rect,
116      const InnerSpinButtonExtraParams& spin_button) const;
117
118  virtual void PaintProgressBar(
119      SkCanvas* canvas,
120      State state,
121      const gfx::Rect& rect,
122      const ProgressBarExtraParams& progress_bar) const;
123
124 protected:
125  void set_scrollbar_button_length(unsigned int length) {
126    scrollbar_button_length_ = length;
127  }
128
129  bool IntersectsClipRectInt(SkCanvas* canvas,
130                             int x, int y, int w, int h) const;
131
132  void DrawImageInt(SkCanvas* canvas, const gfx::ImageSkia& image,
133                    int src_x, int src_y, int src_w, int src_h,
134                    int dest_x, int dest_y, int dest_w, int dest_h) const;
135
136  void DrawTiledImage(SkCanvas* canvas,
137                      const gfx::ImageSkia& image,
138                      int src_x, int src_y,
139                      float tile_scale_x, float tile_scale_y,
140                      int dest_x, int dest_y, int w, int h) const;
141
142  SkColor SaturateAndBrighten(SkScalar* hsv,
143                              SkScalar saturate_amount,
144                              SkScalar brighten_amount) const;
145 private:
146  void DrawVertLine(SkCanvas* canvas,
147                    int x,
148                    int y1,
149                    int y2,
150                    const SkPaint& paint) const;
151  void DrawHorizLine(SkCanvas* canvas,
152                     int x1,
153                     int x2,
154                     int y,
155                     const SkPaint& paint) const;
156  void DrawBox(SkCanvas* canvas,
157               const gfx::Rect& rect,
158               const SkPaint& paint) const;
159  SkScalar Clamp(SkScalar value,
160                 SkScalar min,
161                 SkScalar max) const;
162  SkColor OutlineColor(SkScalar* hsv1, SkScalar* hsv2) const;
163
164  // Paint the common parts of the checkboxes and radio buttons.
165  // borderRadius specifies how rounded the corners should be.
166  SkRect PaintCheckboxRadioCommon(
167      SkCanvas* canvas,
168      State state,
169      const gfx::Rect& rect,
170      const SkScalar borderRadius) const;
171
172  unsigned int scrollbar_width_;
173  unsigned int scrollbar_button_length_;
174
175  DISALLOW_COPY_AND_ASSIGN(NativeThemeBase);
176};
177
178}  // namespace ui
179
180#endif  // UI_NATIVE_THEME_NATIVE_THEME_BASE_H_
181