blob: 8cc284c64e01517d0a9d5cc0fb9545c9a7892a82 [file] [log] [blame]
// 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/basictypes.h"
#include "base/logging.h"
#include "grit/gfx_resources.h"
#include "ui/base/resource/resource_bundle.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(0x44, 0x44, 0x44);
const SkColor kTextButtonDisabledColor = SkColorSetRGB(0x99, 0x99, 0x99);
const SkColor kTextButtonHighlightColor = SkColorSetRGB(0, 0, 0);
const SkColor kTextButtonHoverColor = kTextButtonEnabledColor;
// MenuItem:
const SkColor kEnabledMenuItemForegroundColor = SK_ColorBLACK;
const SkColor kDisabledMenuItemForegroundColor =
SkColorSetRGB(0x80, 0x80, 0x80);
const SkColor kFocusedMenuItemBackgroundColor = SkColorSetRGB(0xF1, 0xF1, 0xF1);
// 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() {
}
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;
// 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 {
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
if (part == kScrollbarVerticalTrack) {
SkBitmap* background = rb.GetBitmapNamed(IDR_SCROLL_BACKGROUND);
SkBitmap* border_up = rb.GetBitmapNamed(IDR_SCROLL_BACKGROUND_BORDER_UP);
SkBitmap* border_down =
rb.GetBitmapNamed(IDR_SCROLL_BACKGROUND_BORDER_DOWN);
// Draw track background.
DrawBitmapInt(
canvas, *background,
0, 0, background->width(), 1,
rect.x(), rect.y(), rect.width(), rect.height());
// Draw up button lower border.
canvas->drawBitmap(*border_up, extra_params.track_x, extra_params.track_y);
// Draw down button upper border.
canvas->drawBitmap(
*border_down,
extra_params.track_x,
extra_params.track_y + extra_params.track_height - border_down->height()
);
} else {
SkBitmap* background =
GetHorizontalBitmapNamed(IDR_SCROLL_BACKGROUND);
SkBitmap* border_left =
GetHorizontalBitmapNamed(IDR_SCROLL_BACKGROUND_BORDER_UP);
SkBitmap* border_right =
GetHorizontalBitmapNamed(IDR_SCROLL_BACKGROUND_BORDER_DOWN);
// Draw track background.
DrawBitmapInt(
canvas, *background,
0, 0, 1, background->height(),
rect.x(), rect.y(), rect.width(), rect.height());
// Draw left button right border.
canvas->drawBitmap(*border_left,extra_params.track_x, extra_params.track_y);
// Draw right button left border.
canvas->drawBitmap(
*border_right,
extra_params.track_x + extra_params.track_width - border_right->width(),
extra_params.track_y);
}
}
void NativeThemeAura::PaintArrowButton(SkCanvas* canvas,
const gfx::Rect& rect, Part part, State state) const {
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
int resource_id =
(part == kScrollbarUpArrow || part == kScrollbarLeftArrow) ?
IDR_SCROLL_ARROW_UP : IDR_SCROLL_ARROW_DOWN;
if (state == kHovered)
resource_id++;
else if (state == kPressed)
resource_id += 2;
SkBitmap* bitmap;
if (part == kScrollbarUpArrow || part == kScrollbarDownArrow)
bitmap = rb.GetBitmapNamed(resource_id);
else
bitmap = GetHorizontalBitmapNamed(resource_id);
DrawBitmapInt(canvas, *bitmap,
0, 0, bitmap->width(), bitmap->height(),
rect.x(), rect.y(), rect.width(), rect.height());
}
void NativeThemeAura::PaintScrollbarThumb(SkCanvas* canvas,
Part part, State state, const gfx::Rect& rect) const {
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
int resource_id = IDR_SCROLL_THUMB;
if (state == kHovered)
resource_id++;
else if (state == kPressed)
resource_id += 2;
if (part == kScrollbarVerticalThumb) {
SkBitmap* bitmap = rb.GetBitmapNamed(resource_id);
// Top
DrawBitmapInt(
canvas, *bitmap,
0, 1, bitmap->width(), 5,
rect.x(), rect.y(), rect.width(), 5);
// Middle
DrawBitmapInt(
canvas, *bitmap,
0, 7, bitmap->width(), 1,
rect.x(), rect.y() + 5, rect.width(), rect.height() - 10);
// Bottom
DrawBitmapInt(
canvas, *bitmap,
0, 8, bitmap->width(), 5,
rect.x(), rect.y() + rect.height() - 5, rect.width(), 5);
} else {
SkBitmap* bitmap = GetHorizontalBitmapNamed(resource_id);
// Left
DrawBitmapInt(
canvas, *bitmap,
1, 0, 5, bitmap->height(),
rect.x(), rect.y(), 5, rect.height());
// Middle
DrawBitmapInt(
canvas, *bitmap,
7, 0, 1, bitmap->height(),
rect.x() + 5, rect.y(), rect.width() - 10, rect.height());
// Right
DrawBitmapInt(
canvas, *bitmap,
8, 0, 5, bitmap->height(),
rect.x() + rect.width() - 5, rect.y(), 5, rect.height());
}
}
SkBitmap* NativeThemeAura::GetHorizontalBitmapNamed(int resource_id) const {
SkImageMap::const_iterator found = horizontal_bitmaps_.find(resource_id);
if (found != horizontal_bitmaps_.end())
return found->second;
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
SkBitmap* vertical_bitmap = rb.GetBitmapNamed(resource_id);
if (vertical_bitmap) {
SkBitmap transposed_bitmap =
SkBitmapOperations::CreateTransposedBtmap(*vertical_bitmap);
SkBitmap* horizontal_bitmap = new SkBitmap(transposed_bitmap);
horizontal_bitmaps_[resource_id] = horizontal_bitmap;
return horizontal_bitmap;
}
return NULL;
}
} // namespace gfx