summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/drop_shadow_label.cc
blob: 5be5e93adaeb7e7ba48800995a6dee2f10ff18b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// 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 "chrome/browser/chromeos/drop_shadow_label.h"

#include "base/utf_string_conversions.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_utils.h"

using views::Label;

namespace chromeos {

static const int kDefaultDropShadowSize = 2;

DropShadowLabel::DropShadowLabel() : drop_shadow_size_(kDefaultDropShadowSize) {
}

void DropShadowLabel::SetDropShadowSize(int drop_shadow_size) {
  if (drop_shadow_size != drop_shadow_size_) {
    drop_shadow_size_ = drop_shadow_size;
    invalidate_text_size();
    SchedulePaint();
  }
}

void DropShadowLabel::PaintText(gfx::Canvas* canvas,
                                const string16& text,
                                const gfx::Rect& text_bounds,
                                int flags) {
  SkColor text_color = IsEnabled() ? enabled_color() : disabled_color();
  if (drop_shadow_size_ > 0) {
    const float kShadowOpacity = 0.2;
    const SkColor shadow_color =
        SkColorSetA(SK_ColorBLACK, kShadowOpacity * SkColorGetA(text_color));
    for (int i = 0; i < drop_shadow_size_; i++) {
      canvas->DrawStringInt(text, font(), shadow_color,
                            text_bounds.x() + i, text_bounds.y(),
                            text_bounds.width(), text_bounds.height(), flags);
      canvas->DrawStringInt(text, font(), shadow_color,
                            text_bounds.x() + i, text_bounds.y() + i,
                            text_bounds.width(), text_bounds.height(), flags);
      canvas->DrawStringInt(text, font(), shadow_color,
                            text_bounds.x(), text_bounds.y() + i,
                            text_bounds.width(), text_bounds.height(), flags);
    }
  }

  canvas->DrawStringInt(text, font(), text_color, text_bounds.x(),
      text_bounds.y(), text_bounds.width(), text_bounds.height(), flags);

  if (HasFocus() || paint_as_focused()) {
    gfx::Rect focus_bounds = text_bounds;
    focus_bounds.Inset(-Label::kFocusBorderPadding,
                       -Label::kFocusBorderPadding);
    canvas->DrawFocusRect(focus_bounds.x(), focus_bounds.y(),
                          focus_bounds.width(), focus_bounds.height());
  }
}

gfx::Size DropShadowLabel::GetTextSize() const {
  gfx::Size text_size = Label::GetTextSize();
  text_size.SetSize(text_size.width() + drop_shadow_size_,
                    text_size.height() + drop_shadow_size_);
  return text_size;
}

}  // namespace chromeos