Index: gfx/native_theme_win.cc |
diff --git a/gfx/native_theme_win.cc b/gfx/native_theme_win.cc |
index 87024d3a68083a0642751c0da5221c90dbee6a37..4a91a6d4571af2848c5192568b01f4837d31a1ac 100644 |
--- a/gfx/native_theme_win.cc |
+++ b/gfx/native_theme_win.cc |
@@ -59,7 +59,8 @@ const NativeTheme* NativeTheme::instance() { |
} |
NativeTheme::NativeTheme() |
- : theme_dll_(LoadLibrary(L"uxtheme.dll")), |
+ : theme_dll_(LoadLibrary(L"uxtheme.dll")), |
+ clip_(NULL), |
draw_theme_(NULL), |
draw_theme_ex_(NULL), |
get_theme_color_(NULL), |
@@ -101,6 +102,9 @@ NativeTheme::~NativeTheme() { |
// CloseHandles(); |
FreeLibrary(theme_dll_); |
} |
+ |
+ if (clip_) |
+ DeleteObject(clip_); |
} |
HRESULT NativeTheme::PaintButton(HDC hdc, |
@@ -478,6 +482,38 @@ HRESULT NativeTheme::PaintTrackbar(HDC hdc, |
return S_OK; |
} |
+HRESULT NativeTheme::PaintProgressBar(HDC hdc, |
+ RECT* bar_rect, |
+ int value_part_id, |
+ RECT* value_rect, |
+ skia::PlatformCanvas* canvas) const { |
+ |
+ // We need to clip painting because the value theme |
+ // for indeterminate overflows bar rectangle. |
+ HRGN clip = GetClipHandle(); |
+ GetClipRgn(hdc, clip); |
+ IntersectClipRect(hdc, bar_rect->left, bar_rect->top, |
+ bar_rect->right, bar_rect->bottom); |
+ |
+ HANDLE handle = GetThemeHandle(PROGRESS); |
+ if (handle && draw_theme_) { |
+ draw_theme_(handle, hdc, PP_BAR, 0, bar_rect, NULL); |
+ draw_theme_(handle, hdc, value_part_id, 0, value_rect, NULL); |
+ |
+ SelectClipRgn(hdc, clip); |
+ return S_OK; |
+ } |
+ |
+ HBRUSH bg_brush = GetSysColorBrush(COLOR_BTNFACE); |
+ HBRUSH fg_brush = GetSysColorBrush(COLOR_BTNSHADOW); |
+ FillRect(hdc, bar_rect, bg_brush); |
+ FillRect(hdc, value_rect, fg_brush); |
+ DrawEdge(hdc, bar_rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); |
+ |
+ SelectClipRgn(hdc, clip); |
+ return S_OK; |
+} |
+ |
HRESULT NativeTheme::PaintTextField(HDC hdc, |
int part_id, |
int state_id, |
@@ -659,6 +695,17 @@ void NativeTheme::CloseHandles() const |
} |
} |
+HRGN NativeTheme::GetClipHandle() const { |
+ if (!clip_) { |
+ RECT dummy_rect; |
+ dummy_rect.left = dummy_rect.right = 0; |
+ dummy_rect.top = dummy_rect.bottom = 0; |
+ clip_ = CreateRectRgnIndirect(&dummy_rect); |
+ } |
+ |
+ return clip_; |
+} |
+ |
HANDLE NativeTheme::GetThemeHandle(ThemeName theme_name) const |
{ |
if (!open_theme_ || theme_name < 0 || theme_name >= LAST) |
@@ -700,6 +747,9 @@ HANDLE NativeTheme::GetThemeHandle(ThemeName theme_name) const |
case WINDOW: |
handle = open_theme_(NULL, L"Window"); |
break; |
+ case PROGRESS: |
+ handle = open_theme_(NULL, L"Progress"); |
+ break; |
default: |
NOTREACHED(); |
} |