package Ġimg ui ĊĊ Ċ import Ġglm _. * Ċ import Ġk ool . buffer Big Ċ import Ġk ool . free Ċ import Ġglm _. vec 2 . Vec 2 Ċ import Ġglm _. vec 2 . Vec 2 i Ċ import Ġglm _. vec 2 . operators . div Ċ import Ġglm _. vec 4 . Vec 4 Ċ import Ġimg ui . ImGui . io Ċ import Ġimg ui . ImGui . style Ċ import Ġimg ui . internal . file Load To CharArray Ċ import Ġimg ui . internal . isBlank A Ċ import Ġimg ui . internal . isBlank W Ċ import Ġimg ui . internal . upper Power Of Two Ċ import Ġimg ui . st b .* Ċ import Ġorg . lwjgl . st b .* Ċ import Ġorg . lwjgl . st b . ST B Rect Pack . st br p _ pack _ rect s Ċ import Ġorg . lwjgl . st b . ST B True type .* Ċ import Ġorg . lwjgl . system . Memory Util Ċ import Ġuno . convert . decode 8 5 Ċ import Ġuno . kotlin . buffers . isNotEmpty Ċ import Ġuno . st b . st b Ċ import Ġunsigned . to UL ong Ċ import Ġjava . nio . ByteBuffer Ċ import Ġkotlin . math . floor ĊĊ Ċ class ĠFont Config Ġ{ ĊĊĠĠĠ Ġ/** ĠT TF / OT F Ġdata ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġfont Data Ġ= Ġchar ArrayOf () ĊĠĠĠ Ġ/** ĠT TF / OT F Ġdata Ġsize ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġfont DataSize Ġ= Ġ 0 ĊĠĠĠ Ġlateinit Ġvar Ġfont Data Buffer : ĠByteBuffer ĊĠĠĠ Ġ/** ĠT TF / OT F Ġdata Ġownership Ġtaken Ġby Ġthe Ġcontainer ĠIm Font Atlas Ġ( will Ġdelete Ġmemory Ġitself ). Ġ Ġ*/ ĊĠĠĠ Ġvar Ġfont Data Owned By Atlas Ġ= Ġtrue ĊĠĠĠ Ġ/** ĠIndex Ġof Ġfont Ġwithin ĠT TF / OT F Ġfile ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġfont No Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĠSize Ġin Ġpixels Ġfor Ġraster izer Ġ( more Ġor Ġless Ġmaps Ġto Ġthe Ġresulting Ġfont Ġheight ). Ġ Ġ*/ ĊĠĠĠ Ġvar Ġsize Pixels Ġ= Ġ 0 f ĊĠĠĠ Ġ/** ĠR aster ize Ġat Ġhigher Ġquality Ġfor Ġsub - pixel Ġposition ing . ĠWe Ġdon 't Ġuse Ġsub - pixel Ġpositions Ġon Ġthe ĠY Ġaxis . Ġ Ġ*/ ĊĠĠĠ Ġvar Ġover sample Ġ= ĠVec 2 i ( 3 , Ġ 1 ) ĊĠĠĠ Ġ/** ĠAlign Ġevery Ġglyph Ġto Ġpixel Ġboundary . ĠUseful Ġe . g . Ġif Ġyou Ġare Ġmerging Ġa Ġnon - pixel Ġaligned Ġfont Ġwith Ġthe Ġdefault ĊĠĠĠĠ Ġ* Ġ Ġfont . ĠIf Ġenabled , Ġyou Ġcan Ġset ĠOver sample H / V Ġto Ġ 1 . ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġpixel Snap H Ġ= Ġfalse ĊĠĠĠ Ġ/** ĠExtra Ġspacing Ġ( in Ġpixels ) Ġbetween Ġglyph s . ĠOnly ĠX Ġaxis Ġis Ġsupported Ġfor Ġnow . ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġglyph Extra Spacing Ġ= ĠVec 2 () ĊĠĠĠ Ġ/** ĠOffset Ġall Ġglyph s Ġfrom Ġthis Ġfont Ġinput . Ġ*/ ĊĠĠĠ Ġvar Ġglyph Offset Ġ= ĠVec 2 () ĊĠĠĠ Ġ/** ĠPointer Ġto Ġa Ġuser - provided Ġlist Ġof ĠUnicode Ġrange Ġ( 2 Ġvalue Ġper Ġrange , Ġvalues Ġare Ġinclusive , Ġzero - terminated ĊĠĠĠĠ Ġ* Ġ Ġlist ). ĠTHE ĠARRAY ĠDATA ĠNE ED S ĠTO ĠPER SIST ĠAS ĠLONG ĠAS ĠTHE ĠF ONT ĠIS ĠA LI VE . ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġglyph Ranges Ġ= Ġint ArrayOf () ĊĠĠĠ Ġ/** ĠMinimum ĠAdv ance X Ġfor Ġglyph s , Ġset ĠMin Ġto Ġalign Ġfont Ġicons , Ġset Ġboth ĠMin / Max Ġto Ġenforce Ġmono - space Ġfont Ġ*/ ĊĠĠĠ Ġvar Ġglyph Min Advance X Ġ= Ġ 0 f ĊĠĠĠ Ġ/** ĠMaximum ĠAdv ance X Ġfor Ġglyph s Ġ*/ ĊĠĠĠ Ġvar Ġglyph Max Advance X Ġ= ĠFloat . MAX _ VALUE ĊĠĠĠ Ġ/** ĠMerge Ġinto Ġprevious ĠIm Font , Ġso Ġyou Ġcan Ġcombine Ġmultiple Ġinputs Ġfont Ġinto Ġone ĠIm Font Ġ( e . g . ĠASCII Ġfont Ġ+ Ġicons Ġ+ ĊĠĠĠĠ Ġ* Ġ ĠJapanese Ġglyph s ). ĠYou Ġmay Ġwant Ġto Ġuse ĠGlyph Offset . y Ġwhen Ġmerge Ġfont Ġof Ġdifferent Ġheight s . ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġmerge Mode Ġ= Ġfalse ĊĠĠĠ Ġ/** ĠSettings Ġfor Ġcustom Ġfont Ġraster izer Ġ( e . g . ĠImGui Free Type ). ĠLeave Ġas Ġzero Ġif Ġyou Ġaren 't Ġusing Ġone . ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġraster izer Flags Ġ= Ġ 0 x 0 0 ĊĠĠĠ Ġ/** ĠB right en Ġ(> 1 . 0 f ) Ġor Ġdar ken Ġ(< 1 . 0 f ) Ġfont Ġoutput . ĠB right ening Ġsmall Ġfonts Ġmay Ġbe Ġa Ġgood Ġworkaround Ġto Ġmake Ġthem ĊĠĠĠĠ Ġ* Ġ Ġmore Ġreadable . Ġ Ġ*/ ĊĠĠĠ Ġvar Ġraster izer Multiply Ġ= Ġ 1 f ĊĊĠĠĠ Ġ// Ġ[ Internal ] ĊĠĠĠ Ġ/** ĠName Ġ( strict ly Ġto Ġease Ġdebugging ) ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġname Ġ= Ġ"" ĊĊĠĠĠ Ġvar Ġdst Font : ĠFont ? Ġ= Ġnull Ċ } Ċ Ċ class ĠFont Glyph Ġ{ ĊĠĠĠ Ġ/** Ġ 0 x 0 0 0 0 .. 0 xFFFF Ġ Ġ*/ ĊĠĠĠ Ġvar Ġcode point Ġ= ĠN UL ĊĠĠĠ Ġ/** ĠDistance Ġto Ġnext Ġcharacter Ġ(= Ġdata Ġfrom Ġfont Ġ+ ĠFont Config . glyph Extra Spacing . x Ġb aked Ġin ) Ġ Ġ*/ ĊĠĠĠ Ġvar Ġadvance X Ġ= Ġ 0 f ĊĠĠĠ Ġ// ĠGlyph Ġcorners ĊĠĠĠ Ġvar Ġx 0 Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġy 0 Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġx 1 Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġy 1 Ġ= Ġ 0 f ĊĠĠĠ Ġ// ĠTexture Ġcoordinates ĊĠĠĠ Ġvar Ġu 0 Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġv 0 Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġu 1 Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġv 1 Ġ= Ġ 0 f ĊĊĠĠĠ Ġin fix Ġfun Ġput ( other : ĠFont Glyph ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcode point Ġ= Ġother . code point ĊĠĠĠĠĠĠĠ Ġadvance X Ġ= Ġother . advance X ĊĠĠĠĠĠĠĠ Ġx 0 Ġ= Ġother . x 0 ĊĠĠĠĠĠĠĠ Ġy 0 Ġ= Ġother . y 0 ĊĠĠĠĠĠĠĠ Ġx 1 Ġ= Ġother . x 1 ĊĠĠĠĠĠĠĠ Ġy 1 Ġ= Ġother . y 1 ĊĠĠĠĠĠĠĠ Ġu 0 Ġ= Ġother . u 0 ĊĠĠĠĠĠĠĠ Ġv 0 Ġ= Ġother . v 0 ĊĠĠĠĠĠĠĠ Ġu 1 Ġ= Ġother . u 1 ĊĠĠĠĠĠĠĠ Ġv 1 Ġ= Ġother . v 1 ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠLoad Ġand Ġraster ize Ġmultiple ĠT TF / OT F Ġfonts Ġinto Ġa Ġsame Ġtexture . Ċ Ġ* Ġ ĠSh aring Ġa Ġtexture Ġfor Ġmultiple Ġfonts Ġallows Ġus Ġto Ġreduce Ġthe Ġnumber Ġof Ġdraw Ġcalls Ġduring Ġrendering . Ċ Ġ* Ġ ĠWe Ġalso Ġadd Ġcustom Ġgraphic Ġdata Ġinto Ġthe Ġtexture Ġthat Ġserves Ġfor ĠImGui . Ċ Ġ* ĠĠ 1 . Ġ( Optional ) ĠCall ĠAdd Font *** Ġfunctions . ĠIf Ġyou Ġdon 't Ġcall Ġany , Ġthe Ġdefault Ġfont Ġwill Ġbe Ġloaded Ġfor Ġyou . Ċ Ġ* ĠĠ 2 . ĠCall ĠGet Tex Data As Alpha 8 () Ġor ĠGet Tex Data As RGBA 3 2 () Ġto Ġbuild Ġand Ġretrieve Ġpixels Ġdata . Ċ Ġ* ĠĠ 3 . ĠUpload Ġthe Ġpixels Ġdata Ġinto Ġa Ġtexture Ġwithin Ġyour Ġgraphics Ġsystem . Ċ Ġ* ĠĠ 4 . ĠCall ĠSet Tex ID ( my _ tex _ id ); Ġand Ġpass Ġthe Ġpointer / identifier Ġto Ġyour Ġtexture . ĠThis Ġvalue Ġwill Ġbe Ġpassed Ġback Ġto Ġyou Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġduring Ġrendering Ġto Ġidentify Ġthe Ġtexture . Ċ Ġ* Ġ ĠIMPORT ANT : ĠIf Ġyou Ġpass Ġa Ġ' glyph _ ranges ' Ġarray Ġto ĠAdd Font *** Ġfunctions , Ġyou Ġneed Ġto Ġmake Ġsure Ġthat Ġyour Ġarray Ġpersist Ċ Ġ* Ġ Ġup Ġuntil Ġthe ĠIm Font Ġis Ġbuild Ġ( when Ġcalling ĠGet Tex Data *** Ġor ĠBuild ()). ĠWe Ġonly Ġcopy Ġthe Ġpointer , Ġnot Ġthe Ġdata . Ċ Ġ* Ġ ĠWe Ġonly Ġcopy Ġthe Ġpointer , Ġnot Ġthe Ġdata . Ġ*/ Ċ class ĠFont Atlas Ġ{ ĊĊĠĠĠ Ġfun Ġadd Font ( font Cfg : ĠFont Config ): ĠFont Ġ{ ĊĊĠĠĠĠĠĠĠ Ġassert (! locked ) Ġ{ Ġ" Cannot Ġmodify Ġa Ġlocked ĠFont Atlas Ġbetween ĠNew Frame () Ġand ĠEnd Frame / Render () !" Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( font Cfg . font Data . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġassert ( font Cfg . size Pixels Ġ> Ġ 0 f ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġnew Ġfont ĊĠĠĠĠĠĠĠ Ġif Ġ(! font Cfg . merge Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfonts Ġ+= ĠFont () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( fonts . isNotEmpty ()) Ġ{ Ġ" ĠWhen Ġusing ĠMerge Mode Ġmake Ġsure Ġthat Ġa Ġfont Ġhas Ġalready Ġbeen Ġadded Ġbefore . ĠYou Ġcan Ġuse Ġio . fonts . add Font Default Ġto Ġadd Ġthe Ġdefault Ġimg ui Ġfont . Ġ" Ġ} ĊĠĠĠĠĠĠĠ Ġconfig Data . add ( font Cfg ) ĊĠĠĠĠĠĠĠ Ġif Ġ( font Cfg . dst Font Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfont Cfg . dst Font Ġ= Ġfonts . last () ĊĠĠĠĠĠĠĠ Ġif Ġ(! font Cfg . font Data Owned By Atlas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfont Cfg . font Data Owned By Atlas Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġmemcpy ( new _ font _ cfg . Font Data , Ġfont _ cfg -> Font Data , Ġ( size _ t ) new _ font _ cfg . Font DataSize ) ĠTODO Ġcheck , Ġsame Ġobject ? ĊĊĠĠĠĠĠĠĠ Ġ// ĠIn validate Ġtexture ĊĠĠĠĠĠĠĠ Ġclear Tex Data () ĊĠĠĠĠĠĠĠ Ġreturn Ġfont Cfg . dst Font !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠLoad Ġembedded ĠPro g gy Clean . ttf Ġat Ġsize Ġ 1 3 , Ġdisable Ġover sampling Ġ Ġ*/ ĊĠĠĠ Ġfun Ġadd Font Default (): ĠFont Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfont Cfg Ġ= ĠFont Config () ĊĠĠĠĠĠĠĠ Ġfont Cfg . over sample Ġput Ġ 1 ĊĠĠĠĠĠĠĠ Ġfont Cfg . pixel Snap H Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Font Default ( font Cfg ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Font Default ( font Cfg : ĠFont Config ): ĠFont Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( font Cfg . name . isEmpty ()) Ġfont Cfg . name Ġ= Ġ" Prog gy Clean . ttf , Ġ 1 3 px " ĊĠĠĠĠĠĠĠ Ġif Ġ( font Cfg . size Pixels Ġ<= Ġ 0 f ) Ġfont Cfg . size Pixels Ġ= Ġ 1 3 f ĊĊĠĠĠĠĠĠĠ Ġval Ġt tf Compressed Base 8 5 Ġ= Ġprog gy Clean T tf Compressed Data Base 8 5 ĊĠĠĠĠĠĠĠ Ġval Ġglyph Ranges Ġ= Ġfont Cfg . glyph Ranges . take If Ġ{ Ġit . isNotEmpty () Ġ} Ġ?: Ġglyph Ranges . default ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Font From Memory Compressed Base 8 5 T TF ( ttf Compressed Base 8 5 , Ġfont Cfg . size Pixels , Ġfont Cfg , Ġglyph Ranges ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġdisplay Offset . y Ġ= Ġ 1 f Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Font FromFile T TF ( filename : ĠString , Ġsize Pixels : ĠFloat , Ġfont Cfg : ĠFont Config Ġ= ĠFont Config (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglyph Ranges : ĠInt Array Ġ= Ġint ArrayOf ()): ĠFont ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġassert (! locked ) Ġ{ Ġ" Cannot Ġmodify Ġa Ġlocked ĠFont Atlas Ġbetween ĠNew Frame () Ġand ĠEnd Frame / Render () !" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchars Ġ= Ġfile Load To CharArray ( filename ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( font Cfg . name . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġa Ġshort Ġcopy Ġof Ġfilename Ġinto Ġinto Ġthe Ġfont Ġname Ġfor Ġconvenience ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfont Cfg . name Ġ= Ġ"${ filename . substring After Last ('/') }, Ġ%. 0 f px ". format ( style . locale , Ġsize Pixels ) ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Font From Memory T TF ( chars , Ġsize Pixels , Ġfont Cfg , Ġglyph Ranges ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠNote : ĠTransfer Ġownership Ġof Ġ' ttf Data ' Ġto ĠFont Atlas ! ĠWill Ġbe Ġdeleted Ġafter Ġbuild (). ĠSet Ġfont Cfg . font Data Owned By Atlas ĊĠĠĠĠ Ġ* Ġ Ġto Ġfalse Ġto Ġkeep Ġownership . Ġ*/ ĊĠĠĠ Ġfun Ġadd Font From Memory T TF ( font Data : ĠChar Array , Ġsize Pixels : ĠFloat , Ġfont Cfg : ĠFont Config Ġ= ĠFont Config (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglyph Ranges : ĠInt Array Ġ= Ġint ArrayOf ()): ĠFont Ġ{ ĊĊĠĠĠĠĠĠĠ Ġassert (! locked ) Ġ{ Ġ" Cannot Ġmodify Ġa Ġlocked ĠFont Atlas Ġbetween ĠNew Frame () Ġand ĠEnd Frame / Render () !" Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( font Cfg . font Data . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġfont Cfg . font Data Ġ= Ġfont Data ĊĠĠĠĠĠĠĠ Ġfont Cfg . font Data Buffer Ġ= Ġbuffer Big ( font Data . size ). apply Ġ{ Ġfont Data . forEach Indexed Ġ{ Ġi , Ġc Ġ-> Ġthis [ i ] Ġ= Ġc . b Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġfont Cfg . size Pixels Ġ= Ġsize Pixels ĊĠĠĠĠĠĠĠ Ġif Ġ( glyph Ranges . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfont Cfg . glyph Ranges Ġ= Ġglyph Ranges ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Font ( font Cfg ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ param Ġcompressed Font Data Ġstill Ġowned Ġby Ġcaller . ĠCompress Ġwith Ġbinary _ to _ compressed _ c . cpp . ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Font From Memory Compressed T TF ( compressed Font Data : ĠChar Array , Ġsize Pixels : ĠFloat , Ġfont Cfg : ĠFont Config Ġ= ĠFont Config (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglyph Ranges : ĠInt Array Ġ= Ġint ArrayOf ()): ĠFont Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbuf De compressed Data Ġ= Ġst b . de compress ( compressed Font Data ) ĊĊĠĠĠĠĠĠĠ Ġassert ( font Cfg . font Data . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġfont Cfg . font Data Owned By Atlas Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Font From Memory T TF ( buf De compressed Data , Ġsize Pixels , Ġfont Cfg , Ġglyph Ranges ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ param Ġcompressed Font Data Base 8 5 Ġstill Ġowned Ġby Ġcaller . ĠCompress Ġwith Ġbinary _ to _ compressed _ c . cpp Ġwith Ġ- base 8 5 ĊĠĠĠĠ Ġ* Ġ Ġparam a eter Ġ Ġ*/ ĊĠĠĠ Ġfun Ġadd Font From Memory Compressed Base 8 5 T TF ( compressed Font Data Base 8 5 : ĠString , Ġsize Pixels : ĠFloat , Ġfont Cfg : ĠFont Config Ġ= ĠFont Config (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglyph Ranges : ĠInt Array Ġ= Ġint ArrayOf ()): ĠFont Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcompressed T tf Ġ= Ġdecode 8 5 ( compressed Font Data Base 8 5 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Font From Memory Compressed T TF ( compressed T tf , Ġsize Pixels , Ġfont Cfg , Ġglyph Ranges ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠClear Ġinput Ġdata Ġ( all ĠFont Config Ġstructures Ġincluding Ġsizes , ĠT TF Ġdata , Ġglyph Ġranges , Ġetc .) Ġ= Ġall Ġthe Ġdata Ġused ĊĠĠĠĠ Ġ* Ġ Ġto Ġbuild Ġthe Ġtexture Ġand Ġfonts . Ġ*/ ĊĠĠĠ Ġfun Ġclear InputData () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert (! locked ) Ġ{ Ġ" Cannot Ġmodify Ġa Ġlocked ĠFont Atlas Ġbetween ĠNew Frame () Ġand ĠEnd Frame / Render () !" Ġ} ĊĠĠĠĠĠĠĠ Ġconfig Data . filter Ġ{ Ġit . font Data . isNotEmpty () Ġ&& Ġit . font Data Owned By Atlas Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . font Data Ġ= Ġchar ArrayOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġclearing Ġthis Ġwe Ġlose Ġaccess Ġto Ġ Ġthe Ġfont Ġname Ġand Ġother Ġinformation Ġused Ġto Ġbuild Ġthe Ġfont . ĊĠĠĠĠĠĠĠ Ġfonts . filter Ġ{ Ġconfig Data . contains ( it . config Data [ 0 ]) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . config Data . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . config Data Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfig Data . clear () ĊĠĠĠĠĠĠĠ Ġcustom Rects . clear () ĊĠĠĠĠĠĠĠ Ġcustom Rect Ids . fill (- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠClear Ġoutput Ġtexture Ġdata Ġ( CPU Ġside ). ĠS aves ĠRAM Ġonce Ġthe Ġtexture Ġhas Ġbeen Ġcopied Ġto Ġgraphics Ġmemory . Ġ*/ ĊĠĠĠ Ġfun Ġclear Tex Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert (! locked ) Ġ{ Ġ" Cannot Ġmodify Ġa Ġlocked ĠFont Atlas Ġbetween ĠNew Frame () Ġand ĠEnd Frame / Render () !" Ġ} ĊĠĠĠĠĠĠĠ Ġtex Pixels Alpha 8 ?. free () ĊĠĠĠĠĠĠĠ Ġtex Pixels Alpha 8 Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtex Pixels RGBA 3 2 ?. free () ĊĠĠĠĠĠĠĠ Ġtex Pixels RGBA 3 2 Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠClear Ġoutput Ġfont Ġdata Ġ( glyph s Ġstorage , ĠUV Ġcoordinates ). ĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Fonts () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert (! locked ) Ġ{ Ġ" Cannot Ġmodify Ġa Ġlocked ĠFont Atlas Ġbetween ĠNew Frame () Ġand ĠEnd Frame / Render () !" Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( font Ġin Ġfonts ) Ġfont . clear Output Data () ĊĠĠĠĠĠĠĠ Ġfonts . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠClear Ġall Ġinput Ġand Ġoutput . Ġ~ Ġdestroy Ġ Ġ*/ ĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert (! locked ) Ġ{ Ġ" Cannot Ġmodify Ġa Ġlocked ĠFont Atlas Ġbetween ĠNew Frame () Ġand ĠEnd Frame / Render () !" Ġ} ĊĠĠĠĠĠĠĠ Ġclear InputData () ĊĠĠĠĠĠĠĠ Ġclear Tex Data () ĊĠĠĠĠĠĠĠ Ġclear Fonts () ĊĠĠĠĠĠĠĠ Ġst b Clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ ĠBuild Ġatlas , Ġretrieve Ġpixel Ġdata . ĊĠĠĠĠĠĠĠ ĠUser Ġis Ġin Ġcharge Ġof Ġcopying Ġthe Ġpixels Ġinto Ġgraphics Ġmemory Ġ( e . g . Ġcreate Ġa Ġtexture Ġwith Ġyour Ġengine ). ĊĠĠĠĠĠĠĠ ĠThen Ġstore Ġyour Ġtexture Ġhandle Ġwith Ġset Tex ID (). Clear InputData ĊĠĠĠĠĠĠĠ ĠRGBA 3 2 Ġformat Ġis Ġprovided Ġfor Ġconvenience Ġand Ġcompatibility , Ġbut Ġnote Ġthat Ġunless Ġyou Ġuse ĠCustom Rect Ġto Ġdraw ĊĠĠĠĠĠĠĠ Ġcolor Ġdata , Ġthe ĠRGB Ġpixels Ġemitted Ġfrom ĠFonts Ġwill Ġall Ġbe Ġwhite Ġ(~ 7 5 % Ġof Ġwaste ). ĊĠĠĠĠĠĠĠ ĠP itch Ġ= ĠWidth Ġ* ĠBytes Per Pixels Ġ Ġ*/ ĊĊĠĠĠ Ġ/** ĠBuild Ġpixels Ġdata . ĠThis Ġis Ġautomatically Ġfor Ġyou Ġby Ġthe ĠGet Tex Data *** Ġfunctions . ĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert (! locked ) Ġ{ Ġ" Cannot Ġmodify Ġa Ġlocked ĠFont Atlas Ġbetween ĠNew Frame () Ġand ĠEnd Frame / Render () !" Ġ} ĊĠĠĠĠĠĠĠ Ġbuild With St b True Type () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Built : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfonts . size Ġ> Ġ 0 Ġ&& Ġ( tex Pixels Alpha 8 Ġ!= Ġnull Ġ|| Ġtex Pixels RGBA 3 2 Ġ!= Ġnull ) ĊĊĠĠĠ Ġ/** Ġ 1 Ġbyte Ġper - pixel ĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Tex Data As Alpha 8 (): ĠTrip le < ByteBuffer , ĠVec 2 i , ĠInt > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġatlas Ġon Ġdemand ĊĠĠĠĠĠĠĠ Ġif Ġ( tex Pixels Alpha 8 Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Data . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Font Default () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( tex Pixels Alpha 8 !! , Ġtex Size , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ 4 Ġbytes - per - pixel ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Tex Data As RGBA 3 2 (): ĠTrip le < ByteBuffer , ĠVec 2 i , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠConvert Ġto ĠRGBA 3 2 Ġformat Ġon Ġdemand ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlthough Ġit Ġis Ġlikely Ġto Ġbe Ġthe Ġmost Ġcommonly Ġused Ġformat , Ġour Ġfont Ġrendering Ġis Ġ 1 Ġchannel Ġ/ Ġ 8 Ġb pp ĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( tex Pixels RGBA 3 2 Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( pixels , Ġ_, Ġ_) Ġ= Ġget Tex Data As Alpha 8 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixels . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtex Pixels RGBA 3 2 Ġ= Ġbuffer Big ( tex Size . x Ġ* Ġtex Size . y Ġ* Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= Ġtex Pixels RGBA 3 2 !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġpixels . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst [ n Ġ* Ġ 4 ] Ġ= Ġ 2 5 5 . b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst [ n Ġ* Ġ 4 Ġ+ Ġ 1 ] Ġ= Ġ 2 5 5 . b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst [ n Ġ* Ġ 4 Ġ+ Ġ 2 ] Ġ= Ġ 2 5 5 . b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst [ n Ġ* Ġ 4 Ġ+ Ġ 3 ] Ġ= Ġpixels [ n ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( tex Pixels RGBA 3 2 !! , Ġtex Size , Ġ 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠHelpers Ġto Ġbuild Ġglyph Ġranges Ġfrom Ġtext Ġdata . ĠFeed Ġyour Ġapplication Ġstrings / characters Ġto Ġit Ġthen Ġcall ĠBuild Ranges (). Ċ // ĠĠĠ Ġstruct ĠGlyph Ranges Builder Ċ // ĠĠĠ Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIm Vector < unsigned Ġchar > ĠUsed Chars ; Ġ Ġ// ĠStore Ġ 1 - bit Ġper ĠUnicode Ġcode Ġpoint Ġ( 0 = unused , Ġ 1 = used ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠGlyph Ranges Builder () ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠUsed Chars . resize ( 0 x 1 0 0 0 0 Ġ/ Ġ 8 ); Ġmemset ( Used Chars . Data , Ġ 0 , Ġ 0 x 1 0 0 0 0 Ġ/ Ġ 8 ); Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġbool ĠĠĠĠĠĠĠĠĠĠ ĠGet Bit ( int Ġn ) ĠĠĠĠĠĠĠ Ġ{ Ġreturn Ġ( Used Chars [ n Ġ>> Ġ 3 ] Ġ& Ġ( 1 Ġ<< Ġ( n Ġ& Ġ 7 ))) Ġ!= Ġ 0 ; Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvoid ĠĠĠĠĠĠĠĠĠĠ ĠSet Bit ( int Ġn ) ĠĠĠĠĠĠĠ Ġ{ ĠUsed Chars [ n Ġ>> Ġ 3 ] Ġ|= Ġ 1 Ġ<< Ġ( n Ġ& Ġ 7 ); Ġ} Ġ Ġ// ĠSet Ġbit Ġ' c ' Ġin Ġthe Ġarray Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvoid ĠĠĠĠĠĠĠĠĠĠ ĠAdd Char ( Im W char Ġc ) ĠĠ Ġ{ ĠSet Bit ( c ); Ġ} ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġcharacter Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIM GUI _ API Ġvoid ĠAdd Text ( const Ġchar * Ġtext , Ġconst Ġchar * Ġtext _ end Ġ= ĠNULL ); ĠĠĠĠĠ Ġ// ĠAdd Ġstring Ġ( each Ġcharacter Ġof Ġthe ĠUTF - 8 Ġstring Ġare Ġadded ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIM GUI _ API Ġvoid ĠAdd Ranges ( const ĠIm W char * Ġranges ); ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġranges , Ġe . g . Ġbuilder . Add Ranges ( Im Font Atlas :: Get Glyph Ranges Default ()) Ġto Ġforce Ġadd Ġall Ġof ĠASCII / Latin + Ext Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIM GUI _ API Ġvoid ĠBuild Ranges ( Im Vector < Im W char >* Ġout _ ranges ); ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOutput Ġnew Ġranges Ċ // ĠĠĠĠĠĠĠ Ġ}; Ċ // ĠĠĠ Ġ// ----------------------------------------------------------------------------- Ċ // ĠĠĠ Ġ+ // ĠIm Font Atlas :: Glyph Ranges Builder Ċ // ĠĠĠ Ġ+ //----------------------------------------------------------------------------- Ċ // ĠĠĠ Ġ+ Ċ // ĠĠĠ Ġ+ void ĠIm Font Atlas :: Glyph Ranges Builder :: Add Text ( const Ġchar * Ġtext , Ġconst Ġchar * Ġtext _ end ) Ċ // ĠĠĠ Ġ+ { Ċ // ĠĠĠĠĠĠĠ Ġwhile Ġ( text _ end Ġ? Ġ( text Ġ< Ġtext _ end ) Ġ: Ġ* text ) Ċ // ĠĠĠĠĠĠĠ Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsigned Ġint Ġc Ġ= Ġ 0 ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġc _ len Ġ= ĠIm Text Char From Utf 8 (& c , Ġtext , Ġtext _ end ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ+= Ġc _ len ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c _ len Ġ== Ġ 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ< Ġ 0 x 1 0 0 0 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAdd Char (( Im W char ) c ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ+ } Ċ // ĠĠĠ Ġ+ Ċ // ĠĠĠ Ġ+ void ĠIm Font Atlas :: Glyph Ranges Builder :: Add Ranges ( const ĠIm W char * Ġranges ) Ċ // ĠĠĠ Ġ+ { Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ(; Ġranges [ 0 ]; Ġranges Ġ+= Ġ 2 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( Im W char Ġc Ġ= Ġranges [ 0 ]; Ġc Ġ<= Ġranges [ 1 ]; Ġc ++) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAdd Char ( c ); Ċ // ĠĠĠĠĠĠĠ Ġ+ } Ċ // ĠĠĠ Ġ+ Ċ // ĠĠĠ Ġ+ void ĠIm Font Atlas :: Glyph Ranges Builder :: Build Ranges ( Im Vector < Im W char >* Ġout _ ranges ) Ċ // ĠĠĠ Ġ+ { Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( int Ġn Ġ= Ġ 0 ; Ġn Ġ< Ġ 0 x 1 0 0 0 0 ; Ġn ++) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Get Bit ( n )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout _ ranges -> push _ back (( Im W char ) n ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( n Ġ< Ġ 0 x 1 0 0 0 0 Ġ&& ĠGet Bit ( n Ġ+ Ġ 1 )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ++; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout _ ranges -> push _ back (( Im W char ) n ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġout _ ranges -> push _ back ( 0 ); Ċ // ĠĠĠĠĠĠĠ Ġ+ } ĊĊĊĠĠĠ Ġ// -------------------------------- ----------- ĊĠĠĠ Ġ// ĠCustom ĠRect angles / Glyph s ĠAPI ĊĠĠĠ Ġ// -------------------------------- ----------- ĊĊĠĠĠ Ġ/** ĠYou Ġcan Ġrequest Ġarbitrary Ġrect angles Ġto Ġbe Ġpacked Ġinto Ġthe Ġatlas , Ġfor Ġyour Ġown Ġpurposes . ĠAfter Ġcalling Ġbuild (), ĊĠĠĠĠ Ġ* Ġ Ġyou Ġcan Ġquery Ġthe Ġrectangle Ġposition Ġand Ġrender Ġyour Ġpixels . ĊĠĠĠĠ Ġ* Ġ ĠYou Ġcan Ġalso Ġrequest Ġyour Ġrect angles Ġto Ġbe Ġmapped Ġas Ġfont Ġglyph Ġ( given Ġa Ġfont Ġ+ ĠUnicode Ġpoint ), ĊĠĠĠĠ Ġ* Ġ Ġso Ġyou Ġcan Ġrender Ġe . g . Ġcustom Ġcolor ful Ġicons Ġand Ġuse Ġthem Ġas Ġregular Ġglyph s . ĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠCustom Rect Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠInput , ĠUser ĠID . ĠUse Ġ< 0 x 1 0 0 0 0 Ġto Ġmap Ġinto Ġa Ġfont Ġglyph , Ġ>= 0 x 1 0 0 0 0 Ġfor Ġother / internal / custom Ġtexture Ġdata . ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġ 0 xFFFFFFFF . i ĊĠĠĠĠĠĠĠ Ġ/** ĠInput , ĠDes ired Ġrectangle Ġwidth Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġwidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ/** ĠInput , ĠDes ired Ġrectangle Ġheight Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ/** ĠOutput , ĠPacked Ġwidth Ġposition Ġin ĠAtlas Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 0 xFFFF ĊĠĠĠĠĠĠĠ Ġ/** ĠOutput , ĠPacked Ġheight Ġposition Ġin ĠAtlas Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġ 0 xFFFF ĊĠĠĠĠĠĠĠ Ġ/** ĠInput , ĠFor Ġcustom Ġfont Ġglyph s Ġonly Ġ( ID < 0 x 1 0 0 0 0 ): Ġglyph Ġx advance Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġglyph Advance X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ/** ĠInput , ĠFor Ġcustom Ġfont Ġglyph s Ġonly Ġ( ID < 0 x 1 0 0 0 0 ): Ġglyph Ġdisplay Ġoffset ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġglyph Offset Ġ= ĠVec 2 () ĊĠĠĠĠĠĠĠ Ġ/** ĠInput , ĠFor Ġcustom Ġfont Ġglyph s Ġonly Ġ( ID < 0 x 1 0 0 0 0 ): Ġtarget Ġfont ĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġfont : ĠFont ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġis Packed Ġget () Ġ= Ġx Ġ!= Ġ 0 xFFFF ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠId Ġneeds Ġto Ġbe Ġ>= Ġ 0 x 1 0 0 0 0 . ĠId Ġ>= Ġ 0 x 8 0 0 0 0 0 0 0 Ġare Ġreserved Ġfor ĠImGui Ġand ĠDraw List ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Custom Rect Regular ( id : ĠInt , Ġwidth : ĠInt , Ġheight : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( id . to UL ong () Ġ>= Ġ 0 x 1 0 0 0 0 Ġ&& Ġwidth Ġin Ġ 0 .. 0 xFFFF Ġ&& Ġheight Ġin Ġ 0 .. 0 xFFFF ) ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠCustom Rect () ĊĠĠĠĠĠĠĠ Ġr . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġr . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġr . height Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġcustom Rects . add ( r ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcustom Rects . last Index ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠId Ġneeds Ġto Ġbe Ġ< Ġ 0 x 1 0 0 0 0 Ġto Ġregister Ġa Ġrectangle Ġto Ġmap Ġinto Ġa Ġspecific Ġfont . ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Custom Rect Font Glyph ( font : ĠFont , Ġid : ĠInt , Ġwidth : ĠInt , Ġheight : ĠInt , Ġadvance X : ĠFloat , Ġoffset : ĠVec 2 Ġ= ĠVec 2 ()): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( width Ġin Ġ 1 .. 0 xFFFF Ġ&& Ġheight Ġin Ġ 1 .. 0 xFFFF ) ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠCustom Rect () ĊĠĠĠĠĠĠĠ Ġr . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġr . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġr . height Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġr . glyph Advance X Ġ= Ġadvance X ĊĠĠĠĠĠĠĠ Ġr . glyph Offset Ġ= Ġoffset ĊĠĠĠĠĠĠĠ Ġr . font Ġ= Ġfont ĊĠĠĠĠĠĠĠ Ġcustom Rects . add ( r ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcustom Rects . last Index Ġ// ĠReturn Ġindex ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Custom Rect ByIndex ( index : ĠInt ) Ġ= Ġcustom Rects . get OrNull ( index ) ĊĊĠĠĠ Ġ// ĠInternal s ĊĊĠĠĠ Ġfun Ġcalc Custom Rect UV ( rect : ĠCustom Rect , Ġout Uv Min : ĠVec 2 , Ġout Uv Max : ĠVec 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( tex Size Ġall GreaterThan Ġ 0 ) Ġ{ Ġ" Font Ġatlas Ġneeds Ġto Ġbe Ġbuilt Ġbefore Ġwe Ġcan Ġcalculate ĠUV Ġcoordinates " Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( rect . is Packed ) Ġ{ Ġ" Make Ġsure Ġthe Ġrectangle Ġhas Ġbeen Ġpacked " Ġ} ĊĠĠĠĠĠĠĠ Ġout Uv Min . put ( rect . x . f Ġ* Ġtex Uv Scale . x , Ġrect . y . f Ġ* Ġtex Uv Scale . y ) ĊĠĠĠĠĠĠĠ Ġout Uv Max . put (( rect . x Ġ+ Ġrect . width ). f Ġ* Ġtex Uv Scale . x , Ġ( rect . y Ġ+ Ġrect . height ). f Ġ* Ġtex Uv Scale . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mouse Cursor Tex Data ( cursor : ĠMouse Cursor , Ġout Offset : ĠVec 2 , Ġout Size : ĠVec 2 , Ġout Uv : ĠArray < Vec 2 >): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== ĠMouse Cursor . None ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( flags Ġhas ĠFont Atlas Flag . No Mouse Cur s ors ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġassert ( custom Rect Ids [ 0 ] Ġ!= Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġcustom Rects [ custom Rect Ids [ 0 ]] ĊĠĠĠĠĠĠĠ Ġassert ( r . id Ġ== ĠDefault Tex Data . id ) ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠDefault Tex Data . cursor Datas [ cursor . i ][ 0 ] Ġ+ ĠVec 2 ( r . x , Ġr . y ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠDefault Tex Data . cursor Datas [ cursor . i ][ 1 ] ĊĠĠĠĠĠĠĠ Ġout Size Ġput Ġsize ĊĠĠĠĠĠĠĠ Ġout Offset Ġput ĠDefault Tex Data . cursor Datas [ cursor . i ][ 2 ] ĊĠĠĠĠĠĠĠ Ġ// ĠJVM Ġborder ĊĠĠĠĠĠĠĠ Ġout Uv [ 0 ] Ġ= Ġpos Ġ* Ġtex Uv Scale ĊĠĠĠĠĠĠĠ Ġout Uv [ 1 ] Ġ= Ġ( pos Ġ+ Ġsize ) Ġ* Ġtex Uv Scale ĊĠĠĠĠĠĠĠ Ġpos . x Ġ+= ĠDefault Tex Data . w Half Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// ĠJVM Ġfill ĊĠĠĠĠĠĠĠ Ġout Uv [ 2 ] Ġ= Ġpos Ġ* Ġtex Uv Scale ĊĠĠĠĠĠĠĠ Ġout Uv [ 3 ] Ġ= Ġ( pos Ġ+ Ġsize ) Ġ* Ġtex Uv Scale ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------- ----------- ĊĠĠĠ Ġ// ĠMembers ĊĠĠĠ Ġ// -------------------------------- ----------- ĊĠĠĠ Ġenum Ġclass ĠFont Atlas Flag Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠDon 't Ġround Ġthe Ġheight Ġto Ġnext Ġpower Ġof Ġtwo Ġ*/ ĊĠĠĠĠĠĠĠ ĠNo Power Of Two Height , ĊĠĠĠĠĠĠĠ Ġ/** ĠDon 't Ġbuild Ġsoftware Ġmouse Ġcurs ors Ġinto Ġthe Ġatlas ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠNo Mouse Cur s ors ; ĊĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġ 1 Ġshl Ġordinal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠInt . has ( flag : ĠFont Atlas Flag ) Ġ= Ġand ( flag . i ) Ġ!= Ġ 0 ĊĠĠĠ Ġin fix Ġfun ĠInt . has nt ( flag : ĠFont Atlas Flag ) Ġ= Ġand ( flag . i ) Ġ== Ġ 0 ĊĊĠĠĠ Ġ/** ĠMark ed Ġas ĠLocked Ġby ĠImGui :: New Frame () Ġso Ġattempt Ġto Ġmodify Ġthe Ġatlas Ġwill Ġassert . Ġ*/ ĊĠĠĠ Ġvar Ġlocked Ġ= Ġfalse ĊĠĠĠ Ġ/** ĠBuild Ġflags Ġ( see ĠIm Font Atlas Flags _) Ġ*/ ĊĠĠĠ Ġvar Ġflags : ĠFont Atlas Flags Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĠUser Ġdata Ġto Ġrefer Ġto Ġthe Ġtexture Ġonce Ġit Ġhas Ġbeen Ġuploaded Ġto Ġuser 's Ġgraphic Ġsystems . ĠIt Ġis Ġpassed Ġback Ġto Ġyou ĊĠĠĠ Ġduring Ġrendering Ġvia Ġthe ĠDraw Cmd Ġstructure . ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtex Id : ĠTexture ID Ġ= Ġ 0 ĊĠĠĠ Ġ/** Ġ 1 Ġcomponent Ġper Ġpixel , Ġeach Ġcomponent Ġis Ġunsigned Ġ 8 - bit . ĠTotal Ġsize Ġ= Ġtex Size . x Ġ* Ġtex Size . y Ġ Ġ*/ ĊĠĠĠ Ġvar Ġtex Pixels Alpha 8 : ĠByteBuffer ? Ġ= Ġnull ĊĠĠĠ Ġ/** Ġ 4 Ġcomponent Ġper Ġpixel , Ġeach Ġcomponent Ġis Ġunsigned Ġ 8 - bit . ĠTotal Ġsize Ġ= Ġtex Size . x Ġ* Ġtex Size . y Ġ* Ġ 4 Ġ Ġ*/ ĊĠĠĠ Ġvar Ġtex Pixels RGBA 3 2 : ĠByteBuffer ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĠTexture Ġsize Ġcalculated Ġduring ĠBuild (). Ġ*/ ĊĠĠĠ Ġvar Ġtex Size Ġ= ĠVec 2 i () ĊĠĠĠ Ġ/** ĠTexture Ġwidth Ġdesired Ġby Ġuser Ġbefore ĠBuild (). ĠMust Ġbe Ġa Ġpower - of - two . ĠIf Ġhave Ġmany Ġglyph s Ġyour Ġgraphics ĠAPI Ġhave ĊĠĠĠĠ Ġ* Ġ Ġtexture Ġsize Ġrestrictions Ġyou Ġmay Ġwant Ġto Ġincrease Ġtexture Ġwidth Ġto Ġdecrease Ġheight . ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtex Desired Width Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĠPadding Ġbetween Ġglyph s Ġwithin Ġtexture Ġin Ġpixels . ĠDefaults Ġto Ġ 1 . Ġ*/ ĊĠĠĠ Ġvar Ġtex Glyph Padding Ġ= Ġ 1 ĊĠĠĠ Ġ/** Ġ= Ġ( 1 . 0 f / Tex Width , Ġ 1 . 0 f / Tex Height ) ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtex Uv Scale Ġ= ĠVec 2 () ĊĠĠĠ Ġ/** ĠTexture Ġcoordinates Ġto Ġa Ġwhite Ġpixel ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtex Uv White Pixel Ġ= ĠVec 2 () ĊĠĠĠ Ġ/** ĠHold Ġall Ġthe Ġfonts Ġreturned Ġby ĠAdd Font *. ĠFonts [ 0 ] Ġis Ġthe Ġdefault Ġfont Ġupon Ġcalling ĠImGui :: New Frame (), Ġuse ĊĠĠĠĠ Ġ* Ġ ĠImGui :: Push Font ()/ Pop Font () Ġto Ġchange Ġthe Ġcurrent Ġfont . Ġ*/ ĊĠĠĠ Ġval Ġfonts Ġ= ĠArrayList < Font >() ĊĊĠĠĠ Ġ/** ĠRect angles Ġfor Ġpack ing Ġcustom Ġtexture Ġdata Ġinto Ġthe Ġatlas . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcustom Rects Ġ= ĠArrayList < Custom Rect >() ĊĠĠĠ Ġ/** ĠInternal Ġdata ĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġconfig Data Ġ= ĠArrayList < Font Config >() ĊĠĠĠ Ġ/** ĠIdent ifiers Ġof Ġcustom Ġtexture Ġrectangle Ġused Ġby ĠFont Atlas / Draw List Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcustom Rect Ids Ġ= Ġint ArrayOf (- 1 ) ĊĊĠĠĠ Ġprivate Ġfun Ġcustom Rect Calc UV ( rect : ĠCustom Rect , Ġout Uv Min : ĠVec 2 , Ġout Uv Max : ĠVec 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( tex Size . x Ġ> Ġ 0 Ġ&& Ġtex Size . y Ġ> Ġ 0 ) Ġ{ Ġ" Font Ġatlas Ġneeds Ġto Ġbe Ġbuilt Ġbefore Ġwe Ġcan Ġcalculate ĠUV Ġcoordinates " Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( rect . is Packed ) Ġ{ Ġ" Make Ġsure Ġthe Ġrectangle Ġhas Ġbeen Ġpacked Ġ" Ġ} ĊĠĠĠĠĠĠĠ Ġout Uv Min . put ( rect . x Ġ/ Ġtex Size . x , Ġrect . y Ġ/ Ġtex Size . y ) ĊĠĠĠĠĠĠĠ Ġout Uv Max . put (( rect . x Ġ+ Ġrect . width ) Ġ/ Ġtex Size . x , Ġ( rect . y Ġ+ Ġrect . height ) Ġ/ Ġtex Size . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠIm Font Atlas Ġinternals ĊĊĠĠĠ Ġfun Ġbuild With St b True Type (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġassert ( config Data . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġbuild Register Default Custom Rects () ĊĊĠĠĠĠĠĠĠ Ġtex Id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtex Size Ġput Ġ 0 ĊĠĠĠĠĠĠĠ Ġtex Uv Scale Ġput Ġ 0 f ĊĠĠĠĠĠĠĠ Ġtex Uv White Pixel Ġput Ġ 0 f ĊĠĠĠĠĠĠĠ Ġclear Tex Data () ĊĠĠĠĠĠĠĠ Ġval Ġin Range Ġ= ĠInt Array ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCount Ġglyph s / ranges ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Glyph s Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ranges Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( cfg Ġin Ġconfig Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cfg . glyph Ranges . isEmpty ()) Ġcfg . glyph Ranges Ġ= Ġglyph Ranges . default ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 0 ] Ġ= Ġcfg . glyph Ranges [ i ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 1 ] Ġ= Ġcfg . glyph Ranges [ i ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( in Range [ 0 ] Ġ!= Ġ 0 Ġ&& Ġin Range [ 1 ] Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Glyph s Count Ġ+= Ġ( in Range [ 1 ] Ġ- Ġin Range [ 0 ]) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 0 ] Ġ= Ġcfg . glyph Ranges . getOrElse ( i ++, Ġ{ Ġ 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 1 ] Ġ= Ġcfg . glyph Ranges . getOrElse ( i ++, Ġ{ Ġ 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ranges Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠWe Ġneed Ġa Ġwidth Ġfor Ġthe Ġsky line Ġalgorithm . ĠUsing Ġa Ġd umb Ġhe uristic Ġhere Ġto Ġdecide Ġof Ġwidth . ĠUser Ġcan Ġoverride ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtex Desired Width Ġand Ġtex Glyph Padding Ġif Ġthey Ġwish . ĠWidth Ġdoesn 't Ġreally Ġmatter Ġmuch , Ġbut Ġsome ĠAPI / GPU Ġhave ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtexture Ġsize Ġlimitations Ġand Ġincreasing Ġwidth Ġcan Ġdecrease Ġheight . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġtex Size . x Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtex Desired Width Ġ> Ġ 0 Ġ-> Ġtex Desired Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Glyph s Count Ġ> Ġ 4 0 0 0 Ġ-> Ġ 4 0 9 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Glyph s Count Ġ> Ġ 2 0 0 0 Ġ-> Ġ 2 0 4 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Glyph s Count Ġ> Ġ 1 0 0 0 Ġ-> Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 5 1 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtex Size . y Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġpack ing ĊĠĠĠĠĠĠĠ Ġval Ġmax Tex Height Ġ= Ġ 1 0 2 4 Ġ* Ġ 3 2 ĊĠĠĠĠĠĠĠ Ġval Ġsp c Ġ= ĠST BT TP ack Context . create () ĊĠĠĠĠĠĠĠ Ġif Ġ(! st b tt _ Pack Begin ( sp c , Ġnull , Ġtex Size . x , Ġmax Tex Height , Ġ 0 , Ġtex Glyph Padding , ĠMemory Util . NULL )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠPack Ġour Ġextra Ġdata Ġrect angles Ġfirst , Ġso Ġit Ġwill Ġbe Ġon Ġthe Ġupper - left Ġcorner Ġof Ġour Ġtexture Ġ( UV Ġwill Ġhave ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsmall Ġvalues ). Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġbuild Pack Custom Rects ( sp c . pack Info ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġfont Ġinformation Ġ( so Ġwe Ġcan Ġerror Ġwithout Ġany Ġcleanup ) ĊĠĠĠĠĠĠĠ Ġclass ĠFont Temp Build Data Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfont Info Ġ= ĠST B TT Font info . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġrect s : ĠST BR PR ect . Buffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrect s Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġranges : ĠST BT TP ack Range . Buffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġranges Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtmp Array Ġ= ĠArray ( config Data . size , Ġ{ ĠFont Temp Build Data () Ġ}) ĊĠĠĠĠĠĠĠ Ġconfig Data . forEach Indexed Ġ{ Ġinput , Ġcfg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġtmp Array [ input ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( with ( cfg . dst Font !! ) Ġ{ Ġ! is Loaded Ġ|| Ġcontainer Atlas Ġ== Ġthis @ Font Atlas Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Offset Ġ= Ġst b tt _ Get Font Offset For Index ( cfg . font Data Buffer , Ġcfg . font No ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( font Offset Ġ>= Ġ 0 ) Ġ{ Ġ" Font Data Ġis Ġincorrect , Ġor ĠFont No Ġcannot Ġbe Ġfound ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! st b tt _ Init Font ( tmp . font Info , Ġcfg . font Data Buffer , Ġfont Offset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtex Size Ġput Ġ 0 ĠĠ Ġ// ĠReset Ġoutput Ġon Ġfailure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAllocate Ġpack ing Ġcharacter Ġdata Ġand Ġflag Ġpacked Ġcharacters Ġbuffer Ġas Ġnon - packed Ġ( x 0 = y 0 = x 1 = y 1 = 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġ( buf Packed chars N , Ġbuf Rects N , Ġbuf Ranges N ) Ġ= ĠTrip le ( 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġbuf Packed chars Ġ= ĠST BT TP ack ed char . calloc ( total Glyph s Count ) ĊĠĠĠĠĠĠĠ Ġval Ġbuf Rects Ġ= ĠST BR PR ect . calloc ( total Glyph s Count ) ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ranges Ġ= ĠST BT TP ack Range . calloc ( total Ranges Count ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠFirst Ġfont Ġpass : Ġpack Ġall Ġglyph s Ġ( no Ġrendering Ġat Ġthis Ġpoint , Ġwe Ġare Ġworking Ġwith Ġrect angles Ġin Ġan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinf initely Ġt all Ġtexture Ġat Ġthis Ġpoint ) Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconfig Data . forEach Indexed Ġ{ Ġinput , Ġcfg Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġtmp Array [ input ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup Ġranges ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfont Glyph s Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfont Ranges Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 0 ] Ġ= Ġcfg . glyph Ranges [ i ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 1 ] Ġ= Ġcfg . glyph Ranges [ i ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( in Range [ 0 ] Ġ!= Ġ 0 Ġ&& Ġin Range [ 1 ] Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont Glyph s Count Ġ+= Ġ( in Range [ 1 ] Ġ- Ġin Range [ 0 ]) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 0 ] Ġ= Ġcfg . glyph Ranges . getOrElse ( i ++, Ġ{ Ġ 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 1 ] Ġ= Ġcfg . glyph Ranges . getOrElse ( i ++, Ġ{ Ġ 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont Ranges Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaddress Ġ= Ġbuf Ranges . address () Ġ+ Ġbuf Ranges N Ġ* ĠST BT TP ack Range . SIZE OF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . ranges Ġ= ĠST BT TP ack Range . create ( address , Ġfont Ranges Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . ranges Count Ġ= Ġfont Ranges Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Ranges N Ġ+= Ġfont Ranges Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġfont Ranges Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 0 ] Ġ= Ġcfg . glyph Ranges [ i Ġ* Ġ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Range [ 1 ] Ġ= Ġcfg . glyph Ranges [ i Ġ* Ġ 2 Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġtmp . ranges [ i ++] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . fontSize Ġ= Ġcfg . size Pixels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . first Unicode Code point InRange Ġ= Ġin Range [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . num Chars Ġ= Ġ( in Range [ 1 ] Ġ- Ġin Range [ 0 ]) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġbuf Packed chars . address () Ġ+ Ġbuf Packed chars N Ġ* ĠST BT TP ack ed char . SIZE OF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . char data For Range Ġ= ĠST BT TP ack ed char . create ( address , Ġrange . num Chars ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Packed chars N Ġ+= Ġrange . num Chars ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG ather Ġthe Ġsizes Ġof Ġall Ġrectangle Ġwe Ġneed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . rect s Ġ= ĠST BR PR ect . create ( buf Rects . address () Ġ+ Ġbuf Rects N Ġ* ĠST BR PR ect . SIZE OF , Ġfont Glyph s Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . rect s Count Ġ= Ġfont Glyph s Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Rects N Ġ+= Ġfont Glyph s Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst b tt _ Pack Set Over sampling ( sp c , Ġcfg . over sample ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġst b tt _ Pack Font Ranges Gather Rects ( sp c , Ġtmp . font Info , Ġtmp . ranges , Ġtmp . rect s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( n Ġ== Ġfont Glyph s Count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠDetect Ġmissing Ġglyph s Ġand Ġreplace Ġthem Ġwith Ġa Ġzero - sized Ġbox Ġinstead Ġof Ġrelying Ġon Ġthe Ġdefault Ġglyph s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThis Ġallows Ġus Ġmerging Ġoverlapping Ġicon Ġfonts Ġmore Ġeasily . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJVM , Ġthis Ġprov okes Ġa Ġj vm Ġcrash , Ġprobably Ġit Ġwill Ġwork Ġwith Ġthe Ġcustom Ġst b Ġ*/ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrect I Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( range I Ġin Ġ 0 Ġuntil Ġtmp . ranges Count ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( char I Ġin Ġ 0 Ġuntil Ġtmp . ranges [ range I ]. num Chars ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( st b tt _ Find Glyph Index ( tmp . font Info , Ġtmp . ranges [ range I ]. first Unicode Code point InRange Ġ+ Ġchar I ) Ġ== Ġ 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . rect s [ rect I ]. apply Ġ{ Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw Ġ= Ġ 0 Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect I ++ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPack ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst br p _ pack _ rect s ( sp c . pack Info , Ġtmp . rect s ) ĠĠ Ġ// Ġf uck , ĠO mar Ġmodified Ġhis Ġst b _ rect _ pack . h , Ġwe Ġshall Ġalso Ġhave Ġour Ġown ? ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠExtend Ġtexture Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlso Ġmark Ġmissing Ġglyph s Ġas Ġnon - packed Ġso Ġwe Ġdon 't Ġattempt Ġto Ġrender Ġinto Ġthem ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġtmp . rect s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tmp . rect s [ i ]. w Ġ== Ġ 0 Ġ&& Ġtmp . rect s [ i ]. h Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . rect s [ i ]. was Packed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r . was Packed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtex Size . y Ġ= Ġglm . max ( tex Size . y , Ġr . y Ġ+ Ġr . h ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( buf Rects N Ġ== Ġtotal Glyph s Count ) ĊĠĠĠĠĠĠĠ Ġassert ( buf Packed chars N Ġ== Ġtotal Glyph s Count ) ĊĠĠĠĠĠĠĠ Ġassert ( buf Ranges N Ġ== Ġtotal Ranges Count ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġtexture ĊĠĠĠĠĠĠĠ Ġtex Size . y Ġ= Ġif Ġ( flags Ġhas ĠFont Atlas Flag . No Power Of Two Height ) Ġtex Size . y Ġ+ Ġ 1 Ġelse Ġtex Size . y . upper Power Of Two ĊĠĠĠĠĠĠĠ Ġtex Uv Scale Ġ= Ġ 1 f Ġ/ ĠVec 2 ( tex Size ) ĊĠĠĠĠĠĠĠ Ġtex Pixels Alpha 8 Ġ= Ġbuffer Big ( tex Size . x Ġ* Ġtex Size . y ) ĊĠĠĠĠĠĠĠ Ġsp c . pixels Ġ= Ġtex Pixels Alpha 8 !! ĊĠĠĠĠĠĠĠ Ġsp c . height Ġ= Ġtex Size . y ĊĊĠĠĠĠĠĠĠ Ġ// ĠSecond Ġpass : Ġrender Ġcharacters ĊĠĠĠĠĠĠĠ Ġfor Ġ( input Ġin Ġ 0 Ġuntil Ġconfig Data . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcfg Ġ= Ġconfig Data [ input ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġtmp Array [ input ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst b tt _ Pack Set Over sampling ( sp c , Ġcfg . over sample ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst b tt _ Pack Font Ranges Render Into Rects ( sp c , Ġtmp . font Info , Ġtmp . ranges , Ġtmp . rect s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cfg . raster izer Multiply Ġ!= Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmultiply Table Ġ= Ġbuild Multiply Calc Lookup Table ( cfg . raster izer Multiply ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġtmp . rect s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r . was Packed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Multiply Rect Alpha 8 ( multiply Table , Ġsp c . pixels , Ġr , Ġsp c . stride InBytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . rect s . free () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnd Ġpack ing ĊĠĠĠĠĠĠĠ Ġst b tt _ Pack End ( sp c ) Ċ // ĠĠĠĠĠĠĠ Ġbuf Rects . free () ĠTODO Ġcheck Ġwhy Ġcrashes , Ġcontainer Ġis Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠThird Ġpass : Ġsetup ĠIm Font Ġand Ġglyph s Ġfor Ġruntime ĊĠĠĠĠĠĠĠ Ġfor Ġ( input Ġin Ġ 0 Ġuntil Ġconfig Data . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcfg Ġ= Ġconfig Data [ input ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġtmp Array [ input ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan Ġhave Ġmultiple Ġinput Ġfonts Ġwriting Ġinto Ġa Ġsame Ġdestination Ġfont Ġ( when Ġusing ĠMerge Mode = true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Font Ġ= Ġcfg . dst Font !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cfg . merge Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst Font . build Lookup Table () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Scale Ġ= Ġst b tt _ Scale For Pixel Height ( tmp . font Info , Ġcfg . size Pixels ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( un scaled Asc ent , Ġun scaled Des cent , Ġun scaled Line Gap ) Ġ= Ġst b tt _ Get Font V Metrics ( tmp . font Info ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġas cent Ġ= Ġfloor ( un scaled Asc ent Ġ* Ġfont Scale Ġ+ Ġif Ġ( un scaled Asc ent Ġ> Ġ 0 f ) Ġ+ 1 Ġelse Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdesc ent Ġ= Ġfloor ( un scaled Des cent Ġ* Ġfont Scale Ġ+ Ġif Ġ( un scaled Des cent Ġ> Ġ 0 f ) Ġ+ 1 Ġelse Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Setup Font ( dst Font , Ġcfg , Ġas cent , Ġdesc ent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Off X Ġ= Ġcfg . glyph Offset . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Off Y Ġ= Ġcfg . glyph Offset . y Ġ+ Ġ( dst Font . as cent Ġ+ Ġ 0 . 5 f ). i . f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . ranges . forEach Ġ{ Ġrange Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( char Idx Ġin Ġ 0 Ġuntil Ġrange . num Chars ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpc Ġ= Ġrange . char data For Range [ char Idx ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pc . x 0 Ġ== Ġ 0 Ġ&& Ġpc . x 1 Ġ== Ġ 0 Ġ&& Ġpc . y 0 Ġ== Ġ 0 Ġ&& Ġpc . y 1 Ġ== Ġ 0 ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode point Ġ= Ġrange . first Unicode Code point InRange Ġ+ Ġchar Idx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cfg . merge Mode Ġ&& Ġdst Font . find Glyph No Fallback ( code point ) Ġ!= Ġnull ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Advance X Org Ġ= Ġpc . x Advance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Advance X Mod Ġ= Ġglm . clamp ( char Advance X Org , Ġcfg . glyph Min Advance X , Ġcfg . glyph Max Advance X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchar Off X Ġ= Ġfont Off X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Advance X Org Ġ!= Ġchar Advance X Mod ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġ( char Advance X Mod Ġ- Ġchar Advance X Org ) Ġ* Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Off X Ġ+= Ġif Ġ( cfg . pixel Snap H ) Ġt . i . f Ġelse Ġt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq Ġ= ĠST B TT Aligned Quad . create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst b tt _ Get Packed Quad ( range . char data For Range , Ġtex Size , Ġchar Idx , ĠVec 2 (), Ġq , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst Font . add Glyph ( code point , Ġq . x 0 Ġ+ Ġchar Off X , Ġq . y 0 Ġ+ Ġfont Off Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq . x 1 Ġ+ Ġchar Off X , Ġq . y 1 Ġ+ Ġfont Off Y , Ġq . s 0 , Ġq . t 0 , Ġq . s 1 , Ġq . t 1 , Ġchar Advance X Mod ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCleanup Ġtempor aries ĊĠĠĠĠĠĠĠ Ġbuf Packed chars . free () ĊĠĠĠĠĠĠĠ Ġbuf Ranges . free () ĊĊĠĠĠĠĠĠĠ Ġbuild Finish () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Register Default Custom Rects () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( custom Rect Ids [ 0 ] Ġ>= Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġcustom Rect Ids [ 0 ] Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġhas nt ĠFont Atlas Flag . No Mouse Cur s ors Ġ-> Ġadd Custom Rect Regular ( Default Tex Data . id , ĠDefault Tex Data . w Half Ġ* Ġ 2 Ġ+ Ġ 1 , ĠDefault Tex Data . h ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġadd Custom Rect Regular ( Default Tex Data . id , Ġ 2 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Setup Font ( font : ĠFont , Ġfont Config : ĠFont Config , Ġas cent : ĠFloat , Ġdesc ent : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! font Config . merge Mode ) Ġwith ( font ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Atlas Ġ= Ġthis @ Font Atlas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Data . add ( font Config ) Ġ// ĠTODO Ġreplace Ġ[ 0 ] Ġif Ġnot Ġempty ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Data Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfontSize Ġ= Ġfont Config . size Pixels ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . as cent Ġ= Ġas cent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . desc ent Ġ= Ġdesc ent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglyph s . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics Total Surface Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfont . config Data Count ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Pack Custom Rects ( pack Context : ĠST BR P Context ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Rects Ġ= Ġcustom Rects ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġexpect Ġat Ġleast Ġthe Ġdefault Ġcustom Ġrect s Ġto Ġbe Ġregistered , Ġelse Ġsomething Ġwent Ġwrong . ĊĠĠĠĠĠĠĠ Ġassert ( user Rects . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġpack Rects Ġ= ĠST BR PR ect . calloc ( user Rects . size ) ĠĠĠ Ġ// Ġcalloc Ġ-> Ġall Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġuser Rects . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpack Rects [ i ]. w Ġ= Ġuser Rects [ i ]. width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpack Rects [ i ]. h Ġ= Ġuser Rects [ i ]. height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst br p _ pack _ rect s ( pack Context , Ġpack Rects ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġuser Rects . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pack Rects [ i ]. was Packed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Rects [ i ]. x Ġ= Ġpack Rects [ i ]. x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Rects [ i ]. y Ġ= Ġpack Rects [ i ]. y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( pack Rects [ i ]. w Ġ== Ġuser Rects [ i ]. width Ġ&& Ġpack Rects [ i ]. h Ġ== Ġuser Rects [ i ]. height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtex Size . y Ġ= Ġglm . max ( tex Size . y , Ġpack Rects [ i ]. y Ġ+ Ġpack Rects [ i ]. h ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Finish () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRender Ġinto Ġour Ġcustom Ġdata Ġblock ĊĠĠĠĠĠĠĠ Ġbuild Render Default Tex Data () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġcustom Ġrectangle Ġglyph s ĊĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġcustom Rects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Ġ= Ġr . font ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( font Ġ== Ġnull Ġ|| Ġr . id Ġ> Ġ 0 x 1 0 0 0 0 ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( font . container Atlas Ġ=== Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuv 0 Ġ= ĠVec 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuv 1 Ġ= ĠVec 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Custom Rect UV ( r , Ġuv 0 , Ġuv 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfont . add Glyph ( r . id , Ġr . glyph Offset . x , Ġr . glyph Offset . y , Ġr . glyph Offset . x Ġ+ Ġr . width , Ġr . glyph Offset . y Ġ+ Ġr . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuv 0 . x , Ġuv 0 . y , Ġuv 1 . x , Ġuv 1 . y , Ġr . glyph Advance X ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġall Ġfonts Ġlookup Ġtables ĊĠĠĠĠĠĠĠ Ġfonts . filter Ġ{ Ġit . dirty Lookup Tables Ġ}. forEach Ġ{ Ġit . build Lookup Table () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Render Default Tex Data () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġassert ( custom Rect Ids [ 0 ] Ġ>= Ġ 0 Ġ&& Ġtex Pixels Alpha 8 Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġcustom Rects [ custom Rect Ids [ 0 ]] ĊĠĠĠĠĠĠĠ Ġassert ( r . id Ġ== ĠDefault Tex Data . id Ġ&& Ġr . is Packed ) ĊĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġtex Size . x ĊĠĠĠĠĠĠĠ Ġif Ġ( flags Ġhas nt ĠFont Atlas Flag . No Mouse Cur s ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRender / copy Ġpixels ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( r . width Ġ== ĠDefault Tex Data . w Half Ġ* Ġ 2 Ġ+ Ġ 1 Ġ&& Ġr . height Ġ== ĠDefault Tex Data . h ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil ĠDefault Tex Data . h ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil ĠDefault Tex Data . w Half ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset 0 Ġ= Ġr . x Ġ+ Ġx Ġ+ Ġ( r . y Ġ+ Ġy ) Ġ* Ġw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset 1 Ġ= Ġoffset 0 Ġ+ ĠDefault Tex Data . w Half Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtex Pixels Alpha 8 ! ![ offset 0 ] Ġ= Ġif Ġ( Default Tex Data . pixels [ n ] Ġ== Ġ'.') Ġ 0 xFF . b Ġelse Ġ 0 x 0 0 . b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtex Pixels Alpha 8 ! ![ offset 1 ] Ġ= Ġif Ġ( Default Tex Data . pixels [ n ] Ġ== Ġ' X ') Ġ 0 xFF . b Ġelse Ġ 0 x 0 0 . b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( r . width Ġ== Ġ 2 Ġ&& Ġr . height Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġr . x . i Ġ+ Ġr . y . i Ġ* Ġw ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( tex Pixels Alpha 8 !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( offset Ġ+ Ġw Ġ+ Ġ 1 , Ġ 0 xFF . b ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( offset Ġ+ Ġw , Ġ 0 xFF . b ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( offset Ġ+ Ġ 1 , Ġ 0 xFF . b ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( offset , Ġ 0 xFF . b ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtex Uv White Pixel Ġ= Ġ( Vec 2 ( r . x , Ġr . y ) Ġ+ Ġ 0 . 5 f ) Ġ* Ġtex Uv Scale ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Multiply Calc Lookup Table ( in B right en Factor : ĠFloat ) Ġ= ĠChar Array ( 2 5 6 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ( it Ġ* Ġin B right en Factor ). i ĊĠĠĠĠĠĠĠ Ġ( if Ġ( value Ġ> Ġ 2 5 5 ) Ġ 2 5 5 Ġelse Ġ( value Ġand Ġ 0 xFF )). c ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Multiply Rect Alpha 8 ( table : ĠChar Array , Ġpixels : ĠByteBuffer , Ġrect : ĠST BR PR ect , Ġstride : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġptr Ġ= Ġrect . x Ġ+ Ġrect . y Ġ* Ġstride ĊĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġrect . h ĊĠĠĠĠĠĠĠ Ġwhile Ġ( j Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġrect . w ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels [ ptr Ġ+ Ġi ] Ġ= Ġtable [ pixels [ ptr Ġ+ Ġi ]. i ]. b ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġptr Ġ+= Ġstride ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* Ġ ĠA Ġwork Ġof Ġart Ġlies Ġahead ! Ġ(. Ġ= Ġwhite Ġlayer , ĠX Ġ= Ġblack Ġlayer , Ġothers Ġare Ġblank ) ĊĠĠĠĠĠĠĠ ĠThe Ġwhite Ġtex els Ġon Ġthe Ġtop Ġleft Ġare Ġthe Ġones Ġwe 'll Ġuse Ġeverywhere Ġin ĠImGui Ġto Ġrender Ġfilled Ġshapes . ĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠDefault Tex Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw Half Ġ= Ġ 1 0 8 ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġ 2 7 ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ 0 x 8 0 0 0 0 0 0 0 . i ĊĠĠĠĠĠĠĠ Ġval Ġpixels Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ".. - ĠĠĠĠĠĠĠĠ Ġ- XXXX XXX - ĠĠĠ ĠX ĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠ ĠX ĠĠĠĠĠĠĠĠĠĠ Ġ- XXXX XXX ĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠXXX XXXX - ĠĠĠĠ ĠXX ĠĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ".. - ĠĠĠĠĠĠĠĠ Ġ- X ..... X - ĠĠ ĠX . X ĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠX . X ĠĠĠĠĠĠĠĠĠ Ġ- X ..... X ĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠX ..... X - ĠĠĠ ĠX .. X ĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" --- ĠĠĠĠĠĠĠĠ Ġ- XXX . XXX - Ġ ĠX ... X Ġ Ġ- ĠĠĠĠĠĠĠĠ ĠX ... X ĠĠĠĠĠĠĠĠ Ġ- X .... X ĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠ ĠX .... X - ĠĠĠ ĠX .. X ĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ ĠX . X Ġ Ġ- ĠX ..... X Ġ- ĠĠĠĠĠĠĠ ĠX ..... X ĠĠĠĠĠĠĠ Ġ- X ... X ĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠĠ ĠX ... X - ĠĠĠ ĠX .. X ĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" XX ĠĠĠĠĠĠĠĠĠ Ġ- Ġ ĠX . X Ġ Ġ- X ....... X - ĠĠĠĠĠĠ ĠX ....... X ĠĠĠĠĠĠ Ġ- X .. X . X ĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠ ĠX . X .. X - ĠĠĠ ĠX .. X ĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X . X ĠĠĠĠĠĠĠĠ Ġ- Ġ ĠX . X Ġ Ġ- XXXX . XXXX - ĠĠĠĠĠĠ ĠXXX X . XXXX ĠĠĠĠĠĠ Ġ- X . X ĠX . X ĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠX . X ĠX . X - ĠĠĠ ĠX .. XXX ĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X .. X ĠĠĠĠĠĠĠ Ġ- Ġ ĠX . X Ġ Ġ- ĠĠ ĠX . X ĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠX . X ĠĠĠĠĠĠĠĠĠ Ġ- XX ĠĠ ĠX . X ĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠĠ ĠX . X ĠĠ ĠXX - ĠĠĠ ĠX .. X .. XXX ĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ... X ĠĠĠĠĠĠ Ġ- Ġ ĠX . X Ġ Ġ- ĠĠ ĠX . X ĠĠ Ġ- ĠĠĠ ĠXX ĠĠĠ ĠX . X ĠĠĠ ĠXX ĠĠĠ Ġ- ĠĠĠĠĠ ĠX . X ĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠ ĠX . X ĠĠĠĠĠ Ġ- ĠĠĠ ĠX .. X .. X .. XX Ġ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X .... X ĠĠĠĠĠ Ġ- Ġ ĠX . X Ġ Ġ- ĠĠ ĠX . X ĠĠ Ġ- ĠĠ ĠX . X ĠĠĠ ĠX . X ĠĠĠ ĠX . X ĠĠ Ġ- ĠĠĠĠĠĠ ĠX . X ĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠ ĠX . X ĠĠĠĠĠĠ Ġ- ĠĠĠ ĠX .. X .. X .. X . X Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ..... X ĠĠĠĠ Ġ- Ġ ĠX . X Ġ Ġ- ĠĠ ĠX . X ĠĠ Ġ- Ġ ĠX .. X ĠĠĠ ĠX . X ĠĠĠ ĠX .. X Ġ Ġ- ĠĠĠĠĠĠĠ ĠX . X ĠĠĠĠĠ Ġ- ĠĠĠĠĠ ĠX . X ĠĠĠĠĠĠĠ Ġ- XXX ĠX .. X .. X .. X .. X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ...... X ĠĠĠ Ġ- Ġ ĠX . X Ġ Ġ- ĠĠ ĠX . X ĠĠ Ġ- ĠX ... XXXX XX . XXXX XX ... X Ġ- ĠĠĠĠĠĠĠĠ ĠX . X ĠĠ ĠXX - XX ĠĠ ĠX . X ĠĠĠĠĠĠĠĠ Ġ- X .. XX ........ X .. X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ....... X ĠĠ Ġ- Ġ ĠX . X Ġ Ġ- ĠĠ ĠX . X ĠĠ Ġ- X ................ ..... X - ĠĠĠĠĠĠĠĠĠ ĠX . X ĠX . X - X . X ĠX . X ĠĠĠĠĠĠĠĠĠ Ġ- X ... X ........ ... X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ........ X Ġ Ġ- Ġ ĠX . X Ġ Ġ- ĠĠ ĠX . X ĠĠ Ġ- ĠX ... XXXX XX . XXXX XX ... X Ġ- ĠĠĠĠĠĠĠĠĠĠ ĠX . X .. X - X .. X . X ĠĠĠĠĠĠĠĠĠĠ Ġ- ĠX ........ ...... X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X .... ..... X Ġ- XXX . XXX - ĠĠ ĠX . X ĠĠ Ġ- Ġ ĠX .. X ĠĠĠ ĠX . X ĠĠĠ ĠX .. X Ġ Ġ- ĠĠĠĠĠĠĠĠĠĠĠ ĠX ... X - X ... X ĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ ĠX ........ ..... X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ........ .. X - X ..... X - ĠĠ ĠX . X ĠĠ Ġ- ĠĠ ĠX . X ĠĠĠ ĠX . X ĠĠĠ ĠX . X ĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠ ĠX .... X - X .... X ĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ ĠX ........ ..... X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ...... XX XXX - XXXX XXX - ĠĠ ĠX . X ĠĠ Ġ- ĠĠĠ ĠXX ĠĠĠ ĠX . X ĠĠĠ ĠXX ĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠX ..... X - X ..... X ĠĠĠĠĠĠĠĠĠ Ġ- ĠĠ ĠX ........ .... X " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X ... X .. X ĠĠĠ Ġ--------- ĠĠ ĠX . X ĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠX . X ĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠXXX XXXX - XXXX XXX ĠĠĠĠĠĠĠĠĠ Ġ- ĠĠ ĠX ........ ... X Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X .. X ĠX .. X ĠĠ Ġ- ĠĠĠĠĠĠ Ġ- XXXX . XXXX - ĠĠĠĠĠĠ ĠXXX X . XXXX ĠĠĠĠĠĠ Ġ-------------------------------- ----- ĠĠĠ ĠX ........ .. X Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" X . X Ġ ĠX .. X ĠĠ Ġ- ĠĠĠĠĠĠ Ġ- X ....... X - ĠĠĠĠĠĠ ĠX ....... X ĠĠĠĠĠĠ Ġ- ĠĠĠ ĠXX ĠĠĠĠĠĠĠĠĠĠ ĠXX ĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠ ĠX ........ .. X Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" XX ĠĠĠ ĠX .. X Ġ Ġ- ĠĠĠĠĠĠ Ġ- ĠX ..... X Ġ- ĠĠĠĠĠĠĠ ĠX ..... X ĠĠĠĠĠĠĠ Ġ- ĠĠ ĠX . X ĠĠĠĠĠĠĠĠĠĠ ĠX . X ĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠ ĠX ........ X Ġ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" ĠĠĠĠĠ ĠX .. X ĠĠĠĠĠĠĠĠĠ Ġ- Ġ ĠX ... X Ġ Ġ- ĠĠĠĠĠĠĠĠ ĠX ... X ĠĠĠĠĠĠĠĠ Ġ- Ġ ĠX .. X ĠĠĠĠĠĠĠĠĠĠ ĠX .. X Ġ Ġ- ĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠ ĠX ........ X Ġ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" ĠĠĠĠĠĠ ĠXX ĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠ ĠX . X ĠĠ Ġ- ĠĠĠĠĠĠĠĠĠ ĠX . X ĠĠĠĠĠĠĠĠĠ Ġ- ĠX ... XXXXXXXX XX XXX ... X Ġ- ĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠĠ ĠXXX XXXX XXX Ġ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" ------------ ĠĠĠĠĠĠĠ Ġ- ĠĠĠ ĠX ĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠ ĠX ĠĠĠĠĠĠĠĠĠĠ Ġ- X ................ ..... X - ĠĠĠĠĠĠĠĠĠĠ Ġ---------------- -- " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-------------------------------- --- ĠX ... XXXXXXXX XX XXX ... X Ġ- ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ ĠX .. X ĠĠĠĠĠĠĠĠĠĠ ĠX .. X Ġ Ġ- ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠ ĠX . X ĠĠĠĠĠĠĠĠĠĠ ĠX . X ĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠĠĠ ĠXX ĠĠĠĠĠĠĠĠĠĠ ĠXX ĠĠĠ Ġ- ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . toString (). toCharArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcursor Datas Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPos Ġ ........ ĠSize Ġ.... ..... ĠOffset Ġ.... .. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Vec 2 ( 0 , Ġ 3 ), ĠVec 2 ( 1 2 , Ġ 1 9 ), ĠVec 2 ( 0 )), ĠĠĠĠĠĠĠĠ Ġ// ĠMouse Cursor . Arrow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Vec 2 ( 1 3 , Ġ 0 ), ĠVec 2 ( 7 , Ġ 1 6 ), ĠVec 2 ( 1 , Ġ 8 )), ĠĠ Ġ// ĠMouse Cursor . TextInput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Vec 2 ( 3 1 , Ġ 0 ), ĠVec 2 ( 2 3 ), ĠVec 2 ( 1 1 )), ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMouse Cursor . Move ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Vec 2 ( 2 1 , Ġ 0 ), ĠVec 2 ( 9 , Ġ 2 3 ), ĠVec 2 ( 4 , Ġ 1 1 )), Ġ Ġ// ĠMouse Cursor . Resize NS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Vec 2 ( 5 5 , Ġ 1 8 ), ĠVec 2 ( 2 3 , Ġ 9 ), ĠVec 2 ( 1 1 , Ġ 4 )), Ġ// ĠMouse Cursor . Resize EW ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Vec 2 ( 7 3 , Ġ 0 ), ĠVec 2 ( 1 7 ), ĠVec 2 ( 8 )), ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMouse Cursor . Resize N ES W ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Vec 2 ( 5 5 , Ġ 0 ), ĠVec 2 ( 1 7 ), ĠVec 2 ( 8 )), ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMouse Cursor . Resize NW SE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Vec 2 ( 9 1 , Ġ 0 ), ĠVec 2 ( 1 7 , Ġ 2 2 ), ĠVec 2 ( 5 , Ġ 0 ))) Ġ// ĠImGui Mouse Cursor _ Hand ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠFont Ġruntime Ġdata Ġand Ġrendering Ċ Ġ* Ġ ĠIm Font Atlas Ġautomatically Ġloads Ġa Ġdefault Ġembedded Ġfont Ġfor Ġyou Ġwhen Ġyou Ġcall ĠGet Tex Data As Alpha 8 () Ġor Ċ Ġ* Ġ ĠGet Tex Data As RGBA 3 2 (). ĠĠ Ġ*/ Ċ class ĠFont Ġ{ ĊĊĠĠĠ Ġ// ĠMembers : ĠHot Ġ~ 6 2 / 7 8 Ġbytes ĊĠĠĠ Ġ/** Ġ< user Ġset >, ĠHeight Ġof Ġcharacters , Ġset Ġduring Ġloading Ġ( don 't Ġchange Ġafter Ġloading ) ĠĠ Ġ*/ ĊĠĠĠ Ġvar ĠfontSize Ġ= Ġ 0 f ĊĠĠĠ Ġ/** ĠBase Ġfont Ġscale , Ġmultip lied Ġby Ġthe Ġper - window Ġfont Ġscale Ġwhich Ġyou Ġcan Ġadjust Ġwith ĠSet Font Scale () ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġscale Ġ= Ġ 1 f ĊĠĠĠ Ġ/** ĠOffset Ġfont Ġrendering Ġby Ġxx Ġpixels Ġ Ġ*/ ĊĠĠĠ Ġvar Ġdisplay Offset Ġ= ĠVec 2 ( 0 f , Ġ 0 f ) ĊĠĠĠ Ġ/** ĠAll Ġglyph s . Ġ*/ ĊĠĠĠ Ġval Ġglyph s Ġ= ĠArrayList < Font Glyph >() ĊĠĠĠ Ġ/** ĠSparse . ĠGlyph s . x Advance Ġin Ġa Ġdirectly Ġindex able Ġway Ġ( more Ġcache - friendly , Ġfor ĠCalc Text Size Ġfunctions Ġwhich Ġare ĊĠĠĠ Ġoften Ġbot tleneck Ġin Ġlarge ĠUI ). Ġ Ġ*/ ĊĠĠĠ Ġval Ġindex Advance X Ġ= ĠArrayList < Float >() ĊĠĠĠ Ġ/** ĠSparse . ĠIndex Ġglyph s Ġby ĠUnicode Ġcode - point . Ġ*/ ĊĠĠĠ Ġval Ġindex Lookup Ġ= ĠArrayList < Int >() ĊĠĠĠ Ġ/** Ġ== ĠFind Glyph ( Font Fallback Char ) Ġ Ġ*/ ĊĠĠĠ Ġvar Ġfallback Glyph : ĠFont Glyph ? Ġ= Ġnull ĊĠĠĠ Ġ/** Ġ== ĠF allback Glyph . x Advance Ġ Ġ*/ ĊĠĠĠ Ġvar Ġfallback Advance X Ġ= Ġ 0 f ĊĠĠĠ Ġ/** ĠRe placement Ġglyph Ġif Ġone Ġisn 't Ġfound . ĠOnly Ġset Ġvia ĠSet Fallback Char () ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġfallback Char Ġ= Ġ' ?' ĊĊĠĠĠ Ġ// ĠMembers : ĠC old Ġ~ 1 8 / 2 6 Ġbytes ĊĠĠĠ Ġ/** ĠNumber Ġof ĠIm Font Config Ġinvolved Ġin Ġcreating Ġthis Ġfont . ĠBig ger Ġthan Ġ 1 Ġwhen Ġmerging Ġmultiple Ġfont Ġsources Ġinto Ġone ĠIm Font . ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġconfig Data Count Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠPointer Ġwithin ĠContainer Atlas -> Config Data ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġconfig Data Ġ= ĠArrayList < Font Config >() ĊĊĠĠĠ Ġvar Ġconfig Data Idx Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĠWhat Ġwe Ġhas Ġbeen Ġloaded Ġinto ĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġcontainer Atlas : ĠFont Atlas ĊĠĠĠ Ġ/** ĠAsc ent : Ġdistance Ġfrom Ġtop Ġto Ġbottom Ġof Ġe . g . Ġ' A ' Ġ[ 0 .. FontSize ] ĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġas cent Ġ= Ġ 0 f ĊĊĠĠĠ Ġvar Ġdesc ent Ġ= Ġ 0 f ĊĊĠĠĠ Ġvar Ġdirty Lookup Tables Ġ= Ġtrue ĊĠĠĠ Ġ/** ĠTotal Ġsurface Ġin Ġpixels Ġto Ġget Ġan Ġidea Ġof Ġthe Ġfont Ġraster ization / texture Ġcost Ġ( not Ġexact , Ġwe Ġapproximate Ġthe Ġcost Ġof Ġpadding ĊĠĠĠ Ġbetween Ġglyph s ) ĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġmetrics Total Surface Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ċ // ĠĠĠ Ġ// ĠMethods Ċ // ĠĠĠ ĠIM GUI _ API ĠIm Font (); Ċ // ĠĠĠ ĠIM GUI _ API Ġ~ Im Font (); ĊĊĠĠĠ Ġfun Ġclear Output Data () Ġ{ ĊĠĠĠĠĠĠĠ ĠfontSize Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġdisplay Offset Ġ= ĠVec 2 ( 0 . 0 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġglyph s . clear () ĊĠĠĠĠĠĠĠ Ġindex Advance X . clear () ĊĠĠĠĠĠĠĠ Ġindex Lookup . clear () ĊĠĠĠĠĠĠĠ Ġfallback Glyph Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfallback Advance X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġconfig Data Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconfig Data . clear () Ċ // ĠĠĠĠĠĠĠ Ġcontainer Atlas Ġ= ĠNULL ĠTODO Ġcheck ĊĠĠĠĠĠĠĠ Ġas cent Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġdesc ent Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġdirty Lookup Tables Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmetrics Total Surface Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Lookup Table () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmax Code point Ġ= Ġglyph s . map Ġ{ Ġit . code point . i Ġ}. max () !! ĊĊĠĠĠĠĠĠĠ Ġassert ( glyph s . size Ġ< Ġ 0 xFFFF ) Ġ{ Ġ"- 1 Ġis Ġreserved " Ġ} ĊĠĠĠĠĠĠĠ Ġindex Advance X . clear () ĊĠĠĠĠĠĠĠ Ġindex Lookup . clear () ĊĠĠĠĠĠĠĠ Ġdirty Lookup Tables Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġgrow Index ( max Code point Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġglyph s . forEach Indexed Ġ{ Ġi , Ġg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Advance X [ g . code point . i ] Ġ= Ġg . advance X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Lookup [ g . code point . i ] Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġglyph Ġto Ġhandle ĠTAB ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠNeeds Ġproper ĠTAB Ġhandling Ġbut Ġit Ġneeds Ġto Ġbe Ġcontext ual ized Ġ( or Ġwe Ġcould Ġarbitrary Ġsay Ġthat Ġeach Ġstring Ġstarts Ġat Ġ" column Ġ 0 " Ġ? ) ĊĠĠĠĠĠĠĠ Ġif Ġ( find Glyph (' Ġ') Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( glyph s . last (). code point Ġ!= Ġ'\ t ') ĠĠ Ġ// ĠSo Ġwe Ġcan Ġcall Ġthis Ġfunction Ġmultiple Ġtimes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglyph s Ġ+= ĠFont Glyph () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtab Glyph Ġ= Ġglyph s . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Glyph Ġput Ġfind Glyph (' Ġ') !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Glyph . code point Ġ= Ġ'\ t ' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Glyph . advance X Ġ*= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Advance X [ tab Glyph . code point . i ] Ġ= Ġtab Glyph . advance X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Lookup [ tab Glyph . code point . i ] Ġ= Ġglyph s . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfallback Glyph Ġ= Ġfind Glyph No Fallback ( fallback Char ) ĊĠĠĠĠĠĠĠ Ġfallback Advance X Ġ= Ġfallback Glyph ?. advance X Ġ?: Ġ 0 f ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmax Code point Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Advance X [ i ] Ġ< Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Advance X [ i ] Ġ= Ġfallback Advance X ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Glyph ( c : ĠChar ) Ġ= Ġfind Glyph ( c . i ) ĊĠĠĠ Ġfun Ġfind Glyph ( c : ĠInt ) Ġ= Ġindex Lookup . get OrNull ( c )?. let Ġ{ Ġglyph s . get OrNull ( it ) Ġ} Ġ?: Ġfallback Glyph ĊĠĠĠ Ġfun Ġfind Glyph No Fallback ( c : ĠChar ) Ġ= Ġfind Glyph No Fallback ( c . i ) ĊĠĠĠ Ġfun Ġfind Glyph No Fallback ( c : ĠInt ) Ġ= Ġindex Lookup . get OrNull ( c )?. let Ġ{ Ġglyph s . get OrNull ( it ) Ġ} ĊĊĠĠĠ Ġ// ĠĠĠ ĠIM GUI _ API Ġvoid ĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSet Fallback Char ( Im W char Ġc ); ĊĠĠĠ Ġfun Ġget Char Advance ( c : ĠChar ): ĠFloat Ġ= Ġif Ġ( c Ġ< Ġindex Advance X . size ) Ġindex Advance X [ c . i ] Ġelse Ġfallback Advance X ĊĊĠĠĠ Ġval Ġis Loaded Ġget () Ġ= Ġ:: container Atlas . isInitialized ĊĊĠĠĠ Ġval Ġdebug Name Ġget () Ġ= Ġconfig Data . get OrNull ( 0 )?. name Ġ?: Ġ"< unknown >" ĊĊĠĠĠ Ġ/* Ġ Ġ' maxWidth ' Ġstops Ġrendering Ġafter Ġa Ġcertain Ġwidth Ġ( could Ġbe Ġturned Ġinto Ġa Ġ 2 d Ġsize ). ĠF LT _ MAX Ġto Ġdisable . ĊĠĠĠĠĠĠĠ Ġ' wrap Width ' Ġenable Ġautomatic Ġword - wrapping Ġacross Ġmultiple Ġlines Ġto Ġfit Ġinto Ġgiven Ġwidth . Ġ 0 . 0 f Ġto Ġdisable . Ġ*/ ĊĠĠĠ Ġfun Ġcalc Text Size A ( size : ĠFloat , ĠmaxWidth : ĠFloat , Ġwrap Width : ĠFloat , Ġtext : ĠString , Ġtext End : ĠInt Ġ= Ġtext . length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining : ĠInt Array ? Ġ= Ġnull ): ĠVec 2 Ġ{ Ġ// Ġutf 8 ĊĊĠĠĠĠĠĠĠ Ġval Ġline Height Ġ= Ġsize ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġsize Ġ/ ĠfontSize ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Size Ġ= ĠVec 2 ( 0 ) ĊĠĠĠĠĠĠĠ Ġvar ĠlineWidth Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġval Ġword Wrap Enabled Ġ= Ġwrap Width Ġ> Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġword Wrap E ol Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( s Ġ< Ġtext End ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Wrap Enabled ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠCalculate Ġhow Ġfar Ġwe Ġcan Ġrender . ĠRequires Ġtwo Ġpasses Ġon Ġthe Ġstring Ġdata Ġbut Ġkeeps Ġthe Ġcode Ġsimple ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġnot Ġintr usive Ġfor Ġwhat 's Ġessentially Ġan Ġun common Ġfeature . ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Wrap E ol Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Wrap E ol Ġ= Ġcalc Word Wrap Position A ( scale , Ġtext . toCharArray (), Ġs , Ġtext End , Ġwrap Width Ġ- ĠlineWidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠWrap _ width Ġis Ġtoo Ġsmall Ġto Ġfit Ġanything . ĠForce Ġdisplaying Ġ 1 Ġcharacter Ġto Ġminimize Ġthe Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis continu ity . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Wrap E ol Ġ== Ġs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ+ 1 Ġmay Ġnot Ġbe Ġa Ġcharacter Ġstart Ġpoint Ġin ĠUTF - 8 Ġbut Ġit 's Ġok Ġbecause Ġwe Ġuse Ġs Ġ>= Ġword Wrap E ol Ġbelow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Wrap E ol ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Ġ>= Ġword Wrap E ol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Size . x Ġ< ĠlineWidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size . x Ġ= ĠlineWidth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size . y Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Wrap E ol Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWr apping Ġskip s Ġupcoming Ġbl anks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( s Ġ< Ġtext End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtext [ s ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . isBlank A ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( c Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecode Ġand Ġadvance Ġsource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev S Ġ= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtext [ s ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠJVM Ġimg ui Ġspecific , Ġnot Ġ 0 x 8 0 Ġbecause Ġon Ġj vm Ġwe Ġhave ĠUnicode Ġwith Ġsur rog ates Ġcharacters Ġ( instead Ġof Ġutf 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttps :// www . ibm . com / developer works / library / j - unicode / index . html ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ< ĠChar . MIN _ SUR RO GATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Prob ab ily Ġsur rogate Ġcharacter ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= ĠIm Text Char From Utf 8 (& Ġc , Ġs , Ġtext _ end ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . i Ġ== Ġ 0 x 0 ) Ġbreak ĠĠ Ġ// ĠMal formed ĠUTF - 8 ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ< Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size . x Ġ= Ġglm . max ( text Size . x , ĠlineWidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size . y Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\ r ') Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Width Ġ= Ġ( if Ġ( c Ġ< Ġindex Advance X . size ) Ġindex Advance X [ c . i ] Ġelse Ġfallback Advance X ) Ġ* Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lineWidth Ġ+ Ġchar Width Ġ>= ĠmaxWidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġprev S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ+= Ġchar Width ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text Size . x Ġ< ĠlineWidth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size . x Ġ= ĠlineWidth ĊĊĠĠĠĠĠĠĠ Ġif Ġ( lineWidth Ġ> Ġ 0 Ġ|| Ġtext Size . y Ġ== Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size . y Ġ+= Ġline Height ĊĊĠĠĠĠĠĠĠ Ġremaining ?. set ( 0 , Ġs ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtext Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalc Word Wrap Position A ( scale : ĠFloat , Ġtext : ĠChar Array , Ġptr : ĠInt , Ġtext End : ĠInt , Ġwrap Width _: ĠFloat ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠSimple Ġword - wrapping Ġfor ĠEnglish , Ġnot Ġfull - featured . ĠPlease Ġsubmit Ġfailing Ġcases ! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFIXME : ĠM uch Ġpossible Ġimprovements Ġ( don 't Ġcut Ġthings Ġlike Ġ" word Ġ! ", Ġ" word !! !" Ġbut Ġcut Ġwithin Ġ" word ,,,, ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmore Ġsensible Ġsupport Ġfor Ġp unct u ations , Ġsupport Ġfor ĠUnicode Ġp unct u ations , Ġetc .) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFor Ġreferences , Ġpossible Ġwrap Ġpoint Ġmarked Ġwith Ġ^ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" aaa Ġb bb , Ġc cc , ddd . Ġe ee ĠĠ Ġf ff . Ġg gg !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ^ ĠĠĠ Ġ^ ĠĠĠ Ġ^ ĠĠ Ġ^ ĠĠ Ġ^ __ ĠĠĠ Ġ^ ĠĠĠ Ġ^ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠList Ġof Ġhardcoded Ġsepar ators : Ġ. , ; ! ? '" ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSkip Ġextra Ġbl anks Ġafter Ġa Ġline Ġreturns Ġ( that Ġincludes Ġnot Ġcounting Ġthem Ġin Ġwidth Ġcomputation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . g . Ġ" Hello ĠĠĠ Ġworld " Ġ--> Ġ" Hello " Ġ" World " ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠCut Ġwords Ġthat Ġcannot Ġpossibly Ġfit Ġwithin Ġone Ġline . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . g .: Ġ" The Ġt rop ical Ġfish " Ġwith Ġ~ 5 Ġcharacters Ġworth Ġof Ġwidth Ġ--> Ġ" The Ġtr " Ġ" op ical " Ġ" fish " ĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġvar ĠlineWidth Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġword Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġblank Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġwrap Width Ġ= Ġwrap Width _ Ġ/ Ġscale ĠĠ Ġ// ĠWe Ġwork Ġwith Ġun scaled Ġwidths Ġto Ġavoid Ġscaling Ġevery Ġcharacters ĊĊĠĠĠĠĠĠĠ Ġvar Ġword End Ġ= Ġptr ĊĠĠĠĠĠĠĠ Ġvar Ġprev Word End Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġinside Word Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġptr ĊĠĠĠĠĠĠĠ Ġwhile Ġ( s Ġ< Ġtext End ) Ġ{ ĠĠĠ Ġ// ĠTODO Ġremove Ġtext End ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtext [ s ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext S Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ< Ġ 0 x 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () Ġ// Ġ( s Ġ+ ĠIm Text Char From Utf 8 (& c , Ġs , Ġtext _ end )). c ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== ĠN UL ) Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ< Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblank Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinside Word Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġnext S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\ r ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġnext S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Width Ġ= Ġindex Advance X . getOrElse ( c . i , Ġ{ Ġfallback Advance X Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . isBlank W ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inside Word ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ+= Ġblank Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblank Width Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword End Ġ= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblank Width Ġ+= Ġchar Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinside Word Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Width Ġ+= Ġchar Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inside Word ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword End Ġ= Ġnext S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Word End Ġ= Ġword End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ+= Ġword Width Ġ+ Ġblank Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblank Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAllow Ġwrapping Ġafter Ġpunctuation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinside Word Ġ= Ġ!( c Ġ== Ġ'.' Ġ|| Ġc Ġ== Ġ',' Ġ|| Ġc Ġ== Ġ';' Ġ|| Ġc Ġ== Ġ' !' Ġ|| Ġc Ġ== Ġ' ?' Ġ|| Ġc Ġ== Ġ'\" ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġignore Ġblank Ġwidth Ġat Ġthe Ġend Ġof Ġthe Ġline Ġ( they Ġcan Ġbe Ġskipped ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lineWidth Ġ+ Ġword Width Ġ>= Ġwrap Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWord s Ġthat Ġcannot Ġpossibly Ġfit Ġwithin Ġan Ġentire Ġline Ġwill Ġbe Ġcut Ġanywhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Width Ġ< Ġwrap Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġif Ġ( prev Word End Ġ!= Ġ- 1 ) Ġprev Word End Ġelse Ġword End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġnext S ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender Char ( draw List : ĠDraw List , Ġsize : ĠFloat , Ġpos : ĠVec 2 , Ġcol : ĠInt , Ġc : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ' Ġ' Ġ|| Ġc Ġ== Ġ'\ t ' Ġ|| Ġc Ġ== Ġ'\ n ' Ġ|| Ġc Ġ== Ġ'\ r ') Ġ// ĠMatch Ġbehavior Ġof ĠRender Text (), Ġthose Ġ 4 Ġcode points Ġare Ġhard - coded . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġfind Glyph ( c )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġif Ġ( size Ġ>= Ġ 0 f ) Ġsize Ġ/ ĠfontSize Ġelse Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġpos . x . i . f Ġ+ Ġdisplay Offset . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġpos . y . i . f Ġ+ Ġdisplay Offset . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw List . prim Reserve ( 6 , Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠVec 2 ( x Ġ+ Ġit . x 0 Ġ* Ġscale , Ġy Ġ+ Ġit . y 0 Ġ* Ġscale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc _ Ġ= ĠVec 2 ( x Ġ+ Ġit . x 1 Ġ* Ġscale , Ġy Ġ+ Ġit . y 1 Ġ* Ġscale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw List . prim Rect UV ( a , Ġc _, ĠVec 2 ( it . u 0 , Ġit . v 0 ), ĠVec 2 ( it . u 1 , Ġit . v 1 ), Ġcol ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠĠĠ Ġconst ĠIm Vec 4 & Ġclip Rect , Ġconst Ġchar * Ġtext , Ġconst Ġchar * Ġtext End , Ġfloat Ġwrap Width Ġ= Ġ 0 . 0 f , Ġbool Ġcpu F ine Clip Ġ= Ġfalse ) Ġconst ; ĊĠĠĠ Ġfun Ġrender Text ( draw List : ĠDraw List , Ġsize : ĠFloat , Ġpos : ĠVec 2 , Ġcol : ĠInt , Ġclip Rect : ĠVec 4 , Ġtext : ĠChar Array , Ġtext End _: ĠInt Ġ= Ġtext . size , Ġ// ĠTODO Ġreturn Ġit Ġalso ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Width : ĠFloat Ġ= Ġ 0 f , Ġcpu F ine Clip : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠAlign Ġto Ġbe Ġpixel Ġperfect ĊĠĠĠĠĠĠĠ Ġpos . x Ġ= Ġpos . x . i . f Ġ+ Ġdisplay Offset . x ĊĠĠĠĠĠĠĠ Ġpos . y Ġ= Ġpos . y . i . f Ġ+ Ġdisplay Offset . y ĊĠĠĠĠĠĠĠ Ġvar Ġ( x , Ġy ) Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġif Ġ( y Ġ> Ġclip Rect . w ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġsize Ġ/ ĠfontSize ĊĠĠĠĠĠĠĠ Ġval Ġline Height Ġ= ĠfontSize Ġ* Ġscale ĊĠĠĠĠĠĠĠ Ġval Ġword Wrap Enabled Ġ= Ġwrap Width Ġ> Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġword Wrap E ol Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠFast - forward Ġto Ġfirst Ġvisible Ġline ĊĠĠĠĠĠĠĠ Ġvar Ġs Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( y Ġ+ Ġline Height Ġ< Ġclip Rect . y Ġ&& Ġ! word Wrap Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( y Ġ+ Ġline Height Ġ< Ġclip Rect . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( s Ġ< Ġtext End _) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text [ s ++] Ġ== Ġ'\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠFor Ġlarge Ġtext , Ġscan Ġfor Ġthe Ġlast Ġvisible Ġline Ġin Ġorder Ġto Ġavoid Ġover - re serving Ġin Ġthe Ġcall Ġto ĠPrim Reserve () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNote Ġthat Ġvery Ġlarge Ġhorizontal Ġline Ġwill Ġstill Ġbe Ġaffected Ġby Ġthe Ġissue Ġ( e . g . Ġa Ġone Ġmeg abyte Ġstring Ġbuffer Ġwithout Ġa Ġnewline Ġwill Ġlikely Ġcrash Ġat m ) ĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġtext End Ġ= Ġtext End _ ĊĠĠĠĠĠĠĠ Ġif Ġ( text End Ġ- Ġs Ġ> Ġ 1 0 0 0 0 Ġ&& Ġ! word Wrap Enabled ) ĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs End Ġ= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy End Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( y End Ġ< Ġclip Rect . w ) ĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( s End Ġ< Ġtext End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text [ s End ++] Ġ== Ġ'\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy End Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext End Ġ= Ġs End ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠĠĠĠĠ Ġ// ĠReser ve Ġvertices Ġfor Ġremaining Ġworse Ġcase Ġ( over - re serving Ġis Ġuseful Ġand Ġeasily Ġam ort ized ) ĊĠĠĠĠĠĠĠ Ġval Ġv tx Count Max Ġ= Ġ( text End Ġ- Ġs ) Ġ* Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġidx Count Max Ġ= Ġ( text End Ġ- Ġs ) Ġ* Ġ 6 ĊĠĠĠĠĠĠĠ Ġval Ġidx Expected Size Ġ= Ġdraw List . idx Buffer . size Ġ+ Ġidx Count Max ĊĠĠĠĠĠĠĠ Ġdraw List . prim Reserve ( idx Count Max , Ġv tx Count Max ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġv tx Write Ġ= Ġdraw List ._ v tx Write Ptr ĊĠĠĠĠĠĠĠ Ġvar Ġidx Write Ġ= Ġdraw List ._ idx Write Ptr ĊĠĠĠĠĠĠĠ Ġvar Ġv tx Current Idx Ġ= Ġdraw List ._ v tx Current Idx ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( s Ġ< Ġtext End ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Wrap Enabled ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠCalculate Ġhow Ġfar Ġwe Ġcan Ġrender . ĠRequires Ġtwo Ġpasses Ġon Ġthe Ġstring Ġdata Ġbut Ġkeeps Ġthe Ġcode Ġsimple ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġnot Ġintr usive Ġfor Ġwhat 's Ġessentially Ġan Ġun common Ġfeature . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Wrap E ol Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Wrap E ol Ġ= Ġcalc Word Wrap Position A ( scale , Ġtext , Ġs , Ġtext End , Ġwrap Width Ġ- Ġ( x Ġ- Ġpos . x )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠWrap _ width Ġis Ġtoo Ġsmall Ġto Ġfit Ġanything . ĠForce Ġdisplaying Ġ 1 Ġcharacter Ġto Ġminimize Ġthe Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis continu ity . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Wrap E ol Ġ== Ġs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ+ 1 Ġmay Ġnot Ġbe Ġa Ġcharacter Ġstart Ġpoint Ġin ĠUTF - 8 Ġbut Ġit 's Ġok Ġbecause Ġwe Ġuse Ġs Ġ>= Ġword Wrap E ol Ġbelow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Wrap E ol ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Ġ>= Ġword Wrap E ol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġpos . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Wrap E ol Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWr apping Ġskip s Ġupcoming Ġbl anks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( s Ġ< Ġtext End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtext [ s ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . isBlank A ) Ġs ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( c Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecode Ġand Ġadvance Ġsource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġtext [ s ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠJVM Ġimg ui Ġspecific , Ġnot Ġ 0 x 8 0 Ġbecause Ġon Ġj vm Ġwe Ġhave ĠUnicode Ġwith Ġsur rog ates Ġcharacters Ġ( instead Ġof Ġutf 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttps :// www . ibm . com / developer works / library / j - unicode / index . html ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ< ĠChar . MIN _ HIGH _ SUR RO GATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Prob ab ily Ġsur rogate Ġcharacter ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ+= Ġtext Char From Utf 8 (& Ġc , Ġs , Ġtext _ end ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ 0 ) Ġ// ĠMal formed ĠUTF - 8 ? Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ< Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġpos . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ> Ġclip Rect . w ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak Ġ// Ġbreak Ġout Ġof Ġmain Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\ r ') Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchar Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglyph Ġ= Ġfind Glyph ( c ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( glyph Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Width Ġ= Ġglyph . advance X Ġ* Ġscale ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAr bitr arily Ġassume Ġthat Ġboth Ġspace Ġand Ġtabs Ġare Ġempty Ġglyph s Ġas Ġan Ġoptimization ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġ' Ġ' Ġ&& Ġc Ġ!= Ġ'\ t ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠWe Ġdon 't Ġdo Ġa Ġsecond Ġfin er Ġclipping Ġtest Ġon Ġthe ĠY Ġaxis Ġas Ġwe 've Ġalready Ġskipped Ġanything Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclip Rect . y Ġand Ġexit Ġonce Ġwe Ġpass Ġclip Rect . w ĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx 1 Ġ= Ġx Ġ+ Ġglyph . x 0 Ġ* Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx 2 Ġ= Ġx Ġ+ Ġglyph . x 1 Ġ* Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy 1 Ġ= Ġy Ġ+ Ġglyph . y 0 Ġ* Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy 2 Ġ= Ġy Ġ+ Ġglyph . y 1 Ġ* Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x 1 Ġ<= Ġclip Rect . z Ġ&& Ġx 2 Ġ>= Ġclip Rect . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRender Ġa Ġcharacter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġu 1 Ġ= Ġglyph . u 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv 1 Ġ= Ġglyph . v 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġu 2 Ġ= Ġglyph . u 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv 2 Ġ= Ġglyph . v 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠCPU Ġside Ġclipping Ġused Ġto Ġfit Ġtext Ġin Ġtheir Ġframe Ġwhen Ġthe Ġframe Ġis Ġtoo Ġsmall . ĠOnly Ġdoes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclipping Ġfor Ġaxis Ġaligned Ġqu ads . ĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cpu F ine Clip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x 1 Ġ< Ġclip Rect . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu 1 Ġ+= Ġ( 1 f Ġ- Ġ( x 2 Ġ- Ġclip Rect . x ) Ġ/ Ġ( x 2 Ġ- Ġx 1 )) Ġ* Ġ( u 2 Ġ- Ġu 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx 1 Ġ= Ġclip Rect . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y 1 Ġ< Ġclip Rect . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġ+= Ġ( 1 f Ġ- Ġ( y 2 Ġ- Ġclip Rect . y ) Ġ/ Ġ( y 2 Ġ- Ġy 1 )) Ġ* Ġ( v 2 Ġ- Ġv 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy 1 Ġ= Ġclip Rect . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x 2 Ġ> Ġclip Rect . z ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu 2 Ġ= Ġu 1 Ġ+ Ġ(( clip Rect . z Ġ- Ġx 1 ) Ġ/ Ġ( x 2 Ġ- Ġx 1 )) Ġ* Ġ( u 2 Ġ- Ġu 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx 2 Ġ= Ġclip Rect . z ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y 2 Ġ> Ġclip Rect . w ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 Ġ= Ġv 1 Ġ+ Ġ(( clip Rect . w Ġ- Ġy 1 ) Ġ/ Ġ( y 2 Ġ- Ġy 1 )) Ġ* Ġ( v 2 Ġ- Ġv 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy 2 Ġ= Ġclip Rect . w ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y 1 Ġ>= Ġy 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġchar Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠWe Ġare ĠNOT Ġcalling ĠPrim Rect UV () Ġhere Ġbecause Ġnon - in lined Ġcauses Ġtoo Ġmuch Ġoverhead Ġin Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġbuilds . ĠIn lined Ġhere : ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( draw List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer [ idx Write Ġ+ Ġ 0 ] Ġ= Ġv tx Current Idx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer [ idx Write Ġ+ Ġ 1 ] Ġ= Ġv tx Current Idx Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer [ idx Write Ġ+ Ġ 2 ] Ġ= Ġv tx Current Idx Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer [ idx Write Ġ+ Ġ 3 ] Ġ= Ġv tx Current Idx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer [ idx Write Ġ+ Ġ 4 ] Ġ= Ġv tx Current Idx Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer [ idx Write Ġ+ Ġ 5 ] Ġ= Ġv tx Current Idx Ġ+ Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 0 ]. pos . x Ġ= Ġx 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 0 ]. pos . y Ġ= Ġy 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 0 ]. col Ġ= Ġcol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 0 ]. uv . x Ġ= Ġu 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 0 ]. uv . y Ġ= Ġv 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 1 ]. pos . x Ġ= Ġx 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 1 ]. pos . y Ġ= Ġy 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 1 ]. col Ġ= Ġcol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 1 ]. uv . x Ġ= Ġu 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 1 ]. uv . y Ġ= Ġv 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 2 ]. pos . x Ġ= Ġx 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 2 ]. pos . y Ġ= Ġy 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 2 ]. col Ġ= Ġcol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 2 ]. uv . x Ġ= Ġu 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 2 ]. uv . y Ġ= Ġv 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 3 ]. pos . x Ġ= Ġx 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 3 ]. pos . y Ġ= Ġy 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 3 ]. col Ġ= Ġcol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 3 ]. uv . x Ġ= Ġu 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer [ v tx Write Ġ+ Ġ 3 ]. uv . y Ġ= Ġv 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Write Ġ+= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Current Idx Ġ+= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Write Ġ+= Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġchar Width ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGive Ġback Ġunused Ġvertices ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġv tx Write Ġuntil Ġdraw List . v tx Buffer . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw List . v tx Buffer . remove At ( draw List . v tx Buffer . last Index ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġidx Write Ġuntil Ġdraw List . idx Buffer . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw List . idx Buffer . remove At ( draw List . idx Buffer . last Index ) ĊĠĠĠĠĠĠĠ Ġdraw List . cmd Buffer . last (). elem Count Ġ-= Ġ( idx Expected Size Ġ- Ġdraw List . idx Buffer . size ) ĊĠĠĠĠĠĠĠ Ġdraw List ._ v tx Write Ptr Ġ= Ġv tx Write ĊĠĠĠĠĠĠĠ Ġdraw List ._ idx Write Ptr Ġ= Ġidx Write ĊĠĠĠĠĠĠĠ Ġdraw List ._ v tx Current Idx Ġ= Ġdraw List . v tx Buffer . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ[ Internal ] ĊĊĠĠĠ Ġprivate Ġfun Ġgrow Index ( new Size : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( index Advance X . size Ġ== Ġindex Lookup . size ) ĊĠĠĠĠĠĠĠ Ġif Ġ( new Size Ġ<= Ġindex Lookup . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindex Lookup . size Ġuntil Ġnew Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Advance X Ġ+= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Lookup Ġ+= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġx 0 / y 0 / x 1 / y 1 Ġare Ġoffset Ġfrom Ġthe Ġcharacter Ġupper - left Ġlayout Ġposition , Ġin Ġpixels . ĠTherefore Ġx 0 / y 0 Ġare Ġoften Ġfairly Ġclose Ġto Ġzero . ĊĠĠĠĠ Ġ* Ġ ĠNot Ġto Ġbe Ġmist aken Ġwith Ġtexture Ġcoordinates , Ġwhich Ġare Ġheld Ġby Ġu 0 / v 0 / u 1 / v 1 Ġin Ġnormalized Ġformat Ġ( 0 . 0 .. 1 . 0 Ġon Ġeach Ġtexture Ġaxis ). Ġ*/ ĊĠĠĠ Ġfun Ġadd Glyph ( code point : ĠInt , Ġx 0 : ĠFloat , Ġy 0 : ĠFloat , Ġx 1 : ĠFloat , Ġy 1 : ĠFloat , Ġu 0 : ĠFloat , Ġv 0 : ĠFloat , Ġu 1 : ĠFloat , Ġv 1 : ĠFloat , Ġadvance X : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġglyph Ġ= ĠFont Glyph () ĊĠĠĠĠĠĠĠ Ġglyph s Ġ+= Ġglyph ĊĠĠĠĠĠĠĠ Ġglyph . code point Ġ= Ġcode point . to Char () ĊĠĠĠĠĠĠĠ Ġglyph . x 0 Ġ= Ġx 0 ĊĠĠĠĠĠĠĠ Ġglyph . y 0 Ġ= Ġy 0 ĊĠĠĠĠĠĠĠ Ġglyph . x 1 Ġ= Ġx 1 ĊĠĠĠĠĠĠĠ Ġglyph . y 1 Ġ= Ġy 1 ĊĠĠĠĠĠĠĠ Ġglyph . u 0 Ġ= Ġu 0 ĊĠĠĠĠĠĠĠ Ġglyph . v 0 Ġ= Ġv 0 ĊĠĠĠĠĠĠĠ Ġglyph . u 1 Ġ= Ġu 1 ĊĠĠĠĠĠĠĠ Ġglyph . v 1 Ġ= Ġv 1 ĊĠĠĠĠĠĠĠ Ġglyph . advance X Ġ= Ġadvance X Ġ+ Ġconfig Data [ 0 ]. glyph Extra Spacing . x Ġ Ġ// ĠB ake Ġspacing Ġinto Ġx Advance ĊĊĠĠĠĠĠĠĠ Ġif Ġ( config Data [ 0 ]. pixel Snap H ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglyph . advance X Ġ= Ġ( glyph . advance X Ġ+ Ġ 0 . 5 f ). i . f ĊĠĠĠĠĠĠĠ Ġ// ĠCompute Ġrough Ġsurface Ġusage Ġmetrics Ġ(+ 1 Ġto Ġaccount Ġfor Ġaverage Ġpadding , Ġ+ 0 . 9 9 Ġto Ġround ) ĊĠĠĠĠĠĠĠ Ġdirty Lookup Tables Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmetrics Total Surface Ġ+= Ġ(( glyph . u 1 Ġ- Ġglyph . u 0 ) Ġ* Ġcontainer Atlas . tex Size . x Ġ+ Ġ 1 . 9 9 f ). i Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( glyph . v 1 Ġ- Ġglyph . v 0 ) Ġ* Ġcontainer Atlas . tex Size . y Ġ+ Ġ 1 . 9 9 f ). i ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠMakes Ġ' dst ' Ġcharacter / glyph Ġpoints Ġto Ġ' src ' Ġcharacter / glyph . ĠCurrently Ġneeds Ġto Ġbe Ġcalled ĠAFTER Ġfonts Ġhave Ġbeen Ġbuilt . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġadd Rem ap Char ( dst : ĠInt , Ġsrc : ĠInt , Ġoverwrite Dst : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCurrently Ġthis Ġcan Ġonly Ġbe Ġcalled ĠAFTER Ġthe Ġfont Ġhas Ġbeen Ġbuilt , Ġa ka Ġafter Ġcalling ĠIm Font Atlas :: Get Tex Data As * () Ġfunction . ĊĠĠĠĠĠĠĠ Ġassert ( index Lookup . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġindex Size Ġ= Ġindex Lookup . size ĊĊĠĠĠĠĠĠĠ Ġif Ġ( dst Ġ< Ġindex Size Ġ&& Ġindex Lookup [ dst ] Ġ== Ġ- 1 Ġ&& Ġ! overwrite Dst ) Ġ// Ġ' dst ' Ġalready Ġexists ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( src Ġ>= Ġindex Size Ġ&& Ġdst Ġ>= Ġindex Size ) Ġ// Ġboth Ġ' dst ' Ġand Ġ' src ' Ġdon 't Ġexist Ġ-> Ġno - op ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġgrow Index ( dst Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġindex Lookup [ dst ] Ġ= Ġindex Lookup . getOrElse ( src ) Ġ{ Ġ- 1 Ġ} ĊĠĠĠĠĠĠĠ Ġindex Advance X [ dst ] Ġ= Ġindex Advance X . getOrElse ( src ) Ġ{ Ġ 1 f Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetCurrent () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( is Loaded ) Ġ{ Ġ" Font ĠAtlas Ġnot Ġcreated . ĠDid Ġyou Ġcall Ġio . Fonts -> Get Tex Data As RGBA 3 2 Ġ/ ĠGet Tex Data As Alpha 8 Ġ? " Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( scale Ġ> Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġg . font Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġg . font Base Size Ġ= Ġio . font Global Scale Ġ* Ġg . font . fontSize Ġ* Ġg . font . scale ĊĠĠĠĠĠĠĠ Ġg . fontSize Ġ= Ġg . current Window ?. calc FontSize () Ġ?: Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġval Ġatlas Ġ= Ġg . font . container Atlas ĊĠĠĠĠĠĠĠ Ġg . draw List Shared Data . tex Uv White Pixel Ġput Ġatlas . tex Uv White Pixel ĊĠĠĠĠĠĠĠ Ġg . draw List Shared Data . font Ġ= Ġg . font ĊĠĠĠĠĠĠĠ Ġg . draw List Shared Data . fontSize Ġ= Ġg . fontSize ĊĠĠĠ Ġ} Ċ }