15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_win.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <uxtheme.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vsstyle.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vssym32.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_handle.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_gdi_object.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_hdc.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_select_object.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/bitmap_platform_device.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/skia_utils_win.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColorPriv.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkShader.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gdi_util.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/sys_color_change_listener.h"
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/common_theme.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This was removed from Winvers.h but is still used.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(COLOR_MENUHIGHLIGHT)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define COLOR_MENUHIGHLIGHT 29
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: Obtain the correct colors using GetSysColor.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Theme colors returned by GetSystemColor().
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kInvalidColorIdColor = SkColorSetRGB(255, 0, 128);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dialogs:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kDialogBackgroundColor = SkColorSetRGB(251, 251, 251);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FocusableBorder:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kFocusedBorderColor = SkColorSetRGB(0x4d, 0x90, 0xfe);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kUnfocusedBorderColor = SkColorSetRGB(0xd9, 0xd9, 0xd9);
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Button:
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kButtonBackgroundColor = SkColorSetRGB(0xde, 0xde, 0xde);
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kButtonHighlightColor = SkColorSetARGB(200, 255, 255, 255);
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const SkColor kButtonHoverColor = SkColorSetRGB(6, 45, 117);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MenuItem:
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kEnabledMenuItemForegroundColor = SkColorSetRGB(6, 45, 117);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kDisabledMenuItemForegroundColor = SkColorSetRGB(161, 161, 146);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kFocusedMenuItemBackgroundColor = SkColorSetRGB(246, 249, 253);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kMenuSeparatorColor = SkColorSetARGB(50, 0, 0, 0);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Table:
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kTreeSelectionBackgroundUnfocused = SkColorSetRGB(240, 240, 240);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Windows system color IDs cached and updated by the native theme.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kSystemColors[] = {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_3DFACE,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_BTNTEXT,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_GRAYTEXT,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_HIGHLIGHT,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_HIGHLIGHTTEXT,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_SCROLLBAR,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_WINDOW,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_WINDOWTEXT,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_BTNFACE,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  COLOR_MENUHIGHLIGHT,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCheckerboardShader(SkPaint* paint, const RECT& align_rect) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a 2x2 checkerboard pattern using the 3D face and highlight colors.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SkColor face = color_utils::GetSysSkColor(COLOR_3DFACE);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SkColor highlight = color_utils::GetSysSkColor(COLOR_3DHILIGHT);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor buffer[] = { face, highlight, highlight, face };
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confusing bit: we first create a temporary bitmap with our desired pattern,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then copy it to another bitmap.  The temporary bitmap doesn't take
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ownership of the pixel data, and so will point to garbage when this
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function returns.  The copy will copy the pixel data into a place owned by
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the bitmap, which is in turn owned by the shader, etc., so it will live
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // until we're done using it.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap temp_bitmap;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  temp_bitmap.setPixels(buffer);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap bitmap;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  temp_bitmap.copyTo(&bitmap, temp_bitmap.config());
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skia::RefPtr<SkShader> shader = skia::AdoptRef(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SkShader::CreateBitmapShader(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          bitmap, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Align the pattern with the upper corner of |align_rect|.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkMatrix matrix;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matrix.setTranslate(SkIntToScalar(align_rect.left),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SkIntToScalar(align_rect.top));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shader->setLocalMatrix(matrix);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  paint->setShader(shader.get());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    <-a->
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// [  *****             ]
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  ____ |              |
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  <-a-> <------b----->
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a: object_width
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// b: frame_width
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *: animating object
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - the animation goes from "[" to "]" repeatedly.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - the animation offset is at first "|"
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ComputeAnimationProgress(int frame_width,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int object_width,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int pixels_per_second,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             double animated_seconds) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int animation_width = frame_width + object_width;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double interval = static_cast<double>(animation_width) / pixels_per_second;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double ratio = fmod(animated_seconds, interval) / interval;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<int>(animation_width * ratio) - object_width;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RECT InsetRect(const RECT* rect, int size) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect result(*rect);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.Inset(size, size);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result.ToRECT();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if using a high contrast theme.
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UsingHighContrastTheme() {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HIGHCONTRAST result;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.cbSize = sizeof(HIGHCONTRAST);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return SystemParametersInfo(SPI_GETHIGHCONTRAST, result.cbSize, &result, 0) &&
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (result.dwFlags & HCF_HIGHCONTRASTON) == HCF_HIGHCONTRASTON;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeThemeWin::IsThemingActive() const {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_theme_active_)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return !!is_theme_active_();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::GetThemeColor(ThemeName theme,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int part_id,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int state_id,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int prop_id,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      SkColor* color) const {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(theme);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && get_theme_color_) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COLORREF color_ref;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (get_theme_color_(handle, part_id, state_id, prop_id, &color_ref) ==
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        S_OK) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *color = skia::COLORREFToSkColor(color_ref);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return S_OK;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return E_NOTIMPL;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor NativeThemeWin::GetThemeColorWithDefault(ThemeName theme,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int part_id,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int state_id,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int prop_id,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int default_sys_color) const {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetThemeColor(theme, part_id, state_id, prop_id, &color) != S_OK)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    color = color_utils::GetSysSkColor(default_sys_color);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return color;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size NativeThemeWin::GetThemeBorderSize(ThemeName theme) const {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For simplicity use the wildcard state==0, part==0, since it works
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the cases we currently depend on.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int border;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetThemeInt(theme, 0, 0, TMT_BORDERSIZE, &border) == S_OK)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gfx::Size(border, border);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gfx::Size(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::DisableTheming() const {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!set_theme_properties_)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_theme_properties_(0);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::CloseHandles() const {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!close_theme_)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < LAST; ++i) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (theme_handles_[i]) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      close_theme_(theme_handles_[i]);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      theme_handles_[i] = NULL;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeThemeWin::IsClassicTheme(ThemeName name) const {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!theme_dll_)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !GetThemeHandle(name);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sky): seems like we should default to NativeThemeWin, but that currently
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// breaks a couple of tests (FocusTraversalTest.NormalTraversal in
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views_unittests).
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeTheme* NativeTheme::instance() {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NativeThemeWin::instance();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeThemeWin* NativeThemeWin::instance() {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(NativeThemeWin, s_native_theme, ());
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &s_native_theme;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size NativeThemeWin::GetPartSize(Part part,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      State state,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const ExtraParams& extra) const {
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size part_size = CommonThemeGetPartSize(part, state, extra);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!part_size.IsEmpty())
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return part_size;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The GetThemePartSize call below returns the default size without
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // accounting for user customization (crbug/218291).
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIZE size;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (part) {
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScrollbarDownArrow:
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScrollbarLeftArrow:
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScrollbarRightArrow:
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScrollbarUpArrow:
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScrollbarHorizontalThumb:
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScrollbarVerticalThumb:
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScrollbarHorizontalTrack:
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kScrollbarVerticalTrack:
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      size.cx = size.cy = gfx::win::GetSystemMetricsInDIP(SM_CXVSCROLL);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return gfx::Size(size.cx, size.cy);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int part_id = GetWindowsPart(part, state, extra);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id = GetWindowsState(part, state, extra);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HDC hdc = GetDC(NULL);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = GetThemePartSize(GetThemeName(part), hdc, part_id, state_id,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                NULL, TS_TRUE, &size);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReleaseDC(NULL, hdc);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (FAILED(hr)) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(rogerta): For now, we need to support radio buttons and checkboxes
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when theming is not enabled.  Support for other parts can be added
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // if/when needed.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (part) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kCheckbox:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kRadio:
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(rogerta): I was not able to find any API to get the default
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // size of these controls, so determined these values empirically.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size.cx = 13;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size.cy = 13;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size.cx = 0;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size.cy = 0;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(size.cx, size.cy);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::Paint(SkCanvas* canvas,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Part part,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           State state,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const gfx::Rect& rect,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const ExtraParams& extra) const {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (rect.IsEmpty())
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (part) {
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kMenuPopupGutter:
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CommonThemePaintMenuGutter(canvas, rect);
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kMenuPopupSeparator:
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CommonThemePaintMenuSeparator(canvas, rect, extra.menu_separator);
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kMenuPopupBackground:
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CommonThemePaintMenuBackground(canvas, rect);
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kMenuItemBackground:
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CommonThemePaintMenuItemBackground(canvas, state, rect);
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool needs_paint_indirect = false;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!skia::SupportsPlatformPaint(canvas)) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This block will only get hit with --enable-accelerated-drawing flag.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    needs_paint_indirect = true;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Scrollbar components on Windows Classic theme (on all Windows versions)
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // have particularly problematic alpha values, so always draw them
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // indirectly. In addition, scrollbar thumbs and grippers for the Windows XP
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // theme (available only on Windows XP) also need their alpha values
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // fixed.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (part) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kScrollbarDownArrow:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kScrollbarUpArrow:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kScrollbarLeftArrow:
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kScrollbarRightArrow:
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (!GetThemeHandle(SCROLLBAR))
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          needs_paint_indirect = true;
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kScrollbarHorizontalThumb:
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kScrollbarVerticalThumb:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kScrollbarHorizontalGripper:
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kScrollbarVerticalGripper:
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (!GetThemeHandle(SCROLLBAR) ||
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            base::win::GetVersion() == base::win::VERSION_XP)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          needs_paint_indirect = true;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (needs_paint_indirect)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PaintIndirect(canvas, part, state, rect, extra);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PaintDirect(canvas, part, state, rect, extra);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeThemeWin::NativeThemeWin()
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : theme_dll_(LoadLibrary(L"uxtheme.dll")),
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      draw_theme_(NULL),
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      draw_theme_ex_(NULL),
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_theme_color_(NULL),
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_theme_content_rect_(NULL),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_theme_part_size_(NULL),
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      open_theme_(NULL),
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      close_theme_(NULL),
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set_theme_properties_(NULL),
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_theme_active_(NULL),
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      get_theme_int_(NULL),
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      color_change_listener_(this) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (theme_dll_) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    draw_theme_ = reinterpret_cast<DrawThemeBackgroundPtr>(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "DrawThemeBackground"));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    draw_theme_ex_ = reinterpret_cast<DrawThemeBackgroundExPtr>(
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "DrawThemeBackgroundEx"));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_theme_color_ = reinterpret_cast<GetThemeColorPtr>(
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "GetThemeColor"));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_theme_content_rect_ = reinterpret_cast<GetThemeContentRectPtr>(
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "GetThemeBackgroundContentRect"));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_theme_part_size_ = reinterpret_cast<GetThemePartSizePtr>(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "GetThemePartSize"));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    open_theme_ = reinterpret_cast<OpenThemeDataPtr>(
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "OpenThemeData"));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    close_theme_ = reinterpret_cast<CloseThemeDataPtr>(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "CloseThemeData"));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_theme_properties_ = reinterpret_cast<SetThemeAppPropertiesPtr>(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "SetThemeAppProperties"));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_theme_active_ = reinterpret_cast<IsThemeActivePtr>(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "IsThemeActive"));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_theme_int_ = reinterpret_cast<GetThemeIntPtr>(
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProcAddress(theme_dll_, "GetThemeInt"));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(theme_handles_, 0, sizeof(theme_handles_));
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initialize the cached system colors.
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateSystemColors();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeThemeWin::~NativeThemeWin() {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (theme_dll_) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // todo (cpu): fix this soon.  Making a call to CloseHandles() here breaks
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // certain tests and the reliability bots.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CloseHandles();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FreeLibrary(theme_dll_);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeThemeWin::OnSysColorChange() {
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateSystemColors();
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeThemeWin::UpdateSystemColors() {
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < arraysize(kSystemColors); ++i) {
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    system_colors_[kSystemColors[i]] =
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        color_utils::GetSysSkColor(kSystemColors[i]);
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::PaintDirect(SkCanvas* canvas,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Part part,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 State state,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const gfx::Rect& rect,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const ExtraParams& extra) const {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skia::ScopedPlatformPaint scoped_platform_paint(canvas);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HDC hdc = scoped_platform_paint.GetPlatformSurface();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kCheckbox:
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintCheckbox(hdc, part, state, rect, extra.button);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kRadio:
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintRadioButton(hdc, part, state, rect, extra.button);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPushButton:
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintPushButton(hdc, part, state, rect, extra.button);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupArrow:
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintMenuArrow(hdc, state, rect, extra.menu_arrow);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupGutter:
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintMenuGutter(hdc, rect);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupSeparator:
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintMenuSeparator(hdc, rect, extra.menu_separator);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupBackground:
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintMenuBackground(hdc, rect);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuCheck:
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintMenuCheck(hdc, state, rect, extra.menu_check);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuCheckBackground:
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintMenuCheckBackground(hdc, state, rect);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuItemBackground:
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintMenuItemBackground(hdc, state, rect, extra.menu_item);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuList:
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintMenuList(hdc, state, rect, extra.menu_list);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarDownArrow:
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarUpArrow:
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarLeftArrow:
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarRightArrow:
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintScrollbarArrow(hdc, part, state, rect, extra.scrollbar_arrow);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarHorizontalTrack:
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarVerticalTrack:
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintScrollbarTrack(canvas, hdc, part, state, rect,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          extra.scrollbar_track);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarHorizontalThumb:
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarVerticalThumb:
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarHorizontalGripper:
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarVerticalGripper:
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintScrollbarThumb(hdc, part, state, rect, extra.scrollbar_thumb);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kInnerSpinButton:
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintSpinButton(hdc, part, state, rect, extra.inner_spin);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kTrackbarThumb:
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kTrackbarTrack:
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintTrackbar(canvas, hdc, part, state, rect, extra.trackbar);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kProgressBar:
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintProgressBar(hdc, rect, extra.progress_bar);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kWindowResizeGripper:
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintWindowResizeGripper(hdc, rect);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kTabPanelBackground:
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintTabPanelBackground(hdc, rect);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kTextField:
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PaintTextField(hdc, part, state, rect, extra.text_field);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kSliderTrack:
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kSliderThumb:
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // While transitioning NativeThemeWin to the single Paint() entry point,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // unsupported parts will DCHECK here.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor color;
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (CommonThemeGetSystemColor(color_id, &color))
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return color;
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (color_id) {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Windows
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_WindowBackground:
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOW];
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Dialogs
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_DialogBackground:
501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (gfx::IsInvertedColorScheme())
502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return color_utils::InvertColor(kDialogBackgroundColor);
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return kDialogBackgroundColor;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FocusableBorder
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_FocusedBorderColor:
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kFocusedBorderColor;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_UnfocusedBorderColor:
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kUnfocusedBorderColor;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Button
51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonBackgroundColor:
51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return kButtonBackgroundColor;
51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonEnabledColor:
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_BTNTEXT];
51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonDisabledColor:
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_GRAYTEXT];
51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonHighlightColor:
51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return kButtonHighlightColor;
52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonHoverColor:
52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return kButtonHoverColor;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // MenuItem
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_EnabledMenuItemForegroundColor:
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kEnabledMenuItemForegroundColor;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_DisabledMenuItemForegroundColor:
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kDisabledMenuItemForegroundColor;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_FocusedMenuItemBackgroundColor:
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kFocusedMenuItemBackgroundColor;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_MenuSeparatorColor:
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kMenuSeparatorColor;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Label
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_LabelEnabledColor:
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_BTNTEXT];
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_LabelDisabledColor:
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_GRAYTEXT];
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_LabelBackgroundColor:
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOW];
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Textfield
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_TextfieldDefaultColor:
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOWTEXT];
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_TextfieldDefaultBackground:
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOW];
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TextfieldReadOnlyColor:
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_GRAYTEXT];
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TextfieldReadOnlyBackground:
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_3DFACE];
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_TextfieldSelectionColor:
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_HIGHLIGHTTEXT];
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kColorId_TextfieldSelectionBackgroundFocused:
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_HIGHLIGHT];
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Tree
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // NOTE: these aren't right for all themes, but as close as I could get.
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TreeBackground:
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOW];
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TreeText:
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOWTEXT];
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TreeSelectedText:
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_HIGHLIGHTTEXT];
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TreeSelectedTextUnfocused:
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_BTNTEXT];
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TreeSelectionBackgroundFocused:
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_HIGHLIGHT];
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TreeSelectionBackgroundUnfocused:
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[UsingHighContrastTheme() ?
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              COLOR_MENUHIGHLIGHT : COLOR_BTNFACE];
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TreeArrow:
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOWTEXT];
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Table
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TableBackground:
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOW];
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TableText:
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_WINDOWTEXT];
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TableSelectedText:
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_HIGHLIGHTTEXT];
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TableSelectedTextUnfocused:
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_BTNTEXT];
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TableSelectionBackgroundFocused:
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_HIGHLIGHT];
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TableSelectionBackgroundUnfocused:
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[UsingHighContrastTheme() ?
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              COLOR_MENUHIGHLIGHT : COLOR_BTNFACE];
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TableGroupingIndicatorColor:
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return system_colors_[COLOR_GRAYTEXT];
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kInvalidColorIdColor;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeThemeWin::PaintIndirect(SkCanvas* canvas,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   Part part,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   State state,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const gfx::Rect& rect,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const ExtraParams& extra) const {
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(asvitkine): This path is pretty inefficient - for each paint operation
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                  it creates a new offscreen bitmap Skia canvas. This can
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                  be sped up by doing it only once per part/state and
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                  keeping a cache of the resulting bitmaps.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an offscreen canvas that is backed by an HDC.
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skia::RefPtr<skia::BitmapPlatformDevice> device = skia::AdoptRef(
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::BitmapPlatformDevice::Create(
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          rect.width(), rect.height(), false, NULL));
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(device);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkCanvas offscreen_canvas(device.get());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(skia::SupportsPlatformPaint(&offscreen_canvas));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some of the Windows theme drawing operations do not write correct alpha
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // values for fully-opaque pixels; instead the pixels get alpha 0. This is
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // especially a problem on Windows XP or when using the Classic theme.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To work-around this, mark all pixels with a placeholder value, to detect
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which pixels get touched by the paint operation. After paint, set any
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pixels that have alpha 0 to opaque and placeholders to fully-transparent.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SkColor placeholder = SkColorSetARGB(1, 0, 0, 0);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  offscreen_canvas.clear(placeholder);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Offset destination rects to have origin (0,0).
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect adjusted_rect(rect.size());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtraParams adjusted_extra(extra);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kProgressBar:
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      adjusted_extra.progress_bar.value_rect_x = 0;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      adjusted_extra.progress_bar.value_rect_y = 0;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarHorizontalTrack:
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarVerticalTrack:
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      adjusted_extra.scrollbar_track.track_x = 0;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      adjusted_extra.scrollbar_track.track_y = 0;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: break;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw the theme controls using existing HDC-drawing code.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintDirect(&offscreen_canvas,
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              part,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              state,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              adjusted_rect,
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              adjusted_extra);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy the pixels to a bitmap that has ref-counted pixel storage, which is
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // necessary to have when drawing to a SkPicture.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SkBitmap& hdc_bitmap =
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offscreen_canvas.getDevice()->accessBitmap(false);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap bitmap;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hdc_bitmap.copyTo(&bitmap, SkBitmap::kARGB_8888_Config);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Post-process the pixels to fix up the alpha values (see big comment above).
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SkPMColor placeholder_value = SkPreMultiplyColor(placeholder);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int pixel_count = rect.width() * rect.height();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkPMColor* pixels = bitmap.getAddr32(0, 0);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < pixel_count; i++) {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pixels[i] == placeholder_value) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Pixel wasn't touched - make it fully transparent.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels[i] = SkPackARGB32(0, 0, 0, 0);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (SkGetPackedA32(pixels[i]) == 0) {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Pixel was touched but has incorrect alpha of 0, make it fully opaque.
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels[i] = SkPackARGB32(0xFF,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               SkGetPackedR32(pixels[i]),
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               SkGetPackedG32(pixels[i]),
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               SkGetPackedB32(pixels[i]));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw the offscreen bitmap to the destination canvas.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->drawBitmap(bitmap, rect.x(), rect.y());
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::GetThemePartSize(ThemeName theme_name,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         HDC hdc,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int part_id,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int state_id,
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         RECT* rect,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int ts,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         SIZE* size) const {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(theme_name);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && get_theme_part_size_)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return get_theme_part_size_(handle, hdc, part_id, state_id, rect, ts, size);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return E_NOTIMPL;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintButton(HDC hdc,
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    State state,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const ButtonExtraParams& extra,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int part_id,
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int state_id,
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    RECT* rect) const {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(BUTTON);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, part_id, state_id, rect, NULL);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adjust classic_state based on part, state, and extras.
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int classic_state = extra.classic_state;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part_id) {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BP_CHECKBOX:
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state |= DFCS_BUTTONCHECK;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BP_RADIOBUTTON:
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state |= DFCS_BUTTONRADIO;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BP_PUSHBUTTON:
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state |= DFCS_BUTTONPUSH;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown part_id: " << part_id;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state |= DFCS_INACTIVE;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state |= DFCS_PUSHED;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unknown state: " << state;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extra.checked)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    classic_state |= DFCS_CHECKED;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw it manually.
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All pressed states have both low bits set, and no other states do.
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool focused = ((state_id & ETS_FOCUSED) == ETS_FOCUSED);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool pressed = ((state_id & PBS_PRESSED) == PBS_PRESSED);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((BP_PUSHBUTTON == part_id) && (pressed || focused)) {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // BP_PUSHBUTTON has a focus rect drawn around the outer edge, and the
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // button itself is shrunk by 1 pixel.
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HBRUSH brush = GetSysColorBrush(COLOR_3DDKSHADOW);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (brush) {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FrameRect(hdc, rect, brush);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InflateRect(rect, -1, -1);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawFrameControl(hdc, rect, DFC_BUTTON, classic_state);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw the focus rectangle (the dotted line box) only on buttons.  For radio
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and checkboxes, we let webkit draw the focus rectangle (orange glow).
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((BP_PUSHBUTTON == part_id) && focused) {
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The focus rect is inside the button.  The exact number of pixels depends
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // on whether we're in classic mode or using uxtheme.
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handle && get_theme_content_rect_) {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_theme_content_rect_(handle, hdc, part_id, state_id, rect, rect);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InflateRect(rect, -GetSystemMetrics(SM_CXEDGE),
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  -GetSystemMetrics(SM_CYEDGE));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawFocusRect(hdc, rect);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Classic theme doesn't support indeterminate checkboxes.  We draw
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a recangle inside a checkbox like IE10 does.
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (part_id == BP_CHECKBOX && extra.indeterminate) {
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RECT inner_rect = *rect;
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // "4 / 13" is same as IE10 in classic theme.
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int padding = (inner_rect.right - inner_rect.left) * 4 / 13;
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    InflateRect(&inner_rect, -padding, -padding);
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int color_index = state == kDisabled ? COLOR_GRAYTEXT : COLOR_WINDOWTEXT;
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FillRect(hdc, &inner_rect, GetSysColorBrush(color_index));
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuSeparator(
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MenuSeparatorExtraParams& extra) const {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(MENU);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_) {
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delta is needed for non-classic to move separator up slightly.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    --rect_win.top;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    --rect_win.bottom;
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, MENU_POPUPSEPARATOR, MPI_NORMAL, &rect_win,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NULL);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawEdge(hdc, &rect_win, EDGE_ETCHED, BF_TOP);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuGutter(HDC hdc,
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const gfx::Rect& rect) const {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(MENU);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, MENU_POPUPGUTTER, MPI_NORMAL, &rect_win,
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NULL);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return E_NOTIMPL;
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuArrow(HDC hdc,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       State state,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const gfx::Rect& rect,
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const MenuArrowExtraParams& extra)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const {
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id = MSM_NORMAL;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state == kDisabled)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_id = MSM_DISABLED;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(MENU);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_) {
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extra.pointing_right) {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return draw_theme_(handle, hdc, MENU_POPUPSUBMENU, state_id, &rect_win,
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         NULL);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // There is no way to tell the uxtheme API to draw a left pointing arrow;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // it doesn't have a flag equivalent to DFCS_MENUARROWRIGHT.  But they
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // are needed for RTL locales on Vista.  So use a memory DC and mirror
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the region with GDI's StretchBlt.
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect r(rect);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::win::ScopedCreateDC mem_dc(CreateCompatibleDC(hdc));
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::win::ScopedBitmap mem_bitmap(CreateCompatibleBitmap(hdc, r.width(),
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                r.height()));
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::win::ScopedSelectObject select_bitmap(mem_dc, mem_bitmap);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Copy and horizontally mirror the background from hdc into mem_dc. Use
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // a negative-width source rect, starting at the rightmost pixel.
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StretchBlt(mem_dc, 0, 0, r.width(), r.height(),
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 hdc, r.right()-1, r.y(), -r.width(), r.height(), SRCCOPY);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Draw the arrow.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RECT theme_rect = {0, 0, r.width(), r.height()};
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT result = draw_theme_(handle, mem_dc, MENU_POPUPSUBMENU,
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   state_id, &theme_rect, NULL);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Copy and mirror the result back into mem_dc.
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StretchBlt(hdc, r.x(), r.y(), r.width(), r.height(),
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 mem_dc, r.width()-1, 0, -r.width(), r.height(), SRCCOPY);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return result;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For some reason, Windows uses the name DFCS_MENUARROWRIGHT to indicate a
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // left pointing arrow. This makes the following 'if' statement slightly
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // counterintuitive.
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UINT pfc_state;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extra.pointing_right)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfc_state = DFCS_MENUARROW;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pfc_state = DFCS_MENUARROWRIGHT;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PaintFrameControl(hdc, rect, DFC_MENU, pfc_state, extra.is_selected,
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           state);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuBackground(HDC hdc,
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const gfx::Rect& rect) const {
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(MENU);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_) {
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HRESULT result = draw_theme_(handle, hdc, MENU_POPUPBACKGROUND, 0,
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &rect_win, NULL);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FrameRect(hdc, &rect_win, GetSysColorBrush(COLOR_3DSHADOW));
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillRect(hdc, &rect_win, GetSysColorBrush(COLOR_MENU));
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawEdge(hdc, &rect_win, EDGE_RAISED, BF_RECT);
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuCheck(
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state,
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MenuCheckExtraParams& extra) const {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(MENU);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extra.is_radio) {
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_id = state == kDisabled ? MC_BULLETDISABLED : MC_BULLETNORMAL;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_id = state == kDisabled ? MC_CHECKMARKDISABLED : MC_CHECKMARKNORMAL;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, MENU_POPUPCHECK, state_id, &rect_win, NULL);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PaintFrameControl(hdc, rect, DFC_MENU,
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           extra.is_radio ? DFCS_MENUBULLET : DFCS_MENUCHECK,
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           extra.is_selected, state);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuCheckBackground(HDC hdc,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 State state,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const gfx::Rect& rect) const {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(MENU);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id = state == kDisabled ? MCB_DISABLED : MCB_NORMAL;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, MENU_POPUPCHECKBACKGROUND, state_id,
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &rect_win, NULL);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing to do for background.
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuItemBackground(
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state,
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MenuItemExtraParams& extra) const {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(MENU);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = MPI_NORMAL;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.is_selected ? MPI_DISABLEDHOT : MPI_DISABLED;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = MPI_HOT;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state " << state;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, MENU_POPUPITEM, state_id, &rect_win, NULL);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extra.is_selected)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FillRect(hdc, &rect_win, GetSysColorBrush(COLOR_HIGHLIGHT));
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintPushButton(HDC hdc,
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        Part part,
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        State state,
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const gfx::Rect& rect,
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const ButtonExtraParams& extra) const {
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = PBS_DISABLED;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = PBS_HOT;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.is_default ? PBS_DEFAULTED : PBS_NORMAL;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = PBS_PRESSED;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state: " << state;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PaintButton(hdc, state, extra, BP_PUSHBUTTON, state_id, &rect_win);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintRadioButton(HDC hdc,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Part part,
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         State state,
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const gfx::Rect& rect,
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const ButtonExtraParams& extra) const {
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.checked ? RBS_CHECKEDDISABLED : RBS_UNCHECKEDDISABLED;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.checked ? RBS_CHECKEDHOT : RBS_UNCHECKEDHOT;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.checked ? RBS_CHECKEDNORMAL : RBS_UNCHECKEDNORMAL;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.checked ? RBS_CHECKEDPRESSED : RBS_UNCHECKEDPRESSED;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state: " << state;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PaintButton(hdc, state, extra, BP_RADIOBUTTON, state_id, &rect_win);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintCheckbox(HDC hdc,
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Part part,
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      State state,
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const gfx::Rect& rect,
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const ButtonExtraParams& extra) const {
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.checked ? CBS_CHECKEDDISABLED :
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extra.indeterminate ? CBS_MIXEDDISABLED :
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              CBS_UNCHECKEDDISABLED;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.checked ? CBS_CHECKEDHOT :
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extra.indeterminate ? CBS_MIXEDHOT :
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              CBS_UNCHECKEDHOT;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.checked ? CBS_CHECKEDNORMAL :
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extra.indeterminate ? CBS_MIXEDNORMAL :
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              CBS_UNCHECKEDNORMAL;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.checked ? CBS_CHECKEDPRESSED :
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extra.indeterminate ? CBS_MIXEDPRESSED :
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              CBS_UNCHECKEDPRESSED;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state: " << state;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PaintButton(hdc, state, extra, BP_CHECKBOX, state_id, &rect_win);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintMenuList(HDC hdc,
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      State state,
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const gfx::Rect& rect,
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const MenuListExtraParams& extra) const {
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(MENULIST);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = CBXS_NORMAL;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = CBXS_DISABLED;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = CBXS_HOT;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = CBXS_PRESSED;
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state " << state;
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, CP_DROPDOWNBUTTON, state_id, &rect_win,
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NULL);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw it manually.
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawFrameControl(hdc, &rect_win, DFC_SCROLL,
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   DFCS_SCROLLCOMBOBOX | extra.classic_state);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintScrollbarArrow(
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Part part,
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state,
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ScrollbarArrowExtraParams& extra) const {
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int state_id_matrix[4][kMaxState] = {
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ABS_DOWNDISABLED, ABS_DOWNHOT, ABS_DOWNNORMAL, ABS_DOWNPRESSED,
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ABS_LEFTDISABLED, ABS_LEFTHOT, ABS_LEFTNORMAL, ABS_LEFTPRESSED,
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ABS_RIGHTDISABLED, ABS_RIGHTHOT, ABS_RIGHTNORMAL, ABS_RIGHTPRESSED,
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ABS_UPDISABLED, ABS_UPHOT, ABS_UPNORMAL, ABS_UPPRESSED
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(SCROLLBAR);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_) {
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index = part - kScrollbarDownArrow;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(index >=0 && index < 4);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int state_id = state_id_matrix[index][state];
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Hovering means that the cursor is over the scroolbar, but not over the
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // specific arrow itself.  We don't want to show it "hot" mode, but only
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in "hover" mode.
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (state == kHovered && extra.is_hovering) {
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (part) {
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kScrollbarDownArrow:
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_DOWNHOVER;
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kScrollbarLeftArrow:
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_LEFTHOVER;
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kScrollbarRightArrow:
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_RIGHTHOVER;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kScrollbarUpArrow:
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_UPHOVER;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid part: " << part;
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PaintScaledTheme(handle, hdc, SBP_ARROWBTN, state_id, rect);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int classic_state = DFCS_SCROLLDOWN;
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part) {
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarDownArrow:
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state = DFCS_SCROLLDOWN;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarLeftArrow:
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state = DFCS_SCROLLLEFT;
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarRightArrow:
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state = DFCS_SCROLLRIGHT;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarUpArrow:
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state = DFCS_SCROLLUP;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid part: " << part;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state |= DFCS_INACTIVE;
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state |= DFCS_HOT;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      classic_state |= DFCS_PUSHED;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state: " << state;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawFrameControl(hdc, &rect_win, DFC_SCROLL, classic_state);
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintScrollbarThumb(
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Part part,
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state,
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ScrollbarThumbExtraParams& extra) const {
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(SCROLLBAR);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int part_id;
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part) {
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kScrollbarHorizontalThumb:
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = SBP_THUMBBTNHORZ;
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kScrollbarVerticalThumb:
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = SBP_THUMBBTNVERT;
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kScrollbarHorizontalGripper:
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = SBP_GRIPPERHORZ;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kScrollbarVerticalGripper:
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = SBP_GRIPPERVERT;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid part: " << part;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = SCRBS_DISABLED;
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.is_hovering ? SCRBS_HOVER : SCRBS_HOT;
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = SCRBS_NORMAL;
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = SCRBS_PRESSED;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state: " << state;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PaintScaledTheme(handle, hdc, part_id, state_id, rect);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw it manually.
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((part_id == SBP_THUMBBTNHORZ) || (part_id == SBP_THUMBBTNVERT))
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawEdge(hdc, &rect_win, EDGE_RAISED, BF_RECT | BF_MIDDLE);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Classic mode doesn't have a gripper.
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintScrollbarTrack(
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkCanvas* canvas,
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Part part,
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state,
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ScrollbarTrackExtraParams& extra) const {
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(SCROLLBAR);
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int part_id;
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part) {
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kScrollbarHorizontalTrack:
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = extra.is_upper ? SBP_UPPERTRACKHORZ : SBP_LOWERTRACKHORZ;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kScrollbarVerticalTrack:
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = extra.is_upper ? SBP_UPPERTRACKVERT : SBP_LOWERTRACKVERT;
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid part: " << part;
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = SCRBS_DISABLED;
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = SCRBS_HOVER;
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = SCRBS_NORMAL;
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = SCRBS_PRESSED;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state: " << state;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, part_id, state_id, &rect_win, NULL);
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw it manually.
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((system_colors_[COLOR_SCROLLBAR] != system_colors_[COLOR_3DFACE]) &&
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (system_colors_[COLOR_SCROLLBAR] != system_colors_[COLOR_WINDOW])) {
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FillRect(hdc, &rect_win, reinterpret_cast<HBRUSH>(COLOR_SCROLLBAR + 1));
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPaint paint;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RECT align_rect = gfx::Rect(extra.track_x, extra.track_y, extra.track_width,
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                extra.track_height).ToRECT();
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetCheckerboardShader(&paint, align_rect);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas->drawIRect(skia::RECTToSkIRect(rect_win), paint);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extra.classic_state & DFCS_PUSHED)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvertRect(hdc, &rect_win);
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintSpinButton(
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Part part,
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state,
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const InnerSpinButtonExtraParams& extra) const {
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(SPIN);
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int part_id = extra.spin_up ? SPNP_UP : SPNP_DOWN;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.spin_up ? UPS_DISABLED : DNS_DISABLED;
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.spin_up ? UPS_HOT : DNS_HOT;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.spin_up ? UPS_NORMAL : DNS_NORMAL;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = extra.spin_up ? UPS_PRESSED : DNS_PRESSED;
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state " << state;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, part_id, state_id, &rect_win, NULL);
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawFrameControl(hdc, &rect_win, DFC_SCROLL, extra.classic_state);
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintTrackbar(
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkCanvas* canvas,
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Part part,
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state,
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TrackbarExtraParams& extra) const {
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int part_id = part == kTrackbarTrack ? TKP_TRACK : TKP_THUMBBOTTOM;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extra.vertical)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    part_id = part == kTrackbarTrack ? TKP_TRACKVERT : TKP_THUMBVERT;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id = 0;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = TUS_DISABLED;
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = TUS_HOT;
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = TUS_NORMAL;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = TUS_PRESSED;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state " << state;
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the channel be 4 px thick in the center of the supplied rect.  (4 px
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matches what XP does in various menus; GetThemePartSize() doesn't seem to
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return good values here.)
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT channel_rect = rect.ToRECT();
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int channel_thickness = 4;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (part_id == TKP_TRACK) {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_rect.top +=
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((channel_rect.bottom - channel_rect.top - channel_thickness) / 2);
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_rect.bottom = channel_rect.top + channel_thickness;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (part_id == TKP_TRACKVERT) {
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_rect.left +=
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((channel_rect.right - channel_rect.left - channel_thickness) / 2);
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel_rect.right = channel_rect.left + channel_thickness;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }  // else this isn't actually a channel, so |channel_rect| == |rect|.
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(TRACKBAR);
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, part_id, state_id, &channel_rect, NULL);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Classic mode, draw it manually.
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((part_id == TKP_TRACK) || (part_id == TKP_TRACKVERT)) {
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawEdge(hdc, &channel_rect, EDGE_SUNKEN, BF_RECT);
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (part_id == TKP_THUMBVERT) {
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawEdge(hdc, &rect_win, EDGE_RAISED, BF_RECT | BF_SOFT | BF_MIDDLE);
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Split rect into top and bottom pieces.
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RECT top_section = rect.ToRECT();
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RECT bottom_section = rect.ToRECT();
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_section.bottom -= ((bottom_section.right - bottom_section.left) / 2);
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bottom_section.top = top_section.bottom;
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawEdge(hdc, &top_section, EDGE_RAISED,
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             BF_LEFT | BF_TOP | BF_RIGHT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Split triangular piece into two diagonals.
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RECT& left_half = bottom_section;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RECT right_half = bottom_section;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    right_half.left += ((bottom_section.right - bottom_section.left) / 2);
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    left_half.right = right_half.left;
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawEdge(hdc, &left_half, EDGE_RAISED,
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             BF_DIAGONAL_ENDTOPLEFT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrawEdge(hdc, &right_half, EDGE_RAISED,
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             BF_DIAGONAL_ENDBOTTOMLEFT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the button is pressed, draw hatching.
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extra.classic_state & DFCS_PUSHED) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkPaint paint;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetCheckerboardShader(&paint, rect_win);
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Fill all three pieces with the pattern.
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      canvas->drawIRect(skia::RECTToSkIRect(top_section), paint);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkScalar left_triangle_top = SkIntToScalar(left_half.top);
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkScalar left_triangle_right = SkIntToScalar(left_half.right);
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkPath left_triangle;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      left_triangle.moveTo(SkIntToScalar(left_half.left), left_triangle_top);
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      left_triangle.lineTo(left_triangle_right, left_triangle_top);
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      left_triangle.lineTo(left_triangle_right,
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           SkIntToScalar(left_half.bottom));
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      left_triangle.close();
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      canvas->drawPath(left_triangle, paint);
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkScalar right_triangle_left = SkIntToScalar(right_half.left);
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkScalar right_triangle_top = SkIntToScalar(right_half.top);
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkPath right_triangle;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      right_triangle.moveTo(right_triangle_left, right_triangle_top);
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      right_triangle.lineTo(SkIntToScalar(right_half.right),
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            right_triangle_top);
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      right_triangle.lineTo(right_triangle_left,
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            SkIntToScalar(right_half.bottom));
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      right_triangle.close();
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      canvas->drawPath(right_triangle, paint);
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintProgressBar(
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ProgressBarExtraParams& extra) const {
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is no documentation about the animation speed, frame-rate, nor
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // size of moving overlay of the indeterminate progress bar.
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // So we just observed real-world programs and guessed following parameters.
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kDeteminateOverlayPixelsPerSecond = 300;
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kDeteminateOverlayWidth = 120;
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kIndeterminateOverlayPixelsPerSecond =  175;
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kVistaIndeterminateOverlayWidth = 120;
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kXPIndeterminateOverlayWidth = 55;
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The thickness of the bar frame inside |value_rect|
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kXPBarPadding = 3;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT bar_rect = rect.ToRECT();
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT value_rect = gfx::Rect(extra.value_rect_x,
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              extra.value_rect_y,
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              extra.value_rect_width,
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              extra.value_rect_height).ToRECT();
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pre_vista = base::win::GetVersion() < base::win::VERSION_VISTA;
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(PROGRESS);
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_ && draw_theme_ex_) {
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    draw_theme_(handle, hdc, PP_BAR, 0, &bar_rect, NULL);
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bar_width = bar_rect.right - bar_rect.left;
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extra.determinate) {
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(morrita): this RTL guess can be wrong.
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We should pass the direction from WebKit side.
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_rtl = (bar_rect.right == value_rect.right &&
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bar_rect.left != value_rect.left);
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We should care the direction here because PP_CNUNK painting
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // is asymmetric.
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DTBGOPTS value_draw_options;
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_draw_options.dwSize = sizeof(DTBGOPTS);
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_draw_options.dwFlags = is_rtl ? DTBG_MIRRORDC : 0;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value_draw_options.rcClip = bar_rect;
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (pre_vista) {
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // On XP, progress bar is chunk-style and has no glossy effect.
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // We need to shrink destination rect to fit the part inside the bar
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // with an appropriate margin.
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RECT shrunk_value_rect = InsetRect(&value_rect, kXPBarPadding);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        draw_theme_ex_(handle, hdc, PP_CHUNK, 0,
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &shrunk_value_rect, &value_draw_options);
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else  {
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // On Vista or later, the progress bar part has a
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // single-block value part. It also has glossy effect.
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // And the value part has exactly same height as the bar part
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // so we don't need to shrink the rect.
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        draw_theme_ex_(handle, hdc, PP_FILL, 0,
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &value_rect, &value_draw_options);
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int dx = ComputeAnimationProgress(bar_width,
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          kDeteminateOverlayWidth,
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          kDeteminateOverlayPixelsPerSecond,
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          extra.animated_seconds);
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RECT overlay_rect = value_rect;
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        overlay_rect.left += dx;
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        overlay_rect.right = overlay_rect.left + kDeteminateOverlayWidth;
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        draw_theme_(handle, hdc, PP_MOVEOVERLAY, 0, &overlay_rect, &value_rect);
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // A glossy overlay for indeterminate progress bar has small pause
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // after each animation. We emulate this by adding an invisible margin
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the animation has to traverse.
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int width_with_margin = bar_width + kIndeterminateOverlayPixelsPerSecond;
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int overlay_width = pre_vista ?
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kXPIndeterminateOverlayWidth : kVistaIndeterminateOverlayWidth;
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int dx = ComputeAnimationProgress(width_with_margin,
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        overlay_width,
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        kIndeterminateOverlayPixelsPerSecond,
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        extra.animated_seconds);
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RECT overlay_rect = bar_rect;
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      overlay_rect.left += dx;
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      overlay_rect.right = overlay_rect.left + overlay_width;
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (pre_vista) {
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RECT shrunk_rect = InsetRect(&overlay_rect, kXPBarPadding);
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RECT shrunk_bar_rect = InsetRect(&bar_rect, kXPBarPadding);
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        draw_theme_(handle, hdc, PP_CHUNK, 0, &shrunk_rect, &shrunk_bar_rect);
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        draw_theme_(handle, hdc, PP_MOVEOVERLAY, 0, &overlay_rect, &bar_rect);
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return S_OK;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HBRUSH bg_brush = GetSysColorBrush(COLOR_BTNFACE);
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HBRUSH fg_brush = GetSysColorBrush(COLOR_BTNSHADOW);
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillRect(hdc, &bar_rect, bg_brush);
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillRect(hdc, &value_rect, fg_brush);
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawEdge(hdc, &bar_rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintWindowResizeGripper(HDC hdc,
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const gfx::Rect& rect) const {
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(STATUS);
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_) {
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Paint the status bar gripper.  There doesn't seem to be a
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // standard gripper in Windows for the space between
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // scrollbars.  This is pretty close, but it's supposed to be
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // painted over a status bar.
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, SP_GRIPPER, 0, &rect_win, NULL);
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Draw a windows classic scrollbar gripper.
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawFrameControl(hdc, &rect_win, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintTabPanelBackground(HDC hdc,
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const gfx::Rect& rect) const {
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(TAB);
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && draw_theme_)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return draw_theme_(handle, hdc, TABP_BODY, 0, &rect_win, NULL);
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Classic just renders a flat color background.
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillRect(hdc, &rect_win, reinterpret_cast<HBRUSH>(COLOR_3DFACE + 1));
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintTextField(
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HDC hdc,
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Part part,
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state,
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& rect,
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TextFieldExtraParams& extra) const {
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int part_id = EP_EDITTEXT;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id = ETS_NORMAL;
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kNormal:
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (extra.is_read_only) {
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_id = ETS_READONLY;
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (extra.is_focused) {
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_id = ETS_FOCUSED;
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        state_id = ETS_NORMAL;
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kHovered:
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = ETS_HOT;
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPressed:
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = ETS_SELECTED;
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kDisabled:
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_id = ETS_DISABLED;
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid state: " << state;
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT rect_win = rect.ToRECT();
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PaintTextField(hdc, part_id, state_id, extra.classic_state,
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        &rect_win,
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        skia::SkColorToCOLORREF(extra.background_color),
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        extra.fill_content_area, extra.draw_edges);
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintTextField(HDC hdc,
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int part_id,
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int state_id,
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int classic_state,
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       RECT* rect,
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       COLORREF color,
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool fill_content_area,
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool draw_edges) const {
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(ojan): http://b/1210017 Figure out how to give the ability to
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exclude individual edges from being drawn.
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(TEXTFIELD);
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mpcomplete): can we detect if the color is specified by the user,
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and if not, just use the system color?
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CreateSolidBrush() accepts a RGB value but alpha must be 0.
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HBRUSH bg_brush = CreateSolidBrush(color);
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr;
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DrawThemeBackgroundEx was introduced in XP SP2, so that it's possible
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // draw_theme_ex_ is NULL and draw_theme_ is non-null.
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && (draw_theme_ex_ || (draw_theme_ && draw_edges))) {
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (draw_theme_ex_) {
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static const DTBGOPTS omit_border_options = {
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sizeof(DTBGOPTS),
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DTBG_OMITBORDER,
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        { 0, 0, 0, 0 }
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      };
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const DTBGOPTS* draw_opts = draw_edges ? NULL : &omit_border_options;
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hr = draw_theme_ex_(handle, hdc, part_id, state_id, rect, draw_opts);
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hr = draw_theme_(handle, hdc, part_id, state_id, rect, NULL);
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(maruel): Need to be fixed if get_theme_content_rect_ is NULL.
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fill_content_area && get_theme_content_rect_) {
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RECT content_rect;
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hr = get_theme_content_rect_(handle, hdc, part_id, state_id, rect,
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &content_rect);
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FillRect(hdc, &content_rect, bg_brush);
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Draw it manually.
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (draw_edges)
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DrawEdge(hdc, rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fill_content_area) {
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FillRect(hdc, rect, (classic_state & DFCS_INACTIVE) ?
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1) : bg_brush);
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = S_OK;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteObject(bg_brush);
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)HRESULT NativeThemeWin::PaintScaledTheme(HANDLE theme,
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         HDC hdc,
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         int part_id,
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         int state_id,
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         const gfx::Rect& rect) const {
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Correct the scaling and positioning of sub-components such as scrollbar
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // arrows and thumb grippers in the event that the world transform applies
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // scaling (e.g. in high-DPI mode).
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  XFORM save_transform;
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWorldTransform(hdc, &save_transform)) {
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float scale = save_transform.eM11;
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (scale != 1 && save_transform.eM12 == 0) {
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ModifyWorldTransform(hdc, NULL, MWT_IDENTITY);
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect scaled_rect = gfx::ToEnclosedRect(
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::ScaleRect(rect, scale));
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RECT bounds = gfx::Rect(scaled_rect.x() + save_transform.eDx,
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              scaled_rect.y() + save_transform.eDy,
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              scaled_rect.width(),
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              scaled_rect.height()).ToRECT();
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HRESULT result = draw_theme_(theme, hdc, part_id, state_id, &bounds,
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   NULL);
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetWorldTransform(hdc, &save_transform);
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return result;
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RECT bounds = rect.ToRECT();
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return draw_theme_(theme, hdc, part_id, state_id, &bounds, NULL);
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeThemeWin::ThemeName NativeThemeWin::GetThemeName(Part part) {
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThemeName name;
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part) {
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kCheckbox:
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kRadio:
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPushButton:
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = BUTTON;
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kInnerSpinButton:
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = SPIN;
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuCheck:
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupGutter:
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuList:
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupArrow:
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupSeparator:
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = MENU;
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kProgressBar:
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = PROGRESS;
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarDownArrow:
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarLeftArrow:
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarRightArrow:
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarUpArrow:
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarHorizontalThumb:
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarVerticalThumb:
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarHorizontalTrack:
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarVerticalTrack:
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = SCROLLBAR;
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kSliderTrack:
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kSliderThumb:
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = TRACKBAR;
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kTextField:
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = TEXTFIELD;
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kWindowResizeGripper:
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = STATUS;
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid part: " << part;
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return name;
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeThemeWin::GetWindowsPart(Part part,
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   State state,
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const ExtraParams& extra) {
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int part_id;
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part) {
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kCheckbox:
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = BP_CHECKBOX;
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuCheck:
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = MENU_POPUPCHECK;
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupArrow:
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = MENU_POPUPSUBMENU;
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupGutter:
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = MENU_POPUPGUTTER;
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupSeparator:
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = MENU_POPUPSEPARATOR;
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPushButton:
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = BP_PUSHBUTTON;
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kRadio:
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = BP_RADIOBUTTON;
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kWindowResizeGripper:
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = SP_GRIPPER;
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarDownArrow:
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarLeftArrow:
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarRightArrow:
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarUpArrow:
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      part_id = SBP_ARROWBTN;
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarHorizontalThumb:
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      part_id = SBP_THUMBBTNHORZ;
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarVerticalThumb:
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      part_id = SBP_THUMBBTNVERT;
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid part: " << part;
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return part_id;
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeThemeWin::GetWindowsState(Part part,
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    State state,
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const ExtraParams& extra) {
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int state_id;
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (part) {
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kCheckbox:
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = CBS_UNCHECKEDNORMAL;
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = CBS_UNCHECKEDHOT;
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = CBS_UNCHECKEDPRESSED;
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = CBS_UNCHECKEDDISABLED;
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuCheck:
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = extra.menu_check.is_radio ? MC_BULLETNORMAL
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               : MC_CHECKMARKNORMAL;
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = extra.menu_check.is_radio ? MC_BULLETDISABLED
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               : MC_CHECKMARKDISABLED;
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupArrow:
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupGutter:
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kMenuPopupSeparator:
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = MBI_NORMAL;
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = MBI_HOT;
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = MBI_PUSHED;
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = MBI_DISABLED;
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kPushButton:
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = PBS_NORMAL;
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = PBS_HOT;
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = PBS_PRESSED;
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = PBS_DISABLED;
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kRadio:
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = RBS_UNCHECKEDNORMAL;
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = RBS_UNCHECKEDHOT;
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = RBS_UNCHECKEDPRESSED;
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = RBS_UNCHECKEDDISABLED;
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kWindowResizeGripper:
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = 1;  // gripper has no windows state
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarDownArrow:
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_DOWNNORMAL;
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Mimic ScrollbarThemeChromiumWin.cpp in WebKit.
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ABS_DOWNHOT : ABS_DOWNHOVER;
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_DOWNPRESSED;
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_DOWNDISABLED;
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarLeftArrow:
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_LEFTNORMAL;
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Mimic ScrollbarThemeChromiumWin.cpp in WebKit.
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ABS_LEFTHOT : ABS_LEFTHOVER;
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_LEFTPRESSED;
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_LEFTDISABLED;
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarRightArrow:
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_RIGHTNORMAL;
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Mimic ScrollbarThemeChromiumWin.cpp in WebKit.
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ABS_RIGHTHOT : ABS_RIGHTHOVER;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_RIGHTPRESSED;
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_RIGHTDISABLED;
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarUpArrow:
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_UPNORMAL;
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Mimic ScrollbarThemeChromiumWin.cpp in WebKit.
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ABS_UPHOT : ABS_UPHOVER;
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_UPPRESSED;
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = ABS_UPDISABLED;
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarHorizontalThumb:
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kScrollbarVerticalThumb:
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (state) {
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNormal:
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = SCRBS_NORMAL;
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kHovered:
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Mimic WebKit's behaviour in ScrollbarThemeChromiumWin.cpp.
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              SCRBS_HOT : SCRBS_HOVER;
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kPressed:
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = SCRBS_PRESSED;
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kDisabled:
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state_id = SCRBS_DISABLED;
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NOTREACHED() << "Invalid state: " << state;
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Invalid part: " << part;
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state_id;
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::GetThemeInt(ThemeName theme,
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int part_id,
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int state_id,
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int prop_id,
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int *value) const {
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = GetThemeHandle(theme);
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle && get_theme_int_)
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return get_theme_int_(handle, part_id, state_id, prop_id, value);
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return E_NOTIMPL;
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT NativeThemeWin::PaintFrameControl(HDC hdc,
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const gfx::Rect& rect,
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          UINT type,
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          UINT state,
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          bool is_selected,
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          State control_state) const {
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int width = rect.width();
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int height = rect.height();
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DrawFrameControl for menu arrow/check wants a monochrome bitmap.
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedBitmap mask_bitmap(CreateBitmap(width, height, 1, 1, NULL));
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mask_bitmap == NULL)
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return E_OUTOFMEMORY;
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedCreateDC bitmap_dc(CreateCompatibleDC(NULL));
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedSelectObject select_bitmap(bitmap_dc, mask_bitmap);
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RECT local_rect = { 0, 0, width, height };
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrawFrameControl(bitmap_dc, &local_rect, type, state);
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We're going to use BitBlt with a b&w mask. This results in using the dest
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dc's text color for the black bits in the mask, and the dest dc's
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // background color for the white bits in the mask. DrawFrameControl draws the
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check in black, and the background in white.
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bg_color_key;
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int text_color_key;
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (control_state) {
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kHovered:
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bg_color_key = COLOR_HIGHLIGHT;
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_color_key = COLOR_HIGHLIGHTTEXT;
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kNormal:
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bg_color_key = COLOR_MENU;
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_color_key = COLOR_MENUTEXT;
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NativeTheme::kDisabled:
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bg_color_key = is_selected ? COLOR_HIGHLIGHT : COLOR_MENU;
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_color_key = COLOR_GRAYTEXT;
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bg_color_key = COLOR_MENU;
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text_color_key = COLOR_MENUTEXT;
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLORREF old_bg_color = SetBkColor(hdc, GetSysColor(bg_color_key));
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLORREF old_text_color = SetTextColor(hdc, GetSysColor(text_color_key));
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BitBlt(hdc, rect.x(), rect.y(), width, height, bitmap_dc, 0, 0, SRCCOPY);
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetBkColor(hdc, old_bg_color);
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTextColor(hdc, old_text_color);
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HANDLE NativeThemeWin::GetThemeHandle(ThemeName theme_name) const {
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!open_theme_ || theme_name < 0 || theme_name >= LAST)
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (theme_handles_[theme_name])
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return theme_handles_[theme_name];
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not found, try to load it.
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE handle = 0;
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (theme_name) {
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case BUTTON:
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Button");
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case LIST:
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Listview");
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case MENU:
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Menu");
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case MENULIST:
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Combobox");
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case SCROLLBAR:
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Scrollbar");
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case STATUS:
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Status");
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case TAB:
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Tab");
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case TEXTFIELD:
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Edit");
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case TRACKBAR:
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Trackbar");
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case WINDOW:
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Window");
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case PROGRESS:
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Progress");
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case SPIN:
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle = open_theme_(NULL, L"Spin");
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default:
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  theme_handles_[theme_name] = handle;
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handle;
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
2099