15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/rect.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AdjustAlongAxis(int32_t dst_origin, int32_t dst_size, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t* origin, int32_t* size) { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*origin < dst_origin) { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *origin = dst_origin; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *size = std::min(dst_size, *size); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *size = std::min(dst_size, *size); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *origin = std::min(dst_origin + dst_size, *origin + *size) - *size; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Rect::Inset(int32_t left, int32_t top, int32_t right, int32_t bottom) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Offset(left, top); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_width(std::max<int32_t>(width() - left - right, 0)); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_height(std::max<int32_t>(height() - top - bottom, 0)); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Rect::Offset(int32_t horizontal, int32_t vertical) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect_.point.x += horizontal; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect_.point.y += vertical; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Rect::Contains(int32_t point_x, int32_t point_y) const { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (point_x >= x()) && (point_x < right()) && 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (point_y >= y()) && (point_y < bottom()); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Rect::Contains(const Rect& rect) const { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (rect.x() >= x() && rect.right() <= right() && 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect.y() >= y() && rect.bottom() <= bottom()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Rect::Intersects(const Rect& rect) const { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !(rect.x() >= right() || rect.right() <= x() || 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect.y() >= bottom() || rect.bottom() <= y()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Rect Rect::Intersect(const Rect& rect) const { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rx = std::max(x(), rect.x()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t ry = std::max(y(), rect.y()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rr = std::min(right(), rect.right()); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rb = std::min(bottom(), rect.bottom()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rx >= rr || ry >= rb) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rx = ry = rr = rb = 0; // non-intersecting 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Rect(rx, ry, rr - rx, rb - ry); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Rect Rect::Union(const Rect& rect) const { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // special case empty rects... 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEmpty()) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rect; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.IsEmpty()) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rx = std::min(x(), rect.x()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t ry = std::min(y(), rect.y()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rr = std::max(right(), rect.right()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rb = std::max(bottom(), rect.bottom()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Rect(rx, ry, rr - rx, rb - ry); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Rect Rect::Subtract(const Rect& rect) const { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary cases: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Intersects(rect)) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.Contains(*this)) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Rect(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rx = x(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t ry = y(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rr = right(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rb = bottom(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.y() <= y() && rect.bottom() >= bottom()) { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // complete intersection in the y-direction 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.x() <= x()) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rx = rect.right(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rr = rect.x(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (rect.x() <= x() && rect.right() >= right()) { 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // complete intersection in the x-direction 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.y() <= y()) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ry = rect.bottom(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb = rect.y(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Rect(rx, ry, rr - rx, rb - ry); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Rect Rect::AdjustToFit(const Rect& rect) const { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t new_x = x(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t new_y = y(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t new_width = width(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t new_height = height(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AdjustAlongAxis(rect.x(), rect.width(), &new_x, &new_width); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AdjustAlongAxis(rect.y(), rect.height(), &new_y, &new_height); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Rect(new_x, new_y, new_width, new_height); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Point Rect::CenterPoint() const { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Point(x() + (width() + 1) / 2, y() + (height() + 1) / 2); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Rect::SharesEdgeWith(const Rect& rect) const { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (y() == rect.y() && height() == rect.height() && 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x() == rect.right() || right() == rect.x())) || 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x() == rect.x() && width() == rect.width() && 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (y() == rect.bottom() || bottom() == rect.y())); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace pp 131