diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 5fc7b0a..40966ba 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -8,13 +8,12 @@
-
-
-
-
+
+
+
@@ -35,11 +34,11 @@
-
+
-
-
+
+
@@ -56,31 +55,21 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
@@ -88,29 +77,39 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -119,7 +118,7 @@
-
+
@@ -165,8 +164,6 @@
- fun relo
- 3633
println(
Width ta
getWidth
@@ -195,6 +192,8 @@
pro
system
this font
+ posXbuffer
+ U+
.141
@@ -220,25 +219,25 @@
-
-
-
+
+
+
-
-
-
-
+
+
+
+
@@ -280,7 +279,6 @@
-
@@ -349,16 +347,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -449,6 +437,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -505,11 +503,10 @@
-
-
+
@@ -517,11 +514,11 @@
-
+
-
+
@@ -534,13 +531,13 @@
+
-
@@ -549,7 +546,7 @@
-
+
@@ -854,13 +851,6 @@
-
-
-
-
-
-
-
@@ -875,7 +865,7 @@
-
+
@@ -887,24 +877,17 @@
-
+
-
-
-
-
-
-
-
-
-
+
+
-
+
@@ -913,29 +896,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
diff --git a/FontTestGDX/lib/TerrarumSansBitmap.jar b/FontTestGDX/lib/TerrarumSansBitmap.jar
index 171803c..1b2421e 100644
Binary files a/FontTestGDX/lib/TerrarumSansBitmap.jar and b/FontTestGDX/lib/TerrarumSansBitmap.jar differ
diff --git a/FontTestGDX/src/FontTestGDX.kt b/FontTestGDX/src/FontTestGDX.kt
index 03e06ba..87a7c57 100644
--- a/FontTestGDX/src/FontTestGDX.kt
+++ b/FontTestGDX/src/FontTestGDX.kt
@@ -23,8 +23,8 @@ class FontTestGDX : Game() {
lateinit var camera: OrthographicCamera
- private val demotextName = "testtext.txt"
- private val outimageName = "testing.png"
+ private val demotextName = "demotext.txt"
+ private val outimageName = "demo.png"
override fun create() {
font = GameFontBase("./assets", flipY = false, errorOnUnknownChar = false) // must test for two flipY cases
diff --git a/PUA_allocation_chart.xlsx b/PUA_allocation_chart.xlsx
index 16e8c62..299691c 100644
Binary files a/PUA_allocation_chart.xlsx and b/PUA_allocation_chart.xlsx differ
diff --git a/assets/hangul_johab.tga b/assets/hangul_johab.tga
index 13e2830..32ef443 100644
Binary files a/assets/hangul_johab.tga and b/assets/hangul_johab.tga differ
diff --git a/assets/ipa_ext_variable.tga b/assets/ipa_ext_variable.tga
index 452d88f..87c46e5 100644
Binary files a/assets/ipa_ext_variable.tga and b/assets/ipa_ext_variable.tga differ
diff --git a/demo.PNG b/demo.PNG
index a19052d..29d0fec 100644
Binary files a/demo.PNG and b/demo.PNG differ
diff --git a/demotext.txt b/demotext.txt
index a79d26e..26388ac 100644
--- a/demotext.txt
+++ b/demotext.txt
@@ -45,7 +45,7 @@ How multilingual? Real multilingual!
あめつちほしそら やまかはみねたに くもきりむろこけ ひといぬうへすゑ ゆわさるおふせよ えの𛀁をなれゐて
トリナクコヱス ユメサマセ ミヨアケワタル ヒンカシヲ ソライロハエテ オキツヘニ ホフネムレヰヌ モヤノウチ
田居に出で 菜摘むわれをぞ 君召すと 求食り追ひゆく 山城の 打酔へる子ら 藻葉干せよ え舟繋けぬ
- 정 참판 양반댁 규수 큰 교자 타고 혼례 치른 날 하얬다 도럄직한 퀡봹퉪헰
+ 정 참판 양반댁 규수 큰 교자 타고 혼례 치른 날 하얬다 도럄직한 퀡봹퉪헰ꥸᅦퟗꥸᅦퟗᄋힳᆫ
Četri psihi faķīri vēlu vakarā zāģēja guļbūvei durvis, fonā šņācot mežam
Įlinkdama fechtuotojo špaga sublykčiojusi pragręžė apvalų arbūzą
Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех
@@ -61,6 +61,7 @@ How multilingual? Real multilingual!
Жебракують філософи при ґанку церкви в Гадячі, ще й шатро їхнє п’яне знаємо
Do bạch kim rất quý nên sẽ dùng để lắp vô xương
日堀油告観観藤村抄海評業庁経賃室弁市。太撮収改売週法所何都慣次現。価紙一無三洋日話転手治稿載末替付致治。
+ [pʰnɣɬɥi.m͡ŋχɫʍɨnaɸ.cθʊɫɯ.ɹɨɫʏ͡ɛx.ɯ͡ɣaxɲaɣɫ.ɸtʰɑɣɴ]
Features:
diff --git a/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt b/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt
index 5ca2f88..ea2d756 100644
--- a/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt
+++ b/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt
@@ -83,46 +83,93 @@ typealias CodepointSequence = ArrayList
*/
class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Boolean = false, val minFilter: Texture.TextureFilter = Texture.TextureFilter.Nearest, val magFilter: Texture.TextureFilter = Texture.TextureFilter.Nearest, var errorOnUnknownChar: Boolean = false) : BitmapFont() {
- private fun getHanChosung(hanIndex: Int) = hanIndex / (JUNG_COUNT * JONG_COUNT)
- private fun getHanJungseong(hanIndex: Int) = hanIndex / JONG_COUNT % JUNG_COUNT
- private fun getHanJongseong(hanIndex: Int) = hanIndex % JONG_COUNT
+ // Hangul Implementation Specific //
- private val jungseongWide = arrayOf(8, 12, 13, 17, 18, 21)
- private val jungseongComplex = arrayOf(9, 10, 11, 14, 15, 16, 22)
+ private fun getWanseongHanChosung(hanIndex: Int) = hanIndex / (JUNG_COUNT * JONG_COUNT)
+ private fun getWanseongHanJungseong(hanIndex: Int) = hanIndex / JONG_COUNT % JUNG_COUNT
+ private fun getWanseongHanJongseong(hanIndex: Int) = hanIndex % JONG_COUNT
- private fun isJungseongWide(hanIndex: Int) = jungseongWide.contains(getHanJungseong(hanIndex))
- private fun isJungseongComplex(hanIndex: Int) = jungseongComplex.contains(getHanJungseong(hanIndex))
+ private val jungseongWide: Array = arrayOf(9,13,14,18,19,34,35,39,45,51,53,54,62,64,66,80,83)
+ private val jungseongComplex: Array = arrayOf(10,11,12,15,16,17,20) + (22..33).toList() + arrayOf(36,37,38) + (40..44).toList() + arrayOf(46,47,48,49,50,52) + (55..60).toList() + arrayOf(63,65) + (67..79).toList() + arrayOf(81,82) + (84..93).toList()
- private fun getHanInitialRow(hanIndex: Int): Int {
- val ret: Int
+ private fun isJungseongWide(hanIndex: Int) = jungseongWide.binarySearch(hanIndex) >= 0
+ private fun isJungseongComplex(hanIndex: Int) = jungseongComplex.binarySearch(hanIndex) >= 0
- if (isJungseongWide(hanIndex))
- ret = 2
- else if (isJungseongComplex(hanIndex))
- ret = 4
- else
- ret = 0
+ /**
+ * @param i Initial (Chosung)
+ * @param p Peak (Jungseong)
+ * @param f Final (Jongseong)
+ */
+ private fun getHanInitialRow(i: Int, p: Int, f: Int): Int {
+ val ret =
+ if (isJungseongWide(p)) 2
+ else if (isJungseongComplex(p)) 4
+ else 0
- return if (getHanJongseong(hanIndex) == 0) ret else ret + 1
+ return if (f == 0) ret else ret + 1
}
- private fun getHanMedialRow(hanIndex: Int) = if (getHanJongseong(hanIndex) == 0) 6 else 7
+ private fun getHanMedialRow(i: Int, p: Int, f: Int) = if (f == 0) 6 else 7
- private fun getHanFinalRow(hanIndex: Int): Int {
- val jungseongIndex = getHanJungseong(hanIndex)
+ private fun getHanFinalRow(i: Int, p: Int, f: Int): Int {
- return if (jungseongWide.contains(jungseongIndex))
+ return if (isJungseongWide(p))
8
else
9
}
+ private fun isHangulChosung(c: Int) = c in (0x1100..0x115F) || c in (0xA960..0xA97F)
+ private fun isHangulJungseong(c: Int) = c in (0x1160..0x11A7) || c in (0xD7B0..0xD7C6)
+ private fun isHangulJongseong(c: Int) = c in (0x11A8..0x11FF) || c in (0xD7CB..0xD7FB)
+
+ private fun toHangulChosungIndex(c: Int) =
+ if (!isHangulChosung(c)) throw IllegalArgumentException("This Hangul sequence does not begin with Chosung (${c.toHex()})")
+ else if (c in 0x1100..0x115F) c - 0x1100
+ else c - 0xA960 + 96
+ private fun toHangulJungseongIndex(c: Int) =
+ if (!isHangulJungseong(c)) 0
+ else if (c in 0x1160..0x11A7) c - 0x1160
+ else c - 0xD7B0 + 72
+ private fun toHangulJongseongIndex(c: Int) =
+ if (!isHangulJongseong(c)) 0
+ else if (c in 0x11A8..0x11FF) c - 0x11A8 + 1
+ else c - 0xD7CB + 88 + 1
+
+ /**
+ * X-position in the spritesheet
+ *
+ * @param iCP Code point for Initial (Chosung)
+ * @param pCP Code point for Peak (Jungseong)
+ * @param fCP Code point for Final (Jongseong
+ */
+ private fun toHangulIndex(iCP: Int, pCP: Int, fCP: Int): IntArray {
+ val indexI = toHangulChosungIndex(iCP)
+ val indexP = toHangulJungseongIndex(pCP)
+ val indexF = toHangulJongseongIndex(fCP)
+
+ return intArrayOf(indexI, indexP, indexF)
+ }
+
+ private fun toHangulIndexAndRow(iCP: Int, pCP: Int, fCP: Int): Pair {
+ val (indexI, indexP, indexF) = toHangulIndex(iCP, pCP, fCP)
+
+ val rowI = getHanInitialRow(indexI, indexP, indexF)
+ val rowP = getHanMedialRow(indexI, indexP, indexF)
+ val rowF = getHanFinalRow(indexI, indexP, indexF)
+
+ return intArrayOf(indexI, indexP, indexF) to intArrayOf(rowI, rowP, rowF)
+ }
+
+
+ // END Hangul //
+
private fun isHangul(c: Int) = c in codeRange[SHEET_HANGUL]
private fun isAscii(c: Int) = c in codeRange[SHEET_ASCII_VARW]
private fun isRunic(c: Int) = c in codeRange[SHEET_RUNIC]
private fun isExtA(c: Int) = c in codeRange[SHEET_EXTA_VARW]
private fun isExtB(c: Int) = c in codeRange[SHEET_EXTB_VARW]
- private fun isKana(c: Int) = c in codeRange[SHEET_KANA] || c in 0x31F0..0x31FF || c in 0x1B000..0x1B001
+ private fun isKana(c: Int) = c in codeRange[SHEET_KANA]
private fun isCJKPunct(c: Int) = c in codeRange[SHEET_CJK_PUNCT]
private fun isUniHan(c: Int) = c in codeRange[SHEET_UNIHAN]
private fun isCyrilic(c: Int) = c in codeRange[SHEET_CYRILIC_VARW]
@@ -218,7 +265,6 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
private fun diacriticalMarksIndexX(c: Int) = (c - 0x300) % 16
private fun diacriticalMarksIndexY(c: Int) = (c - 0x300) / 16
-
private val lowHeightLetters = "acegijmnopqrsuvwxyzɱɳʙɾɽʒʂʐʋɹɻɥɟɡɢʛȵɲŋɴʀɕʑçʝxɣχʁʜʍɰʟɨʉɯuʊøɘɵɤəɛœɜɞʌɔæɐɶɑɒɚɝɩɪʅʈʏʞ".toSortedSet()
/**
* lowercase AND the height is equal to x-height (e.g. lowercase B, D, F, H, K, L, ... does not count
@@ -302,10 +348,10 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
)
private val codeRange = arrayOf( // MUST BE MATCHING WITH SHEET INDICES!!
0..0xFF,
- 0xAC00..0xD7A3,
+ (0x1100..0x11FF) + (0xA960..0xA97F) + (0xD7B0..0xD7FF), // Hangul Jamo, because Hangul Syllables are disassembled prior to the render
0x100..0x17F,
0x180..0x24F,
- 0x3040..0x30FF,
+ (0x3040..0x30FF) + (0x31F0..0x31FF) + (0x1B000..0x1B001),
0x3000..0x303F,
0x3400..0x9FFF,
0x400..0x52F,
@@ -322,7 +368,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
0xF00000..0xF0005F, // assign them to PUA
0xF00060..0xF000BF, // assign them to PUA
0x13A0..0x13F5,
- 0xA770..0xA787,
+ 0xA770..0xA787, // if it work, don't fix it (yet--wait until Latin Extended C)
0x900..0x9FF,
0x1C90..0x1CBF,
0x300..0x36F
@@ -510,6 +556,11 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
//textTexture.begin()
+
+ //textBuffer.forEach { print("${it.toHex()} ") }
+ //println()
+
+
val runs = if (noShadow) 0..0 else 3 downTo 0
for (run in runs) { // 0: Main, 1..3: Shadows
resetHash()
@@ -517,7 +568,9 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
while (index <= textBuffer.lastIndex) {
val c = textBuffer[index]
val sheetID = getSheetType(c)
- val (sheetX, sheetY) = getSheetwisePosition(c)
+ val (sheetX, sheetY) =
+ if (index == 0) getSheetwisePosition(0, c)
+ else getSheetwisePosition(textBuffer[index - 1], c)
val hash = getHash(c)
if (run == 0) {
@@ -539,16 +592,27 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
charsetOverride = c - CHARSET_OVERRIDE_DEFAULT
}
else if (sheetID == SHEET_HANGUL) {
+ // FIXME input text is normalised as Initial-Peak-Final
+ // requires lookahead for {I, P, F}
+
+ val cNext = if (index + 1 <= textBuffer.size) textBuffer[index + 1] else 0
+ val cNextNext = if (index + 2 <= textBuffer.size) textBuffer[index + 2] else 0
+
+ val hangulLength = if (isHangulJongseong(cNextNext)) 3 else 2
+
+ val (indices, rows) = toHangulIndexAndRow(c, cNext, cNextNext)
+
+ val (indexCho, indexJung, indexJong) = indices
+ val (choRow, jungRow, jongRow) = rows
val hangulSheet = sheets[SHEET_HANGUL]
- val hIndex = c - 0xAC00
- val indexCho = getHanChosung(hIndex)
- val indexJung = getHanJungseong(hIndex)
- val indexJong = getHanJongseong(hIndex)
- val choRow = getHanInitialRow(hIndex)
- val jungRow = getHanMedialRow(hIndex)
- val jongRow = getHanFinalRow(hIndex)
+ println("${c.toHex()} ${cNext.toHex()} ${cNextNext.toHex()}")
+ println("I: $indexCho,\t$choRow")
+ println("P: $indexJung,\t$jungRow")
+ println("F: $indexJong,\t$jongRow")
+ println("skip: $hangulLength")
+ println("====")
when (run) {
@@ -579,6 +643,9 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
}
}
+
+ index += hangulLength - 1
+
}
else {
try {
@@ -742,7 +809,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
// fallback
}
- private fun getSheetwisePosition(ch: Int): IntArray {
+ private fun getSheetwisePosition(cPrev: Int, ch: Int): IntArray {
val sheetX: Int; val sheetY: Int
when (getSheetType(ch)) {
SHEET_UNIHAN -> {
@@ -842,7 +909,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
return intArrayOf(sheetX, sheetY)
}
- fun buildWidthTable(pixmap: Pixmap, codeRange: IntRange, cols: Int = 16) {
+ fun buildWidthTable(pixmap: Pixmap, codeRange: Iterable, cols: Int = 16) {
val binaryCodeOffset = W_VAR_INIT
val cellW = W_VAR_INIT + 1
@@ -850,8 +917,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
for (code in codeRange) {
- val cellX = ((code - codeRange.start) % cols) * cellW
- val cellY = ((code - codeRange.start) / cols) * cellH
+ val cellX = ((code - codeRange.first()) % cols) * cellW
+ val cellY = ((code - codeRange.first()) / cols) * cellH
val codeStartX = cellX + binaryCodeOffset
val codeStartY = cellY
@@ -917,10 +984,6 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
(0xFFFA0..0xFFFFF).forEach { glyphProps[it] = GlyphProps(0, 0) }
- // manually build width table of Kana Supplements
- (0x31F0..0x31FF).forEach { glyphProps[it] = GlyphProps(W_KANA, 0) }
- (0x1B000..0x1B001).forEach { glyphProps[it] = GlyphProps(W_KANA, 0) }
-
// manually add width of one orphan insular letter
// WARNING: glyphs in 0xA770..0xA778 has invalid data, further care is required
glyphProps[0x1D79] = GlyphProps(9, 0)
@@ -981,7 +1044,14 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
else -> 0 // implies "diacriticsBeforeGlyph = true"
}
- if (!thisProp.writeOnTop) {
+
+ if (isHangul(thisChar) && !isHangulChosung(thisChar)) {
+ posXbuffer[charIndex] = if (isHangulChosung(lastNonDiacriticChar))
+ posXbuffer[nonDiacriticCounter]
+ else
+ posXbuffer[nonDiacriticCounter] + W_HANGUL
+ }
+ else if (!thisProp.writeOnTop) {
posXbuffer[charIndex] = when (itsProp.alignWhere) {
GlyphProps.ALIGN_RIGHT ->
posXbuffer[nonDiacriticCounter] + W_VAR_INIT + alignmentOffset + interchar
@@ -1065,8 +1135,12 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
}
- /** UTF-16 to ArrayList of Int. UTF-16 is because of Java
+ /** Takes input string, do normalisation, and returns sequence of codepoints (Int)
+ *
+ * UTF-16 to ArrayList of Int. UTF-16 is because of Java
* Note: CharSequence IS a String. java.lang.String implements CharSequence.
+ *
+ * Note to Programmer: DO NOT USE CHAR LITERALS, CODE EDITORS WILL CHANGE IT TO SOMETHING ELSE !!
*/
private fun CharSequence.toCodePoints(): CodepointSequence {
val seq = ArrayList()
@@ -1075,12 +1149,15 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
while (i < this.length) {
val c = this[i]
+ // LET THE NORMALISATION BEGIN //
+
+ // check UTF-16 surrogates
if (i < this.lastIndex && c.isHighSurrogate()) {
val cNext = this[i + 1]
if (!cNext.isLowSurrogate()) {
// replace with Unicode replacement char
- seq.add(0xFFFD)
+ seq.add(0x7F) // 0x7F in used internally to display ?> character
}
else {
val H = c
@@ -1091,6 +1168,23 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
i++ // skip next char (guaranteed to be Low Surrogate)
}
}
+ // disassemble Hangul Syllables into Initial-Peak-Final encoding
+ else if (c in 0xAC00.toChar()..0xD7A3.toChar()) {
+ val cInt = c.toInt() - 0xAC00
+ val indexCho = getWanseongHanChosung(cInt)
+ val indexJung = getWanseongHanJungseong(cInt)
+ val indexJong = getWanseongHanJongseong(cInt) - 1 // no Jongseong will be -1
+
+ // these magic numbers only makes sense if you look at the Unicode chart of Hangul Jamo
+ // https://www.unicode.org/charts/PDF/U1100.pdf
+ seq.add(0x1100 + indexCho)
+ seq.add(0x1161 + indexJung)
+ if (indexJong >= 0) seq.add(0x11A8 + indexJong)
+ }
+ // normalise CJK Compatibility area because fuck them
+ else if (c in 0x3300.toChar()..0x33FF.toChar()) {
+ seq.add(0x7F) // fuck them
+ }
// rearrange {letter, before-and-after diacritics} as {letter, before-diacritics, after-diacritics}
// {letter, before-diacritics} part will be dealt with swapping code below
// DOES NOT WORK if said diacritics has codepoint > 0xFFFF
@@ -1104,8 +1198,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
}
// U+007F is DEL originally, but this font stores bitmap of Replacement Character (U+FFFD)
// to this position. This line will replace U+FFFD into U+007F.
- else if (c == '�') {
- seq.add(0x7F)
+ else if (c == 0xFFFD.toChar()) {
+ seq.add(0x7F) // 0x7F in used internally to display ?> character
}
else {
seq.add(c.toInt())
@@ -1164,6 +1258,8 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
hashAccumulator = hashBasis
}
+ private fun Int.toHex() = "U+${this.toString(16).padStart(4, '0').toUpperCase()}"
+
companion object {
internal val JUNG_COUNT = 21
internal val JONG_COUNT = 28
@@ -1218,8 +1314,10 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo
// custom codepoints
internal val RICH_TEXT_MODIFIER_RUBY_MASTER = 0xFFFA0
- internal val RICH_TEXT_MODIFIER_RUBY_SLAVE = 0xFFFA0
- internal val RICH_TEXT_MODIFIER_TAG_END = 0xFFFA0
+ internal val RICH_TEXT_MODIFIER_RUBY_SLAVE = 0xFFFA1
+ internal val RICH_TEXT_MODIFIER_SUPERSCRIPT = 0xFFFA2
+ internal val RICH_TEXT_MODIFIER_SUBSCRIPT = 0xFFFA3
+ internal val RICH_TEXT_MODIFIER_TAG_END = 0xFFFBF
internal val CHARSET_OVERRIDE_DEFAULT = 0xFFFC0
internal val CHARSET_OVERRIDE_BG_BG = 0xFFFC1
diff --git a/testing.PNG b/testing.PNG
index e58672b..97724ff 100644
Binary files a/testing.PNG and b/testing.PNG differ
diff --git a/testtext.txt b/testtext.txt
index 80f38ed..36352f9 100644
--- a/testtext.txt
+++ b/testtext.txt
@@ -1,2 +1 @@
-Nijntje Pluis
-Nijntje Pluis
\ No newline at end of file
+ᄋힳᆫ ꥼᆢᇹ
\ No newline at end of file