├── .gitignore ├── GochiHandPOJ ├── GochiHand-Regular-POJ.sfd ├── GochiHandPOJ-Regular.ttf └── OFL.txt ├── NunitoPOJ ├── NunitoPOJ-Bold.sfd ├── NunitoPOJ-Bold.ttf ├── NunitoPOJ-Regular.sfd ├── NunitoPOJ-Regular.ttf └── OFL.txt ├── POJ ChhiuKi ├── FontMenuNameDB ├── GlyphOrderAndAliasDB ├── LICENSE.txt ├── bold │ ├── POJChhiuKi-Bold.fea │ └── POJChhiuKi-Bold.sfd ├── commands.txt ├── italic │ ├── POJChhiuKi-Italic.fea │ └── POJChhiuKi-Italic.sfd └── regular │ ├── POJChhiuKi-Regular.fea │ └── POJChhiuKi-Regular.sfd ├── POJ HaiMi ├── FontMenuNameDB ├── LICENSE.txt ├── pojHaiMi-Regular.fea └── pojHaiMi-Regular.sfd ├── POJVibes ├── OFL.txt ├── POJVibes-Regular.sfd └── POJVibes-Regular.ttf ├── README.md ├── charset.txt ├── charset.xlsx ├── poj-Garamond ├── OFL.txt ├── poj-Garamond08-Italic.sfd ├── poj-Garamond08-Regular.sfd ├── poj-Garamond12-Italic.sfd └── poj-Garamond12-Regular.sfd ├── poj-Phiaute ├── OFL.txt └── poj-Phiaute-Regular.sfd ├── preview.docx ├── preview.png └── src └── poj.py /.gitignore: -------------------------------------------------------------------------------- 1 | release 2 | working -------------------------------------------------------------------------------- /GochiHandPOJ/GochiHandPOJ-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiongg/POJFonts/e8aa5c4f1272f62bf616695a124d9e895ed9f156/GochiHandPOJ/GochiHandPOJ-Regular.ttf -------------------------------------------------------------------------------- /GochiHandPOJ/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011, Juan Pablo del Peral (juan@huertatipografica.com.ar), 2 | with Reserved Font Names "Gochi" and "Gochi Hand" 3 | 4 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 5 | This license is copied below, and is also available with a FAQ at: 6 | http://scripts.sil.org/OFL 7 | 8 | 9 | ----------------------------------------------------------- 10 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 11 | ----------------------------------------------------------- 12 | 13 | PREAMBLE 14 | The goals of the Open Font License (OFL) are to stimulate worldwide 15 | development of collaborative font projects, to support the font creation 16 | efforts of academic and linguistic communities, and to provide a free and 17 | open framework in which fonts may be shared and improved in partnership 18 | with others. 19 | 20 | The OFL allows the licensed fonts to be used, studied, modified and 21 | redistributed freely as long as they are not sold by themselves. The 22 | fonts, including any derivative works, can be bundled, embedded, 23 | redistributed and/or sold with any software provided that any reserved 24 | names are not used by derivative works. The fonts and derivatives, 25 | however, cannot be released under any other type of license. The 26 | requirement for fonts to remain under this license does not apply 27 | to any document created using the fonts or their derivatives. 28 | 29 | DEFINITIONS 30 | "Font Software" refers to the set of files released by the Copyright 31 | Holder(s) under this license and clearly marked as such. This may 32 | include source files, build scripts and documentation. 33 | 34 | "Reserved Font Name" refers to any names specified as such after the 35 | copyright statement(s). 36 | 37 | "Original Version" refers to the collection of Font Software components as 38 | distributed by the Copyright Holder(s). 39 | 40 | "Modified Version" refers to any derivative made by adding to, deleting, 41 | or substituting -- in part or in whole -- any of the components of the 42 | Original Version, by changing formats or by porting the Font Software to a 43 | new environment. 44 | 45 | "Author" refers to any designer, engineer, programmer, technical 46 | writer or other person who contributed to the Font Software. 47 | 48 | PERMISSION & CONDITIONS 49 | Permission is hereby granted, free of charge, to any person obtaining 50 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 51 | redistribute, and sell modified and unmodified copies of the Font 52 | Software, subject to the following conditions: 53 | 54 | 1) Neither the Font Software nor any of its individual components, 55 | in Original or Modified Versions, may be sold by itself. 56 | 57 | 2) Original or Modified Versions of the Font Software may be bundled, 58 | redistributed and/or sold with any software, provided that each copy 59 | contains the above copyright notice and this license. These can be 60 | included either as stand-alone text files, human-readable headers or 61 | in the appropriate machine-readable metadata fields within text or 62 | binary files as long as those fields can be easily viewed by the user. 63 | 64 | 3) No Modified Version of the Font Software may use the Reserved Font 65 | Name(s) unless explicit written permission is granted by the corresponding 66 | Copyright Holder. This restriction only applies to the primary font name as 67 | presented to the users. 68 | 69 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 70 | Software shall not be used to promote, endorse or advertise any 71 | Modified Version, except to acknowledge the contribution(s) of the 72 | Copyright Holder(s) and the Author(s) or with their explicit written 73 | permission. 74 | 75 | 5) The Font Software, modified or unmodified, in part or in whole, 76 | must be distributed entirely under this license, and must not be 77 | distributed under any other license. The requirement for fonts to 78 | remain under this license does not apply to any document created 79 | using the Font Software. 80 | 81 | TERMINATION 82 | This license becomes null and void if any of the above conditions are 83 | not met. 84 | 85 | DISCLAIMER 86 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 87 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 88 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 89 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 90 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 91 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 92 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 93 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 94 | OTHER DEALINGS IN THE FONT SOFTWARE. 95 | -------------------------------------------------------------------------------- /NunitoPOJ/NunitoPOJ-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiongg/POJFonts/e8aa5c4f1272f62bf616695a124d9e895ed9f156/NunitoPOJ/NunitoPOJ-Bold.ttf -------------------------------------------------------------------------------- /NunitoPOJ/NunitoPOJ-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiongg/POJFonts/e8aa5c4f1272f62bf616695a124d9e895ed9f156/NunitoPOJ/NunitoPOJ-Regular.ttf -------------------------------------------------------------------------------- /NunitoPOJ/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2014 The Nunito Project Authors (https://github.com/googlefonts/NunitoFont) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /POJ ChhiuKi/FontMenuNameDB: -------------------------------------------------------------------------------- 1 | [POJChhiuKi-Regular] 2 | f=POJ ChhiuKi 3 | s=Regular 4 | 5 | [POJChhiuKi-Bold] 6 | f=POJ ChhiuKi 7 | s=Bold 8 | 9 | [POJChhiuKi-Italic] 10 | f=POJ ChhiuKi 11 | s=Italic -------------------------------------------------------------------------------- /POJ ChhiuKi/GlyphOrderAndAliasDB: -------------------------------------------------------------------------------- 1 | .notdef .notdef 2 | uni0000 uni0000 3 | glyph2 glyph2 4 | uni000D uni000D 5 | space uni0020 6 | exclam uni0021 7 | quotedbl uni0022 8 | numbersign uni0023 9 | dollar uni0024 10 | percent uni0025 11 | ampersand uni0026 12 | quotesingle uni0027 13 | parenleft uni0028 14 | parenright uni0029 15 | asterisk uni002A 16 | plus uni002B 17 | comma uni002C 18 | hyphen uni002D 19 | period uni002E 20 | slash uni002F 21 | zero uni0030 22 | one uni0031 23 | two uni0032 24 | three uni0033 25 | four uni0034 26 | five uni0035 27 | six uni0036 28 | seven uni0037 29 | eight uni0038 30 | nine uni0039 31 | colon uni003A 32 | semicolon uni003B 33 | less uni003C 34 | equal uni003D 35 | greater uni003E 36 | question uni003F 37 | at uni0040 38 | A uni0041 39 | B uni0042 40 | C uni0043 41 | D uni0044 42 | E uni0045 43 | F uni0046 44 | G uni0047 45 | H uni0048 46 | I uni0049 47 | J uni004A 48 | K uni004B 49 | L uni004C 50 | M uni004D 51 | N uni004E 52 | O uni004F 53 | P uni0050 54 | Q uni0051 55 | R uni0052 56 | S uni0053 57 | T uni0054 58 | U uni0055 59 | V uni0056 60 | W uni0057 61 | X uni0058 62 | Y uni0059 63 | Z uni005A 64 | bracketleft uni005B 65 | backslash uni005C 66 | bracketright uni005D 67 | asciicircum uni005E 68 | underscore uni005F 69 | grave uni0060 70 | a uni0061 71 | b uni0062 72 | c uni0063 73 | d uni0064 74 | e uni0065 75 | f uni0066 76 | g uni0067 77 | h uni0068 78 | i uni0069 79 | j uni006A 80 | k uni006B 81 | l uni006C 82 | m uni006D 83 | n uni006E 84 | o uni006F 85 | p uni0070 86 | q uni0071 87 | r uni0072 88 | s uni0073 89 | t uni0074 90 | u uni0075 91 | v uni0076 92 | w uni0077 93 | x uni0078 94 | y uni0079 95 | z uni007A 96 | braceleft uni007B 97 | bar uni007C 98 | braceright uni007D 99 | asciitilde uni007E 100 | exclamdown uni00A1 101 | cent uni00A2 102 | sterling uni00A3 103 | currency uni00A4 104 | yen uni00A5 105 | brokenbar uni00A6 106 | section uni00A7 107 | dieresis uni00A8 108 | copyright uni00A9 109 | ordfeminine uni00AA 110 | guillemotleft uni00AB 111 | logicalnot uni00AC 112 | registered uni00AE 113 | macron uni00AF 114 | degree uni00B0 115 | plusminus uni00B1 116 | uni00B2 uni00B2 117 | uni00B3 uni00B3 118 | acute uni00B4 119 | mu uni00B5 120 | paragraph uni00B6 121 | periodcentered uni00B7 122 | cedilla uni00B8 123 | uni00B9 uni00B9 124 | ordmasculine uni00BA 125 | guillemotright uni00BB 126 | onequarter uni00BC 127 | onehalf uni00BD 128 | threequarters uni00BE 129 | questiondown uni00BF 130 | AE uni00C6 131 | multiply uni00D7 132 | Oslash uni00D8 133 | Thorn uni00DE 134 | germandbls uni00DF 135 | ae uni00E6 136 | eth uni00F0 137 | divide uni00F7 138 | oslash uni00F8 139 | thorn uni00FE 140 | dotlessi uni0131 141 | OE uni0152 142 | oe uni0153 143 | circumflex uni02C6 144 | ring uni02DA 145 | tilde uni02DC 146 | uni2002 uni2002 147 | uni2009 uni2009 148 | uni2009.locl uni2009.locl 149 | uni200B uni200B 150 | endash uni2013 151 | emdash uni2014 152 | quoteleft uni2018 153 | quoteright uni2019 154 | quotesinglbase uni201A 155 | quotedblleft uni201C 156 | quotedblright uni201D 157 | quotedblbase uni201E 158 | bullet uni2022 159 | ellipsis uni2026 160 | guilsinglleft uni2039 161 | guilsinglright uni203A 162 | fraction uni2044 163 | uni2074 uni2074 164 | Euro uni20AC 165 | trademark uni2122 166 | minus uni2212 167 | f_i.liga f_i.liga 168 | f_l.liga f_l.liga 169 | f_f_i.liga f_f_i.liga 170 | f_f_l.liga f_f_l.liga 171 | uniFEFF uniFEFF 172 | uniFFFD uniFFFD 173 | two.dnom two.dnom 174 | one.dnom one.dnom 175 | zero.dnom zero.dnom 176 | three.dnom three.dnom 177 | four.dnom four.dnom 178 | five.dnom five.dnom 179 | six.dnom six.dnom 180 | seven.dnom seven.dnom 181 | eight.dnom eight.dnom 182 | nine.dnom nine.dnom 183 | zero.numr zero.numr 184 | four.numr four.numr 185 | five.numr five.numr 186 | six.numr six.numr 187 | seven.numr seven.numr 188 | eight.numr eight.numr 189 | nine.numr nine.numr 190 | uni00A0 uni00A0 191 | uni00AD uni00AD 192 | Eth uni00D0 193 | Agrave uni00C0 194 | Aacute uni00C1 195 | Acircumflex uni00C2 196 | Atilde uni00C3 197 | Adieresis uni00C4 198 | Aring uni00C5 199 | Ccedilla uni00C7 200 | Egrave uni00C8 201 | Eacute uni00C9 202 | Ecircumflex uni00CA 203 | Edieresis uni00CB 204 | Igrave uni00CC 205 | Iacute uni00CD 206 | Icircumflex uni00CE 207 | Idieresis uni00CF 208 | Ntilde uni00D1 209 | Ograve uni00D2 210 | Oacute uni00D3 211 | Ocircumflex uni00D4 212 | Otilde uni00D5 213 | Odieresis uni00D6 214 | Ugrave uni00D9 215 | Uacute uni00DA 216 | Ucircumflex uni00DB 217 | Udieresis uni00DC 218 | Yacute uni00DD 219 | agrave uni00E0 220 | aacute uni00E1 221 | acircumflex uni00E2 222 | atilde uni00E3 223 | adieresis uni00E4 224 | aring uni00E5 225 | ccedilla uni00E7 226 | egrave uni00E8 227 | eacute uni00E9 228 | ecircumflex uni00EA 229 | edieresis uni00EB 230 | igrave uni00EC 231 | iacute uni00ED 232 | icircumflex uni00EE 233 | idieresis uni00EF 234 | ntilde uni00F1 235 | ograve uni00F2 236 | oacute uni00F3 237 | ocircumflex uni00F4 238 | otilde uni00F5 239 | odieresis uni00F6 240 | ugrave uni00F9 241 | uacute uni00FA 242 | ucircumflex uni00FB 243 | udieresis uni00FC 244 | yacute uni00FD 245 | ydieresis uni00FF 246 | minute uni2032 247 | second uni2033 248 | uni02BC uni02BC 249 | gravecomb uni0300 250 | acutecomb uni0301 251 | uni0302 circumflexcomb uni0302 252 | uni0304 macroncomb uni0304 253 | uni030C caroncomb uni030C 254 | uni0306 brevecomb uni0306 255 | uni0307 uni0307 256 | uni030A ringcomb uni030A 257 | uni0308 uni0308 258 | uni030B hungarumlautcomb uni030B 259 | uni030D vlinecomb uni030D 260 | uni0358 dotcomb uni0358 261 | uni207F uni207F 262 | uni0324 diaresisbelowcomb uni0324 263 | Amacron uni0100 264 | amacron uni0101 265 | Abreve uni0102 266 | abreve uni0103 267 | Emacron uni0112 268 | emacron uni0113 269 | Ebreve uni0114 270 | ebreve uni0115 271 | Ecaron uni011A 272 | ecaron uni011B 273 | Imacron uni012A 274 | imacron uni012B 275 | Ibreve uni012C 276 | ibreve uni012D 277 | Nacute uni0143 278 | nacute uni0144 279 | Ncaron uni0147 280 | ncaron uni0148 281 | Omacron uni014C 282 | omacron uni014D 283 | Obreve uni014E 284 | obreve uni014F 285 | Ohungarumlaut uni0150 286 | ohungarumlaut uni0151 287 | Umacron uni016A 288 | umacron uni016B 289 | Ubreve uni016C 290 | ubreve uni016D 291 | Uring uni016E 292 | uring uni016F 293 | Uhungarumlaut uni0170 294 | uhungarumlaut uni0171 295 | uni01CD Acaron uni01CD 296 | uni01CE acaron uni01CE 297 | uni01CF Icaron uni01CF 298 | uni01D0 icaron uni01D0 299 | uni01D1 Ocaron uni01D1 300 | uni01D2 ocaron uni01D2 301 | uni01D3 Ucaron uni01D3 302 | uni01D4 ucaron uni01D4 303 | uni01F8 Ngrave uni01F8 304 | uni01F9 ngrave uni01F9 305 | uni1E3E Macute uni1E3E 306 | uni1E3F macute uni1E3F 307 | uni1E72 Udiaresisbelow uni1E72 308 | uni1E73 udiaresisbelow uni1E73 309 | -------------------------------------------------------------------------------- /POJ ChhiuKi/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /POJ ChhiuKi/bold/POJChhiuKi-Bold.fea: -------------------------------------------------------------------------------- 1 | languagesystem DFLT dflt; 2 | languagesystem latn dflt; 3 | 4 | # GSUB 5 | feature ccmp { 6 | sub i' [acutecomb gravecomb circumflexcomb 7 | caroncomb macroncomb vlinecomb 8 | brevecomb hungarumlautcomb ringcomb] by dotlessi; 9 | } ccmp; 10 | 11 | feature liga { 12 | sub f i by f_i.liga; 13 | sub f f i by f_f_i.liga; 14 | sub f l by f_l.liga; 15 | sub f f l by f_f_l.liga; 16 | } liga; 17 | 18 | @digit = [zero one two three four five six seven eight nine]; 19 | @numerator = [zero.numr uni00B9 uni00B2 uni00B3 four.numr 20 | five.numr six.numr seven.numr eight.numr nine.numr]; 21 | @denominator = [zero.dnom one.dnom two.dnom three.dnom four.dnom 22 | five.dnom six.dnom seven.dnom eight.dnom nine.dnom]; 23 | 24 | feature frac { 25 | sub slash by fraction; 26 | sub @digit by @numerator; 27 | sub fraction @numerator' by @denominator; 28 | } frac; 29 | 30 | # GPOS 31 | 32 | @A.uc = [A Agrave Aacute Acircumflex Aring Amacron Abreve Acaron]; 33 | @E.uc = [E Egrave Eacute Ecircumflex Emacron Ebreve Ecaron]; 34 | @I.uc = [I Igrave Iacute Icircumflex Imacron Ibreve Icaron]; 35 | @O.uc = [O Ograve Oacute Ocircumflex Omacron Obreve Ohungarumlaut Ocaron]; 36 | @U.uc = [U Ugrave Uacute Ucircumflex Umacron Ubreve Uring Uhungarumlaut Ucaron Udiaresisbelow]; 37 | 38 | @a.lc = [a agrave aacute acircumflex aring amacron abreve acaron]; 39 | @e.lc = [e egrave eacute ecircumflex emacron ebreve ecaron]; 40 | @i.lc = [i igrave iacute icircumflex imacron ibreve icaron dotlessi]; 41 | @o.lc = [o ograve oacute ocircumflex omacron obreve ohungarumlaut ocaron]; 42 | @u.lc = [u ugrave uacute ucircumflex umacron ubreve uring uhungarumlaut ucaron udiaresisbelow]; 43 | 44 | lookup MARK_TOP_RIGHT { 45 | markClass [dotcomb] @top_right; 46 | 47 | pos base [@A.uc] mark @top_right; 48 | pos base [@E.uc] mark @top_right; 49 | pos base [@I.uc] mark @top_right; 50 | pos base [@O.uc] mark @top_right; 51 | pos base [@U.uc] mark @top_right; 52 | 53 | pos base [@a.lc] mark @top_right; 54 | pos base [@e.lc] mark @top_right; 55 | pos base [@i.lc] mark @top_right; 56 | pos base [@o.lc] mark @top_right; 57 | pos base [@u.lc] mark @top_right; 58 | } MARK_TOP_RIGHT; 59 | 60 | lookup MARK_TOP { 61 | markClass [gravecomb] @top; 62 | markClass [acutecomb hungarumlautcomb] @top; 63 | markClass [circumflexcomb caroncomb brevecomb ringcomb vlinecomb] @top; 64 | markClass [macroncomb] @top; 65 | 66 | pos base [A] mark @top; 67 | pos base [B] mark @top; 68 | pos base [C] mark @top; 69 | pos base [D P R] mark @top; 70 | pos base [E] mark @top; 71 | pos base [F] mark @top; 72 | pos base [G] mark @top; 73 | pos base [H N] mark @top; 74 | pos base [I] mark @top; 75 | pos base [J] mark @top; 76 | pos base [K] mark @top; 77 | pos base [L] mark @top; 78 | pos base [M W] mark @top; 79 | pos base [O Q] mark @top; 80 | pos base [S] mark @top; 81 | pos base [T] mark @top; 82 | pos base [U V] mark @top; 83 | pos base [X] mark @top; 84 | pos base [Y Z] mark @top; 85 | 86 | pos base [a c e g] mark @top; 87 | pos base [b h k] mark @top; 88 | pos base [d] mark @top; 89 | pos base [f] mark @top; 90 | pos base [dotlessi] mark @top; 91 | pos base [j] mark @top; 92 | pos base [l] mark @top; 93 | pos base [m] mark @top; 94 | pos base [n u] mark @top; 95 | pos base [o] mark @top; 96 | pos base [p q] mark @top; 97 | pos base [r] mark @top; 98 | pos base [s] mark @top; 99 | pos base [t] mark @top; 100 | pos base [v] mark @top; 101 | pos base [w] mark @top; 102 | pos base [x y z] mark @top; 103 | } MARK_TOP; 104 | 105 | lookup MARK_BOTTOM { 106 | markClass [diaresisbelowcomb] @bottom; 107 | 108 | pos base [@A.uc] mark @bottom; 109 | pos base [@E.uc] mark @bottom; 110 | pos base [@I.uc] mark @bottom; 111 | pos base [@O.uc] mark @bottom; 112 | pos base [@U.uc] mark @bottom; 113 | 114 | pos base [@a.lc] mark @bottom; 115 | pos base [@e.lc] mark @bottom; 116 | pos base [@i.lc] mark @bottom; 117 | pos base [@o.lc] mark @bottom; 118 | pos base [@u.lc] mark @bottom; 119 | } MARK_BOTTOM; 120 | 121 | feature mark { 122 | lookup MARK_TOP; 123 | lookup MARK_TOP_RIGHT; 124 | lookup MARK_BOTTOM; 125 | } mark; 126 | 127 | feature kern { 128 | pos space T -60; 129 | pos quotedbl w 11; 130 | pos quotesingle w 11; 131 | pos parenleft Yacute 22; 132 | pos parenleft Y 22; 133 | pos parenleft W 38; 134 | pos parenleft V 20; 135 | pos slash slash -248; 136 | pos A w -33; 137 | pos A t -17; 138 | pos A question -81; 139 | pos C braceright -17; 140 | pos C bracketright -12; 141 | pos C parenright -26; 142 | pos D AE -33; 143 | pos E w -22; 144 | pos E f -18; 145 | pos F ydieresis -24; 146 | pos F yacute -24; 147 | pos F udieresis -22; 148 | pos F ucircumflex -22; 149 | pos F uacute -22; 150 | pos F ugrave -22; 151 | pos F odieresis -21; 152 | pos F otilde -21; 153 | pos F ocircumflex -21; 154 | pos F oacute -21; 155 | pos F ograve -21; 156 | pos F edieresis -21; 157 | pos F ecircumflex -21; 158 | pos F eacute -21; 159 | pos F egrave -21; 160 | pos F ccedilla -21; 161 | pos F aring -34; 162 | pos F adieresis -34; 163 | pos F atilde -34; 164 | pos F acircumflex -34; 165 | pos F aacute -34; 166 | pos F agrave -34; 167 | pos F Aring -192; 168 | pos F Adieresis -192; 169 | pos F Atilde -192; 170 | pos F Acircumflex -192; 171 | pos F Aacute -192; 172 | pos F Agrave -192; 173 | pos F ellipsis -274; 174 | pos F quotedblbase -274; 175 | pos F quotesinglbase -274; 176 | pos F oe -21; 177 | pos F y -24; 178 | pos F v -24; 179 | pos F u -22; 180 | pos F r -26; 181 | pos F q -21; 182 | pos F o -21; 183 | pos F g -21; 184 | pos F e -21; 185 | pos F d -21; 186 | pos F c -21; 187 | pos F a -34; 188 | pos F T 20; 189 | pos F J -208; 190 | pos F A -192; 191 | pos F period -274; 192 | pos F comma -274; 193 | pos K w -63; 194 | pos L w -52; 195 | pos O AE -33; 196 | pos P AE -297; 197 | pos P t 14; 198 | pos Q Yacute -35; 199 | pos Q Y -35; 200 | pos Q W -20; 201 | pos Q V -28; 202 | pos Q T -33; 203 | pos R Yacute -48; 204 | pos R Y -48; 205 | pos R V -19; 206 | pos R T -50; 207 | pos T oslash -95; 208 | pos T ae -84; 209 | pos T AE -189; 210 | pos T guillemotright -146; 211 | pos T guillemotleft -148; 212 | pos T w -47; 213 | pos T r -65; 214 | pos T space -60; 215 | pos V braceright 19; 216 | pos V r -30; 217 | pos V bracketright 17; 218 | pos V parenright 20; 219 | pos W braceright 14; 220 | pos W r -21; 221 | pos W bracketright 12; 222 | pos W parenright 15; 223 | pos Y bullet -45; 224 | pos Y oslash -64; 225 | pos Y ae -63; 226 | pos Y AE -96; 227 | pos Y guillemotright -51; 228 | pos Y guillemotleft -82; 229 | pos Y braceright 19; 230 | pos Y t -22; 231 | pos Y r -40; 232 | pos Y f -22; 233 | pos Y bracketright 18; 234 | pos Y asterisk -49; 235 | pos Y parenright 20; 236 | pos Y ampersand -30; 237 | pos Z w -27; 238 | pos bracketleft Udieresis -18; 239 | pos bracketleft Ucircumflex -18; 240 | pos bracketleft Uacute -18; 241 | pos bracketleft Ugrave -18; 242 | pos bracketleft U -18; 243 | pos bracketleft J -18; 244 | pos e quoteright -64; 245 | pos f uni02BC 16; 246 | pos f second 16; 247 | pos f minute 16; 248 | pos f edieresis -24; 249 | pos f ecircumflex -24; 250 | pos f eacute -24; 251 | pos f egrave -24; 252 | pos f ccedilla -24; 253 | pos f quotedblright 16; 254 | pos f quotedblleft 16; 255 | pos f quoteright 16; 256 | pos f quoteleft 16; 257 | pos f oe -24; 258 | pos f braceright 19; 259 | pos f q -24; 260 | pos f g -24; 261 | pos f e -24; 262 | pos f d -24; 263 | pos f c -24; 264 | pos f bracketright 18; 265 | pos f parenright 20; 266 | pos f quotesingle 16; 267 | pos f quotedbl 16; 268 | pos h quoteright -104; 269 | pos k edieresis -20; 270 | pos k ecircumflex -20; 271 | pos k eacute -20; 272 | pos k egrave -20; 273 | pos k ccedilla -20; 274 | pos k oe -20; 275 | pos k q -20; 276 | pos k g -20; 277 | pos k e -20; 278 | pos k d -20; 279 | pos k c -20; 280 | pos m quoteright -120; 281 | pos n quoteright -120; 282 | pos o quoteright -112; 283 | pos r quoteright 16; 284 | pos r w 17; 285 | pos r t 50; 286 | pos r f 20; 287 | pos t odieresis -30; 288 | pos t otilde -30; 289 | pos t ocircumflex -30; 290 | pos t oacute -30; 291 | pos t ograve -30; 292 | pos t quoteright 24; 293 | pos t o -30; 294 | pos v f 13; 295 | pos w ellipsis -124; 296 | pos w quotedblbase -124; 297 | pos w quotesinglbase -124; 298 | pos w period -124; 299 | pos w comma -124; 300 | pos y f 13; 301 | pos braceleft Udieresis -20; 302 | pos braceleft Ucircumflex -20; 303 | pos braceleft Uacute -20; 304 | pos braceleft Ugrave -20; 305 | pos braceleft U -20; 306 | pos braceleft J -20; 307 | pos quoteleft w 11; 308 | pos quoteright odieresis -144; 309 | pos quoteright otilde -144; 310 | pos quoteright ocircumflex -144; 311 | pos quoteright oacute -144; 312 | pos quoteright ograve -144; 313 | pos quoteright edieresis -104; 314 | pos quoteright ecircumflex -104; 315 | pos quoteright eacute -104; 316 | pos quoteright egrave -104; 317 | pos quoteright ccedilla -104; 318 | pos quoteright oe -104; 319 | pos quoteright w 11; 320 | pos quoteright s -232; 321 | pos quoteright q -104; 322 | pos quoteright o -144; 323 | pos quoteright g -104; 324 | pos quoteright e -104; 325 | pos quoteright d -104; 326 | pos quoteright c -104; 327 | pos quotedblleft w 11; 328 | pos quotedblright w 11; 329 | pos Eth AE -33; 330 | pos Agrave w -33; 331 | pos Agrave t -17; 332 | pos Agrave question -81; 333 | pos Aacute w -33; 334 | pos Aacute t -17; 335 | pos Aacute question -81; 336 | pos Acircumflex w -33; 337 | pos Acircumflex t -17; 338 | pos Acircumflex question -81; 339 | pos Atilde w -33; 340 | pos Atilde t -17; 341 | pos Atilde question -81; 342 | pos Adieresis w -33; 343 | pos Adieresis t -17; 344 | pos Adieresis question -81; 345 | pos Aring w -33; 346 | pos Aring t -17; 347 | pos Aring question -81; 348 | pos Ccedilla braceright -17; 349 | pos Ccedilla bracketright -12; 350 | pos Ccedilla parenright -26; 351 | pos Egrave w -22; 352 | pos Egrave f -18; 353 | pos Eacute w -22; 354 | pos Eacute f -18; 355 | pos Ecircumflex w -22; 356 | pos Ecircumflex f -18; 357 | pos Edieresis w -22; 358 | pos Edieresis f -18; 359 | pos Ograve AE -33; 360 | pos Oacute AE -33; 361 | pos Ocircumflex AE -33; 362 | pos Otilde AE -33; 363 | pos Odieresis AE -33; 364 | pos Yacute bullet -45; 365 | pos Yacute oslash -64; 366 | pos Yacute ae -63; 367 | pos Yacute AE -96; 368 | pos Yacute guillemotright -51; 369 | pos Yacute guillemotleft -82; 370 | pos Yacute braceright 19; 371 | pos Yacute t -22; 372 | pos Yacute r -40; 373 | pos Yacute f -22; 374 | pos Yacute bracketright 18; 375 | pos Yacute asterisk -49; 376 | pos Yacute parenright 20; 377 | pos Yacute ampersand -30; 378 | pos egrave quoteright -64; 379 | pos eacute quoteright -64; 380 | pos ecircumflex quoteright -64; 381 | pos edieresis quoteright -64; 382 | pos ntilde quoteright -120; 383 | pos ograve quoteright -112; 384 | pos oacute quoteright -112; 385 | pos ocircumflex quoteright -112; 386 | pos otilde quoteright -112; 387 | pos odieresis quoteright -112; 388 | pos yacute f 13; 389 | pos ydieresis f 13; 390 | pos minute w 11; 391 | pos second w 11; 392 | pos uni02BC w 11; 393 | 394 | subtable; 395 | 396 | @kcl_0 = [H I M N Igrave Iacute Icircumflex Idieresis Ntilde ]; 397 | @kcl_1 = [D O Eth Ograve Oacute Ocircumflex Otilde Odieresis ]; 398 | @kcl_2 = [A Agrave Aacute Acircumflex Atilde Adieresis Aring ]; 399 | @kcl_3 = [o ograve oacute ocircumflex otilde odieresis ]; 400 | @kcl_4 = [h m n ntilde ]; 401 | @kcl_5 = [E Egrave Eacute Ecircumflex Edieresis ]; 402 | @kcl_6 = [a agrave aacute acircumflex atilde adieresis aring ]; 403 | @kcl_7 = [b p thorn ]; 404 | @kcl_8 = [e egrave eacute ecircumflex edieresis ]; 405 | @kcl_9 = [v y yacute ydieresis ]; 406 | @kcl_10 = [J U Ugrave Uacute Ucircumflex Udieresis ]; 407 | @kcl_11 = [K ]; 408 | @kcl_12 = [Y Yacute ]; 409 | @kcl_13 = [T ]; 410 | @kcl_14 = [z ]; 411 | @kcl_15 = [Z ]; 412 | @kcl_16 = [X ]; 413 | @kcl_17 = [C Ccedilla ]; 414 | @kcl_18 = [x ]; 415 | @kcl_19 = [r ]; 416 | @kcl_20 = [P ]; 417 | @kcl_21 = [c ccedilla ]; 418 | @kcl_22 = [L ]; 419 | @kcl_23 = [quotedbl quotesingle quoteleft quoteright quotedblleft quotedblright 420 | minute second uni02BC ]; 421 | @kcl_24 = [W ]; 422 | @kcl_25 = [B ]; 423 | @kcl_26 = [V ]; 424 | @kcl_27 = [comma period quotesinglbase quotedblbase ellipsis ]; 425 | @kcr_1 = [c d e g q oe ccedilla egrave eacute ecircumflex edieresis ]; 426 | @kcr_2 = [C G O Q Oslash OE Ccedilla Ograve Oacute Ocircumflex Otilde Odieresis ]; 427 | @kcr_3 = [m n p ntilde ]; 428 | @kcr_4 = [o ograve oacute ocircumflex otilde odieresis ]; 429 | @kcr_5 = [u ugrave uacute ucircumflex udieresis ]; 430 | @kcr_6 = [A Agrave Aacute Acircumflex Atilde Adieresis Aring ]; 431 | @kcr_7 = [a agrave aacute acircumflex atilde adieresis aring ]; 432 | @kcr_8 = [v y yacute ydieresis ]; 433 | @kcr_9 = [U Ugrave Uacute Ucircumflex Udieresis ]; 434 | @kcr_10 = [T ]; 435 | @kcr_11 = [Y Yacute ]; 436 | @kcr_12 = [s ]; 437 | @kcr_13 = [z ]; 438 | @kcr_14 = [S ]; 439 | @kcr_15 = [X ]; 440 | @kcr_16 = [Z ]; 441 | @kcr_17 = [quotedbl quotesingle quoteleft quoteright quotedblleft quotedblright 442 | minute second uni02BC ]; 443 | @kcr_18 = [x ]; 444 | @kcr_19 = [W ]; 445 | @kcr_20 = [comma period quotesinglbase quotedblbase ellipsis ]; 446 | @kcr_21 = [V ]; 447 | @kcr_22 = [hyphen endash emdash uni00AD ]; 448 | @kcr_23 = [J ]; 449 | pos @kcl_0 @kcr_6 18; 450 | pos @kcl_0 @kcr_10 -29; 451 | pos @kcl_0 @kcr_11 -28; 452 | pos @kcl_0 @kcr_15 17; 453 | pos @kcl_1 @kcr_6 -21; 454 | pos @kcl_1 @kcr_10 -85; 455 | pos @kcl_1 @kcr_11 -43; 456 | pos @kcl_1 @kcr_15 -22; 457 | pos @kcl_1 @kcr_16 -23; 458 | pos @kcl_1 @kcr_20 -122; 459 | pos @kcl_1 @kcr_21 -22; 460 | pos @kcl_2 @kcr_2 -21; 461 | pos @kcl_2 @kcr_3 -48; 462 | pos @kcl_2 @kcr_4 -12; 463 | pos @kcl_2 @kcr_5 -11; 464 | pos @kcl_2 @kcr_8 -50; 465 | pos @kcl_2 @kcr_9 -17; 466 | pos @kcl_2 @kcr_10 -120; 467 | pos @kcl_2 @kcr_11 -150; 468 | pos @kcl_2 @kcr_13 12; 469 | pos @kcl_2 @kcr_17 -120; 470 | pos @kcl_2 @kcr_19 -39; 471 | pos @kcl_2 @kcr_21 -77; 472 | pos @kcl_3 @kcr_8 -15; 473 | pos @kcl_3 @kcr_13 -16; 474 | pos @kcl_3 @kcr_17 -88; 475 | pos @kcl_3 @kcr_18 -21; 476 | pos @kcl_4 @kcr_17 -80; 477 | pos @kcl_5 @kcr_1 -19; 478 | pos @kcl_5 @kcr_4 -19; 479 | pos @kcl_5 @kcr_5 -17; 480 | pos @kcl_5 @kcr_8 -26; 481 | pos @kcl_5 @kcr_10 20; 482 | pos @kcl_6 @kcr_8 -15; 483 | pos @kcl_6 @kcr_17 -17; 484 | pos @kcl_7 @kcr_8 -11; 485 | pos @kcl_7 @kcr_13 -15; 486 | pos @kcl_7 @kcr_17 -29; 487 | pos @kcl_7 @kcr_18 -15; 488 | pos @kcl_8 @kcr_8 -13; 489 | pos @kcl_8 @kcr_17 -14; 490 | pos @kcl_9 @kcr_1 -13; 491 | pos @kcl_9 @kcr_4 -15; 492 | pos @kcl_9 @kcr_7 -15; 493 | pos @kcl_9 @kcr_17 15; 494 | pos @kcl_9 @kcr_20 -167; 495 | pos @kcl_10 @kcr_6 -22; 496 | pos @kcl_11 @kcr_1 -26; 497 | pos @kcl_11 @kcr_2 -31; 498 | pos @kcl_11 @kcr_4 -27; 499 | pos @kcl_11 @kcr_5 -23; 500 | pos @kcl_11 @kcr_8 -40; 501 | pos @kcl_11 @kcr_22 -164; 502 | pos @kcl_12 @kcr_1 -65; 503 | pos @kcl_12 @kcr_2 -29; 504 | pos @kcl_12 @kcr_3 -40; 505 | pos @kcl_12 @kcr_4 -65; 506 | pos @kcl_12 @kcr_5 -39; 507 | pos @kcl_12 @kcr_6 -150; 508 | pos @kcl_12 @kcr_7 -63; 509 | pos @kcl_12 @kcr_8 -20; 510 | pos @kcl_12 @kcr_9 -96; 511 | pos @kcl_12 @kcr_10 17; 512 | pos @kcl_12 @kcr_11 18; 513 | pos @kcl_12 @kcr_12 -58; 514 | pos @kcl_12 @kcr_13 -30; 515 | pos @kcl_12 @kcr_14 -16; 516 | pos @kcl_12 @kcr_15 13; 517 | pos @kcl_12 @kcr_18 -23; 518 | pos @kcl_12 @kcr_19 17; 519 | pos @kcl_12 @kcr_20 -231; 520 | pos @kcl_12 @kcr_21 18; 521 | pos @kcl_12 @kcr_22 -152; 522 | pos @kcl_12 @kcr_23 -96; 523 | pos @kcl_13 @kcr_1 -89; 524 | pos @kcl_13 @kcr_2 -28; 525 | pos @kcl_13 @kcr_3 -89; 526 | pos @kcl_13 @kcr_4 -208; 527 | pos @kcl_13 @kcr_5 -65; 528 | pos @kcl_13 @kcr_6 -120; 529 | pos @kcl_13 @kcr_7 -168; 530 | pos @kcl_13 @kcr_8 -82; 531 | pos @kcl_13 @kcr_10 16; 532 | pos @kcl_13 @kcr_11 16; 533 | pos @kcl_13 @kcr_12 -76; 534 | pos @kcl_13 @kcr_13 -60; 535 | pos @kcl_13 @kcr_14 -16; 536 | pos @kcl_13 @kcr_18 -77; 537 | pos @kcl_13 @kcr_19 15; 538 | pos @kcl_13 @kcr_20 -258; 539 | pos @kcl_13 @kcr_21 16; 540 | pos @kcl_13 @kcr_22 -272; 541 | pos @kcl_13 @kcr_23 -216; 542 | pos @kcl_14 @kcr_1 -16; 543 | pos @kcl_14 @kcr_4 -16; 544 | pos @kcl_15 @kcr_1 -21; 545 | pos @kcl_15 @kcr_2 -26; 546 | pos @kcl_15 @kcr_4 -21; 547 | pos @kcl_15 @kcr_5 -19; 548 | pos @kcl_15 @kcr_6 13; 549 | pos @kcl_15 @kcr_8 -27; 550 | pos @kcl_16 @kcr_1 -26; 551 | pos @kcl_16 @kcr_2 -25; 552 | pos @kcl_16 @kcr_4 -21; 553 | pos @kcl_16 @kcr_5 -21; 554 | pos @kcl_16 @kcr_8 -31; 555 | pos @kcl_16 @kcr_21 14; 556 | pos @kcl_16 @kcr_22 -156; 557 | pos @kcl_17 @kcr_10 -29; 558 | pos @kcl_18 @kcr_1 -20; 559 | pos @kcl_18 @kcr_4 -40; 560 | pos @kcl_19 @kcr_1 -19; 561 | pos @kcl_19 @kcr_4 -36; 562 | pos @kcl_19 @kcr_7 -30; 563 | pos @kcl_19 @kcr_8 18; 564 | pos @kcl_19 @kcr_17 16; 565 | pos @kcl_19 @kcr_20 -173; 566 | pos @kcl_20 @kcr_1 -13; 567 | pos @kcl_20 @kcr_4 -13; 568 | pos @kcl_20 @kcr_6 -178; 569 | pos @kcl_20 @kcr_7 -11; 570 | pos @kcl_20 @kcr_8 15; 571 | pos @kcl_20 @kcr_15 -51; 572 | pos @kcl_20 @kcr_16 -36; 573 | pos @kcl_20 @kcr_20 -404; 574 | pos @kcl_20 @kcr_23 -184; 575 | pos @kcl_21 @kcr_17 -11; 576 | pos @kcl_22 @kcr_2 -64; 577 | pos @kcl_22 @kcr_5 -14; 578 | pos @kcl_22 @kcr_6 19; 579 | pos @kcl_22 @kcr_8 -123; 580 | pos @kcl_22 @kcr_9 -24; 581 | pos @kcl_22 @kcr_10 -205; 582 | pos @kcl_22 @kcr_11 -279; 583 | pos @kcl_22 @kcr_17 -288; 584 | pos @kcl_22 @kcr_19 -93; 585 | pos @kcl_22 @kcr_21 -206; 586 | pos @kcl_23 @kcr_1 -59; 587 | pos @kcl_23 @kcr_3 -20; 588 | pos @kcl_23 @kcr_4 -91; 589 | pos @kcl_23 @kcr_6 -120; 590 | pos @kcl_23 @kcr_7 -50; 591 | pos @kcl_23 @kcr_12 -92; 592 | pos @kcl_23 @kcr_17 -37; 593 | pos @kcl_24 @kcr_1 -31; 594 | pos @kcl_24 @kcr_4 -31; 595 | pos @kcl_24 @kcr_5 -19; 596 | pos @kcl_24 @kcr_6 -43; 597 | pos @kcl_24 @kcr_7 -33; 598 | pos @kcl_24 @kcr_10 14; 599 | pos @kcl_24 @kcr_20 -143; 600 | pos @kcl_24 @kcr_22 -60; 601 | pos @kcl_25 @kcr_10 -27; 602 | pos @kcl_25 @kcr_11 -55; 603 | pos @kcl_25 @kcr_21 -24; 604 | pos @kcl_26 @kcr_1 -44; 605 | pos @kcl_26 @kcr_2 -13; 606 | pos @kcl_26 @kcr_4 -46; 607 | pos @kcl_26 @kcr_5 -28; 608 | pos @kcl_26 @kcr_6 -75; 609 | pos @kcl_26 @kcr_7 -46; 610 | pos @kcl_26 @kcr_8 -11; 611 | pos @kcl_26 @kcr_20 -215; 612 | pos @kcl_26 @kcr_22 -157; 613 | pos @kcl_27 @kcr_17 -285; 614 | 615 | subtable; 616 | 617 | pos [dotcomb] 240; 618 | pos [@o.lc] [dotcomb]' 100 [h k l exclam question quotesingle quotedbl quotedblright uni207F]; 619 | } kern; 620 | -------------------------------------------------------------------------------- /POJ ChhiuKi/commands.txt: -------------------------------------------------------------------------------- 1 | # To generate AFDKO OTFs, use the following commands 2 | # Or, you can just use FontForge directly 3 | 4 | # First generate the OTFs without features in each directory 5 | # Then run: 6 | 7 | # Regular 8 | makeotf -f ./regular/POJChhiuKi-Regular.otf \ 9 | -ff ./regular/POJChhiuKi-Regular.fea \ 10 | -r \ 11 | -o POJChhiuKi-Regular.otf 12 | 13 | # Bold 14 | makeotf -f ./bold/POJChhiuKi-Bold.otf \ 15 | -ff ./bold/POJChhiuKi-Bold.fea \ 16 | -b -r \ 17 | -o POJChhiuKi-Bold.otf 18 | 19 | # Italic 20 | makeotf -f ./italic/POJChhiuKi-Italic.otf \ 21 | -ff ./italic/POJChhiuKi-Italic.fea \ 22 | -i -r \ 23 | -o POJChhiuKi-Italic.otf 24 | -------------------------------------------------------------------------------- /POJ ChhiuKi/italic/POJChhiuKi-Italic.fea: -------------------------------------------------------------------------------- 1 | languagesystem DFLT dflt; 2 | languagesystem latn dflt; 3 | 4 | # GSUB 5 | feature ccmp { 6 | sub i' [acutecomb gravecomb circumflexcomb 7 | caroncomb macroncomb vlinecomb 8 | brevecomb hungarumlautcomb ringcomb] by dotlessi; 9 | } ccmp; 10 | 11 | feature liga { 12 | sub f i by f_i.liga; 13 | sub f f i by f_f_i.liga; 14 | sub f l by f_l.liga; 15 | sub f f l by f_f_l.liga; 16 | } liga; 17 | 18 | @digit = [zero one two three four five six seven eight nine]; 19 | @numerator = [zero.numr uni00B9 uni00B2 uni00B3 four.numr 20 | five.numr six.numr seven.numr eight.numr nine.numr]; 21 | @denominator = [zero.dnom one.dnom two.dnom three.dnom four.dnom 22 | five.dnom six.dnom seven.dnom eight.dnom nine.dnom]; 23 | 24 | feature frac { 25 | sub slash by fraction; 26 | sub @digit by @numerator; 27 | sub fraction @numerator' by @denominator; 28 | } frac; 29 | 30 | # GPOS 31 | 32 | @A.uc = [A Agrave Aacute Acircumflex Aring Amacron Abreve Acaron]; 33 | @E.uc = [E Egrave Eacute Ecircumflex Emacron Ebreve Ecaron]; 34 | @I.uc = [I Igrave Iacute Icircumflex Imacron Ibreve Icaron]; 35 | @O.uc = [O Ograve Oacute Ocircumflex Omacron Obreve Ohungarumlaut Ocaron]; 36 | @U.uc = [U Ugrave Uacute Ucircumflex Umacron Ubreve Uring Uhungarumlaut Ucaron Udiaresisbelow]; 37 | 38 | @a.lc = [a agrave aacute acircumflex aring amacron abreve acaron]; 39 | @e.lc = [e egrave eacute ecircumflex emacron ebreve ecaron]; 40 | @i.lc = [i igrave iacute icircumflex imacron ibreve icaron dotlessi]; 41 | @o.lc = [o ograve oacute ocircumflex omacron obreve ohungarumlaut ocaron]; 42 | @u.lc = [u ugrave uacute ucircumflex umacron ubreve uring uhungarumlaut ucaron udiaresisbelow]; 43 | 44 | lookup MARK_TOP_RIGHT { 45 | markClass [dotcomb] @top_right; 46 | 47 | pos base [@A.uc] mark @top_right; 48 | pos base [@E.uc] mark @top_right; 49 | pos base [@I.uc] mark @top_right; 50 | pos base [@O.uc] mark @top_right; 51 | pos base [@U.uc] mark @top_right; 52 | 53 | pos base [@a.lc] mark @top_right; 54 | pos base [@e.lc] mark @top_right; 55 | pos base [@i.lc] mark @top_right; 56 | pos base [@o.lc] mark @top_right; 57 | pos base [@u.lc] mark @top_right; 58 | } MARK_TOP_RIGHT; 59 | 60 | lookup MARK_TOP { 61 | markClass [gravecomb] @top; 62 | markClass [acutecomb hungarumlautcomb] @top; 63 | markClass [circumflexcomb caroncomb brevecomb ringcomb vlinecomb] @top; 64 | markClass [macroncomb] @top; 65 | 66 | pos base [A K U] mark @top; 67 | pos base [B D P R] mark @top; 68 | pos base [C] mark @top; 69 | pos base [E] mark @top; 70 | pos base [F] mark @top; 71 | pos base [G O Q] mark @top; 72 | pos base [H N] mark @top; 73 | pos base [I L] mark @top; 74 | pos base [J] mark @top; 75 | pos base [M] mark @top; 76 | pos base [S] mark @top; 77 | pos base [T] mark @top; 78 | pos base [V Y Z] mark @top; 79 | pos base [W] mark @top; 80 | pos base [X] mark @top; 81 | 82 | pos base [a c e g q] mark @top; 83 | pos base [b h k l] mark @top; 84 | pos base [d] mark @top; 85 | pos base [f] mark @top; 86 | pos base [dotlessi] mark @top; 87 | pos base [j] mark @top; 88 | pos base [m] mark @top; 89 | pos base [n u] mark @top; 90 | pos base [o p] mark @top; 91 | pos base [r] mark @top; 92 | pos base [s] mark @top; 93 | pos base [t] mark @top; 94 | pos base [v] mark @top; 95 | pos base [w] mark @top; 96 | pos base [x z] mark @top; 97 | pos base [y] mark @top; 98 | } MARK_TOP; 99 | 100 | lookup MARK_BOTTOM { 101 | markClass [diaresisbelowcomb] @bottom; 102 | 103 | pos base [@A.uc] mark @bottom; 104 | pos base [@E.uc] mark @bottom; 105 | pos base [@I.uc] mark @bottom; 106 | pos base [@O.uc] mark @bottom; 107 | pos base [@U.uc] mark @bottom; 108 | 109 | pos base [@a.lc] mark @bottom; 110 | pos base [@e.lc] mark @bottom; 111 | pos base [@i.lc] mark @bottom; 112 | pos base [@o.lc] mark @bottom; 113 | pos base [@u.lc] mark @bottom; 114 | } MARK_BOTTOM; 115 | 116 | feature mark { 117 | lookup MARK_TOP; 118 | lookup MARK_TOP_RIGHT; 119 | lookup MARK_BOTTOM; 120 | } mark; 121 | 122 | feature kern { 123 | pos space T -40; 124 | pos quotedbl w 11; 125 | pos quotesingle w 11; 126 | pos parenleft Yacute 22; 127 | pos parenleft Y 22; 128 | pos parenleft W 18; 129 | pos parenleft V 20; 130 | pos slash slash -224; 131 | pos A w -33; 132 | pos A t -17; 133 | pos A question -61; 134 | pos C braceright -17; 135 | pos C bracketright -12; 136 | pos C parenright -26; 137 | pos D AE -33; 138 | pos E w -22; 139 | pos E f -18; 140 | pos F ydieresis -24; 141 | pos F yacute -24; 142 | pos F udieresis -22; 143 | pos F ucircumflex -22; 144 | pos F uacute -22; 145 | pos F ugrave -22; 146 | pos F odieresis -21; 147 | pos F otilde -21; 148 | pos F ocircumflex -21; 149 | pos F oacute -21; 150 | pos F ograve -21; 151 | pos F edieresis -21; 152 | pos F ecircumflex -21; 153 | pos F eacute -21; 154 | pos F egrave -21; 155 | pos F ccedilla -21; 156 | pos F aring -34; 157 | pos F adieresis -34; 158 | pos F atilde -34; 159 | pos F acircumflex -34; 160 | pos F aacute -34; 161 | pos F agrave -34; 162 | pos F Aring -170; 163 | pos F Adieresis -170; 164 | pos F Atilde -170; 165 | pos F Acircumflex -170; 166 | pos F Aacute -170; 167 | pos F Agrave -170; 168 | pos F ellipsis -234; 169 | pos F quotedblbase -234; 170 | pos F quotesinglbase -234; 171 | pos F oe -21; 172 | pos F y -24; 173 | pos F v -24; 174 | pos F u -22; 175 | pos F r -26; 176 | pos F q -21; 177 | pos F o -21; 178 | pos F g -21; 179 | pos F e -21; 180 | pos F d -21; 181 | pos F c -21; 182 | pos F a -34; 183 | pos F T 20; 184 | pos F J -264; 185 | pos F A -170; 186 | pos F period -234; 187 | pos F comma -234; 188 | pos K w -63; 189 | pos L w -92; 190 | pos O AE -33; 191 | pos P AE -97; 192 | pos P t 14; 193 | pos Q Yacute -35; 194 | pos Q Y -35; 195 | pos Q W -20; 196 | pos Q V -28; 197 | pos Q T -43; 198 | pos R Yacute -48; 199 | pos R Y -48; 200 | pos R V -19; 201 | pos R T -80; 202 | pos T oslash -95; 203 | pos T ae -114; 204 | pos T AE -179; 205 | pos T guillemotright -216; 206 | pos T guillemotleft -328; 207 | pos T w -57; 208 | pos T r -75; 209 | pos T space -40; 210 | pos V braceright 19; 211 | pos V r -30; 212 | pos V bracketright 17; 213 | pos V parenright 20; 214 | pos W braceright 14; 215 | pos W r -21; 216 | pos W bracketright 12; 217 | pos W parenright 15; 218 | pos Y bullet -45; 219 | pos Y oslash -64; 220 | pos Y ae -63; 221 | pos Y AE -96; 222 | pos Y guillemotright -51; 223 | pos Y guillemotleft -82; 224 | pos Y braceright 19; 225 | pos Y t -22; 226 | pos Y r -40; 227 | pos Y f -22; 228 | pos Y bracketright 18; 229 | pos Y asterisk -49; 230 | pos Y parenright 20; 231 | pos Y ampersand -30; 232 | pos Z w -27; 233 | pos bracketleft Udieresis -18; 234 | pos bracketleft Ucircumflex -18; 235 | pos bracketleft Uacute -18; 236 | pos bracketleft Ugrave -18; 237 | pos bracketleft U -18; 238 | pos bracketleft J -18; 239 | pos e quoteright -80; 240 | pos f uni02BC 16; 241 | pos f second 16; 242 | pos f minute 16; 243 | pos f edieresis -24; 244 | pos f ecircumflex -24; 245 | pos f eacute -24; 246 | pos f egrave -24; 247 | pos f ccedilla -24; 248 | pos f quotedblright 16; 249 | pos f quotedblleft 16; 250 | pos f quoteright 16; 251 | pos f quoteleft 16; 252 | pos f oe -24; 253 | pos f braceright 19; 254 | pos f q -24; 255 | pos f g -24; 256 | pos f e -24; 257 | pos f d -24; 258 | pos f c -24; 259 | pos f bracketright 18; 260 | pos f parenright 20; 261 | pos f quotesingle 16; 262 | pos f quotedbl 16; 263 | pos h quoteright -80; 264 | pos k edieresis -20; 265 | pos k ecircumflex -20; 266 | pos k eacute -20; 267 | pos k egrave -20; 268 | pos k ccedilla -20; 269 | pos k oe -20; 270 | pos k q -20; 271 | pos k g -20; 272 | pos k e -20; 273 | pos k d -20; 274 | pos k c -20; 275 | pos m quoteright -80; 276 | pos n quoteright -80; 277 | pos o quoteright -80; 278 | pos r w 17; 279 | pos r t 50; 280 | pos r f 15; 281 | pos t odieresis -20; 282 | pos t otilde -20; 283 | pos t ocircumflex -20; 284 | pos t oacute -20; 285 | pos t ograve -20; 286 | pos t o -20; 287 | pos v f 13; 288 | pos w ellipsis -124; 289 | pos w quotedblbase -124; 290 | pos w quotesinglbase -124; 291 | pos w period -124; 292 | pos w comma -124; 293 | pos y f 13; 294 | pos braceleft Udieresis -20; 295 | pos braceleft Ucircumflex -20; 296 | pos braceleft Uacute -20; 297 | pos braceleft Ugrave -20; 298 | pos braceleft U -20; 299 | pos braceleft J -20; 300 | pos quoteleft w 11; 301 | pos quoteright odieresis -128; 302 | pos quoteright otilde -128; 303 | pos quoteright ocircumflex -128; 304 | pos quoteright oacute -128; 305 | pos quoteright ograve -128; 306 | pos quoteright w 11; 307 | pos quoteright s -112; 308 | pos quoteright o -128; 309 | pos quoteright l 32; 310 | pos quoteright k 32; 311 | pos quoteright h 32; 312 | pos quotedblleft w 11; 313 | pos quotedblright w 11; 314 | pos Eth AE -33; 315 | pos Agrave w -33; 316 | pos Agrave t -17; 317 | pos Agrave question -61; 318 | pos Aacute w -33; 319 | pos Aacute t -17; 320 | pos Aacute question -61; 321 | pos Acircumflex w -33; 322 | pos Acircumflex t -17; 323 | pos Acircumflex question -61; 324 | pos Atilde w -33; 325 | pos Atilde t -17; 326 | pos Atilde question -61; 327 | pos Adieresis w -33; 328 | pos Adieresis t -17; 329 | pos Adieresis question -61; 330 | pos Aring w -33; 331 | pos Aring t -17; 332 | pos Aring question -61; 333 | pos Ccedilla braceright -17; 334 | pos Ccedilla bracketright -12; 335 | pos Ccedilla parenright -26; 336 | pos Egrave w -22; 337 | pos Egrave f -18; 338 | pos Eacute w -22; 339 | pos Eacute f -18; 340 | pos Ecircumflex w -22; 341 | pos Ecircumflex f -18; 342 | pos Edieresis w -22; 343 | pos Edieresis f -18; 344 | pos Ograve AE -33; 345 | pos Oacute AE -33; 346 | pos Ocircumflex AE -33; 347 | pos Otilde AE -33; 348 | pos Odieresis AE -33; 349 | pos Yacute bullet -45; 350 | pos Yacute oslash -64; 351 | pos Yacute ae -63; 352 | pos Yacute AE -96; 353 | pos Yacute guillemotright -51; 354 | pos Yacute guillemotleft -82; 355 | pos Yacute braceright 19; 356 | pos Yacute t -22; 357 | pos Yacute r -40; 358 | pos Yacute f -22; 359 | pos Yacute bracketright 18; 360 | pos Yacute asterisk -49; 361 | pos Yacute parenright 20; 362 | pos Yacute ampersand -30; 363 | pos egrave quoteright -80; 364 | pos eacute quoteright -80; 365 | pos ecircumflex quoteright -80; 366 | pos edieresis quoteright -80; 367 | pos ntilde quoteright -80; 368 | pos ograve quoteright -80; 369 | pos oacute quoteright -80; 370 | pos ocircumflex quoteright -80; 371 | pos otilde quoteright -80; 372 | pos odieresis quoteright -80; 373 | pos yacute f 13; 374 | pos ydieresis f 13; 375 | pos minute w 11; 376 | pos second w 11; 377 | pos uni02BC w 11; 378 | 379 | subtable; 380 | 381 | @kcl_0 = [H I M N Igrave Iacute Icircumflex Idieresis Ntilde]; 382 | @kcl_1 = [D O Eth Ograve Oacute Ocircumflex Otilde Odieresis]; 383 | @kcl_2 = [A Agrave Aacute Acircumflex Atilde Adieresis Aring]; 384 | @kcl_3 = [o ograve oacute ocircumflex otilde odieresis]; 385 | @kcl_4 = [h m n ntilde]; 386 | @kcl_5 = [E Egrave Eacute Ecircumflex Edieresis]; 387 | @kcl_6 = [a agrave aacute acircumflex atilde adieresis aring]; 388 | @kcl_7 = [b p thorn]; 389 | @kcl_8 = [e egrave eacute ecircumflex edieresis]; 390 | @kcl_9 = [v y yacute ydieresis]; 391 | @kcl_10 = [J U Ugrave Uacute Ucircumflex Udieresis]; 392 | @kcl_11 = [K]; 393 | @kcl_12 = [Y Yacute]; 394 | @kcl_13 = [T]; 395 | @kcl_14 = [z]; 396 | @kcl_15 = [Z]; 397 | @kcl_16 = [X]; 398 | @kcl_17 = [C Ccedilla]; 399 | @kcl_18 = [x]; 400 | @kcl_19 = [r]; 401 | @kcl_20 = [P]; 402 | @kcl_21 = [c ccedilla]; 403 | @kcl_22 = [L]; 404 | @kcl_23 = [quotedbl quotesingle quoteleft quoteright quotedblleft quotedblright 405 | minute second uni02BC]; 406 | @kcl_24 = [W]; 407 | @kcl_25 = [B]; 408 | @kcl_26 = [V]; 409 | @kcl_27 = [comma period quotesinglbase quotedblbase ellipsis]; 410 | @kcr_1 = [c d e g q oe ccedilla egrave eacute ecircumflex edieresis]; 411 | @kcr_2 = [C G O Q Oslash OE Ccedilla Ograve Oacute Ocircumflex Otilde Odieresis]; 412 | @kcr_3 = [m n p ntilde]; 413 | @kcr_4 = [o ograve oacute ocircumflex otilde odieresis]; 414 | @kcr_5 = [u ugrave uacute ucircumflex udieresis]; 415 | @kcr_6 = [A Agrave Aacute Acircumflex Atilde Adieresis Aring]; 416 | @kcr_7 = [a agrave aacute acircumflex atilde adieresis aring]; 417 | @kcr_8 = [v y yacute ydieresis]; 418 | @kcr_9 = [U Ugrave Uacute Ucircumflex Udieresis]; 419 | @kcr_10 = [T]; 420 | @kcr_11 = [Y Yacute]; 421 | @kcr_12 = [s]; 422 | @kcr_13 = [z]; 423 | @kcr_14 = [S]; 424 | @kcr_15 = [X]; 425 | @kcr_16 = [Z]; 426 | @kcr_17 = [quotedbl quotesingle quoteleft quoteright quotedblleft quotedblright 427 | minute second uni02BC]; 428 | @kcr_18 = [x]; 429 | @kcr_19 = [W]; 430 | @kcr_20 = [comma period quotesinglbase quotedblbase ellipsis]; 431 | @kcr_21 = [V]; 432 | @kcr_22 = [hyphen endash emdash uni00AD]; 433 | @kcr_23 = [J]; 434 | pos @kcl_0 @kcr_6 18; 435 | pos @kcl_0 @kcr_10 -29; 436 | pos @kcl_0 @kcr_11 -28; 437 | pos @kcl_0 @kcr_15 17; 438 | pos @kcl_1 @kcr_6 -21; 439 | pos @kcl_1 @kcr_10 -27; 440 | pos @kcl_1 @kcr_11 -43; 441 | pos @kcl_1 @kcr_15 -22; 442 | pos @kcl_1 @kcr_16 -23; 443 | pos @kcl_1 @kcr_20 -102; 444 | pos @kcl_1 @kcr_21 -22; 445 | pos @kcl_2 @kcr_2 -11; 446 | pos @kcl_2 @kcr_4 -12; 447 | pos @kcl_2 @kcr_5 -11; 448 | pos @kcl_2 @kcr_8 -50; 449 | pos @kcl_2 @kcr_9 -17; 450 | pos @kcl_2 @kcr_10 -129; 451 | pos @kcl_2 @kcr_11 -94; 452 | pos @kcl_2 @kcr_13 12; 453 | pos @kcl_2 @kcr_17 -120; 454 | pos @kcl_2 @kcr_19 -69; 455 | pos @kcl_2 @kcr_21 -87; 456 | pos @kcl_3 @kcr_8 -15; 457 | pos @kcl_3 @kcr_13 -16; 458 | pos @kcl_3 @kcr_17 -136; 459 | pos @kcl_3 @kcr_18 -21; 460 | pos @kcl_4 @kcr_17 -104; 461 | pos @kcl_5 @kcr_1 -19; 462 | pos @kcl_5 @kcr_4 -19; 463 | pos @kcl_5 @kcr_5 -17; 464 | pos @kcl_5 @kcr_8 -26; 465 | pos @kcl_5 @kcr_10 20; 466 | pos @kcl_6 @kcr_8 -15; 467 | pos @kcl_6 @kcr_17 -67; 468 | pos @kcl_7 @kcr_8 -11; 469 | pos @kcl_7 @kcr_13 -15; 470 | pos @kcl_7 @kcr_17 -29; 471 | pos @kcl_7 @kcr_18 -15; 472 | pos @kcl_8 @kcr_8 -13; 473 | pos @kcl_8 @kcr_17 -14; 474 | pos @kcl_9 @kcr_1 -13; 475 | pos @kcl_9 @kcr_4 -15; 476 | pos @kcl_9 @kcr_7 -15; 477 | pos @kcl_9 @kcr_17 15; 478 | pos @kcl_9 @kcr_20 -107; 479 | pos @kcl_10 @kcr_6 -22; 480 | pos @kcl_11 @kcr_1 -26; 481 | pos @kcl_11 @kcr_2 -31; 482 | pos @kcl_11 @kcr_3 -23; 483 | pos @kcl_11 @kcr_4 -27; 484 | pos @kcl_11 @kcr_5 -23; 485 | pos @kcl_11 @kcr_8 -40; 486 | pos @kcl_11 @kcr_22 -64; 487 | pos @kcl_12 @kcr_1 -65; 488 | pos @kcl_12 @kcr_2 -29; 489 | pos @kcl_12 @kcr_3 -40; 490 | pos @kcl_12 @kcr_4 -65; 491 | pos @kcl_12 @kcr_5 -39; 492 | pos @kcl_12 @kcr_6 -94; 493 | pos @kcl_12 @kcr_7 -73; 494 | pos @kcl_12 @kcr_8 -20; 495 | pos @kcl_12 @kcr_9 -96; 496 | pos @kcl_12 @kcr_10 17; 497 | pos @kcl_12 @kcr_11 18; 498 | pos @kcl_12 @kcr_12 -58; 499 | pos @kcl_12 @kcr_13 -30; 500 | pos @kcl_12 @kcr_14 -16; 501 | pos @kcl_12 @kcr_15 13; 502 | pos @kcl_12 @kcr_18 -23; 503 | pos @kcl_12 @kcr_19 17; 504 | pos @kcl_12 @kcr_20 -211; 505 | pos @kcl_12 @kcr_21 18; 506 | pos @kcl_12 @kcr_22 -52; 507 | pos @kcl_12 @kcr_23 -96; 508 | pos @kcl_13 @kcr_1 -99; 509 | pos @kcl_13 @kcr_2 -28; 510 | pos @kcl_13 @kcr_3 -109; 511 | pos @kcl_13 @kcr_4 -99; 512 | pos @kcl_13 @kcr_5 -95; 513 | pos @kcl_13 @kcr_6 -79; 514 | pos @kcl_13 @kcr_7 -113; 515 | pos @kcl_13 @kcr_8 -72; 516 | pos @kcl_13 @kcr_10 16; 517 | pos @kcl_13 @kcr_11 16; 518 | pos @kcl_13 @kcr_12 -116; 519 | pos @kcl_13 @kcr_13 -60; 520 | pos @kcl_13 @kcr_14 -16; 521 | pos @kcl_13 @kcr_18 -77; 522 | pos @kcl_13 @kcr_19 15; 523 | pos @kcl_13 @kcr_20 -218; 524 | pos @kcl_13 @kcr_21 16; 525 | pos @kcl_13 @kcr_22 -232; 526 | pos @kcl_13 @kcr_23 -240; 527 | pos @kcl_14 @kcr_1 -16; 528 | pos @kcl_14 @kcr_4 -16; 529 | pos @kcl_15 @kcr_1 -21; 530 | pos @kcl_15 @kcr_2 -26; 531 | pos @kcl_15 @kcr_4 -21; 532 | pos @kcl_15 @kcr_5 -19; 533 | pos @kcl_15 @kcr_6 13; 534 | pos @kcl_15 @kcr_8 -27; 535 | pos @kcl_16 @kcr_1 -26; 536 | pos @kcl_16 @kcr_2 -25; 537 | pos @kcl_16 @kcr_4 -21; 538 | pos @kcl_16 @kcr_5 -21; 539 | pos @kcl_16 @kcr_8 -31; 540 | pos @kcl_16 @kcr_21 14; 541 | pos @kcl_16 @kcr_22 -46; 542 | pos @kcl_17 @kcr_10 -29; 543 | pos @kcl_18 @kcr_1 -20; 544 | pos @kcl_18 @kcr_4 -20; 545 | pos @kcl_19 @kcr_1 -19; 546 | pos @kcl_19 @kcr_4 -20; 547 | pos @kcl_19 @kcr_7 -40; 548 | pos @kcl_19 @kcr_8 18; 549 | pos @kcl_19 @kcr_17 16; 550 | pos @kcl_19 @kcr_20 -123; 551 | pos @kcl_20 @kcr_1 -13; 552 | pos @kcl_20 @kcr_4 -13; 553 | pos @kcl_20 @kcr_6 -138; 554 | pos @kcl_20 @kcr_7 -11; 555 | pos @kcl_20 @kcr_8 15; 556 | pos @kcl_20 @kcr_15 -31; 557 | pos @kcl_20 @kcr_16 -26; 558 | pos @kcl_20 @kcr_20 -324; 559 | pos @kcl_20 @kcr_23 -200; 560 | pos @kcl_21 @kcr_17 -11; 561 | pos @kcl_22 @kcr_2 -65; 562 | pos @kcl_22 @kcr_5 -44; 563 | pos @kcl_22 @kcr_6 19; 564 | pos @kcl_22 @kcr_8 -133; 565 | pos @kcl_22 @kcr_9 -54; 566 | pos @kcl_22 @kcr_10 -275; 567 | pos @kcl_22 @kcr_11 -239; 568 | pos @kcl_22 @kcr_17 -336; 569 | pos @kcl_22 @kcr_19 -143; 570 | pos @kcl_22 @kcr_21 -175; 571 | pos @kcl_23 @kcr_1 -59; 572 | pos @kcl_23 @kcr_3 -20; 573 | pos @kcl_23 @kcr_4 -61; 574 | pos @kcl_23 @kcr_6 -120; 575 | pos @kcl_23 @kcr_7 -50; 576 | pos @kcl_23 @kcr_12 -80; 577 | pos @kcl_23 @kcr_17 -107; 578 | pos @kcl_24 @kcr_1 -31; 579 | pos @kcl_24 @kcr_4 -31; 580 | pos @kcl_24 @kcr_5 -19; 581 | pos @kcl_24 @kcr_6 -43; 582 | pos @kcl_24 @kcr_7 -33; 583 | pos @kcl_24 @kcr_10 14; 584 | pos @kcl_24 @kcr_20 -123; 585 | pos @kcl_24 @kcr_22 -60; 586 | pos @kcl_25 @kcr_10 -27; 587 | pos @kcl_25 @kcr_11 -55; 588 | pos @kcl_25 @kcr_21 -24; 589 | pos @kcl_26 @kcr_1 -44; 590 | pos @kcl_26 @kcr_2 -13; 591 | pos @kcl_26 @kcr_4 -46; 592 | pos @kcl_26 @kcr_5 -28; 593 | pos @kcl_26 @kcr_6 -75; 594 | pos @kcl_26 @kcr_7 -46; 595 | pos @kcl_26 @kcr_8 -11; 596 | pos @kcl_26 @kcr_20 -225; 597 | pos @kcl_26 @kcr_22 -37; 598 | pos @kcl_27 @kcr_17 -170; 599 | 600 | subtable; 601 | 602 | pos [dotcomb] 200; 603 | pos [@o.lc] [dotcomb]' 60 [h k l exclam question quotesingle quotedbl quotedblright uni207F]; 604 | } kern; 605 | -------------------------------------------------------------------------------- /POJ ChhiuKi/regular/POJChhiuKi-Regular.fea: -------------------------------------------------------------------------------- 1 | languagesystem DFLT dflt; 2 | languagesystem latn dflt; 3 | 4 | # GSUB 5 | feature ccmp { 6 | sub i' [acutecomb gravecomb circumflexcomb 7 | caroncomb macroncomb vlinecomb 8 | brevecomb hungarumlautcomb ringcomb] by dotlessi; 9 | } ccmp; 10 | 11 | feature liga { 12 | sub f i by f_i.liga; 13 | sub f f i by f_f_i.liga; 14 | sub f l by f_l.liga; 15 | sub f f l by f_f_l.liga; 16 | } liga; 17 | 18 | @digit = [zero one two three four five six seven eight nine]; 19 | @numerator = [zero.numr uni00B9 uni00B2 uni00B3 four.numr 20 | five.numr six.numr seven.numr eight.numr nine.numr]; 21 | @denominator = [zero.dnom one.dnom two.dnom three.dnom four.dnom 22 | five.dnom six.dnom seven.dnom eight.dnom nine.dnom]; 23 | 24 | feature frac { 25 | sub slash by fraction; 26 | sub @digit by @numerator; 27 | sub fraction @numerator' by @denominator; 28 | } frac; 29 | 30 | # GPOS 31 | 32 | @A.uc = [A Agrave Aacute Acircumflex Aring Amacron Abreve Acaron]; 33 | @E.uc = [E Egrave Eacute Ecircumflex Emacron Ebreve Ecaron]; 34 | @I.uc = [I Igrave Iacute Icircumflex Imacron Ibreve Icaron]; 35 | @O.uc = [O Ograve Oacute Ocircumflex Omacron Obreve Ohungarumlaut Ocaron]; 36 | @U.uc = [U Ugrave Uacute Ucircumflex Umacron Ubreve Uring Uhungarumlaut Ucaron Udiaresisbelow]; 37 | 38 | @a.lc = [a agrave aacute acircumflex aring amacron abreve acaron]; 39 | @e.lc = [e egrave eacute ecircumflex emacron ebreve ecaron]; 40 | @i.lc = [i igrave iacute icircumflex imacron ibreve icaron dotlessi]; 41 | @o.lc = [o ograve oacute ocircumflex omacron obreve ohungarumlaut ocaron]; 42 | @u.lc = [u ugrave uacute ucircumflex umacron ubreve uring uhungarumlaut ucaron udiaresisbelow]; 43 | 44 | lookup MARK_TOP_RIGHT { 45 | markClass [dotcomb] @top_right; 46 | 47 | pos base [@A.uc] mark @top_right; 48 | pos base [@E.uc] mark @top_right; 49 | pos base [@I.uc] mark @top_right; 50 | pos base [@O.uc] mark @top_right; 51 | pos base [@U.uc] mark @top_right; 52 | 53 | pos base [@a.lc] mark @top_right; 54 | pos base [@e.lc] mark @top_right; 55 | pos base [@i.lc] mark @top_right; 56 | pos base [@o.lc] mark @top_right; 57 | pos base [@u.lc] mark @top_right; 58 | } MARK_TOP_RIGHT; 59 | 60 | lookup MARK_TOP { 61 | markClass [gravecomb] @top; 62 | markClass [acutecomb hungarumlautcomb] @top; 63 | markClass [circumflexcomb caroncomb brevecomb ringcomb vlinecomb] @top; 64 | markClass [macroncomb] @top; 65 | 66 | pos base [A K U Udiaresisbelow] mark @top; 67 | pos base [B D P R] mark @top; 68 | pos base [C] mark @top; 69 | pos base [E] mark @top; 70 | pos base [F] mark @top; 71 | pos base [G O Q] mark @top; 72 | pos base [H N] mark @top; 73 | pos base [I L] mark @top; 74 | pos base [J] mark @top; 75 | pos base [M] mark @top; 76 | pos base [S] mark @top; 77 | pos base [T] mark @top; 78 | pos base [V Y Z] mark @top; 79 | pos base [W] mark @top; 80 | pos base [X] mark @top; 81 | 82 | pos base [a c e g q] mark @top; 83 | pos base [b h k] mark @top; 84 | pos base [d] mark @top; 85 | pos base [f] mark @top; 86 | pos base [dotlessi] mark @top; 87 | pos base [j] mark @top; 88 | pos base [l] mark @top; 89 | pos base [m] mark @top; 90 | pos base [n u udiaresisbelow] mark @top; 91 | pos base [o p] mark @top; 92 | pos base [r] mark @top; 93 | pos base [s] mark @top; 94 | pos base [t] mark @top; 95 | pos base [v] mark @top; 96 | pos base [w] mark @top; 97 | pos base [x] mark @top; 98 | pos base [y] mark @top; 99 | pos base [z] mark @top; 100 | } MARK_TOP; 101 | 102 | lookup MARK_BOTTOM { 103 | markClass [diaresisbelowcomb] @bottom; 104 | 105 | pos base [@A.uc] mark @bottom; 106 | pos base [@E.uc] mark @bottom; 107 | pos base [@I.uc] mark @bottom; 108 | pos base [@O.uc] mark @bottom; 109 | pos base [@U.uc] mark @bottom; 110 | 111 | pos base [@a.lc] mark @bottom; 112 | pos base [@e.lc] mark @bottom; 113 | pos base [@i.lc] mark @bottom; 114 | pos base [@o.lc] mark @bottom; 115 | pos base [@u.lc] mark @bottom; 116 | } MARK_BOTTOM; 117 | 118 | feature mark { 119 | lookup MARK_TOP; 120 | lookup MARK_TOP_RIGHT; 121 | lookup MARK_BOTTOM; 122 | } mark; 123 | 124 | feature kern { 125 | pos space T -40; 126 | pos quotedbl w 11; 127 | pos quotesingle w 11; 128 | pos parenleft Yacute 22; 129 | pos parenleft Y 22; 130 | pos parenleft W 18; 131 | pos parenleft V 20; 132 | pos slash slash -224; 133 | pos A w -33; 134 | pos A t -17; 135 | pos A question -61; 136 | pos C braceright -17; 137 | pos C bracketright -12; 138 | pos C parenright -26; 139 | pos D AE -33; 140 | pos E w -22; 141 | pos E f -18; 142 | pos F ydieresis -24; 143 | pos F yacute -24; 144 | pos F udieresis -22; 145 | pos F ucircumflex -22; 146 | pos F uacute -22; 147 | pos F ugrave -22; 148 | pos F odieresis -21; 149 | pos F otilde -21; 150 | pos F ocircumflex -21; 151 | pos F oacute -21; 152 | pos F ograve -21; 153 | pos F edieresis -21; 154 | pos F ecircumflex -21; 155 | pos F eacute -21; 156 | pos F egrave -21; 157 | pos F ccedilla -21; 158 | pos F aring -34; 159 | pos F adieresis -34; 160 | pos F atilde -34; 161 | pos F acircumflex -34; 162 | pos F aacute -34; 163 | pos F agrave -34; 164 | pos F Aring -170; 165 | pos F Adieresis -170; 166 | pos F Atilde -170; 167 | pos F Acircumflex -170; 168 | pos F Aacute -170; 169 | pos F Agrave -170; 170 | pos F ellipsis -234; 171 | pos F quotedblbase -234; 172 | pos F quotesinglbase -234; 173 | pos F oe -21; 174 | pos F y -24; 175 | pos F v -24; 176 | pos F u -22; 177 | pos F r -26; 178 | pos F q -21; 179 | pos F o -21; 180 | pos F g -21; 181 | pos F e -21; 182 | pos F d -21; 183 | pos F c -21; 184 | pos F a -34; 185 | pos F T 20; 186 | pos F J -264; 187 | pos F A -170; 188 | pos F period -234; 189 | pos F comma -234; 190 | pos K w -63; 191 | pos L w -92; 192 | pos O AE -33; 193 | pos P AE -97; 194 | pos P t 14; 195 | pos Q Yacute -35; 196 | pos Q Y -35; 197 | pos Q W -20; 198 | pos Q V -28; 199 | pos Q T -43; 200 | pos R Yacute -48; 201 | pos R Y -48; 202 | pos R V -19; 203 | pos R T -80; 204 | pos T oslash -95; 205 | pos T ae -114; 206 | pos T AE -179; 207 | pos T guillemotright -216; 208 | pos T guillemotleft -328; 209 | pos T w -57; 210 | pos T r -75; 211 | pos T space -40; 212 | pos V braceright 19; 213 | pos V r -30; 214 | pos V bracketright 17; 215 | pos V parenright 20; 216 | pos W braceright 14; 217 | pos W r -21; 218 | pos W bracketright 12; 219 | pos W parenright 15; 220 | pos Y bullet -45; 221 | pos Y oslash -64; 222 | pos Y ae -63; 223 | pos Y AE -96; 224 | pos Y guillemotright -51; 225 | pos Y guillemotleft -82; 226 | pos Y braceright 19; 227 | pos Y t -22; 228 | pos Y r -40; 229 | pos Y f -22; 230 | pos Y bracketright 18; 231 | pos Y asterisk -49; 232 | pos Y parenright 20; 233 | pos Y ampersand -30; 234 | pos Z w -27; 235 | pos bracketleft Udieresis -18; 236 | pos bracketleft Ucircumflex -18; 237 | pos bracketleft Uacute -18; 238 | pos bracketleft Ugrave -18; 239 | pos bracketleft U -18; 240 | pos bracketleft J -18; 241 | pos e quoteright -80; 242 | pos f uni02BC 16; 243 | pos f second 16; 244 | pos f minute 16; 245 | pos f edieresis -24; 246 | pos f ecircumflex -24; 247 | pos f eacute -24; 248 | pos f egrave -24; 249 | pos f ccedilla -24; 250 | pos f quotedblright 16; 251 | pos f quotedblleft 16; 252 | pos f quoteright 16; 253 | pos f quoteleft 16; 254 | pos f oe -24; 255 | pos f braceright 19; 256 | pos f q -24; 257 | pos f g -24; 258 | pos f e -24; 259 | pos f d -24; 260 | pos f c -24; 261 | pos f bracketright 18; 262 | pos f parenright 20; 263 | pos f quotesingle 16; 264 | pos f quotedbl 16; 265 | pos h quoteright -80; 266 | pos k edieresis -20; 267 | pos k ecircumflex -20; 268 | pos k eacute -20; 269 | pos k egrave -20; 270 | pos k ccedilla -20; 271 | pos k oe -20; 272 | pos k q -20; 273 | pos k g -20; 274 | pos k e -20; 275 | pos k d -20; 276 | pos k c -20; 277 | pos m quoteright -80; 278 | pos n quoteright -80; 279 | pos o quoteright -80; 280 | pos r w 17; 281 | pos r t 50; 282 | pos r f 15; 283 | pos t odieresis -20; 284 | pos t otilde -20; 285 | pos t ocircumflex -20; 286 | pos t oacute -20; 287 | pos t ograve -20; 288 | pos t o -20; 289 | pos v f 13; 290 | pos w ellipsis -124; 291 | pos w quotedblbase -124; 292 | pos w quotesinglbase -124; 293 | pos w period -124; 294 | pos w comma -124; 295 | pos y f 13; 296 | pos braceleft Udieresis -20; 297 | pos braceleft Ucircumflex -20; 298 | pos braceleft Uacute -20; 299 | pos braceleft Ugrave -20; 300 | pos braceleft U -20; 301 | pos braceleft J -20; 302 | pos quoteleft w 11; 303 | pos quoteright odieresis -128; 304 | pos quoteright otilde -128; 305 | pos quoteright ocircumflex -128; 306 | pos quoteright oacute -128; 307 | pos quoteright ograve -128; 308 | pos quoteright w 11; 309 | pos quoteright s -112; 310 | pos quoteright o -128; 311 | pos quoteright l 32; 312 | pos quoteright k 32; 313 | pos quoteright h 32; 314 | pos quotedblleft w 11; 315 | pos quotedblright w 11; 316 | pos Eth AE -33; 317 | pos Agrave w -33; 318 | pos Agrave t -17; 319 | pos Agrave question -61; 320 | pos Aacute w -33; 321 | pos Aacute t -17; 322 | pos Aacute question -61; 323 | pos Acircumflex w -33; 324 | pos Acircumflex t -17; 325 | pos Acircumflex question -61; 326 | pos Atilde w -33; 327 | pos Atilde t -17; 328 | pos Atilde question -61; 329 | pos Adieresis w -33; 330 | pos Adieresis t -17; 331 | pos Adieresis question -61; 332 | pos Aring w -33; 333 | pos Aring t -17; 334 | pos Aring question -61; 335 | pos Ccedilla braceright -17; 336 | pos Ccedilla bracketright -12; 337 | pos Ccedilla parenright -26; 338 | pos Egrave w -22; 339 | pos Egrave f -18; 340 | pos Eacute w -22; 341 | pos Eacute f -18; 342 | pos Ecircumflex w -22; 343 | pos Ecircumflex f -18; 344 | pos Edieresis w -22; 345 | pos Edieresis f -18; 346 | pos Ograve AE -33; 347 | pos Oacute AE -33; 348 | pos Ocircumflex AE -33; 349 | pos Otilde AE -33; 350 | pos Odieresis AE -33; 351 | pos Yacute bullet -45; 352 | pos Yacute oslash -64; 353 | pos Yacute ae -63; 354 | pos Yacute AE -96; 355 | pos Yacute guillemotright -51; 356 | pos Yacute guillemotleft -82; 357 | pos Yacute braceright 19; 358 | pos Yacute t -22; 359 | pos Yacute r -40; 360 | pos Yacute f -22; 361 | pos Yacute bracketright 18; 362 | pos Yacute asterisk -49; 363 | pos Yacute parenright 20; 364 | pos Yacute ampersand -30; 365 | pos egrave quoteright -80; 366 | pos eacute quoteright -80; 367 | pos ecircumflex quoteright -80; 368 | pos edieresis quoteright -80; 369 | pos ntilde quoteright -80; 370 | pos ograve quoteright -80; 371 | pos oacute quoteright -80; 372 | pos ocircumflex quoteright -80; 373 | pos otilde quoteright -80; 374 | pos odieresis quoteright -80; 375 | pos yacute f 13; 376 | pos ydieresis f 13; 377 | pos minute w 11; 378 | pos second w 11; 379 | pos uni02BC w 11; 380 | 381 | subtable; 382 | 383 | @kcl_0 = [H I M N Igrave Iacute Icircumflex Idieresis Ntilde]; 384 | @kcl_1 = [D O Eth Ograve Oacute Ocircumflex Otilde Odieresis]; 385 | @kcl_2 = [A Agrave Aacute Acircumflex Atilde Adieresis Aring]; 386 | @kcl_3 = [o ograve oacute ocircumflex otilde odieresis]; 387 | @kcl_4 = [h m n ntilde]; 388 | @kcl_5 = [E Egrave Eacute Ecircumflex Edieresis]; 389 | @kcl_6 = [a agrave aacute acircumflex atilde adieresis aring]; 390 | @kcl_7 = [b p thorn]; 391 | @kcl_8 = [e egrave eacute ecircumflex edieresis]; 392 | @kcl_9 = [v y yacute ydieresis]; 393 | @kcl_10 = [J U Ugrave Uacute Ucircumflex Udieresis]; 394 | @kcl_11 = [K]; 395 | @kcl_12 = [Y Yacute]; 396 | @kcl_13 = [T]; 397 | @kcl_14 = [z]; 398 | @kcl_15 = [Z]; 399 | @kcl_16 = [X]; 400 | @kcl_17 = [C Ccedilla]; 401 | @kcl_18 = [x]; 402 | @kcl_19 = [r]; 403 | @kcl_20 = [P]; 404 | @kcl_21 = [c ccedilla]; 405 | @kcl_22 = [L]; 406 | @kcl_23 = [quotedbl quotesingle quoteleft quoteright quotedblleft quotedblright 407 | minute second uni02BC]; 408 | @kcl_24 = [W]; 409 | @kcl_25 = [B]; 410 | @kcl_26 = [V]; 411 | @kcl_27 = [comma period quotesinglbase quotedblbase ellipsis]; 412 | 413 | @kcr_1 = [c d e g q oe ccedilla egrave eacute ecircumflex edieresis]; 414 | @kcr_2 = [C G O Q Oslash OE Ccedilla Ograve Oacute Ocircumflex Otilde Odieresis]; 415 | @kcr_3 = [m n p ntilde]; 416 | @kcr_4 = [o ograve oacute ocircumflex otilde odieresis]; 417 | @kcr_5 = [u ugrave uacute ucircumflex udieresis]; 418 | @kcr_6 = [A Agrave Aacute Acircumflex Atilde Adieresis Aring]; 419 | @kcr_7 = [a agrave aacute acircumflex atilde adieresis aring]; 420 | @kcr_8 = [v y yacute ydieresis]; 421 | @kcr_9 = [U Ugrave Uacute Ucircumflex Udieresis]; 422 | @kcr_10 = [T]; 423 | @kcr_11 = [Y Yacute]; 424 | @kcr_12 = [s]; 425 | @kcr_13 = [z]; 426 | @kcr_14 = [S]; 427 | @kcr_15 = [X]; 428 | @kcr_16 = [Z]; 429 | @kcr_17 = [quotedbl quotesingle quoteleft quoteright quotedblleft quotedblright 430 | minute second uni02BC]; 431 | @kcr_18 = [x]; 432 | @kcr_19 = [W]; 433 | @kcr_20 = [comma period quotesinglbase quotedblbase ellipsis]; 434 | @kcr_21 = [V]; 435 | @kcr_22 = [hyphen endash emdash uni00AD]; 436 | @kcr_23 = [J]; 437 | 438 | pos @kcl_0 @kcr_6 18; 439 | pos @kcl_0 @kcr_10 -29; 440 | pos @kcl_0 @kcr_11 -28; 441 | pos @kcl_0 @kcr_15 17; 442 | pos @kcl_1 @kcr_6 -21; 443 | pos @kcl_1 @kcr_10 -27; 444 | pos @kcl_1 @kcr_11 -43; 445 | pos @kcl_1 @kcr_15 -22; 446 | pos @kcl_1 @kcr_16 -23; 447 | pos @kcl_1 @kcr_20 -102; 448 | pos @kcl_1 @kcr_21 -22; 449 | pos @kcl_2 @kcr_2 -11; 450 | pos @kcl_2 @kcr_4 -12; 451 | pos @kcl_2 @kcr_5 -11; 452 | pos @kcl_2 @kcr_8 -50; 453 | pos @kcl_2 @kcr_9 -17; 454 | pos @kcl_2 @kcr_10 -129; 455 | pos @kcl_2 @kcr_11 -94; 456 | pos @kcl_2 @kcr_13 12; 457 | pos @kcl_2 @kcr_17 -120; 458 | pos @kcl_2 @kcr_19 -69; 459 | pos @kcl_2 @kcr_21 -87; 460 | pos @kcl_3 @kcr_8 -15; 461 | pos @kcl_3 @kcr_13 -16; 462 | pos @kcl_3 @kcr_17 -136; 463 | pos @kcl_3 @kcr_18 -21; 464 | pos @kcl_4 @kcr_17 -104; 465 | pos @kcl_5 @kcr_1 -19; 466 | pos @kcl_5 @kcr_4 -19; 467 | pos @kcl_5 @kcr_5 -17; 468 | pos @kcl_5 @kcr_8 -26; 469 | pos @kcl_5 @kcr_10 20; 470 | pos @kcl_6 @kcr_8 -15; 471 | pos @kcl_6 @kcr_17 -67; 472 | pos @kcl_7 @kcr_8 -11; 473 | pos @kcl_7 @kcr_13 -15; 474 | pos @kcl_7 @kcr_17 -29; 475 | pos @kcl_7 @kcr_18 -15; 476 | pos @kcl_8 @kcr_8 -13; 477 | pos @kcl_8 @kcr_17 -14; 478 | pos @kcl_9 @kcr_1 -13; 479 | pos @kcl_9 @kcr_4 -15; 480 | pos @kcl_9 @kcr_7 -15; 481 | pos @kcl_9 @kcr_17 15; 482 | pos @kcl_9 @kcr_20 -107; 483 | pos @kcl_10 @kcr_6 -22; 484 | pos @kcl_11 @kcr_1 -26; 485 | pos @kcl_11 @kcr_2 -31; 486 | pos @kcl_11 @kcr_3 -23; 487 | pos @kcl_11 @kcr_4 -27; 488 | pos @kcl_11 @kcr_5 -23; 489 | pos @kcl_11 @kcr_8 -40; 490 | pos @kcl_11 @kcr_22 -64; 491 | pos @kcl_12 @kcr_1 -65; 492 | pos @kcl_12 @kcr_2 -29; 493 | pos @kcl_12 @kcr_3 -40; 494 | pos @kcl_12 @kcr_4 -65; 495 | pos @kcl_12 @kcr_5 -39; 496 | pos @kcl_12 @kcr_6 -94; 497 | pos @kcl_12 @kcr_7 -73; 498 | pos @kcl_12 @kcr_8 -20; 499 | pos @kcl_12 @kcr_9 -96; 500 | pos @kcl_12 @kcr_10 17; 501 | pos @kcl_12 @kcr_11 18; 502 | pos @kcl_12 @kcr_12 -58; 503 | pos @kcl_12 @kcr_13 -30; 504 | pos @kcl_12 @kcr_14 -16; 505 | pos @kcl_12 @kcr_15 13; 506 | pos @kcl_12 @kcr_18 -23; 507 | pos @kcl_12 @kcr_19 17; 508 | pos @kcl_12 @kcr_20 -211; 509 | pos @kcl_12 @kcr_21 18; 510 | pos @kcl_12 @kcr_22 -52; 511 | pos @kcl_12 @kcr_23 -96; 512 | pos @kcl_13 @kcr_1 -99; 513 | pos @kcl_13 @kcr_2 -28; 514 | pos @kcl_13 @kcr_3 -109; 515 | pos @kcl_13 @kcr_4 -99; 516 | pos @kcl_13 @kcr_5 -95; 517 | pos @kcl_13 @kcr_6 -79; 518 | pos @kcl_13 @kcr_7 -113; 519 | pos @kcl_13 @kcr_8 -72; 520 | pos @kcl_13 @kcr_10 16; 521 | pos @kcl_13 @kcr_11 16; 522 | pos @kcl_13 @kcr_12 -116; 523 | pos @kcl_13 @kcr_13 -60; 524 | pos @kcl_13 @kcr_14 -16; 525 | pos @kcl_13 @kcr_18 -77; 526 | pos @kcl_13 @kcr_19 15; 527 | pos @kcl_13 @kcr_20 -218; 528 | pos @kcl_13 @kcr_21 16; 529 | pos @kcl_13 @kcr_22 -232; 530 | pos @kcl_13 @kcr_23 -240; 531 | pos @kcl_14 @kcr_1 -16; 532 | pos @kcl_14 @kcr_4 -16; 533 | pos @kcl_15 @kcr_1 -21; 534 | pos @kcl_15 @kcr_2 -26; 535 | pos @kcl_15 @kcr_4 -21; 536 | pos @kcl_15 @kcr_5 -19; 537 | pos @kcl_15 @kcr_6 13; 538 | pos @kcl_15 @kcr_8 -27; 539 | pos @kcl_16 @kcr_1 -26; 540 | pos @kcl_16 @kcr_2 -25; 541 | pos @kcl_16 @kcr_4 -21; 542 | pos @kcl_16 @kcr_5 -21; 543 | pos @kcl_16 @kcr_8 -31; 544 | pos @kcl_16 @kcr_21 14; 545 | pos @kcl_16 @kcr_22 -46; 546 | pos @kcl_17 @kcr_10 -29; 547 | pos @kcl_18 @kcr_1 -20; 548 | pos @kcl_18 @kcr_4 -20; 549 | pos @kcl_19 @kcr_1 -19; 550 | pos @kcl_19 @kcr_4 -20; 551 | pos @kcl_19 @kcr_7 -40; 552 | pos @kcl_19 @kcr_8 18; 553 | pos @kcl_19 @kcr_17 16; 554 | pos @kcl_19 @kcr_20 -123; 555 | pos @kcl_20 @kcr_1 -13; 556 | pos @kcl_20 @kcr_4 -13; 557 | pos @kcl_20 @kcr_6 -138; 558 | pos @kcl_20 @kcr_7 -11; 559 | pos @kcl_20 @kcr_8 15; 560 | pos @kcl_20 @kcr_15 -31; 561 | pos @kcl_20 @kcr_16 -26; 562 | pos @kcl_20 @kcr_20 -324; 563 | pos @kcl_20 @kcr_23 -200; 564 | pos @kcl_21 @kcr_17 -11; 565 | pos @kcl_22 @kcr_2 -65; 566 | pos @kcl_22 @kcr_5 -44; 567 | pos @kcl_22 @kcr_6 19; 568 | pos @kcl_22 @kcr_8 -133; 569 | pos @kcl_22 @kcr_9 -54; 570 | pos @kcl_22 @kcr_10 -275; 571 | pos @kcl_22 @kcr_11 -239; 572 | pos @kcl_22 @kcr_17 -336; 573 | pos @kcl_22 @kcr_19 -143; 574 | pos @kcl_22 @kcr_21 -175; 575 | pos @kcl_23 @kcr_1 -59; 576 | pos @kcl_23 @kcr_3 -20; 577 | pos @kcl_23 @kcr_4 -61; 578 | pos @kcl_23 @kcr_6 -120; 579 | pos @kcl_23 @kcr_7 -50; 580 | pos @kcl_23 @kcr_12 -80; 581 | pos @kcl_23 @kcr_17 -107; 582 | pos @kcl_24 @kcr_1 -31; 583 | pos @kcl_24 @kcr_4 -31; 584 | pos @kcl_24 @kcr_5 -19; 585 | pos @kcl_24 @kcr_6 -43; 586 | pos @kcl_24 @kcr_7 -33; 587 | pos @kcl_24 @kcr_10 14; 588 | pos @kcl_24 @kcr_20 -123; 589 | pos @kcl_24 @kcr_22 -60; 590 | pos @kcl_25 @kcr_10 -27; 591 | pos @kcl_25 @kcr_11 -55; 592 | pos @kcl_25 @kcr_21 -24; 593 | pos @kcl_26 @kcr_1 -44; 594 | pos @kcl_26 @kcr_2 -13; 595 | pos @kcl_26 @kcr_4 -46; 596 | pos @kcl_26 @kcr_5 -28; 597 | pos @kcl_26 @kcr_6 -75; 598 | pos @kcl_26 @kcr_7 -46; 599 | pos @kcl_26 @kcr_8 -11; 600 | pos @kcl_26 @kcr_20 -225; 601 | pos @kcl_26 @kcr_22 -37; 602 | pos @kcl_27 @kcr_17 -170; 603 | 604 | subtable; 605 | 606 | pos [dotcomb] 200; 607 | pos [@o.lc] [dotcomb]' 60 [h k l exclam question quotesingle quotedbl quotedblright uni207F]; 608 | } kern; 609 | -------------------------------------------------------------------------------- /POJ HaiMi/FontMenuNameDB: -------------------------------------------------------------------------------- 1 | [pojHaiMi-Regular] 2 | f=POJ HaiMi 3 | s=Regular -------------------------------------------------------------------------------- /POJ HaiMi/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Fredrick R Brennan 2 | with Reserved Font Name "SOME TIME LATER". 3 | 4 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 5 | This license is copied below, and is also available with a FAQ at: 6 | http://scripts.sil.org/OFL 7 | 8 | 9 | ----------------------------------------------------------- 10 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 11 | ----------------------------------------------------------- 12 | 13 | PREAMBLE 14 | The goals of the Open Font License (OFL) are to stimulate worldwide 15 | development of collaborative font projects, to support the font creation 16 | efforts of academic and linguistic communities, and to provide a free and 17 | open framework in which fonts may be shared and improved in partnership 18 | with others. 19 | 20 | The OFL allows the licensed fonts to be used, studied, modified and 21 | redistributed freely as long as they are not sold by themselves. The 22 | fonts, including any derivative works, can be bundled, embedded, 23 | redistributed and/or sold with any software provided that any reserved 24 | names are not used by derivative works. The fonts and derivatives, 25 | however, cannot be released under any other type of license. The 26 | requirement for fonts to remain under this license does not apply 27 | to any document created using the fonts or their derivatives. 28 | 29 | DEFINITIONS 30 | "Font Software" refers to the set of files released by the Copyright 31 | Holder(s) under this license and clearly marked as such. This may 32 | include source files, build scripts and documentation. 33 | 34 | "Reserved Font Name" refers to any names specified as such after the 35 | copyright statement(s). 36 | 37 | "Original Version" refers to the collection of Font Software components as 38 | distributed by the Copyright Holder(s). 39 | 40 | "Modified Version" refers to any derivative made by adding to, deleting, 41 | or substituting -- in part or in whole -- any of the components of the 42 | Original Version, by changing formats or by porting the Font Software to a 43 | new environment. 44 | 45 | "Author" refers to any designer, engineer, programmer, technical 46 | writer or other person who contributed to the Font Software. 47 | 48 | PERMISSION & CONDITIONS 49 | Permission is hereby granted, free of charge, to any person obtaining 50 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 51 | redistribute, and sell modified and unmodified copies of the Font 52 | Software, subject to the following conditions: 53 | 54 | 1) Neither the Font Software nor any of its individual components, 55 | in Original or Modified Versions, may be sold by itself. 56 | 57 | 2) Original or Modified Versions of the Font Software may be bundled, 58 | redistributed and/or sold with any software, provided that each copy 59 | contains the above copyright notice and this license. These can be 60 | included either as stand-alone text files, human-readable headers or 61 | in the appropriate machine-readable metadata fields within text or 62 | binary files as long as those fields can be easily viewed by the user. 63 | 64 | 3) No Modified Version of the Font Software may use the Reserved Font 65 | Name(s) unless explicit written permission is granted by the corresponding 66 | Copyright Holder. This restriction only applies to the primary font name as 67 | presented to the users. 68 | 69 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 70 | Software shall not be used to promote, endorse or advertise any 71 | Modified Version, except to acknowledge the contribution(s) of the 72 | Copyright Holder(s) and the Author(s) or with their explicit written 73 | permission. 74 | 75 | 5) The Font Software, modified or unmodified, in part or in whole, 76 | must be distributed entirely under this license, and must not be 77 | distributed under any other license. The requirement for fonts to 78 | remain under this license does not apply to any document created 79 | using the Font Software. 80 | 81 | TERMINATION 82 | This license becomes null and void if any of the above conditions are 83 | not met. 84 | 85 | DISCLAIMER 86 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 87 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 88 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 89 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 90 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 91 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 92 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 93 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 94 | OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /POJVibes/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2018 The Pacifico Project Authors (https://github.com/googlefonts/Pacifico) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /POJVibes/POJVibes-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiongg/POJFonts/e8aa5c4f1272f62bf616695a124d9e895ed9f156/POJVibes/POJVibes-Regular.ttf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # POJ Fonts 2 | 3 | See individual font folders for license information. 4 | 5 | PRs welcome! 6 | 7 | ![Font preview](https://github.com/aiongg/POJFonts/blob/master/preview.png?raw=true) 8 | 9 | ## An-chong Soat-bêng 10 | 11 | Táng-ló͘ jī-thé: [POJFonts.zip](https://github.com/aiongg/POJFonts/releases/download/v1/POJFonts-v1.zip) 12 | 13 | Kā lí siūⁿ-beh an-chong ê jī-thé chhi̍h--loeh an-chong, koh-lâi tī lí teh sú-iōng ê nńg-thé lâi kéng jī-thé to̍h ē-sái. 14 | 15 | ## Creating a font 16 | 17 | ### Option A: Automated via `poj.py` 18 | 19 | #### Step 1. Setup fontforge and python 20 | 21 | Make sure Python >3 and the `fontforge` module are installed. On Windows, you can open a fontforge ready terminal using the `fontforge-console.bat` file found in your FontForge installation directory (e.g., `C:\Program Files (x86)\FontForgeBuilds\fontforge-console.bat`). You may also install via `pip install python-fontforge`. 22 | 23 | Run the `poj.py -h` command for help instructions: 24 | 25 | ``` 26 | python /path/to/poj.py -h 27 | ``` 28 | 29 | or 30 | 31 | ``` 32 | ffpython /path/to/poj.py -h 33 | ``` 34 | 35 | #### Step 2. Prepare the glyphs 36 | 37 | **(a) 2x Letter Glyphs** 38 | 39 | The following 2 letter glyphs are required: 40 | 41 | ``` 42 | uni0131 LATIN SMALL LETTER DOTLESS I (dotlessi, ı) 43 | uni207F SUPERSCRIPT LATIN SMALL LETTER N (ⁿ) 44 | ``` 45 | 46 | - `dotlessi` can be created by copying the `i` to the slot `uni0131` and deleting the dot 47 | - `ⁿ` can be created by copying `n` and using `Element > styles > Change Glyph` to resize as necessary, typically around 50-60% of the original size. 48 | 49 | **(b) 11x Diacritic Glyphs** 50 | 51 | The following 11 diacritic glyphs are required: 52 | 53 | ``` 54 | name diacritic 55 | uni0300 COMBINING GRAVE ACCENT tone 3 56 | uni0301 COMBINING ACUTE ACCENT tone 2 57 | uni0302 COMBINING CIRCUMFLEX ACCENT tone 5 58 | uni0304 COMBINING MACRON tone 7 59 | uni0306 COMBINING BREVE tone 9 60 | uni030A COMBINING RING ABOVE Pha̍k-fa-sṳ 61 | uni030B COMBINING DOUBLE ACUTE ACCENT tone 9 (MOE) 62 | uni030C COMBINING CARON tone 6 (Hái-kháu-khiuⁿ) 63 | uni030D COMBINING VERTICAL LINE ABOVE tone 8 64 | uni0324 COMBINING DIAERESIS BELOW Pha̍k-fa-sṳ, Hái-kháu-khiuⁿ 65 | uni0358 COMBINING DOT ABOVE RIGHT long o, sometimes e i u 66 | ``` 67 | 68 | **(c) Uppercase and lowercase diacritics** 69 | 70 | Separate upper case letter accents are *optional* but recommended. If you do not create them separately, the normal lower case accents will be re-used. To design separate upper case accents, add a new glyph slot with a Unicode value of -1, use the same name and append the suffix `.cap` to the name, e.g., `uni0300.cap, uni0301.cap, ...`. The upper case versions of the accents are typically shorter than the lowercase versions, to prevent the accented uppercase letters from being too tall. For small caps, append `.sc`. 71 | 72 | **(d) Dotted E I and U** 73 | 74 | Note that some versions of Pehoeji use dotted E, I, and U in addition to dotted O to represent various regional accents. These are included as `mark2base` lookups by default, and can be disabled with the `--skip-dot-anchors` option. If you want to include them (*recommended*), it is best to run the script once and then use the Lookup `mark2base` window for positioning the anchors on the base glyphs; `A` is included for completeness. To do this, navigate to: 75 | 76 | ``` 77 | Element Menu 78 | > Font Info 79 | > Lookups 80 | > GPOS 81 | > 'mark' Mark Positioning lookup POJ 82 | > 'mark' Mark Positioning lookup POJ above right 83 | > Edit Data 84 | > POJ_TOP_RIGHT 85 | > Anchor Control 86 | ``` 87 | 88 | Then, select any base glyph starting with an upper case `A`, and position the anchor as desired. Note the X and Y coordinates. Repeat for glyphs `E I O U a e i o u`, and then pass all coordinates to the `--vowel-dots` option of the script. For example: 89 | 90 | ``` 91 | # Ax Ay Ex Ey Ix Iy Ox Oy Ux Uy ax ay ex ey ix iy ox oy ux uy 92 | --vowel-dots 500 527 587 658 339 707 647 667 713 720 431 417 450 432 272 366 496 448 473 505 93 | ``` 94 | 95 | **(e) Auto-Kerning** 96 | 97 | Check some common letter pairs that may require kerning, such as `Tn`. If kerning is required to move the letters closer together. use the `--auto-kern` option to guess kerning, or `--kern-sep` to specify it manually. `--kern-sep` takes 2 numbers as arguments: 98 | 99 | 1. The desired separation in EMs (e.g., 100) 100 | 2. The closeness of the glyph classes (1 = exact match, 20 = loose match; try different values to see the results) 101 | 102 | The `--auto-kern` option uses default values equivalent to `--kern-sep 200 20`. 103 | 104 | #### Step 3. Cleaning up 105 | 106 | After running the script, check the accented characters in the range `uni00C0 - uni01F9` and unencoded glyphs at the end of the file. Position any accents as necessary, including the dots next to `O` and `o`. Set the advance width for dotted `O` and `o`, using the Metrics Window (e.g., `/o_dotaboveright/h`) to determine an appropriate value. You can set the width for multiple glyphs at once by selecting them in the font view window. 107 | 108 | #### Step 4. Naming 109 | 110 | Name your font according to restrictions provided in the license. For OFL fonts, you may not re-use the original name. Be sure to set both the `PS Names` and `TTF Names` in the `Font Information` dialog. Add any additional copyright and license information as required. 111 | 112 | #### Step 5. Export 113 | 114 | For best results, export your font as `OpenType (CFF)` type. In the `Options` dialog, select: `Hints, Flex Hints, PS Glyph Names, OpenType` and deselect everything else. 115 | 116 | #### Additional information 117 | 118 | c.f. [FontForge Python reference](https://fontforge.org/docs/scripting/python.html) 119 | 120 | ### Option B: Create a font manually in FontForge 121 | 122 | See the following video tutorial for manual instructions: 123 | 124 | [![Súi Pe̍h-ōe-jī, tāu-hū chài-hōe! POJ FontForge Tutorial - Add POJ support to any open source font 125 | ](https://img.youtube.com/vi/_KAJxOPsk7w/0.jpg)](https://www.youtube.com/watch?v=_KAJxOPsk7w) 126 | 127 | ## Required data 128 | 129 | Refer to the file [`charset.txt`](charset.txt) for all of the data necessary to make a POJ-compatible font. Any submitted fonts should include all of the glyphs, unicode codepoints, and OpenType positioning and ligature tables required for compatibility. Private Use Area codepoints E400-E435 are optional, but highly recommended to ensure your font will be supported in legacy applications that do not support OpenType. 130 | 131 | I. SINGLE CODE POINTS - LATIN LETTERS 132 | II. SINGLE CODEPOINTS - COMBINING CHARACTERS 133 | III. MARK-TO-BASE LOOKUPS 134 | IV. LIGATURES AND PRIVATE USE AREA (NON-STANDARD) 135 | V. 3-CODEPOINT LIGATURE LOOKUP TABLES 136 | 137 | The corresponding Excel sheet `charset.xlsx` displays all characters and 138 | Unicode points for easy reference when creating or modifying a font. 139 | 140 | In order to maintain consistency among fonts included in this repository, 141 | please make a copy of all ligature glyphs (glyphs which comprise two 142 | or more Unicode code points), and add Private Use Area codepoints 143 | (as listed in `charset.txt` Sec. IV) for use in legacy software that 144 | does not support the necessary OpenType features. 145 | -------------------------------------------------------------------------------- /charset.txt: -------------------------------------------------------------------------------- 1 | Please ensure your font contains all of the following codepoints, 2 | glyphs and OpenType lookup data for complete Pe̍h-ōe-jī support. 3 | 4 | I. SINGLE CODE POINTS - LATIN LETTERS [UNICODE] 5 | 6 | A U+0041 7 | B U+0042 8 | C U+0043 9 | D U+0044 10 | E U+0045 11 | F U+0046 12 | G U+0047 13 | H U+0048 14 | I U+0049 15 | J U+004A 16 | K U+004B 17 | L U+004C 18 | M U+004D 19 | N U+004E 20 | O U+004F 21 | P U+0050 22 | Q U+0051 23 | R U+0052 24 | S U+0053 25 | T U+0054 26 | U U+0055 27 | V U+0056 28 | W U+0057 29 | X U+0058 30 | Y U+0059 31 | Z U+005A 32 | a U+0061 33 | b U+0062 34 | c U+0063 35 | d U+0064 36 | e U+0065 37 | f U+0066 38 | g U+0067 39 | h U+0068 40 | i U+0069 41 | j U+006A 42 | k U+006B 43 | l U+006C 44 | m U+006D 45 | n U+006E 46 | o U+006F 47 | p U+0070 48 | q U+0071 49 | r U+0072 50 | s U+0073 51 | t U+0074 52 | u U+0075 53 | v U+0076 54 | w U+0077 55 | x U+0078 56 | y U+0079 57 | z U+007A 58 | À U+00C0 59 | Á U+00C1 60 | Â U+00C2 61 | È U+00C8 62 | É U+00C9 63 | Ê U+00CA 64 | Ì U+00CC 65 | Í U+00CD 66 | Î U+00CE 67 | Ò U+00D2 68 | Ó U+00D3 69 | Ô U+00D4 70 | Ù U+00D9 71 | Ú U+00DA 72 | Û U+00DB 73 | à U+00E0 74 | á U+00E1 75 | â U+00E2 76 | è U+00E8 77 | é U+00E9 78 | ê U+00EA 79 | ì U+00EC 80 | í U+00ED 81 | î U+00EE 82 | ò U+00F2 83 | ó U+00F3 84 | ô U+00F4 85 | ù U+00F9 86 | ú U+00FA 87 | û U+00FB 88 | Ā U+0100 89 | ā U+0101 90 | Ă U+0102 91 | ă U+0103 92 | Ē U+0112 93 | ē U+0113 94 | Ĕ U+0114 95 | ĕ U+0115 96 | Ě U+011A 97 | ě U+011B 98 | Ī U+012A 99 | ī U+012B 100 | Ĭ U+012C 101 | ĭ U+012D 102 | Ń U+0143 103 | ń U+0144 104 | Ň U+0147 105 | ň U+0148 106 | Ō U+014C 107 | ō U+014D 108 | Ŏ U+014E 109 | ŏ U+014F 110 | Ő U+0150 111 | ő U+0151 112 | Ū U+016A 113 | ū U+016B 114 | Ŭ U+016C 115 | ŭ U+016D 116 | Ű U+0170 117 | ű U+0171 118 | Ǎ U+01CD 119 | ǎ U+01CE 120 | Ǐ U+01CF 121 | ǐ U+01D0 122 | Ǒ U+01D1 123 | ǒ U+01D2 124 | Ǔ U+01D3 125 | ǔ U+01D4 126 | Ǹ U+01F8 127 | ǹ U+01F9 128 | Ḿ U+1E3E 129 | ḿ U+1E3F 130 | ⁿ U+207F 131 | 132 | II. SINGLE CODEPOINTS - COMBINING CHARACTERS 133 | 134 | COMBINING GRAVE U+0300 [t3] 135 | COMBINING ACUTE U+0301 [t2] 136 | COMBINING CIRCUMFLEX U+0302 [t5] 137 | COMBINING CARON U+030C [t6] 138 | COMBINING MACRON U+0304 [t7] 139 | COMBINING BREVE U+0306 [t9] 140 | COMBINING HUNGARUMLAUT U+030B [tk9] 141 | COMBINING VERTICAL LINE U+030D [t8] 142 | COMBINING DOT ABOVE RIGHT U+0358 [dot] 143 | 144 | III. MARK-TO-BASE LOOKUPS 145 | 146 | TONE BASE: A E I M N O U a e i m n o u 147 | TONE MARK: (See II) 148 | 149 | DOT BASE: O Ò Ó Ô Ǒ Ō Ŏ Ő o ò ó ô ǒ ō ŏ ő 150 | DOT ABOVE RIGHT: (See II) 151 | 152 | IV. LIGATURES AND PRIVATE USE AREA [NON-STANDARD] 153 | 154 | First create all of the ligature glyphs. Then duplicate them all and 155 | add the PUA codepoints to the duplicates. If using the standard 156 | naming conventions, label ligatures as: 157 | EXAMPLE: A8.liga A t8 158 | 159 | Note: for O͘ and o͘ please refer to Section V. 160 | 161 | A̍ U+E400 162 | A̋ U+E401 163 | E̍ U+E402 164 | E̋ U+E403 165 | I̍ U+E404 166 | I̋ U+E405 167 | M̀ U+E406 168 | M̂ U+E407 169 | M̌ 170 | M̄ U+E408 171 | M̍ U+E409 172 | M̆ U+E40a 173 | M̋ U+E40b 174 | N̂ U+E40c 175 | Ň 176 | N̄ U+E40d 177 | N̍ U+E40e 178 | N̆ U+E40f 179 | N̋ U+E410 180 | O̍ U+E411 181 | O͘ U+E412 182 | Ó͘ U+E413 183 | Ò͘ U+E414 184 | Ô͘ U+E415 185 | Ǒ͘ 186 | Ō͘ U+E416 187 | O̍͘ U+E417 188 | Ŏ͘ U+E418 189 | Ő͘ U+E419 190 | U̍ U+E41A 191 | a̍ U+E41B 192 | a̋ U+E41C 193 | e̍ U+E41D 194 | e̋ U+E41E 195 | i̍ U+E41F 196 | i̋ U+E420 197 | m̀ U+E421 198 | m̂ U+E422 199 | m̌ 200 | m̄ U+E423 201 | m̍ U+E424 202 | m̆ U+E425 203 | m̋ U+E426 204 | n̂ U+E427 205 | ň 206 | n̄ U+E428 207 | n̍ U+E429 208 | n̆ U+E42A 209 | n̋ U+E42B 210 | o̍ U+E42C 211 | o͘ U+E42D 212 | ó͘ U+E42E 213 | ò͘ U+E42F 214 | ô͘ U+E430 215 | ǒ͘ 216 | ō͘ U+E431 217 | o̍͘ U+E432 218 | ŏ͘ U+E433 219 | ő͘ U+E434 220 | u̍ U+E435 221 | 222 | V. 3-CODEPOINT LIGATURE LOOKUP TABLES 223 | 224 | Please include all 3 variants for O͘ and o͘ ligatures, to ensure that 225 | the correct ligature glyph is displayed regardless of 226 | character input order. Example: 227 | 228 | O + t2 [U+0301] + dot [U+0358] 229 | O + dot [U+0358] + t2 [U+0301] 230 | Ó [U+00D3] + dot [U+0358] 231 | 232 | If using the standard naming conventions, the complete list is as follows: 233 | 234 | Oo2.liga O t2 dot 235 | Oo2.liga O dot t2 236 | Oo2.liga Oacute dot 237 | 238 | Oo3.liga O t3 dot 239 | Oo3.liga O dot t3 240 | Oo3.liga Ograve dot 241 | 242 | Oo5.liga O t5 dot 243 | Oo5.liga O dot t5 244 | Oo5.liga Ocircumflex dot 245 | 246 | Oo6.liga O t6 dot 247 | Oo6.liga O dot t6 248 | Oo6.liga Ocaron dot 249 | 250 | Oo7.liga O t7 dot 251 | Oo7.liga O dot t7 252 | Oo7.liga Omacron dot 253 | 254 | Oo8.liga O t8 dot 255 | Oo8.liga O dot t8 256 | 257 | Oo9.liga O t9 dot 258 | Oo9.liga O dot t9 259 | Oo9.liga Obreve dot 260 | 261 | Ook9.liga O tk9 dot 262 | Ook9.liga O dot tk9 263 | Ook9.liga Ohungarumlaut dot 264 | 265 | *** Repeat above for lowercase o *** 266 | 267 | Test characters: 268 | 269 | Combining Oo - tone mark - dot: 270 | 271 | Ó͘ Ò͘ Ô͘ Ǒ͘ Ō͘ O̍͘ Ŏ͘ Ő͘ 272 | ó͘ ò͘ ô͘ ǒ͘ ō͘ o̍͘ ŏ͘ ő͘ 273 | 274 | Combining Oo - dot - tone mark: 275 | 276 | Ó͘ Ò͘ Ô͘ Ǒ͘ Ō͘ O̍͘ Ŏ͘ Ő͘ 277 | ó͘ ò͘ ô͘ ǒ͘ ō͘ o̍͘ ŏ͘ ő͘ 278 | -------------------------------------------------------------------------------- /charset.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiongg/POJFonts/e8aa5c4f1272f62bf616695a124d9e895ed9f156/charset.xlsx -------------------------------------------------------------------------------- /poj-Garamond/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2017 The EB Garamond Project Authors (https://github.com/octaviopardo/EBGaramond12) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /poj-Phiaute/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright © 2010 by Dharma Type. 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /preview.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiongg/POJFonts/e8aa5c4f1272f62bf616695a124d9e895ed9f156/preview.docx -------------------------------------------------------------------------------- /preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiongg/POJFonts/e8aa5c4f1272f62bf616695a124d9e895ed9f156/preview.png -------------------------------------------------------------------------------- /src/poj.py: -------------------------------------------------------------------------------- 1 | from argparse import ArgumentParser, RawTextHelpFormatter 2 | import math 3 | import re 4 | import unicodedata as ud 5 | import fontforge 6 | 7 | def log(msg): 8 | print(msg) 9 | 10 | # Lookups and other features created by this script 11 | LIGA_LOOKUP = "'liga' Standard Ligatures lookup POJ" 12 | LIGA_SUBTABLE = "'liga' Standard Ligatures lookup POJ subtable" 13 | CCMP_LOOKUP = "'ccmp' Glyph Composition POJ" 14 | CCMP_SUBTABLE = "'ccmp' Glyph Composition POJ subtable" 15 | MARK_LOOKUP = "'mark' Mark Positioning lookup POJ" 16 | MARK_TOP_CNTR = "'mark' Mark Positioning lookup POJ top" 17 | MARK_TOP_RIGHT = "'mark' Mark Positioning lookup POJ above right" 18 | ANCH_TOP = "POJ_TOP_CENTER" 19 | ANCH_TOP_RIGHT = "POJ_TOP_RIGHT" 20 | DTLS_LOOKUP = 'Single Substitution dotless ij' 21 | DTLS_SUBTABLE = 'Single Substitution dotless ij subtable' 22 | CCMP_DTLS = "'ccmp' Contextual substitution dotless ij" 23 | CCMP_DTLS_SUBT = "'ccmp' Contextual substitution dotless ij subtable" 24 | SMCP_LOOKUP = "'smcp' Lowercase to small capitals POJ" 25 | SMCP_SUBT = "'smcp' Lowercase to small capitals POJ subtable" 26 | C2SC_LOOKUP = "'c2sc' Capitals to small capitals POJ" 27 | C2SC_SUBT = "'c2sc' Capitals to small capitals POJ subtable" 28 | FEATURE_TAG = (("DFLT",("dflt")),("latn",("dflt")),) 29 | 30 | ABC_UC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 31 | ABC_LC = 'abcdefghijklmnopqrstuvwxyz' 32 | 33 | M_GRAV = 'grave' 34 | M_ACUT = 'acute' 35 | M_CIRC = 'circumflex' 36 | M_MACR = 'macron' 37 | M_BREV = 'breve' 38 | M_RING = 'ring' 39 | M_HNGU = 'hungarumlaut' 40 | M_CARN = 'caron' 41 | M_VLIN = 'vline' 42 | M_DIAB = 'diaresisbelow' 43 | M_DOTA = 'dotaboveright' 44 | 45 | DTLS_I = (0x0131, 'dotlessi') 46 | DTLS_J = (0x0237, 'dotlessj') 47 | 48 | ACCENTED_CHARS = [ 49 | (0x00C0, f'A{M_GRAV}'), (0x00C1, f'A{M_ACUT}'), (0x00C2, f'A{M_CIRC}'), (0x00C5, f'A{M_RING}'), 50 | (0x00C8, f'E{M_GRAV}'), (0x00C9, f'E{M_ACUT}'), (0x00CA, f'E{M_CIRC}'), 51 | (0x00CC, f'I{M_GRAV}'), (0x00CD, f'I{M_ACUT}'), (0x00CE, f'I{M_CIRC}'), 52 | (0x00D2, f'O{M_GRAV}'), (0x00D3, f'O{M_ACUT}'), (0x00D4, f'O{M_CIRC}'), 53 | (0x00D9, f'U{M_GRAV}'), (0x00DA, f'U{M_ACUT}'), (0x00DB, f'U{M_CIRC}'), 54 | (0x00E0, f'a{M_GRAV}'), (0x00E1, f'a{M_ACUT}'), (0x00E2, f'a{M_CIRC}'), (0x00E5, f'a{M_RING}'), 55 | (0x00E8, f'e{M_GRAV}'), (0x00E9, f'e{M_ACUT}'), (0x00EA, f'e{M_CIRC}'), 56 | (0x00EC, f'i{M_GRAV}'), (0x00ED, f'i{M_ACUT}'), (0x00EE, f'i{M_CIRC}'), 57 | (0x00F2, f'o{M_GRAV}'), (0x00F3, f'o{M_ACUT}'), (0x00F4, f'o{M_CIRC}'), 58 | (0x00F9, f'u{M_GRAV}'), (0x00FA, f'u{M_ACUT}'), (0x00FB, f'u{M_CIRC}'), 59 | (0x0100, f'A{M_MACR}'), (0x0101, f'a{M_MACR}'), (0x0102, f'A{M_BREV}'), (0x0103, f'a{M_BREV}'), 60 | (0x0112, f'E{M_MACR}'), (0x0113, f'e{M_MACR}'), (0x0114, f'E{M_BREV}'), (0x0115, f'e{M_BREV}'), 61 | (0x011A, f'E{M_CARN}'), (0x011B, f'e{M_CARN}'), 62 | (0x012A, f'I{M_MACR}'), (0x012B, f'i{M_MACR}'), (0x012C, f'I{M_BREV}'), (0x012D, f'i{M_BREV}'), 63 | (0x0143, f'N{M_ACUT}'), (0x0144, f'n{M_ACUT}'), (0x0147, f'N{M_CARN}'), (0x0148, f'n{M_CARN}'), 64 | (0x014C, f'O{M_MACR}'), (0x014D, f'o{M_MACR}'), (0x014E, f'O{M_BREV}'), (0x014F, f'o{M_BREV}'), 65 | (0x0150, f'O{M_HNGU}'), (0x0151, f'o{M_HNGU}'), 66 | (0x016A, f'U{M_MACR}'), (0x016B, f'u{M_MACR}'), (0x016C, f'U{M_BREV}'), (0x016D, f'u{M_BREV}'), 67 | (0x016E, f'U{M_RING}'), (0x016F, f'u{M_RING}'), (0x0170, f'U{M_HNGU}'), (0x0171, f'u{M_HNGU}'), 68 | (0x01CD, f'A{M_CARN}'), (0x01CE, f'a{M_CARN}'), 69 | (0x01CF, f'I{M_CARN}'), (0x01D0, f'i{M_CARN}'), 70 | (0x01D1, f'O{M_CARN}'), (0x01D2, f'o{M_CARN}'), 71 | (0x01D3, f'U{M_CARN}'), (0x01D4, f'u{M_CARN}'), 72 | (0x01F8, f'N{M_GRAV}'), (0x01F9, f'n{M_GRAV}'), 73 | (0x1E3E, f'M{M_ACUT}'), (0x1E3F, f'm{M_ACUT}'), 74 | (0x1E72, f'U{M_DIAB}'), (0x1E73, f'u{M_DIAB}') 75 | ] 76 | 77 | UNI_DIACRITICS = [(0x0300, M_GRAV), (0x0301, M_ACUT), (0x0302, M_CIRC), 78 | (0x0304, M_MACR), (0x0306, M_BREV), (0x030A, M_RING), 79 | (0x030B, M_HNGU), (0x030C, M_CARN), (0x030D, M_VLIN), 80 | (0x0324, M_DIAB), (0x0358, M_DOTA)] 81 | TONE_MARKS = [M_ACUT, M_GRAV, M_CIRC, M_CARN, M_MACR, M_VLIN, M_BREV, M_HNGU, M_RING] 82 | TONE_MARKS_COMB = list(map(lambda x: x + 'comb', TONE_MARKS)) 83 | 84 | 85 | def getAccentedCharName(base, mark): 86 | if mark is None or len(mark) == 0: 87 | return base 88 | 89 | uni = next(x[0] for x in UNI_DIACRITICS if x[1] == mark) 90 | char = ud.normalize('NFC', base + chr(uni)) 91 | if len(char) == 1: 92 | return base + mark 93 | else: 94 | return base + '_' + mark 95 | 96 | 97 | def getOULigaSet(char): 98 | """char: one of O, U, o, or u 99 | Build the ligature sets for: 100 | O + + dotaboveright 101 | U + + diaresisbelow 102 | """ 103 | if char in 'Oo': 104 | mod = M_DOTA 105 | elif char in 'Uu': 106 | mod = M_DIAB 107 | else: 108 | log('Only O and U get modifier ligatures') 109 | exit() 110 | 111 | ligaSet = [] 112 | modComb = mod + 'comb' 113 | modCase = f'{modComb}.cap' if char.isupper() else modComb 114 | if (char.lower() == 'o'): 115 | ligaSet.append((f'{char}_{mod}', char, modCase, [(char, modComb)])) 116 | for tone in TONE_MARKS: 117 | base = getAccentedCharName(char, tone) 118 | name = f'{base}_{mod}' 119 | tone = tone + 'comb' 120 | ligas = [(base, modComb), (char, tone, modComb), (char, modComb, tone)] 121 | if char.lower() == 'u': 122 | ligas.append((f'{char}{mod}')) 123 | ligaSet.append((name, base, modCase, ligas)) 124 | return ligaSet 125 | 126 | 127 | def getLigaSet(): 128 | """Build the ligature glyph data table, which is a list containing tuples: 129 | (name, base, mark, lookups) 130 | Where `lookups` is the list of entries to append to the ligature lookup 131 | for accessing this glyph 132 | 133 | This method assumes that all characters with diacritics that do not have 134 | a pre-defined unicode codepoint (e.g., latin + "vertical line above") 135 | must be added to the font 136 | """ 137 | ligaSet = [] 138 | for base in 'AEIMNOUaeimnou': 139 | for mark in TONE_MARKS: 140 | name = getAccentedCharName(base, mark) 141 | if '_' in name: 142 | mark += 'comb' 143 | markCase = f'{mark}.cap' if base[0].isupper() else mark 144 | liga = (name, base, markCase, [(base, mark)]) 145 | ligaSet.append(liga) 146 | if base in 'OUou': 147 | ligaSet += getOULigaSet(base) 148 | 149 | return ligaSet 150 | 151 | LIGA_SET = getLigaSet() 152 | 153 | def rm_modifiers(i): 154 | return lambda x: (M_DOTA not in x[i]) and (M_DIAB not in x[i]) 155 | DOT_ANCHOR_SET = list('AEIOUaeiou') \ 156 | + [x[1] for x in filter(rm_modifiers(1), ACCENTED_CHARS) if re.match('^[AEIOUaeiou]', x[1])] \ 157 | + [x[0] for x in filter(rm_modifiers(0), LIGA_SET) if re.match('^[AEIOUaeiou]', x[0])] 158 | 159 | 160 | def uni_name_from_int(codepoint): 161 | """Takes an int codepoint and returns a string of the standard 162 | glyph name format: 163 | uniXXXX 164 | Where XXXX is the 4-character hexadecimal value 165 | """ 166 | return 'uni' + hex(codepoint)[2:].zfill(4).upper() 167 | 168 | 169 | class POJFont: 170 | def __init__(self, fontfile): 171 | self.font = fontforge.open(fontfile) 172 | self.glyphList = [] 173 | 174 | 175 | def run(self, args): 176 | self.scSuffix = args.sc_suffix 177 | self.vowelDotXY = args.vowel_dots 178 | 179 | # mark_y = self.font.xHeight if args.ty is None else args.ty 180 | # uc_base_y = self.font.capHeight if args.uy is None else args.uy 181 | # lc_base_y = self.font.xHeight if args.ly is None else args.ly 182 | # o_dot_translate_xy = [None] * 4 if args.oxy is None else args.oxy 183 | 184 | # Test font for missing glyphs 185 | self.checkAlphas() 186 | self.checkDiacritics(checkSmcp=args.sc_suffix is not None) 187 | self.checkDotlessi() 188 | self.checkOrBuildAccentedUnicode() 189 | 190 | # Build POJ compatibility 191 | if args.skip_ligas is False: 192 | self.buildPOJligas() 193 | if args.skip_poj_anchors is False: 194 | self.addPOJanchors() 195 | if args.skip_dotlessi is False: 196 | self.addSubDotlessIJLookups() 197 | if args.skip_dot_anchors is False: 198 | self.addDotAnchors() 199 | if args.sc_suffix is not None: 200 | self.buildSmallCaps() 201 | 202 | if args.auto_kern is True: 203 | self.autoKern() 204 | elif args.kern_sep is not None: 205 | self.autoKern(args.kern_sep[0], args.kern_sep[1]) 206 | 207 | # Output new font 208 | self.font.save('output.sfd' if args.output is None else args.output) 209 | 210 | 211 | """ 212 | Utility methods 213 | """ 214 | def getGlyph(self, nameOrUni): 215 | if isinstance(nameOrUni, fontforge.glyph): 216 | return nameOrUni 217 | slot = self.font.findEncodingSlot(nameOrUni) 218 | if slot == -1: 219 | return None 220 | 221 | try: 222 | glyph = self.font[slot] 223 | return glyph 224 | except TypeError: 225 | return None 226 | 227 | 228 | def addLookup(self, lname, ltype, feature, after_lname=None): 229 | if ltype.startswith('gpos'): 230 | prop = 'gpos_lookups' 231 | elif ltype.startswith('gsub'): 232 | prop = 'gsub_lookups' 233 | 234 | if lname not in getattr(self.font, prop): 235 | if after_lname is None: 236 | self.font.addLookup(lname, ltype, None, ((feature, FEATURE_TAG),) ) 237 | else: 238 | self.font.addLookup(lname, ltype, None, ((feature, FEATURE_TAG),), after_lname) 239 | 240 | 241 | def addLookupSubtable(self, lookup, subtable): 242 | subtables = self.font.getLookupSubtables(lookup) 243 | if subtable not in subtables: 244 | self.font.addLookupSubtable(lookup, subtable) 245 | 246 | 247 | def copyRefTo(self, orig, dest): 248 | self.font.selection.select(orig) 249 | self.font.copyReference() 250 | self.font.selection.select(dest) 251 | self.font.paste() 252 | 253 | 254 | def italicOffsetX(self, y1, y2): 255 | """Do triangle math things.""" 256 | if not isinstance(self.font.italicangle, (int, float)) or y1 == y2: 257 | return 0 258 | ia_deg = math.fabs(self.font.italicangle) 259 | 260 | alpha = math.radians(ia_deg) 261 | beta = math.radians(90 - ia_deg) 262 | b = y2 - y1 263 | a = b * math.sin(alpha) / math.sin(beta) 264 | return round(a) 265 | 266 | 267 | def italicOffsetFromGlyphMid(self, baseGlyph, height): 268 | bounds = baseGlyph.boundingBox() 269 | y_mid = (bounds[1] + bounds[3]) / 2 270 | return self.italicOffsetX(y_mid, height) 271 | 272 | 273 | def italicOffsetBetweenGlyphs(self, lower, upper): 274 | lbounds = lower.boundingBox() 275 | ubounds = upper.boundingBox() 276 | y1 = (lbounds[1] + lbounds[3]) / 2 277 | y2 = (ubounds[1] + ubounds[3]) / 2 278 | return self.italicOffsetX(y1, y2) 279 | 280 | 281 | def centerX(self, nameOrGlyph): 282 | if isinstance(nameOrGlyph, str): 283 | glyph = self.getGlyph(nameOrGlyph) 284 | else: 285 | glyph = nameOrGlyph 286 | bounds = glyph.boundingBox() 287 | return round((bounds[2] + bounds[0]) / 2) 288 | 289 | 290 | """ 291 | Glyph completeness checks 292 | """ 293 | def registerGlyph(self, name): 294 | if name not in self.glyphList \ 295 | and name not in TONE_MARKS_COMB \ 296 | and name not in [M_DOTA + 'comb', M_DIAB + 'comb']: 297 | self.glyphList.append(name) 298 | 299 | 300 | def checkExistsAndSetName(self, codepoint, name): 301 | slot = self.font.findEncodingSlot(codepoint) 302 | if slot == -1: 303 | return False 304 | try: 305 | glyph = self.font[slot] 306 | except TypeError: 307 | return False 308 | 309 | if glyph.glyphname != name: 310 | glyph.glyphname = name 311 | 312 | self.registerGlyph(name) 313 | return glyph 314 | 315 | 316 | def hasDotlessi(self): 317 | return self.checkExistsAndSetName(DTLS_I[0], DTLS_I[1]) 318 | 319 | 320 | def hasDotlessj(self): 321 | return self.checkExistsAndSetName(DTLS_J[0], DTLS_J[1]) 322 | 323 | 324 | def checkDotlessi(self): 325 | error = False 326 | if not self.hasDotlessi(): 327 | error = True 328 | log('Missing glyph: dotlessi uni0131') 329 | if not self.hasDotlessj(): 330 | log('Missing (optional) glyph dotlessj uni0237, skipping...') 331 | 332 | 333 | def checkOrCreateAltAccent(self, uni, name, suf): 334 | altName = name + '.' + suf 335 | uniName = uni_name_from_int(uni) + '.' + suf 336 | 337 | glyph = self.getGlyph(altName) 338 | if glyph is None: 339 | glyph = self.getGlyph(uniName) 340 | 341 | if glyph is not None: 342 | glyph.glyphname = altName 343 | return glyph 344 | 345 | log('Building alternate accent glyph: ' + altName) 346 | glyph = self.font.createChar(-1, altName) 347 | glyph.addReference(name) 348 | return glyph 349 | 350 | 351 | def checkNsup(self): 352 | glyph = self.getGlyph(0x207f) 353 | if glyph is None: 354 | glyph = self.getGlyph('uni207F') 355 | if glyph is None: 356 | log('Missing superscript n (uni207F)') 357 | return False 358 | glyph.glyphname = 'uni207F' 359 | self.registerGlyph('uni207F') 360 | return True 361 | 362 | 363 | def checkAlphas(self): 364 | error = False 365 | for c in ABC_UC + ABC_LC: 366 | glyph = self.getGlyph(c) 367 | if glyph is None: 368 | error = True 369 | log('Missing glyph: ' + c) 370 | self.registerGlyph(c) 371 | 372 | supn = self.checkNsup() 373 | if supn is False: 374 | error = True 375 | 376 | if error is True: 377 | log('Please add missing glyphs. Exiting...') 378 | 379 | 380 | def checkDiacritics(self, checkCaps=True, checkSmcp=False): 381 | sufComb = lambda x: (x[0], x[1], x[1] + 'comb') 382 | markDiacritics = list(map(sufComb, UNI_DIACRITICS)) 383 | 384 | error = False 385 | for uni, mark, name in markDiacritics: 386 | found = self.checkExistsAndSetName(uni, name) 387 | if found is False: 388 | error = True 389 | log('Missing glyph: ' + hex(uni) + ' ' + name) 390 | if error: 391 | log('Please add missing glyphs. Exiting...') 392 | exit() 393 | 394 | if checkCaps: 395 | for uni, mark, name in markDiacritics: 396 | self.checkOrCreateAltAccent(uni, name, 'cap') 397 | 398 | if checkSmcp: 399 | for uni, mark, name in markDiacritics: 400 | self.checkOrCreateAltAccent(uni, name, self.scSuffix) 401 | 402 | 403 | def checkOrBuildAccentedUnicode(self): 404 | for uni, name in ACCENTED_CHARS: 405 | glyph = self.getGlyph(uni) 406 | if glyph is None: 407 | glyph = self.font.createChar(uni, name) 408 | glyph.build() 409 | log('Built accented glyph: ' + name) 410 | else: 411 | glyph.glyphname = name 412 | self.registerGlyph(name) 413 | 414 | 415 | def checkSmallCaps(self): 416 | self.alphaScGlyphs = {} 417 | suf = self.scSuffix 418 | errs = [] 419 | for lc in 'abcdefghijklmnopqrstuvwxyz': 420 | lcSc = self.font.findEncodingSlot(lc + '.' + suf) 421 | ucSc = self.font.findEncodingSlot(lc.upper() + '.' + suf) 422 | if lcSc > -1: 423 | self.alphaScGlyphs[lc] = self.font[lcSc] 424 | elif ucSc > -1: 425 | self.alphaScGlyphs[lc] = self.font[ucSc] 426 | else: 427 | errs.append(lc + '.' + suf) 428 | if len(errs) > 0: 429 | log('Missing small caps letter forms for: ' + ' '.join(errs)) 430 | log('Add missing small caps and re-run') 431 | exit() 432 | 433 | 434 | """ 435 | Ligature glyphs 436 | """ 437 | def createLigaLookup(self): 438 | self.addLookup(LIGA_LOOKUP, 'gsub_ligature', 'liga') 439 | self.addLookupSubtable(LIGA_LOOKUP, LIGA_SUBTABLE) 440 | self.addLookup(CCMP_LOOKUP, 'gsub_ligature', 'ccmp') 441 | self.addLookupSubtable(CCMP_LOOKUP, CCMP_SUBTABLE) 442 | 443 | 444 | def buildLigatureGlyph(self, liga, base, mark): 445 | ligaGlyph = self.font.createChar(-1, liga) 446 | self.copyRefTo(base, ligaGlyph) 447 | 448 | if M_DOTA in mark: 449 | x_offset = ligaGlyph.width 450 | y_offset = 0 451 | x_offset += self.italicOffsetBetweenGlyphs(ligaGlyph, self.getGlyph(mark)) 452 | ligaGlyph.addReference(mark, [1, 0, 0, 1, x_offset, y_offset]) 453 | elif M_DIAB in mark: 454 | x_offset = self.centerX(ligaGlyph) - self.centerX(mark) 455 | y_offset = 0 456 | x_offset -= self.italicOffsetBetweenGlyphs(self.getGlyph(mark), ligaGlyph) 457 | ligaGlyph.addReference(mark, [1, 0, 0, 1, x_offset, y_offset]) 458 | else: 459 | ligaGlyph.appendAccent(mark) 460 | 461 | self.registerGlyph(liga) 462 | return ligaGlyph 463 | 464 | 465 | def buildPOJligas(self): 466 | self.createLigaLookup() 467 | 468 | for name, base, mark, lookups in LIGA_SET: 469 | if base == 'i': 470 | base = DTLS_I[1] 471 | 472 | ligaGlyph = self.buildLigatureGlyph(name, base, mark) 473 | # Add the ligatures to the lookup tables 474 | for lookup in lookups: 475 | ligaGlyph.addPosSub(LIGA_SUBTABLE, lookup) 476 | ligaGlyph.addPosSub(CCMP_SUBTABLE, lookup) 477 | 478 | 479 | """ 480 | base2mark anchors 481 | """ 482 | def addMarkLookup(self): 483 | if MARK_LOOKUP not in self.font.gpos_lookups: 484 | self.addLookup(MARK_LOOKUP, 'gpos_mark2base', 'mark') 485 | 486 | 487 | def addPOJanchors(self): 488 | SPACING = 40 489 | # Add relevant lookup tables and subtables for mark2base 490 | self.addMarkLookup() 491 | self.addLookupSubtable(MARK_LOOKUP, MARK_TOP_CNTR) 492 | self.font.addAnchorClass(MARK_TOP_CNTR, ANCH_TOP) 493 | 494 | # Set mark anchors on tone diacritics 495 | for name in TONE_MARKS_COMB: 496 | glyph = self.getGlyph(name) 497 | xpos = self.centerX(glyph) 498 | ypos = glyph.boundingBox()[1] 499 | xpos += self.italicOffsetFromGlyphMid(glyph, ypos) 500 | glyph.addAnchorPoint(ANCH_TOP, 'mark', xpos, ypos) 501 | 502 | # Set base anchors on all alphabets 503 | for name in list(ABC_UC + ABC_LC) + ['dotlessi', 'dotlessj']: 504 | if name == 'dotlessj' and not self.hasDotlessj(): 505 | continue 506 | 507 | glyph = self.getGlyph(name) 508 | xpos = self.centerX(glyph) 509 | ypos = glyph.boundingBox()[3] + SPACING 510 | xpos += self.italicOffsetFromGlyphMid(glyph, ypos) 511 | glyph.addAnchorPoint(ANCH_TOP, 'base', xpos, ypos) 512 | 513 | 514 | def addDotMarkAnchor(self): 515 | """Set base anchor in center of 'combining dot above right' uni0358 516 | """ 517 | glyph = self.getGlyph(M_DOTA + 'comb') 518 | bounds = glyph.boundingBox() 519 | xpos = round((bounds[2] + bounds[0]) / 2) 520 | ypos = round((bounds[3] + bounds[1]) / 2) 521 | glyph.addAnchorPoint(ANCH_TOP_RIGHT, 'mark', xpos, ypos) 522 | 523 | 524 | def addDotBaseAnchors(self): 525 | vxy = self.vowelDotXY 526 | 527 | # Add anchors to all vowel classes 528 | for name in DOT_ANCHOR_SET: 529 | glyph = self.getGlyph(name) 530 | if vxy is not None: 531 | # User given coordinates 532 | x_i = 'AEIOUaeiou'.index(name[0]) * 2 533 | xpos = vxy[x_i] 534 | ypos = vxy[x_i + 1] 535 | else: 536 | # Automated coordinates from glyph bounds 537 | bounds = (self.getGlyph('dotlessi') if name[0] == 'i' else self.getGlyph(name[0])).boundingBox() 538 | xpos = bounds[2] 539 | ypos = bounds[3] 540 | glyph.addAnchorPoint(ANCH_TOP_RIGHT, 'base', xpos, ypos) 541 | 542 | 543 | def addDotAnchors(self): 544 | self.addMarkLookup() 545 | self.addLookupSubtable(MARK_LOOKUP, MARK_TOP_RIGHT) 546 | self.font.addAnchorClass(MARK_TOP_RIGHT, ANCH_TOP_RIGHT) 547 | self.addDotMarkAnchor() 548 | self.addDotBaseAnchors() 549 | 550 | 551 | def addSubDotlessIJLookups(self): 552 | """ 553 | Adds a Single Substitution lookup, substituting 554 | i for dotlessi 555 | j for dotlessj (if it exists in the font) 556 | 557 | Adds a Contextual Chaining Substitution lookup 558 | to replace i and j when followed by a combining tone 559 | """ 560 | self.addLookup(DTLS_LOOKUP, 'gsub_single', 'dtls') 561 | self.addLookupSubtable(DTLS_LOOKUP, DTLS_SUBTABLE) 562 | self.getGlyph('i').addPosSub(DTLS_SUBTABLE, 'dotlessi') 563 | 564 | if self.hasDotlessj(): 565 | self.getGlyph('j').addPosSub(DTLS_SUBTABLE, 'dotlessj') 566 | 567 | self.addLookup(CCMP_DTLS, 'gsub_contextchain', 'ccmp') 568 | marks = ' '.join(TONE_MARKS_COMB) 569 | dotlesschars = '[i j]' if self.hasDotlessj() else '[i]' 570 | self.font.addContextualSubtable( 571 | CCMP_DTLS, 572 | CCMP_DTLS_SUBT, 573 | 'coverage', 574 | dotlesschars + ' @<' + DTLS_LOOKUP + '> | [' + marks + ']' 575 | ) 576 | 577 | """ 578 | SmallCaps 579 | """ 580 | def addSmallCapsLookups(self): 581 | """ 582 | Will use an existing smallcaps lookup if found, otherwise creates a new one 583 | Creates both 'smcp' (lower > upper) and 'c2sc' (upper > lower) lookups 584 | """ 585 | smcpLookup = None 586 | c2scLookup = None 587 | for lookup in self.font.gsub_lookups: 588 | info = self.font.getLookupInfo(lookup) 589 | if info[0] == 'gsub_single': 590 | if len(info[2]) > 0: 591 | if info[2][0][0] == 'smcp' and smcpLookup is None: 592 | smcpLookup = lookup 593 | elif info[2][0][0] == 'c2sc' and c2scLookup is None: 594 | c2scLookup = lookup 595 | 596 | if smcpLookup is None: 597 | lastLookup = self.font.gsub_lookups[len(self.font.gsub_lookups) - 1] 598 | self.addLookup(SMCP_LOOKUP, 'gsub_single', 'smcp', lastLookup) 599 | smcpLookup = SMCP_LOOKUP 600 | 601 | if c2scLookup is None: 602 | self.addLookup(C2SC_LOOKUP, 'gsub_single', 'c2sc', smcpLookup) 603 | c2scLookup = C2SC_LOOKUP 604 | 605 | self.addLookupSubtable(smcpLookup, SMCP_SUBT) 606 | self.addLookupSubtable(c2scLookup, C2SC_SUBT) 607 | 608 | def getSmallCapsBuildList(self): 609 | """ 610 | Check which accented small caps characters already in font 611 | return a list of those which need to be built 612 | (does not include the o_dotaboveright and u_diaresisbelow characters, 613 | which are assumed to be not included in any normal font) 614 | """ 615 | suf = self.scSuffix 616 | bases = 'aeimnou' 617 | toBuild = [] 618 | for base in bases: 619 | for mark in TONE_MARKS: 620 | nameUC = getAccentedCharName(base.upper(), mark) 621 | nameLC = getAccentedCharName(base, mark) 622 | names = [] 623 | for n in [nameUC, nameLC]: 624 | names.append(n) 625 | if '_' not in n: 626 | names.append(uni_name_from_int(self.getGlyph(n).unicode)) 627 | found = False 628 | for name in names: 629 | glyph = self.getGlyph(f'{name}.{suf}') 630 | if glyph is not None: 631 | found = True 632 | break 633 | if found is False: 634 | nameSC = f'{nameLC}.{suf}' 635 | toBuild.append((nameLC, nameUC, nameSC, base, f'{mark}comb.{suf}')) 636 | 637 | for base, mod in [('o', M_DOTA), ('u', M_DIAB)]: 638 | for tone in [''] + TONE_MARKS: 639 | nameLC = getAccentedCharName(base, tone) 640 | nameUC = getAccentedCharName(base.upper(), tone) 641 | baseChar = f'{nameLC}.{suf}' 642 | if base == 'u' and tone == '': 643 | nameLC += mod 644 | nameUC += mod 645 | nameSC = f'{nameLC}{mod}.{suf}' 646 | else: 647 | nameLC += '_' + mod 648 | nameUC += '_' + mod 649 | nameSC = f'{nameLC}.{suf}' 650 | toBuild.append((nameLC, nameUC, nameSC, baseChar, f'{mod}comb.{suf}')) 651 | return toBuild 652 | 653 | 654 | def buildSmallCaps(self): 655 | """ 656 | Build all missing accented small caps. Prior to running, ensure that: 657 | - Small capitals for base letters A-Z exist: 658 | a.sc, b.sc, c.sc, ... (or A.sc, B.sc, C.sc, ...) 659 | - smcp accents exist: 660 | acutecomb.sc, gravecomb.sc, ... 661 | - Existing smallcaps characters will be skipped if their name matches one of: 662 | e.g., for smallcaps Á: aacute.sc, Aacute.sc, uni00C1.sc, uni00E1.sc 663 | These will not be added to the POJ smcp lookup tables 664 | """ 665 | self.checkSmallCaps() 666 | self.addSmallCapsLookups() 667 | 668 | alphaScGlyphs = self.alphaScGlyphs 669 | suf = self.scSuffix 670 | toBuild = self.getSmallCapsBuildList() 671 | 672 | for nameLC, nameUC, nameSC, base, mark in toBuild: 673 | if base in alphaScGlyphs: 674 | base = alphaScGlyphs[base].glyphname 675 | self.buildLigatureGlyph(nameSC, base, mark) 676 | self.getGlyph(nameLC).addPosSub(SMCP_SUBT, nameSC) 677 | self.getGlyph(nameSC).addPosSub(C2SC_SUBT, nameSC) 678 | 679 | 680 | """ 681 | Kerning 682 | """ 683 | def autoKern(self, separation=200, class_distance=20): 684 | """ 685 | Attemps to build UC>LC and LC>UC kerning 686 | """ 687 | KERN_LOOKUP = "'kern' POJ kerning" 688 | KERN_UL_SUBTABLE = f'{KERN_LOOKUP} POJ uppers-lowers' 689 | KERN_LU_SUBTABLE = f'{KERN_LOOKUP} POJ lowers-uppers' 690 | self.addLookup(KERN_LOOKUP, 'gpos_pair', 'kern') 691 | 692 | glyphList = filter(lambda x: f'.{self.scSuffix}' not in x, self.glyphList) 693 | uppers = [] 694 | lowers = [] 695 | for name in glyphList: 696 | if name[0].isupper(): 697 | uppers.append(self.getGlyph(name)) 698 | else: 699 | lowers.append(self.getGlyph(name)) 700 | 701 | self.font.addKerningClass(KERN_LOOKUP, KERN_UL_SUBTABLE, separation, class_distance, uppers, lowers, True) 702 | self.font.addKerningClass(KERN_LOOKUP, KERN_LU_SUBTABLE, separation, class_distance, lowers, uppers, True) 703 | 704 | 705 | if __name__ == '__main__': 706 | desc = ('********************\n' 707 | '*** build_poj.py ***\n' 708 | '********************\n\n' 709 | 'Add POJ support to a FontForge .sfd (SplineFontDatabase) font file.\n\n' 710 | ' - OpenType features included: ccmp, liga, and mark.\n' 711 | ' - Glyphs: all tone diacritics on aeimnou and o-dot\n' 712 | ' - Mark2Base:\n' 713 | ' - tone anchors for all letters A-Za-z\n' 714 | ' - dot above right anchors for vowels\n\n' 715 | 'It is recommended that you first run the script without' 716 | ' any positioning data and then adjust as needed.\n\n' 717 | 'For best results, ensure that your font has all needed diacritics:\n\n' 718 | ' name diacritic\n' 719 | ' uni0300 COMBINING GRAVE ACCENT\n' 720 | ' uni0301 COMBINING ACUTE ACCENT\n' 721 | ' uni0302 COMBINING CIRCUMFLEX ACCENT\n' 722 | ' uni0304 COMBINING MACRON\n' 723 | ' uni0306 COMBINING BREVE\n' 724 | ' uni030A COMBINING RING ABOVE\n' 725 | ' uni030B COMBINING DOUBLE ACUTE ACCENT (HUNGARIAN UMLAUT)\n' 726 | ' uni030C COMBINING CARON\n' 727 | ' uni030D COMBINING VERTICAL LINE ABOVE\n' 728 | ' uni0324 COMBINING DIAERESIS BELOW\n' 729 | ' uni0358 COMBINING DOT ABOVE RIGHT\n\n' 730 | ' - uppercase versions of above, named with `.cap` suffix\n' 731 | ' - all diacritics should be centered in a zero-width glyph\n' 732 | ' - dotlessi (U+0131) is required, dotlessj (U+0237) is optional\n\n' 733 | 'Example: ffpython build_poj.py --input MyFont.sfd \\\n' 734 | ' --output poj-JiKut.sfd \\\n' 735 | ' --vxy 500 527 587 658 339 707 647 667 713 720 \\ # uppercase AEIOU\n' 736 | ' 431 417 450 432 272 366 496 448 473 505 # lowercase aeiou') 737 | parser = ArgumentParser(description=desc, formatter_class=RawTextHelpFormatter) 738 | parser.add_argument('-i', '--input', type=str, required=True, help='The input .sfd font file') 739 | parser.add_argument('-o', '--output', type=str, default='output.sfd', help='The output .sfd font file (default: output.sfd)') 740 | parser.add_argument('--vowel-dots', type=int, nargs=20, metavar=('Ax', 'Ay', 'Ex', 'Ey', 'Ix', 'Iy', 'Ox', 'Oy', 'Ux', 'Uy', 'ax', 'ay', 'ex', 'ey', 'ix', 'iy', 'ox', 'oy', 'ux', 'uy'), help='XY-coords for dots next to vowels AEIOUaeiou [Ax Ay...ux uy]') 741 | parser.add_argument('--skip-dotlessi', action='store_true', help='Do not replace ij with dotlessij') 742 | parser.add_argument('--skip-poj-anchors', action='store_true', help='Do not add top center anchors') 743 | parser.add_argument('--skip-dot-anchors', action='store_true', help='Do not add dot anchors') 744 | parser.add_argument('--skip-ligas', action='store_true', help='Do not build POJ ligatures') 745 | parser.add_argument('--sc-suffix', type=str, metavar='SUFFIX', help='suffix for SmallCaps (e.g., sc)') 746 | group = parser.add_mutually_exclusive_group() 747 | group.add_argument('--auto-kern', action='store_true', help='Attempt to autokern POJ glyphs') 748 | group.add_argument('--kern-sep', type=int, nargs=2, metavar=('SEPARATION', 'SIMILARITY'), help='Specify the separation and class-similarity (1-20) parameters') 749 | 750 | args = parser.parse_args() 751 | 752 | f1 = POJFont(args.input) 753 | f1.run(args) 754 | --------------------------------------------------------------------------------