1 // Copyright (c) 2010 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 "chrome/browser/chromeos/drop_shadow_label.h" 6 7 #include "base/utf_string_conversions.h" 8 #include "ui/gfx/canvas.h" 9 #include "ui/gfx/color_utils.h" 10 11 using views::Label; 12 13 namespace chromeos { 14 15 static const int kDefaultDropShadowSize = 2; 16 17 // Default color is black. 18 static const SkColor kDefaultColor = 0x000000; 19 20 static const float kShadowOpacity = 0.2; 21 22 DropShadowLabel::DropShadowLabel() : Label() { 23 Init(); 24 } 25 26 void DropShadowLabel::Init() { 27 drop_shadow_size_ = kDefaultDropShadowSize; 28 } 29 30 void DropShadowLabel::SetDropShadowSize(int drop_shadow_size) { 31 if (drop_shadow_size != drop_shadow_size_) { 32 drop_shadow_size_ = drop_shadow_size; 33 invalidate_text_size(); 34 SchedulePaint(); 35 } 36 } 37 38 void DropShadowLabel::PaintText(gfx::Canvas* canvas, 39 const std::wstring& text, 40 const gfx::Rect& text_bounds, 41 int flags) { 42 if (drop_shadow_size_ > 0) { 43 SkColor color = SkColorSetARGB(kShadowOpacity * SkColorGetA(GetColor()), 44 SkColorGetR(kDefaultColor), 45 SkColorGetG(kDefaultColor), 46 SkColorGetB(kDefaultColor)); 47 for (int i = 0; i < drop_shadow_size_; i++) { 48 canvas->DrawStringInt(WideToUTF16Hack(text), font(), color, 49 text_bounds.x() + i, text_bounds.y(), 50 text_bounds.width(), text_bounds.height(), flags); 51 canvas->DrawStringInt(WideToUTF16Hack(text), font(), color, 52 text_bounds.x() + i, text_bounds.y() + i, 53 text_bounds.width(), text_bounds.height(), flags); 54 canvas->DrawStringInt(WideToUTF16Hack(text), font(), color, 55 text_bounds.x(), text_bounds.y() + i, 56 text_bounds.width(), text_bounds.height(), flags); 57 } 58 } 59 60 canvas->DrawStringInt(WideToUTF16Hack(text), font(), GetColor(), 61 text_bounds.x(), text_bounds.y(), 62 text_bounds.width(), text_bounds.height(), flags); 63 64 if (HasFocus() || paint_as_focused()) { 65 gfx::Rect focus_bounds = text_bounds; 66 focus_bounds.Inset(-Label::kFocusBorderPadding, 67 -Label::kFocusBorderPadding); 68 canvas->DrawFocusRect(focus_bounds.x(), focus_bounds.y(), 69 focus_bounds.width(), focus_bounds.height()); 70 } 71 } 72 73 gfx::Size DropShadowLabel::GetTextSize() const { 74 gfx::Size text_size = Label::GetTextSize(); 75 text_size.SetSize(text_size.width() + drop_shadow_size_, 76 text_size.height() + drop_shadow_size_); 77 return text_size; 78 } 79 80 } // namespace chromeos 81