diff options
Diffstat (limited to 'bin/otb1get.js')
-rw-r--r-- | bin/otb1get.js | 706 |
1 files changed, 706 insertions, 0 deletions
diff --git a/bin/otb1get.js b/bin/otb1get.js new file mode 100644 index 000000000000..b4a058316cdb --- /dev/null +++ b/bin/otb1get.js @@ -0,0 +1,706 @@ +/* + Copyright (C) 2018-2020 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com> + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +'use strict'; + +const fnutil = require('./fnutil.js'); + +// -- xAvgCharWidth -- +const WEIGHT_FACTORS = [ + [ 'a', 64 ], + [ 'b', 14 ], + [ 'c', 27 ], + [ 'd', 35 ], + [ 'e', 100 ], + [ 'f', 20 ], + [ 'g', 14 ], + [ 'h', 42 ], + [ 'i', 63 ], + [ 'j', 3 ], + [ 'k', 6 ], + [ 'l', 35 ], + [ 'm', 20 ], + [ 'n', 56 ], + [ 'o', 56 ], + [ 'p', 17 ], + [ 'q', 4 ], + [ 'r', 49 ], + [ 's', 56 ], + [ 't', 71 ], + [ 'u', 31 ], + [ 'v', 10 ], + [ 'w', 18 ], + [ 'x', 3 ], + [ 'y', 18 ], + [ 'z', 2 ], + [ ' ', 166 ] +]; + +function xAvgCharWidth(font) { + let xAvgTotalWidth = 0; + + for (let factor of WEIGHT_FACTORS) { + const char = font.chars.find(_char => _char.code === factor[0].charCodeAt(0)); + + if (char == null) { + return 0; + } + xAvgTotalWidth += font.scaleWidth(char) * factor[1]; + } + + return fnutil.round(xAvgTotalWidth / 1000); +} + +// -- ulCharRanges -- +const CHAR_RANGES = [ + [ 0, 0x0000, 0x007F ], + [ 1, 0x0080, 0x00FF ], + [ 2, 0x0100, 0x017F ], + [ 3, 0x0180, 0x024F ], + [ 4, 0x0250, 0x02AF ], + [ 4, 0x1D00, 0x1D7F ], + [ 4, 0x1D80, 0x1DBF ], + [ 5, 0x02B0, 0x02FF ], + [ 5, 0xA700, 0xA71F ], + [ 6, 0x0300, 0x036F ], + [ 6, 0x1DC0, 0x1DFF ], + [ 7, 0x0370, 0x03FF ], + [ 8, 0x2C80, 0x2CFF ], + [ 9, 0x0400, 0x04FF ], + [ 9, 0x0500, 0x052F ], + [ 9, 0x2DE0, 0x2DFF ], + [ 9, 0xA640, 0xA69F ], + [ 10, 0x0530, 0x058F ], + [ 11, 0x0590, 0x05FF ], + [ 12, 0xA500, 0xA63F ], + [ 13, 0x0600, 0x06FF ], + [ 13, 0x0750, 0x077F ], + [ 14, 0x07C0, 0x07FF ], + [ 15, 0x0900, 0x097F ], + [ 16, 0x0980, 0x09FF ], + [ 17, 0x0A00, 0x0A7F ], + [ 18, 0x0A80, 0x0AFF ], + [ 19, 0x0B00, 0x0B7F ], + [ 20, 0x0B80, 0x0BFF ], + [ 21, 0x0C00, 0x0C7F ], + [ 22, 0x0C80, 0x0CFF ], + [ 23, 0x0D00, 0x0D7F ], + [ 24, 0x0E00, 0x0E7F ], + [ 25, 0x0E80, 0x0EFF ], + [ 26, 0x10A0, 0x10FF ], + [ 26, 0x2D00, 0x2D2F ], + [ 27, 0x1B00, 0x1B7F ], + [ 28, 0x1100, 0x11FF ], + [ 29, 0x1E00, 0x1EFF ], + [ 29, 0x2C60, 0x2C7F ], + [ 29, 0xA720, 0xA7FF ], + [ 30, 0x1F00, 0x1FFF ], + [ 31, 0x2000, 0x206F ], + [ 31, 0x2E00, 0x2E7F ], + [ 32, 0x2070, 0x209F ], + [ 33, 0x20A0, 0x20CF ], + [ 34, 0x20D0, 0x20FF ], + [ 35, 0x2100, 0x214F ], + [ 36, 0x2150, 0x218F ], + [ 37, 0x2190, 0x21FF ], + [ 37, 0x27F0, 0x27FF ], + [ 37, 0x2900, 0x297F ], + [ 37, 0x2B00, 0x2BFF ], + [ 38, 0x2200, 0x22FF ], + [ 38, 0x2A00, 0x2AFF ], + [ 38, 0x27C0, 0x27EF ], + [ 38, 0x2980, 0x29FF ], + [ 39, 0x2300, 0x23FF ], + [ 40, 0x2400, 0x243F ], + [ 41, 0x2440, 0x245F ], + [ 42, 0x2460, 0x24FF ], + [ 43, 0x2500, 0x257F ], + [ 44, 0x2580, 0x259F ], + [ 45, 0x25A0, 0x25FF ], + [ 46, 0x2600, 0x26FF ], + [ 47, 0x2700, 0x27BF ], + [ 48, 0x3000, 0x303F ], + [ 49, 0x3040, 0x309F ], + [ 50, 0x30A0, 0x30FF ], + [ 50, 0x31F0, 0x31FF ], + [ 51, 0x3100, 0x312F ], + [ 51, 0x31A0, 0x31BF ], + [ 52, 0x3130, 0x318F ], + [ 53, 0xA840, 0xA87F ], + [ 54, 0x3200, 0x32FF ], + [ 55, 0x3300, 0x33FF ], + [ 56, 0xAC00, 0xD7AF ], + [ 57, 0xD800, 0xDFFF ], + [ 58, 0x10900, 0x1091F ], + [ 59, 0x4E00, 0x9FFF ], + [ 59, 0x2E80, 0x2EFF ], + [ 59, 0x2F00, 0x2FDF ], + [ 59, 0x2FF0, 0x2FFF ], + [ 59, 0x3400, 0x4DBF ], + [ 59, 0x20000, 0x2A6DF ], + [ 59, 0x3190, 0x319F ], + [ 60, 0xE000, 0xF8FF ], + [ 61, 0x31C0, 0x31EF ], + [ 61, 0xF900, 0xFAFF ], + [ 61, 0x2F800, 0x2FA1F ], + [ 62, 0xFB00, 0xFB4F ], + [ 63, 0xFB50, 0xFDFF ], + [ 64, 0xFE20, 0xFE2F ], + [ 65, 0xFE10, 0xFE1F ], + [ 65, 0xFE30, 0xFE4F ], + [ 66, 0xFE50, 0xFE6F ], + [ 67, 0xFE70, 0xFEFF ], + [ 68, 0xFF00, 0xFFEF ], + [ 69, 0xFFF0, 0xFFFF ], + [ 70, 0x0F00, 0x0FFF ], + [ 71, 0x0700, 0x074F ], + [ 72, 0x0780, 0x07BF ], + [ 73, 0x0D80, 0x0DFF ], + [ 74, 0x1000, 0x109F ], + [ 75, 0x1200, 0x137F ], + [ 75, 0x1380, 0x139F ], + [ 75, 0x2D80, 0x2DDF ], + [ 76, 0x13A0, 0x13FF ], + [ 77, 0x1400, 0x167F ], + [ 78, 0x1680, 0x169F ], + [ 79, 0x16A0, 0x16FF ], + [ 80, 0x1780, 0x17FF ], + [ 80, 0x19E0, 0x19FF ], + [ 81, 0x1800, 0x18AF ], + [ 82, 0x2800, 0x28FF ], + [ 83, 0xA000, 0xA48F ], + [ 83, 0xA490, 0xA4CF ], + [ 84, 0x1700, 0x171F ], + [ 84, 0x1720, 0x173F ], + [ 84, 0x1740, 0x175F ], + [ 84, 0x1760, 0x177F ], + [ 85, 0x10300, 0x1032F ], + [ 86, 0x10330, 0x1034F ], + [ 87, 0x10400, 0x1044F ], + [ 88, 0x1D000, 0x1D0FF ], + [ 88, 0x1D100, 0x1D1FF ], + [ 88, 0x1D200, 0x1D24F ], + [ 89, 0x1D400, 0x1D7FF ], + [ 90, 0xF0000, 0xFFFFD ], + [ 90, 0x100000, 0x10FFFD ], + [ 91, 0xFE00, 0xFE0F ], + [ 91, 0xE0100, 0xE01EF ], + [ 92, 0xE0000, 0xE007F ], + [ 93, 0x1900, 0x194F ], + [ 94, 0x1950, 0x197F ], + [ 95, 0x1980, 0x19DF ], + [ 96, 0x1A00, 0x1A1F ], + [ 97, 0x2C00, 0x2C5F ], + [ 98, 0x2D30, 0x2D7F ], + [ 99, 0x4DC0, 0x4DFF ], + [ 100, 0xA800, 0xA82F ], + [ 101, 0x10000, 0x1007F ], + [ 101, 0x10080, 0x100FF ], + [ 101, 0x10100, 0x1013F ], + [ 102, 0x10140, 0x1018F ], + [ 103, 0x10380, 0x1039F ], + [ 104, 0x103A0, 0x103DF ], + [ 105, 0x10450, 0x1047F ], + [ 106, 0x10480, 0x104AF ], + [ 107, 0x10800, 0x1083F ], + [ 108, 0x10A00, 0x10A5F ], + [ 109, 0x1D300, 0x1D35F ], + [ 110, 0x12000, 0x123FF ], + [ 110, 0x12400, 0x1247F ], + [ 111, 0x1D360, 0x1D37F ], + [ 112, 0x1B80, 0x1BBF ], + [ 113, 0x1C00, 0x1C4F ], + [ 114, 0x1C50, 0x1C7F ], + [ 115, 0xA880, 0xA8DF ], + [ 116, 0xA900, 0xA92F ], + [ 117, 0xA930, 0xA95F ], + [ 118, 0xAA00, 0xAA5F ], + [ 119, 0x10190, 0x101CF ], + [ 120, 0x101D0, 0x101FF ], + [ 121, 0x102A0, 0x102DF ], + [ 121, 0x10280, 0x1029F ], + [ 121, 0x10920, 0x1093F ], + [ 122, 0x1F030, 0x1F09F ], + [ 122, 0x1F000, 0x1F02F ] +]; + +function ulCharRanges(font) { + let charRanges = [0, 0, 0, 0]; + + font.chars.forEach(char => { + const unicode = char.code; + const range = CHAR_RANGES.find(_range => unicode >= _range[1] && unicode <= _range[2]); + + if (range != null) { + charRanges[range[0] >> 5] |= 1 << (range[0] & 0x1F); + } + }); + + if (font.maxCode >= 0x10000) { + charRanges[57 >> 5] |= 1 << (57 & 0x1F); + } + return [ charRanges[0] >>> 0, charRanges[1] >>> 0, charRanges[2] >>> 0, charRanges[3] >>> 0 ]; +} + +// -- ulCodePages -- +function ulCodePages(font) { + const spaceIndex = font.chars.findIndex(char => char.code === 0x20); + const ascii = Number(spaceIndex !== -1 && font.chars[spaceIndex + 0x5E].code === 0x7E); + const findf = (unicode) => Number(font.chars.findIndex(char => char.code === unicode) !== -1); + const graph = findf(0x2524); + const radic = findf(0x221A); + let codePages = [0, 0]; + + // conditions from FontForge + font.chars.forEach(char => { + switch (char.code) { + case 0x00DE: + codePages[0] |= (ascii) << 0; // 1252 Latin1 + break; + case 0x255A: + codePages[1] |= (ascii) << 30; // 850 WE/Latin1 + codePages[1] |= (ascii) << 31; // 437 US + break; + case 0x013D: + codePages[0] |= (ascii) << 1; // 1250 Latin 2: Eastern Europe + codePages[1] |= (ascii & graph) << 26; // 852 Latin 2 + break; + case 0x0411: + codePages[0] |= 1 << 2; // 1251 Cyrillic + codePages[1] |= (findf(0x255C) & graph) << 17; // 866 MS-DOS Russian + codePages[1] |= (findf(0x0405) & graph) << 25; // 855 IBM Cyrillic + break; + case 0x0386: + codePages[0] |= 1 << 3; // 1253 Greek + codePages[1] |= (findf(0x00BD) & graph) << 16; // 869 IBM Greek + codePages[1] |= (graph & radic) << 28; // 737 Greek; former 437 G + break; + case 0x0130: + codePages[0] |= (ascii) << 4; // 1254 Turkish + codePages[1] |= (ascii & graph) << 24; // 857 IBM Turkish + break; + case 0x05D0: + codePages[0] |= 1 << 5; // 1255 Hebrew + codePages[1] |= (graph & radic) << 21; // 862 Hebrew + break; + case 0x0631: + codePages[0] |= 1 << 6; // 1256 Arabic + codePages[1] |= (radic) << 19; // 864 Arabic + codePages[1] |= (graph) << 29; // 708 Arabic; ASMO 708 + break; + case 0x0157: + codePages[0] |= (ascii) << 7; // 1257 Windows Baltic + codePages[1] |= (ascii & graph) << 27; // 775 MS-DOS Baltic + break; + case 0x20AB: + codePages[0] |= 1 << 8; // 1258 Vietnamese + break; + case 0x0E45: + codePages[0] |= 1 << 16; // 874 Thai + break; + case 0x30A8: + codePages[0] |= 1 << 17; // 932 JIS/Japan + break; + case 0x3105: + codePages[0] |= 1 << 18; // 936 Chinese: Simplified chars + break; + case 0x3131: + codePages[0] |= 1 << 19; // 949 Korean Wansung + break; + case 0x592E: + codePages[0] |= 1 << 20; // 950 Chinese: Traditional chars + break; + case 0xACF4: + codePages[0] |= 1 << 21; // 1361 Korean Johab + break; + case 0x2030: + codePages[0] |= (findf(0x2211) & ascii) << 29; // Macintosh Character Set (Roman) + break; + case 0x2665: + codePages[0] |= (ascii) << 30; // OEM Character Set + break; + case 0x00C5: + codePages[1] |= (ascii & graph & radic) << 18; // 865 MS-DOS Nordic + break; + case 0x00E9: + codePages[1] |= (ascii & graph & radic) << 20; // 863 MS-DOS Canadian French + break; + case 0x00F5: + codePages[1] |= (ascii & graph & radic) << 23; // 860 MS-DOS Portuguese + break; + case 0x00FE: + codePages[1] |= (ascii & graph) << 22; // 861 MS-DOS Icelandic + break; + default : + if (char.code >= 0xF000 && char.code <= 0xF0FF) { + codePages[0] |= 1 << 31; // Symbol Character Set + } + break; + } + }); + + return [ codePages[0] >>> 0, codePages[1] >>> 0 ]; +} + +// -- containsRTL -- +const RTL_RANGES = [ + [ 0x05BE, 0x05BE ], + [ 0x05C0, 0x05C0 ], + [ 0x05C3, 0x05C3 ], + [ 0x05C6, 0x05C6 ], + [ 0x05D0, 0x05EA ], + [ 0x05EF, 0x05F4 ], + [ 0x0608, 0x0608 ], + [ 0x060B, 0x060B ], + [ 0x060D, 0x060D ], + [ 0x061B, 0x061C ], + [ 0x061E, 0x064A ], + [ 0x066D, 0x066F ], + [ 0x0671, 0x06D5 ], + [ 0x06E5, 0x06E6 ], + [ 0x06EE, 0x06EF ], + [ 0x06FA, 0x070D ], + [ 0x070F, 0x0710 ], + [ 0x0712, 0x072F ], + [ 0x074D, 0x07A5 ], + [ 0x07B1, 0x07B1 ], + [ 0x07C0, 0x07EA ], + [ 0x07F4, 0x07F5 ], + [ 0x07FA, 0x07FA ], + [ 0x07FE, 0x0815 ], + [ 0x081A, 0x081A ], + [ 0x0824, 0x0824 ], + [ 0x0828, 0x0828 ], + [ 0x0830, 0x083E ], + [ 0x0840, 0x0858 ], + [ 0x085E, 0x085E ], + [ 0x0860, 0x086A ], + [ 0x08A0, 0x08B4 ], + [ 0x08B6, 0x08BD ], + [ 0x200F, 0x200F ], + [ 0x202B, 0x202B ], + [ 0x202E, 0x202E ], + [ 0xFB1D, 0xFB1D ], + [ 0xFB1F, 0xFB28 ], + [ 0xFB2A, 0xFB36 ], + [ 0xFB38, 0xFB3C ], + [ 0xFB3E, 0xFB3E ], + [ 0xFB40, 0xFB41 ], + [ 0xFB43, 0xFB44 ], + [ 0xFB46, 0xFBC1 ], + [ 0xFBD3, 0xFD3D ], + [ 0xFD50, 0xFD8F ], + [ 0xFD92, 0xFDC7 ], + [ 0xFDF0, 0xFDFC ], + [ 0xFE70, 0xFE74 ], + [ 0xFE76, 0xFEFC ], + [ 0x10800, 0x10FFF ], + [ 0x1E800, 0x1EFFF ], + [ -1, 0 ] +]; + +function containsRTL(font) { + let index = 0; + + for (let char of font.chars) { + while (char.code > RTL_RANGES[index][1]) { + if (RTL_RANGES[++index][0] === -1) { + break; + } + } + if (char.code >= RTL_RANGES[index][0]) { + return 0x200; + } + } + return 0x000; +} + +// -- postMacIndex -- +const POST_MAC_NAMES = [ + '.notdef', + '.null', + 'nonmarkingreturn', + 'space', + 'exclam', + 'quotedbl', + 'numbersign', + 'dollar', + 'percent', + 'ampersand', + 'quotesingle', + 'parenleft', + 'parenright', + 'asterisk', + 'plus', + 'comma', + 'hyphen', + 'period', + 'slash', + 'zero', + 'one', + 'two', + 'three', + 'four', + 'five', + 'six', + 'seven', + 'eight', + 'nine', + 'colon', + 'semicolon', + 'less', + 'equal', + 'greater', + 'question', + 'at', + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', + 'bracketleft', + 'backslash', + 'bracketright', + 'asciicircum', + 'underscore', + 'grave', + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', + 'braceleft', + 'bar', + 'braceright', + 'asciitilde', + 'Adieresis', + 'Aring', + 'Ccedilla', + 'Eacute', + 'Ntilde', + 'Odieresis', + 'Udieresis', + 'aacute', + 'agrave', + 'acircumflex', + 'adieresis', + 'atilde', + 'aring', + 'ccedilla', + 'eacute', + 'egrave', + 'ecircumflex', + 'edieresis', + 'iacute', + 'igrave', + 'icircumflex', + 'idieresis', + 'ntilde', + 'oacute', + 'ograve', + 'ocircumflex', + 'odieresis', + 'otilde', + 'uacute', + 'ugrave', + 'ucircumflex', + 'udieresis', + 'dagger', + 'degree', + 'cent', + 'sterling', + 'section', + 'bullet', + 'paragraph', + 'germandbls', + 'registered', + 'copyright', + 'trademark', + 'acute', + 'dieresis', + 'notequal', + 'AE', + 'Oslash', + 'infinity', + 'plusminus', + 'lessequal', + 'greaterequal', + 'yen', + 'mu', + 'partialdiff', + 'summation', + 'product', + 'pi', + 'integral', + 'ordfeminine', + 'ordmasculine', + 'Omega', + 'ae', + 'oslash', + 'questiondown', + 'exclamdown', + 'logicalnot', + 'radical', + 'florin', + 'approxequal', + 'Delta', + 'guillemotleft', + 'guillemotright', + 'ellipsis', + 'nonbreakingspace', + 'Agrave', + 'Atilde', + 'Otilde', + 'OE', + 'oe', + 'endash', + 'emdash', + 'quotedblleft', + 'quotedblright', + 'quoteleft', + 'quoteright', + 'divide', + 'lozenge', + 'ydieresis', + 'Ydieresis', + 'fraction', + 'currency', + 'guilsinglleft', + 'guilsinglright', + 'fi', + 'fl', + 'daggerdbl', + 'periodcentered', + 'quotesinglbase', + 'quotedblbase', + 'perthousand', + 'Acircumflex', + 'Ecircumflex', + 'Aacute', + 'Edieresis', + 'Egrave', + 'Iacute', + 'Icircumflex', + 'Idieresis', + 'Igrave', + 'Oacute', + 'Ocircumflex', + 'apple', + 'Ograve', + 'Uacute', + 'Ucircumflex', + 'Ugrave', + 'dotlessi', + 'circumflex', + 'tilde', + 'macron', + 'breve', + 'dotaccent', + 'ring', + 'cedilla', + 'hungarumlaut', + 'ogonek', + 'caron', + 'Lslash', + 'lslash', + 'Scaron', + 'scaron', + 'Zcaron', + 'zcaron', + 'brokenbar', + 'Eth', + 'eth', + 'Yacute', + 'yacute', + 'Thorn', + 'thorn', + 'minus', + 'multiply', + 'onesuperior', + 'twosuperior', + 'threesuperior', + 'onehalf', + 'onequarter', + 'threequarters', + 'franc', + 'Gbreve', + 'gbreve', + 'Idotaccent', + 'Scedilla', + 'scedilla', + 'Cacute', + 'cacute', + 'Ccaron', + 'ccaron', + 'dcroat' +]; + +function postMacNames() { + return POST_MAC_NAMES.slice(); +} + +// -- Export -- +module.exports = Object.freeze({ + xAvgCharWidth, + ulCharRanges, + ulCodePages, + containsRTL, + postMacNames +}); |