package Ġcom . time path . hl 2 . io . font ĊĊ Ċ import Ġcom . time path . Logger Ċ import Ġjava . awt . Rectangle Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . logging . Level Ċ Ċ /** Ċ Ġ* ĠVal ve ĠBitmap ĠFont Ċ Ġ* Ġ@ see Ġ[ https :// github . com / Val ve Software / source - sdk - 2 0 1 3 / blob / master / mp / src / public / Bitmap Font File . h ]( null ) Ċ Ġ* Ġ@ see Ġ[ https :// github . com / L est a D / Source Engine 2 0 0 7 / blob / master / src _ main / utils / x box / Font Maker / glyph s . cpp ]( null ) Ċ Ġ*/ Ċ public Ġclass ĠV BF () Ġ{ ĊĠĠĠ Ġval Ġglyph s : ĠMutable List < Bitmap Glyph > Ġ= ĠArrayList ( 1 ) ĊĠĠĠ Ġ/** ĠMaps Ġcharacters Ġto Ġthe Ġglyph Ġtable Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġtable : ĠByteArray Ġ= ĠByteArray ( 2 5 6 ) ĊĠĠĠ Ġprivate Ġvar Ġas cent : ĠShort Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġstyle Ġflags ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBF _ BOLD Ġ= Ġ 0 x 0 0 0 1 ĊĠĠĠĠ Ġ* ĠBF _ ITAL IC Ġ= Ġ 0 x 0 0 0 2 ĊĠĠĠĠ Ġ* ĠBF _ OUT LIN ED Ġ= Ġ 0 x 0 0 0 4 ĊĠĠĠĠ Ġ* ĠBF _ DROP SH ADOW Ġ= Ġ 0 x 0 0 0 8 ĊĠĠĠĠ Ġ* ĠBF _ BL UR RED Ġ= Ġ 0 x 0 0 1 0 ĊĠĠĠĠ Ġ* ĠBF _ SCAN LINES Ġ= Ġ 0 x 0 0 2 0 ĊĠĠĠĠ Ġ* ĠBF _ ANTI ALI ASE D Ġ= Ġ 0 x 0 0 4 0 ĊĠĠĠĠ Ġ* ĠBF _ CUSTOM Ġ= Ġ 0 x 0 0 8 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġflags : ĠShort Ġ= Ġ 0 ĊĠĠĠ Ġpublic Ġvar Ġheight : ĠShort Ġ= Ġ 0 ĊĠĠĠ Ġpublic Ġvar Ġwidth : ĠShort Ġ= Ġ 0 ĊĊĠĠĠ Ġthrows ( IOException :: class ) ĊĠĠĠ Ġpublic Ġconstructor ( input : ĠInputStream ) Ġ: Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠByteArray ( input . available ()) Ġ// ĠXXX : ĠTODO ĊĠĠĠĠĠĠĠ Ġinput . read ( array ) ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠByteBuffer . wrap ( array ) ĊĠĠĠĠĠĠĠ Ġbuf . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġbuf . getInt () ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġbuf . getInt () ĊĠĠĠĠĠĠĠ Ġwidth Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠ Ġheight Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠ Ġval Ġmax Char Width Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠ Ġval Ġmax Char Height Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠ Ġflags Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠ Ġas cent Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġnumber Ġis Ġ 1 Ġhigher Ġbecause Ġthere Ġis Ġa Ġ' default ' Ġglyph ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġnum Glyph s Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠ Ġbuf . get ( table ) ĊĠĠĠĠĠĠĠ Ġ// ĠBitmap Glyph Ġ@ Ġoffset Ġ 2 7 8 ĊĠĠĠĠĠĠĠ Ġ( glyph s Ġas ? ĠArrayList )?. let Ġ{ Ġit . ensure Capacity ( num Glyph s . toInt ()) Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. num Glyph s Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg Ġ= ĠBitmap Glyph () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . index Ġ= Ġi . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . bounds Ġ= ĠRectangle ( buf . get Short (). toInt (), Ġbuf . get Short (). toInt (), Ġbuf . get Short (). toInt (), Ġbuf . get Short (). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . a Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . b Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . c Ġ= Ġbuf . get Short () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglyph s . add ( g ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠDebug ging ĊĠĠĠĠĠĠĠ Ġval Ġdbg Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Header Ġ= Ġ", Ġid ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Version Ġ= Ġ", Ġversion ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Width Ġ= Ġ", Ġwidth ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Height Ġ= Ġ", Ġheight ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Max Char Width Ġ= Ġ", Ġmax Char Width ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Max Char Height Ġ= Ġ", Ġmax Char Height ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Flags Ġ= Ġ", Ġflags ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Asc ent Ġ= Ġ", Ġas cent ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" Total Ġ= Ġ", Ġnum Glyph s ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ( 0 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdbg . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġdbg [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġdbg . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLOG . fine ({ Ġsb . toString () Ġ}) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtable . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglyph Index Ġ= Ġtable [ i ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( glyph Index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġcare Ġabout Ġthe Ġdefault Ġglyph ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg Ġ= Ġglyph s . get ( glyph Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . log ( Level . F INE , Ġ{ Ġ"${ i }: Ġ(${ g . bounds })\ t ' {' ${ g . a }, Ġ${ g . b }, Ġ${ g . c } '} '" Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġcontains ( i : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( g Ġin Ġglyph s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( g . index . toInt () Ġ== Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġthrows ( IOException :: class ) ĊĠĠĠ Ġpublic Ġfun Ġsave ( output : ĠOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠByteBuffer . allocate ( 2 2 Ġ+ Ġ 2 5 6 Ġ+ Ġ( glyph s . size () Ġ* Ġ 1 4 )) ĊĠĠĠĠĠĠĠ Ġbuf . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠ Ġbuf . put Int ( BITMAP FONT _ ID ) ĊĠĠĠĠĠĠĠ Ġbuf . put Int ( BITMAP FONT _ VERSION ) ĊĠĠĠĠĠĠĠ Ġbuf . put Short ( width ) ĊĠĠĠĠĠĠĠ Ġbuf . put Short ( height ) ĊĠĠĠĠĠĠĠ Ġvar Ġmax Char Width : ĠShort Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġmax Char Height : ĠShort Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( glyph Ġin Ġglyph s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġglyph . bounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( r . width Ġ!= Ġ 0 ) Ġ&& Ġ( r . height Ġ!= Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Char Width Ġ= ĠMath . max ( max Char Width . toInt (), Ġr . width ). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Char Height Ġ= ĠMath . max ( max Char Height . toInt (), Ġr . height ). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuf . put Short ( max Char Width ) ĊĠĠĠĠĠĠĠ Ġbuf . put Short ( max Char Height ) ĊĠĠĠĠĠĠĠ Ġbuf . put Short ( flags ) ĊĠĠĠĠĠĠĠ Ġbuf . put Short ( as cent ) ĊĠĠĠĠĠĠĠ Ġbuf . put Short ( glyph s . size (). to Short ()) ĊĠĠĠĠĠĠĠ Ġbuf . put ( table ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( g Ġin Ġglyph s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġg . bounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . put Short ( b . x . to Short ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . put Short ( b . y . to Short ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġif Ġ(( b . height Ġ== Ġ 0 )) Ġ 0 Ġelse Ġb . width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġif Ġ(( b . width Ġ== Ġ 0 )) Ġ 0 Ġelse Ġb . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . put Short ( width . to Short ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . put Short ( height . to Short ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . put Short ( g . a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . put Short ( width . to Short ()) Ġ// ĠXXX : Ġwhy ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . put Short ( g . c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput . write ( buf . array ()) ĊĠĠĠĠĠĠĠ Ġoutput . flush () ĊĠĠĠĠĠĠĠ Ġoutput . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġb Ġseems Ġto Ġequal Ġbounds . width ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ source ]( https :// github . com / L est a D / Source Engine 2 0 0 7 / blob / master / src _ main / utils / x box / Font Maker / glyph s . cpp . L 1 4 0 7 ) ĊĠĠĠĠ Ġ* Ġ... ĊĠĠĠĠ Ġ* Ġ' ABC Ġstructure ' Ġis Ġa Ġthing ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ msdn ]( http :// msdn . microsoft . com / en - us / library / windows / desktop / dd 1 6 2 4 5 4 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġclass ĠBitmap Glyph ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġa : ĠShort Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġb : ĠShort Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġc : ĠShort Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġvar Ġbounds : ĠRectangle Ġ= ĠRectangle (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġvar Ġindex : ĠByte Ġ= Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"# $ index " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBIT MAP FONT _ ID Ġ= Ġ" VF NT ". map Indexed Ġ{ Ġi , Ġit Ġ-> Ġit . toInt () Ġshl Ġ( i Ġ* Ġ 8 ) Ġ}. fold ( 0 ) Ġ{ Ġp , Ġit Ġ-> Ġp Ġor Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBIT MAP FONT _ VERSION Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger () ĊĠĠĠ Ġ} Ċ } Ċ