mirror of
https://github.com/curioustorvald/Terrarum-sans-bitmap.git
synced 2026-06-14 17:44:05 +09:00
aggressive cacheing (ShittyGlyphLayout)
This commit is contained in:
24
.idea/workspace.xml
generated
24
.idea/workspace.xml
generated
@@ -32,8 +32,8 @@
|
|||||||
<file leaf-file-name="GameFontBase.kt" pinned="false" current-in-tab="true">
|
<file leaf-file-name="GameFontBase.kt" pinned="false" current-in-tab="true">
|
||||||
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt">
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="468">
|
<state relative-caret-position="424">
|
||||||
<caret line="673" column="29" selection-start-line="673" selection-start-column="29" selection-end-line="673" selection-end-column="29" />
|
<caret line="1366" column="5" selection-start-line="1366" selection-start-column="5" selection-end-line="1366" selection-end-column="5" />
|
||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -89,8 +89,8 @@
|
|||||||
<file leaf-file-name="GameFontBase.kt" pinned="false" current-in-tab="true">
|
<file leaf-file-name="GameFontBase.kt" pinned="false" current-in-tab="true">
|
||||||
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt">
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="435">
|
<state relative-caret-position="533">
|
||||||
<caret line="481" column="13" lean-forward="true" selection-start-line="481" selection-start-column="13" selection-end-line="481" selection-end-column="13" />
|
<caret line="678" column="28" selection-start-line="678" selection-start-column="28" selection-end-line="678" selection-end-column="28" />
|
||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
</entry>
|
</entry>
|
||||||
@@ -163,11 +163,6 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="FindInProjectRecents">
|
<component name="FindInProjectRecents">
|
||||||
<findStrings>
|
<findStrings>
|
||||||
<find>lastNonDiacriticChar</find>
|
|
||||||
<find>c.toInt()</find>
|
|
||||||
<find>har.toInt()</find>
|
|
||||||
<find>println</find>
|
|
||||||
<find>!!</find>
|
|
||||||
<find>ArrayList<Int></find>
|
<find>ArrayList<Int></find>
|
||||||
<find>appConfig.height</find>
|
<find>appConfig.height</find>
|
||||||
<find>textBuffer</find>
|
<find>textBuffer</find>
|
||||||
@@ -193,6 +188,11 @@
|
|||||||
<find>getWidth</find>
|
<find>getWidth</find>
|
||||||
<find>getWidthOfCharSeq</find>
|
<find>getWidthOfCharSeq</find>
|
||||||
<find>makeShadow</find>
|
<find>makeShadow</find>
|
||||||
|
<find>fun draw</find>
|
||||||
|
<find>glyphWidthBuffer</find>
|
||||||
|
<find>oldCharSequence</find>
|
||||||
|
<find>charSeq.toCodeP</find>
|
||||||
|
<find>resetH</find>
|
||||||
</findStrings>
|
</findStrings>
|
||||||
<replaceStrings>
|
<replaceStrings>
|
||||||
<replace>.141</replace>
|
<replace>.141</replace>
|
||||||
@@ -507,7 +507,7 @@
|
|||||||
<layout>
|
<layout>
|
||||||
<window_info anchor="right" id="Palette" order="3" />
|
<window_info anchor="right" id="Palette" order="3" />
|
||||||
<window_info anchor="bottom" id="TODO" order="6" />
|
<window_info anchor="bottom" id="TODO" order="6" />
|
||||||
<window_info anchor="bottom" id="Messages" order="7" weight="0.32745826" />
|
<window_info anchor="bottom" id="Messages" order="7" weight="0.20779221" />
|
||||||
<window_info anchor="right" id="Palette	" order="3" />
|
<window_info anchor="right" id="Palette	" order="3" />
|
||||||
<window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
|
<window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
|
||||||
<window_info anchor="right" id="Maven Projects" order="3" />
|
<window_info anchor="right" id="Maven Projects" order="3" />
|
||||||
@@ -932,8 +932,8 @@
|
|||||||
</entry>
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt">
|
<entry file="file://$PROJECT_DIR$/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="435">
|
<state relative-caret-position="533">
|
||||||
<caret line="481" column="13" lean-forward="true" selection-start-line="481" selection-start-column="13" selection-end-line="481" selection-end-column="13" />
|
<caret line="678" column="28" selection-start-line="678" selection-start-column="28" selection-end-line="678" selection-end-column="28" />
|
||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
</entry>
|
</entry>
|
||||||
|
|||||||
Binary file not shown.
@@ -33,6 +33,8 @@ import com.badlogic.gdx.utils.GdxRuntimeException
|
|||||||
import net.torvald.terrarumsansbitmap.GlyphProps
|
import net.torvald.terrarumsansbitmap.GlyphProps
|
||||||
import java.io.BufferedOutputStream
|
import java.io.BufferedOutputStream
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
|
import java.security.MessageDigest
|
||||||
|
import java.util.zip.CRC32
|
||||||
import java.util.zip.GZIPInputStream
|
import java.util.zip.GZIPInputStream
|
||||||
|
|
||||||
typealias CodepointSequence = ArrayList<Int>
|
typealias CodepointSequence = ArrayList<Int>
|
||||||
@@ -280,6 +282,10 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
private fun Int.isLowHeight() = this.and(0xFFFF).toChar() in lowHeightLetters
|
private fun Int.isLowHeight() = this.and(0xFFFF).toChar() in lowHeightLetters
|
||||||
|
|
||||||
|
|
||||||
|
private data class ShittyGlyphLayout(val textBuffer: CodepointSequence, val posXbuffer: IntArray, val posYbuffer: IntArray)
|
||||||
|
private val textCache = HashMap<CharSequence, ShittyGlyphLayout>()
|
||||||
|
|
||||||
|
|
||||||
private fun getColour(codePoint: Int): Color { // input: 0x10ARGB, out: RGBA8888
|
private fun getColour(codePoint: Int): Color { // input: 0x10ARGB, out: RGBA8888
|
||||||
if (colourBuffer.containsKey(codePoint))
|
if (colourBuffer.containsKey(codePoint))
|
||||||
return colourBuffer[codePoint]!!
|
return colourBuffer[codePoint]!!
|
||||||
@@ -531,12 +537,9 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
|
|
||||||
private var firstRun = true
|
private var firstRun = true
|
||||||
private var textBuffer = CodepointSequence(256)
|
private var textBuffer = CodepointSequence(256)
|
||||||
private var oldCharSequence = ""
|
//private var oldCharSequence = ""
|
||||||
//private lateinit var textTexture: FrameBuffer
|
|
||||||
//private val textTexCamera = OrthographicCamera()
|
|
||||||
private var posXbuffer = intArrayOf() // absolute posX of glyphs from print-origin
|
private var posXbuffer = intArrayOf() // absolute posX of glyphs from print-origin
|
||||||
private var posYbuffer = intArrayOf() // absolute posY of glyphs from print-origin
|
private var posYbuffer = intArrayOf() // absolute posY of glyphs from print-origin
|
||||||
private var glyphWidthBuffer = intArrayOf() // width of each glyph
|
|
||||||
|
|
||||||
private lateinit var originalColour: Color
|
private lateinit var originalColour: Color
|
||||||
|
|
||||||
@@ -555,8 +558,11 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
|
|
||||||
|
|
||||||
if (charSeq.isNotBlank()) {
|
if (charSeq.isNotBlank()) {
|
||||||
if (oldCharSequence != charSeq || firstRun) {
|
|
||||||
|
|
||||||
|
if (!textCache.containsKey(charSeq) || firstRun) {
|
||||||
textBuffer = charSeq.toCodePoints()
|
textBuffer = charSeq.toCodePoints()
|
||||||
|
|
||||||
//val texWidth = widths.sum()
|
//val texWidth = widths.sum()
|
||||||
|
|
||||||
//if (!firstRun) textTexture.dispose()
|
//if (!firstRun) textTexture.dispose()
|
||||||
@@ -569,7 +575,24 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
//print("[TerrarumSansBitmap] widthTable for $textBuffer: ")
|
//print("[TerrarumSansBitmap] widthTable for $textBuffer: ")
|
||||||
//posXbuffer.forEach { print("$it ") }; println()
|
//posXbuffer.forEach { print("$it ") }; println()
|
||||||
|
|
||||||
|
|
||||||
|
textCache[charSeq] = ShittyGlyphLayout(
|
||||||
|
textBuffer,
|
||||||
|
posXbuffer,
|
||||||
|
posYbuffer
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
firstRun = false
|
firstRun = false
|
||||||
|
|
||||||
|
//println("text not in buffer: $charSeq")
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
val bufferObj = textCache[charSeq]
|
||||||
|
|
||||||
|
textBuffer = bufferObj!!.textBuffer
|
||||||
|
posXbuffer = bufferObj!!.posXbuffer
|
||||||
|
posYbuffer = bufferObj!!.posYbuffer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -589,7 +612,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
//println()
|
//println()
|
||||||
|
|
||||||
|
|
||||||
resetHash()
|
resetHash(charSeq, x, y)
|
||||||
var index = 0
|
var index = 0
|
||||||
while (index <= textBuffer.lastIndex) {
|
while (index <= textBuffer.lastIndex) {
|
||||||
val c = textBuffer[index]
|
val c = textBuffer[index]
|
||||||
@@ -597,7 +620,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
val (sheetX, sheetY) =
|
val (sheetX, sheetY) =
|
||||||
if (index == 0) getSheetwisePosition(0, c)
|
if (index == 0) getSheetwisePosition(0, c)
|
||||||
else getSheetwisePosition(textBuffer[index - 1], c)
|
else getSheetwisePosition(textBuffer[index - 1], c)
|
||||||
val hash = getHash(c)
|
val hash = getHash(c) // to be used with Bad Transmission Modifier
|
||||||
|
|
||||||
if (isColourCode(c)) {
|
if (isColourCode(c)) {
|
||||||
if (c == 0x100000) {
|
if (c == 0x100000) {
|
||||||
@@ -642,7 +665,6 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
val posY = y + posYbuffer[index].flipY() +
|
val posY = y + posYbuffer[index].flipY() +
|
||||||
if (sheetID == SHEET_UNIHAN) // evil exceptions
|
if (sheetID == SHEET_UNIHAN) // evil exceptions
|
||||||
offsetUnihan
|
offsetUnihan
|
||||||
@@ -1049,8 +1071,6 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
val str = textBuffer
|
val str = textBuffer
|
||||||
val widths = getWidthOfCharSeq(str)
|
val widths = getWidthOfCharSeq(str)
|
||||||
|
|
||||||
glyphWidthBuffer = widths
|
|
||||||
|
|
||||||
posXbuffer = IntArray(str.size, { 0 })
|
posXbuffer = IntArray(str.size, { 0 })
|
||||||
posYbuffer = IntArray(str.size, { 0 })
|
posYbuffer = IntArray(str.size, { 0 })
|
||||||
|
|
||||||
@@ -1338,12 +1358,41 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
|
|||||||
hashAccumulator *= hashPrime
|
hashAccumulator *= hashPrime
|
||||||
return hashAccumulator
|
return hashAccumulator
|
||||||
}
|
}
|
||||||
fun resetHash() {
|
fun resetHash(charSeq: CharSequence, x: Float, y: Float) {
|
||||||
hashAccumulator = hashBasis
|
hashAccumulator = hashBasis
|
||||||
|
|
||||||
|
getHash(charSeq.crc32())
|
||||||
|
getHash(x.toRawBits())
|
||||||
|
getHash(y.toRawBits())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Int.toHex() = "U+${this.toString(16).padStart(4, '0').toUpperCase()}"
|
private fun Int.toHex() = "U+${this.toString(16).padStart(4, '0').toUpperCase()}"
|
||||||
|
|
||||||
|
private fun CharSequence.sha256(): ByteArray {
|
||||||
|
val digest = MessageDigest.getInstance("SHA-256")
|
||||||
|
this.forEach {
|
||||||
|
val it = it.toInt()
|
||||||
|
val b1 = it.shl(8).and(255).toByte()
|
||||||
|
val b2 = it.and(255).toByte()
|
||||||
|
digest.update(b1)
|
||||||
|
digest.update(b2)
|
||||||
|
}
|
||||||
|
|
||||||
|
return digest.digest()
|
||||||
|
}
|
||||||
|
private fun CharSequence.crc32(): Int {
|
||||||
|
val crc = CRC32()
|
||||||
|
this.forEach {
|
||||||
|
val it = it.toInt()
|
||||||
|
val b1 = it.shl(8).and(255)
|
||||||
|
val b2 = it.and(255)
|
||||||
|
crc.update(b1)
|
||||||
|
crc.update(b2)
|
||||||
|
}
|
||||||
|
|
||||||
|
return crc.value.toInt()
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
internal val JUNG_COUNT = 21
|
internal val JUNG_COUNT = 21
|
||||||
internal val JONG_COUNT = 28
|
internal val JONG_COUNT = 28
|
||||||
|
|||||||
Reference in New Issue
Block a user