OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |