/* Ċ # ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠQual comm ĠIn novation ĠCenter , ĠInc . Ċ # Ċ # ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ # Ġmodification , Ġare Ġpermitted Ġ( subject Ġto Ġthe Ġlimitations Ġin Ġthe Ċ # Ġdisclaimer Ġbelow ) Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ # Ċ # ĠĠĠ Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ċ # ĠĠĠĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ # Ċ # ĠĠĠ Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ċ # ĠĠĠĠĠ Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ċ # ĠĠĠĠĠ Ġdisclaimer Ġin Ġthe Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ċ # ĠĠĠĠĠ Ġwith Ġthe Ġdistribution . Ċ # Ċ # ĠĠĠ Ġ* ĠNeither Ġthe Ġname ĠQual comm ĠIn novation ĠCenter Ġnor Ġthe Ġnames Ġof Ġits Ċ # ĠĠĠĠĠ Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ċ # ĠĠĠĠĠ Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ # Ċ # ĠNO ĠEXPRESS ĠOR ĠIMPLIED ĠLICENSE S ĠTO ĠANY ĠPAR TY ' S ĠPAT ENT ĠRIGHT S ĠARE Ċ # ĠG RAN TED ĠBY ĠTHIS ĠLICENSE . ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT Ċ # ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED Ċ # ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF Ċ # ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . Ċ # ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR Ċ # ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL Ċ # ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE Ċ # ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ # ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER Ċ # ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR Ċ # ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN Ċ # ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ */ Ċ Ċ package Ġcom . example . android . camera 2 . video . overlay Ċ Ċ import Ġandroid . graphics .* Ċ import Ġandroid . opengl .* Ċ import Ġandroid . opengl . Matrix Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Surface Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . nio . Float Buffer Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Semaphore Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . math . round To Long Ċ Ċ enum Ġclass ĠOverlay Type Ġ{ ĊĠĠĠ ĠNone , ĠImage , ĠText , ĠDateTime , ĠRectangle Ċ } Ċ Ċ class ĠE gl Core Ġ{ ĊĠĠĠ Ġvar Ġe gl Display : ĠE GL Display Ġ= ĠE GL 1 4 . EGL _ NO _ DISPLAY ĊĠĠĠ Ġvar Ġe gl Context : ĠE GL Context Ġ= ĠE GL 1 4 . EGL _ NO _ CONTEXT ĊĠĠĠ Ġvar Ġe gl Surface : ĠE GL Surface Ġ= ĠE GL 1 4 . EGL _ NO _ SURFACE ĊĠĠĠ Ġprivate Ġvar Ġe gl Config : ĠE GL Config ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġe gl Display Ġ= ĠE GL 1 4 . e glGet Display ( EGL 1 4 . EGL _ DEFAULT _ DISPLAY ) ĊĠĠĠĠĠĠĠ Ġif Ġ( e gl Display Ġ== ĠE GL 1 4 . EGL _ NO _ DISPLAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" unable Ġto Ġget ĠE GL 1 4 Ġdisplay "); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! EGL 1 4 . e gl Initialize ( e gl Display , Ġversion , Ġ 0 , Ġversion , Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" unable Ġto Ġinitialize ĠE GL 1 4 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġattrib List Ġ= Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ RED _ SIZE , Ġ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ GREEN _ SIZE , Ġ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ BLUE _ SIZE , Ġ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ ALPHA _ SIZE , Ġ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ RENDER ABLE _ TYPE , ĠE GL 1 4 . EGL _ OPEN GL _ ES 2 _ BIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ NONE , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ NONE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġconfigs : ĠArray < EGL Config ?> Ġ= ĠarrayOf Null s < EGL Config >( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġnum Configs Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! EGL 1 4 . e gl Choose Config ( e gl Display , Ġattrib List , Ġ 0 , Ġconfigs , Ġ 0 , Ġconfigs . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Configs , Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" unable Ġto Ġfind ĠES 2 ĠE GL Ġconfig "); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġe gl Config Ġ= Ġconfigs [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġat tribs Ġ= Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ CONTEXT _ CLIENT _ VERSION , Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ NONE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġe gl Context Ġ= ĠE GL 1 4 . e gl Create Context ( e gl Display , Ġconfigs [ 0 ], ĠE GL 1 4 . EGL _ NO _ CONTEXT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat tribs , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġerror Ġ= ĠE GL 1 4 . e glGet Error () ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= ĠE GL 1 4 . EGL _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" e gl Create Context : ĠE GL Ġerror : Ġ$ error ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Current ( e gl Surface : ĠE GL Surface ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e gl Display Ġ=== ĠE GL 1 4 . EGL _ NO _ DISPLAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" make Current Ġwithout Ġdisplay ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! EGL 1 4 . e gl Make Current ( e gl Display , Ġe gl Surface , Ġe gl Surface , Ġe gl Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" e gl Make Current Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġswap Buffers ( e gl Surface : ĠE GL Surface ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠE GL 1 4 . e gl Swap Buffers ( e gl Display , Ġe gl Surface ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Presentation Time ( e gl Surface : ĠE GL Surface ?, Ġtimestamp : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ ĠE GL Ext . e gl Presentation Time ANDROID ( e gl Display , Ġe gl Surface , Ġtimestamp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Window Surface ( surface : ĠAny ): ĠE GL Surface Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( surface Ġ! is ĠSurface Ġ&& Ġsurface Ġ! is ĠSurface Texture ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" invalid Ġsurface : Ġ$ surface ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsurface Attribs Ġ= Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE GL 1 4 . EGL _ NONE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġe gl Surface Ġ= ĠE GL 1 4 . e gl Create Window Surface ( e gl Display , Ġe gl Config , Ġsurface , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Attribs , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" e gl Create Window Surface ") ĊĠĠĠĠĠĠĠ Ġif Ġ( e gl Surface Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" surface Ġwas Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġe gl Surface ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck E gl Error ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġerror Ġ= ĠE GL 1 4 . e glGet Error () ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= ĠE GL 1 4 . EGL _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( msg Ġ+ Ġ": ĠE GL Ġerror : Ġ 0 x " Ġ+ ĠInteger . to HexString ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġthis :: class . simple Name ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠOverlay Renderer Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġoverlay Vertices : ĠFloat Buffer ĊĠĠĠ Ġprivate Ġval Ġm vp Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠ Ġprivate Ġval Ġst Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠ Ġprivate Ġvar Ġprogram Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtexture ID Ġ= Ġ- 1 2 3 4 5 ĊĠĠĠ Ġprivate Ġvar Ġoverlay Texture Id Ġ= Ġ- 1 2 3 4 5 ĊĠĠĠ Ġprivate Ġvar Ġm vp Matrix Handle Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġst Matrix Handle Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġposition Handle Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtexture Handle Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġoverlay Texture Handle Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġoverlay Update Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġrotation Angle Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoverlay Image : ĠBitmap ĊĠĠĠ Ġprivate Ġvar Ġtype Overlay : ĠOverlay Type Ġ= ĠOverlay Type . None ĊĊĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverlay Vertices Ġ= ĠByteBuffer . allocate Direct ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertices Data . size Ġ* ĠFLOAT _ SIZE _ BYTES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. order ( Byte Order . native Order ()). as Float Buffer () ĊĠĠĠĠĠĠĠ Ġoverlay Vertices . put ( vertices Data ). position ( 0 ) ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( st Matrix , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġprogram Ġ= Ġcreate Program ( VERTEX _ SHADER , ĠFR AG MENT _ SHADER ) ĊĠĠĠĠĠĠĠ Ġif Ġ( program Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" failed Ġcreating Ġprogram ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġposition Handle Ġ= ĠGLES 2 0 . glGet Attrib Location ( program , Ġ" position ") ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glGet Attrib Location Ġa Position ") ĊĠĠĠĠĠĠĠ Ġif Ġ( position Handle Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġget Ġattrib Ġlocation Ġfor Ġposition ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtexture Handle Ġ= ĠGLES 2 0 . glGet Attrib Location ( program , Ġ" texture Coord ") ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glGet Attrib Location Ġa Texture Coord ") ĊĠĠĠĠĠĠĠ Ġif Ġ( texture Handle Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġget Ġattrib Ġlocation Ġfor Ġtexture Coord ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm vp Matrix Handle Ġ= ĠGLES 2 0 . glGet UniformLocation ( program , Ġ" mvp Matrix ") ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glGet UniformLocation Ġm vp Matrix ") ĊĠĠĠĠĠĠĠ Ġif Ġ( mvp Matrix Handle Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġget Ġattrib Ġlocation Ġfor Ġm vp Matrix ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst Matrix Handle Ġ= ĠGLES 2 0 . glGet UniformLocation ( program , Ġ" st Matrix ") ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glGet UniformLocation Ġst Matrix ") ĊĠĠĠĠĠĠĠ Ġif Ġ( st Matrix Handle Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġget Ġattrib Ġlocation Ġfor Ġst Matrix ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverlay Texture Handle Ġ= ĠGLES 2 0 . glGet UniformLocation ( program , Ġ" overlay Texture ") ĊĠĠĠĠĠĠĠ Ġif Ġ( overlay Texture Handle Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġget Ġattrib Ġlocation Ġfor Ġoverlay Texture ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtextures Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Textures ( 1 , Ġtextures , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtexture ID Ġ= Ġtextures [ 0 ] ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , Ġtexture ID ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glBind Texture Ġtexture ID ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter f ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , ĠGLES 2 0 . GL _ TEXTURE _ MIN _ FILTER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ NE ARE ST . toFloat ()) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter f ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , ĠGLES 2 0 . GL _ TEXTURE _ MAG _ FILTER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ LINEAR . toFloat ()) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ T , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl TexParameter ") ĊĊĠĠĠĠĠĠĠ Ġval Ġoverlay Textures Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Textures ( 1 , Ġoverlay Textures , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġoverlay Texture Id Ġ= Ġoverlay Textures [ 0 ] ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġoverlay Texture Id ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glBind Texture Ġoverlay Texture Id ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter f ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ MIN _ FILTER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ NE ARE ST . toFloat ()) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter f ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ MAG _ FILTER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ LINEAR . toFloat ()) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ T , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glGet UniformLocation Ġoverlay Texture ") ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Shader ( shader Type : ĠInt , Ġsource : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshader Ġ= ĠGLES 2 0 . gl Create Shader ( shader Type ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Create Shader Ġtype =$ shader Type ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Shader Source ( shader , Ġsource ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Compile Shader ( shader ) ĊĠĠĠĠĠĠĠ Ġval Ġcompiled Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glGet Shader iv ( shader , ĠGLES 2 0 . GL _ COMPILE _ STATUS , Ġcompiled , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( compiled [ 0 ] Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Could Ġnot Ġcompile Ġshader Ġ$ shader Type :") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Ġ" Ġ+ ĠGLES 2 0 . glGet Shader Info Log ( shader )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Delete Shader ( shader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshader Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġshader ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Program ( vertex Source : ĠString , Ġfragment Source : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvertex Shader : ĠInt Ġ= Ġload Shader ( GLES 2 0 . GL _ VERTEX _ SHADER , Ġvertex Source ) ĊĠĠĠĠĠĠĠ Ġif Ġ( vertex Shader Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpixel Shader : ĠInt Ġ= Ġload Shader ( GLES 2 0 . GL _ FRAGMENT _ SHADER , Ġfragment Source ) ĊĠĠĠĠĠĠĠ Ġif Ġ( pixel Shader Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġprogram Ġ= ĠGLES 2 0 . gl Create Program () ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Create Program ") ĊĠĠĠĠĠĠĠ Ġif Ġ( program Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Could Ġnot Ġcreate Ġprogram ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Attach Shader ( program , Ġvertex Shader ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Attach Shader ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Attach Shader ( program , Ġpixel Shader ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Attach Shader ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Link Program ( program ) ĊĠĠĠĠĠĠĠ Ġval Ġlink Status Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glGet Program iv ( program , ĠGLES 2 0 . GL _ LINK _ STATUS , Ġlink Status , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( link Status [ 0 ] Ġ!= ĠGLES 2 0 . GL _ TRUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Could Ġnot Ġlink Ġprogram : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠGLES 2 0 . glGet Program Info Log ( program )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Delete Program ( program ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġprogram ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Tex ID () Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtexture ID ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw Frame ( st : ĠSurface Texture ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" Draw Frame ") ĊĠĠĠĠĠĠĠ Ġst . get Transform Matrix ( st Matrix ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" get Transform Matrix ") ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Clear Color ( 0 . 0 f , Ġ 1 . 0 f , Ġ 0 . 0 f , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Clear Color ") ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Clear ( GLES 2 0 . GL _ DEPTH _ BUFFER _ BIT Ġor ĠGLES 2 0 . GL _ COLOR _ BUFFER _ BIT ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Clear ") ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Use Program ( program ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Use Program ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Active Texture ( GLES 2 0 . GL _ TEXTURE 0 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , Ġtexture ID ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Active Texture ( GLES 2 0 . GL _ TEXTURE 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġoverlay Texture Id ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform 1 i ( overlay Texture Handle , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġoverlay Vertices . position ( VERT ICES _ DATA _ POS _ OFFSET ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( position Handle , Ġ 3 , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ERT ICES _ DATA _ STRIDE _ BYTES , Ġoverlay Vertices ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glVertex Attrib Pointer Ġposition ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( position Handle ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Enable VertexAttrib Array Ġposition Handle ") ĊĠĠĠĠĠĠĠ Ġoverlay Vertices . position ( VERT ICES _ DATA _ UV _ OFFSET ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( texture Handle , Ġ 2 , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ERT ICES _ DATA _ STRIDE _ BYTES , Ġoverlay Vertices ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" glVertex Attrib Pointer Ġtexture Handle ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( texture Handle ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Enable VertexAttrib Array Ġtexture Handle ") ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( mvp Matrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠMatrix . rotate M ( mvp Matrix , Ġ 0 , Ġrotation Angle , Ġ 0 . 0 f , Ġ 0 . 0 f , Ġ 1 . 0 f ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform Matrix 4 fv ( mvp Matrix Handle , Ġ 1 , Ġfalse , Ġm vp Matrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform Matrix 4 fv ( st Matrix Handle , Ġ 1 , Ġfalse , Ġst Matrix , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(:: overlay Image . isInitialized Ġ&& Ġoverlay Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Overlay Ġ!= ĠOverlay Type . DateTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate ĠData Ġand ĠTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Image . erase Color ( Color . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( overlay Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . textAlign Ġ= ĠPaint . Align . LEFT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . text Size Ġ= Ġ 1 0 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . alpha Ġ= Ġ( 0 . 5 f Ġ* Ġ 2 5 5 . 0 f ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsdf Ġ= ĠSimpleDateFormat (" dd / M / yyyy Ġhh : mm : ss ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Date Ġ= Ġsdf . format ( Date ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( current Date , Ġ 0 . 0 f , Ġ 1 0 0 . 0 f , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL Utils . tex Image 2 D ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġ 0 , Ġoverlay Image , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Draw Arrays ( GLES 2 0 . GL _ TRI ANGLE _ STRIP , Ġ 0 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġcheck E gl Error (" gl Draw Arrays ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Rotation ( rotation : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrotation Angle Ġ= Ġrotation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Image Overlay ( bitmap : ĠBitmap , Ġtype : ĠOverlay Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverlay Image Ġ= Ġbitmap ĊĠĠĠĠĠĠĠ Ġtype Overlay Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġoverlay Update Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck E gl Error ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġerror Ġ= ĠE GL 1 4 . e glGet Error () ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= ĠE GL 1 4 . EGL _ SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( msg Ġ+ Ġ": ĠE GL Ġerror : Ġ 0 x " Ġ+ ĠInteger . to HexString ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġthis :: class . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFLOAT _ SIZE _ BYTES Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠV ERT ICES _ DATA _ STRIDE _ BYTES Ġ= Ġ 5 Ġ* ĠFLOAT _ SIZE _ BYTES ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠV ERT ICES _ DATA _ POS _ OFFSET Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠV ERT ICES _ DATA _ UV _ OFFSET Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvertices Data Ġ= Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 . 0 f , Ġ- 1 . 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 f , Ġ- 1 . 0 f , Ġ 0 f , Ġ 1 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 . 0 f , Ġ 1 . 0 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 f , Ġ 1 . 0 f , Ġ 0 f , Ġ 1 f , Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠV ERT EX _ SHADER Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" uniform Ġmat 4 Ġm vp Matrix ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġmat 4 Ġst Matrix ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Ġvec 4 Ġposition ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Ġvec 4 Ġtexture Coord ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvarying Ġvec 2 Ġv TexCoord ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoid Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl _ Position Ġ= Ġm vp Matrix Ġ* Ġposition ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv TexCoord Ġ= Ġ( st Matrix Ġ* Ġtexture Coord ). xy ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} """ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFR AG MENT _ SHADER Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" # extension ĠGL _ OES _ EGL _ image _ external Ġ: Ġrequire ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprecision Ġmedi ump Ġfloat ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvarying Ġvec 2 Ġv TexCoord ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġsampler External OES Ġsurface Texture ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġsampler 2 D Ġoverlay Texture ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoid Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl _ Frag Color Ġ= Ġtexture 2 D ( surface Texture , Ġv TexCoord ) Ġ+ Ġtexture 2 D ( overlay Texture , Ġv TexCoord ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} """ ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠVideo Overlay Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġe gl Core : ĠE gl Core ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoutput Surface : ĠOutput Overlay Surface ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinput Surface : ĠInput Overlay Surface ĊĠĠĠ Ġprivate Ġval Ġoverlay Sync Object Ġ= ĠObject () ĊĠĠĠ Ġprivate Ġval Ġoverlay Semaphore Ġ= ĠSem aphore ( 1 ) ĊĠĠĠ Ġprivate Ġvar Ġoverlay Running : ĠBoolean ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoverlay Renderer Ġ: ĠOverlay Renderer ĊĠĠĠ Ġprivate Ġval Ġwidth Image : ĠInt ĊĠĠĠ Ġprivate Ġval Ġheight Image : ĠInt ĊĠĠĠ Ġprivate Ġval Ġoverlay Thread : ĠThread ĊĠĠĠ Ġprivate Ġval Ġoutput Frame Interval : ĠLong ĊĠĠĠ Ġprivate Ġvar Ġoutput Timestamp Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġval Ġoverlay Bitmap : ĠBitmap ĊĊĠĠĠ Ġconstructor ( surface : ĠSurface , Ġwidth : ĠInt , Ġheight : ĠInt , Ġfps : ĠFloat , Ġrotation : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverlay Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwidth Image Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġheight Image Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġoutput Frame Interval Ġ= Ġ( 1 0 0 0 0 0 0 0 0 0 . 0 f Ġ/ Ġfps ). to Long () ĊĠĠĠĠĠĠĠ Ġoverlay Bitmap Ġ= ĠBitmap . create Bitmap ( width Image , Ġheight Image , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġoverlay Thread Ġ= Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Thread ( surface , Ġwidth , Ġheight , Ġrotation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsynchronized ( overlay Sync Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Sync Object . wait () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFrame Skip (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Timestamp Ġ= Ġinput Surface . getTimestamp () ĊĠĠĠĠĠĠĠ Ġif Ġ( output Timestamp Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Timestamp Ġ= Ġinput Timestamp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Delta Ġ= Ġoutput Timestamp Ġ- Ġinput Timestamp ĊĠĠĠĠĠĠĠ Ġval Ġmax Delta Ġ= Ġ( output Frame Interval Ġ* Ġ 0 . 5 f ). round To Long () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( timestamp Delta Ġ> Ġ 0 ) Ġ&& Ġ( timestamp Delta Ġ>= Ġmax Delta )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandler Thread ( surface : ĠSurface , Ġwidth : ĠInt , Ġheight : ĠInt , Ġrotation : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe gl Core Ġ= ĠE gl Core () ĊĠĠĠĠĠĠĠ Ġoutput Surface Ġ= ĠOutput Overlay Surface ( e gl Core , Ġsurface ) ĊĠĠĠĠĠĠĠ Ġoutput Surface . make Current () ĊĠĠĠĠĠĠĠ Ġoverlay Renderer Ġ= ĠOverlay Renderer () ĊĠĠĠĠĠĠĠ Ġoverlay Renderer . setRotation ( rotation ) ĊĠĠĠĠĠĠĠ Ġinput Surface Ġ= ĠInput Overlay Surface ( overlay Renderer . get Tex ID (), Ġwidth , Ġheight ) ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( overlay Sync Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Sync Object . notify All (); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( overlay Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! input Surface . await Frame ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Frame Skip ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Renderer . draw Frame ( input Surface . get Surface Texture ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Surface . set Presentation Time ( output Timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Surface . swap Buffers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Timestamp Ġ+= Ġoutput Frame Interval ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Input Surface (): ĠSurface Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput Surface . get Surface () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverlay Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinput Surface . release () ĊĠĠĠĠĠĠĠ Ġoverlay Thread . join () ĊĠĠĠĠĠĠĠ Ġoutput Surface . release () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Image Overlay ( bitmap : ĠBitmap , Ġleft : ĠFloat , Ġtop : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( overlay Bitmap ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( bitmap , Ġleft , Ġtop , Ġnull ) ĊĠĠĠĠĠĠĠ Ġoverlay Renderer . setImage Overlay ( overlay Bitmap , ĠOverlay Type . Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Text Overlay ( msg : ĠString , Ġx : ĠFloat , Ġy : ĠFloat , Ġtext Size : ĠFloat , Ġcolor : ĠInt , Ġalpha : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( overlay Bitmap ) ĊĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġpaint . textAlign Ġ= ĠPaint . Align . LEFT ĊĠĠĠĠĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpaint . text Size Ġ= Ġtext Size ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġpaint . alpha Ġ= Ġ( alpha Ġ* Ġ 2 5 5 . 0 f ). toInt () ĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( msg , Ġx , Ġy , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠ Ġoverlay Renderer . setImage Overlay ( overlay Bitmap , ĠOverlay Type . Text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Date And Time Overlay ( x : ĠFloat , Ġy : ĠFloat , Ġsize : ĠFloat , Ġcolor : ĠInt , Ġalpha : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( overlay Bitmap ) ĊĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġpaint . textAlign Ġ= ĠPaint . Align . LEFT ĊĠĠĠĠĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpaint . text Size Ġ= Ġsize ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġpaint . alpha Ġ= Ġ( alpha Ġ* Ġ 2 5 5 . 0 f ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġsdf Ġ= ĠSimpleDateFormat (" dd / M / yyyy Ġhh : mm : ss ") ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Date Ġ= Ġsdf . format ( Date ()) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( current Date , Ġx , Ġy , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠ Ġoverlay Renderer . setImage Overlay ( overlay Bitmap , ĠOverlay Type . DateTime ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Rect Overlay ( width : ĠInt , Ġheight : ĠInt , Ġcolor : ĠInt , Ġalpha : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( overlay Bitmap ) ĊĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġpaint . alpha Ġ= Ġ( alpha Ġ* Ġ 2 5 5 . 0 f ). toInt () ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠ Ġoverlay Renderer . setImage Overlay ( overlay Bitmap , ĠOverlay Type . Rectangle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġthis :: class . simple Name ĊĠĠĠ Ġ} Ċ } Ċ