package Ġcom . mind forge . graphics . android Ċ Ċ import Ġandroid . content . res . Resources Ċ import Ġjava . util . HashMap Ċ import Ġjava . io . InputStream Reader Ċ import Ġandroid . opengl . GLES 2 0 Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . opengl . GL Utils Ċ import Ġcom . mind forge . app . R Ċ import Ġcom . mind forge . graphics .* Ċ import Ġcom . mind forge . graphics . math . Shape Ċ import Ġjava . util . ArrayList Ċ Ċ // TODO : Ġ" override Ġval Ġoriginal " Ġinst ad Ġof Ġ" val Ġoriginal Text Element Ġ Ġ( runtime Ġcompiler Ġbar f ) Ċ class ĠGl Text Element ( val Ġoriginal Text Element : ĠText Element , Ġscreen : ĠGl Screen ) Ġ: ĠText Element , ĠGl Colo red Element < String >( original Text Element , Ġscreen ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġshader Ġ= Ġscreen . font Shader ĊĠĠĠ Ġoverride Ġval Ġshape : ĠGl Glyph s Ġget () Ġ= Ġsuper < Gl Colo red Element >. shape Ġas ĠGl Glyph s ĊĠĠĠ Ġoverride Ġval Ġfont : ĠGl Font Ġget () Ġ= Ġgl Font ( original Text Element . font ) ĊĠĠĠ Ġoverride Ġval Ġline Height : ĠFloat Ġget () Ġ= Ġoriginal Text Element . line Height . toFloat () ĊĠĠĠ Ġoverride Ġval Ġfill : ĠFill Ġget () Ġ= Ġoriginal Text Element . fill ĊĠĠĠ Ġoverride Ġval Ġcontent : ĠString Ġget () Ġ= Ġoriginal Text Element . content Ċ } Ċ Ċ class ĠGl Font ( resources : ĠResources ) Ġ: ĠFont Ġ{ ĊĊĠĠĠ Ġclass ĠPage ( val Ġid : ĠInt , Ġval Ġfile : ĠString ) ĊĠĠĠ Ġclass ĠGlyph ( val Ġid : ĠInt , Ġval Ġx : ĠInt , Ġval Ġy : ĠInt , Ġval Ġwidth : ĠInt , Ġval Ġheight : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Offset : ĠInt , Ġval Ġy Offset : ĠInt , Ġval Ġx Advance : ĠInt , Ġval Ġpage : ĠInt ) ĊĊĠĠĠ Ġval Ġpages Ġ= ĠHashMap < Int , ĠPage >() ĊĠĠĠ Ġval Ġglyph s Ġ= ĠHashMap < Char , ĠGlyph >() ĊĠĠĠ Ġval Ġker nings Ġ= ĠHashMap < Int , ĠHashMap < Int , ĠInt >>() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġresources . open Raw Resource ( R . raw . robot o _ regular ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠInputStreamReader ( stream , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . forEach Line Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġ( it . split (' Ġ') Ġfilter Ġ{ Ġit . any () Ġ}). toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entries . any ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġentries [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġ( entries Ġdrop Ġ 1 Ġmap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrings Ġ= Ġit . split (" =". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( strings . first (), Ġstrings . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġuse Ġ" when " Ġinstead Ġ( cause s Ġcompiler Ġbar f Ġright Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġvalues [" id "] ?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tag Ġ== Ġ(" page ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpages . put ( id , ĠPage ( id , Ġvalues [" file "] Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( tag Ġ== Ġ(" char ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglyph s . put ( id . to Char (), ĠGlyph ( id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [" x "] ?. toInt () Ġ?: Ġ 0 , Ġvalues [" y "] ?. toInt () Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [" width "] ?. toInt () Ġ?: Ġ 0 , Ġvalues [" height "] ?. toInt () Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [" x offset "] ?. toInt () Ġ?: Ġ 0 , Ġvalues [" y offset "] ?. toInt () Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [" x advance "] ?. toInt () Ġ?: Ġ 0 , Ġvalues [" page "] ?. toInt () Ġ?: Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( tag Ġ== Ġ(" ker ning ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġvalues [" first "] ?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Ġ= Ġvalues [" second "] ?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġamount Ġ= Ġvalues [" amount "] ?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġker nings . get Or Put ( first ) Ġ{ Ġ-> ĠHashMap < Int , ĠInt >() Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . put ( second , Ġamount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtexture Names : ĠInt Array Ġ= ĠInt Array ( 1 ); ĊĠĠĠ Ġval Ġtexture Name : ĠInt Ġget () Ġ= Ġtexture Names [ 0 ] ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Textures ( texture Names . size (), Ġtexture Names , Ġ 0 ); ĊĠĠĠĠĠĠĠ Ġval Ġbmp Ġ= ĠBitmap Factory . decode Resource ( resources , ĠR . drawable . robot o _ regular ) !! ; ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġtexture Name ); ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġfiltering ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ MIN _ FILTER , ĠGLES 2 0 . GL _ LINEAR _ MIP MAP _ LINEAR ); ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ MAG _ FILTER , ĠGLES 2 0 . GL _ LINEAR ); ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġbitmap Ġinto Ġthe Ġbound Ġtexture . ĊĠĠĠĠĠĠĠ ĠGL Utils . tex Image 2 D ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġ 0 , Ġbmp , Ġ 0 ); ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Generate Mip map ( GLES 2 0 . GL _ TEXTURE _ 2 D ); ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġdone Ġusing Ġthe Ġbitmap Ġso Ġwe Ġshould Ġre cycle Ġit . ĊĠĠĠĠĠĠĠ Ġbmp . recycle (); ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshape ( text : ĠString , Ġline Height : ĠNumber ): ĠText Shape Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGl Glyph s ( this , Ġtext , Ġline Height . toFloat ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġgl Font ( original : ĠFont ): ĠGl Font Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( original ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠGl Font Ġ-> Ġoriginal ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" No ĠOpenGL Ġimplementation Ġfor Ġfont Ġ'${ original }'. ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠGl Glyph s ( val Ġfont : ĠGl Font , Ġoverride Ġval Ġtext : ĠString , Ġoverride Ġval Ġline Height : ĠFloat ) Ġ: ĠGl Shape (), ĠText Shape Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtexture Name : ĠInt Ġ= Ġfont . texture Name ĊĠĠĠ Ġoverride Ġval Ġvertex Coordinates Ġ= ĠFloat Array ( text . length () Ġ* Ġ 2 Ġ* Ġ 4 ) ĊĠĠĠ Ġoverride Ġval Ġtexture Coordinates Ġ= ĠFloat Array ( text . length () Ġ* Ġ 2 Ġ* Ġ 4 ) ĊĠĠĠ Ġoverride Ġval Ġdraw Order Ġ= ĠShort Array ( text . length () Ġ* Ġ 6 ) ĊĠĠĠ Ġoverride Ġval ĠglVertex Mode : ĠInt Ġ= ĠGLES 2 0 . GL _ TRI ANG LES ĊĊĠĠĠ Ġoverride Ġval Ġlines Ġ= ĠArrayList < Line Shape >() ĊĊĠĠĠ Ġ// TODO : Ġread Ġthese Ġfrom Ġtexture Ġfile ĊĠĠĠ Ġval Ġtemplate Size Ġ= Ġ 4 0 ĊĠĠĠ Ġval Ġtexture Size Ġ= Ġ 1 0 2 4 ĊĠĠĠ Ġval Ġtemplate Baseline Ġ= Ġ 6 . 0 f ĊĊĠĠĠ Ġoverride Ġval Ġbaseline Ġ= Ġtemplate Baseline Ġ* Ġline Height Ġ/ Ġtemplate Size ĊĊĠĠĠ Ġ// TODO Ġ( Y AG NI ?) ĊĠĠĠ Ġoverride Ġval Ġleading Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġic Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġit Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġn : ĠShort Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Vertex ( x : ĠFloat , Ġy : ĠFloat , Ġtx : ĠFloat , Ġty : ĠFloat ): ĠShort Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Coordinates [ ic ++] Ġ= Ġx Ġ* Ġline Height Ġ/ Ġtemplate Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Coordinates [ ic ++] Ġ= Ġy Ġ* Ġline Height Ġ/ Ġtemplate Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtexture Coordinates [ it ++] Ġ= Ġtx Ġ/ Ġtexture Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtexture Coordinates [ it ++] Ġ= Ġty Ġ/ Ġtexture Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġn ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfun Ġadd Quad ( x : ĠFloat , Ġy : ĠFloat , Ġw : ĠFloat , Ġh : ĠFloat , Ġtx : ĠFloat , Ġty : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbl Ġ= Ġadd Vertex ( x , Ġy , Ġtx , Ġty Ġ+ Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbr Ġ= Ġadd Vertex ( x Ġ+ Ġw , Ġy , Ġtx Ġ+ Ġw , Ġty Ġ+ Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtr Ġ= Ġadd Vertex ( x Ġ+ Ġw , Ġy Ġ+ Ġh , Ġtx Ġ+ Ġw , Ġty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtl Ġ= Ġadd Vertex ( x , Ġy Ġ+ Ġh , Ġtx , Ġty ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Order [ id ++] Ġ= Ġbl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Order [ id ++] Ġ= Ġbr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Order [ id ++] Ġ= Ġtl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Order [ id ++] Ġ= Ġtr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Order [ id ++] Ġ= Ġtl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Order [ id ++] Ġ= Ġbr ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Line ( width : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( object Ġ: ĠLine Shape Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġwidth Ġ= Ġwidth Ġ* Ġline Height Ġ/ Ġtemplate Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcontains ( location : ĠVector 2 ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . x . toFloat Ġ() Ġ< Ġwidth Ġ&& Ġ( location . y . toFloat Ġ() Ġ+ Ġbaseline ) Ġ< Ġline Height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcx Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġcy Ġ= Ġtemplate Baseline ĊĠĠĠĠĠĠĠ Ġfor Ġ( char Ġin Ġtext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglyph Ġ= Ġfont . glyph s [ char ] Ġ?: Ġfont . glyph s [' Ġ'] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġcx Ġ+ Ġglyph . x Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġcy Ġ- Ġglyph . height Ġ- Ġglyph . y Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġglyph . width . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġglyph . height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġglyph . x . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġty Ġ= Ġglyph . y . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Quad ( x , Ġy , Ġw , Ġh , Ġtx , Ġty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcx Ġ+= Ġglyph . x Advance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġ 1 0 . to Char ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line ( cx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcx Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcy Ġ-= Ġtemplate Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġadd Ġleading Ġ( Y AG NI ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Line ( cx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbox Ġ= Ġgl Shape ( super < Text Shape >. box ()) ĊĠĠĠ Ġ// TODO Ġwhy Ġoverride ? ĊĠĠĠ Ġ// override Ġfun Ġbox () Ġ= Ġbox ĊĊĠĠĠ Ġ// ĠTODO : Ġshould Ġtechnically Ġtest Ġfor Ġthe Ġexact Ġtext Ġshape , Ġbut ĠY AG NI ĊĠĠĠ Ġoverride Ġfun Ġcontains ( location : ĠVector 2 ) Ġ= Ġbox . contains ( location ) Ċ Ċ }