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