Chromium Code Reviews| Index: ui/native_theme/native_theme_win.cc |
| diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc |
| index 3e04dcb78d42ec242d45807294742770af0ff803..050c118991e7944659a7ecb8388e3960cff53192 100644 |
| --- a/ui/native_theme/native_theme_win.cc |
| +++ b/ui/native_theme/native_theme_win.cc |
| @@ -23,9 +23,11 @@ |
| #include "third_party/skia/include/core/SkCanvas.h" |
| #include "third_party/skia/include/core/SkColorPriv.h" |
| #include "third_party/skia/include/core/SkShader.h" |
| +#include "ui/base/win/dpi.h" |
| #include "ui/gfx/color_utils.h" |
| #include "ui/gfx/gdi_util.h" |
| #include "ui/gfx/rect.h" |
| +#include "ui/gfx/rect_conversions.h" |
| #include "ui/native_theme/common_theme.h" |
| // This was removed from Winvers.h but is still used. |
| @@ -1071,8 +1073,7 @@ HRESULT NativeThemeWin::PaintScrollbarArrow( |
| break; |
| } |
| } |
| - |
| - return draw_theme_(handle, hdc, SBP_ARROWBTN, state_id, &rect_win, NULL); |
| + return PaintScaledTheme(handle, hdc, SBP_ARROWBTN, state_id, rect); |
| } |
| int classic_state = DFCS_SCROLLDOWN; |
| @@ -1161,7 +1162,7 @@ HRESULT NativeThemeWin::PaintScrollbarThumb( |
| } |
| if (handle && draw_theme_) |
| - return draw_theme_(handle, hdc, part_id, state_id, &rect_win, NULL); |
| + return PaintScaledTheme(handle, hdc, part_id, state_id, rect); |
| // Draw it manually. |
| if ((part_id == SBP_THUMBBTNHORZ) || (part_id == SBP_THUMBBTNVERT)) |
| @@ -1591,6 +1592,33 @@ HRESULT NativeThemeWin::PaintTextField(HDC hdc, |
| return hr; |
| } |
| +HRESULT NativeThemeWin::PaintScaledTheme(HANDLE theme, |
| + HDC hdc, |
| + int part_id, |
| + int state_id, |
| + const gfx::Rect& rect) const { |
| + // Correct the scaling and positioning of sub-components such as scrollbar |
| + // arrows and thumb grippers in the event that the world transform applies |
| + // scaling (e.g. in high-DPI mode). |
| + XFORM save_transform; |
| + GetWorldTransform(hdc, &save_transform); |
|
sky
2013/02/01 17:09:57
Don't you need to check the return value?
kevers
2013/02/01 18:03:31
Done.
|
| + float scale = save_transform.eM11; |
| + if (scale != 1 && save_transform.eM12 == 0) { |
| + ModifyWorldTransform(hdc, NULL, MWT_IDENTITY); |
|
sky
2013/02/01 17:09:57
I'm not too familiar with this, but should we cons
kevers
2013/02/01 18:03:31
The transformation addresses an issue with the Win
|
| + gfx::Rect scaled_rect = gfx::ToEnclosedRect( |
| + gfx::ScaleRect(rect, scale)); |
| + RECT bounds = gfx::Rect(scaled_rect.x() + save_transform.eDx, |
| + scaled_rect.y() + save_transform.eDy, |
| + scaled_rect.width(), |
| + scaled_rect.height()).ToRECT(); |
| + HRESULT result = draw_theme_(theme, hdc, part_id, state_id, &bounds, NULL); |
| + SetWorldTransform(hdc, &save_transform); |
| + return result; |
| + } |
| + RECT bounds = rect.ToRECT(); |
| + return draw_theme_(theme, hdc, part_id, state_id, &bounds, NULL); |
| +} |
| + |
| // static |
| NativeThemeWin::ThemeName NativeThemeWin::GetThemeName(Part part) { |
| ThemeName name; |