• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "base/memory/scoped_ptr.h"
11 #include "skia/ext/platform_canvas.h"
12 #include "ui/native_theme/native_theme.h"
13 
14 namespace gfx {
15 class Canvas;
16 class ImageSkia;
17 class Rect;
18 class Size;
19 }
20 
21 namespace ui {
22 
23 // Theme support for non-Windows toolkits.
24 class NATIVE_THEME_EXPORT NativeThemeBase : public NativeTheme {
25  public:
26   // NativeTheme implementation:
27   virtual gfx::Size GetPartSize(Part part,
28                                 State state,
29                                 const ExtraParams& extra) const OVERRIDE;
30   virtual void Paint(SkCanvas* canvas,
31                      Part part,
32                      State state,
33                      const gfx::Rect& rect,
34                      const ExtraParams& extra) const OVERRIDE;
35 
36   virtual void PaintStateTransition(SkCanvas* canvas,
37                                     Part part,
38                                     State startState,
39                                     State endState,
40                                     double progress,
41                                     const gfx::Rect& rect) const OVERRIDE;
42 
43  protected:
44   NativeThemeBase();
45   virtual ~NativeThemeBase();
46 
47   // Draw the arrow. Used by scrollbar and inner spin button.
48   virtual void PaintArrowButton(
49       SkCanvas* gc,
50       const gfx::Rect& rect,
51       Part direction,
52       State state) const;
53   // Paint the scrollbar track. Done before the thumb so that it can contain
54   // alpha.
55   virtual void PaintScrollbarTrack(
56       SkCanvas* canvas,
57       Part part,
58       State state,
59       const ScrollbarTrackExtraParams& extra_params,
60       const gfx::Rect& rect) const;
61   // Draw the scrollbar thumb over the track.
62   virtual void PaintScrollbarThumb(
63       SkCanvas* canvas,
64       Part part,
65       State state,
66       const gfx::Rect& rect) const;
67 
68   virtual void PaintScrollbarCorner(SkCanvas* canvas,
69                                     State state,
70                                     const gfx::Rect& rect) const;
71 
72   virtual void PaintCheckbox(
73       SkCanvas* canvas,
74       State state,
75       const gfx::Rect& rect,
76       const ButtonExtraParams& button) const;
77 
78   virtual void PaintRadio(
79       SkCanvas* canvas,
80       State state,
81       const gfx::Rect& rect,
82       const ButtonExtraParams& button) const;
83 
84   virtual void PaintButton(
85       SkCanvas* canvas,
86       State state,
87       const gfx::Rect& rect,
88       const ButtonExtraParams& button) const;
89 
90   virtual void PaintTextField(
91       SkCanvas* canvas,
92       State state,
93       const gfx::Rect& rect,
94       const TextFieldExtraParams& text) const;
95 
96   virtual void PaintMenuList(
97       SkCanvas* canvas,
98       State state,
99       const gfx::Rect& rect,
100       const MenuListExtraParams& menu_list) const;
101 
102   virtual void PaintMenuPopupBackground(
103       SkCanvas* canvas,
104       const gfx::Size& size,
105       const MenuBackgroundExtraParams& menu_background) const;
106 
107   virtual void PaintMenuItemBackground(
108       SkCanvas* canvas,
109       State state,
110       const gfx::Rect& rect,
111       const MenuListExtraParams& menu_list) const;
112 
113   virtual void PaintSliderTrack(
114       SkCanvas* canvas,
115       State state,
116       const gfx::Rect& rect,
117       const SliderExtraParams& slider) const;
118 
119   virtual void PaintSliderThumb(
120       SkCanvas* canvas,
121       State state,
122       const gfx::Rect& rect,
123       const SliderExtraParams& slider) const;
124 
125   virtual void PaintInnerSpinButton(
126       SkCanvas* canvas,
127       State state,
128       const gfx::Rect& rect,
129       const InnerSpinButtonExtraParams& spin_button) const;
130 
131   virtual void PaintProgressBar(
132       SkCanvas* canvas,
133       State state,
134       const gfx::Rect& rect,
135       const ProgressBarExtraParams& progress_bar) const;
136 
PaintScrollbarThumbStateTransition(SkCanvas * canvas,State startState,State endState,double progress,const gfx::Rect & rect)137   virtual void PaintScrollbarThumbStateTransition(
138       SkCanvas* canvas,
139       State startState,
140       State endState,
141       double progress,
142       const gfx::Rect& rect) const {}
143 
set_scrollbar_button_length(unsigned int length)144   void set_scrollbar_button_length(unsigned int length) {
145     scrollbar_button_length_ = length;
146   }
scrollbar_button_length()147   int scrollbar_button_length() const { return scrollbar_button_length_; }
148 
149   bool IntersectsClipRectInt(SkCanvas* canvas,
150                              int x, int y, int w, int h) const;
151 
152   void DrawImageInt(SkCanvas* canvas, const gfx::ImageSkia& image,
153                     int src_x, int src_y, int src_w, int src_h,
154                     int dest_x, int dest_y, int dest_w, int dest_h) const;
155 
156   void DrawTiledImage(SkCanvas* canvas,
157                       const gfx::ImageSkia& image,
158                       int src_x, int src_y,
159                       float tile_scale_x, float tile_scale_y,
160                       int dest_x, int dest_y, int w, int h) const;
161 
162   SkColor SaturateAndBrighten(SkScalar* hsv,
163                               SkScalar saturate_amount,
164                               SkScalar brighten_amount) const;
165 
166   // Paints the arrow used on the scrollbar and spinner.
167   void PaintArrow(SkCanvas* canvas,
168                   const gfx::Rect& rect,
169                   Part direction,
170                   SkColor color) const;
171 
172   // Returns the color used to draw the arrow.
173   SkColor GetArrowColor(State state) const;
174 
175  private:
176   void DrawVertLine(SkCanvas* canvas,
177                     int x,
178                     int y1,
179                     int y2,
180                     const SkPaint& paint) const;
181   void DrawHorizLine(SkCanvas* canvas,
182                      int x1,
183                      int x2,
184                      int y,
185                      const SkPaint& paint) const;
186   void DrawBox(SkCanvas* canvas,
187                const gfx::Rect& rect,
188                const SkPaint& paint) const;
189   SkScalar Clamp(SkScalar value,
190                  SkScalar min,
191                  SkScalar max) const;
192   SkColor OutlineColor(SkScalar* hsv1, SkScalar* hsv2) const;
193 
194   // Paint the common parts of the checkboxes and radio buttons.
195   // borderRadius specifies how rounded the corners should be.
196   SkRect PaintCheckboxRadioCommon(
197       SkCanvas* canvas,
198       State state,
199       const gfx::Rect& rect,
200       const SkScalar borderRadius) const;
201 
202   unsigned int scrollbar_width_;
203   unsigned int scrollbar_button_length_;
204 
205   DISALLOW_COPY_AND_ASSIGN(NativeThemeBase);
206 };
207 
208 }  // namespace ui
209 
210 #endif  // UI_NATIVE_THEME_NATIVE_THEME_BASE_H_
211