// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "lib/ui/gfx/cpp/math.h"

namespace scenic {

bool ContainsPoint(const fuchsia::ui::gfx::BoundingBox& box,
                   const fuchsia::ui::gfx::vec3& point) {
  return point.x >= box.min.x && point.y >= box.min.y && point.z >= box.min.z &&
         point.x <= box.max.x && point.y <= box.max.y && point.z <= box.max.z;
}

fuchsia::ui::gfx::BoundingBox InsetBy(const fuchsia::ui::gfx::BoundingBox& box,
                                      const fuchsia::ui::gfx::vec3& inset) {
  return {.min = box.min + inset, .max = box.max - inset};
}

fuchsia::ui::gfx::BoundingBox InsetBy(
    const fuchsia::ui::gfx::BoundingBox& box,
    const fuchsia::ui::gfx::vec3& inset_from_min,
    const fuchsia::ui::gfx::vec3& inset_from_max) {
  return {.min = box.min + inset_from_min, .max = box.max - inset_from_max};
}

fuchsia::ui::gfx::BoundingBox ViewPropertiesLayoutBox(
    const fuchsia::ui::gfx::ViewProperties& view_properties) {
  return InsetBy(view_properties.bounding_box, view_properties.inset_from_min,
                 view_properties.inset_from_max);
}

}  // namespace scenic
