// Copyright (c) 2011 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. #include "views/native_theme_painter.h" #include "base/logging.h" #include "ui/base/animation/animation.h" #include "ui/gfx/canvas.h" #include "ui/gfx/canvas_skia.h" #include "ui/gfx/rect.h" #include "views/native_theme_delegate.h" namespace views { NativeThemePainter::NativeThemePainter(NativeThemeDelegate* delegate) : delegate_(delegate) { DCHECK(delegate_); } gfx::Size NativeThemePainter::GetPreferredSize() { const gfx::NativeTheme* theme = gfx::NativeTheme::instance(); gfx::NativeTheme::ExtraParams extra; gfx::NativeTheme::State state = delegate_->GetThemeState(&extra); return theme->GetPartSize(delegate_->GetThemePart(), state, extra); } void NativeThemePainter::Paint(int w, int h, gfx::Canvas* canvas) { const gfx::NativeTheme* native_theme = gfx::NativeTheme::instance(); gfx::NativeTheme::Part part = delegate_->GetThemePart(); gfx::CanvasSkia* skia_canvas = canvas->AsCanvasSkia(); gfx::Rect rect(0, 0, w, h); if (delegate_->GetThemeAnimation() != NULL && delegate_->GetThemeAnimation()->is_animating()) { // Paint background state. gfx::NativeTheme::ExtraParams prev_extra; gfx::NativeTheme::State prev_state = delegate_->GetBackgroundThemeState(&prev_extra); native_theme->Paint(skia_canvas, part, prev_state, rect, prev_extra); // Composite foreground state above it. gfx::NativeTheme::ExtraParams extra; gfx::NativeTheme::State state = delegate_->GetForegroundThemeState(&extra); int alpha = delegate_->GetThemeAnimation()->CurrentValueBetween(0, 255); skia_canvas->SaveLayerAlpha(static_cast(alpha)); native_theme->Paint(skia_canvas, part, state, rect, extra); skia_canvas->Restore(); } else { gfx::NativeTheme::ExtraParams extra; gfx::NativeTheme::State state = delegate_->GetThemeState(&extra); native_theme->Paint(skia_canvas, part, state, rect, extra); } } } // namespace views