From 6494d7c29b4e07b1cc4764ec926ecf86448d14fd Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 3 May 2024 14:19:56 +0900 Subject: [PATCH] code tag wip --- assets/mods/basegame/fonts/composer_gui.tga | 3 ++ src/net/torvald/btex/BTeXDocument.kt | 7 ++++ src/net/torvald/btex/BTeXParser.kt | 44 ++++++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 assets/mods/basegame/fonts/composer_gui.tga diff --git a/assets/mods/basegame/fonts/composer_gui.tga b/assets/mods/basegame/fonts/composer_gui.tga new file mode 100644 index 000000000..cf90d2c6b --- /dev/null +++ b/assets/mods/basegame/fonts/composer_gui.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba3efa07187356d6a76d96c6c2feba1b76a5d7e1a9faddfece24b6bd33221251 +size 46610 diff --git a/src/net/torvald/btex/BTeXDocument.kt b/src/net/torvald/btex/BTeXDocument.kt index e9fa5616b..3cd9645a8 100644 --- a/src/net/torvald/btex/BTeXDocument.kt +++ b/src/net/torvald/btex/BTeXDocument.kt @@ -300,7 +300,14 @@ class BTeXPage( if (drawCall.isNotBlank()) drawCalls.add(drawCall) } + private var prerender = false + fun render(frameDelta: Float, batch: SpriteBatch, x: Int, y: Int, marginH: Int, marginV: Int) { + if (!prerender) { + prerender = true + drawCalls.sortBy { if (it.text != null) 16 else 0 } + } + batch.color = back.cpy().also { it.a = 0.93f } Toolkit.fillArea(batch, x, y, width, height) batch.color = Color.WHITE diff --git a/src/net/torvald/btex/BTeXParser.kt b/src/net/torvald/btex/BTeXParser.kt index a3666df3b..0b36f8c3a 100644 --- a/src/net/torvald/btex/BTeXParser.kt +++ b/src/net/torvald/btex/BTeXParser.kt @@ -79,6 +79,7 @@ object BTeXParser { private var currentTheme = "" private var spanColour: String? = null + private var codeMode: Boolean = false private val elemOpeners: HashMap> = HashMap() @@ -175,6 +176,26 @@ object BTeXParser { } } + private fun getOrPutCodeTagRef(width: Int): ((BTeXDrawCall) -> BTeXBatchDrawCall)? { + val tagname = "TAG@CODE-$width" + if (!objDict.contains(tagname)) { + objWidthDict[tagname] = 0 + objDict[tagname] = { text: BTeXDrawCall -> + object : BTeXBatchDrawCall(0, 0, text) { + override fun draw(doc: BTeXDocument, batch: SpriteBatch, x: Float, y: Float, font: TerrarumSansBitmap?) { + val oldcol = batch.color.cpy() + batch.color = Color(0xccccccff.toInt()) + Toolkit.fillArea(batch, x - 2, y - 1, width + 4f, doc.lineHeightInPx + 2f) + batch.color = Color(0x999999ff.toInt()) + Toolkit.drawBoxBorder(batch, x - 2, y - 1, width + 4f, doc.lineHeightInPx + 2f) + batch.color = oldcol + } + } + } + } + return objDict[tagname] + } + fun dispose() { if (::testFont.isInitialized) testFont.tryDispose() if (::titleFont.isInitialized) titleFont.tryDispose() @@ -262,12 +283,14 @@ object BTeXParser { } private var oldSpanColour: String? = null + private var oldCodeMode = false override fun characters(ch: CharArray, start: Int, length: Int) { val str = String(ch.sliceArray(start until start + length)).replace('\n', ' ').replace(Regex(" +"), " ")//.trim() if (str.isNotEmpty()) { + // process span request if (spanColour != oldSpanColour || spanColour != null) { // printdbg("Characters [col:${spanColour}] \t\"$str\"") @@ -283,12 +306,22 @@ object BTeXParser { spanGdxCol.b.times(15f).roundToInt() )) } - } + // process code request + if (codeMode != oldCodeMode && codeMode) { + println("CODE tag for str '$str'") + val w = getFont().getWidth(str) + getOrPutCodeTagRef(w) + paragraphBuffer.appendObjectPlaceholder("TAG@CODE-$w") + } + + + paragraphBuffer.append(str) oldSpanColour = spanColour + oldCodeMode = codeMode } } @@ -636,6 +669,15 @@ object BTeXParser { handler.paragraphBuffer.appendObjectPlaceholder("TAG@TEX") } + @OpenTag // reflective access is impossible with 'private' + fun processElemCODE(handler: BTeXHandler, doc: BTeXDocument, uri: String, attribs: HashMap) { + handler.codeMode = true + } + @CloseTag + fun closeElemCODE(handler: BTeXHandler, doc: BTeXDocument, uri: String, siblingIndex: Int) { + handler.codeMode = false + } + @OpenTag // reflective access is impossible with 'private' fun processElemCOVER(handler: BTeXHandler, doc: BTeXDocument, uri: String, attribs: HashMap) {