some extra padding on the 'linotype' and improved method of getting text width

This commit is contained in:
minjaesong
2022-02-17 11:36:14 +09:00
parent 4e705e5c7d
commit 23a5a8997f

View File

@@ -312,7 +312,8 @@ class TerrarumSansBitmap(
private var nullProp = GlyphProps(15) private var nullProp = GlyphProps(15)
private val pixmapOffsetY = 10 private val linotypePaddingX = 16
private val linotypePaddingY = 10
fun draw(batch: Batch, charSeq: CharSequence, x: Int, y: Int) = draw(batch, charSeq, x.toFloat(), y.toFloat()) fun draw(batch: Batch, charSeq: CharSequence, x: Int, y: Int) = draw(batch, charSeq, x.toFloat(), y.toFloat())
override fun draw(batch: Batch, charSeq: CharSequence, x: Float, y: Float): GlyphLayout? { override fun draw(batch: Batch, charSeq: CharSequence, x: Float, y: Float): GlyphLayout? {
@@ -353,7 +354,7 @@ class TerrarumSansBitmap(
if (cacheObj == null || flagFirstRun) { if (cacheObj == null || flagFirstRun) {
textBuffer = newCodepoints textBuffer = newCodepoints
val (posXbuffer, posYbuffer) = buildPosMap(textBuffer) val posmap = buildPosMap(textBuffer)
flagFirstRun = false flagFirstRun = false
@@ -366,9 +367,9 @@ class TerrarumSansBitmap(
// resetHash(charSeq, x.toFloat(), y.toFloat()) // resetHash(charSeq, x.toFloat(), y.toFloat())
val textWidth = posmap.width
val _pw = posXbuffer.last() val _pw = textWidth + (linotypePaddingX * 2)
val _ph = H + (pixmapOffsetY * 2) val _ph = H + (linotypePaddingY * 2)
if (_pw < 0 || _ph < 0) throw RuntimeException("Illegal linotype dimension (w: $_pw, h: $_ph)") if (_pw < 0 || _ph < 0) throw RuntimeException("Illegal linotype dimension (w: $_pw, h: $_ph)")
val linotypePixmap = Pixmap(_pw, _ph, Pixmap.Format.RGBA8888) val linotypePixmap = Pixmap(_pw, _ph, Pixmap.Format.RGBA8888)
@@ -419,9 +420,9 @@ class TerrarumSansBitmap(
val jungTex = hangulSheet.get(indexJung, jungRow) val jungTex = hangulSheet.get(indexJung, jungRow)
val jongTex = hangulSheet.get(indexJong, jongRow) val jongTex = hangulSheet.get(indexJong, jongRow)
linotypePixmap.drawPixmap(choTex, posXbuffer[index], pixmapOffsetY, renderCol) linotypePixmap.drawPixmap(choTex, posmap.x[index] + linotypePaddingX, linotypePaddingY, renderCol)
linotypePixmap.drawPixmap(jungTex, posXbuffer[index], pixmapOffsetY, renderCol) linotypePixmap.drawPixmap(jungTex, posmap.x[index] + linotypePaddingX, linotypePaddingY, renderCol)
linotypePixmap.drawPixmap(jongTex, posXbuffer[index], pixmapOffsetY, renderCol) linotypePixmap.drawPixmap(jongTex, posmap.x[index] + linotypePaddingX, linotypePaddingY, renderCol)
index += hangulLength - 1 index += hangulLength - 1
@@ -429,17 +430,17 @@ class TerrarumSansBitmap(
} }
else { else {
try { try {
val posY = posYbuffer[index].flipY() + val posY = posmap.y[index].flipY() +
if (sheetID == SHEET_UNIHAN) // evil exceptions if (sheetID == SHEET_UNIHAN) // evil exceptions
offsetUnihan offsetUnihan
else if (sheetID == SHEET_CUSTOM_SYM) else if (sheetID == SHEET_CUSTOM_SYM)
offsetCustomSym offsetCustomSym
else 0 else 0
val posX = posXbuffer[index] val posX = posmap.x[index]
val texture = sheets[sheetID].get(sheetX, sheetY) val texture = sheets[sheetID].get(sheetX, sheetY)
linotypePixmap.drawPixmap(texture, posX, posY + pixmapOffsetY, renderCol) linotypePixmap.drawPixmap(texture, posX + linotypePaddingX, posY + linotypePaddingY, renderCol)
} }
@@ -465,7 +466,7 @@ class TerrarumSansBitmap(
// put things into cache // put things into cache
//textCache[charSeq] = ShittyGlyphLayout(textBuffer, linotype!!) //textCache[charSeq] = ShittyGlyphLayout(textBuffer, linotype!!)
addToCache(textBuffer, tempLinotype, posXbuffer.last()) addToCache(textBuffer, tempLinotype, textWidth)
linotypePixmap.dispose() linotypePixmap.dispose()
} }
else { else {
@@ -474,8 +475,8 @@ class TerrarumSansBitmap(
} }
batch.draw(tempLinotype, batch.draw(tempLinotype,
x.toFloat(), (x - linotypePaddingX).toFloat(),
(y - pixmapOffsetY).toFloat() + (if (flipY) (tempLinotype.height) else 0) * scale, (y - linotypePaddingY).toFloat() + (if (flipY) (tempLinotype.height) else 0) * scale,
tempLinotype.width.toFloat() * scale, tempLinotype.width.toFloat() * scale,
(tempLinotype.height.toFloat()) * (if (flipY) -1 else 1) * scale (tempLinotype.height.toFloat()) * (if (flipY) -1 else 1) * scale
) )
@@ -757,7 +758,7 @@ class TerrarumSansBitmap(
return cacheObj.glyphLayout!!.width return cacheObj.glyphLayout!!.width
} }
else { else {
return buildPosMap(s).first.last() return buildPosMap(s).width
} }
} }
@@ -769,7 +770,7 @@ class TerrarumSansBitmap(
* @return Pair of X-positions and Y-positions, of which the X-position's size is greater than the string * @return Pair of X-positions and Y-positions, of which the X-position's size is greater than the string
* and the last element marks the width of entire string. * and the last element marks the width of entire string.
*/ */
private fun buildPosMap(str: List<Int>): Pair<IntArray, IntArray> { private fun buildPosMap(str: List<Int>): Posmap {
val posXbuffer = IntArray(str.size + 1) { 0 } val posXbuffer = IntArray(str.size + 1) { 0 }
val posYbuffer = IntArray(str.size) { 0 } val posYbuffer = IntArray(str.size) { 0 }
@@ -966,7 +967,7 @@ class TerrarumSansBitmap(
} }
catch (e: NullPointerException) {} catch (e: NullPointerException) {}
return posXbuffer to posYbuffer return Posmap(posXbuffer, posYbuffer)
} }
private fun CodepointSequence.utf16to32(): CodepointSequence { private fun CodepointSequence.utf16to32(): CodepointSequence {
@@ -1908,6 +1909,9 @@ class TerrarumSansBitmap(
return (this.hash - other.hash).sign return (this.hash - other.hash).sign
} }
} }
data class Posmap(val x: IntArray, val y: IntArray) {
val width = x.maxOf { it }
}
private val HCF = 0x115F private val HCF = 0x115F