15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/shadow_value.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShadowValue::ShadowValue()
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : blur_(0),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      color_(0) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShadowValue::ShadowValue(const gfx::Point& offset,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         double blur,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         SkColor color)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : offset_(offset),
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blur_(blur),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      color_(color) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShadowValue::~ShadowValue() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShadowValue ShadowValue::Scale(float scale) const {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point scaled_offset =
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::ToFlooredPoint(gfx::ScalePoint(offset_, scale));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ShadowValue(scaled_offset, blur_ * scale, color_);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ShadowValue::ToString() const {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::StringPrintf(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "(%d,%d),%.2f,rgba(%d,%d,%d,%d)",
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset_.x(), offset_.y(),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blur_,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetR(color_),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetG(color_),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetB(color_),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetA(color_));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Insets ShadowValue::GetMargin(const ShadowValues& shadows) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int left = 0;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int top = 0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int right = 0;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bottom = 0;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < shadows.size(); ++i) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ShadowValue& shadow = shadows[i];
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add 0.5 to round up to the next integer.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int blur = static_cast<int>(shadow.blur() / 2 + 0.5);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    left = std::max(left, blur - shadow.x());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top = std::max(top, blur - shadow.y());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    right = std::max(right, blur + shadow.x());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bottom = std::max(bottom, blur + shadow.y());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Insets(-top, -left, -bottom, -right);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
71