| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/native_theme/native_theme_aura.h" |
| |
| #include "base/logging.h" |
| #include "grit/ui_resources.h" |
| #include "ui/base/layout.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/gfx/image/image_skia.h" |
| #include "ui/gfx/path.h" |
| #include "ui/gfx/rect.h" |
| #include "ui/gfx/size.h" |
| #include "ui/gfx/skbitmap_operations.h" |
| #include "ui/native_theme/common_theme.h" |
| |
| namespace ui { |
| |
| // static |
| NativeTheme* NativeTheme::instance() { |
| return NativeThemeAura::instance(); |
| } |
| |
| // static |
| NativeThemeAura* NativeThemeAura::instance() { |
| CR_DEFINE_STATIC_LOCAL(NativeThemeAura, s_native_theme, ()); |
| return &s_native_theme; |
| } |
| |
| NativeThemeAura::NativeThemeAura() { |
| // We don't draw scrollbar buttons. |
| set_scrollbar_button_length(0); |
| } |
| |
| NativeThemeAura::~NativeThemeAura() { |
| } |
| |
| void NativeThemeAura::PaintMenuPopupBackground( |
| SkCanvas* canvas, |
| const gfx::Size& size, |
| const MenuBackgroundExtraParams& menu_background) const { |
| SkColor color = GetSystemColor(NativeTheme::kColorId_MenuBackgroundColor); |
| if (menu_background.corner_radius > 0) { |
| SkPaint paint; |
| paint.setStyle(SkPaint::kFill_Style); |
| paint.setFlags(SkPaint::kAntiAlias_Flag); |
| paint.setColor(color); |
| |
| gfx::Path path; |
| SkRect rect = SkRect::MakeWH(SkIntToScalar(size.width()), |
| SkIntToScalar(size.height())); |
| SkScalar radius = SkIntToScalar(menu_background.corner_radius); |
| SkScalar radii[8] = {radius, radius, radius, radius, |
| radius, radius, radius, radius}; |
| path.addRoundRect(rect, radii); |
| |
| canvas->drawPath(path, paint); |
| } else { |
| canvas->drawColor(color, SkXfermode::kSrc_Mode); |
| } |
| } |
| |
| void NativeThemeAura::PaintMenuItemBackground( |
| SkCanvas* canvas, |
| State state, |
| const gfx::Rect& rect, |
| const MenuListExtraParams& menu_list) const { |
| CommonThemePaintMenuItemBackground(canvas, state, rect); |
| } |
| |
| void NativeThemeAura::PaintScrollbarTrack( |
| SkCanvas* canvas, |
| Part part, |
| State state, |
| const ScrollbarTrackExtraParams& extra_params, |
| const gfx::Rect& rect) const { |
| ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| if (part == kScrollbarVerticalTrack) { |
| int center_offset = 0; |
| int center_height = rect.height(); |
| |
| if (rect.y() == extra_params.track_y) { |
| // TODO(derat): Honor |state| instead of only using the highlighted images |
| // after updating WebKit so we can draw the entire track in one go instead |
| // of as two separate pieces: otherwise, only the portion of the scrollbar |
| // that the mouse is over gets the highlighted state. |
| gfx::ImageSkia* top = rb.GetImageSkiaNamed( |
| IDR_SCROLL_BASE_VERTICAL_TOP_H); |
| DrawTiledImage(canvas, *top, |
| 0, 0, 1.0, 1.0, |
| rect.x(), rect.y(), top->width(), top->height()); |
| center_offset += top->height(); |
| center_height -= top->height(); |
| } |
| |
| if (rect.y() + rect.height() == |
| extra_params.track_y + extra_params.track_height) { |
| gfx::ImageSkia* bottom = rb.GetImageSkiaNamed( |
| IDR_SCROLL_BASE_VERTICAL_BOTTOM_H); |
| DrawTiledImage(canvas, *bottom, |
| 0, 0, 1.0, 1.0, |
| rect.x(), rect.y() + rect.height() - bottom->height(), |
| bottom->width(), bottom->height()); |
| center_height -= bottom->height(); |
| } |
| |
| if (center_height > 0) { |
| gfx::ImageSkia* center = rb.GetImageSkiaNamed( |
| IDR_SCROLL_BASE_VERTICAL_CENTER_H); |
| DrawTiledImage(canvas, *center, |
| 0, 0, 1.0, 1.0, |
| rect.x(), rect.y() + center_offset, |
| center->width(), center_height); |
| } |
| } else { |
| int center_offset = 0; |
| int center_width = rect.width(); |
| |
| if (rect.x() == extra_params.track_x) { |
| gfx::ImageSkia* left = rb.GetImageSkiaNamed( |
| IDR_SCROLL_BASE_HORIZONTAL_LEFT_H); |
| DrawTiledImage(canvas, *left, |
| 0, 0, 1.0, 1.0, |
| rect.x(), rect.y(), left->width(), left->height()); |
| center_offset += left->width(); |
| center_width -= left->width(); |
| } |
| |
| if (rect.x() + rect.width() == |
| extra_params.track_x + extra_params.track_width) { |
| gfx::ImageSkia* right = rb.GetImageSkiaNamed( |
| IDR_SCROLL_BASE_HORIZONTAL_RIGHT_H); |
| DrawTiledImage(canvas, *right, |
| 0, 0, 1.0, 1.0, |
| rect.x() + rect.width() - right->width(), rect.y(), |
| right->width(), right->height()); |
| center_width -= right->width(); |
| } |
| |
| if (center_width > 0) { |
| gfx::ImageSkia* center = rb.GetImageSkiaNamed( |
| IDR_SCROLL_BASE_HORIZONTAL_CENTER_H); |
| DrawTiledImage(canvas, *center, |
| 0, 0, 1.0, 1.0, |
| rect.x() + center_offset, rect.y(), |
| center_width, center->height()); |
| } |
| } |
| } |
| |
| void NativeThemeAura::PaintScrollbarThumb(SkCanvas* canvas, |
| Part part, |
| State state, |
| const gfx::Rect& rect) const { |
| ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| if (part == kScrollbarVerticalThumb) { |
| int top_resource_id = |
| state == kHovered ? IDR_SCROLL_THUMB_VERTICAL_TOP_H : |
| state == kPressed ? IDR_SCROLL_THUMB_VERTICAL_TOP_P : |
| IDR_SCROLL_THUMB_VERTICAL_TOP; |
| gfx::ImageSkia* top = rb.GetImageSkiaNamed(top_resource_id); |
| DrawTiledImage(canvas, *top, |
| 0, 0, 1.0, 1.0, |
| rect.x(), rect.y(), top->width(), top->height()); |
| |
| int bottom_resource_id = |
| state == kHovered ? IDR_SCROLL_THUMB_VERTICAL_BOTTOM_H : |
| state == kPressed ? IDR_SCROLL_THUMB_VERTICAL_BOTTOM_P : |
| IDR_SCROLL_THUMB_VERTICAL_BOTTOM; |
| gfx::ImageSkia* bottom = rb.GetImageSkiaNamed(bottom_resource_id); |
| DrawTiledImage(canvas, *bottom, |
| 0, 0, 1.0, 1.0, |
| rect.x(), rect.y() + rect.height() - bottom->height(), |
| bottom->width(), bottom->height()); |
| |
| if (rect.height() > top->height() + bottom->height()) { |
| int center_resource_id = |
| state == kHovered ? IDR_SCROLL_THUMB_VERTICAL_CENTER_H : |
| state == kPressed ? IDR_SCROLL_THUMB_VERTICAL_CENTER_P : |
| IDR_SCROLL_THUMB_VERTICAL_CENTER; |
| gfx::ImageSkia* center = rb.GetImageSkiaNamed(center_resource_id); |
| DrawTiledImage(canvas, *center, |
| 0, 0, 1.0, 1.0, |
| rect.x(), rect.y() + top->height(), |
| center->width(), |
| rect.height() - top->height() - bottom->height()); |
| } |
| } else { |
| int left_resource_id = |
| state == kHovered ? IDR_SCROLL_THUMB_HORIZONTAL_LEFT_H : |
| state == kPressed ? IDR_SCROLL_THUMB_HORIZONTAL_LEFT_P : |
| IDR_SCROLL_THUMB_HORIZONTAL_LEFT; |
| gfx::ImageSkia* left = rb.GetImageSkiaNamed(left_resource_id); |
| DrawTiledImage(canvas, *left, |
| 0, 0, 1.0, 1.0, |
| rect.x(), rect.y(), left->width(), left->height()); |
| |
| int right_resource_id = |
| state == kHovered ? IDR_SCROLL_THUMB_HORIZONTAL_RIGHT_H : |
| state == kPressed ? IDR_SCROLL_THUMB_HORIZONTAL_RIGHT_P : |
| IDR_SCROLL_THUMB_HORIZONTAL_RIGHT; |
| gfx::ImageSkia* right = rb.GetImageSkiaNamed(right_resource_id); |
| DrawTiledImage(canvas, *right, |
| 0, 0, 1.0, 1.0, |
| rect.x() + rect.width() - right->width(), rect.y(), |
| right->width(), right->height()); |
| |
| if (rect.width() > left->width() + right->width()) { |
| int center_resource_id = |
| state == kHovered ? IDR_SCROLL_THUMB_HORIZONTAL_CENTER_H : |
| state == kPressed ? IDR_SCROLL_THUMB_HORIZONTAL_CENTER_P : |
| IDR_SCROLL_THUMB_HORIZONTAL_CENTER; |
| gfx::ImageSkia* center = rb.GetImageSkiaNamed(center_resource_id); |
| DrawTiledImage(canvas, *center, |
| 0, 0, 1.0, 1.0, |
| rect.x() + left->width(), rect.y(), |
| rect.width() - left->width() - right->width(), |
| center->height()); |
| } |
| } |
| } |
| |
| } // namespace ui |