Home | History | Annotate | Download | only in gfx
      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 
     13 namespace gfx {
     14 
     15 ShadowValue::ShadowValue()
     16     : blur_(0),
     17       color_(0) {
     18 }
     19 
     20 ShadowValue::ShadowValue(const gfx::Point& offset,
     21                          double blur,
     22                          SkColor color)
     23     : offset_(offset),
     24       blur_(blur),
     25       color_(color) {
     26 }
     27 
     28 ShadowValue::~ShadowValue() {
     29 }
     30 
     31 ShadowValue 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 
     37 std::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
     49 Insets 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