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 15 namespace views { 16 17 // SolidBackground is a trivial Background implementation that fills the 18 // background in a solid color. 19 class 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 35 class 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 59 Background::Background() 60 : color_(SK_ColorWHITE) 61 #if defined(OS_WIN) 62 , native_control_brush_(NULL) 63 #endif 64 { 65 } 66 67 Background::~Background() { 68 #if defined(OS_WIN) 69 DeleteObject(native_control_brush_); 70 #endif 71 } 72 73 void 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) 82 HBRUSH 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 90 Background* Background::CreateSolidBackground(SkColor color) { 91 return new SolidBackground(color); 92 } 93 94 //static 95 Background* Background::CreateStandardPanelBackground() { 96 // TODO(beng): Should be in NativeTheme. 97 #if defined(USE_AURA) 98 return CreateSolidBackground(SK_ColorWHITE); 99 #else 100 return CreateVerticalGradientBackground(SkColorSetRGB(246, 250, 255), 101 SkColorSetRGB(219, 235, 255)); 102 #endif 103 } 104 105 //static 106 Background* Background::CreateVerticalGradientBackground(SkColor color1, 107 SkColor color2) { 108 Background* background = CreateBackgroundPainter( 109 true, Painter::CreateVerticalGradient(color1, color2)); 110 background->SetNativeControlColor( 111 color_utils::AlphaBlend(color1, color2, 128)); 112 113 return background; 114 } 115 116 //static 117 Background* Background::CreateVerticalMultiColorGradientBackground( 118 SkColor* colors, 119 SkScalar* pos, 120 size_t count) { 121 Background* background = CreateBackgroundPainter( 122 true, Painter::CreateVerticalMultiColorGradient(colors, pos, count)); 123 background->SetNativeControlColor( 124 color_utils::AlphaBlend(colors[0], colors[count-1], 128)); 125 126 return background; 127 } 128 129 //static 130 Background* Background::CreateBackgroundPainter(bool owns_painter, 131 Painter* painter) { 132 return new BackgroundPainter(owns_painter, painter); 133 } 134 135 } // namespace views 136