@@ -86,6 +86,7 @@ class GLRendererImpl(private val nsvg: NanoSvgApi, private val stb: StbApi) : Re
8686 private var pixelRatio = 1f
8787 private var alphaCap = 1f
8888 private var popFlushNeeded = false
89+ private val init get() = program != 0
8990
9091 private var slotX = 0
9192 private var slotY = 0
@@ -284,6 +285,7 @@ class GLRendererImpl(private val nsvg: NanoSvgApi, private val stb: StbApi) : Re
284285 }
285286
286287 override fun init () {
288+ if (init ) return
287289 // check if instancing extension is available
288290 require(GlCapabilities .isGl21Available) { " At least OpenGL 2.1 is required" }
289291 if (! GlCapabilities .isGl33Available) { // asm: skip check, both are core past 3.3
@@ -398,6 +400,7 @@ class GLRendererImpl(private val nsvg: NanoSvgApi, private val stb: StbApi) : Re
398400 private fun flush () {
399401 if (count == 0 ) return
400402 buffer.flip()
403+ val prevActive = glGetInteger(GL_ACTIVE_TEXTURE )
401404 val prevTex = glGetInteger(GL_TEXTURE_BINDING_2D )
402405 val prevProg = glGetInteger(GL_CURRENT_PROGRAM )
403406 val prevBuf = glGetInteger(GL_ARRAY_BUFFER_BINDING )
@@ -459,6 +462,7 @@ class GLRendererImpl(private val nsvg: NanoSvgApi, private val stb: StbApi) : Re
459462 if (prevDepth) glEnable(GL_DEPTH_TEST )
460463 if (prevCull) glEnable(GL_CULL_FACE )
461464 glUseProgram(prevProg)
465+ glActiveTexture(prevActive)
462466 glBindTexture(GL_TEXTURE_2D , prevTex)
463467 glBindBuffer(GL_ARRAY_BUFFER , prevBuf)
464468 if (GlCapabilities .isGl3Available) org.lwjgl.opengl.GL30 .glBindVertexArray(prevVao)
@@ -598,7 +602,7 @@ class GLRendererImpl(private val nsvg: NanoSvgApi, private val stb: StbApi) : Re
598602 buffer.put(EMPTY_ROW ) // zero radii
599603 buffer.put(r).put(g).put(b).put(a)
600604 buffer.put(EMPTY_ROW ) // color1 unused
601- buffer.put(glyph.u).put(glyph.v).put(glyph.uw).put(glyph.vh )
605+ buffer.put(glyph, 0 , 4 )
602606 buffer.put(- 1f ) // thickness = -1 for text
603607 penX + = glyph.xAdvance * scaleFactor
604608 count + = 1
@@ -796,18 +800,23 @@ class GLRendererImpl(private val nsvg: NanoSvgApi, private val stb: StbApi) : Re
796800 h[0 ] / ATLAS_SIZE .toFloat()
797801 )
798802
799- val prevTex = glGetInteger(GL_TEXTURE_BINDING_2D )
800- glBindTexture(GL_TEXTURE_2D , atlas)
801- glPixelStorei(GL_UNPACK_ALIGNMENT , 1 )
802- glPixelStorei(GL_UNPACK_ROW_LENGTH , 0 )
803- glPixelStorei(GL_UNPACK_SKIP_PIXELS , 0 )
804- glPixelStorei(GL_UNPACK_SKIP_ROWS , 0 )
805- glTexSubImage2D(GL_TEXTURE_2D , 0 , slotX, slotY, w[0 ], h[0 ], GL_RGBA , GL_UNSIGNED_BYTE , d)
806- when (mipmapMode) {
807- 1 -> org.lwjgl.opengl.GL30 .glGenerateMipmap(GL_TEXTURE_2D )
808- 2 -> org.lwjgl.opengl.EXTFramebufferObject .glGenerateMipmapEXT(GL_TEXTURE_2D )
803+ synchronized(this ) {
804+ val prevActive = glGetInteger(GL_ACTIVE_TEXTURE )
805+ val prevTex = glGetInteger(GL_TEXTURE_BINDING_2D )
806+ glActiveTexture(GL_TEXTURE0 )
807+ glBindTexture(GL_TEXTURE_2D , atlas)
808+ glPixelStorei(GL_UNPACK_ALIGNMENT , 1 )
809+ glPixelStorei(GL_UNPACK_ROW_LENGTH , 0 )
810+ glPixelStorei(GL_UNPACK_SKIP_PIXELS , 0 )
811+ glPixelStorei(GL_UNPACK_SKIP_ROWS , 0 )
812+ glTexSubImage2D(GL_TEXTURE_2D , 0 , slotX, slotY, w[0 ], h[0 ], GL_RGBA , GL_UNSIGNED_BYTE , d)
813+ when (mipmapMode) {
814+ 1 -> org.lwjgl.opengl.GL30 .glGenerateMipmap(GL_TEXTURE_2D )
815+ 2 -> org.lwjgl.opengl.EXTFramebufferObject .glGenerateMipmapEXT(GL_TEXTURE_2D )
816+ }
817+ glBindTexture(GL_TEXTURE_2D , prevTex)
818+ glActiveTexture(prevActive)
809819 }
810- glBindTexture(GL_TEXTURE_2D , prevTex)
811820 if (image.type == PolyImage .Type .Raster ) stb.image_free(d)
812821
813822 slotX + = w[0 ]
@@ -976,30 +985,33 @@ class GLRendererImpl(private val nsvg: NanoSvgApi, private val stb: StbApi) : Re
976985 stb.free(packed)
977986 stb.free(range)
978987
979- // dumpAtlas()
980-
981- val prevTex = glGetInteger(GL_TEXTURE_BINDING_2D )
982- glBindTexture(GL_TEXTURE_2D , atlas)
983- glPixelStorei(GL_UNPACK_ALIGNMENT , 1 )
984- glPixelStorei(GL_UNPACK_ROW_LENGTH , 0 )
985- glPixelStorei(GL_UNPACK_SKIP_PIXELS , 0 )
986- glPixelStorei(GL_UNPACK_SKIP_ROWS , 0 )
987- // can't write to the alpha channel in GL3 core! lol haha
988- glTexSubImage2D(
989- GL_TEXTURE_2D ,
990- 0 ,
991- sx,
992- sy,
993- FONT_MAX_BITMAP_W ,
994- FONT_MAX_BITMAP_H ,
995- GL_RED ,
996- GL_UNSIGNED_BYTE ,
997- bitMap
998- )
999- glBindTexture(GL_TEXTURE_2D , prevTex)
1000- when (mipmapMode) {
1001- 1 -> org.lwjgl.opengl.GL30 .glGenerateMipmap(GL_TEXTURE_2D )
1002- 2 -> org.lwjgl.opengl.EXTFramebufferObject .glGenerateMipmapEXT(GL_TEXTURE_2D )
988+ synchronized(this @GLRendererImpl) {
989+ val prevActive = glGetInteger(GL_ACTIVE_TEXTURE )
990+ val prevTex = glGetInteger(GL_TEXTURE_BINDING_2D )
991+ glActiveTexture(GL_TEXTURE0 )
992+ glBindTexture(GL_TEXTURE_2D , atlas)
993+ glPixelStorei(GL_UNPACK_ALIGNMENT , 1 )
994+ glPixelStorei(GL_UNPACK_ROW_LENGTH , 0 )
995+ glPixelStorei(GL_UNPACK_SKIP_PIXELS , 0 )
996+ glPixelStorei(GL_UNPACK_SKIP_ROWS , 0 )
997+ // can't write to the alpha channel in GL3 core! lol haha
998+ glTexSubImage2D(
999+ GL_TEXTURE_2D ,
1000+ 0 ,
1001+ sx,
1002+ sy,
1003+ FONT_MAX_BITMAP_W ,
1004+ FONT_MAX_BITMAP_H ,
1005+ GL_RED ,
1006+ GL_UNSIGNED_BYTE ,
1007+ bitMap
1008+ )
1009+ when (mipmapMode) {
1010+ 1 -> org.lwjgl.opengl.GL30 .glGenerateMipmap(GL_TEXTURE_2D )
1011+ 2 -> org.lwjgl.opengl.EXTFramebufferObject .glGenerateMipmapEXT(GL_TEXTURE_2D )
1012+ }
1013+ glBindTexture(GL_TEXTURE_2D , prevTex)
1014+ glActiveTexture(prevActive)
10031015 }
10041016 slotX + = totalSizeX
10051017 atlasRowHeight = maxOf(atlasRowHeight, totalSizeY)
0 commit comments