Optimize spaces calculation with hex
MelonHell opened this issue · 0 comments
MelonHell commented
я думаю можно добавить альтернативные реализации SpacesGlyphResourceProducer для сокращения пробельных символов в глифах
вот пример моей реализации на kotlin, которая сокращает кол-во сиволов в пробелах примерно вдвое
основная суть в том, что тупа добавить больше вариаций пробелов, в данном примере вместо разрядов двоичной системы используются разряды шеснадцетиричной
import net.kyori.adventure.key.Key
import net.kyori.adventure.text.Component
import ru.brikster.glyphs.compile.ArbitraryCharacterFactory
import ru.brikster.glyphs.glyph.EmptyGlyph
import ru.brikster.glyphs.glyph.Glyph
import ru.brikster.glyphs.glyph.exception.ResourceAlreadyProducedException
import ru.brikster.glyphs.glyph.exception.ResourceNotProducedException
import ru.brikster.glyphs.glyph.space.SpacesGlyphResourceProducer
import ru.brikster.glyphs.util.ArrayUtil
import team.unnamed.creative.font.FontProvider
import kotlin.math.abs
class OptimizedSpacesGlyphResourceProducer(
private val key: Key = Glyph.DEFAULT_SPACES_FONT_KEY
) : SpacesGlyphResourceProducer {
private var fontProviders: Set<FontProvider>? = null
override fun fontKey() = key
private var mapping: MutableMap<Int, Char>? = null
override fun produced() = fontProviders != null
override fun produceResources(characterFactory: ArbitraryCharacterFactory) {
if (fontProviders != null) throw ResourceAlreadyProducedException()
mapping = HashMap()
val fontProviderBuilder = FontProvider.space()
sizeList.forEach { length ->
fontProviderBuilder.advance(retrieveCharacter(characterFactory, length), length)
fontProviderBuilder.advance(retrieveCharacter(characterFactory, length * -1), length * -1)
}
fontProviders = setOf<FontProvider>(fontProviderBuilder.build())
}
@Throws(ResourceNotProducedException::class)
override fun fontProviders(): Collection<FontProvider> {
return fontProviders ?: throw ResourceNotProducedException()
}
private fun retrieveCharacter(characterFactory: ArbitraryCharacterFactory, length: Int): Char {
val character = characterFactory.nextCharacter()
mapping!![length] = character
return character
}
override fun translate(length: Int): Glyph {
val lengthAbs = abs(length)
val lengthSign = length.coerceIn(-1, 1)
if (mapping == null) throw ResourceNotProducedException()
if (length == 0) return EmptyGlyph.INSTANCE
val characters: MutableList<Char?> = ArrayList()
var iter = lengthAbs
while (iter != 0) {
val charLength = sizeList.last { it <= iter }
iter -= charLength
characters.add(mapping!![charLength * lengthSign]!!)
}
return SpacesGlyph(fontKey(), ArrayUtil.toCharArray(characters), length)
}
class SpacesGlyph(
private val key: Key,
private val characters: CharArray,
private val width: Int
) : Glyph {
override fun toAdventure(): Component {
return Component.text(String(characters)).font(key)
}
override fun width(): Int = width
}
companion object {
private val sizeList = listOf(
0x1,
0x2,
0x3,
0x4,
0x5,
0x6,
0x7,
0x8,
0x9,
0xA,
0xB,
0xC,
0xD,
0xE,
0xF,
0x10,
0x20,
0x30,
0x40,
0x50,
0x60,
0x70,
0x80,
0x90,
0xA0,
0xB0,
0xC0,
0xD0,
0xE0,
0xF0,
0x100,
0x200,
0x300,
0x400,
0x500,
0x600,
0x700,
0x800,
0x900,
0xA00,
0xB00,
0xC00,
0xD00,
0xE00,
0xF00
)
}
}