183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/* 283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Copyright (C) 2017 The Android Open Source Project 383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * you may not use this file except in compliance with the License. 683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * You may obtain a copy of the License at 783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 1083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Unless required by applicable law or agreed to in writing, software 1183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 1283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * See the License for the specific language governing permissions and 1483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * limitations under the License. 1583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 1683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 1783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy@file:Suppress("NOTHING_TO_INLINE") 1883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 199c80550cbbe357a89e2abeeb9c7769fcaefc3a65Jake Whartonpackage androidx.core.graphics 2083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 21d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyimport android.annotation.SuppressLint 2246b8a0ef84de421456d4ad06cc7f698d3505422fRomain Guyimport android.graphics.Matrix 2383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyimport android.graphics.Point 2483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyimport android.graphics.PointF 2583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyimport android.graphics.Rect 2683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyimport android.graphics.RectF 27d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyimport android.graphics.Region 2883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 2983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 3083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Returns "left", the first component of the rectangle. 3183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 3283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This method allows to use destructuring declarations when working with rectangles, 3383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * for example: 3483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 3583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * val (left, top, right, bottom) = myRectangle 3683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 3783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 3883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun Rect.component1() = this.left 3983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 4083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 4109d3a4befb2308241939c3d5049a50563fcbc785Roman Zavarnitsyn * Returns "top", the second component of the rectangle. 4283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 4383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This method allows to use destructuring declarations when working with rectangles, 4483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * for example: 4583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 4683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * val (left, top, right, bottom) = myRectangle 4783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 4883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 4983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun Rect.component2() = this.top 5083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 5183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 5209d3a4befb2308241939c3d5049a50563fcbc785Roman Zavarnitsyn * Returns "right", the third component of the rectangle. 5383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 5483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This method allows to use destructuring declarations when working with rectangles, 5583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * for example: 5683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 5783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * val (left, top, right, bottom) = myRectangle 5883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 5983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 6083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun Rect.component3() = this.right 6183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 6283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 6309d3a4befb2308241939c3d5049a50563fcbc785Roman Zavarnitsyn * Returns "bottom", the fourth component of the rectangle. 6483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 6583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This method allows to use destructuring declarations when working with rectangles, 6683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * for example: 6783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 6883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * val (left, top, right, bottom) = myRectangle 6983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 7083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 7183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun Rect.component4() = this.bottom 7283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 7383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 7483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Returns "left", the first component of the rectangle. 7583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 7683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This method allows to use destructuring declarations when working with rectangles, 7783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * for example: 7883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 7983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * val (left, top, right, bottom) = myRectangle 8083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 8183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 8283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun RectF.component1() = this.left 8383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 8483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 8509d3a4befb2308241939c3d5049a50563fcbc785Roman Zavarnitsyn * Returns "top", the second component of the rectangle. 8683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 8783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This method allows to use destructuring declarations when working with rectangles, 8883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * for example: 8983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 9083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * val (left, top, right, bottom) = myRectangle 9183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 9283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 9383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun RectF.component2() = this.top 9483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 9583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 9609d3a4befb2308241939c3d5049a50563fcbc785Roman Zavarnitsyn * Returns "right", the third component of the rectangle. 9783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 9883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This method allows to use destructuring declarations when working with rectangles, 9983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * for example: 10083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 10183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * val (left, top, right, bottom) = myRectangle 10283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 10383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 10483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun RectF.component3() = this.right 10583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 10683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 10709d3a4befb2308241939c3d5049a50563fcbc785Roman Zavarnitsyn * Returns "bottom", the fourth component of the rectangle. 10883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * 10983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This method allows to use destructuring declarations when working with rectangles, 11083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * for example: 11183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 11283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * val (left, top, right, bottom) = myRectangle 11383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * ``` 11483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 11583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun RectF.component4() = this.bottom 11683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 11783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 11883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Performs the union of this rectangle and the specified rectangle and returns 11983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * the result as a new rectangle. 12083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 12183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun Rect.plus(r: Rect): Rect { 1224896e241a506661acc8de574508636c14ba99805Romain Guy return Rect(this).apply { 1234896e241a506661acc8de574508636c14ba99805Romain Guy union(r) 1244896e241a506661acc8de574508636c14ba99805Romain Guy } 12583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy} 12683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 12783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 12883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Performs the union of this rectangle and the specified rectangle and returns 12983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * the result as a new rectangle. 13083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 13183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun RectF.plus(r: RectF): RectF { 1324896e241a506661acc8de574508636c14ba99805Romain Guy return RectF(this).apply { 1334896e241a506661acc8de574508636c14ba99805Romain Guy union(r) 1344896e241a506661acc8de574508636c14ba99805Romain Guy } 13583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy} 13683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 13783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 13883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Returns a new rectangle representing this rectangle offset by the specified 13983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * amount on both X and Y axis. 14083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 14183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun Rect.plus(xy: Int): Rect { 1424896e241a506661acc8de574508636c14ba99805Romain Guy return Rect(this).apply { 1434896e241a506661acc8de574508636c14ba99805Romain Guy offset(xy, xy) 1444896e241a506661acc8de574508636c14ba99805Romain Guy } 14583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy} 14683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 14783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 14883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Returns a new rectangle representing this rectangle offset by the specified 14983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * amount on both X and Y axis. 15083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 15183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun RectF.plus(xy: Float): RectF { 1524896e241a506661acc8de574508636c14ba99805Romain Guy return RectF(this).apply { 1534896e241a506661acc8de574508636c14ba99805Romain Guy offset(xy, xy) 1544896e241a506661acc8de574508636c14ba99805Romain Guy } 15583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy} 15683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 15783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 15883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Returns a new rectangle representing this rectangle offset by the specified 15983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * point. 16083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 16183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun Rect.plus(xy: Point): Rect { 1624896e241a506661acc8de574508636c14ba99805Romain Guy return Rect(this).apply { 1634896e241a506661acc8de574508636c14ba99805Romain Guy offset(xy.x, xy.y) 1644896e241a506661acc8de574508636c14ba99805Romain Guy } 16583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy} 16683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 16783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 16883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Returns a new rectangle representing this rectangle offset by the specified 16983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * point. 17083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 17183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun RectF.plus(xy: PointF): RectF { 1724896e241a506661acc8de574508636c14ba99805Romain Guy return RectF(this).apply { 1734896e241a506661acc8de574508636c14ba99805Romain Guy offset(xy.x, xy.y) 1744896e241a506661acc8de574508636c14ba99805Romain Guy } 17583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy} 17683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 17783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 178d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns the difference of this rectangle and the specified rectangle as a new region. 179d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 180d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline operator fun Rect.minus(r: Rect): Region { 1814896e241a506661acc8de574508636c14ba99805Romain Guy return Region(this).apply { 1824896e241a506661acc8de574508636c14ba99805Romain Guy op(r, Region.Op.DIFFERENCE) 1834896e241a506661acc8de574508636c14ba99805Romain Guy } 184d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 185d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 186d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 187d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns the difference of this rectangle and the specified rectangle as a new region. 188d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * This rectangle is first converted to a [Rect] using [RectF.toRect]. 189d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 190d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline operator fun RectF.minus(r: RectF): Region { 1914896e241a506661acc8de574508636c14ba99805Romain Guy return Region(this.toRect()).apply { 1924896e241a506661acc8de574508636c14ba99805Romain Guy op(r.toRect(), Region.Op.DIFFERENCE) 1934896e241a506661acc8de574508636c14ba99805Romain Guy } 194d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 195d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 196d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 197d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns a new rectangle representing this rectangle offset by the negation 198d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * of the specified amount on both X and Y axis. 199d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 200d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline operator fun Rect.minus(xy: Int): Rect { 2014896e241a506661acc8de574508636c14ba99805Romain Guy return Rect(this).apply { 2024896e241a506661acc8de574508636c14ba99805Romain Guy offset(-xy, -xy) 2034896e241a506661acc8de574508636c14ba99805Romain Guy } 204d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 205d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 206d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 207d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns a new rectangle representing this rectangle offset by the negation 208d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * of the specified amount on both X and Y axis. 209d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 210d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline operator fun RectF.minus(xy: Float): RectF { 2114896e241a506661acc8de574508636c14ba99805Romain Guy return RectF(this).apply { 2124896e241a506661acc8de574508636c14ba99805Romain Guy offset(-xy, -xy) 2134896e241a506661acc8de574508636c14ba99805Romain Guy } 214d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 215d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 216d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 217d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns a new rectangle representing this rectangle offset by the negation of 218d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * the specified point. 219d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 220d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline operator fun Rect.minus(xy: Point): Rect { 2214896e241a506661acc8de574508636c14ba99805Romain Guy return Rect(this).apply { 2224896e241a506661acc8de574508636c14ba99805Romain Guy offset(-xy.x, -xy.y) 2234896e241a506661acc8de574508636c14ba99805Romain Guy } 224d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 225d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 226d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 227d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns a new rectangle representing this rectangle offset by the negation of 228d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * the specified point. 229d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 230d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline operator fun RectF.minus(xy: PointF): RectF { 2314896e241a506661acc8de574508636c14ba99805Romain Guy return RectF(this).apply { 2324896e241a506661acc8de574508636c14ba99805Romain Guy offset(-xy.x, -xy.y) 2334896e241a506661acc8de574508636c14ba99805Romain Guy } 234d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 235d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 236d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 237d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns the union of two rectangles as a new rectangle. 238d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 239d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline infix fun Rect.and(r: Rect) = this + r 240d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 241d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 242d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns the union of two rectangles as a new rectangle. 243d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 244d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline infix fun RectF.and(r: RectF) = this + r 245d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 246d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 247d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns the intersection of two rectangles as a new rectangle. 248d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * If the rectangles do not intersect, returns a copy of the left hand side 249d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * rectangle. 250d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 251d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy@SuppressLint("CheckResult") 252d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline infix fun Rect.or(r: Rect): Rect { 2534896e241a506661acc8de574508636c14ba99805Romain Guy return Rect(this).apply { 2544896e241a506661acc8de574508636c14ba99805Romain Guy intersect(r) 2554896e241a506661acc8de574508636c14ba99805Romain Guy } 256d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 257d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 258d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 259d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns the intersection of two rectangles as a new rectangle. 260d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * If the rectangles do not intersect, returns a copy of the left hand side 261d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * rectangle. 262d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 263d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy@SuppressLint("CheckResult") 264d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline infix fun RectF.or(r: RectF): RectF { 2654896e241a506661acc8de574508636c14ba99805Romain Guy return RectF(this).apply { 2664896e241a506661acc8de574508636c14ba99805Romain Guy intersect(r) 2674896e241a506661acc8de574508636c14ba99805Romain Guy } 268d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 269d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 270d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 271d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns the union minus the intersection of two rectangles as a new region. 272d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 273d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline infix fun Rect.xor(r: Rect): Region { 2744896e241a506661acc8de574508636c14ba99805Romain Guy return Region(this).apply { 2754896e241a506661acc8de574508636c14ba99805Romain Guy op(r, Region.Op.XOR) 2764896e241a506661acc8de574508636c14ba99805Romain Guy } 277d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 278d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 279d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 280d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns the union minus the intersection of two rectangles as a new region. 281d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * The two rectangles are first converted to [Rect] using [RectF.toRect]. 282d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 283d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline infix fun RectF.xor(r: RectF): Region { 2844896e241a506661acc8de574508636c14ba99805Romain Guy return Region(this.toRect()).apply { 2854896e241a506661acc8de574508636c14ba99805Romain Guy op(r.toRect(), Region.Op.XOR) 2864896e241a506661acc8de574508636c14ba99805Romain Guy } 287d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 288d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 289d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 29083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Returns true if the specified point is inside the rectangle. 29183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * The left and top are considered to be inside, while the right and bottom are not. 29283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This means that for a point to be contained: left <= x < right and top <= y < bottom. 29383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * An empty rectangle never contains any point. 29483b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 29583b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun Rect.contains(p: Point) = contains(p.x, p.y) 29683b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy 29783b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy/** 29883b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * Returns true if the specified point is inside the rectangle. 29983b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * The left and top are considered to be inside, while the right and bottom are not. 30083b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * This means that for a point to be contained: left <= x < right and top <= y < bottom. 30183b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy * An empty rectangle never contains any point. 30283b2c15760fabf039f11ef45d6af899b59296dbeRomain Guy */ 30383b2c15760fabf039f11ef45d6af899b59296dbeRomain Guyinline operator fun RectF.contains(p: PointF) = contains(p.x, p.y) 3046f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes 3056f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes/** 3066f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes * Returns a [RectF] representation of this rectangle. 3076f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes */ 308d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline fun Rect.toRectF(): RectF = RectF(this) 3096f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes 3106f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes/** 3116f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes * Returns a [Rect] representation of this rectangle. The resulting rect will be sized such 3126f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes * that this rect can fit within it. 3136f46c984a5f2c32f7cc14957c11c94ab01f05e63Chris Banes */ 314d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline fun RectF.toRect(): Rect { 315d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy val r = Rect() 316d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy roundOut(r) 317d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy return r 318d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy} 319d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 320d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 321d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns a [Region] representation of this rectangle. 322d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 323d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline fun Rect.toRegion() = Region(this) 324d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy 325d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy/** 326d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * Returns a [Region] representation of this rectangle. The resulting rect will be sized such 327d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy * that this rect can fit within it. 328d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guy */ 329d19b769f760eebaee272ee2b83c208904abbfdbeRomain Guyinline fun RectF.toRegion() = Region(this.toRect()) 33046b8a0ef84de421456d4ad06cc7f698d3505422fRomain Guy 33146b8a0ef84de421456d4ad06cc7f698d3505422fRomain Guy/** 33246b8a0ef84de421456d4ad06cc7f698d3505422fRomain Guy * Transform this rectangle in place using the supplied [Matrix] and returns 33346b8a0ef84de421456d4ad06cc7f698d3505422fRomain Guy * this rectangle. 33446b8a0ef84de421456d4ad06cc7f698d3505422fRomain Guy */ 33546b8a0ef84de421456d4ad06cc7f698d3505422fRomain Guyinline fun RectF.transform(m: Matrix) = apply { m.mapRect(this@transform) } 336