diff --git a/lib/TerrarumSansBitmap.jar b/lib/TerrarumSansBitmap.jar index 36691bbfc..3ab5f8804 100644 --- a/lib/TerrarumSansBitmap.jar +++ b/lib/TerrarumSansBitmap.jar @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45ce50d966da04dc7f6f8f544f4c600f2003b12e154e2a8b84bc9f9d07ba4a3e -size 190900 +oid sha256:9ff026c4d537e23fbe908f9d97229789f5e4a99c19a01a2a9f9bd4c803b373d6 +size 191888 diff --git a/src/net/torvald/btex/BTeXDocument.kt b/src/net/torvald/btex/BTeXDocument.kt index 634ad439d..e82705353 100644 --- a/src/net/torvald/btex/BTeXDocument.kt +++ b/src/net/torvald/btex/BTeXDocument.kt @@ -318,18 +318,12 @@ interface BTeXTextDrawCall { fun draw(doc: BTeXDocument, batch: SpriteBatch, x: Float, y: Float) } -data class MovableTypeDrawCall(val movableType: MovableType, override val rowStart: Int, override val rows: Int): BTeXTextDrawCall { +data class TypesetDrawCall(val movableType: MovableType, override val rowStart: Int, override val rows: Int): BTeXTextDrawCall { override fun draw(doc: BTeXDocument, batch: SpriteBatch, x: Float, y: Float) { movableType.draw(batch, x, y, rowStart, minOf(rows, doc.pageLines)) } } -/*data class RaggedLeftDrawCall(val raggedType: RaggedType, override val rowStart: Int, override val rowEnd: Int): BTeXTextDrawCall { - override fun draw(batch: SpriteBatch, x: Float, y: Float) { - raggedType.draw(batch, x, y, rowStart, rowEnd) - } -}*/ - class BTeXDrawCall( val doc: BTeXDocument, var posX: Int, // position relative to the page start (excluding page margin) @@ -368,14 +362,14 @@ class BTeXDrawCall( fun isNotBlank(): Boolean { if (text == null && texture == null) return false - if (text is MovableTypeDrawCall && text.movableType.inputText.isBlank()) return false + if (text is TypesetDrawCall && text.movableType.inputText.isBlank()) return false // if (text is RaggedLeftDrawCall && text.raggedType.inputText.isBlank()) return false return true } internal val width: Int get() = if (text != null) - if (text is MovableTypeDrawCall) + if (text is TypesetDrawCall) text.movableType.width else TODO() diff --git a/src/net/torvald/btex/BTeXParser.kt b/src/net/torvald/btex/BTeXParser.kt index 2b6254706..96050a284 100644 --- a/src/net/torvald/btex/BTeXParser.kt +++ b/src/net/torvald/btex/BTeXParser.kt @@ -10,7 +10,7 @@ import net.torvald.terrarum.btex.BTeXDocument import net.torvald.terrarum.btex.BTeXDocument.Companion.DEFAULT_ORNAMENTS_COL import net.torvald.terrarum.btex.BTeXDocument.Companion.DEFAULT_PAGE_FORE import net.torvald.terrarum.btex.BTeXDrawCall -import net.torvald.terrarum.btex.MovableTypeDrawCall +import net.torvald.terrarum.btex.TypesetDrawCall import net.torvald.terrarum.ceilToFloat import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.toHex @@ -29,6 +29,7 @@ import java.io.FileInputStream import java.io.StringReader import javax.xml.parsers.SAXParserFactory import kotlin.math.absoluteValue +import kotlin.math.roundToInt import kotlin.reflect.KFunction import kotlin.reflect.full.declaredFunctions import kotlin.reflect.full.findAnnotation @@ -218,14 +219,20 @@ object BTeXParser { // printdbg("Characters [col:${spanColour}] \t\"$str\"") if (spanColour != oldSpanColour || spanColour != null) { - val col = getSpanColourOrNull().toInternalColourCodeStr() - if (spanColour != null && paragraphBuffer.isNotEmpty() && paragraphBuffer.last() == '\u000E') { - paragraphBuffer.deleteAt(paragraphBuffer.lastIndex) + val spanGdxCol = getSpanColourOrNull() + + if (spanGdxCol == null) { + paragraphBuffer.append(TerrarumSansBitmap.noColorCode) + } + else { + paragraphBuffer.append(TerrarumSansBitmap.toColorCode( + spanGdxCol.r.times(15f).roundToInt(), + spanGdxCol.g.times(15f).roundToInt(), + spanGdxCol.b.times(15f).roundToInt() + )) } - paragraphBuffer.append(col) - paragraphBuffer.append(str.replace(" ", " $col")) } else { paragraphBuffer.append(str) @@ -235,7 +242,7 @@ object BTeXParser { } } - private fun Color?.toInternalColourCodeStr(): String { + /*private fun Color?.toInternalColourCodeStr(): String { return if (this == null) "\u000E" else { val rgba = this.toRGBA() @@ -245,7 +252,7 @@ object BTeXParser { return "\u000F" + Char(r) + Char(g) + Char(b) } - } + }*/ private fun getFont() = when (cover) { "typewriter" -> TODO() @@ -482,7 +489,7 @@ object BTeXParser { private val ccEmph = "#C11"// TerrarumSansBitmap.toColorCode(0xfd44) private val ccItemName = "#14C" // TerrarumSansBitmap.toColorCode(0xf37d) private val ccTargetName = "#170" // TerrarumSansBitmap.toColorCode(0xf3c4) -// private val ccReset = TerrarumSansBitmap.toColorCode(0) +// private val ccReset = TerrarumSansBitmap.noColorCode @OpenTag // reflective access is impossible with 'private' @@ -950,7 +957,7 @@ object BTeXParser { doc.linesPrintedOnPage[pageNum] * doc.lineHeightInPx, handler.currentTheme, handler.getSpanColour(), - MovableTypeDrawCall(slugs, subset.first, subset.second) + TypesetDrawCall(slugs, subset.first, subset.second) ) doc.appendDrawCall(doc.pages[pageNum], drawCall); drawCalls.add(drawCall) @@ -972,7 +979,7 @@ object BTeXParser { doc.linesPrintedOnPage[pageNum] * doc.lineHeightInPx, handler.currentTheme, handler.getSpanColour(), - MovableTypeDrawCall(slugs, subset.first, subset.second) + TypesetDrawCall(slugs, subset.first, subset.second) ) doc.appendDrawCall(doc.pages[pageNum], drawCall); drawCalls.add(drawCall) @@ -985,25 +992,6 @@ object BTeXParser { } } - // apply internal colour codes - // grammar: - // [0-9A-F]{6,6} : apply colour code - // : remove colour code - drawCalls.forEach { - if (it.text != null && it.text is MovableTypeDrawCall) { - it.text.movableType.typesettedSlugs.forEach { slug -> slug.forEach { block -> - val blockText = block.block.text - -// println(blockText.toReadable()) - - if (blockText.startsWithColourCode()) { - block.colour = blockText.getCCorNull() - } - } } - } - } -// println("---------------------------") - // if typesetting the paragraph leaves the first line of new page empty, move the "row cursor" back up if (doc.linesPrintedOnPage[pageNum] == 1 && doc.pages[pageNum].isEmpty()) doc.linesPrintedOnPage[pageNum] = 0 // '\n' adds empty draw call to the page, which makes isEmpty() to return false @@ -1027,23 +1015,6 @@ object BTeXParser { Character.toString(it.toChar()) } - private fun CodepointSequence.startsWithColourCode() = (this.size > 5 && - this[1] == 0x0F && - (this[2] in 0xF800..0xF8FF) && - (this[3] in 0xF800..0xF8FF) && - (this[4] in 0xF800..0xF8FF)) || - (this.size > 3 && this[0] == 0x0E) - - private fun CodepointSequence.getCCorNull(): Color? { - if (this[1] == 0x0F) { - val r = this[2] - 0xF800 - val g = this[3] - 0xF800 - val b = this[4] - 0xF800 - return Color(r / 255f, g / 255f, b / 255f, 1f) - } - else return null - } - private fun typesetTOCline(name: String, pageNum: Int, handler: BTeXHandler, indentation: Int = 0, pageToWrite: Int? = null) { val pageNum = pageNum.plus(1).toString() val pageNumWidth = getFont().getWidth(pageNum) @@ -1060,12 +1031,9 @@ object BTeXParser { val dotGap = 10 val y = y + (call.lineCount - 1).coerceAtLeast(0) * doc.lineHeightInPx - val textWidth = if (call.text is MovableTypeDrawCall) { - call.text.movableType.typesettedSlugs.last().last().getEndPos() + val textWidth = if (call.text is TypesetDrawCall) { + font.getWidth(call.text.movableType.typesettedSlugs.last()) } - /*else if (call.text is RaggedTypeDrawCall) { - call.text.raggedType.typesettedSlugs.last().last().getEndPos() - }*/ else call.width var dotCursor = (x + textWidth).div(dotGap).ceilToFloat() * dotGap diff --git a/src/net/torvald/terrarum/tests/BTeXTest.kt b/src/net/torvald/terrarum/tests/BTeXTest.kt index 6062331d1..1f2b92a95 100644 --- a/src/net/torvald/terrarum/tests/BTeXTest.kt +++ b/src/net/torvald/terrarum/tests/BTeXTest.kt @@ -25,8 +25,8 @@ import kotlin.system.measureTimeMillis */ class BTeXTest : ApplicationAdapter() { -// val filePath = "btex.btexbin" - val filePath = "literature/en/daniel_defoe_robinson_crusoe.btexbin" +// val filePath = "btex.xml" + val filePath = "literature/en/daniel_defoe_robinson_crusoe.xml" // val filePath = "literature/ruRU/anton_chekhov_palata_no_6.xml" // val filePath = "literature/koKR/yisang_nalgae.xml" @@ -58,18 +58,18 @@ class BTeXTest : ApplicationAdapter() { println("Time spent on typesetting [ms]: $it") } - measureTimeMillis { + /*measureTimeMillis { document.finalise() documentHandler.dispose() }.also { println("Time spent on finalising [ms]: $it") - } + }*/ - measureTimeMillis { + /*measureTimeMillis { document.serialise(File("./assets/mods/basegame/books/${filePath.replace(".xml", ".btexbin")}")) }.also { println("Time spent on serialisation [ms]: $it") - } + }*/ } else { measureTimeMillis {