Chromium Code Reviews| Index: ui/views/controls/button/label_button_border.cc |
| diff --git a/ui/views/controls/button/label_button_border.cc b/ui/views/controls/button/label_button_border.cc |
| index ef827667f9e119114afaac3ba7f2c2eae4ba1ef3..210b50accb7593612a91f719cad8e4c603825b65 100644 |
| --- a/ui/views/controls/button/label_button_border.cc |
| +++ b/ui/views/controls/button/label_button_border.cc |
| @@ -6,6 +6,8 @@ |
| #include "base/logging.h" |
| #include "grit/ui_resources.h" |
| +#include "third_party/skia/include/core/SkPaint.h" |
| +#include "third_party/skia/include/effects/SkLerpXfermode.h" |
| #include "ui/base/animation/animation.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/rect.h" |
| @@ -44,6 +46,7 @@ Button::ButtonState GetButtonState(ui::NativeTheme::State state) { |
| // A helper function to paint the native theme or images as appropriate. |
| void PaintHelper(LabelButtonBorder* border, |
| gfx::Canvas* canvas, |
| + const SkPaint& paint, |
| const ui::NativeTheme* theme, |
| ui::NativeTheme::Part part, |
| ui::NativeTheme::State state, |
| @@ -54,11 +57,8 @@ void PaintHelper(LabelButtonBorder* border, |
| } else { |
| Painter* painter = |
| border->GetPainter(extra.button.is_focused, GetButtonState(state)); |
| - // Paint any corresponding unfocused painter if there is no focused painter. |
| - if (!painter && extra.button.is_focused) |
| - painter = border->GetPainter(false, GetButtonState(state)); |
| if (painter) |
| - painter->Paint(canvas, rect.size()); |
| + painter->PaintWithSkPaint(canvas, rect.size(), paint); |
| } |
| } |
| @@ -98,29 +98,38 @@ LabelButtonBorder::LabelButtonBorder(Button::ButtonStyle style) |
| LabelButtonBorder::~LabelButtonBorder() {} |
| void LabelButtonBorder::Paint(const View& view, gfx::Canvas* canvas) { |
| - const NativeThemeDelegate* native_theme_delegate = |
| - static_cast<const LabelButton*>(&view); |
| - ui::NativeTheme::Part part = native_theme_delegate->GetThemePart(); |
| - gfx::Rect rect(native_theme_delegate->GetThemePaintRect()); |
| + const NativeThemeDelegate* delegate = static_cast<const LabelButton*>(&view); |
| + const ui::NativeTheme::Part part = delegate->GetThemePart(); |
| + const gfx::Rect rect(delegate->GetThemePaintRect()); |
| ui::NativeTheme::ExtraParams extra; |
| const ui::NativeTheme* theme = view.GetNativeTheme(); |
| - const ui::Animation* animation = native_theme_delegate->GetThemeAnimation(); |
| - ui::NativeTheme::State state = native_theme_delegate->GetThemeState(&extra); |
| + const ui::Animation* animation = delegate->GetThemeAnimation(); |
| + SkPaint paint; |
| if (animation && animation->is_animating()) { |
| // Composite the background and foreground painters during state animations. |
| - int alpha = animation->CurrentValueBetween(0, 0xff); |
| - state = native_theme_delegate->GetBackgroundThemeState(&extra); |
| - canvas->SaveLayerAlpha(static_cast<uint8>(0xff - alpha)); |
| - PaintHelper(this, canvas, theme, part, state, rect, extra); |
| - canvas->Restore(); |
| - |
| - state = native_theme_delegate->GetForegroundThemeState(&extra); |
| - canvas->SaveLayerAlpha(static_cast<uint8>(alpha)); |
| - PaintHelper(this, canvas, theme, part, state, rect, extra); |
| - canvas->Restore(); |
| + ui::NativeTheme::State back = delegate->GetBackgroundThemeState(&extra); |
| + ui::NativeTheme::State fore = delegate->GetForegroundThemeState(&extra); |
|
sky
2013/06/13 16:22:04
foreground, or fg.
|
| + if (style() == Button::STYLE_NATIVE_TEXTBUTTON) { |
| + // NativeTheme does not support image interpolation, use alpha blending. |
| + PaintHelper(this, canvas, paint, theme, part, back, rect, extra); |
| + const int alpha = animation->CurrentValueBetween(0, 0xff); |
| + canvas->SaveLayerAlpha(static_cast<uint8>(alpha)); |
| + PaintHelper(this, canvas, paint, theme, part, fore, rect, extra); |
| + canvas->Restore(); |
| + } else { |
| + canvas->Save(); |
| + // Use linear interpolation to blend background and foreground images. |
| + PaintHelper(this, canvas, paint, theme, part, back, rect, extra); |
| + skia::RefPtr<SkXfermode> mode( |
| + skia::AdoptRef(SkLerpXfermode::Create(animation->GetCurrentValue()))); |
| + paint.setXfermode(mode.get()); |
| + PaintHelper(this, canvas, paint, theme, part, fore, rect, extra); |
| + canvas->Restore(); |
| + } |
| } else { |
| - PaintHelper(this, canvas, theme, part, state, rect, extra); |
| + ui::NativeTheme::State state = delegate->GetThemeState(&extra); |
| + PaintHelper(this, canvas, paint, theme, part, state, rect, extra); |
| } |
| // Draw the Views focus border for the native theme style. |
| @@ -135,6 +144,9 @@ gfx::Insets LabelButtonBorder::GetInsets() const { |
| Painter* LabelButtonBorder::GetPainter(bool focused, |
| Button::ButtonState state) { |
| + // Use any corresponding unfocused painter if there is no focused painter. |
| + if (focused && !painters_[1][state]) |
| + return painters_[0][state].get(); |
| return painters_[focused ? 1 : 0][state].get(); |
| } |