Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: ui/native_theme/native_theme_mac.mm

Issue 456473002: MacViews: Implement scrollbar theming. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Draw corner view, refine painting. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/native_theme/native_theme_mac.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/native_theme/native_theme_mac.h" 5 #include "ui/native_theme/native_theme_mac.h"
6 6
7 #import <Cocoa/Cocoa.h> 7 #import <Cocoa/Cocoa.h>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/mac/mac_util.h" 10 #include "base/mac/mac_util.h"
11 #include "base/mac/scoped_cftyperef.h" 11 #include "base/mac/scoped_cftyperef.h"
12 #include "base/mac/sdk_forward_declarations.h" 12 #include "base/mac/sdk_forward_declarations.h"
13 #include "ui/native_theme/common_theme.h" 13 #include "ui/native_theme/common_theme.h"
14 #import "skia/ext/skia_utils_mac.h" 14 #import "skia/ext/skia_utils_mac.h"
15 #include "third_party/skia/include/effects/SkGradientShader.h"
16 #include "ui/gfx/geometry/rect.h"
15 #include "ui/gfx/skia_util.h" 17 #include "ui/gfx/skia_util.h"
16 18
17 namespace { 19 namespace {
18 20
21 const SkColor kScrollerTrackGradientColors[] = {
22 SkColorSetRGB(0xEF, 0xEF, 0xEF),
23 SkColorSetRGB(0xF9, 0xF9, 0xF9),
24 SkColorSetRGB(0xFD, 0xFD, 0xFD),
25 SkColorSetRGB(0xF6, 0xF6, 0xF6) };
26 const SkColor kScrollerTrackInnerBorderColor = SkColorSetRGB(0xE4, 0xE4, 0xE4);
27 const SkColor kScrollerTrackOuterBorderColor = SkColorSetRGB(0xEF, 0xEF, 0xEF);
28 const SkColor kScrollerThumbColor = SkColorSetARGB(0x38, 0, 0, 0);
29 const SkColor kScrollerThumbHoverColor = SkColorSetARGB(0x80, 0, 0, 0);
30 const int kScrollerTrackBorderWidth = 1;
31
32 // The amount the thumb is inset from both the ends and the sides of the track.
33 const int kScrollerThumbInset = 3;
34
19 // Values calculated by reading pixels and solving simultaneous equations 35 // Values calculated by reading pixels and solving simultaneous equations
20 // derived from "A over B" alpha compositing. Steps: Sample the semi-transparent 36 // derived from "A over B" alpha compositing. Steps: Sample the semi-transparent
21 // pixel over two backgrounds; P1, P2 over backgrounds B1, B2. Use the color 37 // pixel over two backgrounds; P1, P2 over backgrounds B1, B2. Use the color
22 // value between 0.0 and 1.0 (i.e. divide by 255.0). Then, 38 // value between 0.0 and 1.0 (i.e. divide by 255.0). Then,
23 // alpha = (P2 - P1 + B1 - B2) / (B1 - B2) 39 // alpha = (P2 - P1 + B1 - B2) / (B1 - B2)
24 // color = (P1 - B1 + alpha * B1) / alpha. 40 // color = (P1 - B1 + alpha * B1) / alpha.
25 const SkColor kMenuPopupBackgroundColor = SkColorSetARGB(251, 255, 255, 255); 41 const SkColor kMenuPopupBackgroundColor = SkColorSetARGB(251, 255, 255, 255);
26 const SkColor kMenuSeparatorColor = SkColorSetARGB(243, 228, 228, 228); 42 const SkColor kMenuSeparatorColor = SkColorSetARGB(243, 228, 228, 228);
27 const SkColor kMenuBorderColor = SkColorSetARGB(60, 0, 0, 0); 43 const SkColor kMenuBorderColor = SkColorSetARGB(60, 0, 0, 0);
28 44
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 } 193 }
178 194
179 SkColor color; 195 SkColor color;
180 if (CommonThemeGetSystemColor(color_id, &color)) 196 if (CommonThemeGetSystemColor(color_id, &color))
181 return color; 197 return color;
182 198
183 NOTIMPLEMENTED() << " Invalid color_id: " << color_id; 199 NOTIMPLEMENTED() << " Invalid color_id: " << color_id;
184 return FallbackTheme::GetSystemColor(color_id); 200 return FallbackTheme::GetSystemColor(color_id);
185 } 201 }
186 202
203 void NativeThemeMac::PaintScrollbarTrack(
204 SkCanvas* canvas,
205 Part part,
206 State state,
207 const ScrollbarTrackExtraParams& extra_params,
208 const gfx::Rect& rect) const {
209 // Emulate the non-overlay scroller style from OSX 10.7 and later.
210 SkPoint gradient_bounds[2];
211 if (part == kScrollbarVerticalTrack) {
212 gradient_bounds[0].set(rect.x(), rect.y());
213 gradient_bounds[1].set(rect.right(), rect.y());
214 } else {
215 DCHECK_EQ(part, kScrollbarHorizontalTrack);
216 gradient_bounds[0].set(rect.x(), rect.y());
217 gradient_bounds[1].set(rect.x(), rect.bottom());
218 }
219 skia::RefPtr<SkShader> shader = skia::AdoptRef(
220 SkGradientShader::CreateLinear(gradient_bounds,
221 kScrollerTrackGradientColors,
222 NULL,
223 arraysize(kScrollerTrackGradientColors),
224 SkShader::kClamp_TileMode));
225 SkPaint gradient;
226 gradient.setShader(shader.get());
227
228 SkIRect track_rect = gfx::RectToSkIRect(rect);
229 canvas->drawIRect(track_rect, gradient);
230
231 // Draw inner and outer line borders.
232 if (part == kScrollbarVerticalTrack) {
233 SkPaint paint;
234 paint.setColor(kScrollerTrackInnerBorderColor);
235 canvas->drawRectCoords(track_rect.left(),
236 track_rect.top(),
237 track_rect.left() + kScrollerTrackBorderWidth,
238 track_rect.bottom(),
239 paint);
240 paint.setColor(kScrollerTrackOuterBorderColor);
241 canvas->drawRectCoords(track_rect.right() - kScrollerTrackBorderWidth,
242 track_rect.top(),
243 track_rect.right(),
244 track_rect.bottom(),
245 paint);
246 } else {
247 SkPaint paint;
248 paint.setColor(kScrollerTrackInnerBorderColor);
249 canvas->drawRectCoords(track_rect.left(),
250 track_rect.top(),
251 track_rect.right(),
252 track_rect.top() + kScrollerTrackBorderWidth,
253 paint);
254 paint.setColor(kScrollerTrackOuterBorderColor);
255 canvas->drawRectCoords(track_rect.left(),
256 track_rect.bottom() - kScrollerTrackBorderWidth,
257 track_rect.right(),
258 track_rect.bottom(),
259 paint);
260 }
261 }
262
263 void NativeThemeMac::PaintScrollbarThumb(SkCanvas* canvas,
264 Part part,
265 State state,
266 const gfx::Rect& rect) const {
267 gfx::Rect thumb_rect(rect);
268 switch (part) {
269 case kScrollbarHorizontalThumb:
270 thumb_rect.Inset(0, kScrollerTrackBorderWidth, 0, 0);
271 break;
272 case kScrollbarVerticalThumb:
273 thumb_rect.Inset(kScrollerTrackBorderWidth, 0, 0, 0);
274 break;
275 default:
276 NOTREACHED();
277 break;
278 }
279
280 thumb_rect.Inset(kScrollerThumbInset, kScrollerThumbInset);
281
282 SkPaint paint;
283 paint.setAntiAlias(true);
284 paint.setColor(state == kHovered ? thumb_active_color_
285 : thumb_inactive_color_);
286 const SkScalar radius = std::min(rect.width(), rect.height());
287 canvas->drawRoundRect(gfx::RectToSkRect(thumb_rect), radius, radius, paint);
288 }
289
290 void NativeThemeMac::PaintScrollbarCorner(SkCanvas* canvas,
291 State state,
292 const gfx::Rect& rect) const {
293 DCHECK_GT(rect.width(), 0);
294 DCHECK_GT(rect.height(), 0);
295
296 // Draw radial gradient from top-left corner.
297 skia::RefPtr<SkShader> shader = skia::AdoptRef(
298 SkGradientShader::CreateRadial(SkPoint::Make(rect.x(), rect.y()),
299 rect.width(),
300 kScrollerTrackGradientColors,
301 NULL,
302 arraysize(kScrollerTrackGradientColors),
303 SkShader::kClamp_TileMode));
304 SkPaint gradient;
305 gradient.setStyle(SkPaint::kFill_Style);
306 gradient.setAntiAlias(true);
307 gradient.setShader(shader.get());
308 canvas->drawRect(gfx::RectToSkRect(rect), gradient);
309
310 // Draw inner border corner point.
311 canvas->drawPoint(rect.x(), rect.y(), kScrollerTrackInnerBorderColor);
312
313 // Draw outer borders.
314 SkPaint paint;
315 paint.setColor(kScrollerTrackOuterBorderColor);
316 canvas->drawRectCoords(rect.right() - kScrollerTrackBorderWidth,
317 rect.y(),
318 rect.right(),
319 rect.bottom(),
320 paint);
321 canvas->drawRectCoords(rect.x(),
322 rect.bottom() - kScrollerTrackBorderWidth,
323 rect.right(),
324 rect.bottom(),
325 paint);
326 }
327
187 void NativeThemeMac::PaintMenuPopupBackground( 328 void NativeThemeMac::PaintMenuPopupBackground(
188 SkCanvas* canvas, 329 SkCanvas* canvas,
189 const gfx::Size& size, 330 const gfx::Size& size,
190 const MenuBackgroundExtraParams& menu_background) const { 331 const MenuBackgroundExtraParams& menu_background) const {
191 canvas->drawColor(kMenuPopupBackgroundColor, SkXfermode::kSrc_Mode); 332 canvas->drawColor(kMenuPopupBackgroundColor, SkXfermode::kSrc_Mode);
192 } 333 }
193 334
194 void NativeThemeMac::PaintMenuItemBackground( 335 void NativeThemeMac::PaintMenuItemBackground(
195 SkCanvas* canvas, 336 SkCanvas* canvas,
196 State state, 337 State state,
(...skipping 13 matching lines...) Expand all
210 paint.setColor(GetSystemColor(kColorId_HoverMenuItemBackgroundColor)); 351 paint.setColor(GetSystemColor(kColorId_HoverMenuItemBackgroundColor));
211 canvas->drawRect(gfx::RectToSkRect(rect), paint); 352 canvas->drawRect(gfx::RectToSkRect(rect), paint);
212 break; 353 break;
213 default: 354 default:
214 NOTREACHED(); 355 NOTREACHED();
215 break; 356 break;
216 } 357 }
217 } 358 }
218 359
219 NativeThemeMac::NativeThemeMac() { 360 NativeThemeMac::NativeThemeMac() {
361 set_scrollbar_button_length(0);
362 SetScrollbarColors(kScrollerThumbColor,
363 kScrollerThumbHoverColor,
364 kScrollerTrackGradientColors[0]);
220 } 365 }
221 366
222 NativeThemeMac::~NativeThemeMac() { 367 NativeThemeMac::~NativeThemeMac() {
223 } 368 }
224 369
225 } // namespace ui 370 } // namespace ui
OLDNEW
« no previous file with comments | « ui/native_theme/native_theme_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698