1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ui/views/background.h" 6 7#include "base/logging.h" 8#include "skia/ext/skia_utils_win.h" 9#include "third_party/skia/include/core/SkPaint.h" 10#include "ui/gfx/canvas.h" 11#include "ui/gfx/color_utils.h" 12#include "ui/views/painter.h" 13#include "ui/views/view.h" 14 15namespace views { 16 17// SolidBackground is a trivial Background implementation that fills the 18// background in a solid color. 19class SolidBackground : public Background { 20 public: 21 explicit SolidBackground(SkColor color) { 22 SetNativeControlColor(color); 23 } 24 25 virtual void Paint(gfx::Canvas* canvas, View* view) const OVERRIDE { 26 // Fill the background. Note that we don't constrain to the bounds as 27 // canvas is already clipped for us. 28 canvas->DrawColor(get_color()); 29 } 30 31 private: 32 DISALLOW_COPY_AND_ASSIGN(SolidBackground); 33}; 34 35class BackgroundPainter : public Background { 36 public: 37 BackgroundPainter(bool owns_painter, Painter* painter) 38 : owns_painter_(owns_painter), painter_(painter) { 39 DCHECK(painter); 40 } 41 42 virtual ~BackgroundPainter() { 43 if (owns_painter_) 44 delete painter_; 45 } 46 47 48 virtual void Paint(gfx::Canvas* canvas, View* view) const OVERRIDE { 49 Painter::PaintPainterAt(canvas, painter_, view->GetLocalBounds()); 50 } 51 52 private: 53 bool owns_painter_; 54 Painter* painter_; 55 56 DISALLOW_COPY_AND_ASSIGN(BackgroundPainter); 57}; 58 59Background::Background() 60 : color_(SK_ColorWHITE) 61#if defined(OS_WIN) 62 , native_control_brush_(NULL) 63#endif 64{ 65} 66 67Background::~Background() { 68#if defined(OS_WIN) 69 DeleteObject(native_control_brush_); 70#endif 71} 72 73void Background::SetNativeControlColor(SkColor color) { 74 color_ = color; 75#if defined(OS_WIN) 76 DeleteObject(native_control_brush_); 77 native_control_brush_ = NULL; 78#endif 79} 80 81#if defined(OS_WIN) 82HBRUSH Background::GetNativeControlBrush() const { 83 if (!native_control_brush_) 84 native_control_brush_ = CreateSolidBrush(skia::SkColorToCOLORREF(color_)); 85 return native_control_brush_; 86} 87#endif 88 89//static 90Background* Background::CreateSolidBackground(SkColor color) { 91 return new SolidBackground(color); 92} 93 94//static 95Background* Background::CreateStandardPanelBackground() { 96 // TODO(beng): Should be in NativeTheme. 97 return CreateSolidBackground(SK_ColorWHITE); 98} 99 100//static 101Background* Background::CreateVerticalGradientBackground(SkColor color1, 102 SkColor color2) { 103 Background* background = CreateBackgroundPainter( 104 true, Painter::CreateVerticalGradient(color1, color2)); 105 background->SetNativeControlColor( 106 color_utils::AlphaBlend(color1, color2, 128)); 107 108 return background; 109} 110 111//static 112Background* Background::CreateVerticalMultiColorGradientBackground( 113 SkColor* colors, 114 SkScalar* pos, 115 size_t count) { 116 Background* background = CreateBackgroundPainter( 117 true, Painter::CreateVerticalMultiColorGradient(colors, pos, count)); 118 background->SetNativeControlColor( 119 color_utils::AlphaBlend(colors[0], colors[count-1], 128)); 120 121 return background; 122} 123 124//static 125Background* Background::CreateBackgroundPainter(bool owns_painter, 126 Painter* painter) { 127 return new BackgroundPainter(owns_painter, painter); 128} 129 130} // namespace views 131