15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2006, 2009 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Xidorn Quan (quanxunzhen@gmail.com) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/RoundedRect.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/Assertions.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <algorithm> 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RoundedRect::Radii::isZero() const 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_topLeft.isZero() && m_topRight.isZero() && m_bottomLeft.isZero() && m_bottomRight.isZero(); 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RoundedRect::Radii::scale(float factor) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (factor == 1) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If either radius on a corner becomes zero, reset both radii on that corner. 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topLeft.scale(factor); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_topLeft.width() || !m_topLeft.height()) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topLeft = IntSize(); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topRight.scale(factor); 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_topRight.width() || !m_topRight.height()) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topRight = IntSize(); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomLeft.scale(factor); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_bottomLeft.width() || !m_bottomLeft.height()) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomLeft = IntSize(); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomRight.scale(factor); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_bottomRight.width() || !m_bottomRight.height()) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomRight = IntSize(); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RoundedRect::Radii::expand(int topWidth, int bottomWidth, int leftWidth, int rightWidth) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_topLeft.width() > 0 && m_topLeft.height() > 0) { 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_topLeft.setWidth(std::max<int>(0, m_topLeft.width() + leftWidth)); 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_topLeft.setHeight(std::max<int>(0, m_topLeft.height() + topWidth)); 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_topRight.width() > 0 && m_topRight.height() > 0) { 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_topRight.setWidth(std::max<int>(0, m_topRight.width() + rightWidth)); 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_topRight.setHeight(std::max<int>(0, m_topRight.height() + topWidth)); 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_bottomLeft.width() > 0 && m_bottomLeft.height() > 0) { 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_bottomLeft.setWidth(std::max<int>(0, m_bottomLeft.width() + leftWidth)); 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_bottomLeft.setHeight(std::max<int>(0, m_bottomLeft.height() + bottomWidth)); 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_bottomRight.width() > 0 && m_bottomRight.height() > 0) { 777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_bottomRight.setWidth(std::max<int>(0, m_bottomRight.width() + rightWidth)); 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_bottomRight.setHeight(std::max<int>(0, m_bottomRight.height() + bottomWidth)); 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RoundedRect::inflateWithRadii(int size) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect old = m_rect; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rect.inflate(size); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Considering the inflation factor of shorter size to scale the radii seems appropriate here 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float factor; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_rect.width() < m_rect.height()) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) factor = old.width() ? (float)m_rect.width() / old.width() : int(0); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) factor = old.height() ? (float)m_rect.height() / old.height() : int(0); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_radii.scale(factor); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RoundedRect::Radii::includeLogicalEdges(const RoundedRect::Radii& edges, bool isHorizontal, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (includeLogicalLeftEdge) { 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontal) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomLeft = edges.bottomLeft(); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topRight = edges.topRight(); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topLeft = edges.topLeft(); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (includeLogicalRightEdge) { 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontal) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topRight = edges.topRight(); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomLeft = edges.bottomLeft(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomRight = edges.bottomRight(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RoundedRect::Radii::excludeLogicalEdges(bool isHorizontal, bool excludeLogicalLeftEdge, bool excludeLogicalRightEdge) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (excludeLogicalLeftEdge) { 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontal) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomLeft = IntSize(); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topRight = IntSize(); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topLeft = IntSize(); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (excludeLogicalRightEdge) { 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontal) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topRight = IntSize(); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomLeft = IntSize(); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bottomRight = IntSize(); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RoundedRect::RoundedRect(int x, int y, int width, int height) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_rect(x, y, width, height) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RoundedRect::RoundedRect(const IntRect& rect, const Radii& radii) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_rect(rect) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_radii(radii) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RoundedRect::RoundedRect(const IntRect& rect, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_rect(rect) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_radii(topLeft, topRight, bottomLeft, bottomRight) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1523c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben MurdochIntRect RoundedRect::radiusCenterRect() const 1533c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch{ 1543c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch ASSERT(isRenderable()); 1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int minX = m_rect.x() + std::max(m_radii.topLeft().width(), m_radii.bottomLeft().width()); 1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int minY = m_rect.y() + std::max(m_radii.topLeft().height(), m_radii.topRight().height()); 1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int maxX = m_rect.maxX() - std::max(m_radii.topRight().width(), m_radii.bottomRight().width()); 1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int maxY = m_rect.maxY() - std::max(m_radii.bottomLeft().height(), m_radii.bottomRight().height()); 1593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return IntRect(minX, minY, maxX - minX, maxY - minY); 1603c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch} 1613c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RoundedRect::includeLogicalEdges(const Radii& edges, bool isHorizontal, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_radii.includeLogicalEdges(edges, isHorizontal, includeLogicalLeftEdge, includeLogicalRightEdge); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RoundedRect::excludeLogicalEdges(bool isHorizontal, bool excludeLogicalLeftEdge, bool excludeLogicalRightEdge) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_radii.excludeLogicalEdges(isHorizontal, excludeLogicalLeftEdge, excludeLogicalRightEdge); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RoundedRect::isRenderable() const 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_radii.topLeft().width() + m_radii.topRight().width() <= m_rect.width() 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && m_radii.bottomLeft().width() + m_radii.bottomRight().width() <= m_rect.width() 176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) && m_radii.topLeft().height() + m_radii.bottomLeft().height() <= m_rect.height() 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) && m_radii.topRight().height() + m_radii.bottomRight().height() <= m_rect.height(); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RoundedRect::adjustRadii() 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int maxRadiusWidth = std::max(m_radii.topLeft().width() + m_radii.topRight().width(), m_radii.bottomLeft().width() + m_radii.bottomRight().width()); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int maxRadiusHeight = std::max(m_radii.topLeft().height() + m_radii.bottomLeft().height(), m_radii.topRight().height() + m_radii.bottomRight().height()); 184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (maxRadiusWidth <= 0 || maxRadiusHeight <= 0) { 186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_radii.scale(0.0f); 187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float widthRatio = static_cast<float>(m_rect.width()) / maxRadiusWidth; 190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) float heightRatio = static_cast<float>(m_rect.height()) / maxRadiusHeight; 191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_radii.scale(widthRatio < heightRatio ? widthRatio : heightRatio); 192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RoundedRect::intersectsQuad(const FloatQuad& quad) const 195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatRect rect(m_rect); 197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!quad.intersectsRect(rect)) 198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const IntSize& topLeft = m_radii.topLeft(); 201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!topLeft.isEmpty()) { 202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatRect rect(m_rect.x(), m_rect.y(), topLeft.width(), topLeft.height()); 203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (quad.intersectsRect(rect)) { 204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatPoint center(m_rect.x() + topLeft.width(), m_rect.y() + topLeft.height()); 205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatSize size(topLeft.width(), topLeft.height()); 206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!quad.intersectsEllipse(center, size)) 207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const IntSize& topRight = m_radii.topRight(); 212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!topRight.isEmpty()) { 213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatRect rect(m_rect.maxX() - topRight.width(), m_rect.y(), topRight.width(), topRight.height()); 214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (quad.intersectsRect(rect)) { 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatPoint center(m_rect.maxX() - topRight.width(), m_rect.y() + topRight.height()); 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatSize size(topRight.width(), topRight.height()); 217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!quad.intersectsEllipse(center, size)) 218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const IntSize& bottomLeft = m_radii.bottomLeft(); 223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!bottomLeft.isEmpty()) { 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatRect rect(m_rect.x(), m_rect.maxY() - bottomLeft.height(), bottomLeft.width(), bottomLeft.height()); 225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (quad.intersectsRect(rect)) { 226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatPoint center(m_rect.x() + bottomLeft.width(), m_rect.maxY() - bottomLeft.height()); 227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatSize size(bottomLeft.width(), bottomLeft.height()); 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!quad.intersectsEllipse(center, size)) 229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const IntSize& bottomRight = m_radii.bottomRight(); 234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!bottomRight.isEmpty()) { 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatRect rect(m_rect.maxX() - bottomRight.width(), m_rect.maxY() - bottomRight.height(), bottomRight.width(), bottomRight.height()); 236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (quad.intersectsRect(rect)) { 237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatPoint center(m_rect.maxX() - bottomRight.width(), m_rect.maxY() - bottomRight.height()); 238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatSize size(bottomRight.width(), bottomRight.height()); 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!quad.intersectsEllipse(center, size)) 240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 247c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 248