/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 - 2 0 2 2 ĠA ur ora , ĠK ir ill ĠGro uch nik ov Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . push ing pixels . aur ora . the ming . utils Ċ Ċ import Ġandroidx . compose . ui . geometry . Corner Radius Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . geometry . Round Rect Ċ import Ġandroidx . compose . ui . graphics . Outline Ċ import Ġandroidx . compose . ui . graphics . Path Ċ import Ġorg . push ing pixels . aur ora . the ming . Outline Kind Ċ import Ġorg . push ing pixels . aur ora . the ming . Side Ċ import Ġorg . push ing pixels . aur ora . the ming . Side s Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġbase Ġoutline Ġfor Ġthe Ġspecified Ġparameters . ĠThe Ġbase Ġoutline Ġis Ċ Ġ* Ġa Ġrectangle Ġwith Ġrounded Ġcorners . ĠSome Ġcorners Ġmay Ġnot Ġbe Ġrounded Ġbased Ġon Ċ Ġ* Ġthe Ġpassed Ġ` sides `. ĠIf Ġthe Ġ` outline Kind ` Ġis Ġ` Outline Kind . Border ` Ġand Ġthe Ċ Ġ* Ġ` sides ` Ġhas Ġopen Ġside ( s ), Ġthe Ġreturned Ġoutline Ġwill Ġhave Ġa Ġnon - continuous Ġpath Ċ Ġ* Ġwith Ġ" jump s " Ġthat Ġcorrespond Ġto Ġthe Ġopen Ġside ( s ). Ċ Ġ*/ Ċ fun Ġget Base Outline ( ĊĠĠĠ Ġwidth : ĠFloat , Ġheight : ĠFloat , ĊĠĠĠ Ġradius : ĠFloat , Ġsides : ĠS ides ? Ġ= Ġnull , ĊĠĠĠ Ġin sets : ĠFloat Ġ= Ġ 0 . 0 f , Ġoutline Kind : ĠOut line Kind Ġ= ĠOut line Kind . Border Ċ ): ĠOut line Ġ{ ĊĠĠĠ Ġval Ġstraight Side s Ġ= Ġsides ?. stra ight Side s ĊĠĠĠ Ġval Ġis Top Left Corner Ġ= Ġ( stra ight Side s Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( stra ight Side s . contains ( Side . Left ) Ġ|| Ġstraight Side s . contains ( Side . Top ))) ĊĠĠĠ Ġval Ġis Top Right Corner Ġ= Ġ( stra ight Side s Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( stra ight Side s . contains ( Side . Right ) Ġ|| Ġstraight Side s . contains ( Side . Top ))) ĊĠĠĠ Ġval Ġis Bottom Right Corner Ġ= Ġ( stra ight Side s Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( stra ight Side s . contains ( Side . Right ) Ġ|| Ġstraight Side s . contains ( Side . Bottom ))) ĊĠĠĠ Ġval Ġis Bottom Left Corner Ġ= Ġ( stra ight Side s Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( stra ight Side s . contains ( Side . Left ) Ġ|| Ġstraight Side s . contains ( Side . Bottom ))) ĊĊĠĠĠ Ġval Ġopen Side s Ġ= Ġsides ?. open Side s ĊĠĠĠ Ġval Ġhas Open Side s Ġ= Ġ( open Side s Ġ!= Ġnull ) Ġ&& Ġopen Side s . isNotEmpty () ĊĊĠĠĠ Ġif Ġ(! has Open Side s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġall Ġthe Ġsides Ġare Ġstraight , Ġthe Ġresult Ġis Ġa Ġsimple Ġrectangle ĊĠĠĠĠĠĠĠ Ġif Ġ( is Top Left Corner Ġ&& Ġis Top Right Corner Ġ&& Ġis Bottom Right Corner Ġ&& Ġis Bottom Left Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRectangle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOut line . Rectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect Ġ= ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġin sets , Ġtop Ġ= Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġwidth Ġ- Ġin sets , Ġbottom Ġ= Ġheight Ġ- Ġin sets ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOtherwise Ġwe Ġhave Ġa Ġrounded Ġrectangle Ġwith Ġpotentially Ġdifferent Ġcorner Ġrad ii ĊĠĠĠĠĠĠĠ Ġ// Ġbased Ġon Ġwhich Ġsides Ġare Ġstraight ĊĠĠĠĠĠĠĠ Ġreturn ĠOut line . Rounded ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġround Rect Ġ= ĠRound Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġin sets , Ġtop Ġ= Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġwidth Ġ- Ġin sets , Ġbottom Ġ= Ġheight Ġ- Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Left Corner Radius Ġ= Ġif Ġ( is Top Left Corner ) ĠCor ner Radius . Zero Ġelse ĠCor ner Radius ( radius , Ġradius ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Right Corner Radius Ġ= Ġif Ġ( is Top Right Corner ) ĠCor ner Radius . Zero Ġelse ĠCor ner Radius ( radius , Ġradius ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Right Corner Radius Ġ= Ġif Ġ( is Bottom Right Corner ) ĠCor ner Radius . Zero Ġelse ĠCor ner Radius ( radius , Ġradius ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Left Corner Radius Ġ= Ġif Ġ( is Bottom Left Corner ) ĠCor ner Radius . Zero Ġelse ĠCor ner Radius ( radius , Ġradius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠOpen Ġsides Ġare Ġhandled Ġdifferently Ġfor Ġfill Ġand Ġborder Ġoutline Ġkinds . ĠFor Ġfill Ġwe Ġneed ĊĠĠĠ Ġ// Ġto Ġreturn Ġa Ġfully Ġcontinuous Ġand Ġclosed Ġpath Ġso Ġthat Ġit Ġcan Ġbe Ġfilled . ĠFor Ġborder , Ġwe ĊĠĠĠ Ġ// Ġrespect Ġthe Ġopen Ġsides , Ġusing Ġmove To Ġinstead Ġof Ġline To Ġfor Ġthe Ġrelevant Ġside ( s ). ĊĠĠĠ Ġval Ġis Top Open Ġ= Ġopen Side s !!. contains ( Side . Top ) Ġ&& Ġ( outline Kind Ġ== ĠOut line Kind . Border ) ĊĠĠĠ Ġval Ġis Bottom Open Ġ= Ġopen Side s . contains ( Side . Bottom ) Ġ&& Ġ( outline Kind Ġ== ĠOut line Kind . Border ) ĊĠĠĠ Ġval Ġis Left Open Ġ= Ġopen Side s . contains ( Side . Left ) Ġ&& Ġ( outline Kind Ġ== ĠOut line Kind . Border ) ĊĠĠĠ Ġval Ġis Right Open Ġ= Ġopen Side s . contains ( Side . Right ) Ġ&& Ġ( outline Kind Ġ== ĠOut line Kind . Border ) ĊĊĠĠĠ Ġval Ġpath Ġ= ĠPath () ĊĠĠĠ Ġ// ĠStart Ġin Ġtop Ġleft ĊĠĠĠ Ġif Ġ( is Top Left Corner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġin sets , Ġy Ġ= Ġin sets ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġin sets Ġ+ Ġradius , Ġy Ġ= Ġin sets ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠTo Ġtop Ġright ĊĠĠĠ Ġif Ġ( is Top Open ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Top Right Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġwidth Ġ- Ġin sets , Ġy Ġ= Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġwidth Ġ- Ġin sets Ġ- Ġradius , Ġy Ġ= Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Top Right Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( x Ġ= Ġwidth Ġ- Ġin sets , Ġy Ġ= Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( x Ġ= Ġwidth Ġ- Ġin sets Ġ- Ġradius , Ġy Ġ= Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠRo unded Ġtop Ġright Ġcorner ĊĠĠĠ Ġif Ġ(! is Top Right Corner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpath . arc To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect Ġ= ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġwidth Ġ- Ġin sets Ġ- Ġ 2 Ġ* Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġwidth Ġ- Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġin sets Ġ+ Ġ 2 Ġ* Ġradius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġstart Angle Degrees Ġ= Ġ 2 7 0 . 0 f , Ġsweep Angle Degrees Ġ= Ġ 9 0 . 0 f , Ġforce MoveTo Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠTo Ġbottom Ġright ĊĠĠĠ Ġif Ġ( is Right Open ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Bottom Right Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġwidth Ġ- Ġin sets , Ġy Ġ= Ġheight Ġ- Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġwidth Ġ- Ġin sets , Ġy Ġ= Ġheight Ġ- Ġin sets Ġ- Ġradius ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Bottom Right Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( x Ġ= Ġwidth Ġ- Ġin sets , Ġy Ġ= Ġheight Ġ- Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( x Ġ= Ġwidth Ġ- Ġin sets , Ġy Ġ= Ġheight Ġ- Ġin sets Ġ- Ġradius ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠRo unded Ġbottom Ġright Ġcorner ĊĠĠĠ Ġif Ġ(! is Bottom Right Corner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpath . arc To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect Ġ= ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġwidth Ġ- Ġin sets Ġ- Ġ 2 Ġ* Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġheight Ġ- Ġin sets Ġ- Ġ 2 Ġ* Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġwidth Ġ- Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġheight Ġ- Ġin sets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġstart Angle Degrees Ġ= Ġ 0 . 0 f , Ġsweep Angle Degrees Ġ= Ġ 9 0 . 0 f , Ġforce MoveTo Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠTo Ġbottom Ġleft ĊĠĠĠ Ġif Ġ( is Bottom Open ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Bottom Left Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġin sets , Ġy Ġ= Ġheight Ġ- Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġin sets Ġ+ Ġradius , Ġy Ġ= Ġheight Ġ- Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Bottom Left Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( x Ġ= Ġin sets , Ġy Ġ= Ġheight Ġ- Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( x Ġ= Ġin sets Ġ+ Ġradius , Ġy Ġ= Ġheight Ġ- Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠRo unded Ġbottom Ġleft Ġcorner ĊĠĠĠ Ġif Ġ(! is Bottom Left Corner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpath . arc To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect Ġ= ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġheight Ġ- Ġin sets Ġ- Ġ 2 Ġ* Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġin sets Ġ+ Ġ 2 Ġ* Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġheight Ġ- Ġin sets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġstart Angle Degrees Ġ= Ġ 9 0 . 0 f , Ġsweep Angle Degrees Ġ= Ġ 9 0 . 0 f , Ġforce MoveTo Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠTo Ġtop Ġleft ĊĠĠĠ Ġif Ġ( is Left Open ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Top Left Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġin sets , Ġy Ġ= Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( x Ġ= Ġin sets , Ġy Ġ= Ġin sets Ġ+ Ġradius ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Top Left Corner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( x Ġ= Ġin sets , Ġy Ġ= Ġin sets ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( x Ġ= Ġin sets , Ġy Ġ= Ġin sets Ġ+ Ġradius ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠRo unded Ġtop Ġleft Ġcorner ĊĠĠĠ Ġif Ġ(! is Top Left Corner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpath . arc To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect Ġ= ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġin sets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġin sets Ġ+ Ġ 2 Ġ* Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġin sets Ġ+ Ġ 2 Ġ* Ġradius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġstart Angle Degrees Ġ= Ġ 1 8 0 . 0 f , Ġsweep Angle Degrees Ġ= Ġ 9 0 . 0 f , Ġforce MoveTo Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠOut line . Generic ( path Ġ= Ġpath ) Ċ } Ċ