package Ġimg ui . font Ċ Ċ import Ġgli _. has Ċ import Ġimg ui . UNICODE _ CODE POINT _ MAX Ċ import Ġk ool . BYTES Ċ Ċ /** ĠHelper Ġto Ġbuild Ġglyph Ġranges Ġfrom Ġtext / string Ġdata . ĠFeed Ġyour Ġapplication Ġstrings / characters Ġto Ġit Ġthen Ġcall ĠBuild Ranges (). Ċ Ġ* Ġ ĠThis Ġis Ġessentially Ġa Ġtight ly Ġpacked Ġof Ġvector Ġof Ġ 6 4 k Ġb ooleans Ġ= Ġ 8 KB Ġstorage . Ġ*/ Ċ class ĠFont Glyph Ranges Builder Ġ{ ĊĠĠĠ Ġ/** ĠStore Ġ 1 - bit Ġper ĠUnicode Ġcode Ġpoint Ġ( 0 = unused , Ġ 1 = used ) Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġused Chars : ĠInt Array ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize InBytes Ġ= Ġ( UNICODE _ CODE POINT _ MAX Ġ+ Ġ 1 ) Ġ/ Ġ 8 ĊĠĠĠĠĠĠĠ Ġused Chars Ġ= ĠInt Array ( size InBytes Ġ/ ĠInt . BYTES ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGet Ġbit Ġn Ġin Ġthe Ġarray Ġ*/ ĊĠĠĠ Ġfun Ġget Bit ( n : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoff Ġ= Ġn Ġshr Ġ 5 ĊĠĠĠĠĠĠĠ Ġval Ġmask Ġ= Ġ 1 Ġshl Ġ( n Ġand Ġ 3 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġused Chars [ off ] Ġhas Ġmask ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSet Ġbit Ġn Ġin Ġthe Ġarray Ġ*/ ĊĠĠĠ Ġfun Ġset Bit ( n : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoff Ġ= Ġn Ġshr Ġ 5 ĊĠĠĠĠĠĠĠ Ġval Ġmask Ġ= Ġ 1 Ġshl Ġ( n Ġand Ġ 3 1 ) ĊĠĠĠĠĠĠĠ Ġused Chars [ off ] Ġ= Ġused Chars [ off ] Ġor Ġmask ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAdd Ġcharacter Ġ*/ ĊĠĠĠ Ġfun Ġadd Char ( c : ĠInt ) Ġ= Ġset Bit ( c ) ĊĠĠĠ Ġ/** ĠAdd Ġstring Ġ( each Ġcharacter Ġof Ġthe ĠUTF - 8 Ġstring Ġare Ġadded ) Ġ*/ Ċ // ĠĠĠ Ġfun Ġ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 Ġ<= ĠIM _ UNICODE _ CODE POINT _ MAX ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAdd Char (( Im W char ) c ); Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAdd Ġranges , Ġe . g . Ġbuilder . Add Ranges ( Im Font Atlas :: Get Glyph Ranges Default ()) Ġto Ġforce Ġadd Ġall Ġof ĠASCII / Latin + Ext Ġ*/ ĊĠĠĠ Ġfun Ġadd Ranges ( ranges : ĠArray < Int Range >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( range Ġin Ġranges ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġrange ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Char ( c ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠOutput Ġnew Ġranges Ġ*/ ĊĠĠĠ Ġfun Ġbuild Ranges (): ĠArray < Int Range > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Code point Ġ= ĠUNICODE _ CODE POINT _ MAX ĊĠĠĠĠĠĠĠ Ġval Ġout Ranges Ġ= ĠArrayList < Int >() ĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( n Ġ<= Ġmax Code point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Bit ( n )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Ranges Ġ+= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( n Ġ< Ġmax Code point Ġ&& Ġget Bit ( n Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Ranges Ġ+= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġout Ranges . size Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġreturn ĠArray ( size ) Ġ{ ĠInt Range ( out Ranges [ it Ġ* Ġ 2 ], Ġout Ranges [ it Ġ* Ġ 2 Ġ+ Ġ 1 ]) Ġ} ĊĠĠĠ Ġ} Ċ }