/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ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 . layout Ċ Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ Ċ /** Ċ Ġ* ĠA Ġholder Ġof Ġthe Ġmeasured Ġbounds Ġfor Ġthe Ġlayout Ġ( Measure Box ). Ċ Ġ*/ Ċ // ĠTODO ( And rey ): ĠAdd ĠMatrix Ġtransformation Ġhere Ġwhen Ġwe Ġwould Ġhave Ġthis Ġlogic . Ċ interface ĠLayout Coordinates Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġthis Ġlayout Ġin Ġthe Ġlocal Ġcoordinates Ġspace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsize : ĠInt Size ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġalignment Ġlines Ġprovided Ġfor Ġthis Ġlayout , Ġnot Ġincluding Ġinherited Ġlines . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġprovided Alignment Lines : ĠSet < Alignment Line > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcoordinates Ġof Ġthe Ġparent Ġlayout . ĠNull Ġif Ġthere Ġis Ġno Ġparent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġparent Coordinates : ĠLayout Coordinates ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġfalse Ġif Ġthe Ġcorresponding Ġlayout Ġwas Ġdet ached Ġfrom Ġthe Ġhierarchy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Attached : ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġglobal Ġposition Ġinto Ġa Ġlocal Ġposition Ġwithin Ġthis Ġlayout . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġglobal ToLocal ( global : ĠOffset ): ĠOffset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġlocal Ġposition Ġwithin Ġthis Ġlayout Ġinto Ġa Ġglobal Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlocal To Global ( local : ĠOffset ): ĠOffset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġlocal Ġposition Ġwithin Ġthis Ġlayout Ġinto Ġan Ġoffset Ġfrom Ġthe Ġroot Ġcomp osable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlocal To Root ( local : ĠOffset ): ĠOffset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġchild Ġlayout Ġposition Ġinto Ġa Ġlocal Ġposition Ġwithin Ġthis Ġlayout . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġchild ToLocal ( child : ĠLayout Coordinates , Ġchild Local : ĠOffset ): ĠOffset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġchild Ġbounding Ġbox , Ġdiscard ing Ġcli pped Ġrect angles , Ġin Ġlocal Ġcoordinates . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġchild BoundingBox ( child : ĠLayout Coordinates ): ĠRect ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġposition Ġof Ġan Ġ[ alignment Ġline ][ Alignment Line ], ĊĠĠĠĠ Ġ* Ġor Ġ[ Alignment Line . Unspecified ] Ġif Ġthe Ġline Ġis Ġnot Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġget ( line : ĠAlignment Line ): ĠInt Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġglobal Ġposition Ġof Ġthis Ġlayout . Ċ Ġ*/ Ċ inline Ġval ĠLayout Coordinates . global Position : ĠOffset Ġget () Ġ= Ġlocal To Global ( Offset . Zero ) Ċ Ċ /** Ċ Ġ* ĠThe Ġposition Ġof Ġthis Ġlayout Ġinside Ġthe Ġroot Ġcomp osable . Ċ Ġ*/ Ċ inline Ġval ĠLayout Coordinates . position In Root : ĠOffset Ġget () Ġ= Ġlocal To Root ( Offset . Zero ) Ċ Ċ /** Ċ Ġ* ĠThe Ġboundaries Ġof Ġthis Ġlayout Ġinside Ġthe Ġroot Ġcomp osable . Ċ Ġ*/ Ċ val ĠLayout Coordinates . bounds In Root : ĠRect ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Root ( this ). child BoundingBox ( this ) ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġposition Ġof Ġthe Ġtop - left Ġin Ġthe Ġparent 's Ġcontent Ġarea Ġor Ġ( 0 , Ġ 0 ) Ċ Ġ* Ġfor Ġthe Ġroot . Ċ Ġ*/ Ċ val ĠLayout Coordinates . position In Parent : ĠOffset ĊĠĠĠ Ġget () Ġ= Ġparent Coordinates ?. child ToLocal ( this , ĠOffset . Zero ) Ġ?: ĠOffset . Zero Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġbounding Ġbox Ġof Ġthe Ġchild Ġin Ġthe Ġparent 's Ġcontent Ġarea , Ġincluding Ġany Ġclipping Ċ Ġ* Ġdone Ġwith Ġrespect Ġto Ġthe Ġparent . ĠFor Ġthe Ġroot , Ġthe Ġbounds Ġis Ġposition ed Ġat Ġ( 0 , Ġ 0 ) Ġand Ġsized Ċ Ġ* Ġto Ġthe Ġsize Ġof Ġthe Ġroot . Ċ Ġ*/ Ċ val ĠLayout Coordinates . bounds In Parent : ĠRect ĊĠĠĠ Ġget () Ġ= Ġparent Coordinates ?. child BoundingBox ( this ) ĊĠĠĠĠĠĠĠ Ġ?: ĠRect ( 0 f , Ġ 0 f , Ġsize . width . toFloat (), Ġsize . height . toFloat ()) Ċ Ċ /** Ċ Ġ* ĠThe Ġglobal Ġboundaries Ġof Ġthis Ġlayout Ġinside . Ċ Ġ*/ Ċ val ĠLayout Coordinates . global Bounds : ĠRect ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġfind Root ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Position Ġ= Ġroot . local To Global ( Offset . Zero ) ĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġroot . child BoundingBox ( this ) ĊĠĠĠĠĠĠĠ Ġreturn ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġbounds . left Ġ+ Ġroot Position . x , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġbounds . top Ġ+ Ġroot Position . y , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġbounds . right Ġ+ Ġroot Position . x , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġbounds . bottom Ġ+ Ġroot Position . y ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġfind Root ( layout Coordinates : ĠLayout Coordinates ): ĠLayout Coordinates Ġ{ ĊĠĠĠ Ġvar Ġroot Ġ= Ġlayout Coordinates ĊĠĠĠ Ġvar Ġparent Ġ= Ġroot . parent Coordinates ĊĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroot Ġ= Ġparent ĊĠĠĠĠĠĠĠ Ġparent Ġ= Ġroot . parent Coordinates ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġroot Ċ }