package Ġeu . sis ik . add text to video . gl Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . opengl . GLES 1 1 Ext Ċ import Ġandroid . opengl . GLES 2 0 Ċ import Ġandroid . opengl . GL Utils Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . nio . Float Buffer Ċ import Ġjava . nio . Int Buffer Ċ Ċ /** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġby ĠRoman ĠS is ik . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ class ĠTexture Renderer ( val Ġis External EOS : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġvid Vertex Shader Code Ġ= ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġprecision Ġhigh p Ġfloat ; ĊĠĠĠĠĠĠĠ Ġattribute Ġvec 3 Ġvertex Position ; ĊĠĠĠĠĠĠĠ Ġattribute Ġvec 2 Ġu vs ; ĊĠĠĠĠĠĠĠ Ġvarying Ġvec 2 Ġvar U vs ; ĊĠĠĠĠĠĠĠ Ġuniform Ġmat 4 Ġtex Matrix ; ĊĠĠĠĠĠĠĠ Ġuniform Ġmat 4 Ġm vp ; ĊĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġvoid Ġmain () ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar U vs Ġ= Ġ( tex Matrix Ġ* Ġvec 4 ( u vs . x , Ġu vs . y , Ġ 0 , Ġ 1 . 0 )). xy ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl _ Position Ġ= Ġm vp Ġ* Ġvec 4 ( vertex Position , Ġ 1 . 0 ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠ Ġprivate Ġval Ġvid Fragment Shader Code Ġ= ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġ# extension ĠGL _ OES _ EGL _ image _ external Ġ: Ġrequire ĊĠĠĠĠĠĠĠ Ġprecision Ġmedi ump Ġfloat ; ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġvarying Ġvec 2 Ġvar U vs ; ĊĠĠĠĠĠĠĠ Ġuniform Ġsampler External OES Ġtex Sampler ; ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġvoid Ġmain () ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl _ Frag Color Ġ= Ġtexture 2 D ( tex Sampler , Ġvar U vs ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠ Ġprivate Ġval Ġtext Vertex Shader Code Ġ= ĊĠĠĠĠĠĠĠ Ġ""" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠ Ġprecision Ġhigh p Ġfloat ; ĊĠĠĠĠĠĠĠ Ġattribute Ġvec 3 Ġvertex Position ; ĊĠĠĠĠĠĠĠ Ġattribute Ġvec 2 Ġu vs ; ĊĠĠĠĠĠĠĠ Ġvarying Ġvec 2 Ġvar U vs ; ĊĠĠĠĠĠĠĠ Ġuniform Ġmat 4 Ġm vp ; ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġvoid Ġmain () ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar U vs Ġ= Ġu vs ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl _ Position Ġ= Ġm vp Ġ* Ġvec 4 ( vertex Position , Ġ 1 . 0 ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠ Ġprivate Ġval Ġtext Fragment Shader Code Ġ= ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġprecision Ġmedi ump Ġfloat ; ĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠ Ġvarying Ġvec 2 Ġvar U vs ; ĊĠĠĠĠĠĠĠ Ġuniform Ġsampler 2 D Ġtex Sampler ; ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġvoid Ġmain () ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl _ Frag Color Ġ= Ġtexture 2 D ( tex Sampler , Ġvar U vs ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠ Ġprivate Ġvar Ġvertices Ġ= Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠ Ġ// Ġx , Ġy , Ġz , Ġu , Ġv ĊĠĠĠĠĠĠĠ Ġ- 1 . 0 f , Ġ- 1 . 0 f , Ġ 0 . 0 f , Ġ 0 f , Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġ- 1 . 0 f , Ġ 1 . 0 f , Ġ 0 . 0 f , Ġ 0 f , Ġ 1 f , ĊĠĠĠĠĠĠĠĠ 1 . 0 f , Ġ 1 . 0 f , Ġ 0 . 0 f , Ġ 1 f , Ġ 1 f , ĊĠĠĠĠĠĠĠĠ 1 . 0 f , Ġ- 1 . 0 f , Ġ 0 . 0 f , Ġ 1 f , Ġ 0 f ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġvar Ġindices Ġ= Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠ 2 , Ġ 1 , Ġ 0 , Ġ 0 , Ġ 3 , Ġ 2 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġvar Ġprogram : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġvertex Handle : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġbuffer Handles Ġ= ĠInt Array ( 2 ) ĊĠĠĠ Ġprivate Ġvar Ġu vs Handle : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtex Matrix Handle : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm vp Handle : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġsampler Handle : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġtexture Handles Ġ= ĠInt Array ( 1 ) ĊĊĠĠĠ Ġval Ġtex Id : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtexture Handles [ 0 ] ĊĊĠĠĠ Ġprivate Ġvar Ġvertex Buffer : ĠFloat Buffer Ġ= ĠByteBuffer . allocate Direct ( vertices . size Ġ* Ġ 4 ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġorder ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠ Ġas Float Buffer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( vertices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġindex Buffer : ĠInt Buffer Ġ= ĠByteBuffer . allocate Direct ( indices . size Ġ* Ġ 4 ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġorder ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠ Ġas Int Buffer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġprogram ĊĠĠĠĠĠĠĠ Ġval Ġv tx Code Ġ= Ġif Ġ( is External EOS ) Ġvid Vertex Shader Code Ġelse Ġtext Vertex Shader Code ĊĠĠĠĠĠĠĠ Ġval Ġfrag Code Ġ= Ġif Ġ( is External EOS ) Ġvid Fragment Shader Code Ġelse Ġtext Fragment Shader Code ĊĠĠĠĠĠĠĠ Ġval Ġvertex Shader : ĠInt Ġ= Ġload Shader ( GLES 2 0 . GL _ VERTEX _ SHADER , Ġv tx Code ) ĊĠĠĠĠĠĠĠ Ġval Ġfragment Shader : ĠInt Ġ= Ġload Shader ( GLES 2 0 . GL _ FRAGMENT _ SHADER , Ġfrag Code ) ĊĊĠĠĠĠĠĠĠ Ġprogram Ġ= ĠGLES 2 0 . gl Create Program (). also Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Attach Shader ( it , Ġvertex Shader ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Attach Shader ( it , Ġfragment Shader ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Link Program ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Handle Ġ= ĠGLES 2 0 . glGet Attrib Location ( it , Ġ" vertex Position ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu vs Handle Ġ= ĠGLES 2 0 . glGet Attrib Location ( it , Ġ" u vs ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is External EOS ) Ġtex Matrix Handle Ġ= ĠGLES 2 0 . glGet UniformLocation ( it , Ġ" tex Matrix ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm vp Handle Ġ= ĠGLES 2 0 . glGet UniformLocation ( it , Ġ" mvp ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsampler Handle Ġ= ĠGLES 2 0 . glGet UniformLocation ( it , Ġ" tex Sampler ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġbuffers ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Buffers ( 2 , Ġbuffer Handles , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġbuffer Handles [ 0 ]) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl BufferData ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġvertices . size Ġ* Ġ 4 , Ġvertex Buffer , ĠGLES 2 0 . GL _ DYNAMIC _ DRAW ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ELEMENT _ ARRAY _ BUFFER , Ġbuffer Handles [ 1 ]) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl BufferData ( GLES 2 0 . GL _ ELEMENT _ ARRAY _ BUFFER , Ġindices . size Ġ* Ġ 4 , Ġindex Buffer , ĠGLES 2 0 . GL _ DYNAMIC _ DRAW ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠInit Ġtexture Ġthat Ġwill Ġreceive Ġdecoded Ġframes ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġif Ġ( is External EOS ) ĠGLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES Ġelse ĠGLES 2 0 . GL _ TEXTURE _ 2 D ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Textures ( 1 , Ġtexture Handles , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( target , Ġtexture Handles [ 0 ]) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( target , ĠGLES 2 0 . GL _ TEXTURE _ MIN _ FILTER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ NE ARE ST ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( target , ĠGLES 2 0 . GL _ TEXTURE _ MAG _ FILTER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ LINEAR ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( target , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ S , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( target , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ T , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure ĠI Ġcan Ġdraw Ġtransparent Ġstuff Ġthat Ġoverlap s Ġproperly ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable ( GLES 2 0 . GL _ BLEND ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Blend Func ( GLES 2 0 . GL _ SRC _ ALPHA , ĠGLES 2 0 . GL _ ONE _ MINUS _ SRC _ ALPHA ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Shader ( type : ĠInt , Ġshader Code : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGLES 2 0 . gl Create Shader ( type ). also Ġ{ Ġshader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Shader Source ( shader , Ġshader Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Compile Shader ( shader ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw ( mvp Matrix : ĠFloat Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġtex Matrix : Float Array ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap : ĠBitmap ?) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Use Program ( program ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPass Ġtransformations Ġto Ġshader ĊĠĠĠĠĠĠĠ Ġtex Matrix ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform Matrix 4 fv ( tex Matrix Handle , Ġ 1 , Ġfalse , Ġit , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform Matrix 4 fv ( mvp Handle , Ġ 1 , Ġfalse , Ġm vp Matrix , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġtexture Ġaccording Ġto Ġwhat Ġwe Ġuse . ĠIf Ġwe Ġuse Ġa Ġbitmap , Ġwe Ġneed Ġto Ġpass Ġit Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġshader Ġourselves . ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Active Texture ( GLES 2 0 . GL _ TEXTURE 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġif Ġ( is External EOS ) ĠGLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES Ġelse ĠGLES 2 0 . GL _ TEXTURE _ 2 D ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( target , Ġtexture Handles [ 0 ]) ĊĊĠĠĠĠĠĠĠ Ġbitmap ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Pixel Store i ( GLES 2 0 . GL _ UN PACK _ ALIGNMENT , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL Utils . tex Image 2 D ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġ 0 , Ġit , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( target , ĠGLES 2 0 . GL _ TEXTURE _ MIN _ FILTER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ NE ARE ST ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( target , ĠGLES 2 0 . GL _ TEXTURE _ MAG _ FILTER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ LINEAR ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( target , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ S , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( target , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ T , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġbuffers Ġwith Ġvertices Ġand Ġindices Ġ& Ġdraw ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġbuffer Handles [ 0 ]) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ELEMENT _ ARRAY _ BUFFER , Ġbuffer Handles [ 1 ]) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( vertex Handle ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( vertex Handle , Ġ 3 , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , Ġ 4 Ġ* Ġ 5 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( u vs Handle ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( u vs Handle , Ġ 2 , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , Ġ 4 Ġ* Ġ 5 , Ġ 3 Ġ* Ġ 4 ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Draw Elements ( GLES 2 0 . GL _ TRI ANG LES , Ġ 6 , ĠGLES 2 0 . GL _ UNSIGNED _ INT , Ġ 0 ) ĊĠĠĠ Ġ} Ċ }