new greek and more tweaks

Former-commit-id: 0c480dd7ce173a37f2f48b5b5d711c2641cbda00
Former-commit-id: 18492d01862bdeecb9c0eba825a3b25da76211b0
This commit is contained in:
Song Minjae
2017-02-12 04:12:26 +09:00
parent 226ae77ab4
commit add2be7109
3 changed files with 44 additions and 116 deletions

View File

@@ -112,9 +112,6 @@ open class GameFontBase : Font {
private fun greekIndexX(c: Char) = (c.toInt() - 0x370) % 16 private fun greekIndexX(c: Char) = (c.toInt() - 0x370) % 16
private fun greekIndexY(c: Char) = (c.toInt() - 0x370) / 16 private fun greekIndexY(c: Char) = (c.toInt() - 0x370) / 16
private fun greekEFIndexX(c: Char) = greekEFList.indexOf(c) % 16
private fun greekEFIndexY(c: Char) = greekEFList.indexOf(c) / 16
private fun romanianIndexX(c: Char) = c.toInt() - 0x218 private fun romanianIndexX(c: Char) = c.toInt() - 0x218
private fun romanianIndexY(c: Char) = 0 private fun romanianIndexY(c: Char) = 0
@@ -128,7 +125,6 @@ open class GameFontBase : Font {
private fun keycapIndexY(c: Char) = (c.toInt() - 0xE000) / 16 private fun keycapIndexY(c: Char) = (c.toInt() - 0xE000) / 16
private val narrowWidthSheets = arrayOf( private val narrowWidthSheets = arrayOf(
SHEET_GREEK_EF,
SHEET_EXTB_ROMANIAN_EF SHEET_EXTB_ROMANIAN_EF
) )
private val unihanWidthSheets = arrayOf( private val unihanWidthSheets = arrayOf(
@@ -140,6 +136,12 @@ open class GameFontBase : Font {
private val zeroWidthSheets = arrayOf( private val zeroWidthSheets = arrayOf(
SHEET_COLOURCODE SHEET_COLOURCODE
) )
private val variableWidthSheets = arrayOf(
SHEET_ASCII_VARW,
SHEET_CYRILIC_VARW,
SHEET_EXTA_VARW,
SHEET_GREEK_VARW
)
override fun getWidth(s: String) = getWidthSubstr(s, s.length) override fun getWidth(s: String) = getWidthSubstr(s, s.length)
@@ -150,14 +152,17 @@ open class GameFontBase : Font {
val chr = s[i] val chr = s[i]
val ctype = getSheetType(s[i]) val ctype = getSheetType(s[i])
if (chr.toInt() == 0x21B) // HAX! if (chr.toInt() == 0x21B) // Romanian t; HAX!
len += 6 len += 6
else if ( else if (variableWidthSheets.contains(ctype)) {
ctype == SHEET_ASCII_VARW || try {
ctype == SHEET_EXTA_VARW || len += asciiWidths[chr.toInt()]!!
ctype == SHEET_CYRILIC_VARW }
) catch (e: kotlin.KotlinNullPointerException) {
len += asciiWidths[chr.toInt()]!! println("KotlinNullPointerException on glyph number ${Integer.toHexString(chr.toInt()).toUpperCase()}")
System.exit(1)
}
}
else if (zeroWidthSheets.contains(ctype)) else if (zeroWidthSheets.contains(ctype))
len += 0 len += 0
else if (narrowWidthSheets.contains(ctype)) else if (narrowWidthSheets.contains(ctype))
@@ -271,12 +276,6 @@ open class GameFontBase : Font {
if (isWenQuanYi1(ch)) { if (isWenQuanYi1(ch)) {
val glyphW = getWidth("" + ch) val glyphW = getWidth("" + ch)
/*wenQuanYi_1.renderInUse(
Math.round(x + getWidthSubstr(s, i + 1) - glyphW),
Math.round((H - H_UNIHAN) / 2 + y),
wenQuanYiIndexX(ch),
wenQuanYi1IndexY(ch)
)*/
wenQuanYi_1.getSubImage(wenQuanYiIndexX(ch), wenQuanYi1IndexY(ch)).drawWithShadow( wenQuanYi_1.getSubImage(wenQuanYiIndexX(ch), wenQuanYi1IndexY(ch)).drawWithShadow(
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(), Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
Math.round((H - H_UNIHAN) / 2 + y).toFloat(), Math.round((H - H_UNIHAN) / 2 + y).toFloat(),
@@ -299,12 +298,6 @@ open class GameFontBase : Font {
if (isWenQuanYi2(ch)) { if (isWenQuanYi2(ch)) {
val glyphW = getWidth("" + ch) val glyphW = getWidth("" + ch)
/*wenQuanYi_2.renderInUse(
Math.round(x + getWidthSubstr(s, i + 1) - glyphW),
Math.round((H - H_UNIHAN) / 2 + y),
wenQuanYiIndexX(ch),
wenQuanYi2IndexY(ch)
)*/
wenQuanYi_2.getSubImage(wenQuanYiIndexX(ch), wenQuanYi2IndexY(ch)).drawWithShadow( wenQuanYi_2.getSubImage(wenQuanYiIndexX(ch), wenQuanYi2IndexY(ch)).drawWithShadow(
Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(), Math.round(x + getWidthSubstr(s, i + 1) - glyphW).toFloat(),
Math.round((H - H_UNIHAN) / 2 + y).toFloat(), Math.round((H - H_UNIHAN) / 2 + y).toFloat(),
@@ -365,14 +358,10 @@ open class GameFontBase : Font {
sheetX = uniPunctIndexX(ch) sheetX = uniPunctIndexX(ch)
sheetY = uniPunctIndexY(ch) sheetY = uniPunctIndexY(ch)
} }
SHEET_GREEK_EM -> { SHEET_GREEK_VARW -> {
sheetX = greekIndexX(ch) sheetX = greekIndexX(ch)
sheetY = greekIndexY(ch) sheetY = greekIndexY(ch)
} }
SHEET_GREEK_EF -> {
sheetX = greekEFIndexX(ch)
sheetY = greekEFIndexY(ch)
}
SHEET_EXTB_ROMANIAN_EM -> { SHEET_EXTB_ROMANIAN_EM -> {
sheetX = romanianIndexX(ch) sheetX = romanianIndexX(ch)
sheetY = romanianIndexY(ch) sheetY = romanianIndexY(ch)
@@ -428,9 +417,7 @@ open class GameFontBase : Font {
private fun getSheetType(c: Char): Int { private fun getSheetType(c: Char): Int {
// EFs // EFs
if (isGreekEF(c)) if (isRomanianEF(c))
return SHEET_GREEK_EF
else if (isRomanianEF(c))
return SHEET_EXTB_ROMANIAN_EF return SHEET_EXTB_ROMANIAN_EF
else if (isThaiEF(c)) else if (isThaiEF(c))
return SHEET_EXTA_VARW // will use fourth glyph in EXTA_EF return SHEET_EXTA_VARW // will use fourth glyph in EXTA_EF
@@ -455,7 +442,7 @@ open class GameFontBase : Font {
else if (isFullwidthUni(c)) else if (isFullwidthUni(c))
return SHEET_FW_UNI return SHEET_FW_UNI
else if (isGreek(c)) else if (isGreek(c))
return SHEET_GREEK_EM return SHEET_GREEK_VARW
else if (isRomanian(c)) else if (isRomanian(c))
return SHEET_EXTB_ROMANIAN_EM return SHEET_EXTB_ROMANIAN_EM
else if (isThai(c)) else if (isThai(c))
@@ -504,19 +491,16 @@ open class GameFontBase : Font {
fun Char.isColourCode() = colourKey.containsKey(this) fun Char.isColourCode() = colourKey.containsKey(this)
/** fun buildWidthTable(sheet: SpriteSheet, codeOffset: Int, codeRange: IntRange, rows: Int = 16) {
* Assumes spritesheet to has 16x16 cells
*/
fun buildAsciiWidthTable() {
val binaryCodeOffset = 15 val binaryCodeOffset = 15
val cellW = asciiSheet.getSubImage(0, 0).width + 1 // should be 16 val cellW = sheet.getSubImage(0, 0).width + 1 // should be 16
val cellH = asciiSheet.getSubImage(0, 0).height + 1 // should be 20 val cellH = sheet.getSubImage(0, 0).height + 1 // should be 20
// control chars // control chars
for (ccode in 0..255) { for (ccode in codeRange) {
val glyphX = ccode % 16 val glyphX = ccode % rows
val glyphY = ccode / 16 val glyphY = ccode / rows
val codeStartX = (glyphX * cellW) + binaryCodeOffset val codeStartX = (glyphX * cellW) + binaryCodeOffset
val codeStartY = (glyphY * cellH) val codeStartY = (glyphY * cellH)
@@ -524,64 +508,12 @@ open class GameFontBase : Font {
var glyphWidth = 0 var glyphWidth = 0
for (downCtr in 0..3) { for (downCtr in 0..3) {
// if alpha is not zero, assume it's 1 // if alpha is not zero, assume it's 1
if (asciiSheet.texture.getPixel(codeStartX, codeStartY + downCtr)[3] == 255) { if (sheet.texture.getPixel(codeStartX, codeStartY + downCtr)[3] == 255) {
glyphWidth = glyphWidth or (1 shl downCtr) glyphWidth = glyphWidth or (1 shl downCtr)
} }
} }
asciiWidths[ccode] = glyphWidth asciiWidths[codeOffset + ccode] = glyphWidth
}
}
fun buildLatinExtAWidthTable() {
val binaryCodeOffset = 15
val cellW = extASheet.getSubImage(0, 0).width + 1 // should be 16
val cellH = extASheet.getSubImage(0, 0).height + 1 // should be 20
// control chars
for (ccode in 0..127) {
val glyphX = ccode % 16
val glyphY = ccode / 16
val codeStartX = (glyphX * cellW) + binaryCodeOffset
val codeStartY = (glyphY * cellH)
var glyphWidth = 0
for (downCtr in 0..3) {
// if alpha is not zero, assume it's 1
if (extASheet.texture.getPixel(codeStartX, codeStartY + downCtr)[3] == 255) {
glyphWidth = glyphWidth or (1 shl downCtr)
}
}
asciiWidths[0x100 + ccode] = glyphWidth
}
}
fun buildCyrillicWidthTable() {
val binaryCodeOffset = 15
val cellW = cyrilic.getSubImage(0, 0).width + 1 // should be 16
val cellH = cyrilic.getSubImage(0, 0).height + 1 // should be 20
// control chars
for (ccode in 0..0x5F) {
val glyphX = ccode % 16
val glyphY = ccode / 16
val codeStartX = (glyphX * cellW) + binaryCodeOffset
val codeStartY = (glyphY * cellH)
var glyphWidth = 0
for (downCtr in 0..3) {
// if alpha is not zero, assume it's 1
if (cyrilic.texture.getPixel(codeStartX, codeStartY + downCtr)[3] == 255) {
glyphWidth = glyphWidth or (1 shl downCtr)
}
}
asciiWidths[0x400 + ccode] = glyphWidth
} }
} }
@@ -603,7 +535,6 @@ open class GameFontBase : Font {
lateinit internal var wenQuanYi_1: SpriteSheet lateinit internal var wenQuanYi_1: SpriteSheet
lateinit internal var wenQuanYi_2: SpriteSheet lateinit internal var wenQuanYi_2: SpriteSheet
lateinit internal var greekSheet: SpriteSheet lateinit internal var greekSheet: SpriteSheet
lateinit internal var greekSheetEF: SpriteSheet
lateinit internal var romanianSheet: SpriteSheet lateinit internal var romanianSheet: SpriteSheet
lateinit internal var romanianSheetEF: SpriteSheet lateinit internal var romanianSheetEF: SpriteSheet
lateinit internal var thaiSheet: SpriteSheet lateinit internal var thaiSheet: SpriteSheet
@@ -638,13 +569,12 @@ open class GameFontBase : Font {
internal val SHEET_UNI_PUNCT = 9 internal val SHEET_UNI_PUNCT = 9
internal val SHEET_WENQUANYI_1 = 10 internal val SHEET_WENQUANYI_1 = 10
internal val SHEET_WENQUANYI_2 = 11 internal val SHEET_WENQUANYI_2 = 11
internal val SHEET_GREEK_EM = 12 internal val SHEET_GREEK_VARW = 12
internal val SHEET_GREEK_EF = 13 internal val SHEET_EXTB_ROMANIAN_EM = 13
internal val SHEET_EXTB_ROMANIAN_EM = 14 internal val SHEET_EXTB_ROMANIAN_EF = 14
internal val SHEET_EXTB_ROMANIAN_EF = 15 internal val SHEET_THAI_EM = 15
internal val SHEET_THAI_EM = 16 internal val SHEET_THAI_EF = 16
internal val SHEET_THAI_EF = 17 internal val SHEET_KEYCAP = 17
internal val SHEET_KEYCAP = 18
internal val SHEET_UNKNOWN = 254 internal val SHEET_UNKNOWN = 254
internal val SHEET_COLOURCODE = 255 internal val SHEET_COLOURCODE = 255

View File

@@ -39,9 +39,7 @@ class GameFontWhite : GameFontBase() {
GameFontBase.wenQuanYi_2 = SpriteSheet( GameFontBase.wenQuanYi_2 = SpriteSheet(
"./assets/graphics/fonts/wenquanyi_11pt_part2.tga", 16, 18, 2) "./assets/graphics/fonts/wenquanyi_11pt_part2.tga", 16, 18, 2)
GameFontBase.greekSheet = SpriteSheet( GameFontBase.greekSheet = SpriteSheet(
"./assets/graphics/fonts/greek_fullwidth.tga", GameFontBase.W_LATIN_WIDE, GameFontBase.H) "./assets/graphics/fonts/greek_variable.tga", 15, 19, 1)
GameFontBase.greekSheetEF = SpriteSheet(
"./assets/graphics/fonts/greek_ef.tga", GameFontBase.W_LATIN_NARROW, GameFontBase.H)
GameFontBase.romanianSheet = SpriteSheet( GameFontBase.romanianSheet = SpriteSheet(
"./assets/graphics/fonts/romana_fullwidth.tga", GameFontBase.W_LATIN_WIDE, GameFontBase.H) "./assets/graphics/fonts/romana_fullwidth.tga", GameFontBase.W_LATIN_WIDE, GameFontBase.H)
GameFontBase.romanianSheetEF = SpriteSheet( GameFontBase.romanianSheetEF = SpriteSheet(
@@ -65,7 +63,6 @@ class GameFontWhite : GameFontBase() {
GameFontBase.wenQuanYi_1, GameFontBase.wenQuanYi_1,
GameFontBase.wenQuanYi_2, GameFontBase.wenQuanYi_2,
GameFontBase.greekSheet, GameFontBase.greekSheet,
GameFontBase.greekSheetEF,
GameFontBase.romanianSheet, GameFontBase.romanianSheet,
GameFontBase.romanianSheetEF, GameFontBase.romanianSheetEF,
GameFontBase.thaiSheet, GameFontBase.thaiSheet,
@@ -75,8 +72,9 @@ class GameFontWhite : GameFontBase() {
GameFontBase.sheetKey = shk GameFontBase.sheetKey = shk
buildAsciiWidthTable() buildWidthTable(asciiSheet, 0, 0..0xFF)
buildLatinExtAWidthTable() buildWidthTable(extASheet, 0x100, 0..0x7F)
buildCyrillicWidthTable() buildWidthTable(cyrilic, 0x400, 0..0x5F)
buildWidthTable(greekSheet, 0x370, 0..0x5F)
} }
} }

View File

@@ -72,14 +72,14 @@ nopqrstuvwxyz
val line = " **** TERRAN BASIC V0.5 **** " val line = " **** TERRAN BASIC V0.5 **** "
g.drawString("ABCDEFGHIJKLM", 10f, 10f) g.drawString("ABCDEFGHIJKLMN", 10f, 10f)
g.drawString("NOPQRSTÜVWXYZ", 10f, 30f) g.drawString("OPQRSTÜVWXYZÆŒ", 10f, 30f)
g.drawString("abcdefghijklmno", 160f, 10f) g.drawString("abcdefghijklmno", 160f, 10f)
g.drawString("pqrstuvwxyzߌ", 160f, 30f) g.drawString("pqrstuvwxyzßæœ", 160f, 30f)
g.drawString("1234567890", 320f, 10f) g.drawString("1234567890", 320f, 10f)
g.drawString("minimum kerning keming Nannu Namu", 320f, 30f) g.drawString("minimum kerning keming Narnu Namu", 320f, 30f)
g.drawString("Syö salmiakkia perkele", 480f, 10f) g.drawString("Syö salmiakkia perkele", 480f, 10f)
@@ -97,9 +97,9 @@ nopqrstuvwxyz
"britiske besiddelser, foreløbigt i 1957 og endeligt i 1963.", "britiske besiddelser, foreløbigt i 1957 og endeligt i 1963.",
"", "",
"διαφυλάξτε γενικά τη ζωή σας από βαθειά ψυχικά τραύματα", "διαφυλάξτε γενικά τη ζωή σας από βαθειά ψυχικά τραύματα",
"ΔΙΑΦΥΛΆΞΤΕ ΓΕΝΙΚΆ ΤΗ ΖΩΉ ΣΑΣ ΑΠΌ ΒΑΘΕΙΆ ΨΥΧΙΚΆ ΤΡΑΎΜΑΤΑ",
"Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.", "Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.",
"Příliš žluťoučký kůň úpěl ďábelské ódy. Árvíztűrő tükörfúrógép ", "Příliš žluťoučký kůň úpěl ďábelské ódy. Árvíztűrő tükörfúrógép ",
"Põdur Zagrebi tšellomängija-följetonist Ciqo külmetas kehvas garaažis ",
"Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich", "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich",
"Pijamalı hasta yağız şoföre çabucak güvendi. Kŕdeľ ďatľov učí koňa žrať kôru.", "Pijamalı hasta yağız şoföre çabucak güvendi. Kŕdeľ ďatľov učí koňa žrať kôru.",
"Voix ambiguë d'un cœur qui au zéphyr préfère les jattes de kiwi", "Voix ambiguë d'un cœur qui au zéphyr préfère les jattes de kiwi",
@@ -113,7 +113,7 @@ nopqrstuvwxyz
"mála sem einkenndust af því að opinberir aðilar virtu ekki stjórnarskrárvarin réttindi einstaklingsins.", "mála sem einkenndust af því að opinberir aðilar virtu ekki stjórnarskrárvarin réttindi einstaklingsins.",
"", "",
"Also supports:", "Also supports:",
"키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다. 대한민국 머한민국 대구 머구 명작 띵작 유식 윾싀", "키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다. 대한민국 머한민국 (대구) {머구} 명작 띵작 유식 윾싀",
"とりなくこゑす ゆめさませ みよあけわたる ひんかしを そらいろはえて おきつへに ほふねむれゐぬ もやのうち", "とりなくこゑす ゆめさませ みよあけわたる ひんかしを そらいろはえて おきつへに ほふねむれゐぬ もやのうち",
"鳥啼く声す 夢覚ませ 見よ明け渡る 東を 空色栄えて 沖つ辺に 帆船群れゐぬ 靄の中 (using WenQuanYi)", "鳥啼く声す 夢覚ませ 見よ明け渡る 東を 空色栄えて 沖つ辺に 帆船群れゐぬ 靄の中 (using WenQuanYi)",
"" ""