1245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy/*
2245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * Copyright (C) 2018 The Android Open Source Project
3245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy *
4245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * you may not use this file except in compliance with the License.
6245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * You may obtain a copy of the License at
7245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy *
8245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy *       http://www.apache.org/licenses/LICENSE-2.0
9245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy *
10245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * Unless required by applicable law or agreed to in writing, software
11245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * See the License for the specific language governing permissions and
14245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * limitations under the License.
15245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy */
16245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy
174df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy@file:Suppress("NOTHING_TO_INLINE")
184df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy
199c80550cbbe357a89e2abeeb9c7769fcaefc3a65Jake Whartonpackage androidx.core.graphics
20245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy
21245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guyimport android.graphics.Path
226889aa5fa8875d1a2842df11e24a5fbb2fd76a67Jake Whartonimport androidx.annotation.RequiresApi
23245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy
24245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy/**
25245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * Flattens (or approximate) the [Path] with a series of line segments.
26245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy *
27245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * @param error The acceptable error for a line on the Path. Typically this would be
28245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy *              0.5 so that the error is less than half a pixel. This value must be
29245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy *              positive and is set to 0.5 by default.
30245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy *
31245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy * @see Path.approximate
32245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy */
33245f352e7e7a8b37faebc5aefd52ce98ae9f08e6Romain Guy@RequiresApi(26)
346889aa5fa8875d1a2842df11e24a5fbb2fd76a67Jake Whartonfun Path.flatten(error: Float = 0.5f): Iterable<PathSegment> = PathUtils.flatten(this, error)
354df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy
364df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy/**
374df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy * Returns the union of two paths as a new [Path].
384df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy */
394df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy@RequiresApi(19)
404df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guyinline operator fun Path.plus(p: Path): Path {
414df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy    return Path(this).apply {
424df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy        op(p, Path.Op.UNION)
434df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy    }
444df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy}
454df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy
464df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy/**
474df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy * Returns the difference of two paths as a new [Path].
484df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy */
494df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy@RequiresApi(19)
504df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guyinline operator fun Path.minus(p: Path): Path {
514df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy    return Path(this).apply {
524df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy        op(p, Path.Op.DIFFERENCE)
534df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy    }
544df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy}
554df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy
564df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy/**
574df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy * Returns the union of two paths as a new [Path].
584df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy */
594df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy@RequiresApi(19)
604df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guyinline infix fun Path.and(p: Path) = this + p
614df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy
624df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy/**
634df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy * Returns the intersection of two paths as a new [Path].
644df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy * If the paths do not intersect, returns an empty path.
654df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy */
664df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy@RequiresApi(19)
674df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guyinline infix fun Path.or(p: Path): Path {
684df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy    return Path().apply {
694df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy        op(this@or, p, Path.Op.INTERSECT)
704df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy    }
714df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy}
724df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy
734df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy/**
744df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy * Returns the union minus the intersection of two paths as a new [Path].
754df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy */
764df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy@RequiresApi(19)
774df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guyinline infix fun Path.xor(p: Path): Path {
784df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy    return Path(this).apply {
794df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy        op(p, Path.Op.XOR)
804df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy    }
814df8629cfe9f924b507ff26e53f896e025eb9ff7Romain Guy}
82