mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-06 08:38:30 +09:00
btex: cover typesetting
This commit is contained in:
BIN
lib/TerrarumSansBitmap.jar
LFS
BIN
lib/TerrarumSansBitmap.jar
LFS
Binary file not shown.
@@ -3,6 +3,8 @@ package net.torvald.terrarum.btex
|
|||||||
import com.badlogic.gdx.graphics.Color
|
import com.badlogic.gdx.graphics.Color
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
||||||
|
import net.torvald.terrarum.blendNormalPremultAlpha
|
||||||
|
import net.torvald.terrarum.blendNormalStraightAlpha
|
||||||
import net.torvald.terrarum.ui.Toolkit
|
import net.torvald.terrarum.ui.Toolkit
|
||||||
import net.torvald.terrarumsansbitmap.MovableType
|
import net.torvald.terrarumsansbitmap.MovableType
|
||||||
import net.torvald.terrarumsansbitmap.gdx.CodepointSequence
|
import net.torvald.terrarumsansbitmap.gdx.CodepointSequence
|
||||||
|
|||||||
@@ -216,15 +216,34 @@ object BTeXParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var testFont: TerrarumSansBitmap
|
private lateinit var testFont: TerrarumSansBitmap
|
||||||
|
private lateinit var titleFont: TerrarumSansBitmap
|
||||||
|
private lateinit var subtitleFont: TerrarumSansBitmap
|
||||||
|
|
||||||
|
private val bodyTextShadowAlpha = 0.35f
|
||||||
|
|
||||||
private fun getFont() = when (cover) {
|
private fun getFont() = when (cover) {
|
||||||
"typewriter" -> TODO()
|
"typewriter" -> TODO()
|
||||||
else -> App.fontGame ?: let {
|
else -> {
|
||||||
if (!::testFont.isInitialized) testFont = TerrarumSansBitmap(App.FONT_DIR)
|
if (!::testFont.isInitialized) testFont = TerrarumSansBitmap(App.FONT_DIR, shadowAlpha = bodyTextShadowAlpha)
|
||||||
testFont
|
testFont
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getTitleFont(): TerrarumSansBitmap {
|
||||||
|
if (!::titleFont.isInitialized) titleFont = TerrarumSansBitmap(App.FONT_DIR).also {
|
||||||
|
it.interchar = 1
|
||||||
|
it.scale = 2
|
||||||
|
}
|
||||||
|
return titleFont
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getSubtitleFont(): TerrarumSansBitmap {
|
||||||
|
if (!::subtitleFont.isInitialized) subtitleFont = TerrarumSansBitmap(App.FONT_DIR).also {
|
||||||
|
it.interchar = 1
|
||||||
|
}
|
||||||
|
return subtitleFont
|
||||||
|
}
|
||||||
|
|
||||||
private val hexColRegexRGBshort = Regex("#[0-9a-fA-F]{3,3}")
|
private val hexColRegexRGBshort = Regex("#[0-9a-fA-F]{3,3}")
|
||||||
private val hexColRegexRGB = Regex("#[0-9a-fA-F]{6,6}")
|
private val hexColRegexRGB = Regex("#[0-9a-fA-F]{6,6}")
|
||||||
|
|
||||||
@@ -643,11 +662,23 @@ object BTeXParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@CloseTag // reflective access is impossible with 'private'
|
@CloseTag // reflective access is impossible with 'private'
|
||||||
fun closeElemTITLE(handler: BTeXHandler, doc: BTeXDocument, theTag: String, uri: String, siblingIndex: Int) = closeElemP(handler, doc, theTag, uri, siblingIndex)
|
fun closeElemTITLE(handler: BTeXHandler, doc: BTeXDocument, theTag: String, uri: String, siblingIndex: Int) {
|
||||||
|
val thePar = handler.paragraphBuffer.toString().trim()
|
||||||
|
typesetBookTitle(thePar, handler)
|
||||||
|
handler.paragraphBuffer.clear()
|
||||||
|
}
|
||||||
@CloseTag // reflective access is impossible with 'private'
|
@CloseTag // reflective access is impossible with 'private'
|
||||||
fun closeElemAUTHOR(handler: BTeXHandler, doc: BTeXDocument, theTag: String, uri: String, siblingIndex: Int) = closeElemP(handler, doc, theTag, uri, siblingIndex)
|
fun closeElemAUTHOR(handler: BTeXHandler, doc: BTeXDocument, theTag: String, uri: String, siblingIndex: Int) {
|
||||||
|
val thePar = handler.paragraphBuffer.toString().trim()
|
||||||
|
typesetBookAuthor(thePar, handler)
|
||||||
|
handler.paragraphBuffer.clear()
|
||||||
|
}
|
||||||
@CloseTag // reflective access is impossible with 'private'
|
@CloseTag // reflective access is impossible with 'private'
|
||||||
fun closeElemEDITION(handler: BTeXHandler, doc: BTeXDocument, theTag: String, uri: String, siblingIndex: Int) = closeElemP(handler, doc, theTag, uri, siblingIndex)
|
fun closeElemEDITION(handler: BTeXHandler, doc: BTeXDocument, theTag: String, uri: String, siblingIndex: Int) {
|
||||||
|
val thePar = handler.paragraphBuffer.toString().trim()
|
||||||
|
typesetBookAuthor(thePar, handler)
|
||||||
|
handler.paragraphBuffer.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@OpenTag // reflective access is impossible with 'private'
|
@OpenTag // reflective access is impossible with 'private'
|
||||||
@@ -699,6 +730,28 @@ object BTeXParser {
|
|||||||
spanColour = null
|
spanColour = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun typesetBookTitle(thePar: String, handler: BTeXHandler) {
|
||||||
|
val label = "\n" + thePar
|
||||||
|
typesetParagraphs(getTitleFont(), label, handler, doc.textWidth / 2).also {
|
||||||
|
val addedLines = it.sumOf { it.lineCount }
|
||||||
|
doc.linesPrintedOnPage[doc.currentPage] += addedLines + 2
|
||||||
|
|
||||||
|
it.last().extraDrawFun = { batch, x, y ->
|
||||||
|
val px = x + 8
|
||||||
|
val py = y + doc.lineHeightInPx * (2 * addedLines) + 11
|
||||||
|
val pw = doc.textWidth - 16f
|
||||||
|
Toolkit.fillArea(batch, px, py, pw, 2f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun typesetBookAuthor(thePar: String, handler: BTeXHandler) {
|
||||||
|
typesetParagraphs(getSubtitleFont(), thePar, handler, doc.textWidth - 16).also {
|
||||||
|
it.forEach {
|
||||||
|
it.posX += 8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun typesetChapterHeading(thePar: String, handler: BTeXHandler, indent: Int = 16, width: Int = doc.textWidth) {
|
private fun typesetChapterHeading(thePar: String, handler: BTeXHandler, indent: Int = 16, width: Int = doc.textWidth) {
|
||||||
typesetParagraphs("\n"+thePar, handler, width - indent).also {
|
typesetParagraphs("\n"+thePar, handler, width - indent).also {
|
||||||
@@ -710,6 +763,11 @@ object BTeXParser {
|
|||||||
// add ornamental column on the left
|
// add ornamental column on the left
|
||||||
it.forEach {
|
it.forEach {
|
||||||
it.extraDrawFun = { batch, x, y ->
|
it.extraDrawFun = { batch, x, y ->
|
||||||
|
val oldCol = batch.color.cpy()
|
||||||
|
val otherCol = batch.color.cpy().also { it.a *= bodyTextShadowAlpha }
|
||||||
|
batch.color = otherCol
|
||||||
|
Toolkit.fillArea(batch, x - (indent - 2), y + doc.lineHeightInPx, 7f, 1 + (it.lineCount - 1).coerceAtLeast(1) * doc.lineHeightInPx.toFloat())
|
||||||
|
batch.color = oldCol
|
||||||
Toolkit.fillArea(batch, x - (indent - 2), y + doc.lineHeightInPx, 6f, (it.lineCount - 1).coerceAtLeast(1) * doc.lineHeightInPx.toFloat())
|
Toolkit.fillArea(batch, x - (indent - 2), y + doc.lineHeightInPx, 6f, (it.lineCount - 1).coerceAtLeast(1) * doc.lineHeightInPx.toFloat())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -727,7 +785,10 @@ object BTeXParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun typesetParagraphs(thePar: String, handler: BTeXHandler, width: Int = doc.textWidth, startingPage: Int = doc.currentPage): List<BTeXDrawCall> {
|
private fun typesetParagraphs(thePar: String, handler: BTeXHandler, width: Int = doc.textWidth, startingPage: Int = doc.currentPage): List<BTeXDrawCall> {
|
||||||
val font = getFont()
|
return typesetParagraphs(getFont(), thePar, handler, width, startingPage)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun typesetParagraphs(font: TerrarumSansBitmap, thePar: String, handler: BTeXHandler, width: Int = doc.textWidth, startingPage: Int = doc.currentPage): List<BTeXDrawCall> {
|
||||||
val slugs = MovableType(font, thePar, width)
|
val slugs = MovableType(font, thePar, width)
|
||||||
var pageNum = startingPage
|
var pageNum = startingPage
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user