Chromium Code Reviews| Index: gfx/native_theme_win.cc |
| diff --git a/gfx/native_theme_win.cc b/gfx/native_theme_win.cc |
| index ec70b2f8504fa5a258ba086316f87b29a742b0d5..07deec1796ed1ba1fef5aa283eb8dba250f703dc 100644 |
| --- a/gfx/native_theme_win.cc |
| +++ b/gfx/native_theme_win.cc |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| @@ -478,6 +478,56 @@ HRESULT NativeTheme::PaintTrackbar(HDC hdc, |
| return S_OK; |
| } |
| +// A ScopedRegion wrapper to set/restore clipping region during the scope. |
| +class ScopedRegionClipping { |
|
Peter Kasting
2010/05/14 18:08:11
Nit: This would be clearer as "ScopedClipRegion"
|
| + public: |
| + explicit ScopedRegionClipping(const HDC hdc) |
| + : hdc_(hdc), clip_(NULL) { |
| + RECT zero_rect = { 0 }; |
| + clip_ = CreateRectRgnIndirect(&zero_rect); |
| + GetClipRgn(hdc_, clip_); |
| + } |
| + |
| + ~ScopedRegionClipping() { |
| + SelectClipRgn(hdc_, clip_); |
| + } |
| + |
| + private: |
| + HDC hdc_; |
| + ScopedRegion clip_; |
| + DISALLOW_COPY_AND_ASSIGN(ScopedRegionClipping); |
| +}; |
| + |
| +HRESULT NativeTheme::PaintProgressBar(HDC hdc, |
| + RECT* bar_rect, |
| + int value_part_id, |
| + RECT* value_rect, |
| + skia::PlatformCanvas* canvas) const { |
| + // For an indeterminate progress bar, we draw a moving highlight that's animated |
|
Peter Kasting
2010/05/14 18:08:11
Nit: Sorry, I gave you a set of comments that were
|
| + // (by the caller) across the width of the bar. The highlight part is always |
| + // drawn as being as wide as the bar, to scale it properly. Therefore, we need |
| + // to clip it against the bar rect, so that as it moves, it doesn't extend past |
| + // the ends of the bar. For a normal progress bar, we won't try to draw past |
| + // the bar ends, so this clipping is useless, but harmless. |
| + ScopedRegionClipping clip(hdc); |
| + 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); |
| + 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); |
| + return S_OK; |
| +} |
| + |
| HRESULT NativeTheme::PaintTextField(HDC hdc, |
| int part_id, |
| int state_id, |
| @@ -707,6 +757,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(); |
| } |