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