From 3137297745775ea738aed0fdecd1f18038af44b1 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 1 Jun 2024 01:28:43 +0900 Subject: [PATCH] font update --- lib/TerrarumSansBitmap.jar | 4 +- src/net/torvald/btex/BTeXDocument.kt | 15 ++++--- src/net/torvald/btex/BTeXParser.kt | 46 +++++++++++----------- src/net/torvald/terrarum/tests/BTeXTest.kt | 24 +++++++---- 4 files changed, 47 insertions(+), 42 deletions(-) diff --git a/lib/TerrarumSansBitmap.jar b/lib/TerrarumSansBitmap.jar index c8086841e..64c78524a 100644 --- a/lib/TerrarumSansBitmap.jar +++ b/lib/TerrarumSansBitmap.jar @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:605e334dcc600a822d0a979c8568ccf26b9a35326298507581ca0795eb5060a6 -size 242333 +oid sha256:b1ec1c43816b6d4706900d1e4f8ce96482f7049fdffd52a657666a7ecb2f5d3a +size 243476 diff --git a/src/net/torvald/btex/BTeXDocument.kt b/src/net/torvald/btex/BTeXDocument.kt index e6db5b9b2..144fd1ec2 100644 --- a/src/net/torvald/btex/BTeXDocument.kt +++ b/src/net/torvald/btex/BTeXDocument.kt @@ -310,7 +310,7 @@ class BTeXDocument : Disposable { * * `currentLine` *will* be updated automatically. */ - fun appendDrawCall(page: BTeXPage, drawCall: BTeXDrawCall) { + fun appendDrawCall(page: BTeXPage, drawCall: DrawCallWrapper) { page.appendDrawCall(drawCall) val pagenum = pages.indexOf(page) @@ -424,10 +424,10 @@ class BTeXPage( val width: Int, val height: Int, ) { - internal val drawCalls = ArrayList() + internal val drawCalls = ArrayList() internal val clickableElements = ArrayList() - fun appendDrawCall(drawCall: BTeXDrawCall) { + fun appendDrawCall(drawCall: DrawCallWrapper) { if (drawCall.isNotBlank()) drawCalls.add(drawCall) } fun appendClickable(clickable: BTeXClickable) { @@ -503,23 +503,22 @@ data class TypesetDrawCall(val movableType: MovableType, val rowStart: Int, val } } -abstract class BTeXBatchDrawCall( +abstract class BatchDrawCall( val width: Int, val lineHeight: Int, - val parentText: BTeXDrawCall?// = null + val parentText: DrawCallWrapper?// = null ) { abstract fun draw(doc: BTeXDocument, batch: SpriteBatch, x: Float, y: Float, font: TerrarumSansBitmap? = null) abstract fun drawToPixmap(doc: BTeXDocument, pixmap: Pixmap, x: Int, y: Int, font: TerrarumSansBitmap? = null) } -class BTeXDrawCall( +class DrawCallWrapper( val doc: BTeXDocument, val pageObject: BTeXPage, var posX: Int, // position relative to the page start (excluding page margin) var posY: Int, // position relative to the page start (excluding page margin) - val theme: String, val text: TypesetDrawCall? = null, - val cmd: BTeXBatchDrawCall? = null, + val cmd: BatchDrawCall? = null, val font: TerrarumSansBitmap? = null ) { diff --git a/src/net/torvald/btex/BTeXParser.kt b/src/net/torvald/btex/BTeXParser.kt index efcb9b69a..5118850cb 100644 --- a/src/net/torvald/btex/BTeXParser.kt +++ b/src/net/torvald/btex/BTeXParser.kt @@ -91,7 +91,6 @@ object BTeXParser { private var currentHrefId: String? = null // any Unicode string that is not empty private var oldHrefTarget: String? = null - private var currentTheme = "" private val elemOpeners: HashMap> = HashMap() private val elemClosers: HashMap> = HashMap() @@ -102,10 +101,9 @@ object BTeXParser { fun clearParBuffer() { paragraphBuffer.clear() currentAlign = "justify" - currentTheme = "" } - private val objDict = HashMap BTeXBatchDrawCall>() + private val objDict = HashMap BatchDrawCall>() private val hrefDict = HashMap() private val objWidthDict = HashMap() @@ -176,8 +174,8 @@ object BTeXParser { } objWidthDict["TAG@BTEX"] = 32 - objDict["TAG@BTEX"] = { text: BTeXDrawCall -> - object : BTeXBatchDrawCall(32, 0, text) { + objDict["TAG@BTEX"] = { text: DrawCallWrapper -> + object : BatchDrawCall(32, 0, text) { override fun draw(doc: BTeXDocument, batch: SpriteBatch, x: Float, y: Float, font: TerrarumSansBitmap?) { val scale = font!!.scale val interchar = font.interchar @@ -198,8 +196,8 @@ object BTeXParser { } objWidthDict["TAG@LATEX"] = 36 - objDict["TAG@LATEX"] = { text: BTeXDrawCall -> - object : BTeXBatchDrawCall(36, 0, text) { + objDict["TAG@LATEX"] = { text: DrawCallWrapper -> + object : BatchDrawCall(36, 0, text) { override fun draw(doc: BTeXDocument, batch: SpriteBatch, x: Float, y: Float, font: TerrarumSansBitmap?) { val scale = font!!.scale val interchar = font.interchar @@ -222,8 +220,8 @@ object BTeXParser { } objWidthDict["TAG@TEX"] = 24 - objDict["TAG@TEX"] = { text: BTeXDrawCall -> - object : BTeXBatchDrawCall(24, 0, text) { + objDict["TAG@TEX"] = { text: DrawCallWrapper -> + object : BatchDrawCall(24, 0, text) { override fun draw(doc: BTeXDocument, batch: SpriteBatch, x: Float, y: Float, font: TerrarumSansBitmap?) { val scale = font!!.scale val interchar = font.interchar @@ -1024,7 +1022,7 @@ object BTeXParser { if (imgWidth > doc.textWidth) throw RuntimeException("Image width ($imgWidth) is larger than the text width (${doc.textWidth})") - val drawCallObj = { parentText: BTeXDrawCall -> object : BTeXBatchDrawCall(imgWidth, (heightInLines - 1).coerceAtLeast(0), parentText) { + val drawCallObj = { parentText: DrawCallWrapper -> object : BatchDrawCall(imgWidth, (heightInLines - 1).coerceAtLeast(0), parentText) { private lateinit var inputTexture: Texture override fun draw(doc: BTeXDocument, batch: SpriteBatch, x: Float, y: Float, font: TerrarumSansBitmap?) { if (!::inputTexture.isInitialized) { @@ -1041,7 +1039,7 @@ object BTeXParser { } } } - objDict[btexObjName] = { text: BTeXDrawCall -> drawCallObj(text) } + objDict[btexObjName] = { text: DrawCallWrapper -> drawCallObj(text) } objWidthDict[btexObjName] = imgWidth typesetParagraphs(objectMarkerWithWidth(btexObjName, imgWidth), handler, align = "center") @@ -1630,7 +1628,7 @@ object BTeXParser { height: Int = doc.pageLines, startingPage: Int = doc.currentPage, align: String - ): Pair, List> { + ): Pair, List> { return typesetParagraphs(getFont(), thePar, handler, width, height, startingPage, align) } @@ -1642,7 +1640,7 @@ object BTeXParser { height: Int = doc.pageLines, startingPage: Int = doc.currentPage, align: String - ): Pair, List> { + ): Pair, List> { val strat = when (align) { "left" -> TypesettingStrategy.RAGGED_RIGHT "right" -> TypesettingStrategy.RAGGED_LEFT @@ -1653,7 +1651,7 @@ object BTeXParser { val slugs = MovableType(font, thePar, width, strat) var pageNum = startingPage - val drawCalls = ArrayList() + val drawCalls = ArrayList() val clickables = ArrayList() var remainder = height - doc.linesPrintedOnPage.last() @@ -1819,25 +1817,25 @@ object BTeXParser { return drawCalls to clickables } - private fun textToDrawCall(page: BTeXPage, posYline: Int, slugs: MovableType, lineStart: Int, lineCount: Int): List { + private fun textToDrawCall(page: BTeXPage, posYline: Int, slugs: MovableType, lineStart: Int, lineCount: Int): List { return listOf( - BTeXDrawCall( - doc, page, 0, posYline * doc.lineHeightInPx, currentTheme, + DrawCallWrapper( + doc, page, 0, posYline * doc.lineHeightInPx, TypesetDrawCall(slugs, lineStart, lineCount) ) ) } private fun parseAndGetObjDrawCalls( - textDrawCall: BTeXDrawCall, + textDrawCall: DrawCallWrapper, font: TerrarumSansBitmap, page: BTeXPage, posYline: Int, slugs: MovableType, lineStart: Int, lineCount: Int - ): List { - val out = ArrayList() + ): List { + val out = ArrayList() slugs.typesettedSlugs.subList(lineStart, lineStart + lineCount).forEachIndexed { lineNumCnt, line -> line.mapIndexed { i, c -> i to c }.filter { it.second == OBJ }.map { it.first }.forEach { xIndex -> @@ -1856,8 +1854,8 @@ object BTeXParser { } if (idbuf.isNotBlank() && !idbuf.startsWith("HREF@")) { - out.add(BTeXDrawCall( - doc, page, x, y, currentTheme, + out.add(DrawCallWrapper( + doc, page, x, y, cmd = objDict[idbuf.toString()]?.invoke(textDrawCall) ?: throw NullPointerException("No OBJ with id '$idbuf' exists"), font = font, @@ -1870,7 +1868,7 @@ object BTeXParser { } private fun parseAndGetHref( - textDrawCall: BTeXDrawCall, + textDrawCall: DrawCallWrapper, font: TerrarumSansBitmap, handler: BTeXHandler, posYline: Int, @@ -2191,7 +2189,7 @@ object BTeXParser { private annotation class CloseTag } -private fun Pair, List>.moveObjectsAround(x: Int, y: Int) { +private fun Pair, List>.moveObjectsAround(x: Int, y: Int) { this.first.forEachIndexed { index, it -> it.posX += x it.deltaX += x diff --git a/src/net/torvald/terrarum/tests/BTeXTest.kt b/src/net/torvald/terrarum/tests/BTeXTest.kt index 53b60efd8..8bc635155 100644 --- a/src/net/torvald/terrarum/tests/BTeXTest.kt +++ b/src/net/torvald/terrarum/tests/BTeXTest.kt @@ -22,6 +22,7 @@ import net.torvald.terrarum.inUse import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.ui.Toolkit import net.torvald.unicode.EMDASH +import java.io.File import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicReference import kotlin.system.measureTimeMillis @@ -32,7 +33,7 @@ import kotlin.system.measureTimeMillis */ class BTeXTest : ApplicationAdapter() { - val filePath = "btex.xml" + val filePath = "btex.btxbook" // val filePath = "btex_ko.xml" // val filePath = "test.xml" // val filePath = "literature/en/daniel_defoe_robinson_crusoe.xml" @@ -40,6 +41,7 @@ class BTeXTest : ApplicationAdapter() { // val filePath = "literature/koKR/yisang_nalgae.xml" // val filePath = "literature/koKR/yisang_geonchukmuhanyukmyeongakche.xml" + private var serialise = true private lateinit var document: BTeXDocument private lateinit var documentHandler: BTeXParser.BTeXHandler @@ -92,12 +94,6 @@ class BTeXTest : ApplicationAdapter() { }.also { println("Time spent on finalising [ms]: $it") } - - /*measureTimeMillis { - document.serialise(File("./assets/mods/basegame/books/${filePath.replace(".xml", ".btxbook")}")) - }.also { - println("Time spent on serialisation [ms]: $it") - }*/ } catch (e: Throwable) { errorInfo.set(e) @@ -178,9 +174,21 @@ class BTeXTest : ApplicationAdapter() { if (!init) { init = true viewer = BTeXDocViewer(document) + } else { - if (document.isFinalised || document.fromArchive) { + if (serialise && document.isFinalised) { + measureTimeMillis { + document.serialise(viewer, File("./assets/mods/basegame/books/${filePath.replace(".xml", ".btxbook")}")) + }.also { + println("Time spent on serialisation [ms]: $it") + } + batch.inUse { + drawLoadingMsg(batch, "Serialising...") + } + serialise = false + } + else if (document.isFinalised || document.fromArchive) { batch.inUse { batch.draw(bg, 0f, 0f) viewer.render(batch, 640f, drawY.toFloat())