// Copyright 2017 The Cobalt Authors. 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.

#include "cobalt/render_tree/rounded_corners.h"

namespace cobalt {
namespace render_tree {

namespace {
const float kEpsilon = 0.0001f;
}

bool RoundedCorner::IsSquare() const {
  return horizontal <= kEpsilon || vertical <= kEpsilon;
}

RoundedCorners RoundedCorners::Scale(float sx, float sy) const {
  return RoundedCorners(
      RoundedCorner(top_left.horizontal * sx, top_left.vertical * sy),
      RoundedCorner(top_right.horizontal * sx, top_right.vertical * sy),
      RoundedCorner(bottom_right.horizontal * sx, bottom_right.vertical * sy),
      RoundedCorner(bottom_left.horizontal * sx, bottom_left.vertical * sy));
}

RoundedCorners RoundedCorners::Normalize(const math::RectF& rect) const {
  float scale = 1.0f;
  float size;

  // Normalize overlapping curves.
  // https://www.w3.org/TR/css3-background/#corner-overlap
  // Additionally, normalize opposing curves so the corners do not overlap.
  size = top_left.horizontal +
         std::max(top_right.horizontal, bottom_right.horizontal);
  if (size > rect.width()) {
    scale = rect.width() / size;
  }

  size = bottom_left.horizontal +
         std::max(bottom_right.horizontal, top_right.horizontal);
  if (size > rect.width()) {
    scale = std::min(rect.width() / size, scale);
  }

  size =
      top_left.vertical + std::max(bottom_left.vertical, bottom_right.vertical);
  if (size > rect.height()) {
    scale = std::min(rect.height() / size, scale);
  }

  size = top_right.vertical +
         std::max(bottom_right.vertical, bottom_left.vertical);
  if (size > rect.height()) {
    scale = std::min(rect.height() / size, scale);
  }

  scale = std::max(scale, 0.0f);
  return Scale(scale, scale);
}

bool RoundedCorners::IsNormalized(const math::RectF& rect) const {
  // Introduce a fuzz epsilon so that we are not strict about rounding errors
  // when computing Normalize().
  const float fuzzed_width = rect.width() + kEpsilon;
  const float fuzzed_height = rect.height() + kEpsilon;

  return
      // Adjacent corners must not overlap.
      top_left.horizontal + top_right.horizontal <= fuzzed_width &&
      bottom_left.horizontal + bottom_right.horizontal <= fuzzed_width &&
      top_left.vertical + bottom_left.vertical <= fuzzed_height &&
      top_right.vertical + bottom_right.vertical <= fuzzed_height &&
      // Opposing corners must not overlap.
      top_left.horizontal + bottom_right.horizontal <= fuzzed_width &&
      bottom_left.horizontal + top_right.horizontal <= fuzzed_width &&
      top_left.vertical + bottom_right.vertical <= fuzzed_height &&
      top_right.vertical + bottom_left.vertical <= fuzzed_height;
}

}  // namespace render_tree
}  // namespace cobalt
