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/gfx/shadow_value.h"
6
7#include <algorithm>
8
9#include "base/strings/stringprintf.h"
10#include "ui/gfx/insets.h"
11#include "ui/gfx/point_conversions.h"
12
13namespace gfx {
14
15ShadowValue::ShadowValue()
16    : blur_(0),
17      color_(0) {
18}
19
20ShadowValue::ShadowValue(const gfx::Point& offset,
21                         double blur,
22                         SkColor color)
23    : offset_(offset),
24      blur_(blur),
25      color_(color) {
26}
27
28ShadowValue::~ShadowValue() {
29}
30
31ShadowValue ShadowValue::Scale(float scale) const {
32  gfx::Point scaled_offset =
33      gfx::ToFlooredPoint(gfx::ScalePoint(offset_, scale));
34  return ShadowValue(scaled_offset, blur_ * scale, color_);
35}
36
37std::string ShadowValue::ToString() const {
38  return base::StringPrintf(
39      "(%d,%d),%.2f,rgba(%d,%d,%d,%d)",
40      offset_.x(), offset_.y(),
41      blur_,
42      SkColorGetR(color_),
43      SkColorGetG(color_),
44      SkColorGetB(color_),
45      SkColorGetA(color_));
46}
47
48// static
49Insets ShadowValue::GetMargin(const ShadowValues& shadows) {
50  int left = 0;
51  int top = 0;
52  int right = 0;
53  int bottom = 0;
54
55  for (size_t i = 0; i < shadows.size(); ++i) {
56    const ShadowValue& shadow = shadows[i];
57
58    // Add 0.5 to round up to the next integer.
59    int blur = static_cast<int>(shadow.blur() / 2 + 0.5);
60
61    left = std::max(left, blur - shadow.x());
62    top = std::max(top, blur - shadow.y());
63    right = std::max(right, blur + shadow.x());
64    bottom = std::max(bottom, blur + shadow.y());
65  }
66
67  return Insets(-top, -left, -bottom, -right);
68}
69
70}  // namespace gfx
71