// 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/gfx/native_theme_aura.h" #include "base/logging.h" #include "grit/gfx_resources.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/rect.h" #include "ui/gfx/size.h" #include "ui/gfx/skbitmap_operations.h" namespace { const SkColor kMenuBackgroundColor = SK_ColorWHITE; // Theme colors returned by GetSystemColor(). const SkColor kInvalidColorIdColor = SkColorSetRGB(255, 0, 128); // Dialogs: const SkColor kDialogBackgroundColor = SK_ColorWHITE; // FocusableBorder: const SkColor kFocusedBorderColor = SkColorSetRGB(0x4D, 0x90, 0xFE); const SkColor kUnfocusedBorderColor = SkColorSetRGB(0xD9, 0xD9, 0xD9); // TextButton: const SkColor kTextButtonBackgroundColor = SkColorSetRGB(0xDE, 0xDE, 0xDE); const SkColor kTextButtonEnabledColor = SkColorSetRGB(0x22, 0x22, 0x22); const SkColor kTextButtonDisabledColor = SkColorSetRGB(0x99, 0x99, 0x99); const SkColor kTextButtonHighlightColor = SkColorSetRGB(0, 0, 0); const SkColor kTextButtonHoverColor = kTextButtonEnabledColor; // MenuItem: const SkColor kEnabledMenuItemForegroundColor = kTextButtonEnabledColor; const SkColor kDisabledMenuItemForegroundColor = kTextButtonDisabledColor; const SkColor kFocusedMenuItemBackgroundColor = SkColorSetRGB(0xF1, 0xF1, 0xF1); const SkColor kMenuSeparatorColor = SkColorSetRGB(0xDA, 0xDA, 0xDA); // Label: const SkColor kLabelEnabledColor = kTextButtonEnabledColor; const SkColor kLabelDisabledColor = kTextButtonDisabledColor; const SkColor kLabelBackgroundColor = SK_ColorWHITE; // Textfield: const SkColor kTextfieldDefaultColor = SK_ColorBLACK; const SkColor kTextfieldDefaultBackground = SK_ColorWHITE; const SkColor kTextfieldSelectionBackgroundFocused = SkColorSetARGB(0x54, 0x4D, 0x90, 0xFE); const SkColor kTextfieldSelectionBackgroundUnfocused = SK_ColorLTGRAY; const SkColor kTextfieldSelectionColor = color_utils::AlphaBlend(SK_ColorBLACK, kTextfieldSelectionBackgroundFocused, 0xdd); } // namespace namespace gfx { // static const NativeTheme* NativeTheme::instance() { return NativeThemeAura::instance(); } // static const 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() { } SkColor NativeThemeAura::GetSystemColor(ColorId color_id) const { // This implementation returns hardcoded colors. switch (color_id) { // Dialogs case kColorId_DialogBackground: return kDialogBackgroundColor; // FocusableBorder case kColorId_FocusedBorderColor: return kFocusedBorderColor; case kColorId_UnfocusedBorderColor: return kUnfocusedBorderColor; // TextButton case kColorId_TextButtonBackgroundColor: return kTextButtonBackgroundColor; case kColorId_TextButtonEnabledColor: return kTextButtonEnabledColor; case kColorId_TextButtonDisabledColor: return kTextButtonDisabledColor; case kColorId_TextButtonHighlightColor: return kTextButtonHighlightColor; case kColorId_TextButtonHoverColor: return kTextButtonHoverColor; // MenuItem case kColorId_EnabledMenuItemForegroundColor: return kEnabledMenuItemForegroundColor; case kColorId_DisabledMenuItemForegroundColor: return kDisabledMenuItemForegroundColor; case kColorId_FocusedMenuItemBackgroundColor: return kFocusedMenuItemBackgroundColor; case kColorId_MenuSeparatorColor: return kMenuSeparatorColor; // Label case kColorId_LabelEnabledColor: return kLabelEnabledColor; case kColorId_LabelDisabledColor: return kLabelDisabledColor; case kColorId_LabelBackgroundColor: return kLabelBackgroundColor; // Textfield case kColorId_TextfieldDefaultColor: return kTextfieldDefaultColor; case kColorId_TextfieldDefaultBackground: return kTextfieldDefaultBackground; case kColorId_TextfieldSelectionColor: return kTextfieldSelectionColor; case kColorId_TextfieldSelectionBackgroundFocused: return kTextfieldSelectionBackgroundFocused; case kColorId_TextfieldSelectionBackgroundUnfocused: return kTextfieldSelectionBackgroundUnfocused; default: NOTREACHED() << "Invalid color_id: " << color_id; break; } return kInvalidColorIdColor; } void NativeThemeAura::PaintMenuPopupBackground(SkCanvas* canvas, const gfx::Size& size) const { canvas->drawColor(kMenuBackgroundColor, SkXfermode::kSrc_Mode); } 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. SkBitmap* top = rb.GetBitmapNamed(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) { SkBitmap* bottom = rb.GetBitmapNamed(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) { SkBitmap* center = rb.GetBitmapNamed(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) { SkBitmap* left = rb.GetBitmapNamed(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) { SkBitmap* right = rb.GetBitmapNamed(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) { SkBitmap* center = rb.GetBitmapNamed(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::PaintArrowButton(SkCanvas* canvas, const gfx::Rect& rect, Part part, State state) const { DCHECK(rect.IsEmpty()); } 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; SkBitmap* top = rb.GetBitmapNamed(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; SkBitmap* bottom = rb.GetBitmapNamed(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; SkBitmap* center = rb.GetBitmapNamed(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; SkBitmap* left = rb.GetBitmapNamed(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; SkBitmap* right = rb.GetBitmapNamed(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; SkBitmap* center = rb.GetBitmapNamed(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 gfx