// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDER_TREE_SHADOW_H_
#define COBALT_RENDER_TREE_SHADOW_H_

#include <algorithm>

#include "cobalt/math/rect_f.h"
#include "cobalt/math/vector2d_f.h"
#include "cobalt/render_tree/color_rgba.h"

namespace cobalt {
namespace render_tree {

// Describes a shadow effect that can be applied as a filter or to a shape.
// The |blur_sigma| value is given in units of Gaussian standard deviations for
// the Gaussian kernel that will be used to blur them.
struct Shadow {
  Shadow(const math::Vector2dF& offset, float blur_sigma,
         const ColorRGBA& color)
      : offset(offset), blur_sigma(blur_sigma), color(color) {}

  // Since the blur parameters represent standard deviations, most of the
  // blur is contained within 3 of them, so report that as the extent of the
  // blur.
  math::Vector2dF BlurExtent() const {
    return math::Vector2dF(blur_sigma * 3, blur_sigma * 3);
  }

  // Returns a bounding rectangle for the shadow if it were to be applied to
  // the input bounding rectangle.
  math::RectF ToShadowBounds(const math::RectF& source_bound) const {
    math::RectF ret(source_bound);
    ret.Offset(offset);

    math::Vector2dF blur_extent = BlurExtent();
    ret.Outset(blur_extent.x(), blur_extent.y());
    return ret;
  }

  math::Vector2dF offset;
  float blur_sigma;
  ColorRGBA color;
};

}  // namespace render_tree
}  // namespace cobalt

#endif  // COBALT_RENDER_TREE_SHADOW_H_
