/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . compose . ui . platform Ċ Ċ import Ġandroidx . compose . ui . geometry . Corner Radius Ċ import Ġandroidx . compose . ui . graphics . Outline Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . geometry . Round Rect Ċ import Ġandroidx . compose . ui . graphics . Path Ċ import Ġandroidx . compose . ui . graphics . Path Operation Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` true ` Ġif Ġ([ x ], Ġ[ y ]) Ġis Ġwithin Ġ[ outline ]. ĠFor Ġsome Ġout lines Ġthat Ġdon 't Ġrequire Ġa Ġ[ Path ], Ċ Ġ* Ġthe Ġexact Ġpoint Ġis Ġused Ġto Ġcalculate Ġwhether Ġthe Ġpoint Ġis Ġinside Ġ[ outline ]. ĠWhen Ġa Ġ[ Path ] Ġis Ċ Ġ* Ġrequired , Ġa Ġ 0 . 0 1 Ġx Ġ 0 . 0 1 Ġbox Ġaround Ġ([ x ], Ġ[ y ]) Ġis Ġused Ġto Ġintersect Ġwith Ġthe Ġpath Ġto Ġdetermine Ċ Ġ* Ġthe Ġresult . Ċ Ġ* Ċ Ġ* ĠThe Ġ[ tmp Touch Point Path ] Ġand Ġ[ tmp Op Path ] Ġare Ġtemporary ĠPaths Ġthat Ġare Ġcleared Ġafter Ġuse Ġand Ġwill Ċ Ġ* Ġbe Ġused Ġin Ġthe Ġcalculation Ġof Ġthe Ġintersection . ĠThese Ġmust Ġbe Ġempty Ġwhen Ġpassed Ġas Ġparameters Ġor Ċ Ġ* Ġcan Ġbe Ġ` null ` Ġto Ġallocate Ġlocally . Ċ Ġ*/ Ċ internal Ġfun ĠisIn Outline ( ĊĠĠĠ Ġoutline : ĠOut line , ĊĠĠĠ Ġx : ĠFloat , ĊĠĠĠ Ġy : ĠFloat , ĊĠĠĠ Ġtmp Touch Point Path : ĠPath ? Ġ= Ġnull , ĊĠĠĠ Ġtmp Op Path : ĠPath ? Ġ= Ġnull Ċ ): ĠBoolean Ġ= Ġwhen Ġ( outline ) Ġ{ ĊĠĠĠ Ġis ĠOut line . Rectangle Ġ-> ĠisIn Rectangle ( outline . rect , Ġx , Ġy ) ĊĠĠĠ Ġis ĠOut line . Rounded Ġ-> ĠisIn Rounded Rect ( outline , Ġx , Ġy , Ġtmp Touch Point Path , Ġtmp Op Path ) ĊĠĠĠ Ġis ĠOut line . Generic Ġ-> ĠisIn Path ( outline . path , Ġx , Ġy , Ġtmp Touch Point Path , Ġtmp Op Path ) Ċ } Ċ Ċ private Ġfun ĠisIn Rectangle ( rect : ĠRect , Ġx : ĠFloat , Ġy : ĠFloat ) Ġ= ĊĠĠĠ Ġrect . left Ġ<= Ġx Ġ&& Ġx Ġ< Ġrect . right Ġ&& Ġrect . top Ġ<= Ġy Ġ&& Ġy Ġ< Ġrect . bottom Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` true ` Ġif Ġ([ x ], Ġ[ y ]) Ġis Ġwithin Ġ[ outline ]. Ċ Ġ*/ Ċ private Ġfun ĠisIn Rounded Rect ( ĊĠĠĠ Ġoutline : ĠOut line . Rounded , ĊĠĠĠ Ġx : ĠFloat , ĊĠĠĠ Ġy : ĠFloat , ĊĠĠĠ Ġtouch Point Path : ĠPath ?, ĊĠĠĠ Ġop Path : ĠPath ? Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġr rect Ġ= Ġoutline . round Rect ĊĊĠĠĠ Ġ// Ġfirst , Ġeverything Ġthat Ġis Ġoutside Ġthe Ġrect ĊĠĠĠ Ġif Ġ( x Ġ< Ġr rect . left Ġ|| Ġx Ġ>= Ġr rect . right Ġ|| Ġy Ġ< Ġr rect . top Ġ|| Ġy Ġ>= Ġr rect . bottom ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġalgorithm Ġassumes Ġthat Ġthe Ġcorner Ġradius Ġisn 't Ġgreater Ġthan Ġthe Ġsize Ġof Ġthe ĠRect . ĊĠĠĠ Ġ// ĠThere 's Ġa Ġcomplex Ġalgorithm Ġto Ġhandle Ġcases Ġbeyond Ġthat , Ġso Ġwe 'll Ġfall Ġback Ġto ĊĠĠĠ Ġ// Ġthe ĠPath Ġalgorithm Ġto Ġhandle Ġit ĊĠĠĠ Ġif Ġ(! r rect . corners Fit ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġop Path Ġ?: ĠPath () ĊĠĠĠĠĠĠĠ Ġpath . add Round Rect ( r rect ) ĊĠĠĠĠĠĠĠ Ġreturn ĠisIn Path ( path , Ġx , Ġy , Ġtouch Point Path , Ġop Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtop Left X Ġ= Ġr rect . left Ġ+ Ġr rect . top Left Corner Radius . x ĊĠĠĠ Ġval Ġtop Left Y Ġ= Ġr rect . top Ġ+ Ġr rect . top Left Corner Radius . y ĊĊĠĠĠ Ġval Ġtop Right X Ġ= Ġr rect . right Ġ- Ġr rect . top Right Corner Radius . x ĊĠĠĠ Ġval Ġtop Right Y Ġ= Ġr rect . top Ġ+ Ġr rect . top Right Corner Radius . y ĊĊĠĠĠ Ġval Ġbottom Right X Ġ= Ġr rect . right Ġ- Ġr rect . bottom Right Corner Radius . x ĊĠĠĠ Ġval Ġbottom Right Y Ġ= Ġr rect . bottom Ġ- Ġr rect . bottom Right Corner Radius . y ĊĊĠĠĠ Ġval Ġbottom Left X Ġ= Ġr rect . bottom Ġ- Ġr rect . bottom Left Corner Radius . y ĊĠĠĠ Ġval Ġbottom Left Y Ġ= Ġr rect . left Ġ+ Ġr rect . bottom Left Corner Radius . x ĊĊĠĠĠ Ġreturn Ġif Ġ( x Ġ< Ġtop Left X Ġ&& Ġy Ġ< Ġtop Left Y ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtop - left Ġcorner ĊĠĠĠĠĠĠĠ Ġis Within Ellipse ( x , Ġy , Ġr rect . top Left Corner Radius , Ġtop Left X , Ġtop Left Y ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( x Ġ< Ġbottom Left Y Ġ&& Ġy Ġ> Ġbottom Left X ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġbottom - left Ġcorner ĊĠĠĠĠĠĠĠ Ġis Within Ellipse ( x , Ġy , Ġr rect . bottom Left Corner Radius , Ġbottom Left Y , Ġbottom Left X ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( x Ġ> Ġtop Right X Ġ&& Ġy Ġ< Ġtop Right Y ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtop - right Ġcorner ĊĠĠĠĠĠĠĠ Ġis Within Ellipse ( x , Ġy , Ġr rect . top Right Corner Radius , Ġtop Right X , Ġtop Right Y ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( x Ġ> Ġbottom Right X Ġ&& Ġy Ġ> Ġbottom Right Y ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġbottom - right Ġcorner ĊĠĠĠĠĠĠĠ Ġis Within Ellipse ( x , Ġy , Ġr rect . bottom Right Corner Radius , Ġbottom Right X , Ġbottom Right Y ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ// Ġnot Ġat Ġa Ġcorner , Ġso Ġit Ġmust Ġbe Ġinside ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` true ` Ġif Ġthe Ġrounded Ġrectangle Ġhas Ġrounded Ġcorners Ġthat Ġfit Ġwithin Ġthe Ġsides Ġor Ċ Ġ* Ġ` false ` Ġif Ġthe Ġrounded Ġsides Ġadd Ġup Ġto Ġa Ġgreater Ġsize Ġthat Ġa Ġside . Ċ Ġ*/ Ċ private Ġfun ĠRound Rect . corners Fit () Ġ= Ġtop Left Corner Radius . x Ġ+ Ġtop Right Corner Radius . x Ġ<= Ġwidth Ġ&& ĊĠĠĠ Ġbottom Left Corner Radius . x Ġ+ Ġbottom Right Corner Radius . x Ġ<= Ġwidth Ġ&& ĊĠĠĠ Ġtop Left Corner Radius . y Ġ+ Ġbottom Left Corner Radius . y Ġ<= Ġheight Ġ&& ĊĠĠĠ Ġtop Right Corner Radius . y Ġ+ Ġbottom Right Corner Radius . y Ġ<= Ġheight Ċ Ċ /** Ċ Ġ* ĠUsed Ġto Ġdetermine Ġwhether Ġa Ġpoint Ġis Ġwithin Ġa Ġrounded Ġcorner , Ġthis Ġreturns Ġ` true ` Ġif Ġthe Ġpoint Ċ Ġ* Ġ([ x ], Ġ[ y ]) Ġis Ġwithin Ġthe Ġel lipse Ġcentered Ġat Ġ([ center X ], Ġ[ center Y ]) Ġwith Ġthe Ġhorizontal Ġand Ċ Ġ* Ġvertical Ġrad ii Ġgiven Ġby Ġ[ corner Radius ]. Ċ Ġ*/ Ċ private Ġfun Ġis Within Ellipse ( ĊĠĠĠ Ġx : ĠFloat , ĊĠĠĠ Ġy : ĠFloat , ĊĠĠĠ Ġcorner Radius : ĠCor ner Radius , ĊĠĠĠ Ġcenter X : ĠFloat , ĊĠĠĠ Ġcenter Y : ĠFloat Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġpx Ġ= Ġx Ġ- Ġcenter X ĊĠĠĠ Ġval Ġpy Ġ= Ġy Ġ- Ġcenter Y ĊĠĠĠ Ġval Ġradius X Ġ= Ġcorner Radius . x ĊĠĠĠ Ġval Ġradius Y Ġ= Ġcorner Radius . y ĊĠĠĠ Ġreturn Ġ( px Ġ* Ġpx ) Ġ/ Ġ( radius X Ġ* Ġradius X ) Ġ+ Ġ( py Ġ* Ġpy ) Ġ/ Ġ( radius Y Ġ* Ġradius Y ) Ġ<= Ġ 1 f Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` true ` Ġif Ġthe Ġ 0 . 0 1 Ġx Ġ 0 . 0 1 Ġbox Ġaround Ġ([ x ], Ġ[ y ]) Ġhas Ġany Ġpoint Ġwith Ġ[ path ]. Ċ Ġ* Ċ Ġ* ĠThe Ġ[ tmp Touch Point Path ] Ġand Ġ[ tmp Op Path ] Ġare Ġtemporary ĠPaths Ġthat Ġare Ġcleared Ġafter Ġuse Ġand Ġwill Ċ Ġ* Ġbe Ġused Ġin Ġthe Ġcalculation Ġof Ġthe Ġintersection . ĠThese Ġmust Ġbe Ġempty Ġwhen Ġpassed Ġas Ġparameters Ġor Ċ Ġ* Ġcan Ġbe Ġ` null ` Ġto Ġallocate Ġlocally . Ċ Ġ*/ Ċ private Ġfun ĠisIn Path ( ĊĠĠĠ Ġpath : ĠPath , ĊĠĠĠ Ġx : ĠFloat , ĊĠĠĠ Ġy : ĠFloat , ĊĠĠĠ Ġtmp Touch Point Path : ĠPath ?, ĊĠĠĠ Ġtmp Op Path : ĠPath ? Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġrect Ġ= ĠRect ( x Ġ- Ġ 0 . 0 0 5 f , Ġy Ġ- Ġ 0 . 0 0 5 f , Ġx Ġ+ Ġ 0 . 0 0 5 f , Ġy Ġ+ Ġ 0 . 0 0 5 f ) ĊĠĠĠ Ġval Ġtouch Point Path Ġ= Ġtmp Touch Point Path Ġ?: ĠPath () ĊĠĠĠ Ġtouch Point Path . add Rect ( ĊĠĠĠĠĠĠĠ Ġrect ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġop Path Ġ= Ġtmp Op Path Ġ?: ĠPath () ĊĠĠĠ Ġop Path . op ( path , Ġtouch Point Path , ĠPath Operation . Intersect ) ĊĊĠĠĠ Ġval Ġis Cli pped Ġ= Ġop Path . isEmpty ĊĠĠĠ Ġop Path . reset () ĊĠĠĠ Ġtouch Point Path . reset () ĊĠĠĠ Ġreturn Ġ! is Cli pped Ċ }