font update

This commit is contained in:
minjaesong
2024-06-01 01:28:43 +09:00
parent de38561eb2
commit 3137297745
4 changed files with 47 additions and 42 deletions

Binary file not shown.

View File

@@ -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<BTeXDrawCall>()
internal val drawCalls = ArrayList<DrawCallWrapper>()
internal val clickableElements = ArrayList<BTeXClickable>()
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
) {

View File

@@ -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<String, KFunction<*>> = HashMap()
private val elemClosers: HashMap<String, KFunction<*>> = HashMap()
@@ -102,10 +101,9 @@ object BTeXParser {
fun clearParBuffer() {
paragraphBuffer.clear()
currentAlign = "justify"
currentTheme = ""
}
private val objDict = HashMap<String, (BTeXDrawCall) -> BTeXBatchDrawCall>()
private val objDict = HashMap<String, (DrawCallWrapper) -> BatchDrawCall>()
private val hrefDict = HashMap<String, String>()
private val objWidthDict = HashMap<String, Int>()
@@ -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<BTeXDrawCall>, List<BTeXClickable>> {
): Pair<List<DrawCallWrapper>, List<BTeXClickable>> {
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<BTeXDrawCall>, List<BTeXClickable>> {
): Pair<List<DrawCallWrapper>, List<BTeXClickable>> {
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<BTeXDrawCall>()
val drawCalls = ArrayList<DrawCallWrapper>()
val clickables = ArrayList<BTeXClickable>()
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<BTeXDrawCall> {
private fun textToDrawCall(page: BTeXPage, posYline: Int, slugs: MovableType, lineStart: Int, lineCount: Int): List<DrawCallWrapper> {
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<BTeXDrawCall> {
val out = ArrayList<BTeXDrawCall>()
): List<DrawCallWrapper> {
val out = ArrayList<DrawCallWrapper>()
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<BTeXDrawCall>, List<BTeXClickable>>.moveObjectsAround(x: Int, y: Int) {
private fun Pair<List<DrawCallWrapper>, List<BTeXClickable>>.moveObjectsAround(x: Int, y: Int) {
this.first.forEachIndexed { index, it ->
it.posX += x
it.deltaX += x

View File

@@ -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())