1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file. 4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/geometry/box_f.h" 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <algorithm> 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/logging.h" 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/stringprintf.h" 11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace gfx { 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstd::string BoxF::ToString() const { 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return base::StringPrintf("%s %fx%fx%f", 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch origin().ToString().c_str(), 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch width_, 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch height_, 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch depth_); 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool BoxF::IsEmpty() const { 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return (width_ == 0 && height_ == 0) || 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch (width_ == 0 && depth_ == 0) || 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch (height_ == 0 && depth_ == 0); 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BoxF::ExpandTo(const Point3F& min, const Point3F& max) { 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_LE(min.x(), max.x()); 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_LE(min.y(), max.y()); 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_LE(min.z(), max.z()); 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float min_x = std::min(x(), min.x()); 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float min_y = std::min(y(), min.y()); 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float min_z = std::min(z(), min.z()); 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float max_x = std::max(right(), max.x()); 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float max_y = std::max(bottom(), max.y()); 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float max_z = std::max(front(), max.z()); 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) origin_.SetPoint(min_x, min_y, min_z); 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) width_ = max_x - min_x; 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) height_ = max_y - min_y; 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) depth_ = max_z - min_z; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BoxF::Union(const BoxF& box) { 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (IsEmpty()) { 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch *this = box; 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (box.IsEmpty()) 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExpandTo(box); 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BoxF::ExpandTo(const Point3F& point) { 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ExpandTo(point, point); 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BoxF::ExpandTo(const BoxF& box) { 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExpandTo(box.origin(), gfx::Point3F(box.right(), box.bottom(), box.front())); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochBoxF UnionBoxes(const BoxF& a, const BoxF& b) { 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch BoxF result = a; 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result.Union(b); 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return result; 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace gfx 71