Index: ui/native_theme/native_theme_aurawin.cc |
diff --git a/ui/native_theme/native_theme_aurawin.cc b/ui/native_theme/native_theme_aurawin.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..82aae3d32d16da00964b8da535c31ffb6fa653d1 |
--- /dev/null |
+++ b/ui/native_theme/native_theme_aurawin.cc |
@@ -0,0 +1,182 @@ |
+// Copyright 2014 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_aurawin.h" |
+ |
+#include "grit/ui_resources.h" |
+#include "third_party/skia/include/core/SkCanvas.h" |
+#include "ui/base/nine_image_painter_factory.h" |
+#include "ui/base/resource/resource_bundle.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/gfx/nine_image_painter.h" |
+#include "ui/gfx/skia_util.h" |
+#include "ui/gfx/win/dpi.h" |
+#include "ui/native_theme/common_theme.h" |
+#include "ui/native_theme/native_theme_win.h" |
+ |
+using gfx::NineImagePainter; |
+ |
+#define EMPTY_IMAGE_GRID { 0, 0, 0, 0, 0, 0, 0, 0, 0 } |
+ |
+namespace ui { |
+ |
+namespace { |
+ |
+const int kScrollbarThumbImages[NativeTheme::kMaxState][9] = { |
+ EMPTY_IMAGE_GRID, |
+ IMAGE_GRID(IDR_SCROLLBAR_THUMB_BASE_HOVER), |
+ IMAGE_GRID(IDR_SCROLLBAR_THUMB_BASE_NORMAL), |
+ IMAGE_GRID(IDR_SCROLLBAR_THUMB_BASE_PRESSED) |
+}; |
+ |
+const int kScrollbarArrowButtonImages[NativeTheme::kMaxState][9] = { |
+ EMPTY_IMAGE_GRID, |
+ IMAGE_GRID(IDR_SCROLLBAR_ARROW_BUTTON_BASE_HOVER), |
+ IMAGE_GRID(IDR_SCROLLBAR_ARROW_BUTTON_BASE_NORMAL), |
+ IMAGE_GRID(IDR_SCROLLBAR_ARROW_BUTTON_BASE_PRESSED) |
+}; |
+ |
+const int kScrollbarTrackImages[9] = IMAGE_GRID(IDR_SCROLLBAR_BASE); |
+ |
+} // namespace |
+ |
+// static |
+NativeTheme* NativeTheme::instance() { |
+ return NativeThemeAuraWin::instance(); |
+} |
+ |
+// static |
+NativeThemeAura* NativeThemeAura::instance() { |
+ return NativeThemeAuraWin::instance(); |
+} |
+ |
+// static |
+NativeThemeAuraWin* NativeThemeAuraWin::instance() { |
+ CR_DEFINE_STATIC_LOCAL(NativeThemeAuraWin, s_native_theme, ()); |
+ return &s_native_theme; |
+} |
+ |
+NativeThemeAuraWin::NativeThemeAuraWin() { |
+ // Image declarations assume the following order. |
+ COMPILE_ASSERT(kDisabled == 0, states_unexepctedly_changed); |
+ COMPILE_ASSERT(kHovered == 1, states_unexepctedly_changed); |
+ COMPILE_ASSERT(kNormal == 2, states_unexepctedly_changed); |
+ COMPILE_ASSERT(kPressed == 3, states_unexepctedly_changed); |
+ COMPILE_ASSERT(kMaxState == 4, states_unexepctedly_changed); |
+} |
+ |
+NativeThemeAuraWin::~NativeThemeAuraWin() { |
+} |
+ |
+gfx::Size NativeThemeAuraWin::GetPartSize(Part part, |
+ State state, |
+ const ExtraParams& extra) const { |
+ gfx::Size part_size = CommonThemeGetPartSize(part, state, extra); |
+ if (!part_size.IsEmpty()) |
+ return part_size; |
+ |
+ // We want aura on windows to use the same size for scrollbars as we would in |
+ // the native theme. |
+ switch (part) { |
+ case kScrollbarDownArrow: |
+ case kScrollbarLeftArrow: |
+ case kScrollbarRightArrow: |
+ case kScrollbarUpArrow: |
+ case kScrollbarHorizontalThumb: |
+ case kScrollbarVerticalThumb: |
+ case kScrollbarHorizontalTrack: |
+ case kScrollbarVerticalTrack: |
+ return NativeThemeWin::instance()->GetPartSize(part, state, extra); |
+ default: |
+ break; |
+ } |
+ |
+ return NativeThemeAura::GetPartSize(part, state, extra); |
+} |
+ |
+void NativeThemeAuraWin::PaintArrowButton( |
+ SkCanvas* gc, |
+ const gfx::Rect& rect, |
+ Part direction, |
+ State state) const { |
+ if (direction == kInnerSpinButton) { |
+ NativeThemeAura::PaintArrowButton(gc, rect, direction, state); |
+ return; |
+ } |
+ PaintPainter(GetOrCreatePainter( |
+ kScrollbarArrowButtonImages, state, |
+ scrollbar_arrow_button_painters_), |
+ gc, rect); |
+ |
+ // The arrow is slightly offset to better balance with the thumb. |
+ gfx::Rect arrow_rect(rect); |
+ if (direction == kScrollbarDownArrow || direction == kScrollbarUpArrow) |
+ arrow_rect.Offset(1, 0); |
+ else |
+ arrow_rect.Offset(0, 1); |
+ |
+ // Aura-win uses slightly different arrow colors. |
+ SkColor arrow_color = GetArrowColor(state); |
+ switch (state) { |
+ case kHovered: |
+ case kNormal: |
+ arrow_color = SkColorSetRGB(0x50, 0x50, 0x50); |
+ break; |
+ case kPressed: |
+ arrow_color = SK_ColorWHITE; |
+ default: |
+ break; |
+ } |
+ PaintArrow(gc, arrow_rect, direction, arrow_color); |
+} |
+ |
+void NativeThemeAuraWin::PaintScrollbarTrack( |
+ SkCanvas* sk_canvas, |
+ Part part, |
+ State state, |
+ const ScrollbarTrackExtraParams& extra_params, |
+ const gfx::Rect& rect) const { |
+ if (!scrollbar_track_painter_) |
+ scrollbar_track_painter_ = CreateNineImagePainter(kScrollbarTrackImages); |
+ PaintPainter(scrollbar_track_painter_.get(), sk_canvas, rect); |
+} |
+ |
+void NativeThemeAuraWin::PaintScrollbarThumb(SkCanvas* sk_canvas, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect) const { |
+ gfx::Rect thumb_rect(rect); |
+ if (part == NativeTheme::kScrollbarVerticalThumb) |
+ thumb_rect.Inset(3, 0, 1, 0); |
+ else |
+ thumb_rect.Inset(0, 3, 0, 1); |
+ PaintPainter(GetOrCreatePainter( |
+ kScrollbarThumbImages, state, scrollbar_thumb_painters_), |
+ sk_canvas, thumb_rect); |
+} |
+ |
+NineImagePainter* NativeThemeAuraWin::GetOrCreatePainter( |
+ const int images[kMaxState][9], |
+ State state, |
+ scoped_ptr<NineImagePainter> painters[kMaxState]) const { |
+ if (painters[state]) |
+ return painters[state].get(); |
+ if (images[state][0] == 0) { |
+ // Must always provide normal state images. |
+ DCHECK_NE(kNormal, state); |
+ return GetOrCreatePainter(images, kNormal, painters); |
+ } |
+ painters[state] = CreateNineImagePainter(images[state]); |
+ return painters[state].get(); |
+} |
+ |
+void NativeThemeAuraWin::PaintPainter(NineImagePainter* painter, |
+ SkCanvas* sk_canvas, |
+ const gfx::Rect& rect) const { |
+ DCHECK(painter); |
+ scoped_ptr<gfx::Canvas> canvas(CreateCanvas(sk_canvas)); |
+ painter->Paint(canvas.get(), rect); |
+} |
+ |
+} // namespace ui |