package Ġcom . le ha ine . little kt . graphics . font Ċ Ċ import Ġcom . le ha ine . little kt . graph . node . component . H Align Ċ import Ġcom . le ha ine . little kt . graphics .* Ċ import Ġcom . le ha ine . little kt . math . Mat 4 Ċ import Ġcom . le ha ine . little kt . math . geom . Angle Ċ import Ġcom . le ha ine . little kt . math . geom . cos ine Ċ import Ġcom . le ha ine . little kt . math . geom . degrees Ċ import Ġcom . le ha ine . little kt . math . geom . s ine Ċ import Ġcom . le ha ine . little kt . util . data structure . Float ArrayList Ċ import Ġcom . le ha ine . little kt . util . data structure . Pool Ċ import Ġcom . le ha ine . little kt . util . data structure . internal . fill Ċ Ċ /** Ċ Ġ* ĠCache s Ġglyph Ġgeometry Ġto Ġprovide Ġa Ġfast Ġway Ġto Ġrender Ġstatic Ġtextures Ġwithout Ġhaving Ġre compute Ġthe Ġglyph Ġeach Ġtime . Ċ Ġ* ĠThis Ġis Ġa Ġbase Ġclass Ġand Ġcan Ġbe Ġextended Ġto Ġadd Ġadditional Ġfunctionality Ġto Ġspecific Ġfonts . Ċ Ġ* Ġ@ see ĠBitmap Font Cache Ċ Ġ* Ġ@ author ĠCol ton ĠDaily Ċ Ġ* Ġ@ date Ġ 1 / 5 / 2 0 2 2 Ċ Ġ*/ Ċ open Ġclass ĠFont Cache ( val Ġpages : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtemp 4 Ġ= ĠMat 4 () Ġ// Ġused Ġfor Ġrot ating Ġtext ĊĠĠĠ Ġprivate Ġval Ġlayouts Ġ= Ġmutable ListOf < Glyph Layout >() ĊĠĠĠ Ġprivate Ġval Ġtemp Glyph Count Ġ= ĠInt Array ( pages ) ĊĊĠĠĠ Ġprivate Ġval Ġlayout Pool Ġ= ĠPool ( reset Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġit . reset () ĊĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ ĠGlyph Layout () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġp ooled Layouts Ġ= Ġmutable ListOf < Glyph Layout >() ĊĊĠĠĠ Ġprivate Ġvar Ġlast X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlast Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġprotected Ġvar Ġx : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprotected Ġvar Ġy : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprotected Ġval Ġpage Vertices Ġ= ĠArray ( pages ) Ġ{ ĠFloat ArrayList () Ġ} ĊĠĠĠ Ġprotected Ġvar Ġcurrent Tint Ġ= ĠColor . WHITE . toFloat Bits () ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġthe Ġtext Ġusing Ġthe Ġspecified Ġbatch Ġand Ġlist Ġof Ġtextures . ĊĠĠĠĠ Ġ* ĠThe Ġ[ textures ] Ġlist Ġsize Ġmust Ġbe Ġ>= Ġ[ pages ] ĊĠĠĠĠ Ġ* Ġ@ param Ġbatch Ġthe Ġbatch Ġto Ġdraw Ġwith ĊĠĠĠĠ Ġ* Ġ@ param Ġtextures Ġthe Ġtextures Ġto Ġuse Ġfor Ġdrawing ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw ( batch : ĠBatch , Ġtextures : ĠList < Texture >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpage Vertices . forEach Indexed Ġ{ Ġindex , Ġvertices Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vertices . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch . draw ( textures [ index ], Ġvertices . data , Ġ 0 , Ġvertices . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġthe Ġposition Ġof Ġthe Ġtext Ġby Ġthe Ġspecified Ġamount . ĊĠĠĠĠ Ġ* Ġ@ param Ġtx Ġthe Ġamount Ġto Ġmove Ġthe Ġx Ġposition ĊĠĠĠĠ Ġ* Ġ@ param Ġty Ġthe Ġamount Ġto Ġmove Ġthe Ġy Ġposition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtranslate ( tx : ĠFloat , Ġty : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tx Ġ== Ġ 0 f Ġ&& Ġty Ġ== Ġ 0 f ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġx Ġ+= Ġtx ĊĠĠĠĠĠĠĠ Ġy Ġ+= Ġty ĊĊĠĠĠĠĠĠĠ Ġpage Vertices . forEach Ġ{ Ġvertices Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġvertices . indices Ġstep Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ i ] Ġ+= Ġtx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ i Ġ+ Ġ 1 ] Ġ+= Ġty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT ints Ġthe Ġexisting Ġtext Ġin Ġthe Ġcache . ĊĠĠĠĠ Ġ* Ġ@ param Ġt int Ġthe Ġt int Ġcolor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġt int ( tint : ĠColor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Tint Ġ= Ġt int . toFloat Bits () ĊĠĠĠĠĠĠĠ Ġif Ġ( new Tint Ġ== Ġcurrent Tint ) Ġreturn ĊĠĠĠĠĠĠĠ Ġcurrent Tint Ġ= Ġnew Tint ĊĠĠĠĠĠĠĠ Ġtemp Glyph Count . fill ( 0 ) ĊĠĠĠĠĠĠĠ Ġlayouts . forEach Ġ{ Ġlayout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolors Ġ= Ġlayout . colors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcolors Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Color Glyph Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġglyph Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Color Float Bits Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . runs . forEach Ġ{ Ġrun Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglyph s Ġ= Ġrun . glyph s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglyph s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( glyph Index ++ Ġ== Ġnext Color Glyph Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Color . set Ab gr 8 8 8 8 ( colors [++ colors Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Color Float Bits Ġ= Ġtemp Color . mul ( tint ). toFloat Bits () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Color Glyph Index Ġ= Ġif Ġ(++ colors Index Ġ< Ġcolors . size ) Ġcolors [ colors Index ] Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġtemp Glyph Count [ it . page ] Ġ* Ġ 2 0 Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Glyph Count [ it . page ] ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= Ġpage Vertices [ it . page ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ offset ] Ġ= Ġlast Color Float Bits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ offset Ġ+ Ġ 5 ] Ġ= Ġlast Color Float Bits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ offset Ġ+ Ġ 1 0 ] Ġ= Ġlast Color Float Bits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices [ offset Ġ+ Ġ 1 5 ] Ġ= Ġlast Color Float Bits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġposition Ġof Ġthe Ġtext . ĊĠĠĠĠ Ġ* Ġ@ param Ġpx Ġthe Ġx Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ param Ġpy Ġthe Ġy Ġcoordinate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Position ( px : ĠFloat , Ġpy : ĠFloat ) Ġ= Ġtranslate ( px Ġ- Ġx , Ġpy Ġ- Ġy ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear s Ġany Ġexisting Ġglyph s Ġof Ġprevious Ġtext Ġand Ġadds Ġthe Ġnew Ġglyph s Ġof Ġthe Ġspecified Ġstring Ġof Ġ[ text ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġfont Ġthe Ġfont Ġthat Ġcontains Ġthe Ġglyph s Ġto Ġuse ĊĠĠĠĠ Ġ* Ġ@ param Ġtext Ġthe Ġstring Ġof Ġtext Ġto Ġdraw ĊĠĠĠĠ Ġ* Ġ@ param Ġx Ġthe Ġx Ġposition Ġto Ġdraw Ġthe Ġtext ĊĠĠĠĠ Ġ* Ġ@ param Ġy Ġthe Ġy Ġposition Ġto Ġdraw Ġthe Ġtext ĊĠĠĠĠ Ġ* Ġ@ param Ġscale X Ġthe Ġscale Ġof Ġthe Ġx Ġcomponent Ġof Ġthe Ġglyph s ĊĠĠĠĠ Ġ* Ġ@ param Ġscale Y Ġthe Ġscale Ġof Ġthe Ġy Ġcomponent Ġof Ġthe Ġglyph s ĊĠĠĠĠ Ġ* Ġ@ param Ġrotation Ġthe Ġrotation Ġof Ġthe Ġtext Ġto Ġdraw ĊĠĠĠĠ Ġ* Ġ@ param Ġcolor Ġthe Ġcolor Ġof Ġthe Ġtext Ġto Ġdraw ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget Width Ġthe Ġwidth Ġof Ġthe Ġarea Ġthe Ġtext Ġwill Ġbe Ġdrawn , Ġfor Ġwrapping Ġor Ġtrunc ation ĊĠĠĠĠ Ġ* Ġ@ param Ġalign Ġthe Ġhorizontal Ġalignment Ġof Ġthe Ġtext , Ġsee Ġ[ H Align ] ĊĠĠĠĠ Ġ* Ġ@ param Ġwrap Ġif Ġtrue , Ġthe Ġtext Ġwill Ġbe Ġwrapped Ġwithin Ġthe Ġ[ target Width ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Text ( ĊĠĠĠĠĠĠĠ Ġfont : ĠFont , ĊĠĠĠĠĠĠĠ Ġtext : ĠCharSequence , ĊĠĠĠĠĠĠĠ Ġx : ĠFloat , ĊĠĠĠĠĠĠĠ Ġy : ĠFloat , ĊĠĠĠĠĠĠĠ Ġscale X : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġscale Y : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġrotation : ĠAngle Ġ= ĠAngle . ZERO , ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor Ġ= ĠColor . WHITE , ĊĠĠĠĠĠĠĠ Ġtarget Width : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġalign : ĠH Align Ġ= ĠH Align . LEFT , ĊĠĠĠĠĠĠĠ Ġwrap : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġtruncate : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġadd Text ( font , Ġtext , Ġx , Ġy , Ġscale X , Ġscale Y , Ġrotation , Ġcolor , Ġtarget Width , Ġalign , Ġwrap , Ġtruncate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear s Ġany Ġexisting Ġglyph s Ġof Ġprevious Ġtext Ġand Ġuses Ġ[ layout ] Ġto Ġcompile Ġthe Ġglyph s Ġto Ġcache . ĊĠĠĠĠ Ġ* Ġ@ param Ġlayout Ġthe Ġglyph Ġlayout Ġto Ġcache ĊĠĠĠĠ Ġ* Ġ@ param Ġx Ġthe Ġx Ġposition Ġto Ġdraw Ġthe Ġtext ĊĠĠĠĠ Ġ* Ġ@ param Ġy Ġthe Ġy Ġposition Ġto Ġdraw Ġthe Ġtext ĊĠĠĠĠ Ġ* Ġ@ param Ġscale X Ġthe Ġscale Ġof Ġthe Ġx Ġcomponent Ġof Ġthe Ġglyph s ĊĠĠĠĠ Ġ* Ġ@ param Ġscale Y Ġthe Ġscale Ġof Ġthe Ġy Ġcomponent Ġof Ġthe Ġglyph s ĊĠĠĠĠ Ġ* Ġ@ param Ġrotation Ġthe Ġrotation Ġof Ġthe Ġtext Ġto Ġdraw ĊĠĠĠĠ Ġ* Ġ@ param Ġcolor Ġthe Ġcolor Ġof Ġthe Ġtext Ġto Ġdraw ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Text ( ĊĠĠĠĠĠĠĠ Ġlayout : ĠGlyph Layout , ĊĠĠĠĠĠĠĠ Ġx : ĠFloat , ĊĠĠĠĠĠĠĠ Ġy : ĠFloat , ĊĠĠĠĠĠĠĠ Ġscale X : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġscale Y : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġrotation : ĠAngle Ġ= ĠAngle . ZERO , ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor Ġ= ĠColor . WHITE , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ ĠaddTo Cache ( layout , Ġx , Ġy , Ġscale X , Ġscale Y , Ġrotation , Ġcolor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġnew Ġglyph s Ġof Ġthe Ġspecified Ġstring Ġof Ġ[ text ] Ġon Ġtop Ġof Ġany Ġexisting Ġglyph s . ĊĠĠĠĠ Ġ* Ġ@ param Ġfont Ġthe Ġfont Ġthat Ġcontains Ġthe Ġglyph s Ġto Ġuse ĊĠĠĠĠ Ġ* Ġ@ param Ġtext Ġthe Ġstring Ġof Ġtext Ġto Ġdraw ĊĠĠĠĠ Ġ* Ġ@ param Ġx Ġthe Ġx Ġposition Ġto Ġdraw Ġthe Ġtext ĊĠĠĠĠ Ġ* Ġ@ param Ġy Ġthe Ġy Ġposition Ġto Ġdraw Ġthe Ġtext ĊĠĠĠĠ Ġ* Ġ@ param Ġscale X Ġthe Ġscale Ġof Ġthe Ġx Ġcomponent Ġof Ġthe Ġglyph s ĊĠĠĠĠ Ġ* Ġ@ param Ġscale Y Ġthe Ġscale Ġof Ġthe Ġy Ġcomponent Ġof Ġthe Ġglyph s ĊĠĠĠĠ Ġ* Ġ@ param Ġrotation Ġthe Ġrotation Ġof Ġthe Ġtext Ġto Ġdraw ĊĠĠĠĠ Ġ* Ġ@ param Ġcolor Ġthe Ġcolor Ġof Ġthe Ġtext Ġto Ġdraw ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget Width Ġthe Ġwidth Ġof Ġthe Ġarea Ġthe Ġtext Ġwill Ġbe Ġdrawn , Ġfor Ġwrapping Ġor Ġtrunc ation ĊĠĠĠĠ Ġ* Ġ@ param Ġalign Ġthe Ġhorizontal Ġalignment Ġof Ġthe Ġtext , Ġsee Ġ[ H Align ] ĊĠĠĠĠ Ġ* Ġ@ param Ġwrap Ġif Ġtrue , Ġthe Ġtext Ġwill Ġbe Ġwrapped Ġwithin Ġthe Ġ[ target Width ] ĊĠĠĠĠ Ġ* Ġ@ param Ġtruncate Ġthe Ġstring Ġto Ġdisplay Ġwhen Ġthe Ġtext Ġis Ġtoo Ġlong Ġto Ġfit Ġwithin Ġ[ target Width ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Text ( ĊĠĠĠĠĠĠĠ Ġfont : ĠFont , ĊĠĠĠĠĠĠĠ Ġtext : ĠCharSequence , ĊĠĠĠĠĠĠĠ Ġx : ĠFloat , ĊĠĠĠĠĠĠĠ Ġy : ĠFloat , ĊĠĠĠĠĠĠĠ Ġscale X : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġscale Y : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġrotation : ĠAngle Ġ= ĠAngle . ZERO , ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor Ġ= ĠColor . WHITE , ĊĠĠĠĠĠĠĠ Ġtarget Width : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġalign : ĠH Align Ġ= ĠH Align . LEFT , ĊĠĠĠĠĠĠĠ Ġwrap : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġtruncate : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġlayout Pool . alloc () ĊĠĠĠĠĠĠĠ Ġp ooled Layouts Ġ+= Ġlayout ĊĠĠĠĠĠĠĠ Ġlayout . setText ( font , Ġtext , Ġcolor , Ġtarget Width , Ġscale X , Ġscale Y , Ġalign , Ġwrap , Ġtruncate ) ĊĠĠĠĠĠĠĠ ĠaddTo Cache ( layout , Ġx , Ġy , Ġscale X , Ġscale Y , Ġrotation , Ġcolor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear s Ġany Ġexisting Ġglyph s Ġfrom Ġthe Ġcache . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout Pool . free ( p ooled Layouts ) ĊĠĠĠĠĠĠĠ Ġp ooled Layouts . clear () ĊĠĠĠĠĠĠĠ Ġlayouts . clear () ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġpage Vertices . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠaddTo Cache ( ĊĠĠĠĠĠĠĠ Ġlayout : ĠGlyph Layout , Ġx : ĠFloat , Ġy : ĠFloat , Ġscale X : ĠFloat , Ġscale Y : ĠFloat , Ġrotation : ĠAngle , Ġcolor : ĠColor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlayouts Ġ+= Ġlayout ĊĠĠĠĠĠĠĠ Ġlayout . runs . forEach Ġ{ Ġrun Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtx Ġ= Ġx Ġ+ Ġrun . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġty Ġ= Ġy Ġ+ Ġrun . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast X Ġ= Ġtx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Y Ġ= Ġty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Ġ!= ĠAngle . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp 4 . set To Identity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp 4 . translate ( tx , Ġty , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp 4 . rotate ( 0 f , Ġ 0 f , Ġrotation . degrees ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun . glyph s . forEach Indexed Ġ{ Ġindex , Ġglyph Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Ġ+= Ġrun . adv ances [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Glyph ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglyph , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Ġ+ Ġglyph . left Ġ* Ġscale X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġty Ġ+ Ġglyph . top Ġ* Ġscale Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Glyph ( ĊĠĠĠĠĠĠĠ Ġglyph : ĠGlyph Metrics , ĊĠĠĠĠĠĠĠ Ġtx : ĠFloat , ĊĠĠĠĠĠĠĠ Ġty : ĠFloat , ĊĠĠĠĠĠĠĠ Ġscale X : ĠFloat , ĊĠĠĠĠĠĠĠ Ġscale Y : ĠFloat , ĊĠĠĠĠĠĠĠ Ġrotation : ĠAngle , ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rotation Ġ!= ĠAngle . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp 4 . translate ( tx Ġ- Ġlast X , Ġty Ġ- Ġlast Y , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlast X Ġ= Ġtx ĊĠĠĠĠĠĠĠ Ġlast Y Ġ= Ġty ĊĠĠĠĠĠĠĠ Ġval Ġmx Ġ= Ġ( if Ġ( rotation Ġ== ĠAngle . ZERO ) Ġtx Ġelse Ġtemp 4 [ 1 2 ]) ĊĠĠĠĠĠĠĠ Ġval Ġmy Ġ= Ġ( if Ġ( rotation Ġ== ĠAngle . ZERO ) Ġty Ġelse Ġtemp 4 [ 1 3 ]) ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 x Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġp 1 y Ġ= Ġglyph . height Ġ* Ġscale Y ĊĠĠĠĠĠĠĠ Ġval Ġp 2 x Ġ= Ġglyph . width Ġ* Ġscale X ĊĠĠĠĠĠĠĠ Ġval Ġp 2 y Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġvar Ġx 1 : ĠFloat Ġ= Ġp 1 x ĊĠĠĠĠĠĠĠ Ġvar Ġy 1 : ĠFloat Ġ= Ġp 1 y ĊĠĠĠĠĠĠĠ Ġvar Ġx 2 : ĠFloat Ġ= Ġp 2 x ĊĠĠĠĠĠĠĠ Ġvar Ġy 2 : ĠFloat Ġ= Ġp 1 y ĊĠĠĠĠĠĠĠ Ġvar Ġx 3 : ĠFloat Ġ= Ġp 2 x ĊĠĠĠĠĠĠĠ Ġvar Ġy 3 : ĠFloat Ġ= Ġp 2 y ĊĠĠĠĠĠĠĠ Ġvar Ġx 4 : ĠFloat Ġ= Ġp 1 x ĊĠĠĠĠĠĠĠ Ġvar Ġy 4 : ĠFloat Ġ= Ġp 2 y ĊĠĠĠĠĠĠĠ Ġif Ġ( rotation Ġ!= ĠAngle . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcos Ġ= Ġrotation . cos ine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsin Ġ= Ġrotation . s ine ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġx 1 Ġ= Ġcos Ġ* Ġp 1 x Ġ- Ġsin Ġ* Ġp 1 y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy 1 Ġ= Ġsin Ġ* Ġp 1 x Ġ+ Ġcos Ġ* Ġp 1 y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġx 2 Ġ= Ġcos Ġ* Ġp 2 x Ġ- Ġsin Ġ* Ġp 1 y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy 2 Ġ= Ġsin Ġ* Ġp 2 x Ġ+ Ġcos Ġ* Ġp 1 y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġx 3 Ġ= Ġcos Ġ* Ġp 2 x Ġ- Ġsin Ġ* Ġp 2 y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy 3 Ġ= Ġsin Ġ* Ġp 2 x Ġ+ Ġcos Ġ* Ġp 2 y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġx 4 Ġ= Ġx 1 Ġ+ Ġ( x 3 Ġ- Ġx 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy 4 Ġ= Ġy 3 Ġ- Ġ( y 2 Ġ- Ġy 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġx 1 Ġ+= Ġmx ĊĠĠĠĠĠĠĠ Ġy 1 Ġ+= Ġmy ĊĠĠĠĠĠĠĠ Ġx 2 Ġ+= Ġmx ĊĠĠĠĠĠĠĠ Ġy 2 Ġ+= Ġmy ĊĠĠĠĠĠĠĠ Ġx 3 Ġ+= Ġmx ĊĠĠĠĠĠĠĠ Ġy 3 Ġ+= Ġmy ĊĠĠĠĠĠĠĠ Ġx 4 Ġ+= Ġmx ĊĠĠĠĠĠĠĠ Ġy 4 Ġ+= Ġmy ĊĊĠĠĠĠĠĠĠ Ġval Ġcolor Bits Ġ= Ġcolor . toFloat Bits () ĊĠĠĠĠĠĠĠ Ġval Ġu Ġ= Ġglyph . u ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġglyph . v ĊĠĠĠĠĠĠĠ Ġval Ġu 2 Ġ= Ġglyph . u 2 ĊĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġglyph . v 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= Ġpage Vertices [ glyph . page ] ĊĊĠĠĠĠĠĠĠ Ġvertices . run Ġ{ Ġ// Ġbottom Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( x 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( y 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( color Bits ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( u ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvertices . run Ġ{ Ġ// Ġtop Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( x 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( y 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( color Bits ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( u ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( v 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvertices . run Ġ{ Ġ// Ġtop Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( x 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( y 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( color Bits ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( u 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( v 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvertices . run Ġ{ Ġ// Ġbottom Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( x 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( y 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( color Bits ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( u 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemp Color Ġ= ĠMutable Color () ĊĠĠĠ Ġ} Ċ }