diff --git a/Autokem/autokem.safetensors b/Autokem/autokem.safetensors index 026f581..7441808 100644 --- a/Autokem/autokem.safetensors +++ b/Autokem/autokem.safetensors @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c7fa2ad5e9d44832590bb7ebc65ed2765e93c89e6ddff99845d5407f2857ae17 +oid sha256:7c7a2231ada3bc986e6d16492ef63a4e1e6f62638f9258261f2933d08b28a188 size 470552 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index efcb89b..6a0519f 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -80,7 +80,7 @@ Up&Down: Each X and Y numbers are Signed 8-Bit Integer. X-positive: nudges towards left -Y-positive: nudges towards up +Y-positive: nudges towards down #### Diacritics Anchor Point Encoding diff --git a/OTFbuild/calligra_font_tests.odt b/OTFbuild/calligra_font_tests.odt index 808fe00..f4ccd72 100644 Binary files a/OTFbuild/calligra_font_tests.odt and b/OTFbuild/calligra_font_tests.odt differ diff --git a/OTFbuild/opentype_features.py b/OTFbuild/opentype_features.py index 3789242..948514f 100644 --- a/OTFbuild/opentype_features.py +++ b/OTFbuild/opentype_features.py @@ -1750,7 +1750,7 @@ def _generate_mark(glyphs, has): mark_groups = {} # (mark_type, align, is_dia, stack_cat) -> [(cp, g), ...] for cp, g in marks.items(): - is_dia = (0x0300 <= cp <= 0x036F) + is_dia = True # all marks (write_on_top >= 0) are diacritics; Kotlin applies lowheight shiftdown unconditionally sc = _stack_cat(g.props.stack_where) key = (g.props.write_on_top, g.props.align_where, is_dia, sc) mark_groups.setdefault(key, []).append((cp, g)) diff --git a/OTFbuild/sheet_config.py b/OTFbuild/sheet_config.py index ba8a5bc..c35673e 100644 --- a/OTFbuild/sheet_config.py +++ b/OTFbuild/sheet_config.py @@ -72,6 +72,8 @@ SHEET_ALPHABETIC_PRESENTATION_FORMS = 38 SHEET_HENTAIGANA_VARW = 39 SHEET_CONTROL_PICTURES_VARW = 40 SHEET_LEGACY_COMPUTING_VARW = 41 +SHEET_CYRILIC_EXTB_VARW = 42 +SHEET_CYRILIC_EXTA_VARW = 43 SHEET_UNKNOWN = 254 @@ -118,6 +120,8 @@ FILE_LIST = [ "hentaigana_variable.tga", "control_pictures_variable.tga", "symbols_for_legacy_computing_variable.tga", + "cyrilic_extB_variable.tga", + "cyrilic_extA_variable.tga", ] CODE_RANGE = [ @@ -163,6 +167,8 @@ CODE_RANGE = [ list(range(0x1B000, 0x1B170)), # 39: Hentaigana list(range(0x2400, 0x2440)), # 40: Control Pictures list(range(0x1FB00, 0x1FC00)), # 41: Legacy Computing + list(range(0xA640, 0xA6A0)), # 42: Cyrillic Ext B + list(range(0x2DE0, 0x2E00)), # 43: Cyrillic Ext A ] CODE_RANGE_HANGUL_COMPAT = range(0x3130, 0x3190) @@ -539,5 +545,7 @@ def index_y(sheet_index, c): SHEET_HENTAIGANA_VARW: lambda: (c - 0x1B000) // 16, SHEET_CONTROL_PICTURES_VARW: lambda: (c - 0x2400) // 16, SHEET_LEGACY_COMPUTING_VARW: lambda: (c - 0x1FB00) // 16, + SHEET_CYRILIC_EXTB_VARW: lambda: (c - 0xA640) // 16, + SHEET_CYRILIC_EXTA_VARW: lambda: (c - 0x2DE0) // 16, SHEET_HANGUL: lambda: 0, }.get(sheet_index, lambda: c // 16)() diff --git a/PUA_allocation_chart.xlsx b/PUA_allocation_chart.xlsx index b81dc7d..1ad54be 100755 Binary files a/PUA_allocation_chart.xlsx and b/PUA_allocation_chart.xlsx differ diff --git a/demo.PNG b/demo.PNG index ef6a1f7..bcce776 100644 Binary files a/demo.PNG and b/demo.PNG differ diff --git a/demotext_unaligned.txt b/demotext_unaligned.txt index 6578717..7684643 100755 --- a/demotext_unaligned.txt +++ b/demotext_unaligned.txt @@ -25,6 +25,7 @@ How multilingual? Real multilingual! 􏻬আমি কাঁচ খেতে পারি, তাতে আমার কোনো ক্ষতি হয় না। 􀀀 􏻬󿿁Под южно дърво, цъфтящо в синьо, бягаше малко пухкаво зайче󿿀􀀀 􏻬ᎠᏍᎦᏯᎡᎦᎢᎾᎨᎢᎣᏍᏓᎤᎩᏍᏗᎥᎴᏓᎯᎲᎢᏔᎵᏕᎦᏟᏗᏖᎸᎳᏗᏗᎧᎵᎢᏘᎴᎩ ᏙᏱᏗᏜᏫᏗᏣᏚᎦᏫᏛᏄᏓᎦᏝᏃᎠᎾᏗᎭᏞᎦᎯᎦᏘᏓᏠᎨᏏᏕᏡᎬᏢᏓᏥᏩᏝᎡᎢᎪᎢ ᎠᎦᏂᏗᎮᎢᎫᎩᎬᏩᎴᎢᎠᏆᏅᏛᎫᏊᎾᎥᎠᏁᏙᎲᏐᏈᎵᎤᎩᎸᏓᏭᎷᏤᎢᏏᏉᏯᏌᏊ ᎤᏂᏋᎢᏡᎬᎢᎰᏩᎬᏤᎵᏍᏗᏱᎩᎱᎱᎤᎩᎴᎢᏦᎢᎠᏂᏧᏣᏨᎦᏥᎪᎥᏌᏊᎤᎶᏒᎢᎢᏡᎬᎢ ᎹᎦᎺᎵᏥᎻᎼᏏᎽᏗᏩᏂᎦᏘᎾᎿᎠᏁᎬᎢᏅᎩᎾᏂᎡᎢᏌᎶᎵᏎᎷᎠᏑᏍᏗᏪᎩ ᎠᎴ ᏬᏗᏲᏭᎾᏓᏍᏓᏴᏁᎢᎤᎦᏅᏮᏰᎵᏳᏂᎨᎢ􀀀 +􏻬Ѳеѡфа́нъ и҆ Алеѯі́й, ѕѣлѡ̀ возлюби́вше ѱалти́рь, воспѣ́ша при свѣ́тѣ ѕвѣ́здъ, помазꙋ́юще сщ҃е́нное мѵ́ро; серафими мн̑оꙮчитїи̑, ꙗ҆́кѡ ѻ҆́гнь, ѡ҆крꙋжа́хꙋ прⷭ҇то́лъ Бж҃їй, и҆ всѧ̀ землѧ̀ и҆спо́лнисѧ свѣ́та, ꙗ҆́кѡ ѕмі́й попра́нъ є҆́сть􀀀 􏻬Příliš žluťoučký kůň úpěl ďábelské ódy􀀀 􏻬Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen Walther spillede på xylofon􀀀 􏻬PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS􀀀 @@ -104,6 +105,10 @@ How multilingual? Real multilingual! 􎳌‣ Full support for Archaic Kana/Hentaigana􀀀 +􏻬серафими мн̑оꙮчитїи̑, ꙗ҆́кѡ ѻ҆́гнь, ѡ҆крꙋжа́хꙋ прⷭ҇то́лъ Бж҃їй, и҆ всѧ̀ землѧ̀ и҆спо́лнисѧ свѣ́та􀀀 + +􎳌‣ Fan of Church Slavonic? We’ve got you!􀀀 + 􏃯Supported Unicode Blocks:􀀀 ⁃ Basic Latin @@ -120,8 +125,10 @@ How multilingual? Real multilingual! ⁃ Combining Diacritical Marks ⁃ Control Pictures ⁃ Currency Symbols -⁃ Cyrillic􏿆ᴭ􀀀 -⁃ Cyrillic Supplement􏿆ᴭ􀀀 +⁃ Cyrillic +⁃ Cyrillic Supplement +⁃ Cyrillic Extended-A +⁃ Cyrillic Extended-B ⁃ Devanagari ⁃ Enclosed Alphanumeric Supplement ⁃ General Punctuations @@ -153,7 +160,7 @@ How multilingual? Real multilingual! ⁃ Tamil ⁃ Thai - 􏿆ᴭ􀀀 No support for archæic letters  􏿆ᴱ􀀀 No support for Coptic + 􏿆ᴱ􀀀 No support for Coptic 􏿆ᶠⁱ􀀀  No support for ligatures  􏿆ჼ􀀀 Mkhedruli only 􏿆⁶􀀀 􏿆⁷􀀀 􏿆⁹􀀀 􏿆¹²·¹􀀀 Up to the specified Unicode version diff --git a/src/assets/cyrilic_bulgarian_variable.tga b/src/assets/cyrilic_bulgarian_variable.tga index d155c27..dc35bfb 100755 --- a/src/assets/cyrilic_bulgarian_variable.tga +++ b/src/assets/cyrilic_bulgarian_variable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d320bbab12e9b6a069e88552e5eb7084ae9d7068f679fa00ddc137b5cb57b7f +oid sha256:b953eb18ddd16423a63487cdae211c3e8cfd1ce4da4fc91995f698f8724cb18f size 122898 diff --git a/src/assets/cyrilic_extA_variable.tga b/src/assets/cyrilic_extA_variable.tga new file mode 100644 index 0000000..22a831d --- /dev/null +++ b/src/assets/cyrilic_extA_variable.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97c564ccf6bb04cb9a007e0daeb9aa4922f0c50c8e5cbf5f42774525ff5a9047 +size 40978 diff --git a/src/assets/cyrilic_extB_variable.tga b/src/assets/cyrilic_extB_variable.tga new file mode 100644 index 0000000..3ffca9e --- /dev/null +++ b/src/assets/cyrilic_extB_variable.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f05f970173f7c2c830e7567a21fe18691f31205565296c429ecb60f0344e7f6 +size 122898 diff --git a/src/assets/cyrilic_serbian_variable.tga b/src/assets/cyrilic_serbian_variable.tga index 6a92087..224d783 100755 --- a/src/assets/cyrilic_serbian_variable.tga +++ b/src/assets/cyrilic_serbian_variable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:12c3ef14786627310688e4c3c8d1acf6d15763253c4549a7be5ed9f7156bdbee +oid sha256:c1a203f1d9db83f037b959a09921fbacaf4d477a07033273595b6d6d478937b5 size 122898 diff --git a/src/assets/cyrilic_variable.tga b/src/assets/cyrilic_variable.tga index 6dad9d9..ec8e0dc 100755 --- a/src/assets/cyrilic_variable.tga +++ b/src/assets/cyrilic_variable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ddc9396b96aa8ff48c3b996caedae5e5a820c5774992eec8395784fef7911610 +oid sha256:68f047a0679cf539fc7c04fc97fdadce48ae91a1f51c9bf572b0116354ab8ab7 size 389138 diff --git a/src/assets/internal_variable.tga b/src/assets/internal_variable.tga index 997b919..8e1deaf 100644 --- a/src/assets/internal_variable.tga +++ b/src/assets/internal_variable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:acd10775e2d8c2494c9896519c7172a7856cd36a4976e9779a8bcd088e5517a2 +oid sha256:c068c1adeb1cc6a723c41861a8fd54a20f607de7b6434f495e163e1f1d0d5a1e size 327698 diff --git a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt index d392cf0..ba32f84 100755 --- a/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt +++ b/src/net/torvald/terrarumsansbitmap/gdx/TerrarumSansBitmap.kt @@ -888,6 +888,8 @@ class TerrarumSansBitmap( SHEET_HENTAIGANA_VARW -> hentaiganaIndexY(ch) SHEET_CONTROL_PICTURES_VARW -> controlPicturesIndexY(ch) SHEET_LEGACY_COMPUTING_VARW -> legacyComputingIndexY(ch) + SHEET_CYRILIC_EXTB_VARW -> cyrilicExtBIndexY(ch) + SHEET_CYRILIC_EXTA_VARW -> cyrilicExtAIndexY(ch) else -> ch / 16 } @@ -1120,6 +1122,8 @@ class TerrarumSansBitmap( var nonDiacriticCounter = 0 // index of last instance of non-diacritic char var stackUpwardCounter = 0 // TODO separate stack counter for centre- and right aligned var stackDownwardCounter = 0 + var nudgeUpwardCounter = 0 + var nudgeDownwardCounter = 0 val HALF_VAR_INIT = W_VAR_INIT.minus(1).div(2) @@ -1198,6 +1202,8 @@ class TerrarumSansBitmap( stackUpwardCounter = 0 stackDownwardCounter = 0 + nudgeUpwardCounter = 0 + nudgeDownwardCounter = 0 } // FIXME HACK: using 0th diacritics' X-anchor pos as a type selector /*else if (thisProp.writeOnTop && thisProp.diacriticsAnchors[0].x == GlyphProps.DIA_JOINER) { @@ -1277,14 +1283,14 @@ class TerrarumSansBitmap( // set Y pos according to diacritics position when (thisProp.stackWhere) { GlyphProps.STACK_DOWN -> { - posYbuffer[charIndex] = (-thisProp.nudgeY + H_DIACRITICS * stackDownwardCounter) * flipY.toSign() + posYbuffer[charIndex] = (-thisProp.nudgeY + H_DIACRITICS * stackDownwardCounter) * flipY.toSign() - thisProp.nudgeY - nudgeDownwardCounter stackDownwardCounter++ + nudgeDownwardCounter -= thisProp.nudgeY } GlyphProps.STACK_UP -> { - posYbuffer[charIndex] = -thisProp.nudgeY + (-H_DIACRITICS * stackUpwardCounter + -thisProp.nudgeY) * flipY.toSign() + posYbuffer[charIndex] = -thisProp.nudgeY + (-H_DIACRITICS * stackUpwardCounter + -thisProp.nudgeY) * flipY.toSign() + thisProp.nudgeY + nudgeUpwardCounter // shift down on lowercase if applicable - if (getSheetType(thisChar) in autoShiftDownOnLowercase && - lastNonDiacriticChar.isLowHeight()) { + if (lastNonDiacriticChar.isLowHeight()) { //dbgprn("AAARRRRHHHH for character ${thisChar.toHex()}") //dbgprn("lastNonDiacriticChar: ${lastNonDiacriticChar.toHex()}") //dbgprn("cond: ${thisProp.alignXPos == GlyphProps.DIA_OVERLAY}, charIndex: $charIndex") @@ -1295,18 +1301,19 @@ class TerrarumSansBitmap( } stackUpwardCounter++ + nudgeUpwardCounter += thisProp.nudgeY // dbgprn("lastNonDiacriticChar: ${lastNonDiacriticChar.charInfo()}; stack counter: $stackUpwardCounter") } GlyphProps.STACK_UP_N_DOWN -> { posYbuffer[charIndex] = (-thisProp.nudgeY + H_DIACRITICS * stackDownwardCounter) * flipY.toSign() stackDownwardCounter++ - + if (thisProp.nudgeY < 0) + nudgeDownwardCounter -= thisProp.nudgeY posYbuffer[charIndex] = (-thisProp.nudgeY + -H_DIACRITICS * stackUpwardCounter) * flipY.toSign() // shift down on lowercase if applicable - if (getSheetType(thisChar) in autoShiftDownOnLowercase && - lastNonDiacriticChar.isLowHeight()) { + if (lastNonDiacriticChar.isLowHeight()) { if (diacriticsType == GlyphProps.DIA_OVERLAY) posYbuffer[charIndex] += H_OVERLAY_LOWERCASE_SHIFTDOWN * flipY.toSign() // if minus-assign doesn't work, try plus-assign else @@ -1314,6 +1321,8 @@ class TerrarumSansBitmap( } stackUpwardCounter++ + if (thisProp.nudgeY > 0) + nudgeUpwardCounter += thisProp.nudgeY } // for BEFORE_N_AFTER, do nothing in here } @@ -2604,6 +2613,8 @@ class TerrarumSansBitmap( internal const val SHEET_HENTAIGANA_VARW = 39 internal const val SHEET_CONTROL_PICTURES_VARW = 40 internal const val SHEET_LEGACY_COMPUTING_VARW = 41 + internal const val SHEET_CYRILIC_EXTB_VARW = 42 + internal const val SHEET_CYRILIC_EXTA_VARW = 43 internal const val SHEET_UNKNOWN = 254 @@ -2625,10 +2636,6 @@ class TerrarumSansBitmap( const val MOVABLE_BLOCK_1 = 0xFFFF0 - private val autoShiftDownOnLowercase = arrayOf( - SHEET_DIACRITICAL_MARKS_VARW - ) - private val fileList = arrayOf( // MUST BE MATCHING WITH SHEET INDICES!! "ascii_variable.tga", "hangul_johab.tga", @@ -2672,6 +2679,8 @@ class TerrarumSansBitmap( "hentaigana_variable.tga", "control_pictures_variable.tga", "symbols_for_legacy_computing_variable.tga", + "cyrilic_extB_variable.tga", + "cyrilic_extA_variable.tga", ) internal val codeRange = arrayOf( // MUST BE MATCHING WITH SHEET INDICES!! 0..0xFF, // SHEET_ASCII_VARW @@ -2716,6 +2725,8 @@ class TerrarumSansBitmap( 0x1B000..0x1B16F, // SHEET_HENTAIGANA_VARW 0x2400..0x243F, // SHEET_CONTROL_PICTURES_VARW 0x1FB00..0x1FBFF, // SHEET_LEGACY_COMPUTING_VARW + 0xA640..0xA69F, // SHEET_CYRILIC_EXTB_VARW + 0x2DE0..0x2DFF, // SHEET_CYRILIC_EXTA_VARW ) private val codeRangeHangulCompat = 0x3130..0x318F @@ -3066,6 +3077,8 @@ class TerrarumSansBitmap( private fun hentaiganaIndexY(c: CodePoint) = (c - 0x1B000) / 16 private fun controlPicturesIndexY(c: CodePoint) = (c - 0x2400) / 16 private fun legacyComputingIndexY(c: CodePoint) = (c - 0x1FB00) / 16 + private fun cyrilicExtBIndexY(c: CodePoint) = (c - 0xA640) / 16 + private fun cyrilicExtAIndexY(c: CodePoint) = (c - 0x2DE0) / 16 val charsetOverrideDefault = Character.toChars(CHARSET_OVERRIDE_DEFAULT).toSurrogatedString() val charsetOverrideBulgarian = Character.toChars(CHARSET_OVERRIDE_BG_BG).toSurrogatedString() diff --git a/work_files/cyrilic_bulgarian_variable.psd b/work_files/cyrilic_bulgarian_variable.psd index a4e7652..d3373ca 100644 --- a/work_files/cyrilic_bulgarian_variable.psd +++ b/work_files/cyrilic_bulgarian_variable.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a02fb821e55528d5bee2922c1179a8dc366665053049f6c9d0284bebbe40ff4 -size 113941 +oid sha256:614c8f8700452ff79af2fb7f3920d2bdf36c572c92cb1e15088678b714b672fa +size 113998 diff --git a/work_files/cyrilic_extA_variable.kra b/work_files/cyrilic_extA_variable.kra new file mode 100644 index 0000000..faebbba --- /dev/null +++ b/work_files/cyrilic_extA_variable.kra @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93e3eea48a4bd12ca564ede24b57b42a7741fe967820aab9ca7c4e9118655843 +size 43486 diff --git a/work_files/cyrilic_extB_variable.kra b/work_files/cyrilic_extB_variable.kra new file mode 100644 index 0000000..e3e418d --- /dev/null +++ b/work_files/cyrilic_extB_variable.kra @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5517e2520430cda3026b47df735d1068ec3bc2e3a0f625902200e76394d2c957 +size 60185 diff --git a/work_files/cyrilic_serbian_variable.psd b/work_files/cyrilic_serbian_variable.psd index 0cd05a5..ec7ee82 100644 --- a/work_files/cyrilic_serbian_variable.psd +++ b/work_files/cyrilic_serbian_variable.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9e5dd85b601cf2d76cdd928ebbfb8bc55edf727722f822bf91a3b0df9b3c0bd -size 119337 +oid sha256:339249b8a4a88ed0f6025438c134d1f00e935980ca7bb3e849000249ef2f573a +size 119376 diff --git a/work_files/cyrilic_variable.psd b/work_files/cyrilic_variable.psd index 493278b..402f8fa 100644 --- a/work_files/cyrilic_variable.psd +++ b/work_files/cyrilic_variable.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce7c9c64021ddd7fe7131e995398e7009fafcd033ed94be3cf86a620d5283b11 -size 418093 +oid sha256:e56339c2b4ce5a1300e57978defd19ffd63d7fe1dd8f2acafdba6bb7057d703a +size 419318 diff --git a/work_files/internal_variable.psd b/work_files/internal_variable.psd index 1f08476..eb5aa92 100644 --- a/work_files/internal_variable.psd +++ b/work_files/internal_variable.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6991dc79b54ae9a023d0b458a836e5c23fcae50748f9b71208b5793d9398c384 -size 284790 +oid sha256:95f7b08c3bf6311faf621cde6ba2757737589470460483779a65ffa6a77f360c +size 284761