diff options
author | Karl Berry <karl@freefriends.org> | 2019-01-18 22:36:39 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-01-18 22:36:39 +0000 |
commit | 9fe86978e3c05cc8ffe90251487f8240f3765402 (patch) | |
tree | fcccbc6193e9111774462036fb5a130adad6319e /Master/texmf-dist/tex/luatex | |
parent | 1da73770bc3b5546208cb6511e69cbc7f86bc33e (diff) |
luaotfload (18jan19)
git-svn-id: svn://tug.org/texlive/trunk@49747 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/luatex')
40 files changed, 15699 insertions, 3650 deletions
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2018-10-28.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2018-12-19.lua index a5e692b6675..26611c5d3e2 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2018-10-28.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2018-12-19.lua @@ -1,6 +1,6 @@ --[[info----------------------------------------------------------------------- Luaotfload fontloader package - build 2018-10-28 00:14:04 + build 2018-12-25 16:48:51 ------------------------------------------------------------------------------- © 2018 PRAGMA ADE / ConTeXt Development Team @@ -21,6 +21,7 @@ · fontloader-data-con.lua · fontloader-basics-nod.lua + · fontloader-basics-chr.lua · fontloader-font-ini.lua · fontloader-fonts-mis.lua · fontloader-font-con.lua @@ -61,7 +62,7 @@ --info]]----------------------------------------------------------------------- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “data-con” d8982c834ed9acc6193eee23067b9d5d] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “data-con” 7ce546725b1550f655c78ac9d69419ca] --- if not modules then modules={} end modules ['data-con']={ version=1.100, @@ -173,10 +174,10 @@ function containers.cleanname(name) return (gsub(lower(name),"[^%w\128-\255]+","-")) end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “data-con”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “data-con”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “basics-nod” 78f56219685f3145b9393c2b688aad94] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “basics-nod” f899f78e915f8c428df33bd62d5520dc] --- if not modules then modules={} end modules ['luatex-fonts-nod']={ version=1.001, @@ -589,10 +590,3252 @@ do } end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “basics-nod”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “basics-nod”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ini” dd3ff5febc73c79b23e16d713a1282fb] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “basics-chr” a8b8316248b40cc9bc1be19050f7074f] --- + + +characters=characters or {} +characters.blockrange={} +characters.classifiers={ + [768]=5, + [769]=5, + [770]=5, + [771]=5, + [772]=5, + [773]=5, + [774]=5, + [775]=5, + [776]=5, + [777]=5, + [778]=5, + [779]=5, + [780]=5, + [781]=5, + [782]=5, + [783]=5, + [784]=5, + [785]=5, + [786]=5, + [787]=5, + [788]=5, + [789]=5, + [790]=5, + [791]=5, + [792]=5, + [793]=5, + [794]=5, + [795]=5, + [796]=5, + [797]=5, + [798]=5, + [799]=5, + [800]=5, + [801]=5, + [802]=5, + [803]=5, + [804]=5, + [805]=5, + [806]=5, + [807]=5, + [808]=5, + [809]=5, + [810]=5, + [811]=5, + [812]=5, + [813]=5, + [814]=5, + [815]=5, + [816]=5, + [817]=5, + [818]=5, + [819]=5, + [820]=5, + [821]=5, + [822]=5, + [823]=5, + [824]=5, + [825]=5, + [826]=5, + [827]=5, + [828]=5, + [829]=5, + [830]=5, + [831]=5, + [832]=5, + [833]=5, + [834]=5, + [835]=5, + [836]=5, + [837]=5, + [838]=5, + [839]=5, + [840]=5, + [841]=5, + [842]=5, + [843]=5, + [844]=5, + [845]=5, + [846]=5, + [847]=5, + [848]=5, + [849]=5, + [850]=5, + [851]=5, + [852]=5, + [853]=5, + [854]=5, + [855]=5, + [856]=5, + [857]=5, + [858]=5, + [859]=5, + [860]=5, + [861]=5, + [862]=5, + [863]=5, + [864]=5, + [865]=5, + [866]=5, + [867]=5, + [868]=5, + [869]=5, + [870]=5, + [871]=5, + [872]=5, + [873]=5, + [874]=5, + [875]=5, + [876]=5, + [877]=5, + [878]=5, + [879]=5, + [1155]=5, + [1156]=5, + [1157]=5, + [1158]=5, + [1159]=5, + [1425]=5, + [1426]=5, + [1427]=5, + [1428]=5, + [1429]=5, + [1430]=5, + [1431]=5, + [1432]=5, + [1433]=5, + [1434]=5, + [1435]=5, + [1436]=5, + [1437]=5, + [1438]=5, + [1439]=5, + [1440]=5, + [1441]=5, + [1442]=5, + [1443]=5, + [1444]=5, + [1445]=5, + [1446]=5, + [1447]=5, + [1448]=5, + [1449]=5, + [1450]=5, + [1451]=5, + [1452]=5, + [1453]=5, + [1454]=5, + [1455]=5, + [1456]=5, + [1457]=5, + [1458]=5, + [1459]=5, + [1460]=5, + [1461]=5, + [1462]=5, + [1463]=5, + [1464]=5, + [1465]=5, + [1466]=5, + [1467]=5, + [1468]=5, + [1469]=5, + [1471]=5, + [1473]=5, + [1474]=5, + [1476]=5, + [1477]=5, + [1479]=5, + [1536]=4, + [1537]=4, + [1538]=4, + [1539]=4, + [1540]=4, + [1541]=4, + [1542]=6, + [1543]=6, + [1544]=4, + [1545]=6, + [1546]=6, + [1547]=4, + [1548]=6, + [1549]=6, + [1550]=6, + [1551]=6, + [1552]=5, + [1553]=5, + [1554]=5, + [1555]=5, + [1556]=5, + [1557]=5, + [1558]=5, + [1559]=5, + [1560]=5, + [1561]=5, + [1562]=5, + [1563]=6, + [1564]=6, + [1566]=6, + [1567]=6, + [1568]=2, + [1569]=4, + [1570]=3, + [1571]=3, + [1572]=3, + [1573]=3, + [1574]=2, + [1575]=3, + [1576]=2, + [1577]=3, + [1578]=2, + [1579]=2, + [1580]=2, + [1581]=2, + [1582]=2, + [1583]=3, + [1584]=3, + [1585]=3, + [1586]=3, + [1587]=2, + [1588]=2, + [1589]=2, + [1590]=2, + [1591]=2, + [1592]=2, + [1593]=2, + [1594]=2, + [1595]=2, + [1596]=2, + [1597]=2, + [1598]=2, + [1599]=2, + [1600]=2, + [1601]=2, + [1602]=2, + [1603]=2, + [1604]=2, + [1605]=2, + [1606]=2, + [1607]=2, + [1608]=3, + [1609]=2, + [1610]=2, + [1611]=5, + [1612]=5, + [1613]=5, + [1614]=5, + [1615]=5, + [1616]=5, + [1617]=5, + [1618]=5, + [1619]=5, + [1620]=5, + [1621]=5, + [1622]=5, + [1623]=5, + [1624]=5, + [1625]=5, + [1626]=5, + [1627]=5, + [1628]=5, + [1629]=5, + [1630]=5, + [1631]=5, + [1632]=6, + [1633]=6, + [1634]=6, + [1635]=6, + [1636]=6, + [1637]=6, + [1638]=6, + [1639]=6, + [1640]=6, + [1641]=6, + [1642]=6, + [1643]=6, + [1644]=6, + [1645]=6, + [1646]=2, + [1647]=2, + [1648]=5, + [1649]=3, + [1650]=3, + [1651]=3, + [1652]=4, + [1653]=3, + [1654]=3, + [1655]=3, + [1656]=2, + [1657]=2, + [1658]=2, + [1659]=2, + [1660]=2, + [1661]=2, + [1662]=2, + [1663]=2, + [1664]=2, + [1665]=2, + [1666]=2, + [1667]=2, + [1668]=2, + [1669]=2, + [1670]=2, + [1671]=2, + [1672]=3, + [1673]=3, + [1674]=3, + [1675]=3, + [1676]=3, + [1677]=3, + [1678]=3, + [1679]=3, + [1680]=3, + [1681]=3, + [1682]=3, + [1683]=3, + [1684]=3, + [1685]=3, + [1686]=3, + [1687]=3, + [1688]=3, + [1689]=3, + [1690]=2, + [1691]=2, + [1692]=2, + [1693]=2, + [1694]=2, + [1695]=2, + [1696]=2, + [1697]=2, + [1698]=2, + [1699]=2, + [1700]=2, + [1701]=2, + [1702]=2, + [1703]=2, + [1704]=2, + [1705]=2, + [1706]=2, + [1707]=2, + [1708]=2, + [1709]=2, + [1710]=2, + [1711]=2, + [1712]=2, + [1713]=2, + [1714]=2, + [1715]=2, + [1716]=2, + [1717]=2, + [1718]=2, + [1719]=2, + [1720]=2, + [1721]=2, + [1722]=2, + [1723]=2, + [1724]=2, + [1725]=2, + [1726]=2, + [1727]=2, + [1728]=3, + [1729]=2, + [1730]=2, + [1731]=3, + [1732]=3, + [1733]=3, + [1734]=3, + [1735]=3, + [1736]=3, + [1737]=3, + [1738]=3, + [1739]=3, + [1740]=2, + [1741]=3, + [1742]=2, + [1743]=3, + [1744]=2, + [1745]=2, + [1746]=3, + [1747]=3, + [1748]=6, + [1749]=3, + [1750]=5, + [1751]=5, + [1752]=5, + [1753]=5, + [1754]=5, + [1755]=5, + [1756]=5, + [1757]=4, + [1758]=6, + [1759]=5, + [1760]=5, + [1761]=5, + [1762]=5, + [1763]=5, + [1764]=5, + [1765]=6, + [1766]=6, + [1767]=5, + [1768]=5, + [1769]=6, + [1770]=5, + [1771]=5, + [1772]=5, + [1773]=5, + [1774]=3, + [1775]=3, + [1776]=6, + [1777]=6, + [1778]=6, + [1779]=6, + [1780]=6, + [1781]=6, + [1782]=6, + [1783]=6, + [1784]=6, + [1785]=6, + [1786]=2, + [1787]=2, + [1788]=2, + [1789]=6, + [1790]=6, + [1791]=2, + [1792]=6, + [1793]=6, + [1794]=6, + [1795]=6, + [1796]=6, + [1797]=6, + [1798]=6, + [1799]=6, + [1800]=6, + [1801]=6, + [1802]=6, + [1803]=6, + [1804]=6, + [1805]=6, + [1807]=6, + [1808]=3, + [1809]=5, + [1810]=2, + [1811]=2, + [1812]=2, + [1813]=3, + [1814]=3, + [1815]=3, + [1816]=3, + [1817]=3, + [1818]=2, + [1819]=2, + [1820]=2, + [1821]=2, + [1822]=3, + [1823]=2, + [1824]=2, + [1825]=2, + [1826]=2, + [1827]=2, + [1828]=2, + [1829]=2, + [1830]=2, + [1831]=2, + [1832]=3, + [1833]=2, + [1834]=3, + [1835]=2, + [1836]=3, + [1837]=2, + [1838]=2, + [1839]=3, + [1840]=5, + [1841]=5, + [1842]=5, + [1843]=5, + [1844]=5, + [1845]=5, + [1846]=5, + [1847]=5, + [1848]=5, + [1849]=5, + [1850]=5, + [1851]=5, + [1852]=5, + [1853]=5, + [1854]=5, + [1855]=5, + [1856]=5, + [1857]=5, + [1858]=5, + [1859]=5, + [1860]=5, + [1861]=5, + [1862]=5, + [1863]=5, + [1864]=5, + [1865]=5, + [1866]=5, + [1869]=3, + [1870]=2, + [1871]=2, + [1872]=2, + [1873]=2, + [1874]=2, + [1875]=2, + [1876]=2, + [1877]=2, + [1878]=2, + [1879]=2, + [1880]=2, + [1881]=3, + [1882]=3, + [1883]=3, + [1884]=2, + [1885]=2, + [1886]=2, + [1887]=2, + [1888]=2, + [1889]=2, + [1890]=2, + [1891]=2, + [1892]=2, + [1893]=2, + [1894]=2, + [1895]=2, + [1896]=2, + [1897]=2, + [1898]=2, + [1899]=3, + [1900]=3, + [1901]=2, + [1902]=2, + [1903]=2, + [1904]=2, + [1905]=3, + [1906]=2, + [1907]=3, + [1908]=3, + [1909]=2, + [1910]=2, + [1911]=2, + [1912]=3, + [1913]=3, + [1914]=2, + [1915]=2, + [1916]=2, + [1917]=2, + [1918]=2, + [1919]=2, + [1958]=5, + [1959]=5, + [1960]=5, + [1961]=5, + [1962]=5, + [1963]=5, + [1964]=5, + [1965]=5, + [1966]=5, + [1967]=5, + [1968]=5, + [1984]=6, + [1985]=6, + [1986]=6, + [1987]=6, + [1988]=6, + [1989]=6, + [1990]=6, + [1991]=6, + [1992]=6, + [1993]=6, + [1994]=2, + [1995]=2, + [1996]=2, + [1997]=2, + [1998]=2, + [1999]=2, + [2000]=2, + [2001]=2, + [2002]=2, + [2003]=2, + [2004]=2, + [2005]=2, + [2006]=2, + [2007]=2, + [2008]=2, + [2009]=2, + [2010]=2, + [2011]=2, + [2012]=2, + [2013]=2, + [2014]=2, + [2015]=2, + [2016]=2, + [2017]=2, + [2018]=2, + [2019]=2, + [2020]=2, + [2021]=2, + [2022]=2, + [2023]=2, + [2024]=2, + [2025]=2, + [2026]=2, + [2027]=5, + [2028]=5, + [2029]=5, + [2030]=5, + [2031]=5, + [2032]=5, + [2033]=5, + [2034]=5, + [2035]=5, + [2036]=6, + [2037]=6, + [2038]=6, + [2039]=6, + [2040]=6, + [2041]=6, + [2042]=2, + [2070]=5, + [2071]=5, + [2072]=5, + [2073]=5, + [2075]=5, + [2076]=5, + [2077]=5, + [2078]=5, + [2079]=5, + [2080]=5, + [2081]=5, + [2082]=5, + [2083]=5, + [2085]=5, + [2086]=5, + [2087]=5, + [2089]=5, + [2090]=5, + [2091]=5, + [2092]=5, + [2093]=5, + [2112]=3, + [2113]=2, + [2114]=2, + [2115]=2, + [2116]=2, + [2117]=2, + [2118]=3, + [2119]=3, + [2120]=2, + [2121]=3, + [2122]=2, + [2123]=2, + [2124]=2, + [2125]=2, + [2126]=2, + [2127]=2, + [2128]=2, + [2129]=2, + [2130]=2, + [2131]=2, + [2132]=3, + [2133]=2, + [2134]=4, + [2135]=4, + [2136]=4, + [2137]=5, + [2138]=5, + [2139]=5, + [2144]=2, + [2145]=4, + [2146]=2, + [2147]=2, + [2148]=2, + [2149]=2, + [2150]=4, + [2151]=3, + [2152]=2, + [2153]=3, + [2154]=3, + [2208]=2, + [2209]=2, + [2210]=2, + [2211]=2, + [2212]=2, + [2213]=2, + [2214]=2, + [2215]=2, + [2216]=2, + [2217]=2, + [2218]=3, + [2219]=3, + [2220]=3, + [2221]=4, + [2222]=3, + [2223]=2, + [2224]=2, + [2225]=3, + [2226]=3, + [2227]=2, + [2228]=2, + [2230]=2, + [2231]=2, + [2232]=2, + [2233]=3, + [2234]=2, + [2235]=2, + [2236]=2, + [2237]=2, + [2260]=5, + [2261]=5, + [2262]=5, + [2263]=5, + [2264]=5, + [2265]=5, + [2266]=5, + [2267]=5, + [2268]=5, + [2269]=5, + [2270]=5, + [2271]=5, + [2272]=5, + [2273]=5, + [2274]=4, + [2275]=5, + [2276]=5, + [2277]=5, + [2278]=5, + [2279]=5, + [2280]=5, + [2281]=5, + [2282]=5, + [2283]=5, + [2284]=5, + [2285]=5, + [2286]=5, + [2287]=5, + [2288]=5, + [2289]=5, + [2290]=5, + [2291]=5, + [2292]=5, + [2293]=5, + [2294]=5, + [2295]=5, + [2296]=5, + [2297]=5, + [2298]=5, + [2299]=5, + [2300]=5, + [2301]=5, + [2302]=5, + [2303]=5, + [2304]=5, + [2305]=5, + [2306]=5, + [2362]=5, + [2364]=5, + [2369]=5, + [2370]=5, + [2371]=5, + [2372]=5, + [2373]=5, + [2374]=5, + [2375]=5, + [2376]=5, + [2381]=5, + [2385]=5, + [2386]=5, + [2387]=5, + [2388]=5, + [2389]=5, + [2390]=5, + [2391]=5, + [2402]=5, + [2403]=5, + [2433]=5, + [2492]=5, + [2497]=5, + [2498]=5, + [2499]=5, + [2500]=5, + [2509]=5, + [2530]=5, + [2531]=5, + [2561]=5, + [2562]=5, + [2620]=5, + [2625]=5, + [2626]=5, + [2631]=5, + [2632]=5, + [2635]=5, + [2636]=5, + [2637]=5, + [2641]=5, + [2672]=5, + [2673]=5, + [2677]=5, + [2689]=5, + [2690]=5, + [2748]=5, + [2753]=5, + [2754]=5, + [2755]=5, + [2756]=5, + [2757]=5, + [2759]=5, + [2760]=5, + [2765]=5, + [2786]=5, + [2787]=5, + [2810]=5, + [2811]=5, + [2812]=5, + [2813]=5, + [2814]=5, + [2815]=5, + [2817]=5, + [2876]=5, + [2879]=5, + [2881]=5, + [2882]=5, + [2883]=5, + [2884]=5, + [2893]=5, + [2902]=5, + [2914]=5, + [2915]=5, + [2946]=5, + [3008]=5, + [3021]=5, + [3072]=5, + [3134]=5, + [3135]=5, + [3136]=5, + [3142]=5, + [3143]=5, + [3144]=5, + [3146]=5, + [3147]=5, + [3148]=5, + [3149]=5, + [3157]=5, + [3158]=5, + [3170]=5, + [3171]=5, + [3201]=5, + [3260]=5, + [3263]=5, + [3270]=5, + [3276]=5, + [3277]=5, + [3298]=5, + [3299]=5, + [3328]=5, + [3329]=5, + [3387]=5, + [3388]=5, + [3393]=5, + [3394]=5, + [3395]=5, + [3396]=5, + [3405]=5, + [3426]=5, + [3427]=5, + [3530]=5, + [3538]=5, + [3539]=5, + [3540]=5, + [3542]=5, + [3633]=5, + [3636]=5, + [3637]=5, + [3638]=5, + [3639]=5, + [3640]=5, + [3641]=5, + [3642]=5, + [3655]=5, + [3656]=5, + [3657]=5, + [3658]=5, + [3659]=5, + [3660]=5, + [3661]=5, + [3662]=5, + [3761]=5, + [3764]=5, + [3765]=5, + [3766]=5, + [3767]=5, + [3768]=5, + [3769]=5, + [3771]=5, + [3772]=5, + [3784]=5, + [3785]=5, + [3786]=5, + [3787]=5, + [3788]=5, + [3789]=5, + [3864]=5, + [3865]=5, + [3893]=5, + [3895]=5, + [3897]=5, + [3953]=5, + [3954]=5, + [3955]=5, + [3956]=5, + [3957]=5, + [3958]=5, + [3959]=5, + [3960]=5, + [3961]=5, + [3962]=5, + [3963]=5, + [3964]=5, + [3965]=5, + [3966]=5, + [3968]=5, + [3969]=5, + [3970]=5, + [3971]=5, + [3972]=5, + [3974]=5, + [3975]=5, + [3981]=5, + [3982]=5, + [3983]=5, + [3984]=5, + [3985]=5, + [3986]=5, + [3987]=5, + [3988]=5, + [3989]=5, + [3990]=5, + [3991]=5, + [3993]=5, + [3994]=5, + [3995]=5, + [3996]=5, + [3997]=5, + [3998]=5, + [3999]=5, + [4000]=5, + [4001]=5, + [4002]=5, + [4003]=5, + [4004]=5, + [4005]=5, + [4006]=5, + [4007]=5, + [4008]=5, + [4009]=5, + [4010]=5, + [4011]=5, + [4012]=5, + [4013]=5, + [4014]=5, + [4015]=5, + [4016]=5, + [4017]=5, + [4018]=5, + [4019]=5, + [4020]=5, + [4021]=5, + [4022]=5, + [4023]=5, + [4024]=5, + [4025]=5, + [4026]=5, + [4027]=5, + [4028]=5, + [4038]=5, + [4141]=5, + [4142]=5, + [4143]=5, + [4144]=5, + [4146]=5, + [4147]=5, + [4148]=5, + [4149]=5, + [4150]=5, + [4151]=5, + [4153]=5, + [4154]=5, + [4157]=5, + [4158]=5, + [4184]=5, + [4185]=5, + [4190]=5, + [4191]=5, + [4192]=5, + [4209]=5, + [4210]=5, + [4211]=5, + [4212]=5, + [4226]=5, + [4229]=5, + [4230]=5, + [4237]=5, + [4253]=5, + [4957]=5, + [4958]=5, + [4959]=5, + [5906]=5, + [5907]=5, + [5908]=5, + [5938]=5, + [5939]=5, + [5940]=5, + [5970]=5, + [5971]=5, + [6002]=5, + [6003]=5, + [6071]=5, + [6072]=5, + [6073]=5, + [6074]=5, + [6075]=5, + [6076]=5, + [6077]=5, + [6086]=5, + [6089]=5, + [6090]=5, + [6091]=5, + [6092]=5, + [6093]=5, + [6094]=5, + [6095]=5, + [6096]=5, + [6097]=5, + [6098]=5, + [6099]=5, + [6109]=5, + [6150]=4, + [6151]=2, + [6154]=2, + [6155]=5, + [6156]=5, + [6157]=5, + [6158]=4, + [6176]=2, + [6177]=2, + [6178]=2, + [6179]=2, + [6180]=2, + [6181]=2, + [6182]=2, + [6183]=2, + [6184]=2, + [6185]=2, + [6186]=2, + [6187]=2, + [6188]=2, + [6189]=2, + [6190]=2, + [6191]=2, + [6192]=2, + [6193]=2, + [6194]=2, + [6195]=2, + [6196]=2, + [6197]=2, + [6198]=2, + [6199]=2, + [6200]=2, + [6201]=2, + [6202]=2, + [6203]=2, + [6204]=2, + [6205]=2, + [6206]=2, + [6207]=2, + [6208]=2, + [6209]=2, + [6210]=2, + [6211]=2, + [6212]=2, + [6213]=2, + [6214]=2, + [6215]=2, + [6216]=2, + [6217]=2, + [6218]=2, + [6219]=2, + [6220]=2, + [6221]=2, + [6222]=2, + [6223]=2, + [6224]=2, + [6225]=2, + [6226]=2, + [6227]=2, + [6228]=2, + [6229]=2, + [6230]=2, + [6231]=2, + [6232]=2, + [6233]=2, + [6234]=2, + [6235]=2, + [6236]=2, + [6237]=2, + [6238]=2, + [6239]=2, + [6240]=2, + [6241]=2, + [6242]=2, + [6243]=2, + [6244]=2, + [6245]=2, + [6246]=2, + [6247]=2, + [6248]=2, + [6249]=2, + [6250]=2, + [6251]=2, + [6252]=2, + [6253]=2, + [6254]=2, + [6255]=2, + [6256]=2, + [6257]=2, + [6258]=2, + [6259]=2, + [6260]=2, + [6261]=2, + [6262]=2, + [6263]=2, + [6272]=4, + [6273]=4, + [6274]=4, + [6275]=4, + [6276]=4, + [6279]=2, + [6280]=2, + [6281]=2, + [6282]=2, + [6283]=2, + [6284]=2, + [6285]=2, + [6286]=2, + [6287]=2, + [6288]=2, + [6289]=2, + [6290]=2, + [6291]=2, + [6292]=2, + [6293]=2, + [6294]=2, + [6295]=2, + [6296]=2, + [6297]=2, + [6298]=2, + [6299]=2, + [6300]=2, + [6301]=2, + [6302]=2, + [6303]=2, + [6304]=2, + [6305]=2, + [6306]=2, + [6307]=2, + [6308]=2, + [6309]=2, + [6310]=2, + [6311]=2, + [6312]=2, + [6313]=5, + [6314]=2, + [6432]=5, + [6433]=5, + [6434]=5, + [6439]=5, + [6440]=5, + [6450]=5, + [6457]=5, + [6458]=5, + [6459]=5, + [6679]=5, + [6680]=5, + [6742]=5, + [6744]=5, + [6745]=5, + [6746]=5, + [6747]=5, + [6748]=5, + [6749]=5, + [6750]=5, + [6752]=5, + [6754]=5, + [6757]=5, + [6758]=5, + [6759]=5, + [6760]=5, + [6761]=5, + [6762]=5, + [6763]=5, + [6764]=5, + [6771]=5, + [6772]=5, + [6773]=5, + [6774]=5, + [6775]=5, + [6776]=5, + [6777]=5, + [6778]=5, + [6779]=5, + [6780]=5, + [6783]=5, + [6832]=5, + [6833]=5, + [6834]=5, + [6835]=5, + [6836]=5, + [6837]=5, + [6838]=5, + [6839]=5, + [6840]=5, + [6841]=5, + [6842]=5, + [6843]=5, + [6844]=5, + [6845]=5, + [6912]=5, + [6913]=5, + [6914]=5, + [6915]=5, + [6964]=5, + [6966]=5, + [6967]=5, + [6968]=5, + [6969]=5, + [6970]=5, + [6972]=5, + [6978]=5, + [7019]=5, + [7020]=5, + [7021]=5, + [7022]=5, + [7023]=5, + [7024]=5, + [7025]=5, + [7026]=5, + [7027]=5, + [7040]=5, + [7041]=5, + [7074]=5, + [7075]=5, + [7076]=5, + [7077]=5, + [7080]=5, + [7081]=5, + [7083]=5, + [7142]=5, + [7144]=5, + [7145]=5, + [7149]=5, + [7151]=5, + [7152]=5, + [7153]=5, + [7212]=5, + [7213]=5, + [7214]=5, + [7215]=5, + [7216]=5, + [7217]=5, + [7218]=5, + [7219]=5, + [7222]=5, + [7223]=5, + [7376]=5, + [7377]=5, + [7378]=5, + [7380]=5, + [7381]=5, + [7382]=5, + [7383]=5, + [7384]=5, + [7385]=5, + [7386]=5, + [7387]=5, + [7388]=5, + [7389]=5, + [7390]=5, + [7391]=5, + [7392]=5, + [7394]=5, + [7395]=5, + [7396]=5, + [7397]=5, + [7398]=5, + [7399]=5, + [7400]=5, + [7405]=5, + [7412]=5, + [7416]=5, + [7417]=5, + [7616]=5, + [7617]=5, + [7618]=5, + [7619]=5, + [7620]=5, + [7621]=5, + [7622]=5, + [7623]=5, + [7624]=5, + [7625]=5, + [7626]=5, + [7627]=5, + [7628]=5, + [7629]=5, + [7630]=5, + [7631]=5, + [7632]=5, + [7633]=5, + [7634]=5, + [7635]=5, + [7636]=5, + [7637]=5, + [7638]=5, + [7639]=5, + [7640]=5, + [7641]=5, + [7642]=5, + [7643]=5, + [7644]=5, + [7645]=5, + [7646]=5, + [7647]=5, + [7648]=5, + [7649]=5, + [7650]=5, + [7651]=5, + [7652]=5, + [7653]=5, + [7654]=5, + [7655]=5, + [7656]=5, + [7657]=5, + [7658]=5, + [7659]=5, + [7660]=5, + [7661]=5, + [7662]=5, + [7663]=5, + [7664]=5, + [7665]=5, + [7666]=5, + [7667]=5, + [7668]=5, + [7669]=5, + [7670]=5, + [7671]=5, + [7672]=5, + [7673]=5, + [7675]=5, + [7676]=5, + [7677]=5, + [7678]=5, + [7679]=5, + [8204]=4, + [8205]=2, + [8239]=4, + [8294]=4, + [8295]=4, + [8296]=4, + [8297]=4, + [8400]=5, + [8401]=5, + [8402]=5, + [8403]=5, + [8404]=5, + [8405]=5, + [8406]=5, + [8407]=5, + [8408]=5, + [8409]=5, + [8410]=5, + [8411]=5, + [8412]=5, + [8417]=5, + [8421]=5, + [8422]=5, + [8423]=5, + [8424]=5, + [8425]=5, + [8426]=5, + [8427]=5, + [8428]=5, + [8429]=5, + [8430]=5, + [8431]=5, + [8432]=5, + [11503]=5, + [11504]=5, + [11505]=5, + [11647]=5, + [11744]=5, + [11745]=5, + [11746]=5, + [11747]=5, + [11748]=5, + [11749]=5, + [11750]=5, + [11751]=5, + [11752]=5, + [11753]=5, + [11754]=5, + [11755]=5, + [11756]=5, + [11757]=5, + [11758]=5, + [11759]=5, + [11760]=5, + [11761]=5, + [11762]=5, + [11763]=5, + [11764]=5, + [11765]=5, + [11766]=5, + [11767]=5, + [11768]=5, + [11769]=5, + [11770]=5, + [11771]=5, + [11772]=5, + [11773]=5, + [11774]=5, + [11775]=5, + [12330]=5, + [12331]=5, + [12332]=5, + [12333]=5, + [12334]=5, + [12335]=5, + [12441]=5, + [12442]=5, + [42607]=5, + [42612]=5, + [42613]=5, + [42614]=5, + [42615]=5, + [42616]=5, + [42617]=5, + [42618]=5, + [42619]=5, + [42620]=5, + [42621]=5, + [42654]=5, + [42655]=5, + [42736]=5, + [42737]=5, + [43014]=5, + [43019]=5, + [43045]=5, + [43046]=5, + [43072]=2, + [43073]=2, + [43074]=2, + [43075]=2, + [43076]=2, + [43077]=2, + [43078]=2, + [43079]=2, + [43080]=2, + [43081]=2, + [43082]=2, + [43083]=2, + [43084]=2, + [43085]=2, + [43086]=2, + [43087]=2, + [43088]=2, + [43089]=2, + [43090]=2, + [43091]=2, + [43092]=2, + [43093]=2, + [43094]=2, + [43095]=2, + [43096]=2, + [43097]=2, + [43098]=2, + [43099]=2, + [43100]=2, + [43101]=2, + [43102]=2, + [43103]=2, + [43104]=2, + [43105]=2, + [43106]=2, + [43107]=2, + [43108]=2, + [43109]=2, + [43110]=2, + [43111]=2, + [43112]=2, + [43113]=2, + [43114]=2, + [43115]=2, + [43116]=2, + [43117]=2, + [43118]=2, + [43119]=2, + [43120]=2, + [43121]=2, + [43122]=1, + [43123]=4, + [43204]=5, + [43205]=5, + [43232]=5, + [43233]=5, + [43234]=5, + [43235]=5, + [43236]=5, + [43237]=5, + [43238]=5, + [43239]=5, + [43240]=5, + [43241]=5, + [43242]=5, + [43243]=5, + [43244]=5, + [43245]=5, + [43246]=5, + [43247]=5, + [43248]=5, + [43249]=5, + [43302]=5, + [43303]=5, + [43304]=5, + [43305]=5, + [43306]=5, + [43307]=5, + [43308]=5, + [43309]=5, + [43335]=5, + [43336]=5, + [43337]=5, + [43338]=5, + [43339]=5, + [43340]=5, + [43341]=5, + [43342]=5, + [43343]=5, + [43344]=5, + [43345]=5, + [43392]=5, + [43393]=5, + [43394]=5, + [43443]=5, + [43446]=5, + [43447]=5, + [43448]=5, + [43449]=5, + [43452]=5, + [43493]=5, + [43561]=5, + [43562]=5, + [43563]=5, + [43564]=5, + [43565]=5, + [43566]=5, + [43569]=5, + [43570]=5, + [43573]=5, + [43574]=5, + [43587]=5, + [43596]=5, + [43644]=5, + [43696]=5, + [43698]=5, + [43699]=5, + [43700]=5, + [43703]=5, + [43704]=5, + [43710]=5, + [43711]=5, + [43713]=5, + [43756]=5, + [43757]=5, + [43766]=5, + [44005]=5, + [44008]=5, + [44013]=5, + [64286]=5, + [65056]=5, + [65057]=5, + [65058]=5, + [65059]=5, + [65060]=5, + [65061]=5, + [65062]=5, + [65063]=5, + [65064]=5, + [65065]=5, + [65066]=5, + [65067]=5, + [65068]=5, + [65069]=5, + [65070]=5, + [65071]=5, + [66045]=5, + [66272]=5, + [66422]=5, + [66423]=5, + [66424]=5, + [66425]=5, + [66426]=5, + [68097]=5, + [68098]=5, + [68099]=5, + [68101]=5, + [68102]=5, + [68108]=5, + [68109]=5, + [68110]=5, + [68111]=5, + [68152]=5, + [68153]=5, + [68154]=5, + [68159]=5, + [68288]=2, + [68289]=2, + [68290]=2, + [68291]=2, + [68292]=2, + [68293]=3, + [68294]=4, + [68295]=3, + [68296]=4, + [68297]=3, + [68298]=3, + [68299]=4, + [68300]=4, + [68301]=1, + [68302]=3, + [68303]=3, + [68304]=3, + [68305]=3, + [68306]=3, + [68307]=2, + [68308]=2, + [68309]=2, + [68310]=2, + [68311]=1, + [68312]=2, + [68313]=2, + [68314]=2, + [68315]=2, + [68316]=2, + [68317]=3, + [68318]=2, + [68319]=2, + [68320]=2, + [68321]=3, + [68322]=4, + [68323]=4, + [68324]=3, + [68325]=5, + [68326]=5, + [68331]=2, + [68332]=2, + [68333]=2, + [68334]=2, + [68335]=3, + [68480]=2, + [68481]=3, + [68482]=2, + [68483]=3, + [68484]=3, + [68485]=3, + [68486]=2, + [68487]=2, + [68488]=2, + [68489]=3, + [68490]=2, + [68491]=2, + [68492]=3, + [68493]=2, + [68494]=3, + [68495]=3, + [68496]=2, + [68497]=3, + [68521]=3, + [68522]=3, + [68523]=3, + [68524]=3, + [68525]=2, + [68526]=2, + [68527]=4, + [69633]=5, + [69688]=5, + [69689]=5, + [69690]=5, + [69691]=5, + [69692]=5, + [69693]=5, + [69694]=5, + [69695]=5, + [69696]=5, + [69697]=5, + [69698]=5, + [69699]=5, + [69700]=5, + [69701]=5, + [69702]=5, + [69759]=5, + [69760]=5, + [69761]=5, + [69811]=5, + [69812]=5, + [69813]=5, + [69814]=5, + [69817]=5, + [69818]=5, + [69888]=5, + [69889]=5, + [69890]=5, + [69927]=5, + [69928]=5, + [69929]=5, + [69930]=5, + [69931]=5, + [69933]=5, + [69934]=5, + [69935]=5, + [69936]=5, + [69937]=5, + [69938]=5, + [69939]=5, + [69940]=5, + [70003]=5, + [70016]=5, + [70017]=5, + [70070]=5, + [70071]=5, + [70072]=5, + [70073]=5, + [70074]=5, + [70075]=5, + [70076]=5, + [70077]=5, + [70078]=5, + [70090]=5, + [70091]=5, + [70092]=5, + [70191]=5, + [70192]=5, + [70193]=5, + [70196]=5, + [70198]=5, + [70199]=5, + [70206]=5, + [70367]=5, + [70371]=5, + [70372]=5, + [70373]=5, + [70374]=5, + [70375]=5, + [70376]=5, + [70377]=5, + [70378]=5, + [70400]=5, + [70401]=5, + [70460]=5, + [70464]=5, + [70502]=5, + [70503]=5, + [70504]=5, + [70505]=5, + [70506]=5, + [70507]=5, + [70508]=5, + [70512]=5, + [70513]=5, + [70514]=5, + [70515]=5, + [70516]=5, + [70712]=5, + [70713]=5, + [70714]=5, + [70715]=5, + [70716]=5, + [70717]=5, + [70718]=5, + [70719]=5, + [70722]=5, + [70723]=5, + [70724]=5, + [70726]=5, + [70835]=5, + [70836]=5, + [70837]=5, + [70838]=5, + [70839]=5, + [70840]=5, + [70842]=5, + [70847]=5, + [70848]=5, + [70850]=5, + [70851]=5, + [71090]=5, + [71091]=5, + [71092]=5, + [71093]=5, + [71100]=5, + [71101]=5, + [71103]=5, + [71104]=5, + [71132]=5, + [71133]=5, + [71219]=5, + [71220]=5, + [71221]=5, + [71222]=5, + [71223]=5, + [71224]=5, + [71225]=5, + [71226]=5, + [71229]=5, + [71231]=5, + [71232]=5, + [71339]=5, + [71341]=5, + [71344]=5, + [71345]=5, + [71346]=5, + [71347]=5, + [71348]=5, + [71349]=5, + [71351]=5, + [71453]=5, + [71454]=5, + [71455]=5, + [71458]=5, + [71459]=5, + [71460]=5, + [71461]=5, + [71463]=5, + [71464]=5, + [71465]=5, + [71466]=5, + [71467]=5, + [72193]=5, + [72194]=5, + [72195]=5, + [72196]=5, + [72197]=5, + [72198]=5, + [72201]=5, + [72202]=5, + [72243]=5, + [72244]=5, + [72245]=5, + [72246]=5, + [72247]=5, + [72248]=5, + [72251]=5, + [72252]=5, + [72253]=5, + [72254]=5, + [72263]=5, + [72273]=5, + [72274]=5, + [72275]=5, + [72276]=5, + [72277]=5, + [72278]=5, + [72281]=5, + [72282]=5, + [72283]=5, + [72330]=5, + [72331]=5, + [72332]=5, + [72333]=5, + [72334]=5, + [72335]=5, + [72336]=5, + [72337]=5, + [72338]=5, + [72339]=5, + [72340]=5, + [72341]=5, + [72342]=5, + [72344]=5, + [72345]=5, + [72752]=5, + [72753]=5, + [72754]=5, + [72755]=5, + [72756]=5, + [72757]=5, + [72758]=5, + [72760]=5, + [72761]=5, + [72762]=5, + [72763]=5, + [72764]=5, + [72765]=5, + [72767]=5, + [72850]=5, + [72851]=5, + [72852]=5, + [72853]=5, + [72854]=5, + [72855]=5, + [72856]=5, + [72857]=5, + [72858]=5, + [72859]=5, + [72860]=5, + [72861]=5, + [72862]=5, + [72863]=5, + [72864]=5, + [72865]=5, + [72866]=5, + [72867]=5, + [72868]=5, + [72869]=5, + [72870]=5, + [72871]=5, + [72874]=5, + [72875]=5, + [72876]=5, + [72877]=5, + [72878]=5, + [72879]=5, + [72880]=5, + [72882]=5, + [72883]=5, + [72885]=5, + [72886]=5, + [73009]=5, + [73010]=5, + [73011]=5, + [73012]=5, + [73013]=5, + [73014]=5, + [73018]=5, + [73020]=5, + [73021]=5, + [73023]=5, + [73024]=5, + [73025]=5, + [73026]=5, + [73027]=5, + [73028]=5, + [73029]=5, + [73031]=5, + [92912]=5, + [92913]=5, + [92914]=5, + [92915]=5, + [92916]=5, + [92976]=5, + [92977]=5, + [92978]=5, + [92979]=5, + [92980]=5, + [92981]=5, + [92982]=5, + [94095]=5, + [94096]=5, + [94097]=5, + [94098]=5, + [113821]=5, + [113822]=5, + [119143]=5, + [119144]=5, + [119145]=5, + [119163]=5, + [119164]=5, + [119165]=5, + [119166]=5, + [119167]=5, + [119168]=5, + [119169]=5, + [119170]=5, + [119173]=5, + [119174]=5, + [119175]=5, + [119176]=5, + [119177]=5, + [119178]=5, + [119179]=5, + [119210]=5, + [119211]=5, + [119212]=5, + [119213]=5, + [119362]=5, + [119363]=5, + [119364]=5, + [121344]=5, + [121345]=5, + [121346]=5, + [121347]=5, + [121348]=5, + [121349]=5, + [121350]=5, + [121351]=5, + [121352]=5, + [121353]=5, + [121354]=5, + [121355]=5, + [121356]=5, + [121357]=5, + [121358]=5, + [121359]=5, + [121360]=5, + [121361]=5, + [121362]=5, + [121363]=5, + [121364]=5, + [121365]=5, + [121366]=5, + [121367]=5, + [121368]=5, + [121369]=5, + [121370]=5, + [121371]=5, + [121372]=5, + [121373]=5, + [121374]=5, + [121375]=5, + [121376]=5, + [121377]=5, + [121378]=5, + [121379]=5, + [121380]=5, + [121381]=5, + [121382]=5, + [121383]=5, + [121384]=5, + [121385]=5, + [121386]=5, + [121387]=5, + [121388]=5, + [121389]=5, + [121390]=5, + [121391]=5, + [121392]=5, + [121393]=5, + [121394]=5, + [121395]=5, + [121396]=5, + [121397]=5, + [121398]=5, + [121403]=5, + [121404]=5, + [121405]=5, + [121406]=5, + [121407]=5, + [121408]=5, + [121409]=5, + [121410]=5, + [121411]=5, + [121412]=5, + [121413]=5, + [121414]=5, + [121415]=5, + [121416]=5, + [121417]=5, + [121418]=5, + [121419]=5, + [121420]=5, + [121421]=5, + [121422]=5, + [121423]=5, + [121424]=5, + [121425]=5, + [121426]=5, + [121427]=5, + [121428]=5, + [121429]=5, + [121430]=5, + [121431]=5, + [121432]=5, + [121433]=5, + [121434]=5, + [121435]=5, + [121436]=5, + [121437]=5, + [121438]=5, + [121439]=5, + [121440]=5, + [121441]=5, + [121442]=5, + [121443]=5, + [121444]=5, + [121445]=5, + [121446]=5, + [121447]=5, + [121448]=5, + [121449]=5, + [121450]=5, + [121451]=5, + [121452]=5, + [121461]=5, + [121476]=5, + [121499]=5, + [121500]=5, + [121501]=5, + [121502]=5, + [121503]=5, + [121505]=5, + [121506]=5, + [121507]=5, + [121508]=5, + [121509]=5, + [121510]=5, + [121511]=5, + [121512]=5, + [121513]=5, + [121514]=5, + [121515]=5, + [121516]=5, + [121517]=5, + [121518]=5, + [121519]=5, + [122880]=5, + [122881]=5, + [122882]=5, + [122883]=5, + [122884]=5, + [122885]=5, + [122886]=5, + [122888]=5, + [122889]=5, + [122890]=5, + [122891]=5, + [122892]=5, + [122893]=5, + [122894]=5, + [122895]=5, + [122896]=5, + [122897]=5, + [122898]=5, + [122899]=5, + [122900]=5, + [122901]=5, + [122902]=5, + [122903]=5, + [122904]=5, + [122907]=5, + [122908]=5, + [122909]=5, + [122910]=5, + [122911]=5, + [122912]=5, + [122913]=5, + [122915]=5, + [122916]=5, + [122918]=5, + [122919]=5, + [122920]=5, + [122921]=5, + [122922]=5, + [125136]=5, + [125137]=5, + [125138]=5, + [125139]=5, + [125140]=5, + [125141]=5, + [125142]=5, + [125184]=2, + [125185]=2, + [125186]=2, + [125187]=2, + [125188]=2, + [125189]=2, + [125190]=2, + [125191]=2, + [125192]=2, + [125193]=2, + [125194]=2, + [125195]=2, + [125196]=2, + [125197]=2, + [125198]=2, + [125199]=2, + [125200]=2, + [125201]=2, + [125202]=2, + [125203]=2, + [125204]=2, + [125205]=2, + [125206]=2, + [125207]=2, + [125208]=2, + [125209]=2, + [125210]=2, + [125211]=2, + [125212]=2, + [125213]=2, + [125214]=2, + [125215]=2, + [125216]=2, + [125217]=2, + [125218]=2, + [125219]=2, + [125220]=2, + [125221]=2, + [125222]=2, + [125223]=2, + [125224]=2, + [125225]=2, + [125226]=2, + [125227]=2, + [125228]=2, + [125229]=2, + [125230]=2, + [125231]=2, + [125232]=2, + [125233]=2, + [125234]=2, + [125235]=2, + [125236]=2, + [125237]=2, + [125238]=2, + [125239]=2, + [125240]=2, + [125241]=2, + [125242]=2, + [125243]=2, + [125244]=2, + [125245]=2, + [125246]=2, + [125247]=2, + [125248]=2, + [125249]=2, + [125250]=2, + [125251]=2, + [125252]=5, + [125253]=5, + [125254]=5, + [125255]=5, + [125256]=5, + [125257]=5, + [125258]=5, + [1042752]=5, +} +characters.indicgroups={ + ["above_mark"]={ + [2304]=true, + [2305]=true, + [2306]=true, + [2362]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2385]=true, + [2387]=true, + [2388]=true, + [2389]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2879]=true, + [3008]=true, + [3021]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3142]=true, + [3143]=true, + [3144]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3149]=true, + [3263]=true, + [3270]=true, + [3406]=true, + [43232]=true, + [43233]=true, + [43234]=true, + [43235]=true, + [43236]=true, + [43237]=true, + [43238]=true, + [43239]=true, + [43240]=true, + [43241]=true, + [43242]=true, + [43243]=true, + [43244]=true, + [43245]=true, + [43246]=true, + [43247]=true, + [43248]=true, + [43249]=true, + }, + ["after_half"]={}, + ["after_main"]={ + [2864]=true, + [2879]=true, + [2902]=true, + [3376]=true, + }, + ["after_postscript"]={ + [2433]=true, + [2494]=true, + [2496]=true, + [2519]=true, + [2561]=true, + [2562]=true, + [2622]=true, + [2624]=true, + [2625]=true, + [2626]=true, + [2672]=true, + [2673]=true, + [2750]=true, + [2752]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2786]=true, + [2787]=true, + [2878]=true, + [2880]=true, + [2903]=true, + [2992]=true, + [3006]=true, + [3007]=true, + [3009]=true, + [3010]=true, + [3031]=true, + [3120]=true, + [3248]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3415]=true, + }, + ["after_subscript"]={ + [2366]=true, + [2368]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2402]=true, + [2403]=true, + [2480]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2530]=true, + [2531]=true, + [2544]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [3008]=true, + [3139]=true, + [3140]=true, + [3267]=true, + [3268]=true, + [3285]=true, + [3286]=true, + }, + ["anudatta"]={ + [2386]=true, + }, + ["before_half"]={ + [2367]=true, + [2382]=true, + [2495]=true, + [2503]=true, + [2504]=true, + [2623]=true, + [2751]=true, + [2887]=true, + }, + ["before_main"]={ + [3014]=true, + [3015]=true, + [3016]=true, + [3398]=true, + [3399]=true, + [3400]=true, + }, + ["before_postscript"]={ + [2352]=true, + [2736]=true, + }, + ["before_subscript"]={ + [2608]=true, + [2817]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3137]=true, + [3138]=true, + [3142]=true, + [3143]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3157]=true, + [3158]=true, + [3262]=true, + [3263]=true, + [3265]=true, + [3266]=true, + [3270]=true, + [3276]=true, + [3298]=true, + [3299]=true, + }, + ["below_mark"]={ + [2364]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2381]=true, + [2386]=true, + [2390]=true, + [2391]=true, + [2402]=true, + [2403]=true, + [2492]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2509]=true, + [2620]=true, + [2625]=true, + [2626]=true, + [2637]=true, + [2748]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2765]=true, + [2876]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [2884]=true, + [2893]=true, + [2914]=true, + [2915]=true, + [3009]=true, + [3010]=true, + [3170]=true, + [3171]=true, + [3260]=true, + [3298]=true, + [3299]=true, + [3426]=true, + [3427]=true, + }, + ["consonant"]={ + [2325]=true, + [2326]=true, + [2327]=true, + [2328]=true, + [2329]=true, + [2330]=true, + [2331]=true, + [2332]=true, + [2333]=true, + [2334]=true, + [2335]=true, + [2336]=true, + [2337]=true, + [2338]=true, + [2339]=true, + [2340]=true, + [2341]=true, + [2342]=true, + [2343]=true, + [2344]=true, + [2345]=true, + [2346]=true, + [2347]=true, + [2348]=true, + [2349]=true, + [2350]=true, + [2351]=true, + [2352]=true, + [2353]=true, + [2354]=true, + [2355]=true, + [2356]=true, + [2357]=true, + [2358]=true, + [2359]=true, + [2360]=true, + [2361]=true, + [2392]=true, + [2393]=true, + [2394]=true, + [2395]=true, + [2396]=true, + [2397]=true, + [2398]=true, + [2399]=true, + [2424]=true, + [2425]=true, + [2426]=true, + [2453]=true, + [2454]=true, + [2455]=true, + [2456]=true, + [2457]=true, + [2458]=true, + [2459]=true, + [2460]=true, + [2461]=true, + [2462]=true, + [2463]=true, + [2464]=true, + [2465]=true, + [2466]=true, + [2467]=true, + [2468]=true, + [2469]=true, + [2470]=true, + [2471]=true, + [2472]=true, + [2474]=true, + [2475]=true, + [2476]=true, + [2477]=true, + [2478]=true, + [2479]=true, + [2480]=true, + [2482]=true, + [2486]=true, + [2487]=true, + [2488]=true, + [2489]=true, + [2510]=true, + [2524]=true, + [2525]=true, + [2527]=true, + [2581]=true, + [2582]=true, + [2583]=true, + [2584]=true, + [2585]=true, + [2586]=true, + [2587]=true, + [2588]=true, + [2589]=true, + [2590]=true, + [2591]=true, + [2592]=true, + [2593]=true, + [2594]=true, + [2595]=true, + [2596]=true, + [2597]=true, + [2598]=true, + [2599]=true, + [2600]=true, + [2602]=true, + [2603]=true, + [2604]=true, + [2605]=true, + [2606]=true, + [2607]=true, + [2608]=true, + [2610]=true, + [2611]=true, + [2613]=true, + [2614]=true, + [2616]=true, + [2617]=true, + [2649]=true, + [2650]=true, + [2651]=true, + [2652]=true, + [2654]=true, + [2709]=true, + [2710]=true, + [2711]=true, + [2712]=true, + [2713]=true, + [2714]=true, + [2715]=true, + [2716]=true, + [2717]=true, + [2718]=true, + [2719]=true, + [2720]=true, + [2721]=true, + [2722]=true, + [2723]=true, + [2724]=true, + [2725]=true, + [2726]=true, + [2727]=true, + [2728]=true, + [2730]=true, + [2731]=true, + [2732]=true, + [2733]=true, + [2734]=true, + [2735]=true, + [2736]=true, + [2738]=true, + [2739]=true, + [2741]=true, + [2742]=true, + [2743]=true, + [2744]=true, + [2745]=true, + [2837]=true, + [2838]=true, + [2839]=true, + [2840]=true, + [2841]=true, + [2842]=true, + [2843]=true, + [2844]=true, + [2845]=true, + [2846]=true, + [2847]=true, + [2848]=true, + [2849]=true, + [2850]=true, + [2851]=true, + [2852]=true, + [2853]=true, + [2854]=true, + [2855]=true, + [2856]=true, + [2858]=true, + [2859]=true, + [2860]=true, + [2861]=true, + [2862]=true, + [2863]=true, + [2864]=true, + [2866]=true, + [2867]=true, + [2869]=true, + [2870]=true, + [2871]=true, + [2872]=true, + [2873]=true, + [2908]=true, + [2909]=true, + [2929]=true, + [2965]=true, + [2969]=true, + [2970]=true, + [2972]=true, + [2974]=true, + [2975]=true, + [2979]=true, + [2980]=true, + [2984]=true, + [2985]=true, + [2986]=true, + [2990]=true, + [2991]=true, + [2992]=true, + [2993]=true, + [2994]=true, + [2995]=true, + [2996]=true, + [2997]=true, + [2998]=true, + [2999]=true, + [3000]=true, + [3001]=true, + [3093]=true, + [3094]=true, + [3095]=true, + [3096]=true, + [3097]=true, + [3098]=true, + [3099]=true, + [3100]=true, + [3101]=true, + [3102]=true, + [3103]=true, + [3104]=true, + [3105]=true, + [3106]=true, + [3107]=true, + [3108]=true, + [3109]=true, + [3110]=true, + [3111]=true, + [3112]=true, + [3114]=true, + [3115]=true, + [3116]=true, + [3117]=true, + [3118]=true, + [3119]=true, + [3120]=true, + [3121]=true, + [3122]=true, + [3123]=true, + [3124]=true, + [3125]=true, + [3126]=true, + [3127]=true, + [3128]=true, + [3129]=true, + [3133]=true, + [3221]=true, + [3222]=true, + [3223]=true, + [3224]=true, + [3225]=true, + [3226]=true, + [3227]=true, + [3228]=true, + [3229]=true, + [3230]=true, + [3231]=true, + [3232]=true, + [3233]=true, + [3234]=true, + [3235]=true, + [3236]=true, + [3237]=true, + [3238]=true, + [3239]=true, + [3240]=true, + [3242]=true, + [3243]=true, + [3244]=true, + [3245]=true, + [3246]=true, + [3247]=true, + [3248]=true, + [3249]=true, + [3250]=true, + [3251]=true, + [3253]=true, + [3254]=true, + [3255]=true, + [3256]=true, + [3257]=true, + [3294]=true, + [3349]=true, + [3350]=true, + [3351]=true, + [3352]=true, + [3353]=true, + [3354]=true, + [3355]=true, + [3356]=true, + [3357]=true, + [3358]=true, + [3359]=true, + [3360]=true, + [3361]=true, + [3362]=true, + [3363]=true, + [3364]=true, + [3365]=true, + [3366]=true, + [3367]=true, + [3368]=true, + [3369]=true, + [3370]=true, + [3371]=true, + [3372]=true, + [3373]=true, + [3374]=true, + [3375]=true, + [3376]=true, + [3377]=true, + [3378]=true, + [3379]=true, + [3380]=true, + [3381]=true, + [3382]=true, + [3383]=true, + [3384]=true, + [3385]=true, + [3386]=true, + }, + ["dependent_vowel"]={ + [2362]=true, + [2363]=true, + [2366]=true, + [2367]=true, + [2368]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2382]=true, + [2383]=true, + [2389]=true, + [2390]=true, + [2391]=true, + [2402]=true, + [2403]=true, + [2494]=true, + [2495]=true, + [2496]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2503]=true, + [2504]=true, + [2622]=true, + [2623]=true, + [2624]=true, + [2625]=true, + [2626]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2750]=true, + [2751]=true, + [2752]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2878]=true, + [2879]=true, + [2880]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [2884]=true, + [2887]=true, + [2888]=true, + [2891]=true, + [2892]=true, + [2914]=true, + [2915]=true, + [3006]=true, + [3007]=true, + [3008]=true, + [3009]=true, + [3010]=true, + [3014]=true, + [3015]=true, + [3016]=true, + [3018]=true, + [3019]=true, + [3020]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3137]=true, + [3138]=true, + [3139]=true, + [3140]=true, + [3142]=true, + [3143]=true, + [3144]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3170]=true, + [3171]=true, + [3262]=true, + [3263]=true, + [3264]=true, + [3265]=true, + [3266]=true, + [3267]=true, + [3268]=true, + [3270]=true, + [3271]=true, + [3272]=true, + [3274]=true, + [3275]=true, + [3276]=true, + [3298]=true, + [3299]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3396]=true, + [3398]=true, + [3399]=true, + [3400]=true, + [3402]=true, + [3403]=true, + [3404]=true, + [3415]=true, + [3426]=true, + [3427]=true, + }, + ["halant"]={ + [2381]=true, + [2509]=true, + [2637]=true, + [2765]=true, + [2893]=true, + [3021]=true, + [3149]=true, + [3277]=true, + [3405]=true, + }, + ["independent_vowel"]={ + [2308]=true, + [2309]=true, + [2310]=true, + [2311]=true, + [2312]=true, + [2313]=true, + [2314]=true, + [2315]=true, + [2316]=true, + [2317]=true, + [2318]=true, + [2319]=true, + [2320]=true, + [2321]=true, + [2322]=true, + [2323]=true, + [2324]=true, + [2400]=true, + [2401]=true, + [2418]=true, + [2419]=true, + [2420]=true, + [2421]=true, + [2422]=true, + [2423]=true, + [2437]=true, + [2438]=true, + [2439]=true, + [2440]=true, + [2441]=true, + [2442]=true, + [2443]=true, + [2444]=true, + [2447]=true, + [2448]=true, + [2451]=true, + [2452]=true, + [2528]=true, + [2529]=true, + [2530]=true, + [2531]=true, + [2565]=true, + [2566]=true, + [2567]=true, + [2568]=true, + [2569]=true, + [2570]=true, + [2575]=true, + [2576]=true, + [2579]=true, + [2580]=true, + [2693]=true, + [2694]=true, + [2695]=true, + [2696]=true, + [2697]=true, + [2698]=true, + [2699]=true, + [2700]=true, + [2701]=true, + [2703]=true, + [2704]=true, + [2705]=true, + [2707]=true, + [2708]=true, + [2784]=true, + [2785]=true, + [2786]=true, + [2787]=true, + [2821]=true, + [2822]=true, + [2823]=true, + [2824]=true, + [2825]=true, + [2826]=true, + [2827]=true, + [2828]=true, + [2831]=true, + [2832]=true, + [2835]=true, + [2836]=true, + [2912]=true, + [2913]=true, + [2949]=true, + [2950]=true, + [2951]=true, + [2952]=true, + [2953]=true, + [2954]=true, + [2958]=true, + [2959]=true, + [2960]=true, + [2962]=true, + [2963]=true, + [2964]=true, + [3077]=true, + [3078]=true, + [3079]=true, + [3080]=true, + [3081]=true, + [3082]=true, + [3083]=true, + [3084]=true, + [3086]=true, + [3087]=true, + [3088]=true, + [3090]=true, + [3091]=true, + [3092]=true, + [3168]=true, + [3169]=true, + [3205]=true, + [3206]=true, + [3207]=true, + [3208]=true, + [3209]=true, + [3210]=true, + [3211]=true, + [3212]=true, + [3214]=true, + [3215]=true, + [3216]=true, + [3218]=true, + [3219]=true, + [3220]=true, + [3296]=true, + [3297]=true, + [3333]=true, + [3334]=true, + [3335]=true, + [3336]=true, + [3337]=true, + [3338]=true, + [3339]=true, + [3340]=true, + [3342]=true, + [3343]=true, + [3344]=true, + [3346]=true, + [3347]=true, + [3348]=true, + [3423]=true, + [3424]=true, + [3425]=true, + }, + ["nukta"]={ + [2364]=true, + [2492]=true, + [2620]=true, + [2748]=true, + [2876]=true, + [3260]=true, + }, + ["post_mark"]={ + [2307]=true, + [2363]=true, + [2366]=true, + [2368]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2383]=true, + [2494]=true, + [2496]=true, + [2503]=true, + [2504]=true, + [2622]=true, + [2624]=true, + [2750]=true, + [2752]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2878]=true, + [2880]=true, + [3006]=true, + [3007]=true, + [3137]=true, + [3138]=true, + [3139]=true, + [3140]=true, + [3262]=true, + [3264]=true, + [3265]=true, + [3266]=true, + [3267]=true, + [3268]=true, + [3271]=true, + [3272]=true, + [3274]=true, + [3275]=true, + [3276]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3396]=true, + [3415]=true, + }, + ["pre_mark"]={ + [2367]=true, + [2382]=true, + [2495]=true, + [2623]=true, + [2751]=true, + [2887]=true, + [2888]=true, + [3014]=true, + [3015]=true, + [3016]=true, + [3398]=true, + [3399]=true, + [3400]=true, + }, + ["ra"]={ + [2352]=true, + [2480]=true, + [2608]=true, + [2736]=true, + [2864]=true, + [2992]=true, + [3120]=true, + [3248]=true, + [3376]=true, + }, + ["stress_tone_mark"]={ + [2385]=true, + [2386]=true, + [2387]=true, + [2388]=true, + [2507]=true, + [2508]=true, + [3277]=true, + [3405]=true, + }, + ["twopart_mark"]={ + [2891]={ 2887,2878 }, + [2892]={ 2887,2903 }, + [3018]={ 3014,3006 }, + [3019]={ 3015,3006 }, + [3020]={ 3014,3031 }, + [3402]={ 3398,3390 }, + [3403]={ 3399,3390 }, + [3404]={ 3398,3415 }, + }, + ["vowel_modifier"]={ + [2304]=true, + [2305]=true, + [2306]=true, + [2307]=true, + [3330]=true, + [3331]=true, + [43232]=true, + [43233]=true, + [43234]=true, + [43235]=true, + [43236]=true, + [43237]=true, + [43238]=true, + [43239]=true, + [43240]=true, + [43241]=true, + [43242]=true, + [43243]=true, + [43244]=true, + [43245]=true, + [43246]=true, + [43247]=true, + [43248]=true, + [43249]=true, + }, +} + +end --- [luaotfload, fontloader-2018-12-25.lua scope for “basics-chr”] --- + + +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ini” 4299a02110bbd7c0d27e131235c5319d] --- if not modules then modules={} end modules ['font-ini']={ version=1.001, @@ -630,10 +3873,10 @@ fonts.privateoffsets={ keepnames=false, } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ini”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ini”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-mis” 17e967c9ec4d001deefd43ddf25e98f7] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-mis” bc9eb43c27f63ce9d0fff67e104fe1c6] --- if not modules then modules={} end modules ['luatex-font-mis']={ version=1.001, @@ -665,10 +3908,10 @@ function font.each() return table.sortedhash(fonts.hashes.identifiers) end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-mis”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-mis”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-con” f30ef604ea0eece92e00cad7c7b56580] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-con” 6308f40e1b4fecfbe05b01c571d46936] --- if not modules then modules={} end modules ['font-con']={ version=1.001, @@ -1387,9 +4630,9 @@ function constructors.scale(tfmdata,specification) constructors.aftercopyingcharacters(target,tfmdata) constructors.trytosharefont(target,tfmdata) local vfonts=target.fonts -if isvirtual or target.type=="virtual" or properties.virtualized then + if isvirtual or target.type=="virtual" or properties.virtualized then properties.virtualized=true -target.type="virtual" + target.type="virtual" if not vfonts or #vfonts==0 then target.fonts={ { id=0 } } end @@ -1469,23 +4712,20 @@ function constructors.finalize(tfmdata) if not properties.virtualized then properties.virtualized=tfmdata.type=="virtual" end - if not tfmdata.properties then - tfmdata.properties={ - fontname=tfmdata.fontname, - filename=tfmdata.filename, - fullname=tfmdata.fullname, - name=tfmdata.name, - psname=tfmdata.psname, - encodingbytes=tfmdata.encodingbytes or 1, - embedding=tfmdata.embedding or "subset", - tounicode=tfmdata.tounicode or 1, - cidinfo=tfmdata.cidinfo or nil, - format=tfmdata.format or "type1", - direction=tfmdata.direction or 0, - writingmode=tfmdata.writingmode or "horizontal", - identity=tfmdata.identity or "horizontal", - } - end + properties.fontname=tfmdata.fontname + properties.filename=tfmdata.filename + properties.fullname=tfmdata.fullname + properties.name=tfmdata.name + properties.psname=tfmdata.psname + properties.encodingbytes=tfmdata.encodingbytes or 1 + properties.embedding=tfmdata.embedding or "subset" + properties.tounicode=tfmdata.tounicode or 1 + properties.cidinfo=tfmdata.cidinfo or nil + properties.format=tfmdata.format or "type1" + properties.direction=tfmdata.direction or 0 + properties.writingmode=tfmdata.writingmode or "horizontal" + properties.identity=tfmdata.identity or "horizontal" + properties.usedbitmap=tfmdata.usedbitmap if not tfmdata.resources then tfmdata.resources={} end @@ -2010,10 +5250,10 @@ function constructors.addcoreunicodes(unicodes) return unicodes end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-con”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-con”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-enc” 5ff4ca50493d7c4ecea0e15c203099f0] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-enc” 3e71a54297e8f85a1ac438bb0f20dd79] --- if not modules then modules={} end modules ['luatex-font-enc']={ version=1.001, @@ -2082,10 +5322,10 @@ function encodings.load(filename) return containers.write(encodings.cache,name,data) end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-enc”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-enc”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-cid” 22b0367742fb253deef84ef7ccf5e8de] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-cid” 4d87988efa86020a14708ee03c23415f] --- if not modules then modules={} end modules ['font-cid']={ version=1.001, @@ -2236,10 +5476,10 @@ function cid.getmap(specification) return found end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-cid”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-cid”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-map” 210b9288eef0df624da638b65d27291b] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-map” 210b9288eef0df624da638b65d27291b] --- if not modules then modules={} end modules ['font-map']={ version=1.001, @@ -2626,10 +5866,10 @@ function mappings.addtounicode(data,filename,checklookups,forceligatures) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-map”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-map”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-vfc” 237aff1862009b7850653c2098473bd4] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-vfc” 94937140f2c909e9c831ba021f1ab303] --- if not modules then modules={} end modules ['font-vfc']={ version=1.001, @@ -2638,7 +5878,7 @@ if not modules then modules={} end modules ['font-vfc']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local select=select +local select,type=select,type local insert=table.insert local fonts=fonts local helpers=fonts.helpers @@ -2650,7 +5890,7 @@ local dummy={ "comment" } function helpers.prependcommands(commands,...) insert(commands,1,push) for i=select("#",...),1,-1 do - local s=select(i,...) + local s=(select(i,...)) if s then insert(commands,1,s) end @@ -2662,7 +5902,29 @@ function helpers.appendcommands(commands,...) insert(commands,1,push) insert(commands,pop) for i=1,select("#",...) do - local s=select(i,...) + local s=(select(i,...)) + if s then + insert(commands,s) + end + end + return commands +end +function helpers.prependcommandtable(commands,t) + insert(commands,1,push) + for i=#t,1,-1 do + local s=t[i] + if s then + insert(commands,1,s) + end + end + insert(commands,pop) + return commands +end +function helpers.appendcommandtable(commands,t) + insert(commands,1,push) + insert(commands,pop) + for i=1,#t do + local s=t[i] if s then insert(commands,s) end @@ -2705,10 +5967,10 @@ helpers.commands=utilities.storage.allocate { dummy=dummy, } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-vfc”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-vfc”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-otr” 4a1dae571a43d7cb8afce7e906df89c6] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-otr” 2c35abf43f9a64bdd99240593d432d8a] --- if not modules then modules={} end modules ['font-otr']={ version=1.001, @@ -2719,6 +5981,7 @@ if not modules then modules={} end modules ['font-otr']={ } local next,type,tonumber=next,type,tonumber local byte,lower,char,gsub=string.byte,string.lower,string.char,string.gsub +local fullstrip=string.fullstrip local floor,round=math.floor,math.round local P,R,S,C,Cs,Cc,Ct,Carg,Cmt=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg,lpeg.Cmt local lpegmatch=lpeg.match @@ -2995,19 +6258,29 @@ local helpers={} readers.helpers=helpers local function gotodatatable(f,fontdata,tag,criterium) if criterium and f then - local datatable=fontdata.tables[tag] - if datatable then - local tableoffset=datatable.offset - setposition(f,tableoffset) - return tableoffset + local tables=fontdata.tables + if tables then + local datatable=tables[tag] + if datatable then + local tableoffset=datatable.offset + setposition(f,tableoffset) + return tableoffset + end + else + report("no tables") end end end local function reportskippedtable(f,fontdata,tag,criterium) if criterium and f then - local datatable=fontdata.tables[tag] - if datatable then - report("loading of table %a skipped",tag) + local tables=fontdata.tables + if tables then + local datatable=tables[tag] + if datatable then + report("loading of table %a skipped",tag) + end + else + report("no tables") end end end @@ -3031,6 +6304,15 @@ local platformnames={ typographicsubfamily=true, compatiblefullname=true, } +local platformextras={ + uniqueid=true, + version=true, + copyright=true, + license=true, + licenseurl=true, + manufacturer=true, + vendorurl=true, +} function readers.name(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"name",true) if tableoffset then @@ -3083,6 +6365,17 @@ function readers.name(f,fontdata,specification) local names={} local done={} local extras={} + local function decoded(platform,encoding,content) + local decoder=decoders[platform] + if decoder then + decoder=decoder[encoding] + end + if decoder then + return decoder(content) + else + return content + end + end local function filter(platform,e,l) local namelist=namelists[platform] for i=1,#namelist do @@ -3094,14 +6387,7 @@ function readers.name(f,fontdata,specification) local language=name.language if (not e or encoding==e) and (not l or language==l) then setposition(f,name.offset) - local content=readstring(f,name.length) - local decoder=decoders[platform] - if decoder then - decoder=decoder[encoding] - end - if decoder then - content=decoder(content) - end + local content=decoded(platform,encoding,readstring(f,name.length)) if nametag then names[nametag]={ content=content, @@ -3125,22 +6411,15 @@ function readers.name(f,fontdata,specification) fontdata.extras=extras if specification.platformnames then local collected={} + local platformextras=specification.platformextras and platformextras for platform,namelist in next,namelists do local filtered=false for i=1,#namelist do local entry=namelist[i] local name=entry.name - if platformnames[name] then + if platformnames[name] or (platformextras and platformextras[name]) then setposition(f,entry.offset) - local content=readstring(f,entry.length) - local encoding=entry.encoding - local decoder=decoders[platform] - if decoder then - decoder=decoder[encoding] - end - if decoder then - content=decoder(content) - end + local content=decoded(platform,entry.encoding,readstring(f,entry.length)) if filtered then filtered[name]=content else @@ -3205,7 +6484,7 @@ readers["os/2"]=function(f,fontdata) if version>=1 then windowsmetrics.codepageranges={ readulong(f),readulong(f) } end - if version>=3 then + if version>=2 then windowsmetrics.xheight=readshort(f) windowsmetrics.capheight=readshort(f) windowsmetrics.defaultchar=readushort(f) @@ -3223,10 +6502,13 @@ end readers.head=function(f,fontdata) local tableoffset=gotodatatable(f,fontdata,"head",true) if tableoffset then + local version=readulong(f) + local fontversion=readulong(f) local fontheader={ - version=readfixed(f), - revision=readfixed(f), - checksum=readulong(f), + version=version, + fontversion=number.to16dot16(fontversion), + fontversionnumber=fontversion, + checksum=readushort(f)*0x10000+readushort(f), magic=readulong(f), flags=readushort(f), units=readushort(f), @@ -3252,7 +6534,7 @@ readers.hhea=function(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"hhea",specification.details) if tableoffset then fontdata.horizontalheader={ - version=readfixed(f), + version=readulong(f), ascender=readfword(f), descender=readfword(f), linegap=readfword(f), @@ -3280,7 +6562,7 @@ readers.vhea=function(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"vhea",specification.details) if tableoffset then fontdata.verticalheader={ - version=readfixed(f), + version=readulong(f), ascender=readfword(f), descender=readfword(f), linegap=readfword(f), @@ -3307,15 +6589,15 @@ end readers.maxp=function(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"maxp",specification.details) if tableoffset then - local version=readfixed(f) + local version=readulong(f) local nofglyphs=readushort(f) fontdata.nofglyphs=nofglyphs - if version==0.5 then + if version==0x00005000 then fontdata.maximumprofile={ version=version, nofglyphs=nofglyphs, } - elseif version==1.0 then + elseif version==0x00010000 then fontdata.maximumprofile={ version=version, nofglyphs=nofglyphs, @@ -3352,7 +6634,7 @@ readers.hmtx=function(f,fontdata,specification) local leftsidebearing=0 for i=0,nofmetrics-1 do local glyph=glyphs[i] - width=readshort(f) + width=readshort(f) leftsidebearing=readshort(f) if width~=0 then glyph.width=width @@ -3398,7 +6680,7 @@ end readers.post=function(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"post",true) if tableoffset then - local version=readfixed(f) + local version=readulong(f) fontdata.postscript={ version=version, italicangle=round(1000*readfixed(f))/1000, @@ -3411,11 +6693,11 @@ readers.post=function(f,fontdata,specification) maxmemtype1=readulong(f), } if not specification.glyphs then - elseif version==1.0 then + elseif version==0x00010000 then for index=0,#standardromanencoding do glyphs[index].name=standardromanencoding[index] end - elseif version==2.0 then + elseif version==0x00020000 then local glyphs=fontdata.glyphs local nofglyphs=readushort(f) local indices={} @@ -3446,8 +6728,6 @@ readers.post=function(f,fontdata,specification) end end end - elseif version==2.5 then - elseif version==3.0 then end else fontdata.postscript={} @@ -4004,14 +7284,16 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst designsize=fontdata.designsize, minsize=fontdata.minsize, maxsize=fontdata.maxsize, + boundingbox=fontheader and { fontheader.xmin or 0,fontheader.ymin or 0,fontheader.xmax or 0,fontheader.ymax or 0 } or nil, monospaced=(tonumber(postscript.monospaced or 0)>0) or metrics.panosewidth=="monospaced", averagewidth=metrics.averagewidth, xheight=metrics.xheight, - capheight=metrics.capheight, + capheight=metrics.capheight or fontdata.maxy, ascender=metrics.typoascender, descender=metrics.typodescender, platformnames=platformnames or nil, instancenames=instancenames or nil, + tableoffsets=fontdata.tableoffsets, } if metricstoo then local keys={ @@ -4069,7 +7351,7 @@ local function loadtables(f,specification,offset) } for i=1,fontdata.noftables do local tag=lower(stripstring(readstring(f,4))) - local checksum=readulong(f) + local checksum=readushort(f)*0x10000+readushort(f) local offset=readulong(f) local length=readulong(f) if offset+length>filesize then @@ -4087,7 +7369,7 @@ local function loadtables(f,specification,offset) else fontdata.format="truetype" end - return fontdata + return fontdata,tables end local function prepareglyps(fontdata) local glyphs=setmetatableindex(function(t,k) @@ -4108,7 +7390,7 @@ local function readtable(tag,f,fontdata,specification,...) end local variablefonts_supported=(context and true) or (logs and logs.application and true) or false local function readdata(f,offset,specification) - local fontdata=loadtables(f,specification,offset) + local fontdata,tables=loadtables(f,specification,offset) if specification.glyphs then prepareglyps(fontdata) end @@ -4218,9 +7500,18 @@ local function readdata(f,offset,specification) readtable("gpos",f,fontdata,specification) readtable("math",f,fontdata,specification) fontdata.locations=nil - fontdata.tables=nil fontdata.cidmaps=nil fontdata.dictionaries=nil + if specification.tableoffsets then + fontdata.tableoffsets=tables + setmetatableindex(tables,{ + version=fontdata.version, + noftables=fontdata.noftables, + searchrange=fontdata.searchrange, + entryselector=fontdata.entryselector, + rangeshift=fontdata.rangeshift, + }) + end return fontdata end local function loadfontdata(specification) @@ -4324,7 +7615,7 @@ local function loadfont(specification,n,instance) specification.instance=specification.instance or instance end local function message(str) - report("fatal error in file %a: %s\n%s",specification.filename,str,debug.traceback()) + report("fatal error in file %a: %s\n%s",specification.filename,str,debug and debug.traceback()) end local ok,result=xpcall(loadfontdata,message,specification) if ok then @@ -4346,12 +7637,25 @@ function readers.loadshapes(filename,n,instance,streams) v.index=nil v.math=nil end + local names=fontdata.names + if names then + for k,v in next,names do + names[k]=fullstrip(v.content) + end + end end return fontdata and { filename=filename, format=fontdata.format, glyphs=fontdata.glyphs, units=fontdata.fontheader.units, + cffinfo=fontdata.cffinfo, + fontheader=fontdata.fontheader, + horizontalheader=fontdata.horizontalheader, + verticalheader=fontdata.verticalheader, + maximumprofile=fontdata.maximumprofile, + names=fontdata.names, + postscript=fontdata.postscript, } or { filename=filename, format="unknown", @@ -4403,7 +7707,7 @@ function readers.loadfont(filename,n,instance) mathconstants=fontdata.mathconstants, colorpalettes=fontdata.colorpalettes, svgshapes=fontdata.svgshapes, - sbixshapes=fontdata.sbixshapes, + pngshapes=fontdata.pngshapes, variabledata=fontdata.variabledata, foundtables=fontdata.foundtables, }, @@ -4415,10 +7719,12 @@ function readers.getinfo(filename,specification) local platformnames=false local rawfamilynames=false local instancenames=true + local tableoffsets=false if type(specification)=="table" then subfont=tonumber(specification.subfont) platformnames=specification.platformnames rawfamilynames=specification.rawfamilynames + tableoffsets=specification.tableoffsets else subfont=tonumber(specification) end @@ -4427,6 +7733,7 @@ function readers.getinfo(filename,specification) details=true, platformnames=platformnames, instancenames=true, + tableoffsets=tableoffsets, } if fontdata then local subfonts=fontdata.subfonts @@ -4486,10 +7793,10 @@ function readers.extend(fontdata) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-otr”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-otr”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-oti” 309a75f9c14b77d87e94eba827dc4e71] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-oti” dbae7722baae24d917a17176553825cf] --- if not modules then modules={} end modules ['font-oti']={ version=1.001, @@ -4632,10 +7939,10 @@ function otffeatures.checkeddefaultlanguage(featuretype,autolanguage,languages) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-oti”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-oti”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ott” b20ddcf6360a2e35e79b7bdad0289a19] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ott” 3791be083c2eccf366792dc84baee67a] --- if not modules then modules={} end modules ["font-ott"]={ version=1.001, @@ -5685,10 +8992,10 @@ function otffeatures.normalize(features) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ott”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ott”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-cff” 98e33e8b6de9990678768744247634d0] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-cff” fda3887cbaad0b82d06d3cbffdfff560] --- if not modules then modules={} end modules ['font-cff']={ version=1.001, @@ -5697,7 +9004,7 @@ if not modules then modules={} end modules ['font-cff']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local next,type,tonumber=next,type,tonumber +local next,type,tonumber,rawget=next,type,tonumber,rawget local byte,char,gmatch=string.byte,string.char,string.gmatch local concat,remove,unpack=table.concat,table.remove,table.unpack local floor,abs,round,ceil,min,max=math.floor,math.abs,math.round,math.ceil,math.min,math.max @@ -5705,6 +9012,8 @@ local P,C,R,S,C,Cs,Ct=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Ct local lpegmatch=lpeg.match local formatters=string.formatters local bytetable=string.bytetable +local idiv=number.idiv +local rshift,band,extract=bit32.rshift,bit32.band,bit32.extract local readers=fonts.handlers.otf.readers local streamreader=readers.streamreader local readstring=streamreader.readstring @@ -5899,8 +9208,25 @@ do end+P("\05")/function() result.fontbbox={ unpack(stack,1,4) } top=0 - end -+P("\13")/function() + end+P("\06")/function() + result.bluevalues={ unpack(stack,1,top) } + top=0 + end+P("\07")/function() + result.otherblues={ unpack(stack,1,top) } + top=0 + end+P("\08")/function() + result.familyblues={ unpack(stack,1,top) } + top=0 + end+P("\09")/function() + result.familyotherblues={ unpack(stack,1,top) } + top=0 + end+P("\10")/function() + result.strhw=stack[top] + top=0 + end+P("\11")/function() + result.strvw=stack[top] + top=0 + end+P("\13")/function() result.uniqueid=stack[top] top=0 end+P("\14")/function() @@ -5966,6 +9292,21 @@ do end+P("\08")/function() result.strokewidth=stack[top] top=0 + end+P("\09")/function() + result.bluescale=stack[top] + top=0 + end+P("\10")/function() + result.bluesnap=stack[top] + top=0 + end+P("\11")/function() + result.bluefuzz=stack[top] + top=0 + end+P("\12")/function() + result.stemsnaph={ unpack(stack,1,top) } + top=0 + end+P("\13")/function() + result.stemsnapv={ unpack(stack,1,top) } + top=0 end+P("\20")/function() result.syntheticbase=stack[top] top=0 @@ -6009,24 +9350,24 @@ do top=0 end ) - local p_last=P("\x0F")/"0"+P("\x1F")/"1"+P("\x2F")/"2"+P("\x3F")/"3"+P("\x4F")/"4"+P("\x5F")/"5"+P("\x6F")/"6"+P("\x7F")/"7"+P("\x8F")/"8"+P("\x9F")/"9"+P("\xAF")/""+P("\xBF")/""+P("\xCF")/""+P("\xDF")/""+P("\xEF")/""+R("\xF0\xFF")/"" local remap={ ["\x00"]="00",["\x01"]="01",["\x02"]="02",["\x03"]="03",["\x04"]="04",["\x05"]="05",["\x06"]="06",["\x07"]="07",["\x08"]="08",["\x09"]="09",["\x0A"]="0.",["\x0B"]="0E",["\x0C"]="0E-",["\x0D"]="0",["\x0E"]="0-",["\x0F"]="0", - ["\x10"]="10",["\x11"]="11",["\x12"]="12",["\x13"]="13",["\x14"]="14",["\x15"]="15",["\x16"]="16",["\x17"]="17",["\x18"]="18",["\x19"]="19",["\x1A"]="0.",["\x1B"]="0E",["\x1C"]="0E-",["\x1D"]="0",["\x1E"]="0-",["\x1F"]="0", - ["\x20"]="20",["\x21"]="21",["\x22"]="22",["\x23"]="23",["\x24"]="24",["\x25"]="25",["\x26"]="26",["\x27"]="27",["\x28"]="28",["\x29"]="29",["\x2A"]="0.",["\x2B"]="0E",["\x2C"]="0E-",["\x2D"]="0",["\x2E"]="0-",["\x2F"]="0", - ["\x30"]="30",["\x31"]="31",["\x32"]="32",["\x33"]="33",["\x34"]="34",["\x35"]="35",["\x36"]="36",["\x37"]="37",["\x38"]="38",["\x39"]="39",["\x3A"]="0.",["\x3B"]="0E",["\x3C"]="0E-",["\x3D"]="0",["\x3E"]="0-",["\x3F"]="0", - ["\x40"]="40",["\x41"]="41",["\x42"]="42",["\x43"]="43",["\x44"]="44",["\x45"]="45",["\x46"]="46",["\x47"]="47",["\x48"]="48",["\x49"]="49",["\x4A"]="0.",["\x4B"]="0E",["\x4C"]="0E-",["\x4D"]="0",["\x4E"]="0-",["\x4F"]="0", - ["\x50"]="50",["\x51"]="51",["\x52"]="52",["\x53"]="53",["\x54"]="54",["\x55"]="55",["\x56"]="56",["\x57"]="57",["\x58"]="58",["\x59"]="59",["\x5A"]="0.",["\x5B"]="0E",["\x5C"]="0E-",["\x5D"]="0",["\x5E"]="0-",["\x5F"]="0", - ["\x60"]="60",["\x61"]="61",["\x62"]="62",["\x63"]="63",["\x64"]="64",["\x65"]="65",["\x66"]="66",["\x67"]="67",["\x68"]="68",["\x69"]="69",["\x6A"]="0.",["\x6B"]="0E",["\x6C"]="0E-",["\x6D"]="0",["\x6E"]="0-",["\x6F"]="0", - ["\x70"]="70",["\x71"]="71",["\x72"]="72",["\x73"]="73",["\x74"]="74",["\x75"]="75",["\x76"]="76",["\x77"]="77",["\x78"]="78",["\x79"]="79",["\x7A"]="0.",["\x7B"]="0E",["\x7C"]="0E-",["\x7D"]="0",["\x7E"]="0-",["\x7F"]="0", - ["\x80"]="80",["\x81"]="81",["\x82"]="82",["\x83"]="83",["\x84"]="84",["\x85"]="85",["\x86"]="86",["\x87"]="87",["\x88"]="88",["\x89"]="89",["\x8A"]="0.",["\x8B"]="0E",["\x8C"]="0E-",["\x8D"]="0",["\x8E"]="0-",["\x8F"]="0", - ["\x90"]="90",["\x91"]="91",["\x92"]="92",["\x93"]="93",["\x94"]="94",["\x95"]="95",["\x96"]="96",["\x97"]="97",["\x98"]="98",["\x99"]="99",["\x9A"]="0.",["\x9B"]="0E",["\x9C"]="0E-",["\x9D"]="0",["\x9E"]="0-",["\x9F"]="0", + ["\x10"]="10",["\x11"]="11",["\x12"]="12",["\x13"]="13",["\x14"]="14",["\x15"]="15",["\x16"]="16",["\x17"]="17",["\x18"]="18",["\x19"]="19",["\x1A"]="1.",["\x1B"]="1E",["\x1C"]="1E-",["\x1D"]="1",["\x1E"]="1-",["\x1F"]="1", + ["\x20"]="20",["\x21"]="21",["\x22"]="22",["\x23"]="23",["\x24"]="24",["\x25"]="25",["\x26"]="26",["\x27"]="27",["\x28"]="28",["\x29"]="29",["\x2A"]="2.",["\x2B"]="2E",["\x2C"]="2E-",["\x2D"]="2",["\x2E"]="2-",["\x2F"]="2", + ["\x30"]="30",["\x31"]="31",["\x32"]="32",["\x33"]="33",["\x34"]="34",["\x35"]="35",["\x36"]="36",["\x37"]="37",["\x38"]="38",["\x39"]="39",["\x3A"]="3.",["\x3B"]="3E",["\x3C"]="3E-",["\x3D"]="3",["\x3E"]="3-",["\x3F"]="3", + ["\x40"]="40",["\x41"]="41",["\x42"]="42",["\x43"]="43",["\x44"]="44",["\x45"]="45",["\x46"]="46",["\x47"]="47",["\x48"]="48",["\x49"]="49",["\x4A"]="4.",["\x4B"]="4E",["\x4C"]="4E-",["\x4D"]="4",["\x4E"]="4-",["\x4F"]="4", + ["\x50"]="50",["\x51"]="51",["\x52"]="52",["\x53"]="53",["\x54"]="54",["\x55"]="55",["\x56"]="56",["\x57"]="57",["\x58"]="58",["\x59"]="59",["\x5A"]="5.",["\x5B"]="5E",["\x5C"]="5E-",["\x5D"]="5",["\x5E"]="5-",["\x5F"]="5", + ["\x60"]="60",["\x61"]="61",["\x62"]="62",["\x63"]="63",["\x64"]="64",["\x65"]="65",["\x66"]="66",["\x67"]="67",["\x68"]="68",["\x69"]="69",["\x6A"]="6.",["\x6B"]="6E",["\x6C"]="6E-",["\x6D"]="6",["\x6E"]="6-",["\x6F"]="6", + ["\x70"]="70",["\x71"]="71",["\x72"]="72",["\x73"]="73",["\x74"]="74",["\x75"]="75",["\x76"]="76",["\x77"]="77",["\x78"]="78",["\x79"]="79",["\x7A"]="7.",["\x7B"]="7E",["\x7C"]="7E-",["\x7D"]="7",["\x7E"]="7-",["\x7F"]="7", + ["\x80"]="80",["\x81"]="81",["\x82"]="82",["\x83"]="83",["\x84"]="84",["\x85"]="85",["\x86"]="86",["\x87"]="87",["\x88"]="88",["\x89"]="89",["\x8A"]="8.",["\x8B"]="8E",["\x8C"]="8E-",["\x8D"]="8",["\x8E"]="8-",["\x8F"]="8", + ["\x90"]="90",["\x91"]="91",["\x92"]="92",["\x93"]="93",["\x94"]="94",["\x95"]="95",["\x96"]="96",["\x97"]="97",["\x98"]="98",["\x99"]="99",["\x9A"]="9.",["\x9B"]="9E",["\x9C"]="9E-",["\x9D"]="9",["\x9E"]="9-",["\x9F"]="9", ["\xA0"]=".0",["\xA1"]=".1",["\xA2"]=".2",["\xA3"]=".3",["\xA4"]=".4",["\xA5"]=".5",["\xA6"]=".6",["\xA7"]=".7",["\xA8"]=".8",["\xA9"]=".9",["\xAA"]="..",["\xAB"]=".E",["\xAC"]=".E-",["\xAD"]=".",["\xAE"]=".-",["\xAF"]=".", ["\xB0"]="E0",["\xB1"]="E1",["\xB2"]="E2",["\xB3"]="E3",["\xB4"]="E4",["\xB5"]="E5",["\xB6"]="E6",["\xB7"]="E7",["\xB8"]="E8",["\xB9"]="E9",["\xBA"]="E.",["\xBB"]="EE",["\xBC"]="EE-",["\xBD"]="E",["\xBE"]="E-",["\xBF"]="E", ["\xC0"]="E-0",["\xC1"]="E-1",["\xC2"]="E-2",["\xC3"]="E-3",["\xC4"]="E-4",["\xC5"]="E-5",["\xC6"]="E-6",["\xC7"]="E-7",["\xC8"]="E-8",["\xC9"]="E-9",["\xCA"]="E-.",["\xCB"]="E-E",["\xCC"]="E-E-",["\xCD"]="E-",["\xCE"]="E--",["\xCF"]="E-", ["\xD0"]="-0",["\xD1"]="-1",["\xD2"]="-2",["\xD3"]="-3",["\xD4"]="-4",["\xD5"]="-5",["\xD6"]="-6",["\xD7"]="-7",["\xD8"]="-8",["\xD9"]="-9",["\xDA"]="-.",["\xDB"]="-E",["\xDC"]="-E-",["\xDD"]="-",["\xDE"]="--",["\xDF"]="-", } - local p_nibbles=P("\30")*Cs(((1-p_last)/remap)^0+p_last)/function(n) + local p_last=S("\x0F\x1F\x2F\x3F\x4F\x5F\x6F\x7F\x8F\x9F\xAF\xBF")+R("\xF0\xFF") + local p_nibbles=P("\30")*Cs(((1-p_last)/remap)^0*(P(1)/remap))/function(n) top=top+1 stack[top]=tonumber(n) or 0 end @@ -6647,7 +9988,7 @@ do if trace_charstrings then showstate("stem") end - stems=stems+top/2 + stems=stems+idiv(top,2) top=0 end local function getmask() @@ -6666,13 +10007,13 @@ do if trace_charstrings then showstate(operator==19 and "hintmark" or "cntrmask") end - stems=stems+top/2 + stems=stems+idiv(top,2) top=0 if stems==0 then elseif stems<=8 then return 1 else - return floor((stems+7)/8) + return idiv(stems+7,8) end end local function unsupported(t) @@ -6711,7 +10052,7 @@ do local function hsbw() if version==1 then if trace_charstrings then - showstate("dotsection") + showstate("hsbw") end width=stack[top] end @@ -6897,76 +10238,98 @@ do [036]=hflex1, [037]=flex1, } - local c_endchar=char(14) - local passon do - local rshift=bit32.rshift - local band=bit32.band - local round=math.round - local encode=table.setmetatableindex(function(t,i) - for i=-2048,-1130 do - t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF)) - end - for i=-1131,-108 do - local v=0xFB00-i-108 - t[i]=char(band(rshift(v,8),0xFF),band(v,0xFF)) - end - for i=-107,107 do - t[i]=char(i+139) - end - for i=108,1131 do - local v=0xF700+i-108 - t[i]=char(band(rshift(v,8),0xFF),band(v,0xFF)) - end - for i=1132,2048 do - t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF)) - end - return t[i] - end) - local function setvsindex() - local vsindex=stack[top] - updateregions(vsindex) - top=top-1 + local chars=setmetatableindex(function (t,k) + local v=char(k) + t[k]=v + return v + end) + local c_endchar=chars[14] + local encode={} + setmetatableindex(encode,function(t,i) + for i=-2048,-1130 do + t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF)) end - local function blend() - local n=stack[top] - top=top-1 - if not axis then - elseif n==1 then - top=top-nofregions - local v=stack[top] + for i=-1131,-108 do + local v=0xFB00-i-108 + t[i]=char(band(rshift(v,8),0xFF),band(v,0xFF)) + end + for i=-107,107 do + t[i]=chars[i+139] + end + for i=108,1131 do + local v=0xF700+i-108 + t[i]=char(extract(v,8,8),extract(v,0,8)) + end + for i=1132,2048 do + t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF)) + end + setmetatableindex(encode,function(t,k) + local r=round(k) + local v=rawget(t,r) + if v then + return v + end + local v1=floor(k) + local v2=floor((k-v1)*0x10000) + return char(255,extract(v1,8,8),extract(v1,0,8),extract(v2,8,8),extract(v2,0,8)) + end) + return t[i] + end) + readers.cffencoder=encode + local function p_setvsindex() + local vsindex=stack[top] + updateregions(vsindex) + top=top-1 + end + local function p_blend() + local n=stack[top] + top=top-1 + if not axis then + elseif n==1 then + top=top-nofregions + local v=stack[top] + for r=1,nofregions do + v=v+stack[top+r]*factors[r] + end + stack[top]=round(v) + else + top=top-nofregions*n + local d=top + local k=top-n + for i=1,n do + k=k+1 + local v=stack[k] for r=1,nofregions do - v=v+stack[top+r]*factors[r] - end - stack[top]=round(v) - else - top=top-nofregions*n - local d=top - local k=top-n - for i=1,n do - k=k+1 - local v=stack[k] - for r=1,nofregions do - v=v+stack[d+r]*factors[r] - end - stack[k]=round(v) - d=d+nofregions + v=v+stack[d+r]*factors[r] end + stack[k]=round(v) + d=d+nofregions end end - passon=function(operation) - if operation==15 then - setvsindex() - elseif operation==16 then - blend() - else - for i=1,top do - r=r+1 - result[r]=encode[stack[i]] - end - r=r+1 - result[r]=char(operation) - top=0 - end + end + local function p_getstem() + local n=0 + if top%2~=0 then + n=1 + end + if top>n then + stems=stems+idiv(top-n,2) + end + end + local function p_getmask() + local n=0 + if top%2~=0 then + n=1 + end + if top>n then + stems=stems+idiv(top-n,2) + end + if stems==0 then + return 0 + elseif stems<=8 then + return 1 + else + return idiv(stems+7,8) end end local process @@ -7054,19 +10417,90 @@ do elseif t==12 then i=i+1 local t=tab[i] - local a=subactions[t] - if a then - a(t) + if justpass then + if t>=34 or t<=37 then + for i=1,top do + r=r+1;result[r]=encode[stack[i]] + end + r=r+1;result[r]=chars[12] + r=r+1;result[r]=chars[t] + top=0 + else + local a=subactions[t] + if a then + a(t) + else + top=0 + end + end else - if trace_charstrings then - showvalue("<subaction>",t) + local a=subactions[t] + if a then + a(t) + else + if trace_charstrings then + showvalue("<subaction>",t) + end + top=0 end - top=0 end i=i+1 elseif justpass then - passon(t) - i=i+1 + if t==15 then + p_setvsindex() + i=i+1 + elseif t==16 then + local s=p_blend() or 0 + i=i+s+1 + elseif t==1 or t==3 or t==18 or operation==23 then + p_getstem() +if true then + if top>0 then + for i=1,top do + r=r+1;result[r]=encode[stack[i]] + end + top=0 + end + r=r+1;result[r]=chars[t] +else + top=0 +end + i=i+1 + elseif t==19 or t==20 then + local s=p_getmask() or 0 +if true then + if top>0 then + for i=1,top do + r=r+1;result[r]=encode[stack[i]] + end + top=0 + end + r=r+1;result[r]=chars[t] + for j=1,s do + i=i+1 + r=r+1;result[r]=chars[tab[i]] + end +else + i=i+s + top=0 +end + i=i+1 + elseif t==9 then + top=0 + i=i+1 + elseif t==13 then + local s=hsbw() or 0 + i=i+s+1 + else + if top>0 then + for i=1,top do + r=r+1;result[r]=encode[stack[i]] + end + top=0 + end + r=r+1;result[r]=chars[t] + i=i+1 + end else local a=actions[t] if a then @@ -7087,18 +10521,20 @@ do end end local function setbias(globals,locals) - if version==1 then - return - false, - false - else local g,l=#globals,#locals return ((g<1240 and 107) or (g<33900 and 1131) or 32768)+1, ((l<1240 and 107) or (l<33900 and 1131) or 32768)+1 - end end local function processshape(tab,index) + if not tab then + glyphs[index]={ + boundingbox={ 0,0,0,0 }, + width=0, + name=charset and charset[index] or nil, + } + return + end tab=bytetable(tab) x=0 y=0 @@ -7211,15 +10647,18 @@ do glyphs=glphs or {} globalbias,localbias=setbias(globals,locals) nominalwidth,defaultwidth=setwidths(dictionary.private) - startparsing(fontdata,data,streams) - for index=1,#charstrings do - processshape(charstrings[index],index-1) - charstrings[index]=nil + if charstrings then + startparsing(fontdata,data,streams) + for index=1,#charstrings do + processshape(charstrings[index],index-1) + end + stopparsing(fontdata,data) + else + report("no charstrings") end - stopparsing(fontdata,data) return glyphs end - parsecharstring=function(fontdata,data,dictionary,tab,glphs,index,doshapes,tversion) + parsecharstring=function(fontdata,data,dictionary,tab,glphs,index,doshapes,tversion,streams) keepcurve=doshapes version=tversion strings=data.strings @@ -7228,6 +10667,7 @@ do charset=false vsindex=dictionary.vsindex or 0 glyphs=glphs or {} + justpass=streams==true globalbias,localbias=setbias(globals,locals) nominalwidth,defaultwidth=setwidths(dictionary.private) processshape(tab,index-1) @@ -7381,7 +10821,7 @@ local function readfdselect(f,fontdata,data,glyphs,doshapes,version,streams) local format=readbyte(f) if format==1 then for i=0,nofglyphs do - local index=readbyte(i) + local index=readbyte(f) fdindex[i]=index if index>maxindex then maxindex=index @@ -7410,30 +10850,33 @@ local function readfdselect(f,fontdata,data,glyphs,doshapes,version,streams) end if maxindex>=0 then local cidarray=cid.fdarray - setposition(f,header.offset+cidarray) - local dictionaries=readlengths(f) - for i=1,#dictionaries do - dictionaries[i]=readstring(f,dictionaries[i]) - end - parsedictionaries(data,dictionaries) - cid.dictionaries=dictionaries - readcidprivates(f,data) - for i=1,#dictionaries do - readlocals(f,data,dictionaries[i]) - end - startparsing(fontdata,data,streams) - for i=1,#charstrings do - parsecharstring(fontdata,data,dictionaries[fdindex[i]+1],charstrings[i],glyphs,i,doshapes,version) - charstrings[i]=nil + if cidarray then + setposition(f,header.offset+cidarray) + local dictionaries=readlengths(f) + for i=1,#dictionaries do + dictionaries[i]=readstring(f,dictionaries[i]) + end + parsedictionaries(data,dictionaries) + cid.dictionaries=dictionaries + readcidprivates(f,data) + for i=1,#dictionaries do + readlocals(f,data,dictionaries[i]) + end + startparsing(fontdata,data,streams) + for i=1,#charstrings do + parsecharstring(fontdata,data,dictionaries[fdindex[i]+1],charstrings[i],glyphs,i,doshapes,version,streams) + end + stopparsing(fontdata,data) + else + report("no cid array") end - stopparsing(fontdata,data) end end local gotodatatable=readers.helpers.gotodatatable local function cleanup(data,dictionaries) end function readers.cff(f,fontdata,specification) - local tableoffset=gotodatatable(f,fontdata,"cff",specification.details) + local tableoffset=gotodatatable(f,fontdata,"cff",specification.details or specification.glyphs) if tableoffset then local header=readheader(f) if header.major~=1 then @@ -7454,14 +10897,16 @@ function readers.cff(f,fontdata,specification) parsedictionaries(data,dictionaries,"cff") local dic=dictionaries[1] local cid=dic.cid - fontdata.cffinfo={ - familynamename=dic.familyname, + local cffinfo={ + familyname=dic.familyname, fullname=dic.fullname, boundingbox=dic.boundingbox, weight=dic.weight, italicangle=dic.italicangle, underlineposition=dic.underlineposition, underlinethickness=dic.underlinethickness, + defaultwidth=dic.defaultwidthx, + nominalwidth=dic.nominalwidthx, monospaced=dic.monospaced, } fontdata.cidinfo=cid and { @@ -7469,12 +10914,30 @@ function readers.cff(f,fontdata,specification) ordering=cid.ordering, supplement=cid.supplement, } - if specification.glyphs then - local all=specification.shapes or false + fontdata.cffinfo=cffinfo + local all=specification.shapes or specification.streams or false + if specification.glyphs or all then if cid and cid.fdselect then - readfdselect(f,fontdata,data,glyphs,all,"cff") + readfdselect(f,fontdata,data,glyphs,all,"cff",specification.streams) else - readnoselect(f,fontdata,data,glyphs,all,"cff") + readnoselect(f,fontdata,data,glyphs,all,"cff",specification.streams) + end + end + local private=dic.private + if private then + local data=private.data + if type(data)=="table" then + cffinfo.defaultwidth=data.defaultwidth or cffinfo.defaultwidth + cffinfo.nominalwidth=data.nominalwidth or cffinfo.nominalwidth + cffinfo.bluevalues=data.bluevalues + cffinfo.otherblues=data.otherblues + cffinfo.familyblues=data.familyblues + cffinfo.familyotherblues=data.familyotherblues + cffinfo.bluescale=data.bluescale + cffinfo.blueshift=data.blueshift + cffinfo.bluefuzz=data.bluefuzz + cffinfo.stdhw=data.stdhw + cffinfo.stdvw=data.stdvw end end cleanup(data,dictionaries) @@ -7508,7 +10971,7 @@ function readers.cff2(f,fontdata,specification) end data.factors=specification.factors local cid=data.dictionaries[1].cid - local all=specification.shapes or false + local all=specification.shapes or specification.streams or false if cid and cid.fdselect then readfdselect(f,fontdata,data,glyphs,all,"cff2",specification.streams) else @@ -7538,7 +11001,7 @@ function readers.cffcheck(filename) dictionaries=dictionaries, strings=strings, glyphs=glyphs, - nofglyphs=4, + nofglyphs=0, } parsedictionaries(data,dictionaries,"cff") local cid=data.dictionaries[1].cid @@ -7551,10 +11014,10 @@ function readers.cffcheck(filename) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-cff”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-cff”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ttf” ff587471f4297aa8ba0fa022609adc6e] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ttf” fe1b771df5d6442a10fcfa1388f3eed2] --- if not modules then modules={} end modules ['font-ttf']={ version=1.001, @@ -7566,8 +11029,10 @@ if not modules then modules={} end modules ['font-ttf']={ local next,type,unpack=next,type,unpack local band,rshift=bit32.band,bit32.rshift local sqrt,round=math.sqrt,math.round -local char=string.char +local char,rep=string.char,string.rep local concat=table.concat +local idiv=number.idiv +local setmetatableindex=table.setmetatableindex local report=logs.reporter("otf reader","ttf") local trace_deltas=false local readers=fonts.handlers.otf.readers @@ -7632,22 +11097,41 @@ local function mergecomposites(glyphs,shapes) local yscale=matrix[4] local xoffset=matrix[5] local yoffset=matrix[6] - for i=1,#subpoints do - local p=subpoints[i] - local x=p[1] - local y=p[2] - nofpoints=nofpoints+1 - points[nofpoints]={ - xscale*x+xrotate*y+xoffset, - yscale*y+yrotate*x+yoffset, - p[3] - } + local count=#subpoints + if xscale==1 and yscale==1 and xrotate==0 and yrotate==0 then + for i=1,count do + local p=subpoints[i] + nofpoints=nofpoints+1 + points[nofpoints]={ + p[1]+xoffset, + p[2]+yoffset, + p[3] + } + end + else + for i=1,count do + local p=subpoints[i] + local x=p[1] + local y=p[2] + nofpoints=nofpoints+1 + points[nofpoints]={ + xscale*x+xrotate*y+xoffset, + yscale*y+yrotate*x+yoffset, + p[3] + } + end end - for i=1,#subcontours do + local subcount=#subcontours + if subcount==1 then nofcontours=nofcontours+1 - contours[nofcontours]=offset+subcontours[i] + contours[nofcontours]=offset+subcontours[1] + else + for i=1,#subcontours do + nofcontours=nofcontours+1 + contours[nofcontours]=offset+subcontours[i] + end end - offset=offset+#subpoints + offset=offset+count else report("missing contours composite %s, component %s of %s, glyph %s",index,i,#components,subindex) end @@ -7657,7 +11141,7 @@ local function mergecomposites(glyphs,shapes) shape.components=nil return contours,points end - for index=1,#glyphs do + for index=0,#glyphs-1 do local shape=shapes[index] if shape then local components=shape.components @@ -7667,7 +11151,7 @@ local function mergecomposites(glyphs,shapes) end end end -local function readnothing(f,nofcontours) +local function readnothing(f) return { type="nothing", } @@ -7761,8 +11245,8 @@ local function applyaxis(glyph,shape,deltas,dowidth) end end local quadratic=false -local function contours2outlines_normal(glyphs,shapes) - for index=1,#glyphs do +local function contours2outlines_normal(glyphs,shapes) + for index=0,#glyphs-1 do local shape=shapes[index] if shape then local glyph=glyphs[index] @@ -7877,7 +11361,7 @@ local function contours2outlines_normal(glyphs,shapes) end end local function contours2outlines_shaped(glyphs,shapes,keepcurve) - for index=1,#glyphs do + for index=0,#glyphs-1 do local shape=shapes[index] if shape then local glyph=glyphs[index] @@ -8056,115 +11540,128 @@ local function toshort(n) end return char(band(rshift(n,8),0xFF),band(n,0xFF)) end +local chars=setmetatableindex(function(t,k) + for i=0,255 do local v=char(i) t[i]=v end return t[k] +end) local function repackpoints(glyphs,shapes) local noboundingbox={ 0,0,0,0 } local result={} - for index=1,#glyphs do + local xpoints={} + local ypoints={} + for index=0,#glyphs-1 do local shape=shapes[index] if shape then local r=0 local glyph=glyphs[index] - if false then - else - local contours=shape.contours - local nofcontours=contours and #contours or 0 - local boundingbox=glyph.boundingbox or noboundingbox - r=r+1 result[r]=toshort(nofcontours) - r=r+1 result[r]=toshort(boundingbox[1]) - r=r+1 result[r]=toshort(boundingbox[2]) - r=r+1 result[r]=toshort(boundingbox[3]) - r=r+1 result[r]=toshort(boundingbox[4]) - if nofcontours>0 then - for i=1,nofcontours do - r=r+1 result[r]=toshort(contours[i]-1) - end - r=r+1 result[r]=s_zero - local points=shape.points - local currentx=0 - local currenty=0 - local xpoints={} - local ypoints={} - local x=0 - local y=0 - local lastflag=nil - local nofflags=0 - for i=1,#points do - local pt=points[i] - local px=pt[1] - local py=pt[2] - local fl=pt[3] and 0x01 or 0x00 - if px==currentx then - fl=fl+0x10 + local contours=shape.contours + local nofcontours=contours and #contours or 0 + local boundingbox=glyph.boundingbox or noboundingbox + r=r+1 result[r]=toshort(nofcontours) + r=r+1 result[r]=toshort(boundingbox[1]) + r=r+1 result[r]=toshort(boundingbox[2]) + r=r+1 result[r]=toshort(boundingbox[3]) + r=r+1 result[r]=toshort(boundingbox[4]) + if nofcontours>0 then + for i=1,nofcontours do + r=r+1 result[r]=toshort(contours[i]-1) + end + r=r+1 result[r]=s_zero + local points=shape.points + local currentx=0 + local currenty=0 + local x=0 + local y=0 + local lastflag=nil + local nofflags=0 + for i=1,#points do + local pt=points[i] + local px=pt[1] + local py=pt[2] + local fl=pt[3] and 0x01 or 0x00 + if px==currentx then + fl=fl+0x10 + else + local dx=round(px-currentx) + x=x+1 + if dx<-255 or dx>255 then + xpoints[x]=toshort(dx) + elseif dx<0 then + fl=fl+0x02 + xpoints[x]=chars[-dx] + elseif dx>0 then + fl=fl+0x12 + xpoints[x]=chars[dx] else - local dx=round(px-currentx) - if dx<-255 or dx>255 then - x=x+1 xpoints[x]=toshort(dx) - elseif dx<0 then - fl=fl+0x02 - x=x+1 xpoints[x]=char(-dx) - elseif dx>0 then - fl=fl+0x12 - x=x+1 xpoints[x]=char(dx) - else - fl=fl+0x02 - x=x+1 xpoints[x]=c_zero - end + fl=fl+0x02 + xpoints[x]=c_zero end - if py==currenty then - fl=fl+0x20 + end + if py==currenty then + fl=fl+0x20 + else + local dy=round(py-currenty) + y=y+1 + if dy<-255 or dy>255 then + ypoints[y]=toshort(dy) + elseif dy<0 then + fl=fl+0x04 + ypoints[y]=chars[-dy] + elseif dy>0 then + fl=fl+0x24 + ypoints[y]=chars[dy] else - local dy=round(py-currenty) - if dy<-255 or dy>255 then - y=y+1 ypoints[y]=toshort(dy) - elseif dy<0 then - fl=fl+0x04 - y=y+1 ypoints[y]=char(-dy) - elseif dy>0 then - fl=fl+0x24 - y=y+1 ypoints[y]=char(dy) - else - fl=fl+0x04 - y=y+1 ypoints[y]=c_zero - end + fl=fl+0x04 + ypoints[y]=c_zero end - currentx=px - currenty=py - if lastflag==fl then - nofflags=nofflags+1 - else - if nofflags==1 then - r=r+1 result[r]=char(lastflag) - elseif nofflags==2 then - r=r+1 result[r]=char(lastflag,lastflag) - elseif nofflags>2 then - lastflag=lastflag+0x08 - r=r+1 result[r]=char(lastflag,nofflags-1) - end - nofflags=1 - lastflag=fl - end - end - if nofflags==1 then - r=r+1 result[r]=char(lastflag) - elseif nofflags==2 then - r=r+1 result[r]=char(lastflag,lastflag) - elseif nofflags>2 then - lastflag=lastflag+0x08 - r=r+1 result[r]=char(lastflag,nofflags-1) end - r=r+1 result[r]=concat(xpoints) - r=r+1 result[r]=concat(ypoints) + currentx=px + currenty=py + if lastflag==fl then + nofflags=nofflags+1 + else + if nofflags==1 then + r=r+1 result[r]=chars[lastflag] + elseif nofflags==2 then + r=r+1 result[r]=char(lastflag,lastflag) + elseif nofflags>2 then + lastflag=lastflag+0x08 + r=r+1 result[r]=char(lastflag,nofflags-1) + end + nofflags=1 + lastflag=fl + end + end + if nofflags==1 then + r=r+1 result[r]=chars[lastflag] + elseif nofflags==2 then + r=r+1 result[r]=char(lastflag,lastflag) + elseif nofflags>2 then + lastflag=lastflag+0x08 + r=r+1 result[r]=char(lastflag,nofflags-1) + end + r=r+1 result[r]=concat(xpoints,"",1,x) + r=r+1 result[r]=concat(ypoints,"",1,y) + end + local stream=concat(result,"",1,r) + local length=#stream + local padding=idiv(length+3,4)*4-length + if padding>0 then + if padding==1 then + padding="\0" + elseif padding==2 then + padding="\0\0" + else + padding="\0\0\0" end + padding=stream..padding end - glyph.stream=concat(result,"",1,r) - else + glyph.stream=stream end end end +local flags={} local function readglyph(f,nofcontours) local points={} - local instructions={} - local flags={} local contours={} for i=1,nofcontours do contours[i]=readshort(f)+1 @@ -8177,9 +11674,15 @@ local function readglyph(f,nofcontours) local flag=readbyte(f) flags[i]=flag if band(flag,0x08)~=0 then - for j=1,readbyte(f) do + local n=readbyte(f) + if n==1 then i=i+1 flags[i]=flag + else + for j=1,n do + i=i+1 + flags[i]=flag + end end end i=i+1 @@ -8187,15 +11690,13 @@ local function readglyph(f,nofcontours) local x=0 for i=1,nofpoints do local flag=flags[i] - local short=band(flag,0x02)~=0 - local same=band(flag,0x10)~=0 - if short then - if same then + if band(flag,0x02)~=0 then + if band(flag,0x10)~=0 then x=x+readbyte(f) else x=x-readbyte(f) end - elseif same then + elseif band(flag,0x10)~=0 then else x=x+readshort(f) end @@ -8204,15 +11705,13 @@ local function readglyph(f,nofcontours) local y=0 for i=1,nofpoints do local flag=flags[i] - local short=band(flag,0x04)~=0 - local same=band(flag,0x20)~=0 - if short then - if same then + if band(flag,0x04)~=0 then + if band(flag,0x20)~=0 then y=y+readbyte(f) else y=y-readbyte(f) end - elseif same then + elseif band(flag,0x20)~=0 then else y=y+readshort(f) end @@ -8295,7 +11794,7 @@ local function readcomposite(f) if band(flags,0x0100)~=0 then instructions=true end - if not band(flags,0x0020)~=0 then + if band(flags,0x0020)==0 then break end end @@ -8310,21 +11809,27 @@ function readers.loca(f,fontdata,specification) if datatable then local offset=fontdata.tables.glyf.offset local format=fontdata.fontheader.indextolocformat + local profile=fontdata.maximumprofile + local nofglyphs=profile and profile.nofglyphs local locations={} setposition(f,datatable.offset) if format==1 then - local nofglyphs=datatable.length/4-2 + if not nofglyphs then + nofglyphs=idiv(datatable.length,4)-1 + end for i=0,nofglyphs do locations[i]=offset+readulong(f) end fontdata.nofglyphs=nofglyphs else - local nofglyphs=datatable.length/2-2 + if not nofglyphs then + nofglyphs=idiv(datatable.length,2)-1 + end for i=0,nofglyphs do locations[i]=offset+readushort(f)*2 end - fontdata.nofglyphs=nofglyphs end + fontdata.nofglyphs=nofglyphs fontdata.locations=locations end end @@ -8339,15 +11844,16 @@ function readers.glyf(f,fontdata,specification) local filesize=fontdata.filesize local nothing={ 0,0,0,0 } local shapes={} - local loadshapes=specification.shapes or specification.instance - for index=0,nofglyphs do + local loadshapes=specification.shapes or specification.instance or specification.streams + for index=0,nofglyphs-1 do local location=locations[index] + local length=locations[index+1]-location if location>=filesize then report("discarding %s glyphs due to glyph location bug",nofglyphs-index+1) fontdata.nofglyphs=index-1 fontdata.badfont=true break - elseif location>0 then + elseif length>0 then setposition(f,location) local nofcontours=readshort(f) glyphs[index].boundingbox={ @@ -8358,7 +11864,7 @@ function readers.glyf(f,fontdata,specification) } if not loadshapes then elseif nofcontours==0 then - shapes[index]=readnothing(f,nofcontours) + shapes[index]=readnothing(f) elseif nofcontours>0 then shapes[index]=readglyph(f,nofcontours) else @@ -8366,7 +11872,7 @@ function readers.glyf(f,fontdata,specification) end else if loadshapes then - shapes[index]={} + shapes[index]=readnothing(f) end glyphs[index].boundingbox=nothing end @@ -8383,7 +11889,13 @@ function readers.glyf(f,fontdata,specification) contours2outlines_shaped(glyphs,shapes,specification.shapes) end elseif specification.shapes then - contours2outlines_normal(glyphs,shapes) + if specification.streams then + repackpoints(glyphs,shapes) + else + contours2outlines_normal(glyphs,shapes) + end + elseif specification.streams then + repackpoints(glyphs,shapes) end end end @@ -8645,10 +12157,10 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ttf”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ttf”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-dsp” cb8138a91cfbe562467821c5e0c2568e] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-dsp” 7959312318af6ed8fbd9edbeb2b1a335] --- if not modules then modules={} end modules ['font-dsp']={ version=1.001, @@ -8685,10 +12197,11 @@ local readers=fonts.handlers.otf.readers local streamreader=readers.streamreader local setposition=streamreader.setposition local getposition=streamreader.getposition -local readushort=streamreader.readcardinal2 -local readulong=streamreader.readcardinal4 +local readuinteger=streamreader.readcardinal1 +local readushort=streamreader.readcardinal2 +local readulong=streamreader.readcardinal4 local readinteger=streamreader.readinteger1 -local readshort=streamreader.readinteger2 +local readshort=streamreader.readinteger2 local readstring=streamreader.readstring local readtag=streamreader.readtag local readbytes=streamreader.readbytes @@ -8708,6 +12221,7 @@ directives.register("fonts.streamreader",function() streamreader=utilities.streams setposition=streamreader.setposition getposition=streamreader.getposition + readuinteger=streamreader.readcardinal1 readushort=streamreader.readcardinal2 readulong=streamreader.readcardinal4 readinteger=streamreader.readinteger1 @@ -10597,7 +14111,7 @@ do end local function loadvariations(f,fontdata,variationsoffset,lookuptypes,featurehash,featureorder) setposition(f,variationsoffset) - local version=readulong(f) + local version=readulong(f) local nofrecords=readulong(f) local records={} for i=1,nofrecords do @@ -11304,59 +14818,269 @@ function readers.sbix(f,fontdata,specification) for i=1,nofstrikes do strikes[i]=readulong(f) end + local shapes={} + local done=0 + for i=1,nofstrikes do + local strikeoffset=strikes[i]+tableoffset + setposition(f,strikeoffset) + strikes[i]={ + ppem=readushort(f), + ppi=readushort(f), + offset=strikeoffset + } + end + sort(strikes,function(a,b) + if b.ppem==a.ppem then + return b.ppi<a.ppi + else + return b.ppem<a.ppem + end + end) + local glyphs={} + for i=1,nofstrikes do + local strike=strikes[i] + local strikeppem=strike.ppem + local strikeppi=strike.ppi + local strikeoffset=strike.offset + setposition(f,strikeoffset) + for i=0,nofglyphs do + glyphs[i]=readulong(f) + end + local glyphoffset=glyphs[0] + for i=0,nofglyphs-1 do + local nextoffset=glyphs[i+1] + if not shapes[i] then + local datasize=nextoffset-glyphoffset + if datasize>0 then + setposition(f,strikeoffset+glyphoffset) + shapes[i]={ + x=readshort(f), + y=readshort(f), + tag=readtag(f), + data=readstring(f,datasize-8), + ppem=strikeppem, + ppi=strikeppi, + } + done=done+1 + if done==nofglyphs then + break + end + end + end + glyphoffset=nextoffset + end + end + fontdata.pngshapes=shapes + end +end +do + local function getmetrics(f) + return { + ascender=readinteger(f), + descender=readinteger(f), + widthmax=readuinteger(f), + caretslopedumerator=readinteger(f), + caretslopedenominator=readinteger(f), + caretoffset=readinteger(f), + minorigin=readinteger(f), + minadvance=readinteger(f), + maxbefore=readinteger(f), + minafter=readinteger(f), + pad1=readinteger(f), + pad2=readinteger(f), + } + end + local function getbigmetrics(f) + return { + height=readuinteger(f), + width=readuinteger(f), + horiBearingX=readinteger(f), + horiBearingY=readinteger(f), + horiAdvance=readuinteger(f), + vertBearingX=readinteger(f), + vertBearingY=readinteger(f), + vertAdvance=readuinteger(f), + } + end + local function getsmallmetrics(f) + return { + height=readuinteger(f), + width=readuinteger(f), + bearingX=readinteger(f), + bearingY=readinteger(f), + advance=readuinteger(f), + } + end + function readers.cblc(f,fontdata,specification) + local ctdttableoffset=gotodatatable(f,fontdata,"cbdt",specification.glyphs) + if not ctdttableoffset then + return + end + local cblctableoffset=gotodatatable(f,fontdata,"cblc",specification.glyphs) + if cblctableoffset then + local majorversion=readushort(f) + local minorversion=readushort(f) + local nofsizetables=readulong(f) + local sizetables={} local shapes={} - local done=0 - for i=1,nofstrikes do - local strikeoffset=strikes[i]+tableoffset - setposition(f,strikeoffset) - strikes[i]={ - ppem=readushort(f), - ppi=readushort(f), - offset=strikeoffset + local subtables={} + for i=1,nofsizetables do + sizetables[i]={ + subtables=readulong(f), + indexsize=readulong(f), + nofsubtables=readulong(f), + colorref=readulong(f), + hormetrics=getmetrics(f), + vermetrics=getmetrics(f), + firstindex=readushort(f), + lastindex=readushort(f), + ppemx=readbyte(f), + ppemy=readbyte(f), + bitdepth=readbyte(f), + flags=readbyte(f), } end - sort(strikes,function(a,b) - if b.ppem==a.ppem then - return b.ppi<a.ppi + sort(sizetables,function(a,b) + if b.ppemx==a.ppemx then + return b.bitdepth<a.bitdepth else - return b.ppem<a.ppem + return b.ppemx<a.ppemx end end) - local glyphs={} - for i=1,nofstrikes do - local strike=strikes[i] - local strikeppem=strike.ppem - local strikeppi=strike.ppi - local strikeoffset=strike.offset - setposition(f,strikeoffset) - for i=0,nofglyphs do - glyphs[i]=readulong(f) - end - local glyphoffset=glyphs[0] - for i=0,nofglyphs-1 do - local nextoffset=glyphs[i+1] - if not shapes[i] then - local datasize=nextoffset-glyphoffset - if datasize>0 then - setposition(f,strikeoffset+glyphoffset) - shapes[i]={ - x=readshort(f), - y=readshort(f), - tag=readtag(f), - data=readstring(f,datasize-8), - ppem=strikeppem, - ppi=strikeppi, - } - done=done+1 - if done==nofglyphs then - break + for i=1,nofsizetables do + local s=sizetables[i] + local d=false + for j=s.firstindex,s.lastindex do + if not shapes[j] then + shapes[j]=i + d=true + end + end + if d then + s.used=true + end + end + for i=1,nofsizetables do + local s=sizetables[i] + if s.used then + local offset=s.subtables + setposition(f,cblctableoffset+offset) + for j=1,s.nofsubtables do + local firstindex=readushort(f) + local lastindex=readushort(f) + local tableoffset=readulong(f)+offset + for k=firstindex,lastindex do + if shapes[k]==i then + local s=subtables[tableoffset] + if not s then + s={ + firstindex=firstindex, + lastindex=lastindex, + } + subtables[tableoffset]=s + end + shapes[k]=s end end end - glyphoffset=nextoffset end end - fontdata.sbixshapes=shapes + for offset,subtable in sortedhash(subtables) do + local tabletype=readushort(f) + subtable.format=readushort(f) + local baseoffset=readulong(f)+ctdttableoffset + local offsets={} + local metrics=nil + if tabletype==1 then + for i=subtable.firstindex,subtable.lastindex do + offsets[i]=readulong(f)+baseoffset + end + skipbytes(f,4) + elseif tabletype==2 then + local size=readulong(f) + local done=baseoffset + metrics=getbigmetrics(f) + for i=subtable.firstindex,subtable.lastindex do + offsets[i]=done + done=done+size + end + elseif tabletype==3 then + local n=subtable.lastindex-subtable.firstindex+2 + for i=subtable.firstindex,subtable.lastindex do + offsets[i]=readushort(f)+baseoffset + end + if math.odd(n) then + skipbytes(f,4) + else + skipbytes(f,2) + end + elseif tabletype==4 then + for i=1,readulong(f) do + offsets[readushort(f)]=readushort(f)+baseoffset + end + elseif tabletype==5 then + local size=readulong(f) + local done=baseoffset + metrics=getbigmetrics(f) + local n=readulong(f) + for i=1,n do + offsets[readushort(f)]=done + done=done+size + end + if math.odd(n) then + skipbytes(f,2) + end + else + return + end + subtable.offsets=offsets + subtable.metrics=metrics + end + local default={ width=0,height=0 } + local glyphs=fontdata.glyphs + for index,subtable in sortedhash(shapes) do + if type(subtable)=="table" then + local data=nil + local metrics=default + local format=subtable.format + local offset=subtable.offsets[index] + setposition(f,offset) + if format==17 then + metrics=getsmallmetrics(f) + data=readstring(f,readulong(f)) + elseif format==18 then + metrics=getbigmetrics(f) + data=readstring(f,readulong(f)) + elseif format==19 then + metrics=subtable.metrics + data=readstring(f,readulong(f)) + else + end + local x=metrics.width + local y=metrics.height + shapes[index]={ + x=x, + y=y, + data=data, + } + local glyph=glyphs[index] + if not glyph.boundingbox then + local width=glyph.width + local height=width*y/x + glyph.boundingbox={ 0,0,width,height } + end + else + shapes[index]={ + x=0, + y=0, + data="", + } + end + end + fontdata.pngshapes=shapes + end + end + function readers.cbdt(f,fontdata,specification) end end function readers.stat(f,fontdata,specification) @@ -11466,8 +15190,7 @@ function readers.avar(f,fontdata,specification) end return false end - local majorversion=readushort(f) - local minorversion=readushort(f) + local version=readulong(f) local reserved=readushort(f) local nofaxis=readushort(f) local segments={} @@ -11659,10 +15382,10 @@ function readers.mvar(f,fontdata,specification) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-dsp”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-dsp”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-oup” 47feebddec74254caed369aa83f75dff] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-oup” 26b481cd9efebf7047810800930dff58] --- if not modules then modules={} end modules ['font-oup']={ version=1.001, @@ -12358,7 +16081,7 @@ local function unifymissing(fontdata) fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups) resources.unicodes=nil end -local firstprivate=fonts.privateoffsets.textbase or 0xF0000 +local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000 local puafirst=0xE000 local pualast=0xF8FF local function unifyglyphs(fontdata,usenames) @@ -14283,10 +18006,10 @@ function readers.expand(data) expandlookups(sublookups) end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-oup”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-oup”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-otl” 40cdceeb682bac55b4a69465b76bcc33] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-otl” 0836c8396cae2bcfd4020186e5e8d7e0] --- if not modules then modules={} end modules ['font-otl']={ version=1.001, @@ -14314,13 +18037,13 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_de local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf -otf.version=3.106 +otf.version=3.107 otf.cache=containers.define("fonts","otl",otf.version,true) otf.svgcache=containers.define("fonts","svg",otf.version,true) -otf.sbixcache=containers.define("fonts","sbix",otf.version,true) +otf.pngcache=containers.define("fonts","png",otf.version,true) otf.pdfcache=containers.define("fonts","pdf",otf.version,true) otf.svgenabled=false -otf.sbixenabled=false +otf.pngenabled=false local otfreaders=otf.readers local hashes=fonts.hashes local definers=fonts.definers @@ -14388,7 +18111,7 @@ function otf.load(filename,sub,instance) report_otf("forced reload of %a due to hard coded flag",filename) reload=true end - if reload then + if reload then report_otf("loading %a, hash %a",filename,hash) starttiming(otfreaders,true) data=otfreaders.loadfont(filename,sub or 1,instance) @@ -14396,7 +18119,7 @@ function otf.load(filename,sub,instance) local used=checkmemory() local resources=data.resources local svgshapes=resources.svgshapes - local sbixshapes=resources.sbixshapes + local pngshapes=resources.pngshapes if cleanup==0 then checkmemory(used,threshold,tracememory) end @@ -14419,15 +18142,15 @@ function otf.load(filename,sub,instance) checkmemory(used,threshold,tracememory) end end - if sbixshapes then - resources.sbixshapes=nil - if otf.sbixenabled then + if pngshapes then + resources.pngshapes=nil + if otf.pngenabled then local timestamp=os.date() - containers.write(otf.sbixcache,hash,{ - sbixshapes=sbixshapes, + containers.write(otf.pngcache,hash,{ + pngshapes=pngshapes, timestamp=timestamp, }) - data.properties.sbix={ + data.properties.png={ hash=hash, timestamp=timestamp, } @@ -14989,10 +18712,10 @@ otf.coverup={ end } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-otl”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-otl”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-oto” 6ba2e73177b18007e74de324c324806c] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-oto” 6ba2e73177b18007e74de324c324806c] --- if not modules then modules={} end modules ['font-oto']={ version=1.001, @@ -15445,10 +19168,10 @@ registerotffeature { } otf.basemodeinitializer=featuresinitializer -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-oto”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-oto”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-otj” 578448ae37a167319dbccd5af04738da] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-otj” 91f45161817b7e8e33ad1d1b68e35fdb] --- if not modules then modules={} end modules ['font-otj']={ version=1.001, @@ -16905,10 +20628,10 @@ function injections.handler(head,where) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-otj”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-otj”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ota” d883cf661bb8c27bfa9b7cc66420c1ed] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ota” 1b2feab42ed8081933768c1e3ef7d103] --- if not modules then modules={} end modules ['font-ota']={ version=1.001, @@ -17286,10 +21009,10 @@ directives.register("otf.analyze.useunicodemarks",function(v) analyzers.useunicodemarks=v end) -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ota”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ota”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ots” 624f23e63b7430a51212c8824d09924f] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ots” ca923deced1ed4cdd86e66acdb9e6420] --- if not modules then modules={} end modules ['font-ots']={ version=1.001, @@ -17838,22 +21561,17 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip else end end - else + else local discfound=false - local lastdisc=nil local hasmarks=marks[startchar] while current do local char,id=ischar(current,currentfont) if char then if skiphash and skiphash[char] then current=getnext(current) - else - local lg=ligature[char] + else + local lg=ligature[char] if lg then - if not discfound and lastdisc then - discfound=lastdisc - lastdisc=nil - end if marks[char] then hasmarks=true end @@ -17867,42 +21585,82 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip elseif char==false then break elseif id==disc_code then - local replace=getfield(current,"replace") - if replace then - while replace do - local char,id=ischar(replace,currentfont) - if char then - local lg=ligature[char] - if lg then - if marks[char] then - hasmarks=true - end - ligature=lg - replace=getnext(replace) - else - return head,start,false,false - end - else - return head,start,false,false - end - end - stop=current - end - lastdisc=current - current=getnext(current) + discfound=current + break else break end end + if discfound then + local pre,post,replace=getdisc(discfound) + local match + if replace then + local char=ischar(replace,currentfont) + if char and ligature[char] then + match=true + end + end + if not match and pre then + local char=ischar(pre,currentfont) + if char and ligature[char] then + match=true + end + end + if not match and not pre or not replace then + local n=getnext(discfound) + local char=ischar(n,currentfont) + if char and ligature[char] then + match=true + end + end + if match then + local ishead=head==start + local prev=getprev(start) + if stop then + setnext(stop) + local tail=getprev(stop) + local copy=copy_node_list(start) + local liat=find_node_tail(copy) + if pre and replace then + setlink(liat,pre) + end + if replace then + setlink(tail,replace) + end + pre=copy + replace=start + else + setnext(start) + local copy=copy_node(start) + if pre then + setlink(copy,pre) + end + if replace then + setlink(start,replace) + end + pre=copy + replace=start + end + setdisc(discfound,pre,post,replace) + if prev then + setlink(prev,discfound) + else + setprev(discfound) + head=discfound + end + start=discfound + return head,start,true,true + end + end local lig=ligature.ligature if lig then if stop then if trace_ligatures then local stopchar=getchar(stop) - head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) + head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks) logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(lig)) else - head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) + head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks) end else resetinjection(start) @@ -17911,11 +21669,11 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(dataset,sequence),gref(startchar),gref(lig)) end end - return head,start,true,discfound + return head,start,true,false else end end - return head,start,false,discfound + return head,start,false,false end function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection) local startchar=getchar(start) @@ -20394,9 +24152,10 @@ do a=true end if a then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if start then + local ok,df + head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + elseif start then start=getnext(start) end else @@ -20450,21 +24209,24 @@ do a=true end if a then + local ok,df for i=m[1],m[2] do local step=steps[i] local lookupcache=step.coverage local lookupmatch=lookupcache[char] if lookupmatch then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if ok then + head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + break + elseif ok then break elseif not start then break end end end - if start then + if df then + elseif start then start=getnext(start) end else @@ -20857,10 +24619,10 @@ registerotffeature { }, } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ots”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ots”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-osd” d2b542031aa693bb423b6d3272820c9a] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-osd” 883c29eaccf966c9ad9ab205a920de08] --- if not modules then modules={} end modules ['font-osd']={ version=1.001, @@ -22795,10 +26557,10 @@ for i=1,nofscripts do methods[scripts_two[i]]=method_two end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-osd”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-osd”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ocl” 49cf3230228aa7f2d19cd491f55f5395] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ocl” 6552143d102c2dc5404293d10af3a1eb] --- if not modules then modules={} end modules ['font-ocl']={ version=1.001, @@ -22850,26 +26612,33 @@ if context then local transparencies=attributes.list[attributes.private('transparency')] or {} function otf.registerpalette(name,values) sharedpalettes[name]=values + local color=lpdf.color + local transparency=lpdf.transparency + local register=colors.register for i=1,#values do local v=values[i] - local c=nil - local t=nil - if type(v)=="table" then - c=colors.register(name,"rgb", - max(round((v.r or 0)*255),255)/255, - max(round((v.g or 0)*255),255)/255, - max(round((v.b or 0)*255),255)/255 - ) + if v=="textcolor" then + values[i]=false else - c=colors[v] - t=transparencies[v] - end - if c and t then - values[i]=hash[lpdf.color(1,c).." "..lpdf.transparency(t)] - elseif c then - values[i]=hash[lpdf.color(1,c)] - elseif t then - values[i]=hash[lpdf.color(1,t)] + local c=nil + local t=nil + if type(v)=="table" then + c=register(name,"rgb", + max(round((v.r or 0)*255),255)/255, + max(round((v.g or 0)*255),255)/255, + max(round((v.b or 0)*255),255)/255 + ) + else + c=colors[v] + t=transparencies[v] + end + if c and t then + values[i]=hash[color(1,c).." "..transparency(t)] + elseif c then + values[i]=hash[color(1,c)] + elseif t then + values[i]=hash[color(1,t)] + end end end end @@ -22878,11 +26647,13 @@ else sharedpalettes[name]=values for i=1,#values do local v=values[i] - values[i]=hash[f_color( - max(round((v.r or 0)*255),255)/255, - max(round((v.g or 0)*255),255)/255, - max(round((v.b or 0)*255),255)/255 - )] + if v then + values[i]=hash[f_color( + max(round((v.r or 0)*255),255)/255, + max(round((v.g or 0)*255),255)/255, + max(round((v.b or 0)*255),255)/255 + )] + end end end end @@ -22906,7 +26677,7 @@ local pop={ "pdf","page","Q" } if not LUATEXFUNCTIONALITY or LUATEXFUNCTIONALITY<6472 then start={ "nop" } end -local function initialize(tfmdata,kind,value) +local function initialize(tfmdata,kind,value) if value then local resources=tfmdata.resources local palettes=resources.colorpalettes @@ -22916,7 +26687,13 @@ local function initialize(tfmdata,kind,value) converted=setmetatableindex(convert) resources.converted=converted end - local colorvalues=sharedpalettes[value] or converted[palettes[tonumber(value) or 1] or palettes[1]] or {} + local colorvalues=sharedpalettes[value] + local default=false + if colorvalues then + default=colorvalues[#colorvalues] + else + colorvalues=converted[palettes[tonumber(value) or 1] or palettes[1]] or {} + end local classes=#colorvalues if classes==0 then return @@ -22929,7 +26706,6 @@ local function initialize(tfmdata,kind,value) { id=0 } } local getactualtext=otf.getactualtext - local default=colorvalues[#colorvalues] local b,e=getactualtext(tounicode(0xFFFD)) local actualb={ "pdf","page",b } local actuale={ "pdf","page",e } @@ -22960,6 +26736,12 @@ local function initialize(tfmdata,kind,value) f=true n=n+1 t[n]=v l=v + else + if f then + n=n+1 t[n]=pop + end + f=false + l=nil end n=n+1 t[n]=charcommand[entry.slot] if s>1 and i<s and goback then @@ -23002,7 +26784,7 @@ do done=f_used(n) hashed[pdf]=done end - return nil,done,nil + return done end else local openpdf=pdfe.new @@ -23015,7 +26797,7 @@ do done=f_used(n) hashed[pdf]=done end - return nil,done,nil + return done end end end @@ -23036,6 +26818,10 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) local b,e=getactualtext(tounicode(0xFFFD)) local actualb={ "pdf","page",b } local actuale={ "pdf","page",e } + local vfimage=lpdf and lpdf.vfimage or function(wd,ht,dp,data,name) + local name=storepdfdata(data) + return { "image",{ filename=name,width=wd,height=ht,depth=dp } } + end for unicode,character in sortedhash(characters) do local index=character.index if index then @@ -23054,21 +26840,18 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) dy=0 end if data then - local setcode,name,nilcode=storepdfdata(data) - if name then - local bt=unicode and getactualtext(unicode) - local wd=character.width or 0 - local ht=character.height or 0 - local dp=character.depth or 0 - character.commands={ - not unicode and actualb or { "pdf","page",(getactualtext(unicode)) }, - downcommand[dp+dy*hfactor], - rightcommand[dx*hfactor], - { "image",{ filename=name,width=wd,height=ht,depth=dp } }, - actuale, - } - character[kind]=true - end + local bt=unicode and getactualtext(unicode) + local wd=character.width or 0 + local ht=character.height or 0 + local dp=character.depth or 0 + character.commands={ + not unicode and actualb or { "pdf","page",(getactualtext(unicode)) }, + downcommand[dp+dy*hfactor], + rightcommand[dx*hfactor], + vfimage(wd,ht,dp,data,name), + actuale, + } + character[kind]=true end end end @@ -23184,40 +26967,40 @@ fonts.handlers.otf.features.register { node=initializesvg, } } -local otfsbix=otf.sbix or {} -otf.sbix=otfsbix -otf.sbixenabled=true +local otfpng=otf.png or {} +otf.png=otfpng +otf.pngenabled=true do - local report_sbix=logs.reporter("fonts","sbix conversion") + local report_png=logs.reporter("fonts","png conversion") local loaddata=io.loaddata local savedata=io.savedata local remove=os.remove local runner=sandbox and sandbox.registerrunner { - name="otfsbix", + name="otfpng", program="gm", - template="convert -quality 100 temp-otf-sbix-shape.sbix temp-otf-sbix-shape.pdf > temp-otf-svg-shape.log", + template="convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log", } if not runner then runner=function() - return os.execute("gm convert -quality 100 temp-otf-sbix-shape.sbix temp-otf-sbix-shape.pdf > temp-otf-svg-shape.log") + return os.execute("gm convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log") end end - function otfsbix.topdf(sbixshapes) + function otfpng.topdf(pngshapes) local pdfshapes={} - local sbixfile="temp-otf-sbix-shape.sbix" - local pdffile="temp-otf-sbix-shape.pdf" + local pngfile="temp-otf-png-shape.png" + local pdffile="temp-otf-png-shape.pdf" local nofdone=0 - local indices=sortedkeys(sbixshapes) + local indices=sortedkeys(pngshapes) local nofindices=#indices - report_sbix("processing %i sbix containers",nofindices) + report_png("processing %i png containers",nofindices) statistics.starttiming() for i=1,nofindices do local index=indices[i] - local entry=sbixshapes[index] - local data=entry.data + local entry=pngshapes[index] + local data=entry.data local x=entry.x local y=entry.y - savedata(sbixfile,data) + savedata(pngfile,data) runner() pdfshapes[index]={ x=x~=0 and x or nil, @@ -23226,54 +27009,62 @@ do } nofdone=nofdone+1 if nofdone%100==0 then - report_sbix("%i shapes processed",nofdone) + report_png("%i shapes processed",nofdone) end end - report_sbix("processing %i pdf results",nofindices) - remove(sbixfile) + report_png("processing %i pdf results",nofindices) + remove(pngfile) remove(pdffile) statistics.stoptiming() if statistics.elapsedseconds then - report_sbix("sbix conversion time %s",statistics.elapsedseconds() or "-") + report_png("png conversion time %s",statistics.elapsedseconds() or "-") end return pdfshapes end end -local function initializesbix(tfmdata,kind,value) - if value and otf.sbixenabled then - local sbix=tfmdata.properties.sbix - local hash=sbix and sbix.hash - local timestamp=sbix and sbix.timestamp +local function initializepng(tfmdata,kind,value) + if value and otf.pngenabled then + local png=tfmdata.properties.png + local hash=png and png.hash + local timestamp=png and png.timestamp if not hash then return end local pdffile=containers.read(otf.pdfcache,hash) local pdfshapes=pdffile and pdffile.pdfshapes if not pdfshapes or pdffile.timestamp~=timestamp then - local sbixfile=containers.read(otf.sbixcache,hash) - local sbixshapes=sbixfile and sbixfile.sbixshapes - pdfshapes=sbixshapes and otfsbix.topdf(sbixshapes) or {} + local pngfile=containers.read(otf.pngcache,hash) + local pngshapes=pngfile and pngfile.pngshapes + pdfshapes=pngshapes and otfpng.topdf(pngshapes) or {} containers.write(otf.pdfcache,hash,{ pdfshapes=pdfshapes, timestamp=timestamp, }) end - pdftovirtual(tfmdata,pdfshapes,"sbix") + pdftovirtual(tfmdata,pdfshapes,"png") end end fonts.handlers.otf.features.register { name="sbix", description="sbix glyphs", manipulators={ - base=initializesbix, - node=initializesbix, + base=initializepng, + node=initializepng, + } +} +fonts.handlers.otf.features.register { + name="cblc", + description="cblc glyphs", + manipulators={ + base=initializepng, + node=initializepng, } } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-ocl”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-ocl”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-otc” 088ba25667dfc5036867d007797e1602] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-otc” 088ba25667dfc5036867d007797e1602] --- if not modules then modules={} end modules ['font-otc']={ version=1.001, @@ -24022,10 +27813,10 @@ end otf.enhancers.enhance=enhance otf.enhancers.register("check extra features",enhance) -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-otc”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-otc”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-onr” cf93eb4ab34461d2b3797792dbdb035f] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-onr” 20b0d2753f58ff91180947ce4078571e] --- if not modules then modules={} end modules ['font-onr']={ version=1.001, @@ -24040,7 +27831,7 @@ local match,lower,gsub,strip,find=string.match,string.lower,string.gsub,string.s local char,byte,sub=string.char,string.byte,string.sub local abs=math.abs local bxor,rshift=bit32.bxor,bit32.rshift -local P,S,R,Cmt,C,Ct,Cs,Carg,Cf,Cg=lpeg.P,lpeg.S,lpeg.R,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg,lpeg.Cf,lpeg.Cg +local P,S,R,V,Cmt,C,Ct,Cs,Carg,Cf,Cg,Cc=lpeg.P,lpeg.S,lpeg.R,lpeg.V,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg,lpeg.Cf,lpeg.Cg,lpeg.Cc local lpegmatch,patterns=lpeg.match,lpeg.patterns local trace_indexing=false trackers.register("afm.indexing",function(v) trace_indexing=v end) local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end) @@ -24083,14 +27874,21 @@ do local routines,vector,chars,n,m local initialize=function(str,position,size) n=0 - m=size + m=size return position+1 end local setroutine=function(str,position,index,size,filename) - local forward=position+tonumber(size) + if routines[index] then + return false + end + local forward=position+size local stream=decrypt(sub(str,position+1,forward),4330,4) routines[index]={ byte(stream,1,#stream) } - return forward + n=n+1 + if n>=m then + return #str + end + return forward+1 end local setvector=function(str,position,name,size,filename) local forward=position+tonumber(size) @@ -24130,7 +27928,7 @@ do local p_np=spacing*(P("NP")+P("|")) local p_nd=spacing*(P("ND")+P("|")) local p_filterroutines= - (1-subroutines)^0*subroutines*spaces*Cmt(cardinal,initialize)*(Cmt(cardinal*spaces*cardinal*p_rd*Carg(1),setroutine)*p_np+P(1))^1 + (1-subroutines)^0*subroutines*spaces*Cmt(cardinal,initialize)*(Cmt(cardinal*spaces*cardinal*p_rd*Carg(1),setroutine)*p_np+(1-p_nd))^1 local p_filtershapes= (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*p_rd*Carg(1),setshapes)*p_nd+P(1))^1 local p_filternames=Ct ( @@ -24139,7 +27937,18 @@ do local p_filterencoding=(1-encoding)^0*encoding*spaces*digits*spaces*array*(1-dup)^0*Cf( Ct("")*Cg(spacing*dup*spaces*cardinal*spaces*name*spaces*put)^1 ,rawset) - local function loadpfbvector(filename,shapestoo) + local key=spacing*P("/")*R("az","AZ") + local str=spacing*Cs { (P("(")/"")*((1-P("\\(")-P("\\)")-S("()"))+V(1))^0*(P(")")/"") } + local num=spacing*(R("09")+S("+-."))^1/tonumber + local arr=spacing*Ct (S("[{")*(num)^0*spacing*S("]}")) + local boo=spacing*(P("true")*Cc(true)+P("false")*Cc(false)) + local nam=spacing*P("/")*Cs(R("az","AZ")^1) + local p_filtermetadata=( + P("/")*Carg(1)*(( + C("version")*str+C("Copyright")*str+C("Notice")*str+C("FullName")*str+C("FamilyName")*str+C("Weight")*str+C("ItalicAngle")*num+C("isFixedPitch")*boo+C("UnderlinePosition")*num+C("UnderlineThickness")*num+C("FontName")*nam+C("FontMatrix")*arr+C("FontBBox")*arr + ) )/function(t,k,v) t[lower(k)]=v end+P(1) + )^0*Carg(1) + local function loadpfbvector(filename,shapestoo,streams) local data=io.loaddata(resolvers.findfile(filename)) if not data then report_pfb("no data in %a",filename) @@ -24157,9 +27966,10 @@ do binary=decrypt(binary,55665,4) local names={} local encoding=lpegmatch(p_filterencoding,ascii) + local metadata=lpegmatch(p_filtermetadata,ascii,1,{}) local glyphs={} routines,vector,chars={},{},{} - if shapestoo then + if shapestoo or streams then lpegmatch(p_filterroutines,binary,1,filename) lpegmatch(p_filtershapes,binary,1,filename) local data={ @@ -24171,13 +27981,13 @@ do } }, } - fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,true) + fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams) else lpegmatch(p_filternames,binary,1,filename) end names=vector routines,vector,chars=nil,nil,nil - return names,encoding,glyphs + return names,encoding,glyphs,metadata end local pfb=handlers.pfb or {} handlers.pfb=pfb @@ -24378,10 +28188,10 @@ function readers.getinfo(filename) end end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-onr”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-onr”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-one” b0a175e8f123feb797c7a5a9b02b85a0] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-one” b0a175e8f123feb797c7a5a9b02b85a0] --- if not modules then modules={} end modules ['font-one']={ version=1.001, @@ -25081,10 +28891,10 @@ registerafmenhancer("normalize features",enhance_normalize_features) registerafmenhancer("check extra features",otfenhancers.enhance) registerafmenhancer("fix names",enhance_fix_names) -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-one”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-one”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-afk” 9da14e0fb22129c053acc599d1312544] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-afk” 54d554530e75c57c56ee76234724e26d] --- if not modules then modules={} end modules ['font-afk']={ version=1.001, @@ -25251,10 +29061,10 @@ fonts.handlers.afm.helpdata={ } } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-afk”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-afk”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-tfm” c9797c1b4ccb8fdb7f041e19207109a2] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-tfm” f1a3796cce3838210248eb1daee6ea83] --- if not modules then modules={} end modules ['font-tfm']={ version=1.001, @@ -25266,6 +29076,7 @@ if not modules then modules={} end modules ['font-tfm']={ local next,type=next,type local match,format=string.match,string.format local concat,sortedhash=table.concat,table.sortedhash +local idiv=number.idiv local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end) local trace_features=false trackers.register("tfm.features",function(v) trace_features=v end) local report_defining=logs.reporter("fonts","defining") @@ -25301,147 +29112,190 @@ function tfm.setfeatures(tfmdata,features) end end local depth={} -local function read_from_tfm(specification) - local filename=specification.filename - local size=specification.size - depth[filename]=(depth[filename] or 0)+1 - if trace_defining then - report_defining("loading tfm file %a at size %s",filename,size) - end - local tfmdata=font.read_tfm(filename,size) - if tfmdata then - local features=specification.features and specification.features.normal or {} - local features=constructors.checkedfeatures("tfm",features) - specification.features.normal=features - local newtfmdata=(depth[filename]==1) and tfm.reencode(tfmdata,specification) - if newtfmdata then - tfmdata=newtfmdata +local read_from_tfm,check_tfm do + local tfmreaders=context and tfm.readers + local loadtfmvf=tfmreaders and tfmreaders.loadtfmvf + local loadtfm=font.read_tfm + local loadvf=font.read_vf + directives.register("fonts.tfm.builtin",function(v) + loadtfmvf=tfmreaders and tfmreaders.loadtfmvf + if v and loadtfm then + loadtfmvf=false end - local resources=tfmdata.resources or {} - local properties=tfmdata.properties or {} - local parameters=tfmdata.parameters or {} - local shared=tfmdata.shared or {} - shared.features=features - shared.resources=resources - properties.name=tfmdata.name - properties.fontname=tfmdata.fontname - properties.psname=tfmdata.psname - properties.fullname=tfmdata.fullname - properties.filename=specification.filename - properties.format=fonts.formats.tfm - tfmdata.properties=properties - tfmdata.resources=resources - tfmdata.parameters=parameters - tfmdata.shared=shared - shared.rawdata={ resources=resources } - shared.features=features - if newtfmdata then - if not resources.marks then - resources.marks={} - end - if not resources.sequences then - resources.sequences={} - end - if not resources.features then - resources.features={ - gsub={}, - gpos={}, - } - end - if not tfmdata.changed then - tfmdata.changed={} - end - if not tfmdata.descriptions then - tfmdata.descriptions=tfmdata.characters - end - otf.readers.addunicodetable(tfmdata) - tfmenhancers.apply(tfmdata,filename) - constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm) - otf.readers.unifymissing(tfmdata) - fonts.mappings.addtounicode(tfmdata,filename) - tfmdata.tounicode=1 - local tounicode=fonts.mappings.tounicode - for unicode,v in next,tfmdata.characters do - local u=v.unicode - if u then - v.tounicode=tounicode(u) - end - end - if tfmdata.usedbitmap then - tfm.addtounicode(tfmdata) - end - end - shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil - parameters.factor=1 - parameters.size=size - parameters.slant=parameters.slant or parameters[1] or 0 - parameters.space=parameters.space or parameters[2] or 0 - parameters.space_stretch=parameters.space_stretch or parameters[3] or 0 - parameters.space_shrink=parameters.space_shrink or parameters[4] or 0 - parameters.x_height=parameters.x_height or parameters[5] or 0 - parameters.quad=parameters.quad or parameters[6] or 0 - parameters.extra_space=parameters.extra_space or parameters[7] or 0 - constructors.enhanceparameters(parameters) - properties.private=properties.private or tfmdata.private or privateoffset - if newtfmdata then - elseif constructors.resolvevirtualtoo then - fonts.loggers.register(tfmdata,file.suffix(filename),specification) - local vfname=findbinfile(specification.name,'ovf') - if vfname and vfname~="" then - local vfdata=font.read_vf(vfname,size) - if vfdata then - local chars=tfmdata.characters - for k,v in next,vfdata.characters do - chars[k].commands=v.commands - end - properties.virtualized=true - tfmdata.fonts=vfdata.fonts - tfmdata.type="virtual" - local fontlist=vfdata.fonts - local name=file.nameonly(filename) - for i=1,#fontlist do - local n=fontlist[i].name - local s=fontlist[i].size - local d=depth[filename] - s=constructors.scaled(s,vfdata.designsize) - if d>tfm.maxnestingdepth then - report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth) - fontlist[i]={ id=0 } - elseif (d>1) and (s>tfm.maxnestingsize) then - report_defining("virtual font %a exceeds size %s",n,s) - fontlist[i]={ id=0 } - else - local t,id=fonts.constructors.readanddefine(n,s) - fontlist[i]={ id=id } + end) + read_from_tfm=function(specification) + local filename=specification.filename + local size=specification.size + depth[filename]=(depth[filename] or 0)+1 + if trace_defining then + report_defining("loading tfm file %a at size %s",filename,size) + end + local tfmdata + if loadtfmvf then + tfmdata=loadtfmvf(filename,size) + else + tfmdata=loadtfm(filename,size) + end + if tfmdata then + local features=specification.features and specification.features.normal or {} + local features=constructors.checkedfeatures("tfm",features) + specification.features.normal=features + local newtfmdata=(depth[filename]==1) and tfm.reencode(tfmdata,specification) + if newtfmdata then + tfmdata=newtfmdata + end + local resources=tfmdata.resources or {} + local properties=tfmdata.properties or {} + local parameters=tfmdata.parameters or {} + local shared=tfmdata.shared or {} + shared.features=features + shared.resources=resources + properties.name=tfmdata.name + properties.fontname=tfmdata.fontname + properties.psname=tfmdata.psname + properties.fullname=tfmdata.fullname + properties.filename=specification.filename + properties.format=tfmdata.format or fonts.formats.tfm + properties.usedbitmap=tfmdata.usedbitmap + tfmdata.properties=properties + tfmdata.resources=resources + tfmdata.parameters=parameters + tfmdata.shared=shared + shared.rawdata={ resources=resources } + shared.features=features + if newtfmdata then + if not resources.marks then + resources.marks={} + end + if not resources.sequences then + resources.sequences={} + end + if not resources.features then + resources.features={ + gsub={}, + gpos={}, + } + end + if not tfmdata.changed then + tfmdata.changed={} + end + if not tfmdata.descriptions then + tfmdata.descriptions=tfmdata.characters + end + otf.readers.addunicodetable(tfmdata) + tfmenhancers.apply(tfmdata,filename) + constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm) + otf.readers.unifymissing(tfmdata) + fonts.mappings.addtounicode(tfmdata,filename) + tfmdata.tounicode=1 + local tounicode=fonts.mappings.tounicode + for unicode,v in next,tfmdata.characters do + local u=v.unicode + if u then + v.tounicode=tounicode(u) + end + end + if tfmdata.usedbitmap then + tfm.addtounicode(tfmdata) + end + end + shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil + if size<0 then + size=idiv(65536*-size,100) + end + parameters.factor=1 + parameters.units=1000 + parameters.size=size + parameters.slant=parameters.slant or parameters[1] or 0 + parameters.space=parameters.space or parameters[2] or 0 + parameters.space_stretch=parameters.space_stretch or parameters[3] or 0 + parameters.space_shrink=parameters.space_shrink or parameters[4] or 0 + parameters.x_height=parameters.x_height or parameters[5] or 0 + parameters.quad=parameters.quad or parameters[6] or 0 + parameters.extra_space=parameters.extra_space or parameters[7] or 0 + constructors.enhanceparameters(parameters) + properties.private=properties.private or tfmdata.private or privateoffset + if newtfmdata then + elseif loadtfmvf then + local fonts=tfmdata.fonts + if fonts then + for i=1,#fonts do + local font=fonts[i] + local id=font.id + if not id then + local name=font.name + local size=font.size + if name and size then + local data,id=constructors.readanddefine(name,size) + if id then + font.id=id + font.name=nil + font.size=nil + end + end + end + end + end + elseif constructors.resolvevirtualtoo then + fonts.loggers.register(tfmdata,file.suffix(filename),specification) + local vfname=findbinfile(specification.name,'ovf') + if vfname and vfname~="" then + local vfdata=loadvf(vfname,size) + if vfdata then + local chars=tfmdata.characters + for k,v in next,vfdata.characters do + chars[k].commands=v.commands + end + properties.virtualized=true + tfmdata.fonts=vfdata.fonts + tfmdata.type="virtual" + local fontlist=vfdata.fonts + local name=file.nameonly(filename) + for i=1,#fontlist do + local n=fontlist[i].name + local s=fontlist[i].size + local d=depth[filename] + s=constructors.scaled(s,vfdata.designsize) + if d>tfm.maxnestingdepth then + report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth) + fontlist[i]={ id=0 } + elseif (d>1) and (s>tfm.maxnestingsize) then + report_defining("virtual font %a exceeds size %s",n,s) + fontlist[i]={ id=0 } + else + local t,id=constructors.readanddefine(n,s) + fontlist[i]={ id=id } + end end end end end + properties.haskerns=true + properties.hasligatures=true + properties.hasitalics=true + resources.unicodes={} + resources.lookuptags={} + depth[filename]=depth[filename]-1 + return tfmdata + else + depth[filename]=depth[filename]-1 end - properties.haskerns=true - properties.hasligatures=true - resources.unicodes={} - resources.lookuptags={} - depth[filename]=depth[filename]-1 - return tfmdata - else - depth[filename]=depth[filename]-1 - end -end -local function check_tfm(specification,fullname) - local foundname=findbinfile(fullname,'tfm') or "" - if foundname=="" then - foundname=findbinfile(fullname,'ofm') or "" end - if foundname=="" then - foundname=fonts.names.getfilename(fullname,"tfm") or "" - end - if foundname~="" then - specification.filename=foundname - specification.format="ofm" - return read_from_tfm(specification) - elseif trace_defining then - report_defining("loading tfm with name %a fails",specification.name) + check_tfm=function(specification,fullname) + local foundname=findbinfile(fullname,'tfm') or "" + if foundname=="" then + foundname=findbinfile(fullname,'ofm') or "" + end + if foundname=="" then + foundname=fonts.names.getfilename(fullname,"tfm") or "" + end + if foundname~="" then + specification.filename=foundname + specification.format="ofm" + return read_from_tfm(specification) + elseif trace_defining then + report_defining("loading tfm with name %a fails",specification.name) + end end end readers.check_tfm=check_tfm @@ -25501,7 +29355,7 @@ do local encoding=false local vector=false if type(pfbfile)=="string" then - local pfb=fonts.constructors.handlers.pfb + local pfb=constructors.handlers.pfb if pfb and pfb.loadvector then local v,e=pfb.loadvector(pfbfile) if v then @@ -25529,7 +29383,7 @@ do local originals=tfmdata.characters local indices={} local parentfont={ "font",1 } - local private=tfmdata or fonts.constructors.privateoffset + local private=tfmdata.privateoffset or constructors.privateoffset local reported=encdone[tfmfile][encfile] local backmap=vector and table.swapped(vector) local done={} @@ -25619,21 +29473,16 @@ CMapName currentdict /CMap defineresource pop end end end ]] - local flushstreamobject=lpdf and lpdf.flushstreamobject - local setfontattributes=pdf.setfontattributes - if flushstreamobject then - else + local flushstreamobject=lpdf and lpdf.flushstreamobject + local setfontattributes=lpdf and lpdf.setfontattributes + if not flushstreamobject then flushstreamobject=function(data) - return pdf.obj { - immediate=true, - type="stream", - string=data, - } + return pdf.obj { immediate=true,type="stream",string=data } end end if not setfontattributes then setfontattributes=function(id,data) - print(format("your luatex is too old so no tounicode bitmap font%i",id)) + return pdf.setfontattributes(id,data) end end function tfm.addtounicode(tfmdata) @@ -25765,10 +29614,10 @@ registertfmfeature { } } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-tfm”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-tfm”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-lua” 1fbfdf7b689b2bdfd0e3bb9bf74ce136] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-lua” 55b281fb98f7bd848fc19928f376f647] --- if not modules then modules={} end modules ['font-lua']={ version=1.001, @@ -25808,10 +29657,10 @@ function readers.lua(specification) return check_lua(specification,fullname) end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-lua”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-lua”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-def” 8e2cb2552bf02246da2ac43334b91795] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-def” 6569d90e55c91890b3b0650063a83ee6] --- if not modules then modules={} end modules ['font-def']={ version=1.001, @@ -25948,9 +29797,6 @@ function resolvers.name(specification) features.normal=normal end normal.instance=instance - if not callbacks.supported.glyph_stream_provider then - normal.variableshapes=true - end end local suffix=lower(suffixonly(resolved)) if fonts.formats[suffix] then @@ -26216,10 +30062,10 @@ function font.getfont(id) end callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)") -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-def”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-def”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-def” f435e0875f203f343157baeff876ec9c] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-def” 5ad79120ebc5e60f4d322fb3ee13bffe] --- if not modules then modules={} end modules ['luatex-fonts-def']={ version=1.001, @@ -26300,10 +30146,10 @@ function fonts.definers.applypostprocessors(tfmdata) return tfmdata end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-def”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-def”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-ext” 32013cbc5d5d336be8b1d1e5879d86c4] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-ext” 01015ab3758cdc2af29394e6d502a91a] --- if not modules then modules={} end modules ['luatex-fonts-ext']={ version=1.001, @@ -26489,10 +30335,10 @@ registerotffeature { } } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-ext”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-ext”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-imp-tex” ceb087ef6fa2f89aed7179f60ddf8f35] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-imp-tex” 77c374b0ef00c2fb12188ec42beb4257] --- if not modules then modules={} end modules ['font-imp-tex']={ version=1.001, @@ -26591,10 +30437,10 @@ registerotffeature { description="arabic digits", } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-imp-tex”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-imp-tex”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-imp-ligatures” 26ffcf089391445f7af59536c8814364] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-imp-ligatures” 043daa4fcccf2560868da359d71d3a4a] --- if not modules then modules={} end modules ['font-imp-ligatures']={ version=1.001, @@ -26708,10 +30554,10 @@ if context then } end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-imp-ligatures”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-imp-ligatures”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-imp-italics” c2e6d6c4096a2c30d68fbffd3d7d58a7] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-imp-italics” fe1ca80fb5ea4a2f8d2d5c484e7ba913] --- if not modules then modules={} end modules ['font-imp-italics']={ version=1.001, @@ -26817,14 +30663,14 @@ if context then registerafmfeature(dimensions_specification) end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-imp-italics”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-imp-italics”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “font-imp-effects” 3327181ef3db6f44dd234ad66ccc3f38] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “font-imp-effects” 73a660359a0ec71e44cc2b7225a715ac] --- if not modules then modules={} end modules ['font-imp-effects']={ version=1.001, - comment="companion to font-ini.mkiv and hand-ini.mkiv", + comment="companion to font-ini.mkiv", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" @@ -27177,10 +31023,10 @@ local specification={ registerotffeature(specification) registerafmfeature(specification) -end --- [luaotfload, fontloader-2018-10-28.lua scope for “font-imp-effects”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “font-imp-effects”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-lig” fbd251eea3810a43a8d5542319361d68] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-lig” b9dbe77ce747d4c35bb2a20ffbe5aa51] --- fonts.handlers.otf.addfeature { @@ -29249,10 +33095,10 @@ fonts.handlers.otf.addfeature { ["type"]="ligature", } -end --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-lig”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-lig”] --- -do --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-gbn” 10ecdf01e7c926e5128ad8a9dff4d677] --- +do --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-gbn” d25472d54c4841db43a745764a63533e] --- if not modules then modules={} end modules ['luatex-fonts-gbn']={ version=1.001, @@ -29517,7 +33363,7 @@ function nodes.simple_font_handler(head,groupcode,size,packtype,direction) return head end -end --- [luaotfload, fontloader-2018-10-28.lua scope for “fonts-gbn”] --- +end --- [luaotfload, fontloader-2018-12-25.lua scope for “fonts-gbn”] --- --- vim:ft=lua:sw=2:ts=8:et:tw=79 diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-chr.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-chr.lua new file mode 100644 index 00000000000..14a55d7b011 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-chr.lua @@ -0,0 +1,3246 @@ +-- automatically generated from context data + +characters = characters or { } + +-- dummies + +characters.blockrange = { } + +-- classifiers needed for analysis + +characters.classifiers={ + [768]=5, + [769]=5, + [770]=5, + [771]=5, + [772]=5, + [773]=5, + [774]=5, + [775]=5, + [776]=5, + [777]=5, + [778]=5, + [779]=5, + [780]=5, + [781]=5, + [782]=5, + [783]=5, + [784]=5, + [785]=5, + [786]=5, + [787]=5, + [788]=5, + [789]=5, + [790]=5, + [791]=5, + [792]=5, + [793]=5, + [794]=5, + [795]=5, + [796]=5, + [797]=5, + [798]=5, + [799]=5, + [800]=5, + [801]=5, + [802]=5, + [803]=5, + [804]=5, + [805]=5, + [806]=5, + [807]=5, + [808]=5, + [809]=5, + [810]=5, + [811]=5, + [812]=5, + [813]=5, + [814]=5, + [815]=5, + [816]=5, + [817]=5, + [818]=5, + [819]=5, + [820]=5, + [821]=5, + [822]=5, + [823]=5, + [824]=5, + [825]=5, + [826]=5, + [827]=5, + [828]=5, + [829]=5, + [830]=5, + [831]=5, + [832]=5, + [833]=5, + [834]=5, + [835]=5, + [836]=5, + [837]=5, + [838]=5, + [839]=5, + [840]=5, + [841]=5, + [842]=5, + [843]=5, + [844]=5, + [845]=5, + [846]=5, + [847]=5, + [848]=5, + [849]=5, + [850]=5, + [851]=5, + [852]=5, + [853]=5, + [854]=5, + [855]=5, + [856]=5, + [857]=5, + [858]=5, + [859]=5, + [860]=5, + [861]=5, + [862]=5, + [863]=5, + [864]=5, + [865]=5, + [866]=5, + [867]=5, + [868]=5, + [869]=5, + [870]=5, + [871]=5, + [872]=5, + [873]=5, + [874]=5, + [875]=5, + [876]=5, + [877]=5, + [878]=5, + [879]=5, + [1155]=5, + [1156]=5, + [1157]=5, + [1158]=5, + [1159]=5, + [1425]=5, + [1426]=5, + [1427]=5, + [1428]=5, + [1429]=5, + [1430]=5, + [1431]=5, + [1432]=5, + [1433]=5, + [1434]=5, + [1435]=5, + [1436]=5, + [1437]=5, + [1438]=5, + [1439]=5, + [1440]=5, + [1441]=5, + [1442]=5, + [1443]=5, + [1444]=5, + [1445]=5, + [1446]=5, + [1447]=5, + [1448]=5, + [1449]=5, + [1450]=5, + [1451]=5, + [1452]=5, + [1453]=5, + [1454]=5, + [1455]=5, + [1456]=5, + [1457]=5, + [1458]=5, + [1459]=5, + [1460]=5, + [1461]=5, + [1462]=5, + [1463]=5, + [1464]=5, + [1465]=5, + [1466]=5, + [1467]=5, + [1468]=5, + [1469]=5, + [1471]=5, + [1473]=5, + [1474]=5, + [1476]=5, + [1477]=5, + [1479]=5, + [1536]=4, + [1537]=4, + [1538]=4, + [1539]=4, + [1540]=4, + [1541]=4, + [1542]=6, + [1543]=6, + [1544]=4, + [1545]=6, + [1546]=6, + [1547]=4, + [1548]=6, + [1549]=6, + [1550]=6, + [1551]=6, + [1552]=5, + [1553]=5, + [1554]=5, + [1555]=5, + [1556]=5, + [1557]=5, + [1558]=5, + [1559]=5, + [1560]=5, + [1561]=5, + [1562]=5, + [1563]=6, + [1564]=6, + [1566]=6, + [1567]=6, + [1568]=2, + [1569]=4, + [1570]=3, + [1571]=3, + [1572]=3, + [1573]=3, + [1574]=2, + [1575]=3, + [1576]=2, + [1577]=3, + [1578]=2, + [1579]=2, + [1580]=2, + [1581]=2, + [1582]=2, + [1583]=3, + [1584]=3, + [1585]=3, + [1586]=3, + [1587]=2, + [1588]=2, + [1589]=2, + [1590]=2, + [1591]=2, + [1592]=2, + [1593]=2, + [1594]=2, + [1595]=2, + [1596]=2, + [1597]=2, + [1598]=2, + [1599]=2, + [1600]=2, + [1601]=2, + [1602]=2, + [1603]=2, + [1604]=2, + [1605]=2, + [1606]=2, + [1607]=2, + [1608]=3, + [1609]=2, + [1610]=2, + [1611]=5, + [1612]=5, + [1613]=5, + [1614]=5, + [1615]=5, + [1616]=5, + [1617]=5, + [1618]=5, + [1619]=5, + [1620]=5, + [1621]=5, + [1622]=5, + [1623]=5, + [1624]=5, + [1625]=5, + [1626]=5, + [1627]=5, + [1628]=5, + [1629]=5, + [1630]=5, + [1631]=5, + [1632]=6, + [1633]=6, + [1634]=6, + [1635]=6, + [1636]=6, + [1637]=6, + [1638]=6, + [1639]=6, + [1640]=6, + [1641]=6, + [1642]=6, + [1643]=6, + [1644]=6, + [1645]=6, + [1646]=2, + [1647]=2, + [1648]=5, + [1649]=3, + [1650]=3, + [1651]=3, + [1652]=4, + [1653]=3, + [1654]=3, + [1655]=3, + [1656]=2, + [1657]=2, + [1658]=2, + [1659]=2, + [1660]=2, + [1661]=2, + [1662]=2, + [1663]=2, + [1664]=2, + [1665]=2, + [1666]=2, + [1667]=2, + [1668]=2, + [1669]=2, + [1670]=2, + [1671]=2, + [1672]=3, + [1673]=3, + [1674]=3, + [1675]=3, + [1676]=3, + [1677]=3, + [1678]=3, + [1679]=3, + [1680]=3, + [1681]=3, + [1682]=3, + [1683]=3, + [1684]=3, + [1685]=3, + [1686]=3, + [1687]=3, + [1688]=3, + [1689]=3, + [1690]=2, + [1691]=2, + [1692]=2, + [1693]=2, + [1694]=2, + [1695]=2, + [1696]=2, + [1697]=2, + [1698]=2, + [1699]=2, + [1700]=2, + [1701]=2, + [1702]=2, + [1703]=2, + [1704]=2, + [1705]=2, + [1706]=2, + [1707]=2, + [1708]=2, + [1709]=2, + [1710]=2, + [1711]=2, + [1712]=2, + [1713]=2, + [1714]=2, + [1715]=2, + [1716]=2, + [1717]=2, + [1718]=2, + [1719]=2, + [1720]=2, + [1721]=2, + [1722]=2, + [1723]=2, + [1724]=2, + [1725]=2, + [1726]=2, + [1727]=2, + [1728]=3, + [1729]=2, + [1730]=2, + [1731]=3, + [1732]=3, + [1733]=3, + [1734]=3, + [1735]=3, + [1736]=3, + [1737]=3, + [1738]=3, + [1739]=3, + [1740]=2, + [1741]=3, + [1742]=2, + [1743]=3, + [1744]=2, + [1745]=2, + [1746]=3, + [1747]=3, + [1748]=6, + [1749]=3, + [1750]=5, + [1751]=5, + [1752]=5, + [1753]=5, + [1754]=5, + [1755]=5, + [1756]=5, + [1757]=4, + [1758]=6, + [1759]=5, + [1760]=5, + [1761]=5, + [1762]=5, + [1763]=5, + [1764]=5, + [1765]=6, + [1766]=6, + [1767]=5, + [1768]=5, + [1769]=6, + [1770]=5, + [1771]=5, + [1772]=5, + [1773]=5, + [1774]=3, + [1775]=3, + [1776]=6, + [1777]=6, + [1778]=6, + [1779]=6, + [1780]=6, + [1781]=6, + [1782]=6, + [1783]=6, + [1784]=6, + [1785]=6, + [1786]=2, + [1787]=2, + [1788]=2, + [1789]=6, + [1790]=6, + [1791]=2, + [1792]=6, + [1793]=6, + [1794]=6, + [1795]=6, + [1796]=6, + [1797]=6, + [1798]=6, + [1799]=6, + [1800]=6, + [1801]=6, + [1802]=6, + [1803]=6, + [1804]=6, + [1805]=6, + [1807]=6, + [1808]=3, + [1809]=5, + [1810]=2, + [1811]=2, + [1812]=2, + [1813]=3, + [1814]=3, + [1815]=3, + [1816]=3, + [1817]=3, + [1818]=2, + [1819]=2, + [1820]=2, + [1821]=2, + [1822]=3, + [1823]=2, + [1824]=2, + [1825]=2, + [1826]=2, + [1827]=2, + [1828]=2, + [1829]=2, + [1830]=2, + [1831]=2, + [1832]=3, + [1833]=2, + [1834]=3, + [1835]=2, + [1836]=3, + [1837]=2, + [1838]=2, + [1839]=3, + [1840]=5, + [1841]=5, + [1842]=5, + [1843]=5, + [1844]=5, + [1845]=5, + [1846]=5, + [1847]=5, + [1848]=5, + [1849]=5, + [1850]=5, + [1851]=5, + [1852]=5, + [1853]=5, + [1854]=5, + [1855]=5, + [1856]=5, + [1857]=5, + [1858]=5, + [1859]=5, + [1860]=5, + [1861]=5, + [1862]=5, + [1863]=5, + [1864]=5, + [1865]=5, + [1866]=5, + [1869]=3, + [1870]=2, + [1871]=2, + [1872]=2, + [1873]=2, + [1874]=2, + [1875]=2, + [1876]=2, + [1877]=2, + [1878]=2, + [1879]=2, + [1880]=2, + [1881]=3, + [1882]=3, + [1883]=3, + [1884]=2, + [1885]=2, + [1886]=2, + [1887]=2, + [1888]=2, + [1889]=2, + [1890]=2, + [1891]=2, + [1892]=2, + [1893]=2, + [1894]=2, + [1895]=2, + [1896]=2, + [1897]=2, + [1898]=2, + [1899]=3, + [1900]=3, + [1901]=2, + [1902]=2, + [1903]=2, + [1904]=2, + [1905]=3, + [1906]=2, + [1907]=3, + [1908]=3, + [1909]=2, + [1910]=2, + [1911]=2, + [1912]=3, + [1913]=3, + [1914]=2, + [1915]=2, + [1916]=2, + [1917]=2, + [1918]=2, + [1919]=2, + [1958]=5, + [1959]=5, + [1960]=5, + [1961]=5, + [1962]=5, + [1963]=5, + [1964]=5, + [1965]=5, + [1966]=5, + [1967]=5, + [1968]=5, + [1984]=6, + [1985]=6, + [1986]=6, + [1987]=6, + [1988]=6, + [1989]=6, + [1990]=6, + [1991]=6, + [1992]=6, + [1993]=6, + [1994]=2, + [1995]=2, + [1996]=2, + [1997]=2, + [1998]=2, + [1999]=2, + [2000]=2, + [2001]=2, + [2002]=2, + [2003]=2, + [2004]=2, + [2005]=2, + [2006]=2, + [2007]=2, + [2008]=2, + [2009]=2, + [2010]=2, + [2011]=2, + [2012]=2, + [2013]=2, + [2014]=2, + [2015]=2, + [2016]=2, + [2017]=2, + [2018]=2, + [2019]=2, + [2020]=2, + [2021]=2, + [2022]=2, + [2023]=2, + [2024]=2, + [2025]=2, + [2026]=2, + [2027]=5, + [2028]=5, + [2029]=5, + [2030]=5, + [2031]=5, + [2032]=5, + [2033]=5, + [2034]=5, + [2035]=5, + [2036]=6, + [2037]=6, + [2038]=6, + [2039]=6, + [2040]=6, + [2041]=6, + [2042]=2, + [2070]=5, + [2071]=5, + [2072]=5, + [2073]=5, + [2075]=5, + [2076]=5, + [2077]=5, + [2078]=5, + [2079]=5, + [2080]=5, + [2081]=5, + [2082]=5, + [2083]=5, + [2085]=5, + [2086]=5, + [2087]=5, + [2089]=5, + [2090]=5, + [2091]=5, + [2092]=5, + [2093]=5, + [2112]=3, + [2113]=2, + [2114]=2, + [2115]=2, + [2116]=2, + [2117]=2, + [2118]=3, + [2119]=3, + [2120]=2, + [2121]=3, + [2122]=2, + [2123]=2, + [2124]=2, + [2125]=2, + [2126]=2, + [2127]=2, + [2128]=2, + [2129]=2, + [2130]=2, + [2131]=2, + [2132]=3, + [2133]=2, + [2134]=4, + [2135]=4, + [2136]=4, + [2137]=5, + [2138]=5, + [2139]=5, + [2144]=2, + [2145]=4, + [2146]=2, + [2147]=2, + [2148]=2, + [2149]=2, + [2150]=4, + [2151]=3, + [2152]=2, + [2153]=3, + [2154]=3, + [2208]=2, + [2209]=2, + [2210]=2, + [2211]=2, + [2212]=2, + [2213]=2, + [2214]=2, + [2215]=2, + [2216]=2, + [2217]=2, + [2218]=3, + [2219]=3, + [2220]=3, + [2221]=4, + [2222]=3, + [2223]=2, + [2224]=2, + [2225]=3, + [2226]=3, + [2227]=2, + [2228]=2, + [2230]=2, + [2231]=2, + [2232]=2, + [2233]=3, + [2234]=2, + [2235]=2, + [2236]=2, + [2237]=2, + [2260]=5, + [2261]=5, + [2262]=5, + [2263]=5, + [2264]=5, + [2265]=5, + [2266]=5, + [2267]=5, + [2268]=5, + [2269]=5, + [2270]=5, + [2271]=5, + [2272]=5, + [2273]=5, + [2274]=4, + [2275]=5, + [2276]=5, + [2277]=5, + [2278]=5, + [2279]=5, + [2280]=5, + [2281]=5, + [2282]=5, + [2283]=5, + [2284]=5, + [2285]=5, + [2286]=5, + [2287]=5, + [2288]=5, + [2289]=5, + [2290]=5, + [2291]=5, + [2292]=5, + [2293]=5, + [2294]=5, + [2295]=5, + [2296]=5, + [2297]=5, + [2298]=5, + [2299]=5, + [2300]=5, + [2301]=5, + [2302]=5, + [2303]=5, + [2304]=5, + [2305]=5, + [2306]=5, + [2362]=5, + [2364]=5, + [2369]=5, + [2370]=5, + [2371]=5, + [2372]=5, + [2373]=5, + [2374]=5, + [2375]=5, + [2376]=5, + [2381]=5, + [2385]=5, + [2386]=5, + [2387]=5, + [2388]=5, + [2389]=5, + [2390]=5, + [2391]=5, + [2402]=5, + [2403]=5, + [2433]=5, + [2492]=5, + [2497]=5, + [2498]=5, + [2499]=5, + [2500]=5, + [2509]=5, + [2530]=5, + [2531]=5, + [2561]=5, + [2562]=5, + [2620]=5, + [2625]=5, + [2626]=5, + [2631]=5, + [2632]=5, + [2635]=5, + [2636]=5, + [2637]=5, + [2641]=5, + [2672]=5, + [2673]=5, + [2677]=5, + [2689]=5, + [2690]=5, + [2748]=5, + [2753]=5, + [2754]=5, + [2755]=5, + [2756]=5, + [2757]=5, + [2759]=5, + [2760]=5, + [2765]=5, + [2786]=5, + [2787]=5, + [2810]=5, + [2811]=5, + [2812]=5, + [2813]=5, + [2814]=5, + [2815]=5, + [2817]=5, + [2876]=5, + [2879]=5, + [2881]=5, + [2882]=5, + [2883]=5, + [2884]=5, + [2893]=5, + [2902]=5, + [2914]=5, + [2915]=5, + [2946]=5, + [3008]=5, + [3021]=5, + [3072]=5, + [3134]=5, + [3135]=5, + [3136]=5, + [3142]=5, + [3143]=5, + [3144]=5, + [3146]=5, + [3147]=5, + [3148]=5, + [3149]=5, + [3157]=5, + [3158]=5, + [3170]=5, + [3171]=5, + [3201]=5, + [3260]=5, + [3263]=5, + [3270]=5, + [3276]=5, + [3277]=5, + [3298]=5, + [3299]=5, + [3328]=5, + [3329]=5, + [3387]=5, + [3388]=5, + [3393]=5, + [3394]=5, + [3395]=5, + [3396]=5, + [3405]=5, + [3426]=5, + [3427]=5, + [3530]=5, + [3538]=5, + [3539]=5, + [3540]=5, + [3542]=5, + [3633]=5, + [3636]=5, + [3637]=5, + [3638]=5, + [3639]=5, + [3640]=5, + [3641]=5, + [3642]=5, + [3655]=5, + [3656]=5, + [3657]=5, + [3658]=5, + [3659]=5, + [3660]=5, + [3661]=5, + [3662]=5, + [3761]=5, + [3764]=5, + [3765]=5, + [3766]=5, + [3767]=5, + [3768]=5, + [3769]=5, + [3771]=5, + [3772]=5, + [3784]=5, + [3785]=5, + [3786]=5, + [3787]=5, + [3788]=5, + [3789]=5, + [3864]=5, + [3865]=5, + [3893]=5, + [3895]=5, + [3897]=5, + [3953]=5, + [3954]=5, + [3955]=5, + [3956]=5, + [3957]=5, + [3958]=5, + [3959]=5, + [3960]=5, + [3961]=5, + [3962]=5, + [3963]=5, + [3964]=5, + [3965]=5, + [3966]=5, + [3968]=5, + [3969]=5, + [3970]=5, + [3971]=5, + [3972]=5, + [3974]=5, + [3975]=5, + [3981]=5, + [3982]=5, + [3983]=5, + [3984]=5, + [3985]=5, + [3986]=5, + [3987]=5, + [3988]=5, + [3989]=5, + [3990]=5, + [3991]=5, + [3993]=5, + [3994]=5, + [3995]=5, + [3996]=5, + [3997]=5, + [3998]=5, + [3999]=5, + [4000]=5, + [4001]=5, + [4002]=5, + [4003]=5, + [4004]=5, + [4005]=5, + [4006]=5, + [4007]=5, + [4008]=5, + [4009]=5, + [4010]=5, + [4011]=5, + [4012]=5, + [4013]=5, + [4014]=5, + [4015]=5, + [4016]=5, + [4017]=5, + [4018]=5, + [4019]=5, + [4020]=5, + [4021]=5, + [4022]=5, + [4023]=5, + [4024]=5, + [4025]=5, + [4026]=5, + [4027]=5, + [4028]=5, + [4038]=5, + [4141]=5, + [4142]=5, + [4143]=5, + [4144]=5, + [4146]=5, + [4147]=5, + [4148]=5, + [4149]=5, + [4150]=5, + [4151]=5, + [4153]=5, + [4154]=5, + [4157]=5, + [4158]=5, + [4184]=5, + [4185]=5, + [4190]=5, + [4191]=5, + [4192]=5, + [4209]=5, + [4210]=5, + [4211]=5, + [4212]=5, + [4226]=5, + [4229]=5, + [4230]=5, + [4237]=5, + [4253]=5, + [4957]=5, + [4958]=5, + [4959]=5, + [5906]=5, + [5907]=5, + [5908]=5, + [5938]=5, + [5939]=5, + [5940]=5, + [5970]=5, + [5971]=5, + [6002]=5, + [6003]=5, + [6071]=5, + [6072]=5, + [6073]=5, + [6074]=5, + [6075]=5, + [6076]=5, + [6077]=5, + [6086]=5, + [6089]=5, + [6090]=5, + [6091]=5, + [6092]=5, + [6093]=5, + [6094]=5, + [6095]=5, + [6096]=5, + [6097]=5, + [6098]=5, + [6099]=5, + [6109]=5, + [6150]=4, + [6151]=2, + [6154]=2, + [6155]=5, + [6156]=5, + [6157]=5, + [6158]=4, + [6176]=2, + [6177]=2, + [6178]=2, + [6179]=2, + [6180]=2, + [6181]=2, + [6182]=2, + [6183]=2, + [6184]=2, + [6185]=2, + [6186]=2, + [6187]=2, + [6188]=2, + [6189]=2, + [6190]=2, + [6191]=2, + [6192]=2, + [6193]=2, + [6194]=2, + [6195]=2, + [6196]=2, + [6197]=2, + [6198]=2, + [6199]=2, + [6200]=2, + [6201]=2, + [6202]=2, + [6203]=2, + [6204]=2, + [6205]=2, + [6206]=2, + [6207]=2, + [6208]=2, + [6209]=2, + [6210]=2, + [6211]=2, + [6212]=2, + [6213]=2, + [6214]=2, + [6215]=2, + [6216]=2, + [6217]=2, + [6218]=2, + [6219]=2, + [6220]=2, + [6221]=2, + [6222]=2, + [6223]=2, + [6224]=2, + [6225]=2, + [6226]=2, + [6227]=2, + [6228]=2, + [6229]=2, + [6230]=2, + [6231]=2, + [6232]=2, + [6233]=2, + [6234]=2, + [6235]=2, + [6236]=2, + [6237]=2, + [6238]=2, + [6239]=2, + [6240]=2, + [6241]=2, + [6242]=2, + [6243]=2, + [6244]=2, + [6245]=2, + [6246]=2, + [6247]=2, + [6248]=2, + [6249]=2, + [6250]=2, + [6251]=2, + [6252]=2, + [6253]=2, + [6254]=2, + [6255]=2, + [6256]=2, + [6257]=2, + [6258]=2, + [6259]=2, + [6260]=2, + [6261]=2, + [6262]=2, + [6263]=2, + [6272]=4, + [6273]=4, + [6274]=4, + [6275]=4, + [6276]=4, + [6279]=2, + [6280]=2, + [6281]=2, + [6282]=2, + [6283]=2, + [6284]=2, + [6285]=2, + [6286]=2, + [6287]=2, + [6288]=2, + [6289]=2, + [6290]=2, + [6291]=2, + [6292]=2, + [6293]=2, + [6294]=2, + [6295]=2, + [6296]=2, + [6297]=2, + [6298]=2, + [6299]=2, + [6300]=2, + [6301]=2, + [6302]=2, + [6303]=2, + [6304]=2, + [6305]=2, + [6306]=2, + [6307]=2, + [6308]=2, + [6309]=2, + [6310]=2, + [6311]=2, + [6312]=2, + [6313]=5, + [6314]=2, + [6432]=5, + [6433]=5, + [6434]=5, + [6439]=5, + [6440]=5, + [6450]=5, + [6457]=5, + [6458]=5, + [6459]=5, + [6679]=5, + [6680]=5, + [6742]=5, + [6744]=5, + [6745]=5, + [6746]=5, + [6747]=5, + [6748]=5, + [6749]=5, + [6750]=5, + [6752]=5, + [6754]=5, + [6757]=5, + [6758]=5, + [6759]=5, + [6760]=5, + [6761]=5, + [6762]=5, + [6763]=5, + [6764]=5, + [6771]=5, + [6772]=5, + [6773]=5, + [6774]=5, + [6775]=5, + [6776]=5, + [6777]=5, + [6778]=5, + [6779]=5, + [6780]=5, + [6783]=5, + [6832]=5, + [6833]=5, + [6834]=5, + [6835]=5, + [6836]=5, + [6837]=5, + [6838]=5, + [6839]=5, + [6840]=5, + [6841]=5, + [6842]=5, + [6843]=5, + [6844]=5, + [6845]=5, + [6912]=5, + [6913]=5, + [6914]=5, + [6915]=5, + [6964]=5, + [6966]=5, + [6967]=5, + [6968]=5, + [6969]=5, + [6970]=5, + [6972]=5, + [6978]=5, + [7019]=5, + [7020]=5, + [7021]=5, + [7022]=5, + [7023]=5, + [7024]=5, + [7025]=5, + [7026]=5, + [7027]=5, + [7040]=5, + [7041]=5, + [7074]=5, + [7075]=5, + [7076]=5, + [7077]=5, + [7080]=5, + [7081]=5, + [7083]=5, + [7142]=5, + [7144]=5, + [7145]=5, + [7149]=5, + [7151]=5, + [7152]=5, + [7153]=5, + [7212]=5, + [7213]=5, + [7214]=5, + [7215]=5, + [7216]=5, + [7217]=5, + [7218]=5, + [7219]=5, + [7222]=5, + [7223]=5, + [7376]=5, + [7377]=5, + [7378]=5, + [7380]=5, + [7381]=5, + [7382]=5, + [7383]=5, + [7384]=5, + [7385]=5, + [7386]=5, + [7387]=5, + [7388]=5, + [7389]=5, + [7390]=5, + [7391]=5, + [7392]=5, + [7394]=5, + [7395]=5, + [7396]=5, + [7397]=5, + [7398]=5, + [7399]=5, + [7400]=5, + [7405]=5, + [7412]=5, + [7416]=5, + [7417]=5, + [7616]=5, + [7617]=5, + [7618]=5, + [7619]=5, + [7620]=5, + [7621]=5, + [7622]=5, + [7623]=5, + [7624]=5, + [7625]=5, + [7626]=5, + [7627]=5, + [7628]=5, + [7629]=5, + [7630]=5, + [7631]=5, + [7632]=5, + [7633]=5, + [7634]=5, + [7635]=5, + [7636]=5, + [7637]=5, + [7638]=5, + [7639]=5, + [7640]=5, + [7641]=5, + [7642]=5, + [7643]=5, + [7644]=5, + [7645]=5, + [7646]=5, + [7647]=5, + [7648]=5, + [7649]=5, + [7650]=5, + [7651]=5, + [7652]=5, + [7653]=5, + [7654]=5, + [7655]=5, + [7656]=5, + [7657]=5, + [7658]=5, + [7659]=5, + [7660]=5, + [7661]=5, + [7662]=5, + [7663]=5, + [7664]=5, + [7665]=5, + [7666]=5, + [7667]=5, + [7668]=5, + [7669]=5, + [7670]=5, + [7671]=5, + [7672]=5, + [7673]=5, + [7675]=5, + [7676]=5, + [7677]=5, + [7678]=5, + [7679]=5, + [8204]=4, + [8205]=2, + [8239]=4, + [8294]=4, + [8295]=4, + [8296]=4, + [8297]=4, + [8400]=5, + [8401]=5, + [8402]=5, + [8403]=5, + [8404]=5, + [8405]=5, + [8406]=5, + [8407]=5, + [8408]=5, + [8409]=5, + [8410]=5, + [8411]=5, + [8412]=5, + [8417]=5, + [8421]=5, + [8422]=5, + [8423]=5, + [8424]=5, + [8425]=5, + [8426]=5, + [8427]=5, + [8428]=5, + [8429]=5, + [8430]=5, + [8431]=5, + [8432]=5, + [11503]=5, + [11504]=5, + [11505]=5, + [11647]=5, + [11744]=5, + [11745]=5, + [11746]=5, + [11747]=5, + [11748]=5, + [11749]=5, + [11750]=5, + [11751]=5, + [11752]=5, + [11753]=5, + [11754]=5, + [11755]=5, + [11756]=5, + [11757]=5, + [11758]=5, + [11759]=5, + [11760]=5, + [11761]=5, + [11762]=5, + [11763]=5, + [11764]=5, + [11765]=5, + [11766]=5, + [11767]=5, + [11768]=5, + [11769]=5, + [11770]=5, + [11771]=5, + [11772]=5, + [11773]=5, + [11774]=5, + [11775]=5, + [12330]=5, + [12331]=5, + [12332]=5, + [12333]=5, + [12334]=5, + [12335]=5, + [12441]=5, + [12442]=5, + [42607]=5, + [42612]=5, + [42613]=5, + [42614]=5, + [42615]=5, + [42616]=5, + [42617]=5, + [42618]=5, + [42619]=5, + [42620]=5, + [42621]=5, + [42654]=5, + [42655]=5, + [42736]=5, + [42737]=5, + [43014]=5, + [43019]=5, + [43045]=5, + [43046]=5, + [43072]=2, + [43073]=2, + [43074]=2, + [43075]=2, + [43076]=2, + [43077]=2, + [43078]=2, + [43079]=2, + [43080]=2, + [43081]=2, + [43082]=2, + [43083]=2, + [43084]=2, + [43085]=2, + [43086]=2, + [43087]=2, + [43088]=2, + [43089]=2, + [43090]=2, + [43091]=2, + [43092]=2, + [43093]=2, + [43094]=2, + [43095]=2, + [43096]=2, + [43097]=2, + [43098]=2, + [43099]=2, + [43100]=2, + [43101]=2, + [43102]=2, + [43103]=2, + [43104]=2, + [43105]=2, + [43106]=2, + [43107]=2, + [43108]=2, + [43109]=2, + [43110]=2, + [43111]=2, + [43112]=2, + [43113]=2, + [43114]=2, + [43115]=2, + [43116]=2, + [43117]=2, + [43118]=2, + [43119]=2, + [43120]=2, + [43121]=2, + [43122]=1, + [43123]=4, + [43204]=5, + [43205]=5, + [43232]=5, + [43233]=5, + [43234]=5, + [43235]=5, + [43236]=5, + [43237]=5, + [43238]=5, + [43239]=5, + [43240]=5, + [43241]=5, + [43242]=5, + [43243]=5, + [43244]=5, + [43245]=5, + [43246]=5, + [43247]=5, + [43248]=5, + [43249]=5, + [43302]=5, + [43303]=5, + [43304]=5, + [43305]=5, + [43306]=5, + [43307]=5, + [43308]=5, + [43309]=5, + [43335]=5, + [43336]=5, + [43337]=5, + [43338]=5, + [43339]=5, + [43340]=5, + [43341]=5, + [43342]=5, + [43343]=5, + [43344]=5, + [43345]=5, + [43392]=5, + [43393]=5, + [43394]=5, + [43443]=5, + [43446]=5, + [43447]=5, + [43448]=5, + [43449]=5, + [43452]=5, + [43493]=5, + [43561]=5, + [43562]=5, + [43563]=5, + [43564]=5, + [43565]=5, + [43566]=5, + [43569]=5, + [43570]=5, + [43573]=5, + [43574]=5, + [43587]=5, + [43596]=5, + [43644]=5, + [43696]=5, + [43698]=5, + [43699]=5, + [43700]=5, + [43703]=5, + [43704]=5, + [43710]=5, + [43711]=5, + [43713]=5, + [43756]=5, + [43757]=5, + [43766]=5, + [44005]=5, + [44008]=5, + [44013]=5, + [64286]=5, + [65056]=5, + [65057]=5, + [65058]=5, + [65059]=5, + [65060]=5, + [65061]=5, + [65062]=5, + [65063]=5, + [65064]=5, + [65065]=5, + [65066]=5, + [65067]=5, + [65068]=5, + [65069]=5, + [65070]=5, + [65071]=5, + [66045]=5, + [66272]=5, + [66422]=5, + [66423]=5, + [66424]=5, + [66425]=5, + [66426]=5, + [68097]=5, + [68098]=5, + [68099]=5, + [68101]=5, + [68102]=5, + [68108]=5, + [68109]=5, + [68110]=5, + [68111]=5, + [68152]=5, + [68153]=5, + [68154]=5, + [68159]=5, + [68288]=2, + [68289]=2, + [68290]=2, + [68291]=2, + [68292]=2, + [68293]=3, + [68294]=4, + [68295]=3, + [68296]=4, + [68297]=3, + [68298]=3, + [68299]=4, + [68300]=4, + [68301]=1, + [68302]=3, + [68303]=3, + [68304]=3, + [68305]=3, + [68306]=3, + [68307]=2, + [68308]=2, + [68309]=2, + [68310]=2, + [68311]=1, + [68312]=2, + [68313]=2, + [68314]=2, + [68315]=2, + [68316]=2, + [68317]=3, + [68318]=2, + [68319]=2, + [68320]=2, + [68321]=3, + [68322]=4, + [68323]=4, + [68324]=3, + [68325]=5, + [68326]=5, + [68331]=2, + [68332]=2, + [68333]=2, + [68334]=2, + [68335]=3, + [68480]=2, + [68481]=3, + [68482]=2, + [68483]=3, + [68484]=3, + [68485]=3, + [68486]=2, + [68487]=2, + [68488]=2, + [68489]=3, + [68490]=2, + [68491]=2, + [68492]=3, + [68493]=2, + [68494]=3, + [68495]=3, + [68496]=2, + [68497]=3, + [68521]=3, + [68522]=3, + [68523]=3, + [68524]=3, + [68525]=2, + [68526]=2, + [68527]=4, + [69633]=5, + [69688]=5, + [69689]=5, + [69690]=5, + [69691]=5, + [69692]=5, + [69693]=5, + [69694]=5, + [69695]=5, + [69696]=5, + [69697]=5, + [69698]=5, + [69699]=5, + [69700]=5, + [69701]=5, + [69702]=5, + [69759]=5, + [69760]=5, + [69761]=5, + [69811]=5, + [69812]=5, + [69813]=5, + [69814]=5, + [69817]=5, + [69818]=5, + [69888]=5, + [69889]=5, + [69890]=5, + [69927]=5, + [69928]=5, + [69929]=5, + [69930]=5, + [69931]=5, + [69933]=5, + [69934]=5, + [69935]=5, + [69936]=5, + [69937]=5, + [69938]=5, + [69939]=5, + [69940]=5, + [70003]=5, + [70016]=5, + [70017]=5, + [70070]=5, + [70071]=5, + [70072]=5, + [70073]=5, + [70074]=5, + [70075]=5, + [70076]=5, + [70077]=5, + [70078]=5, + [70090]=5, + [70091]=5, + [70092]=5, + [70191]=5, + [70192]=5, + [70193]=5, + [70196]=5, + [70198]=5, + [70199]=5, + [70206]=5, + [70367]=5, + [70371]=5, + [70372]=5, + [70373]=5, + [70374]=5, + [70375]=5, + [70376]=5, + [70377]=5, + [70378]=5, + [70400]=5, + [70401]=5, + [70460]=5, + [70464]=5, + [70502]=5, + [70503]=5, + [70504]=5, + [70505]=5, + [70506]=5, + [70507]=5, + [70508]=5, + [70512]=5, + [70513]=5, + [70514]=5, + [70515]=5, + [70516]=5, + [70712]=5, + [70713]=5, + [70714]=5, + [70715]=5, + [70716]=5, + [70717]=5, + [70718]=5, + [70719]=5, + [70722]=5, + [70723]=5, + [70724]=5, + [70726]=5, + [70835]=5, + [70836]=5, + [70837]=5, + [70838]=5, + [70839]=5, + [70840]=5, + [70842]=5, + [70847]=5, + [70848]=5, + [70850]=5, + [70851]=5, + [71090]=5, + [71091]=5, + [71092]=5, + [71093]=5, + [71100]=5, + [71101]=5, + [71103]=5, + [71104]=5, + [71132]=5, + [71133]=5, + [71219]=5, + [71220]=5, + [71221]=5, + [71222]=5, + [71223]=5, + [71224]=5, + [71225]=5, + [71226]=5, + [71229]=5, + [71231]=5, + [71232]=5, + [71339]=5, + [71341]=5, + [71344]=5, + [71345]=5, + [71346]=5, + [71347]=5, + [71348]=5, + [71349]=5, + [71351]=5, + [71453]=5, + [71454]=5, + [71455]=5, + [71458]=5, + [71459]=5, + [71460]=5, + [71461]=5, + [71463]=5, + [71464]=5, + [71465]=5, + [71466]=5, + [71467]=5, + [72193]=5, + [72194]=5, + [72195]=5, + [72196]=5, + [72197]=5, + [72198]=5, + [72201]=5, + [72202]=5, + [72243]=5, + [72244]=5, + [72245]=5, + [72246]=5, + [72247]=5, + [72248]=5, + [72251]=5, + [72252]=5, + [72253]=5, + [72254]=5, + [72263]=5, + [72273]=5, + [72274]=5, + [72275]=5, + [72276]=5, + [72277]=5, + [72278]=5, + [72281]=5, + [72282]=5, + [72283]=5, + [72330]=5, + [72331]=5, + [72332]=5, + [72333]=5, + [72334]=5, + [72335]=5, + [72336]=5, + [72337]=5, + [72338]=5, + [72339]=5, + [72340]=5, + [72341]=5, + [72342]=5, + [72344]=5, + [72345]=5, + [72752]=5, + [72753]=5, + [72754]=5, + [72755]=5, + [72756]=5, + [72757]=5, + [72758]=5, + [72760]=5, + [72761]=5, + [72762]=5, + [72763]=5, + [72764]=5, + [72765]=5, + [72767]=5, + [72850]=5, + [72851]=5, + [72852]=5, + [72853]=5, + [72854]=5, + [72855]=5, + [72856]=5, + [72857]=5, + [72858]=5, + [72859]=5, + [72860]=5, + [72861]=5, + [72862]=5, + [72863]=5, + [72864]=5, + [72865]=5, + [72866]=5, + [72867]=5, + [72868]=5, + [72869]=5, + [72870]=5, + [72871]=5, + [72874]=5, + [72875]=5, + [72876]=5, + [72877]=5, + [72878]=5, + [72879]=5, + [72880]=5, + [72882]=5, + [72883]=5, + [72885]=5, + [72886]=5, + [73009]=5, + [73010]=5, + [73011]=5, + [73012]=5, + [73013]=5, + [73014]=5, + [73018]=5, + [73020]=5, + [73021]=5, + [73023]=5, + [73024]=5, + [73025]=5, + [73026]=5, + [73027]=5, + [73028]=5, + [73029]=5, + [73031]=5, + [92912]=5, + [92913]=5, + [92914]=5, + [92915]=5, + [92916]=5, + [92976]=5, + [92977]=5, + [92978]=5, + [92979]=5, + [92980]=5, + [92981]=5, + [92982]=5, + [94095]=5, + [94096]=5, + [94097]=5, + [94098]=5, + [113821]=5, + [113822]=5, + [119143]=5, + [119144]=5, + [119145]=5, + [119163]=5, + [119164]=5, + [119165]=5, + [119166]=5, + [119167]=5, + [119168]=5, + [119169]=5, + [119170]=5, + [119173]=5, + [119174]=5, + [119175]=5, + [119176]=5, + [119177]=5, + [119178]=5, + [119179]=5, + [119210]=5, + [119211]=5, + [119212]=5, + [119213]=5, + [119362]=5, + [119363]=5, + [119364]=5, + [121344]=5, + [121345]=5, + [121346]=5, + [121347]=5, + [121348]=5, + [121349]=5, + [121350]=5, + [121351]=5, + [121352]=5, + [121353]=5, + [121354]=5, + [121355]=5, + [121356]=5, + [121357]=5, + [121358]=5, + [121359]=5, + [121360]=5, + [121361]=5, + [121362]=5, + [121363]=5, + [121364]=5, + [121365]=5, + [121366]=5, + [121367]=5, + [121368]=5, + [121369]=5, + [121370]=5, + [121371]=5, + [121372]=5, + [121373]=5, + [121374]=5, + [121375]=5, + [121376]=5, + [121377]=5, + [121378]=5, + [121379]=5, + [121380]=5, + [121381]=5, + [121382]=5, + [121383]=5, + [121384]=5, + [121385]=5, + [121386]=5, + [121387]=5, + [121388]=5, + [121389]=5, + [121390]=5, + [121391]=5, + [121392]=5, + [121393]=5, + [121394]=5, + [121395]=5, + [121396]=5, + [121397]=5, + [121398]=5, + [121403]=5, + [121404]=5, + [121405]=5, + [121406]=5, + [121407]=5, + [121408]=5, + [121409]=5, + [121410]=5, + [121411]=5, + [121412]=5, + [121413]=5, + [121414]=5, + [121415]=5, + [121416]=5, + [121417]=5, + [121418]=5, + [121419]=5, + [121420]=5, + [121421]=5, + [121422]=5, + [121423]=5, + [121424]=5, + [121425]=5, + [121426]=5, + [121427]=5, + [121428]=5, + [121429]=5, + [121430]=5, + [121431]=5, + [121432]=5, + [121433]=5, + [121434]=5, + [121435]=5, + [121436]=5, + [121437]=5, + [121438]=5, + [121439]=5, + [121440]=5, + [121441]=5, + [121442]=5, + [121443]=5, + [121444]=5, + [121445]=5, + [121446]=5, + [121447]=5, + [121448]=5, + [121449]=5, + [121450]=5, + [121451]=5, + [121452]=5, + [121461]=5, + [121476]=5, + [121499]=5, + [121500]=5, + [121501]=5, + [121502]=5, + [121503]=5, + [121505]=5, + [121506]=5, + [121507]=5, + [121508]=5, + [121509]=5, + [121510]=5, + [121511]=5, + [121512]=5, + [121513]=5, + [121514]=5, + [121515]=5, + [121516]=5, + [121517]=5, + [121518]=5, + [121519]=5, + [122880]=5, + [122881]=5, + [122882]=5, + [122883]=5, + [122884]=5, + [122885]=5, + [122886]=5, + [122888]=5, + [122889]=5, + [122890]=5, + [122891]=5, + [122892]=5, + [122893]=5, + [122894]=5, + [122895]=5, + [122896]=5, + [122897]=5, + [122898]=5, + [122899]=5, + [122900]=5, + [122901]=5, + [122902]=5, + [122903]=5, + [122904]=5, + [122907]=5, + [122908]=5, + [122909]=5, + [122910]=5, + [122911]=5, + [122912]=5, + [122913]=5, + [122915]=5, + [122916]=5, + [122918]=5, + [122919]=5, + [122920]=5, + [122921]=5, + [122922]=5, + [125136]=5, + [125137]=5, + [125138]=5, + [125139]=5, + [125140]=5, + [125141]=5, + [125142]=5, + [125184]=2, + [125185]=2, + [125186]=2, + [125187]=2, + [125188]=2, + [125189]=2, + [125190]=2, + [125191]=2, + [125192]=2, + [125193]=2, + [125194]=2, + [125195]=2, + [125196]=2, + [125197]=2, + [125198]=2, + [125199]=2, + [125200]=2, + [125201]=2, + [125202]=2, + [125203]=2, + [125204]=2, + [125205]=2, + [125206]=2, + [125207]=2, + [125208]=2, + [125209]=2, + [125210]=2, + [125211]=2, + [125212]=2, + [125213]=2, + [125214]=2, + [125215]=2, + [125216]=2, + [125217]=2, + [125218]=2, + [125219]=2, + [125220]=2, + [125221]=2, + [125222]=2, + [125223]=2, + [125224]=2, + [125225]=2, + [125226]=2, + [125227]=2, + [125228]=2, + [125229]=2, + [125230]=2, + [125231]=2, + [125232]=2, + [125233]=2, + [125234]=2, + [125235]=2, + [125236]=2, + [125237]=2, + [125238]=2, + [125239]=2, + [125240]=2, + [125241]=2, + [125242]=2, + [125243]=2, + [125244]=2, + [125245]=2, + [125246]=2, + [125247]=2, + [125248]=2, + [125249]=2, + [125250]=2, + [125251]=2, + [125252]=5, + [125253]=5, + [125254]=5, + [125255]=5, + [125256]=5, + [125257]=5, + [125258]=5, + [1042752]=5, +} + +characters.indicgroups={ + ["above_mark"]={ + [2304]=true, + [2305]=true, + [2306]=true, + [2362]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2385]=true, + [2387]=true, + [2388]=true, + [2389]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2879]=true, + [3008]=true, + [3021]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3142]=true, + [3143]=true, + [3144]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3149]=true, + [3263]=true, + [3270]=true, + [3406]=true, + [43232]=true, + [43233]=true, + [43234]=true, + [43235]=true, + [43236]=true, + [43237]=true, + [43238]=true, + [43239]=true, + [43240]=true, + [43241]=true, + [43242]=true, + [43243]=true, + [43244]=true, + [43245]=true, + [43246]=true, + [43247]=true, + [43248]=true, + [43249]=true, + }, + ["after_half"]={}, + ["after_main"]={ + [2864]=true, + [2879]=true, + [2902]=true, + [3376]=true, + }, + ["after_postscript"]={ + [2433]=true, + [2494]=true, + [2496]=true, + [2519]=true, + [2561]=true, + [2562]=true, + [2622]=true, + [2624]=true, + [2625]=true, + [2626]=true, + [2672]=true, + [2673]=true, + [2750]=true, + [2752]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2786]=true, + [2787]=true, + [2878]=true, + [2880]=true, + [2903]=true, + [2992]=true, + [3006]=true, + [3007]=true, + [3009]=true, + [3010]=true, + [3031]=true, + [3120]=true, + [3248]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3415]=true, + }, + ["after_subscript"]={ + [2366]=true, + [2368]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2402]=true, + [2403]=true, + [2480]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2530]=true, + [2531]=true, + [2544]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [3008]=true, + [3139]=true, + [3140]=true, + [3267]=true, + [3268]=true, + [3285]=true, + [3286]=true, + }, + ["anudatta"]={ + [2386]=true, + }, + ["before_half"]={ + [2367]=true, + [2382]=true, + [2495]=true, + [2503]=true, + [2504]=true, + [2623]=true, + [2751]=true, + [2887]=true, + }, + ["before_main"]={ + [3014]=true, + [3015]=true, + [3016]=true, + [3398]=true, + [3399]=true, + [3400]=true, + }, + ["before_postscript"]={ + [2352]=true, + [2736]=true, + }, + ["before_subscript"]={ + [2608]=true, + [2817]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3137]=true, + [3138]=true, + [3142]=true, + [3143]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3157]=true, + [3158]=true, + [3262]=true, + [3263]=true, + [3265]=true, + [3266]=true, + [3270]=true, + [3276]=true, + [3298]=true, + [3299]=true, + }, + ["below_mark"]={ + [2364]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2381]=true, + [2386]=true, + [2390]=true, + [2391]=true, + [2402]=true, + [2403]=true, + [2492]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2509]=true, + [2620]=true, + [2625]=true, + [2626]=true, + [2637]=true, + [2748]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2765]=true, + [2876]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [2884]=true, + [2893]=true, + [2914]=true, + [2915]=true, + [3009]=true, + [3010]=true, + [3170]=true, + [3171]=true, + [3260]=true, + [3298]=true, + [3299]=true, + [3426]=true, + [3427]=true, + }, + ["consonant"]={ + [2325]=true, + [2326]=true, + [2327]=true, + [2328]=true, + [2329]=true, + [2330]=true, + [2331]=true, + [2332]=true, + [2333]=true, + [2334]=true, + [2335]=true, + [2336]=true, + [2337]=true, + [2338]=true, + [2339]=true, + [2340]=true, + [2341]=true, + [2342]=true, + [2343]=true, + [2344]=true, + [2345]=true, + [2346]=true, + [2347]=true, + [2348]=true, + [2349]=true, + [2350]=true, + [2351]=true, + [2352]=true, + [2353]=true, + [2354]=true, + [2355]=true, + [2356]=true, + [2357]=true, + [2358]=true, + [2359]=true, + [2360]=true, + [2361]=true, + [2392]=true, + [2393]=true, + [2394]=true, + [2395]=true, + [2396]=true, + [2397]=true, + [2398]=true, + [2399]=true, + [2424]=true, + [2425]=true, + [2426]=true, + [2453]=true, + [2454]=true, + [2455]=true, + [2456]=true, + [2457]=true, + [2458]=true, + [2459]=true, + [2460]=true, + [2461]=true, + [2462]=true, + [2463]=true, + [2464]=true, + [2465]=true, + [2466]=true, + [2467]=true, + [2468]=true, + [2469]=true, + [2470]=true, + [2471]=true, + [2472]=true, + [2474]=true, + [2475]=true, + [2476]=true, + [2477]=true, + [2478]=true, + [2479]=true, + [2480]=true, + [2482]=true, + [2486]=true, + [2487]=true, + [2488]=true, + [2489]=true, + [2510]=true, + [2524]=true, + [2525]=true, + [2527]=true, + [2581]=true, + [2582]=true, + [2583]=true, + [2584]=true, + [2585]=true, + [2586]=true, + [2587]=true, + [2588]=true, + [2589]=true, + [2590]=true, + [2591]=true, + [2592]=true, + [2593]=true, + [2594]=true, + [2595]=true, + [2596]=true, + [2597]=true, + [2598]=true, + [2599]=true, + [2600]=true, + [2602]=true, + [2603]=true, + [2604]=true, + [2605]=true, + [2606]=true, + [2607]=true, + [2608]=true, + [2610]=true, + [2611]=true, + [2613]=true, + [2614]=true, + [2616]=true, + [2617]=true, + [2649]=true, + [2650]=true, + [2651]=true, + [2652]=true, + [2654]=true, + [2709]=true, + [2710]=true, + [2711]=true, + [2712]=true, + [2713]=true, + [2714]=true, + [2715]=true, + [2716]=true, + [2717]=true, + [2718]=true, + [2719]=true, + [2720]=true, + [2721]=true, + [2722]=true, + [2723]=true, + [2724]=true, + [2725]=true, + [2726]=true, + [2727]=true, + [2728]=true, + [2730]=true, + [2731]=true, + [2732]=true, + [2733]=true, + [2734]=true, + [2735]=true, + [2736]=true, + [2738]=true, + [2739]=true, + [2741]=true, + [2742]=true, + [2743]=true, + [2744]=true, + [2745]=true, + [2837]=true, + [2838]=true, + [2839]=true, + [2840]=true, + [2841]=true, + [2842]=true, + [2843]=true, + [2844]=true, + [2845]=true, + [2846]=true, + [2847]=true, + [2848]=true, + [2849]=true, + [2850]=true, + [2851]=true, + [2852]=true, + [2853]=true, + [2854]=true, + [2855]=true, + [2856]=true, + [2858]=true, + [2859]=true, + [2860]=true, + [2861]=true, + [2862]=true, + [2863]=true, + [2864]=true, + [2866]=true, + [2867]=true, + [2869]=true, + [2870]=true, + [2871]=true, + [2872]=true, + [2873]=true, + [2908]=true, + [2909]=true, + [2929]=true, + [2965]=true, + [2969]=true, + [2970]=true, + [2972]=true, + [2974]=true, + [2975]=true, + [2979]=true, + [2980]=true, + [2984]=true, + [2985]=true, + [2986]=true, + [2990]=true, + [2991]=true, + [2992]=true, + [2993]=true, + [2994]=true, + [2995]=true, + [2996]=true, + [2997]=true, + [2998]=true, + [2999]=true, + [3000]=true, + [3001]=true, + [3093]=true, + [3094]=true, + [3095]=true, + [3096]=true, + [3097]=true, + [3098]=true, + [3099]=true, + [3100]=true, + [3101]=true, + [3102]=true, + [3103]=true, + [3104]=true, + [3105]=true, + [3106]=true, + [3107]=true, + [3108]=true, + [3109]=true, + [3110]=true, + [3111]=true, + [3112]=true, + [3114]=true, + [3115]=true, + [3116]=true, + [3117]=true, + [3118]=true, + [3119]=true, + [3120]=true, + [3121]=true, + [3122]=true, + [3123]=true, + [3124]=true, + [3125]=true, + [3126]=true, + [3127]=true, + [3128]=true, + [3129]=true, + [3133]=true, + [3221]=true, + [3222]=true, + [3223]=true, + [3224]=true, + [3225]=true, + [3226]=true, + [3227]=true, + [3228]=true, + [3229]=true, + [3230]=true, + [3231]=true, + [3232]=true, + [3233]=true, + [3234]=true, + [3235]=true, + [3236]=true, + [3237]=true, + [3238]=true, + [3239]=true, + [3240]=true, + [3242]=true, + [3243]=true, + [3244]=true, + [3245]=true, + [3246]=true, + [3247]=true, + [3248]=true, + [3249]=true, + [3250]=true, + [3251]=true, + [3253]=true, + [3254]=true, + [3255]=true, + [3256]=true, + [3257]=true, + [3294]=true, + [3349]=true, + [3350]=true, + [3351]=true, + [3352]=true, + [3353]=true, + [3354]=true, + [3355]=true, + [3356]=true, + [3357]=true, + [3358]=true, + [3359]=true, + [3360]=true, + [3361]=true, + [3362]=true, + [3363]=true, + [3364]=true, + [3365]=true, + [3366]=true, + [3367]=true, + [3368]=true, + [3369]=true, + [3370]=true, + [3371]=true, + [3372]=true, + [3373]=true, + [3374]=true, + [3375]=true, + [3376]=true, + [3377]=true, + [3378]=true, + [3379]=true, + [3380]=true, + [3381]=true, + [3382]=true, + [3383]=true, + [3384]=true, + [3385]=true, + [3386]=true, + }, + ["dependent_vowel"]={ + [2362]=true, + [2363]=true, + [2366]=true, + [2367]=true, + [2368]=true, + [2369]=true, + [2370]=true, + [2371]=true, + [2372]=true, + [2373]=true, + [2374]=true, + [2375]=true, + [2376]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2382]=true, + [2383]=true, + [2389]=true, + [2390]=true, + [2391]=true, + [2402]=true, + [2403]=true, + [2494]=true, + [2495]=true, + [2496]=true, + [2497]=true, + [2498]=true, + [2499]=true, + [2500]=true, + [2503]=true, + [2504]=true, + [2622]=true, + [2623]=true, + [2624]=true, + [2625]=true, + [2626]=true, + [2631]=true, + [2632]=true, + [2635]=true, + [2636]=true, + [2750]=true, + [2751]=true, + [2752]=true, + [2753]=true, + [2754]=true, + [2755]=true, + [2756]=true, + [2757]=true, + [2759]=true, + [2760]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2878]=true, + [2879]=true, + [2880]=true, + [2881]=true, + [2882]=true, + [2883]=true, + [2884]=true, + [2887]=true, + [2888]=true, + [2891]=true, + [2892]=true, + [2914]=true, + [2915]=true, + [3006]=true, + [3007]=true, + [3008]=true, + [3009]=true, + [3010]=true, + [3014]=true, + [3015]=true, + [3016]=true, + [3018]=true, + [3019]=true, + [3020]=true, + [3134]=true, + [3135]=true, + [3136]=true, + [3137]=true, + [3138]=true, + [3139]=true, + [3140]=true, + [3142]=true, + [3143]=true, + [3144]=true, + [3146]=true, + [3147]=true, + [3148]=true, + [3170]=true, + [3171]=true, + [3262]=true, + [3263]=true, + [3264]=true, + [3265]=true, + [3266]=true, + [3267]=true, + [3268]=true, + [3270]=true, + [3271]=true, + [3272]=true, + [3274]=true, + [3275]=true, + [3276]=true, + [3298]=true, + [3299]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3396]=true, + [3398]=true, + [3399]=true, + [3400]=true, + [3402]=true, + [3403]=true, + [3404]=true, + [3415]=true, + [3426]=true, + [3427]=true, + }, + ["halant"]={ + [2381]=true, + [2509]=true, + [2637]=true, + [2765]=true, + [2893]=true, + [3021]=true, + [3149]=true, + [3277]=true, + [3405]=true, + }, + ["independent_vowel"]={ + [2308]=true, + [2309]=true, + [2310]=true, + [2311]=true, + [2312]=true, + [2313]=true, + [2314]=true, + [2315]=true, + [2316]=true, + [2317]=true, + [2318]=true, + [2319]=true, + [2320]=true, + [2321]=true, + [2322]=true, + [2323]=true, + [2324]=true, + [2400]=true, + [2401]=true, + [2418]=true, + [2419]=true, + [2420]=true, + [2421]=true, + [2422]=true, + [2423]=true, + [2437]=true, + [2438]=true, + [2439]=true, + [2440]=true, + [2441]=true, + [2442]=true, + [2443]=true, + [2444]=true, + [2447]=true, + [2448]=true, + [2451]=true, + [2452]=true, + [2528]=true, + [2529]=true, + [2530]=true, + [2531]=true, + [2565]=true, + [2566]=true, + [2567]=true, + [2568]=true, + [2569]=true, + [2570]=true, + [2575]=true, + [2576]=true, + [2579]=true, + [2580]=true, + [2693]=true, + [2694]=true, + [2695]=true, + [2696]=true, + [2697]=true, + [2698]=true, + [2699]=true, + [2700]=true, + [2701]=true, + [2703]=true, + [2704]=true, + [2705]=true, + [2707]=true, + [2708]=true, + [2784]=true, + [2785]=true, + [2786]=true, + [2787]=true, + [2821]=true, + [2822]=true, + [2823]=true, + [2824]=true, + [2825]=true, + [2826]=true, + [2827]=true, + [2828]=true, + [2831]=true, + [2832]=true, + [2835]=true, + [2836]=true, + [2912]=true, + [2913]=true, + [2949]=true, + [2950]=true, + [2951]=true, + [2952]=true, + [2953]=true, + [2954]=true, + [2958]=true, + [2959]=true, + [2960]=true, + [2962]=true, + [2963]=true, + [2964]=true, + [3077]=true, + [3078]=true, + [3079]=true, + [3080]=true, + [3081]=true, + [3082]=true, + [3083]=true, + [3084]=true, + [3086]=true, + [3087]=true, + [3088]=true, + [3090]=true, + [3091]=true, + [3092]=true, + [3168]=true, + [3169]=true, + [3205]=true, + [3206]=true, + [3207]=true, + [3208]=true, + [3209]=true, + [3210]=true, + [3211]=true, + [3212]=true, + [3214]=true, + [3215]=true, + [3216]=true, + [3218]=true, + [3219]=true, + [3220]=true, + [3296]=true, + [3297]=true, + [3333]=true, + [3334]=true, + [3335]=true, + [3336]=true, + [3337]=true, + [3338]=true, + [3339]=true, + [3340]=true, + [3342]=true, + [3343]=true, + [3344]=true, + [3346]=true, + [3347]=true, + [3348]=true, + [3423]=true, + [3424]=true, + [3425]=true, + }, + ["nukta"]={ + [2364]=true, + [2492]=true, + [2620]=true, + [2748]=true, + [2876]=true, + [3260]=true, + }, + ["post_mark"]={ + [2307]=true, + [2363]=true, + [2366]=true, + [2368]=true, + [2377]=true, + [2378]=true, + [2379]=true, + [2380]=true, + [2383]=true, + [2494]=true, + [2496]=true, + [2503]=true, + [2504]=true, + [2622]=true, + [2624]=true, + [2750]=true, + [2752]=true, + [2761]=true, + [2763]=true, + [2764]=true, + [2878]=true, + [2880]=true, + [3006]=true, + [3007]=true, + [3137]=true, + [3138]=true, + [3139]=true, + [3140]=true, + [3262]=true, + [3264]=true, + [3265]=true, + [3266]=true, + [3267]=true, + [3268]=true, + [3271]=true, + [3272]=true, + [3274]=true, + [3275]=true, + [3276]=true, + [3390]=true, + [3391]=true, + [3392]=true, + [3393]=true, + [3394]=true, + [3395]=true, + [3396]=true, + [3415]=true, + }, + ["pre_mark"]={ + [2367]=true, + [2382]=true, + [2495]=true, + [2623]=true, + [2751]=true, + [2887]=true, + [2888]=true, + [3014]=true, + [3015]=true, + [3016]=true, + [3398]=true, + [3399]=true, + [3400]=true, + }, + ["ra"]={ + [2352]=true, + [2480]=true, + [2608]=true, + [2736]=true, + [2864]=true, + [2992]=true, + [3120]=true, + [3248]=true, + [3376]=true, + }, + ["stress_tone_mark"]={ + [2385]=true, + [2386]=true, + [2387]=true, + [2388]=true, + [2507]=true, + [2508]=true, + [3277]=true, + [3405]=true, + }, + ["twopart_mark"]={ + [2891]={ 2887, 2878 }, + [2892]={ 2887, 2903 }, + [3018]={ 3014, 3006 }, + [3019]={ 3015, 3006 }, + [3020]={ 3014, 3031 }, + [3402]={ 3398, 3390 }, + [3403]={ 3399, 3390 }, + [3404]={ 3398, 3415 }, + }, + ["vowel_modifier"]={ + [2304]=true, + [2305]=true, + [2306]=true, + [2307]=true, + [3330]=true, + [3331]=true, + [43232]=true, + [43233]=true, + [43234]=true, + [43235]=true, + [43236]=true, + [43237]=true, + [43238]=true, + [43239]=true, + [43240]=true, + [43241]=true, + [43242]=true, + [43243]=true, + [43244]=true, + [43245]=true, + [43246]=true, + [43247]=true, + [43248]=true, + [43249]=true, + }, +} + +-- done diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-gen.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-gen.lua index 64f3be21832..3959ca02221 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-gen.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-basics-gen.lua @@ -18,6 +18,7 @@ local match, gmatch, gsub, lower = string.match, string.gmatch, string.gsub, str local formatters, split, format, dump = string.formatters, string.split, string.format, string.dump local loadfile, type = loadfile, type local setmetatable, getmetatable, collectgarbage = setmetatable, getmetatable, collectgarbage +local floor = math.floor local dummyfunction = function() end @@ -405,3 +406,74 @@ if arg then end end end + +-- another one + +if not number.idiv then + function number.idiv(i,d) + return floor(i/d) -- i//d in 5.3 + end +end + +-- hook into unicode + +local u = unicode and unicode.utf8 + +if u then + + utf.lower = u.lower + utf.upper = u.upper + utf.char = u.char + utf.byte = u.byte + utf.len = u.len + + -- needed on font-* + + if lpeg.setutfcasers then + lpeg.setutfcasers(u.lower,u.upper) + end + + -- needed on font-otr + + local bytepairs = string.bytepairs + local utfchar = utf.char + local concat = table.concat + + function utf.utf16_to_utf8_be(s) + if not s then + return nil + elseif s == "" then + return "" + end + local result, r, more = { }, 0, 0 + for left, right in bytepairs(s) do + if right then + local now = 256*left + right + if more > 0 then + now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 + more = 0 + r = r + 1 + result[r] = utfchar(now) + elseif now >= 0xD800 and now <= 0xDBFF then + more = now + else + r = r + 1 + result[r] = utfchar(now) + end + end + end + return concat(result) + end + + local characters = string.utfcharacters + + function utf.split(str) + local t, n = { }, 0 + for s in characters(str) do + n = n + 1 + t[n] = s + end + return t + end + +end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua index 2c7d6152151..75486624b1b 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua @@ -26,7 +26,7 @@ if not modules then modules = { } end modules ['font-cff'] = { -- with merging subroutines and flattening, not so much with calculations.) On -- the other hand, we can now feed back cff2 stuff. -local next, type, tonumber = next, type, tonumber +local next, type, tonumber, rawget = next, type, tonumber, rawget local byte, char, gmatch = string.byte, string.char, string.gmatch local concat, remove, unpack = table.concat, table.remove, table.unpack local floor, abs, round, ceil, min, max = math.floor, math.abs, math.round, math.ceil, math.min, math.max @@ -34,6 +34,8 @@ local P, C, R, S, C, Cs, Ct = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, l local lpegmatch = lpeg.match local formatters = string.formatters local bytetable = string.bytetable +local idiv = number.idiv +local rshift, band, extract = bit32.rshift, bit32.band, bit32.extract local readers = fonts.handlers.otf.readers local streamreader = readers.streamreader @@ -287,12 +289,30 @@ do result.fontbbox = { unpack(stack,1,4) } top = 0 end - -- + P("\06") / function() end -- bluevalues - -- + P("\07") / function() end -- otherblues - -- + P("\08") / function() end -- familyblues - -- + P("\09") / function() end -- familyotherblues - -- + P("\10") / function() end -- strhw - -- + P("\11") / function() end -- stdvw + + P("\06") / function() + result.bluevalues = { unpack(stack,1,top) } + top = 0 + end + + P("\07") / function() + result.otherblues = { unpack(stack,1,top) } + top = 0 + end + + P("\08") / function() + result.familyblues = { unpack(stack,1,top) } + top = 0 + end + + P("\09") / function() + result.familyotherblues = { unpack(stack,1,top) } + top = 0 + end + + P("\10") / function() + result.strhw = stack[top] + top = 0 + end + + P("\11") / function() + result.strvw = stack[top] + top = 0 + end + P("\13") / function() result.uniqueid = stack[top] top = 0 @@ -386,6 +406,26 @@ do result.strokewidth = stack[top] top = 0 end + + P("\09") / function() + result.bluescale = stack[top] + top = 0 + end + + P("\10") / function() + result.bluesnap = stack[top] + top = 0 + end + + P("\11") / function() + result.bluefuzz = stack[top] + top = 0 + end + + P("\12") / function() + result.stemsnaph = { unpack(stack,1,top) } + top = 0 + end + + P("\13") / function() + result.stemsnapv = { unpack(stack,1,top) } + top = 0 + end + P("\20") / function() result.syntheticbase = stack[top] top = 0 @@ -446,52 +486,27 @@ do -- the second variant is much faster. Not that it matters much as we don't see -- such numbers often. - local p_last = P("\x0F") / "0" + P("\x1F") / "1" + P("\x2F") / "2" + P("\x3F") / "3" - + P("\x4F") / "4" + P("\x5F") / "5" + P("\x6F") / "6" + P("\x7F") / "7" - + P("\x8F") / "8" + P("\x9F") / "9" + P("\xAF") / "" + P("\xBF") / "" - + P("\xCF") / "" + P("\xDF") / "" + P("\xEF") / "" + R("\xF0\xFF") / "" - - -- local remap = { [0] = - -- "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0.", "0E", "0E-", "0", "0-", "0", - -- "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "0.", "0E", "0E-", "0", "0-", "0", - -- "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "0.", "0E", "0E-", "0", "0-", "0", - -- "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "0.", "0E", "0E-", "0", "0-", "0", - -- "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "0.", "0E", "0E-", "0", "0-", "0", - -- "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "0.", "0E", "0E-", "0", "0-", "0", - -- "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "0.", "0E", "0E-", "0", "0-", "0", - -- "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "0.", "0E", "0E-", "0", "0-", "0", - -- "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "0.", "0E", "0E-", "0", "0-", "0", - -- "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "0.", "0E", "0E-", "0", "0-", "0", - -- ".0", ".1", ".2", ".3", ".4", ".5", ".6", ".7", ".8", ".9", "..", ".E", ".E-", ".", ".-", ".", - -- "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "E.", "EE", "EE-", "E", "E-", "E", - -- "E-0", "E-1", "E-2", "E-3", "E-4", "E-5", "E-6", "E-7", "E-8", "E-9", "E-.", "E-E", "E-E-", "E-", "E--", "E-", - -- "-0", "-1", "-2", "-3", "-4", "-5", "-6", "-7", "-8", "-9", "-.", "-E", "-E-", "-", "--", "-", - -- } - - -- local p_nibbles = Cs(((1-p_last)/byte/remap)^0+p_last) - - -- local p = P("\30") * p_nibbles / function(t) - -- print(tonumber(t)) - -- end - local remap = { ["\x00"] = "00", ["\x01"] = "01", ["\x02"] = "02", ["\x03"] = "03", ["\x04"] = "04", ["\x05"] = "05", ["\x06"] = "06", ["\x07"] = "07", ["\x08"] = "08", ["\x09"] = "09", ["\x0A"] = "0.", ["\x0B"] = "0E", ["\x0C"] = "0E-", ["\x0D"] = "0", ["\x0E"] = "0-", ["\x0F"] = "0", - ["\x10"] = "10", ["\x11"] = "11", ["\x12"] = "12", ["\x13"] = "13", ["\x14"] = "14", ["\x15"] = "15", ["\x16"] = "16", ["\x17"] = "17", ["\x18"] = "18", ["\x19"] = "19", ["\x1A"] = "0.", ["\x1B"] = "0E", ["\x1C"] = "0E-", ["\x1D"] = "0", ["\x1E"] = "0-", ["\x1F"] = "0", - ["\x20"] = "20", ["\x21"] = "21", ["\x22"] = "22", ["\x23"] = "23", ["\x24"] = "24", ["\x25"] = "25", ["\x26"] = "26", ["\x27"] = "27", ["\x28"] = "28", ["\x29"] = "29", ["\x2A"] = "0.", ["\x2B"] = "0E", ["\x2C"] = "0E-", ["\x2D"] = "0", ["\x2E"] = "0-", ["\x2F"] = "0", - ["\x30"] = "30", ["\x31"] = "31", ["\x32"] = "32", ["\x33"] = "33", ["\x34"] = "34", ["\x35"] = "35", ["\x36"] = "36", ["\x37"] = "37", ["\x38"] = "38", ["\x39"] = "39", ["\x3A"] = "0.", ["\x3B"] = "0E", ["\x3C"] = "0E-", ["\x3D"] = "0", ["\x3E"] = "0-", ["\x3F"] = "0", - ["\x40"] = "40", ["\x41"] = "41", ["\x42"] = "42", ["\x43"] = "43", ["\x44"] = "44", ["\x45"] = "45", ["\x46"] = "46", ["\x47"] = "47", ["\x48"] = "48", ["\x49"] = "49", ["\x4A"] = "0.", ["\x4B"] = "0E", ["\x4C"] = "0E-", ["\x4D"] = "0", ["\x4E"] = "0-", ["\x4F"] = "0", - ["\x50"] = "50", ["\x51"] = "51", ["\x52"] = "52", ["\x53"] = "53", ["\x54"] = "54", ["\x55"] = "55", ["\x56"] = "56", ["\x57"] = "57", ["\x58"] = "58", ["\x59"] = "59", ["\x5A"] = "0.", ["\x5B"] = "0E", ["\x5C"] = "0E-", ["\x5D"] = "0", ["\x5E"] = "0-", ["\x5F"] = "0", - ["\x60"] = "60", ["\x61"] = "61", ["\x62"] = "62", ["\x63"] = "63", ["\x64"] = "64", ["\x65"] = "65", ["\x66"] = "66", ["\x67"] = "67", ["\x68"] = "68", ["\x69"] = "69", ["\x6A"] = "0.", ["\x6B"] = "0E", ["\x6C"] = "0E-", ["\x6D"] = "0", ["\x6E"] = "0-", ["\x6F"] = "0", - ["\x70"] = "70", ["\x71"] = "71", ["\x72"] = "72", ["\x73"] = "73", ["\x74"] = "74", ["\x75"] = "75", ["\x76"] = "76", ["\x77"] = "77", ["\x78"] = "78", ["\x79"] = "79", ["\x7A"] = "0.", ["\x7B"] = "0E", ["\x7C"] = "0E-", ["\x7D"] = "0", ["\x7E"] = "0-", ["\x7F"] = "0", - ["\x80"] = "80", ["\x81"] = "81", ["\x82"] = "82", ["\x83"] = "83", ["\x84"] = "84", ["\x85"] = "85", ["\x86"] = "86", ["\x87"] = "87", ["\x88"] = "88", ["\x89"] = "89", ["\x8A"] = "0.", ["\x8B"] = "0E", ["\x8C"] = "0E-", ["\x8D"] = "0", ["\x8E"] = "0-", ["\x8F"] = "0", - ["\x90"] = "90", ["\x91"] = "91", ["\x92"] = "92", ["\x93"] = "93", ["\x94"] = "94", ["\x95"] = "95", ["\x96"] = "96", ["\x97"] = "97", ["\x98"] = "98", ["\x99"] = "99", ["\x9A"] = "0.", ["\x9B"] = "0E", ["\x9C"] = "0E-", ["\x9D"] = "0", ["\x9E"] = "0-", ["\x9F"] = "0", + ["\x10"] = "10", ["\x11"] = "11", ["\x12"] = "12", ["\x13"] = "13", ["\x14"] = "14", ["\x15"] = "15", ["\x16"] = "16", ["\x17"] = "17", ["\x18"] = "18", ["\x19"] = "19", ["\x1A"] = "1.", ["\x1B"] = "1E", ["\x1C"] = "1E-", ["\x1D"] = "1", ["\x1E"] = "1-", ["\x1F"] = "1", + ["\x20"] = "20", ["\x21"] = "21", ["\x22"] = "22", ["\x23"] = "23", ["\x24"] = "24", ["\x25"] = "25", ["\x26"] = "26", ["\x27"] = "27", ["\x28"] = "28", ["\x29"] = "29", ["\x2A"] = "2.", ["\x2B"] = "2E", ["\x2C"] = "2E-", ["\x2D"] = "2", ["\x2E"] = "2-", ["\x2F"] = "2", + ["\x30"] = "30", ["\x31"] = "31", ["\x32"] = "32", ["\x33"] = "33", ["\x34"] = "34", ["\x35"] = "35", ["\x36"] = "36", ["\x37"] = "37", ["\x38"] = "38", ["\x39"] = "39", ["\x3A"] = "3.", ["\x3B"] = "3E", ["\x3C"] = "3E-", ["\x3D"] = "3", ["\x3E"] = "3-", ["\x3F"] = "3", + ["\x40"] = "40", ["\x41"] = "41", ["\x42"] = "42", ["\x43"] = "43", ["\x44"] = "44", ["\x45"] = "45", ["\x46"] = "46", ["\x47"] = "47", ["\x48"] = "48", ["\x49"] = "49", ["\x4A"] = "4.", ["\x4B"] = "4E", ["\x4C"] = "4E-", ["\x4D"] = "4", ["\x4E"] = "4-", ["\x4F"] = "4", + ["\x50"] = "50", ["\x51"] = "51", ["\x52"] = "52", ["\x53"] = "53", ["\x54"] = "54", ["\x55"] = "55", ["\x56"] = "56", ["\x57"] = "57", ["\x58"] = "58", ["\x59"] = "59", ["\x5A"] = "5.", ["\x5B"] = "5E", ["\x5C"] = "5E-", ["\x5D"] = "5", ["\x5E"] = "5-", ["\x5F"] = "5", + ["\x60"] = "60", ["\x61"] = "61", ["\x62"] = "62", ["\x63"] = "63", ["\x64"] = "64", ["\x65"] = "65", ["\x66"] = "66", ["\x67"] = "67", ["\x68"] = "68", ["\x69"] = "69", ["\x6A"] = "6.", ["\x6B"] = "6E", ["\x6C"] = "6E-", ["\x6D"] = "6", ["\x6E"] = "6-", ["\x6F"] = "6", + ["\x70"] = "70", ["\x71"] = "71", ["\x72"] = "72", ["\x73"] = "73", ["\x74"] = "74", ["\x75"] = "75", ["\x76"] = "76", ["\x77"] = "77", ["\x78"] = "78", ["\x79"] = "79", ["\x7A"] = "7.", ["\x7B"] = "7E", ["\x7C"] = "7E-", ["\x7D"] = "7", ["\x7E"] = "7-", ["\x7F"] = "7", + ["\x80"] = "80", ["\x81"] = "81", ["\x82"] = "82", ["\x83"] = "83", ["\x84"] = "84", ["\x85"] = "85", ["\x86"] = "86", ["\x87"] = "87", ["\x88"] = "88", ["\x89"] = "89", ["\x8A"] = "8.", ["\x8B"] = "8E", ["\x8C"] = "8E-", ["\x8D"] = "8", ["\x8E"] = "8-", ["\x8F"] = "8", + ["\x90"] = "90", ["\x91"] = "91", ["\x92"] = "92", ["\x93"] = "93", ["\x94"] = "94", ["\x95"] = "95", ["\x96"] = "96", ["\x97"] = "97", ["\x98"] = "98", ["\x99"] = "99", ["\x9A"] = "9.", ["\x9B"] = "9E", ["\x9C"] = "9E-", ["\x9D"] = "9", ["\x9E"] = "9-", ["\x9F"] = "9", ["\xA0"] = ".0", ["\xA1"] = ".1", ["\xA2"] = ".2", ["\xA3"] = ".3", ["\xA4"] = ".4", ["\xA5"] = ".5", ["\xA6"] = ".6", ["\xA7"] = ".7", ["\xA8"] = ".8", ["\xA9"] = ".9", ["\xAA"] = "..", ["\xAB"] = ".E", ["\xAC"] = ".E-", ["\xAD"] = ".", ["\xAE"] = ".-", ["\xAF"] = ".", ["\xB0"] = "E0", ["\xB1"] = "E1", ["\xB2"] = "E2", ["\xB3"] = "E3", ["\xB4"] = "E4", ["\xB5"] = "E5", ["\xB6"] = "E6", ["\xB7"] = "E7", ["\xB8"] = "E8", ["\xB9"] = "E9", ["\xBA"] = "E.", ["\xBB"] = "EE", ["\xBC"] = "EE-", ["\xBD"] = "E", ["\xBE"] = "E-", ["\xBF"] = "E", ["\xC0"] = "E-0", ["\xC1"] = "E-1", ["\xC2"] = "E-2", ["\xC3"] = "E-3", ["\xC4"] = "E-4", ["\xC5"] = "E-5", ["\xC6"] = "E-6", ["\xC7"] = "E-7", ["\xC8"] = "E-8", ["\xC9"] = "E-9", ["\xCA"] = "E-.", ["\xCB"] = "E-E", ["\xCC"] = "E-E-", ["\xCD"] = "E-", ["\xCE"] = "E--", ["\xCF"] = "E-", ["\xD0"] = "-0", ["\xD1"] = "-1", ["\xD2"] = "-2", ["\xD3"] = "-3", ["\xD4"] = "-4", ["\xD5"] = "-5", ["\xD6"] = "-6", ["\xD7"] = "-7", ["\xD8"] = "-8", ["\xD9"] = "-9", ["\xDA"] = "-.", ["\xDB"] = "-E", ["\xDC"] = "-E-", ["\xDD"] = "-", ["\xDE"] = "--", ["\xDF"] = "-", } - local p_nibbles = P("\30") * Cs(((1-p_last)/remap)^0+p_last) / function(n) + local p_last = S("\x0F\x1F\x2F\x3F\x4F\x5F\x6F\x7F\x8F\x9F\xAF\xBF") + + R("\xF0\xFF") + + local p_nibbles = P("\30") * Cs(((1-p_last)/remap)^0 * (P(1)/remap)) / function(n) -- 0-9=digit a=. b=E c=E- d=reserved e=- f=finish top = top + 1 stack[top] = tonumber(n) or 0 @@ -1230,7 +1245,7 @@ do if trace_charstrings then showstate("stem") end - stems = stems + top/2 + stems = stems + idiv(top,2) top = 0 end @@ -1251,14 +1266,15 @@ do if trace_charstrings then showstate(operator == 19 and "hintmark" or "cntrmask") end - stems = stems + top/2 + stems = stems + idiv(top,2) top = 0 if stems == 0 then -- forget about it elseif stems <= 8 then return 1 else - return floor((stems+7)/8) + -- return floor((stems+7)/8) + return idiv(stems+7,8) end end @@ -1305,8 +1321,9 @@ do local function hsbw() if version == 1 then if trace_charstrings then - showstate("dotsection") + showstate("hsbw") end + -- lsb = stack[top-1] width = stack[top] end top = 0 @@ -1528,89 +1545,115 @@ do [037] = flex1, } - local c_endchar = char(14) + local chars = setmetatableindex(function (t,k) + local v = char(k) + t[k] = v + return v + end) - local passon do + local c_endchar = chars[14] - -- todo: round in blend - -- todo: delay this hash + -- todo: round in blend - local rshift = bit32.rshift - local band = bit32.band - local round = math.round + local encode = { } - local encode = table.setmetatableindex(function(t,i) - for i=-2048,-1130 do - t[i] = char(28,band(rshift(i,8),0xFF),band(i,0xFF)) - end - for i=-1131,-108 do - local v = 0xFB00 - i - 108 - t[i] = char(band(rshift(v,8),0xFF),band(v,0xFF)) - end - for i=-107,107 do - t[i] = char(i + 139) - end - for i=108,1131 do - local v = 0xF700 + i - 108 - t[i] = char(band(rshift(v,8),0xFF),band(v,0xFF)) - end - for i=1132,2048 do - t[i] = char(28,band(rshift(i,8),0xFF),band(i,0xFF)) + -- this eventually can become a helper + + setmetatableindex(encode,function(t,i) + for i=-2048,-1130 do + t[i] = char(28,band(rshift(i,8),0xFF),band(i,0xFF)) + end + for i=-1131,-108 do + local v = 0xFB00 - i - 108 + t[i] = char(band(rshift(v,8),0xFF),band(v,0xFF)) + end + for i=-107,107 do + t[i] = chars[i + 139] + end + for i=108,1131 do + local v = 0xF700 + i - 108 +-- t[i] = char(band(rshift(v,8),0xFF),band(v,0xFF)) + t[i] = char(extract(v,8,8),extract(v,0,8)) + end + for i=1132,2048 do + t[i] = char(28,band(rshift(i,8),0xFF),band(i,0xFF)) + end + setmetatableindex(encode,function(t,k) + -- 16.16-bit signed fixed value + local r = round(k) + local v = rawget(t,r) + if v then + return v end - return t[i] + local v1 = floor(k) + local v2 = floor((k - v1) * 0x10000) + return char(255,extract(v1,8,8),extract(v1,0,8),extract(v2,8,8),extract(v2,0,8)) end) + return t[i] + end) - local function setvsindex() - local vsindex = stack[top] - updateregions(vsindex) - top = top - 1 - end + readers.cffencoder = encode - local function blend() - -- leaves n values on stack - local n = stack[top] - top = top - 1 - if not axis then - -- fatal error - elseif n == 1 then - top = top - nofregions - local v = stack[top] + local function p_setvsindex() + local vsindex = stack[top] + updateregions(vsindex) + top = top - 1 + end + + local function p_blend() + -- leaves n values on stack + local n = stack[top] + top = top - 1 + if not axis then + -- fatal error + elseif n == 1 then + top = top - nofregions + local v = stack[top] + for r=1,nofregions do + v = v + stack[top+r] * factors[r] + end + stack[top] = round(v) + else + top = top - nofregions * n + local d = top + local k = top - n + for i=1,n do + k = k + 1 + local v = stack[k] for r=1,nofregions do - v = v + stack[top+r] * factors[r] - end - stack[top] = round(v) - else - top = top - nofregions * n - local d = top - local k = top - n - for i=1,n do - k = k + 1 - local v = stack[k] - for r=1,nofregions do - v = v + stack[d+r] * factors[r] - end - stack[k] = round(v) - d = d + nofregions + v = v + stack[d+r] * factors[r] end + stack[k] = round(v) + d = d + nofregions end end + end - passon = function(operation) - if operation == 15 then - setvsindex() - elseif operation == 16 then - blend() - else - for i=1,top do - r = r + 1 - result[r] = encode[stack[i]] - end - r = r + 1 - result[r] = char(operation) -- maybe use a hash - top = 0 - end + local function p_getstem() + local n = 0 + if top % 2 ~= 0 then + n = 1 + end + if top > n then + stems = stems + idiv(top-n,2) end + end + local function p_getmask() + local n = 0 + if top % 2 ~= 0 then + n = 1 + end + if top > n then + stems = stems + idiv(top-n,2) + end + if stems == 0 then + return 0 + elseif stems <= 8 then + return 1 + else + return idiv(stems+7,8) + end end -- end of experiment @@ -1643,6 +1686,42 @@ do local justpass = false + -- local function decode(str) + -- local a, b, c, d, e = byte(str,1,5) + -- if a == 28 then + -- if c then + -- local n = 0x100 * b + c + -- if n >= 0x8000 then + -- return n - 0x10000 + -- else + -- return n + -- end + -- end + -- elseif a < 32 then + -- return false + -- elseif a <= 246 then + -- return a - 139 + -- elseif a <= 250 then + -- if b then + -- return a*256 - 63124 + b + -- end + -- elseif a <= 254 then + -- if b then + -- return -a*256 + 64148 - b + -- end + -- else + -- if e then + -- local n = 0x100 * b + c + -- if n >= 0x8000 then + -- return n - 0x10000 + (0x100 * d + e)/0xFFFF + -- else + -- return n + (0x100 * d + e)/0xFFFF + -- end + -- end + -- end + -- return false + -- end + process = function(tab) local i = 1 local n = #tab @@ -1667,9 +1746,9 @@ do stack[top] = -t*256 + 64148 - tab[i+1] i = i + 2 else + -- a 16.16 float local n = 0x100 * tab[i+1] + tab[i+2] - if n >= 0x8000 then - -- stack[top] = n - 0xFFFF - 1 + (0x100 * tab[i+3] + tab[i+4])/0xFFFF + if n >= 0x8000 then stack[top] = n - 0x10000 + (0x100 * tab[i+3] + tab[i+4])/0xFFFF else stack[top] = n + (0x100 * tab[i+3] + tab[i+4])/0xFFFF @@ -1716,19 +1795,94 @@ do elseif t == 12 then i = i + 1 local t = tab[i] - local a = subactions[t] - if a then - a(t) + if justpass then + if t >= 34 or t <= 37 then -- flexes + for i=1,top do + r = r + 1 ; result[r] = encode[stack[i]] + end + r = r + 1 ; result[r] = chars[12] + r = r + 1 ; result[r] = chars[t] + top = 0 + else + local a = subactions[t] + if a then + a(t) + else + top = 0 + end + end else - if trace_charstrings then - showvalue("<subaction>",t) + local a = subactions[t] + if a then + a(t) + else + if trace_charstrings then + showvalue("<subaction>",t) + end + top = 0 end - top = 0 end i = i + 1 elseif justpass then - passon(t) - i = i + 1 + -- todo: local a = passactions + if t == 15 then + p_setvsindex() + i = i + 1 + elseif t == 16 then + local s = p_blend() or 0 + i = i + s + 1 + -- cff 1: (when cff2 strip them) + elseif t == 1 or t == 3 or t == 18 or operation == 23 then + p_getstem() -- at the start +if true then + if top > 0 then + for i=1,top do + r = r + 1 ; result[r] = encode[stack[i]] + end + top = 0 + end + r = r + 1 ; result[r] = chars[t] +else + top = 0 +end + i = i + 1 + -- cff 1: (when cff2 strip them) + elseif t == 19 or t == 20 then + local s = p_getmask() or 0 -- after the stems +if true then + if top > 0 then + for i=1,top do + r = r + 1 ; result[r] = encode[stack[i]] + end + top = 0 + end + r = r + 1 ; result[r] = chars[t] + for j=1,s do + i = i + 1 + r = r + 1 ; result[r] = chars[tab[i]] + end +else + i = i + s + top = 0 +end + i = i + 1 + -- cff 1: closepath + elseif t == 9 then + top = 0 + i = i + 1 + elseif t == 13 then + local s = hsbw() or 0 + i = i + s + 1 + else + if top > 0 then + for i=1,top do + r = r + 1 ; result[r] = encode[stack[i]] + end + top = 0 + end + r = r + 1 ; result[r] = chars[t] + i = i + 1 + end else local a = actions[t] if a then @@ -1788,20 +1942,32 @@ do -- end local function setbias(globals,locals) - if version == 1 then - return - false, - false - else +-- if version == 1 then -- charstring version, not cff +-- return +-- 0, +-- 0 +-- return +-- 1, +-- 1 +-- else local g, l = #globals, #locals return - ((g < 1240 and 107) or (g < 33900 and 1131) or 32768) + 1, - ((l < 1240 and 107) or (l < 33900 and 1131) or 32768) + 1 - end + ((g < 1240 and 107) or (g < 33900 and 1131) or 32768) + 1, + ((l < 1240 and 107) or (l < 33900 and 1131) or 32768) + 1 +-- end end local function processshape(tab,index) + if not tab then + glyphs[index] = { + boundingbox = { 0, 0, 0, 0 }, + width = 0, + name = charset and charset[index] or nil, + } + return + end + tab = bytetable(tab) x = 0 @@ -1817,7 +1983,6 @@ do ymin = 0 ymax = 0 checked = false - if trace_charstrings then report("glyph: %i",index) report("data : % t",tab) @@ -1937,19 +2102,20 @@ do globalbias, localbias = setbias(globals,locals) nominalwidth, defaultwidth = setwidths(dictionary.private) - startparsing(fontdata,data,streams) - - for index=1,#charstrings do - processshape(charstrings[index],index-1) - charstrings[index] = nil -- free memory (what if used more often?) + if charstrings then + startparsing(fontdata,data,streams) + for index=1,#charstrings do + processshape(charstrings[index],index-1) +-- charstrings[index] = nil -- free memory (what if used more often?) + end + stopparsing(fontdata,data) + else + report("no charstrings") end - - stopparsing(fontdata,data) - return glyphs end - parsecharstring = function(fontdata,data,dictionary,tab,glphs,index,doshapes,tversion) + parsecharstring = function(fontdata,data,dictionary,tab,glphs,index,doshapes,tversion,streams) keepcurve = doshapes version = tversion @@ -1960,6 +2126,8 @@ do vsindex = dictionary.vsindex or 0 glyphs = glphs or { } + justpass = streams == true + globalbias, localbias = setbias(globals,locals) nominalwidth, defaultwidth = setwidths(dictionary.private) @@ -2134,7 +2302,7 @@ local function readfdselect(f,fontdata,data,glyphs,doshapes,version,streams) local format = readbyte(f) if format == 1 then for i=0,nofglyphs do -- notdef included (needs checking) - local index = readbyte(i) + local index = readbyte(f) fdindex[i] = index if index > maxindex then maxindex = index @@ -2165,23 +2333,27 @@ local function readfdselect(f,fontdata,data,glyphs,doshapes,version,streams) -- hm, always if maxindex >= 0 then local cidarray = cid.fdarray - setposition(f,header.offset+cidarray) - local dictionaries = readlengths(f) - for i=1,#dictionaries do - dictionaries[i] = readstring(f,dictionaries[i]) - end - parsedictionaries(data,dictionaries) - cid.dictionaries = dictionaries - readcidprivates(f,data) - for i=1,#dictionaries do - readlocals(f,data,dictionaries[i]) - end - startparsing(fontdata,data,streams) - for i=1,#charstrings do - parsecharstring(fontdata,data,dictionaries[fdindex[i]+1],charstrings[i],glyphs,i,doshapes,version) - charstrings[i] = nil + if cidarray then + setposition(f,header.offset+cidarray) + local dictionaries = readlengths(f) + for i=1,#dictionaries do + dictionaries[i] = readstring(f,dictionaries[i]) + end + parsedictionaries(data,dictionaries) + cid.dictionaries = dictionaries + readcidprivates(f,data) + for i=1,#dictionaries do + readlocals(f,data,dictionaries[i]) + end + startparsing(fontdata,data,streams) + for i=1,#charstrings do + parsecharstring(fontdata,data,dictionaries[fdindex[i]+1],charstrings[i],glyphs,i,doshapes,version,streams) +-- charstrings[i] = nil + end + stopparsing(fontdata,data) + else + report("no cid array") end - stopparsing(fontdata,data) end end @@ -2200,7 +2372,7 @@ local function cleanup(data,dictionaries) end function readers.cff(f,fontdata,specification) - local tableoffset = gotodatatable(f,fontdata,"cff",specification.details) + local tableoffset = gotodatatable(f,fontdata,"cff",specification.details or specification.glyphs) if tableoffset then local header = readheader(f) if header.major ~= 1 then @@ -2223,14 +2395,17 @@ function readers.cff(f,fontdata,specification) -- local dic = dictionaries[1] local cid = dic.cid - fontdata.cffinfo = { - familynamename = dic.familyname, + -- + local cffinfo = { + familyname = dic.familyname, fullname = dic.fullname, boundingbox = dic.boundingbox, weight = dic.weight, italicangle = dic.italicangle, underlineposition = dic.underlineposition, underlinethickness = dic.underlinethickness, + defaultwidth = dic.defaultwidthx, + nominalwidth = dic.nominalwidthx, monospaced = dic.monospaced, } fontdata.cidinfo = cid and { @@ -2238,13 +2413,31 @@ function readers.cff(f,fontdata,specification) ordering = cid.ordering, supplement = cid.supplement, } + fontdata.cffinfo = cffinfo -- - if specification.glyphs then - local all = specification.shapes or false + local all = specification.shapes or specification.streams or false + if specification.glyphs or all then if cid and cid.fdselect then - readfdselect(f,fontdata,data,glyphs,all,"cff") + readfdselect(f,fontdata,data,glyphs,all,"cff",specification.streams) else - readnoselect(f,fontdata,data,glyphs,all,"cff") + readnoselect(f,fontdata,data,glyphs,all,"cff",specification.streams) + end + end + local private = dic.private + if private then + local data = private.data + if type(data) == "table" then + cffinfo.defaultwidth = data.defaultwidth or cffinfo.defaultwidth + cffinfo.nominalwidth = data.nominalwidth or cffinfo.nominalwidth + cffinfo.bluevalues = data.bluevalues + cffinfo.otherblues = data.otherblues + cffinfo.familyblues = data.familyblues + cffinfo.familyotherblues = data.familyotherblues + cffinfo.bluescale = data.bluescale + cffinfo.blueshift = data.blueshift + cffinfo.bluefuzz = data.bluefuzz + cffinfo.stdhw = data.stdhw + cffinfo.stdvw = data.stdvw end end cleanup(data,dictionaries) @@ -2283,7 +2476,7 @@ function readers.cff2(f,fontdata,specification) data.factors = specification.factors -- local cid = data.dictionaries[1].cid - local all = specification.shapes or false + local all = specification.shapes or specification.streams or false if cid and cid.fdselect then readfdselect(f,fontdata,data,glyphs,all,"cff2",specification.streams) else @@ -2316,7 +2509,7 @@ function readers.cffcheck(filename) dictionaries = dictionaries, strings = strings, glyphs = glyphs, - nofglyphs = 4, + nofglyphs = 0, } -- parsedictionaries(data,dictionaries,"cff") diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua index b067c8c40e5..81ea7c859cf 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua @@ -592,6 +592,7 @@ function constructors.scale(tfmdata,specification) targetparameters.descender = delta * descender end -- +-- inspect(targetparameters) constructors.enhanceparameters(targetparameters) -- official copies for us, now virtual -- local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0 @@ -926,10 +927,9 @@ function constructors.scale(tfmdata,specification) -- catch inconsistencies -- local vfonts = target.fonts --- if isvirtual then -if isvirtual or target.type == "virtual" or properties.virtualized then + if isvirtual or target.type == "virtual" or properties.virtualized then properties.virtualized = true -target.type = "virtual" + target.type = "virtual" if not vfonts or #vfonts == 0 then target.fonts = { { id = 0 } } end @@ -1027,24 +1027,22 @@ function constructors.finalize(tfmdata) properties.virtualized = tfmdata.type == "virtual" end -- - if not tfmdata.properties then - tfmdata.properties = { - fontname = tfmdata.fontname, - filename = tfmdata.filename, - fullname = tfmdata.fullname, - name = tfmdata.name, - psname = tfmdata.psname, - -- - encodingbytes = tfmdata.encodingbytes or 1, - embedding = tfmdata.embedding or "subset", - tounicode = tfmdata.tounicode or 1, - cidinfo = tfmdata.cidinfo or nil, - format = tfmdata.format or "type1", - direction = tfmdata.direction or 0, - writingmode = tfmdata.writingmode or "horizontal", - identity = tfmdata.identity or "horizontal", - } - end + properties.fontname = tfmdata.fontname + properties.filename = tfmdata.filename + properties.fullname = tfmdata.fullname + properties.name = tfmdata.name + properties.psname = tfmdata.psname + -- + properties.encodingbytes = tfmdata.encodingbytes or 1 + properties.embedding = tfmdata.embedding or "subset" + properties.tounicode = tfmdata.tounicode or 1 + properties.cidinfo = tfmdata.cidinfo or nil + properties.format = tfmdata.format or "type1" + properties.direction = tfmdata.direction or 0 + properties.writingmode = tfmdata.writingmode or "horizontal" + properties.identity = tfmdata.identity or "horizontal" + properties.usedbitmap = tfmdata.usedbitmap + -- if not tfmdata.resources then tfmdata.resources = { } end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-def.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-def.lua index e5101e7f656..2deb047440e 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-def.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-def.lua @@ -208,9 +208,9 @@ function resolvers.name(specification) features.normal = normal end normal.instance = instance - if not callbacks.supported.glyph_stream_provider then - normal.variableshapes = true -- for the moment - end + -- if not callbacks.supported.glyph_stream_provider then + -- normal.variableshapes = true -- for the moment + -- end end -- local suffix = lower(suffixonly(resolved)) diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua index 127afd9cbaf..c5fb14d465a 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua @@ -86,10 +86,11 @@ local streamreader = readers.streamreader local setposition = streamreader.setposition local getposition = streamreader.getposition -local readushort = streamreader.readcardinal2 -- 16-bit unsigned integer -local readulong = streamreader.readcardinal4 -- 24-bit unsigned integer +local readuinteger = streamreader.readcardinal1 +local readushort = streamreader.readcardinal2 +local readulong = streamreader.readcardinal4 local readinteger = streamreader.readinteger1 -local readshort = streamreader.readinteger2 -- 16-bit signed integer +local readshort = streamreader.readinteger2 local readstring = streamreader.readstring local readtag = streamreader.readtag local readbytes = streamreader.readbytes @@ -113,6 +114,7 @@ directives.register("fonts.streamreader",function() setposition = streamreader.setposition getposition = streamreader.getposition + readuinteger = streamreader.readcardinal1 readushort = streamreader.readcardinal2 readulong = streamreader.readcardinal4 readinteger = streamreader.readinteger1 @@ -2297,7 +2299,7 @@ do local function loadvariations(f,fontdata,variationsoffset,lookuptypes,featurehash,featureorder) setposition(f,variationsoffset) - local version = readulong(f) + local version = readulong(f) -- two times readushort local nofrecords = readulong(f) local records = { } for i=1,nofrecords do @@ -3070,183 +3072,324 @@ function readers.sbix(f,fontdata,specification) for i=1,nofstrikes do strikes[i] = readulong(f) end - -- if true then - local shapes = { } - local done = 0 - for i=1,nofstrikes do - local strikeoffset = strikes[i] + tableoffset - setposition(f,strikeoffset) - strikes[i] = { - ppem = readushort(f), - ppi = readushort(f), - offset = strikeoffset + local shapes = { } + local done = 0 + for i=1,nofstrikes do + local strikeoffset = strikes[i] + tableoffset + setposition(f,strikeoffset) + strikes[i] = { + ppem = readushort(f), + ppi = readushort(f), + offset = strikeoffset + } + end + -- highest first + sort(strikes,function(a,b) + if b.ppem == a.ppem then + return b.ppi < a.ppi + else + return b.ppem < a.ppem + end + end) + local glyphs = { } + for i=1,nofstrikes do + local strike = strikes[i] + local strikeppem = strike.ppem + local strikeppi = strike.ppi + local strikeoffset = strike.offset + setposition(f,strikeoffset) + for i=0,nofglyphs do + glyphs[i] = readulong(f) + end + local glyphoffset = glyphs[0] + for i=0,nofglyphs-1 do + local nextoffset = glyphs[i+1] + if not shapes[i] then + local datasize = nextoffset - glyphoffset + if datasize > 0 then + setposition(f,strikeoffset + glyphoffset) + shapes[i] = { + x = readshort(f), + y = readshort(f), + tag = readtag(f), -- maybe for tracing + data = readstring(f,datasize-8), + ppem = strikeppem, -- not used, for tracing + ppi = strikeppi, -- not used, for tracing + } + done = done + 1 + if done == nofglyphs then + break + end + end + end + glyphoffset = nextoffset + end + end + fontdata.pngshapes = shapes + end +end + +-- Another bitmap (so not that useful) format. But Luigi found a font that +-- has them , so ... + +do + + local function getmetrics(f) + return { + ascender = readinteger(f), + descender = readinteger(f), + widthmax = readuinteger(f), + caretslopedumerator = readinteger(f), + caretslopedenominator = readinteger(f), + caretoffset = readinteger(f), + minorigin = readinteger(f), + minadvance = readinteger(f), + maxbefore = readinteger(f), + minafter = readinteger(f), + pad1 = readinteger(f), + pad2 = readinteger(f), + } + end + + -- bad names + + local function getbigmetrics(f) + -- bigmetrics, maybe just skip 9 bytes + return { + height = readuinteger(f), + width = readuinteger(f), + horiBearingX = readinteger(f), + horiBearingY = readinteger(f), + horiAdvance = readuinteger(f), + vertBearingX = readinteger(f), + vertBearingY = readinteger(f), + vertAdvance = readuinteger(f), + } + end + + local function getsmallmetrics(f) + -- smallmetrics, maybe just skip 5 bytes + return { + height = readuinteger(f), + width = readuinteger(f), + bearingX = readinteger(f), + bearingY = readinteger(f), + advance = readuinteger(f), + } + end + + function readers.cblc(f,fontdata,specification) + -- should we delay this ? + local ctdttableoffset = gotodatatable(f,fontdata,"cbdt",specification.glyphs) + if not ctdttableoffset then + return + end + local cblctableoffset = gotodatatable(f,fontdata,"cblc",specification.glyphs) + if cblctableoffset then + local majorversion = readushort(f) + local minorversion = readushort(f) + local nofsizetables = readulong(f) + local sizetables = { } + local shapes = { } + local subtables = { } + for i=1,nofsizetables do + sizetables[i] = { + subtables = readulong(f), + indexsize = readulong(f), + nofsubtables = readulong(f), + colorref = readulong(f), + hormetrics = getmetrics(f), + vermetrics = getmetrics(f), + firstindex = readushort(f), + lastindex = readushort(f), + ppemx = readbyte(f), + ppemy = readbyte(f), + bitdepth = readbyte(f), + flags = readbyte(f), } end - -- highest first - sort(strikes,function(a,b) - if b.ppem == a.ppem then - return b.ppi < a.ppi + sort(sizetables,function(a,b) + if b.ppemx == a.ppemx then + return b.bitdepth < a.bitdepth else - return b.ppem < a.ppem + return b.ppemx < a.ppemx end end) - local glyphs = { } - for i=1,nofstrikes do - local strike = strikes[i] - local strikeppem = strike.ppem - local strikeppi = strike.ppi - local strikeoffset = strike.offset - setposition(f,strikeoffset) - for i=0,nofglyphs do - glyphs[i] = readulong(f) + for i=1,nofsizetables do + local s = sizetables[i] + local d = false + for j=s.firstindex,s.lastindex do + if not shapes[j] then + shapes[j] = i + d = true + end end - local glyphoffset = glyphs[0] - for i=0,nofglyphs-1 do - local nextoffset = glyphs[i+1] - if not shapes[i] then - local datasize = nextoffset - glyphoffset - if datasize > 0 then - setposition(f,strikeoffset + glyphoffset) - shapes[i] = { - x = readshort(f), - y = readshort(f), - tag = readtag(f), -- maybe for tracing - data = readstring(f,datasize-8), - ppem = strikeppem, -- not used, for tracing - ppi = strikeppi, -- not used, for tracing - } - done = done + 1 - if done == nofglyphs then - break + if d then + s.used = true + end + end + for i=1,nofsizetables do + local s = sizetables[i] + if s.used then + local offset = s.subtables + setposition(f,cblctableoffset+offset) + for j=1,s.nofsubtables do + local firstindex = readushort(f) + local lastindex = readushort(f) + local tableoffset = readulong(f) + offset + for k=firstindex,lastindex do + if shapes[k] == i then + local s = subtables[tableoffset] + if not s then + s = { + firstindex = firstindex, + lastindex = lastindex, + } + subtables[tableoffset] = s + end + shapes[k] = s end end end - glyphoffset = nextoffset end end - fontdata.sbixshapes = shapes - -- else - -- for i=1,nofstrikes do - -- local strikeoffset = strikes[i] + tableoffset - -- setposition(f,strikeoffset) - -- local glyphs = { } - -- strikes[i] = { - -- ppem = readushort(f), - -- ppi = readushort(f), - -- glyphs = glyphs, - -- } - -- for i=0,nofglyphs do - -- glyphs[i] = readulong(f) - -- end - -- local glyphoffset = glyphs[0] - -- for i=0,nofglyphs-1 do - -- local nextoffset = glyphs[i+1] - -- local datasize = nextoffset - glyphoffset - -- if datasize > 0 then - -- setposition(f,strikeoffset + glyphoffset) - -- glyphs[i] = { - -- x = readshort(f), - -- y = readshort(f), - -- tag = readtag(f), - -- data = readstring(f,datasize-8) - -- } - -- glyphoffset = nextoffset - -- end - -- end - -- end - -- fontdata.sbixshapes = strikes + + -- there is no need to sort in string stream but we have a nicer trace + -- if needed + + for offset, subtable in sortedhash(subtables) do + local tabletype = readushort(f) + subtable.format = readushort(f) + local baseoffset = readulong(f) + ctdttableoffset + local offsets = { } + local metrics = nil + if tabletype == 1 then + -- we have the usual one more to get the size + for i=subtable.firstindex,subtable.lastindex do + offsets[i] = readulong(f) + baseoffset + end + skipbytes(f,4) + elseif tabletype == 2 then + local size = readulong(f) + local done = baseoffset + metrics = getbigmetrics(f) + for i=subtable.firstindex,subtable.lastindex do + offsets[i] = done + done = done + size + end + elseif tabletype == 3 then + -- we have the usual one more to get the size + local n = subtable.lastindex - subtable.firstindex + 2 + for i=subtable.firstindex,subtable.lastindex do + offsets[i] = readushort(f) + baseoffset + end + if math.odd(n) then + skipbytes(f,4) + else + skipbytes(f,2) + end + elseif tabletype == 4 then + for i=1,readulong(f) do + offsets[readushort(f)] = readushort(f) + baseoffset + end + elseif tabletype == 5 then + local size = readulong(f) + local done = baseoffset + metrics = getbigmetrics(f) + local n = readulong(f) + for i=1,n do + offsets[readushort(f)] = done + done = done + size + end + if math.odd(n) then + skipbytes(f,2) + end + else + return -- unsupported format + end + subtable.offsets = offsets + subtable.metrics = metrics + end + + -- we only support a few sensible types ... there are hardly any fonts so + -- why are there so many variants ... not the best spec + + local default = { width = 0, height = 0 } + local glyphs = fontdata.glyphs + + for index, subtable in sortedhash(shapes) do + if type(subtable) == "table" then + local data = nil + local metrics = default + local format = subtable.format + local offset = subtable.offsets[index] + setposition(f,offset) + if format == 17 then + metrics = getsmallmetrics(f) + data = readstring(f,readulong(f)) + elseif format == 18 then + metrics = getbigmetrics(f) + data = readstring(f,readulong(f)) + elseif format == 19 then + metrics = subtable.metrics + data = readstring(f,readulong(f)) + else + -- forget about it + end + local x = metrics.width + local y = metrics.height + shapes[index] = { + -- maybe some metrics + x = x, + y = y, + data = data, + } + -- I'll look into this in more details when needed + -- as we can use the bearings to get better boxes. + local glyph = glyphs[index] + if not glyph.boundingbox then + local width = glyph.width + local height = width * y/x + glyph.boundingbox = { 0, 0, width, height } + end + + else + shapes[index] = { + x = 0, + y = 0, + data = "", + } + end + end + + fontdata.pngshapes = shapes -- we cheat + end + end + + function readers.cbdt(f,fontdata,specification) + -- local tableoffset = gotodatatable(f,fontdata,"ctdt",specification.glyphs) + -- if tableoffset then + -- local majorversion = readushort(f) + -- local minorversion = readushort(f) -- end end -end --- function readers.cblc(f,fontdata,specification) --- local tableoffset = gotodatatable(f,fontdata,"cblc",specification.glyphs) --- if tableoffset then --- end --- end --- --- function readers.cbdt(f,fontdata,specification) --- local tableoffset = gotodatatable(f,fontdata,"ctdt",specification.glyphs) --- if tableoffset then --- --- local function getmetrics(f) --- return { --- ascender = readinteger(f), --- descender = readinteger(f), --- widthmax = readcardinal(f), --- caretslopedumerator = readinteger(f), --- caretslopedenominator = readinteger(f), --- caretoffset = readinteger(f), --- minorigin = readinteger(f), --- minadvance = readinteger(f), --- maxbefore = readinteger(f), --- minafter = readinteger(f), --- pad1 = readinteger(f), --- pad2 = readinteger(f), --- } --- end --- --- local majorversion = readushort(f) --- local minorversion = readushort(f) --- local nofsizetables = readulong(f) --- local sizetable = { } --- for i=1,nofsizetables do --- sizetable[i] = { --- subtables = readulong(f), --- indexsize = readulong(f), --- nofsubtables = readulong(f), --- colorref = readulong(f), --- hormetrics = getmetrics(f), --- vermetrics = getmetrics(f), --- firstindex = readushort(f), --- lastindex = readushort(f), --- ppemx = readbyte(f), --- ppemy = readbyte(f), --- bitdepth = readbyte(f), --- flags = readbyte(f), --- } --- end --- --- sort(sizetable,function(a,b) --- if b.ppemx == a.ppemx then --- return b.bitdepth < a.bitdepth --- else --- return b.ppemx < a.ppemx --- end --- end) --- --- local shapes = { } --- --- for i=1,nofsizetables do --- local s = sizetables[i] --- for j=firstindex,lastindex do --- if not shapes[j] then --- shapes[j] = { --- i --- } --- end --- end --- end --- --- inspect(shapes) --- --- end --- end + -- function readers.ebdt(f,fontdata,specification) + -- if specification.glyphs then + -- end + -- end --- function readers.ebdt(f,fontdata,specification) --- if specification.glyphs then --- end --- end + -- function readers.ebsc(f,fontdata,specification) + -- if specification.glyphs then + -- end + -- end --- function readers.ebsc(f,fontdata,specification) --- if specification.glyphs then --- end --- end + -- function readers.eblc(f,fontdata,specification) + -- if specification.glyphs then + -- end + -- end --- function readers.eblc(f,fontdata,specification) --- if specification.glyphs then --- end --- end +end -- + AVAR : optional -- + CFF2 : otf outlines @@ -3387,11 +3530,10 @@ function readers.avar(f,fontdata,specification) return false end - local majorversion = readushort(f) -- 1 - local minorversion = readushort(f) -- 0 - local reserved = readushort(f) - local nofaxis = readushort(f) - local segments = { } + local version = readulong(f) -- 0x00010000 + local reserved = readushort(f) + local nofaxis = readushort(f) + local segments = { } for i=1,nofaxis do segments[i] = collect() end @@ -3402,7 +3544,7 @@ end function readers.fvar(f,fontdata,specification) local tableoffset = gotodatatable(f,fontdata,"fvar",true) -- specification.variable or specification.instancenames if tableoffset then - local version = readulong(f) -- 1.0 + local version = readulong(f) -- 0x00010000 local offsettoaxis = tableoffset + readushort(f) local reserved = skipshort(f) -- pair 1 @@ -3488,7 +3630,7 @@ function readers.hvar(f,fontdata,specification) return end - local version = readulong(f) -- 1.0 + local version = readulong(f) -- 0x00010000 local variationoffset = tableoffset + readulong(f) -- the store local advanceoffset = tableoffset + readulong(f) local lsboffset = tableoffset + readulong(f) @@ -3585,7 +3727,7 @@ end function readers.mvar(f,fontdata,specification) local tableoffset = gotodatatable(f,fontdata,"mvar",specification.variable) if tableoffset then - local version = readulong(f) -- 1.0 + local version = readulong(f) -- 0x00010000 local reserved = skipshort(f,1) local recordsize = readushort(f) local nofrecords = readushort(f) diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-imp-effects.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-imp-effects.lua index 578c8bc1027..cc6e4c0bf88 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-imp-effects.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-imp-effects.lua @@ -1,6 +1,6 @@ if not modules then modules = { } end modules ['font-imp-effects'] = { version = 1.001, - comment = "companion to font-ini.mkiv and hand-ini.mkiv", + comment = "companion to font-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ocl.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ocl.lua index f97487ecd42..8cb5a12fbb2 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ocl.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ocl.lua @@ -63,31 +63,41 @@ end) if context then + -- \definefontcolorpalette [emoji-r] [emoji-red,emoji-gray,textcolor] -- looks bad + -- \definefontcolorpalette [emoji-r] [emoji-red,emoji-gray] -- looks okay + local colors = attributes.list[attributes.private('color')] or { } local transparencies = attributes.list[attributes.private('transparency')] or { } function otf.registerpalette(name,values) sharedpalettes[name] = values + local color = lpdf.color + local transparency = lpdf.transparency + local register = colors.register for i=1,#values do local v = values[i] - local c = nil - local t = nil - if type(v) == "table" then - c = colors.register(name,"rgb", - max(round((v.r or 0)*255),255)/255, - max(round((v.g or 0)*255),255)/255, - max(round((v.b or 0)*255),255)/255 - ) + if v == "textcolor" then + values[i] = false else - c = colors[v] - t = transparencies[v] - end - if c and t then - values[i] = hash[lpdf.color(1,c) .. " " .. lpdf.transparency(t)] - elseif c then - values[i] = hash[lpdf.color(1,c)] - elseif t then - values[i] = hash[lpdf.color(1,t)] + local c = nil + local t = nil + if type(v) == "table" then + c = register(name,"rgb", + max(round((v.r or 0)*255),255)/255, + max(round((v.g or 0)*255),255)/255, + max(round((v.b or 0)*255),255)/255 + ) + else + c = colors[v] + t = transparencies[v] + end + if c and t then + values[i] = hash[color(1,c) .. " " .. transparency(t)] + elseif c then + values[i] = hash[color(1,c)] + elseif t then + values[i] = hash[color(1,t)] + end end end end @@ -98,11 +108,13 @@ else -- for generic sharedpalettes[name] = values for i=1,#values do local v = values[i] - values[i] = hash[f_color( - max(round((v.r or 0)*255),255)/255, - max(round((v.g or 0)*255),255)/255, - max(round((v.b or 0)*255),255)/255 - )] + if v then + values[i] = hash[f_color( + max(round((v.r or 0)*255),255)/255, + max(round((v.g or 0)*255),255)/255, + max(round((v.b or 0)*255),255)/255 + )] + end end end @@ -217,7 +229,7 @@ end -- -- Here we have no color change in BT .. ET and more q Q pairs but even then acrobat -- -- fails displaying the overlays correctly. Other renderers do it right. -local function initialize(tfmdata,kind,value) -- hm, always value +local function initialize(tfmdata,kind,value) if value then local resources = tfmdata.resources local palettes = resources.colorpalettes @@ -228,8 +240,14 @@ local function initialize(tfmdata,kind,value) -- hm, always value converted = setmetatableindex(convert) resources.converted = converted end - local colorvalues = sharedpalettes[value] or converted[palettes[tonumber(value) or 1] or palettes[1]] or { } - local classes = #colorvalues + local colorvalues = sharedpalettes[value] + local default = false -- so the text color (bad for icon overloads) + if colorvalues then + default = colorvalues[#colorvalues] + else + colorvalues = converted[palettes[tonumber(value) or 1] or palettes[1]] or { } + end + local classes = #colorvalues if classes == 0 then return end @@ -244,7 +262,6 @@ local function initialize(tfmdata,kind,value) -- hm, always value } -- local getactualtext = otf.getactualtext - local default = colorvalues[#colorvalues] local b, e = getactualtext(tounicode(0xFFFD)) local actualb = { "pdf", "page", b } -- saves tables local actuale = { "pdf", "page", e } -- saves tables @@ -276,6 +293,12 @@ local function initialize(tfmdata,kind,value) -- hm, always value f = true n = n + 1 t[n] = v l = v + else + if f then + n = n + 1 t[n] = pop + end + f = false + l = nil end n = n + 1 t[n] = charcommand[entry.slot] if s > 1 and i < s and goback then @@ -306,17 +329,6 @@ fonts.handlers.otf.features.register { do - -- local f_setstream = formatters[ [[io.savedata("svg-glyph-%05i",%q)]] ] - -- local f_getstream = formatters[ [[svg-glyph-%05i]] ] - - -- function otfsvg.storepdfdata(pdf) - -- nofstreams = nofstreams + 1 - -- storepdfdata = function(pdf) - -- nofstreams = nofstreams + 1 - -- return f_setstream(nofstreams,pdf), f_getstream(nofstreams) - -- end - -- end - local nofstreams = 0 local f_name = formatters[ [[pdf-glyph-%05i]] ] local f_used = context and formatters[ [[original:///%s]] ] or formatters[ [[%s]] ] @@ -336,7 +348,7 @@ do done = f_used(n) hashed[pdf] = done end - return nil, done, nil + return done end else @@ -353,49 +365,17 @@ do done = f_used(n) hashed[pdf] = done end - return nil, done, nil + return done end end - -- maybe more efficient but much slower (and we hash already) - -- - -- if context then - -- - -- local storepdfdata = otf.storepdfdata - -- local initialized = false - -- - -- function otf.storepdfdata(pdf) - -- if not initialized then - -- if resolvers.setmemstream then - -- local f_setstream = formatters[ [[resolvers.setmemstream("pdf-glyph-%05i",%q,true)]] ] - -- local f_getstream = formatters[ [[memstream:///pdf-glyph-%05i]] ] - -- local f_nilstream = formatters[ [[resolvers.resetmemstream("pdf-glyph-%05i",true)]] ] - -- storepdfdata = function(pdf) - -- local done = hashed[pdf] - -- local set = nil - -- local reset = nil - -- if not done then - -- nofstreams = nofstreams + 1 - -- set = f_setstream(nofstreams,pdf) - -- done = f_getstream(nofstreams) - -- reset = f_nilstream(nofstreams) - -- hashed[pdf] = done - -- end - -- return set, done, reset - -- end - -- otf.storepdfdata = storepdfdata - -- end - -- initialized = true - -- end - -- return storepdfdata(pdf) - -- end - -- - -- end - end -local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = sbix|svg +-- I'll probably make a variant for context as we can do it more efficient there than in +-- generic. + +local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = png|svg if not tfmdata or not pdfshapes or not kind then return end @@ -418,6 +398,12 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = sbix|svg local actualb = { "pdf", "page", b } -- saves tables local actuale = { "pdf", "page", e } -- saves tables -- + local vfimage = lpdf and lpdf.vfimage or function(wd,ht,dp,data,name) + -- needed for generic (if used there at all) + local name = storepdfdata(data) + return { "image", { filename = name, width = wd, height = ht, depth = dp } } + end + -- for unicode, character in sortedhash(characters) do -- sort is nicer for svg local index = character.index if index then @@ -438,23 +424,20 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) -- kind = sbix|svg if data then -- We can delay storage by a lua function in commands: but then we need to -- be able to provide our own mem stream name (so that we can reserve it). - local setcode, name, nilcode = storepdfdata(data) - if name then - local bt = unicode and getactualtext(unicode) - local wd = character.width or 0 - local ht = character.height or 0 - local dp = character.depth or 0 - character.commands = { - not unicode and actualb or { "pdf", "page", (getactualtext(unicode)) }, - downcommand[dp + dy * hfactor], - rightcommand[dx * hfactor], - -- setcode and { "lua", setcode } or nop, - { "image", { filename = name, width = wd, height = ht, depth = dp } }, - -- nilcode and { "lua", nilcode } or nop, - actuale, - } - character[kind] = true - end + -- Anyway, we will do this different in a future version of context. + local bt = unicode and getactualtext(unicode) + local wd = character.width or 0 + local ht = character.height or 0 + local dp = character.depth or 0 + -- The down and right will change too (we can move that elsewhere). + character.commands = { + not unicode and actualb or { "pdf", "page", (getactualtext(unicode)) }, + downcommand[dp + dy * hfactor], + rightcommand[dx * hfactor], + vfimage(wd,ht,dp,data,name), + actuale, + } + character[kind] = true end end end @@ -593,27 +576,27 @@ fonts.handlers.otf.features.register { -- This can be done differently e.g. with ffi and gm and we can share code anway. Using -- batchmode in gm is not faster and as it accumulates we would need to flush all --- individual shapes. +-- individual shapes. But ... in context lmtx (and maybe the backport) we will use +-- a different and more efficient method anyway. I'm still wondering if I should +-- keep color code in generic. Maybe it should be optional. -local otfsbix = otf.sbix or { } -otf.sbix = otfsbix -otf.sbixenabled = true +local otfpng = otf.png or { } +otf.png = otfpng +otf.pngenabled = true do - -- for now png but also other bitmap formats - - local report_sbix = logs.reporter("fonts","sbix conversion") + local report_png = logs.reporter("fonts","png conversion") local loaddata = io.loaddata local savedata = io.savedata local remove = os.remove local runner = sandbox and sandbox.registerrunner { - name = "otfsbix", + name = "otfpng", program = "gm", - template = "convert -quality 100 temp-otf-sbix-shape.sbix temp-otf-sbix-shape.pdf > temp-otf-svg-shape.log", - -- reporter = report_sbix, + template = "convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log", + -- reporter = report_png, } if not runner then @@ -621,29 +604,29 @@ do -- poor mans variant for generic: -- runner = function() - return os.execute("gm convert -quality 100 temp-otf-sbix-shape.sbix temp-otf-sbix-shape.pdf > temp-otf-svg-shape.log") + return os.execute("gm convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log") end end -- Alternatively we can create a single pdf file with -adjoin and then pick up pages from -- that file but creating thousands of small files is no fun either. - function otfsbix.topdf(sbixshapes) + function otfpng.topdf(pngshapes) local pdfshapes = { } - local sbixfile = "temp-otf-sbix-shape.sbix" - local pdffile = "temp-otf-sbix-shape.pdf" + local pngfile = "temp-otf-png-shape.png" + local pdffile = "temp-otf-png-shape.pdf" local nofdone = 0 - local indices = sortedkeys(sbixshapes) -- can be sparse + local indices = sortedkeys(pngshapes) -- can be sparse local nofindices = #indices - report_sbix("processing %i sbix containers",nofindices) + report_png("processing %i png containers",nofindices) statistics.starttiming() for i=1,nofindices do local index = indices[i] - local entry = sbixshapes[index] - local data = entry.data + local entry = pngshapes[index] + local data = entry.data -- or placeholder local x = entry.x local y = entry.y - savedata(sbixfile,data) + savedata(pngfile,data) runner() pdfshapes[index] = { x = x ~= 0 and x or nil, @@ -652,43 +635,44 @@ do } nofdone = nofdone + 1 if nofdone % 100 == 0 then - report_sbix("%i shapes processed",nofdone) + report_png("%i shapes processed",nofdone) end end - report_sbix("processing %i pdf results",nofindices) - remove(sbixfile) + report_png("processing %i pdf results",nofindices) + remove(pngfile) remove(pdffile) statistics.stoptiming() if statistics.elapsedseconds then - report_sbix("sbix conversion time %s",statistics.elapsedseconds() or "-") + report_png("png conversion time %s",statistics.elapsedseconds() or "-") end return pdfshapes - -- end end end -local function initializesbix(tfmdata,kind,value) -- hm, always value - if value and otf.sbixenabled then - local sbix = tfmdata.properties.sbix - local hash = sbix and sbix.hash - local timestamp = sbix and sbix.timestamp +-- This will change in a future version of context. More direct. + +local function initializepng(tfmdata,kind,value) -- hm, always value + if value and otf.pngenabled then + local png = tfmdata.properties.png + local hash = png and png.hash + local timestamp = png and png.timestamp if not hash then return end local pdffile = containers.read(otf.pdfcache,hash) local pdfshapes = pdffile and pdffile.pdfshapes if not pdfshapes or pdffile.timestamp ~= timestamp then - local sbixfile = containers.read(otf.sbixcache,hash) - local sbixshapes = sbixfile and sbixfile.sbixshapes - pdfshapes = sbixshapes and otfsbix.topdf(sbixshapes) or { } + local pngfile = containers.read(otf.pngcache,hash) + local pngshapes = pngfile and pngfile.pngshapes + pdfshapes = pngshapes and otfpng.topdf(pngshapes) or { } containers.write(otf.pdfcache, hash, { pdfshapes = pdfshapes, timestamp = timestamp, }) end -- - pdftovirtual(tfmdata,pdfshapes,"sbix") + pdftovirtual(tfmdata,pdfshapes,"png") end end @@ -696,8 +680,16 @@ fonts.handlers.otf.features.register { name = "sbix", description = "sbix glyphs", manipulators = { - base = initializesbix, - node = initializesbix, + base = initializepng, + node = initializepng, } } +fonts.handlers.otf.features.register { + name = "cblc", + description = "cblc glyphs", + manipulators = { + base = initializepng, + node = initializepng, + } +} diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-onr.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-onr.lua index 7c806c69206..8523d8729ab 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-onr.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-onr.lua @@ -26,7 +26,7 @@ local match, lower, gsub, strip, find = string.match, string.lower, string.gsub, local char, byte, sub = string.char, string.byte, string.sub local abs = math.abs local bxor, rshift = bit32.bxor, bit32.rshift -local P, S, R, Cmt, C, Ct, Cs, Carg, Cf, Cg = lpeg.P, lpeg.S, lpeg.R, lpeg.Cmt, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Carg, lpeg.Cf, lpeg.Cg +local P, S, R, V, Cmt, C, Ct, Cs, Carg, Cf, Cg, Cc = lpeg.P, lpeg.S, lpeg.R, lpeg.V, lpeg.Cmt, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Carg, lpeg.Cf, lpeg.Cg, lpeg.Cc local lpegmatch, patterns = lpeg.match, lpeg.patterns local trace_indexing = false trackers.register("afm.indexing", function(v) trace_indexing = v end) @@ -83,31 +83,40 @@ do end - local charstrings = P("/CharStrings") - local subroutines = P("/Subrs") - local encoding = P("/Encoding") - local dup = P("dup") - local put = P("put") - local array = P("array") - local name = P("/") * C((R("az","AZ","09")+S("-_."))^1) - local digits = R("09")^1 - local cardinal = digits / tonumber - local spaces = P(" ")^1 - local spacing = patterns.whitespace^0 + local charstrings = P("/CharStrings") + local subroutines = P("/Subrs") + local encoding = P("/Encoding") + local dup = P("dup") + local put = P("put") + local array = P("array") + local name = P("/") * C((R("az","AZ","09")+S("-_."))^1) + local digits = R("09")^1 + local cardinal = digits / tonumber + local spaces = P(" ")^1 + local spacing = patterns.whitespace^0 local routines, vector, chars, n, m local initialize = function(str,position,size) n = 0 - m = size -- % tonumber(size) + m = size return position + 1 end local setroutine = function(str,position,index,size,filename) - local forward = position + tonumber(size) + if routines[index] then + -- we have passed the end + return false + end + local forward = position + size local stream = decrypt(sub(str,position+1,forward),4330,4) routines[index] = { byte(stream,1,#stream) } - return forward + n = n + 1 + if n >= m then + -- m should be index now but can we assume ordering? + return #str + end + return forward + 1 end local setvector = function(str,position,name,size,filename) @@ -152,7 +161,7 @@ do local p_filterroutines = -- dup <i> <n> RD or -| <n encrypted bytes> NP or | (1-subroutines)^0 * subroutines * spaces * Cmt(cardinal,initialize) - * (Cmt(cardinal * spaces * cardinal * p_rd * Carg(1), setroutine) * p_np + P(1))^1 + * (Cmt(cardinal * spaces * cardinal * p_rd * Carg(1), setroutine) * p_np + (1-p_nd))^1 local p_filtershapes = -- /foo <n> RD <n encrypted bytes> ND (1-charstrings)^0 * charstrings * spaces * Cmt(cardinal,initialize) @@ -175,7 +184,33 @@ do -- if one of first 4 not 0-9A-F then binary else hex - local function loadpfbvector(filename,shapestoo) + local key = spacing * P("/") * R("az","AZ") + local str = spacing * Cs { (P("(")/"") * ((1 - P("\\(") - P("\\)") - S("()")) + V(1))^0 * (P(")")/"") } + local num = spacing * (R("09") + S("+-."))^1 / tonumber + local arr = spacing * Ct (S("[{") * (num)^0 * spacing * S("]}")) + local boo = spacing * (P("true") * Cc(true) + P("false") * Cc(false)) + local nam = spacing * P("/") * Cs(R("az","AZ")^1) + + local p_filtermetadata = ( + P("/") * Carg(1) * ( ( + C("version") * str + + C("Copyright") * str + + C("Notice") * str + + C("FullName") * str + + C("FamilyName") * str + + C("Weight") * str + + C("ItalicAngle") * num + + C("isFixedPitch") * boo + + C("UnderlinePosition") * num + + C("UnderlineThickness") * num + + C("FontName") * nam + + C("FontMatrix") * arr + + C("FontBBox") * arr + ) ) / function(t,k,v) t[lower(k)] = v end + + P(1) + )^0 * Carg(1) + + local function loadpfbvector(filename,shapestoo,streams) -- for the moment limited to encoding only local data = io.loaddata(resolvers.findfile(filename)) @@ -202,10 +237,12 @@ do local names = { } local encoding = lpegmatch(p_filterencoding,ascii) + local metadata = lpegmatch(p_filtermetadata,ascii,1,{}) local glyphs = { } routines, vector, chars = { }, { }, { } - if shapestoo then + if shapestoo or streams then + -- io.savedata("foo.txt",binary) lpegmatch(p_filterroutines,binary,1,filename) lpegmatch(p_filtershapes,binary,1,filename) local data = { @@ -217,7 +254,8 @@ do } }, } - fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,true) + -- only cff 1 in type 1 fonts + fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams) else lpegmatch(p_filternames,binary,1,filename) end @@ -226,7 +264,7 @@ do routines, vector, chars = nil, nil, nil - return names, encoding, glyphs + return names, encoding, glyphs, metadata end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua index 7a8e9b02eaa..df83dc96825 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua @@ -52,14 +52,14 @@ local report_otf = logs.reporter("fonts","otf loading") local fonts = fonts local otf = fonts.handlers.otf -otf.version = 3.106 -- beware: also sync font-mis.lua and in mtx-fonts -otf.cache = containers.define("fonts", "otl", otf.version, true) -otf.svgcache = containers.define("fonts", "svg", otf.version, true) -otf.sbixcache = containers.define("fonts", "sbix", otf.version, true) -otf.pdfcache = containers.define("fonts", "pdf", otf.version, true) +otf.version = 3.107 -- beware: also sync font-mis.lua and in mtx-fonts +otf.cache = containers.define("fonts", "otl", otf.version, true) +otf.svgcache = containers.define("fonts", "svg", otf.version, true) +otf.pngcache = containers.define("fonts", "png", otf.version, true) +otf.pdfcache = containers.define("fonts", "pdf", otf.version, true) otf.svgenabled = false -otf.sbixenabled = false +otf.pngenabled = false local otfreaders = otf.readers @@ -152,17 +152,17 @@ function otf.load(filename,sub,instance) report_otf("forced reload of %a due to hard coded flag",filename) reload = true end - if reload then + if reload then report_otf("loading %a, hash %a",filename,hash) -- starttiming(otfreaders,true) data = otfreaders.loadfont(filename,sub or 1,instance) -- we can pass the number instead (if it comes from a name search) if data then -- todo: make this a plugin - local used = checkmemory() - local resources = data.resources - local svgshapes = resources.svgshapes - local sbixshapes = resources.sbixshapes + local used = checkmemory() + local resources = data.resources + local svgshapes = resources.svgshapes + local pngshapes = resources.pngshapes if cleanup == 0 then checkmemory(used,threshold,tracememory) end @@ -186,16 +186,16 @@ function otf.load(filename,sub,instance) checkmemory(used,threshold,tracememory) end end - if sbixshapes then - resources.sbixshapes = nil - if otf.sbixenabled then + if pngshapes then + resources.pngshapes = nil + if otf.pngenabled then local timestamp = os.date() -- work in progress ... a bit boring to do - containers.write(otf.sbixcache,hash, { - sbixshapes = sbixshapes, - timestamp = timestamp, + containers.write(otf.pngcache,hash, { + pngshapes = pngshapes, + timestamp = timestamp, }) - data.properties.sbix = { + data.properties.png = { hash = hash, timestamp = timestamp, } diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otr.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otr.lua index c7438dd4305..c7ff6b72689 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otr.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otr.lua @@ -25,7 +25,7 @@ if not modules then modules = { } end modules ['font-otr'] = { -- are just a unicode string but it doesn't save that much. It will be an option -- some day. --- Optimizing the widths wil be done anyway as it save quite some on a cjk font +-- Optimizing the widths will be done anyway as it save quite some on a cjk font -- and the existing (old) code if okay. -- todo: more messages (only if really needed) @@ -67,6 +67,7 @@ if not modules then modules = { } end modules ['font-otr'] = { local next, type, tonumber = next, type, tonumber local byte, lower, char, gsub = string.byte, string.lower, string.char, string.gsub +local fullstrip = string.fullstrip local floor, round = math.floor, math.round local P, R, S, C, Cs, Cc, Ct, Carg, Cmt = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.Carg, lpeg.Cmt local lpegmatch = lpeg.match @@ -740,20 +741,30 @@ readers.helpers = helpers local function gotodatatable(f,fontdata,tag,criterium) if criterium and f then - local datatable = fontdata.tables[tag] - if datatable then - local tableoffset = datatable.offset - setposition(f,tableoffset) - return tableoffset + local tables = fontdata.tables + if tables then + local datatable = tables[tag] + if datatable then + local tableoffset = datatable.offset + setposition(f,tableoffset) + return tableoffset + end + else + report("no tables") end end end local function reportskippedtable(f,fontdata,tag,criterium) if criterium and f then - local datatable = fontdata.tables[tag] - if datatable then - report("loading of table %a skipped",tag) + local tables = fontdata.tables + if tables then + local datatable = tables[tag] + if datatable then + report("loading of table %a skipped",tag) + end + else + report("no tables") end end end @@ -785,6 +796,16 @@ local platformnames = { compatiblefullname = true, } +local platformextras = { + uniqueid = true, + version = true, + copyright = true, + license = true, + licenseurl = true, + manufacturer = true, + vendorurl = true, +} + function readers.name(f,fontdata,specification) local tableoffset = gotodatatable(f,fontdata,"name",true) if tableoffset then @@ -855,6 +876,18 @@ function readers.name(f,fontdata,specification) -- and extend when we run into it (todo: proper reverse hash) .. we're only -- interested in english anyway -- + local function decoded(platform,encoding,content) + local decoder = decoders[platform] + if decoder then + decoder = decoder[encoding] + end + if decoder then + return decoder(content) + else + return content + end + end + -- local function filter(platform,e,l) local namelist = namelists[platform] for i=1,#namelist do @@ -866,14 +899,7 @@ function readers.name(f,fontdata,specification) local language = name.language if (not e or encoding == e) and (not l or language == l) then setposition(f,name.offset) - local content = readstring(f,name.length) - local decoder = decoders[platform] - if decoder then - decoder = decoder[encoding] - end - if decoder then - content = decoder(content) - end + local content = decoded(platform,encoding,readstring(f,name.length)) if nametag then names[nametag] = { content = content, @@ -900,23 +926,16 @@ function readers.name(f,fontdata,specification) fontdata.extras = extras -- if specification.platformnames then - local collected = { } + local collected = { } + local platformextras = specification.platformextras and platformextras for platform, namelist in next, namelists do local filtered = false for i=1,#namelist do local entry = namelist[i] local name = entry.name - if platformnames[name] then + if platformnames[name] or (platformextras and platformextras[name]) then setposition(f,entry.offset) - local content = readstring(f,entry.length) - local encoding = entry.encoding - local decoder = decoders[platform] - if decoder then - decoder = decoder[encoding] - end - if decoder then - content = decoder(content) - end + local content = decoded(platform,entry.encoding,readstring(f,entry.length)) if filtered then filtered[name] = content else @@ -959,7 +978,7 @@ readers["os/2"] = function(f,fontdata) local version = readushort(f) local windowsmetrics = { version = version, - averagewidth = readshort(f), + averagewidth = readshort(f), -- ushort? weightclass = readushort(f), widthclass = readushort(f), fstype = readushort(f), @@ -989,7 +1008,7 @@ readers["os/2"] = function(f,fontdata) if version >= 1 then windowsmetrics.codepageranges = { readulong(f), readulong(f) } end - if version >= 3 then + if version >= 2 then windowsmetrics.xheight = readshort(f) windowsmetrics.capheight = readshort(f) windowsmetrics.defaultchar = readushort(f) @@ -1016,24 +1035,28 @@ end readers.head = function(f,fontdata) local tableoffset = gotodatatable(f,fontdata,"head",true) if tableoffset then + local version = readulong(f) + local fontversion = readulong(f) local fontheader = { - version = readfixed(f), - revision = readfixed(f), - checksum = readulong(f), - magic = readulong(f), - flags = readushort(f), - units = readushort(f), - created = readlongdatetime(f), - modified = readlongdatetime(f), - xmin = readshort(f), - ymin = readshort(f), - xmax = readshort(f), - ymax = readshort(f), - macstyle = readushort(f), - smallpixels = readushort(f), - directionhint = readshort(f), - indextolocformat = readshort(f), - glyphformat = readshort(f), + version = version, + fontversion = number.to16dot16(fontversion), + fontversionnumber = fontversion, + -- checksum = readulong(f), + checksum = readushort(f) * 0x10000 + readushort(f), + magic = readulong(f), + flags = readushort(f), + units = readushort(f), + created = readlongdatetime(f), + modified = readlongdatetime(f), + xmin = readshort(f), + ymin = readshort(f), + xmax = readshort(f), + ymax = readshort(f), + macstyle = readushort(f), + smallpixels = readushort(f), + directionhint = readshort(f), + indextolocformat = readshort(f), + glyphformat = readshort(f), } fontdata.fontheader = fontheader else @@ -1049,7 +1072,7 @@ readers.hhea = function(f,fontdata,specification) local tableoffset = gotodatatable(f,fontdata,"hhea",specification.details) if tableoffset then fontdata.horizontalheader = { - version = readfixed(f), -- two ushorts: major minor + version = readulong(f), ascender = readfword(f), descender = readfword(f), linegap = readfword(f), @@ -1078,7 +1101,7 @@ readers.vhea = function(f,fontdata,specification) local tableoffset = gotodatatable(f,fontdata,"vhea",specification.details) if tableoffset then fontdata.verticalheader = { - version = readfixed(f), + version = readulong(f), ascender = readfword(f), descender = readfword(f), linegap = readfword(f), @@ -1111,15 +1134,15 @@ end readers.maxp = function(f,fontdata,specification) local tableoffset = gotodatatable(f,fontdata,"maxp",specification.details) if tableoffset then - local version = readfixed(f) + local version = readulong(f) local nofglyphs = readushort(f) fontdata.nofglyphs = nofglyphs - if version == 0.5 then + if version == 0x00005000 then fontdata.maximumprofile = { version = version, nofglyphs = nofglyphs, } - elseif version == 1.0 then + elseif version == 0x00010000 then fontdata.maximumprofile = { version = version, nofglyphs = nofglyphs, @@ -1160,15 +1183,14 @@ readers.hmtx = function(f,fontdata,specification) local leftsidebearing = 0 for i=0,nofmetrics-1 do local glyph = glyphs[i] - width = readshort(f) + width = readshort(f) -- readushort leftsidebearing = readshort(f) if width ~= 0 then glyph.width = width end --- for now --- if leftsidebearing ~= 0 then --- glyph.lsb = leftsidebearing --- end + -- if leftsidebearing ~= 0 then + -- glyph.lsb = leftsidebearing + -- end end -- The next can happen in for instance a monospace font or in a cjk font -- with fixed widths. @@ -1181,7 +1203,6 @@ readers.hmtx = function(f,fontdata,specification) -- glyph.lsb = leftsidebearing -- end end - -- hm, there can be a lsb here end end @@ -1231,7 +1252,7 @@ end readers.post = function(f,fontdata,specification) local tableoffset = gotodatatable(f,fontdata,"post",true) if tableoffset then - local version = readfixed(f) + local version = readulong(f) fontdata.postscript = { version = version, italicangle = round(1000*readfixed(f))/1000, @@ -1245,12 +1266,12 @@ readers.post = function(f,fontdata,specification) } if not specification.glyphs then -- enough done - elseif version == 1.0 then + elseif version == 0x00010000 then -- mac encoding (258 glyphs) for index=0,#standardromanencoding do glyphs[index].name = standardromanencoding[index] end - elseif version == 2.0 then + elseif version == 0x00020000 then local glyphs = fontdata.glyphs local nofglyphs = readushort(f) local indices = { } @@ -1281,10 +1302,6 @@ readers.post = function(f,fontdata,specification) end end end - elseif version == 2.5 then - -- depricated, will be done when needed - elseif version == 3.0 then - -- no ps name information end else fontdata.postscript = { } @@ -1947,14 +1964,16 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst designsize = fontdata.designsize, minsize = fontdata.minsize, maxsize = fontdata.maxsize, + boundingbox = fontheader and { fontheader.xmin or 0, fontheader.ymin or 0, fontheader.xmax or 0, fontheader.ymax or 0 } or nil, monospaced = (tonumber(postscript.monospaced or 0) > 0) or metrics.panosewidth == "monospaced", averagewidth = metrics.averagewidth, - xheight = metrics.xheight, - capheight = metrics.capheight, -- not always present and probably crap + xheight = metrics.xheight, -- can be missing + capheight = metrics.capheight or fontdata.maxy, -- can be missing ascender = metrics.typoascender, descender = metrics.typodescender, platformnames = platformnames or nil, instancenames = instancenames or nil, + tableoffsets = fontdata.tableoffsets, } if metricstoo then local keys = { @@ -2016,7 +2035,8 @@ local function loadtables(f,specification,offset) } for i=1,fontdata.noftables do local tag = lower(stripstring(readstring(f,4))) - local checksum = readulong(f) -- not used + -- local checksum = readulong(f) -- not used + local checksum = readushort(f) * 0x10000 + readushort(f) local offset = readulong(f) local length = readulong(f) if offset + length > filesize then @@ -2028,13 +2048,14 @@ local function loadtables(f,specification,offset) length = length, } end +-- inspect(tables) fontdata.foundtables = sortedkeys(tables) if tables.cff or tables.cff2 then fontdata.format = "opentype" else fontdata.format = "truetype" end - return fontdata + return fontdata, tables end local function prepareglyps(fontdata) @@ -2063,7 +2084,7 @@ local variablefonts_supported = (context and true) or (logs and logs.application local function readdata(f,offset,specification) - local fontdata = loadtables(f,specification,offset) + local fontdata, tables = loadtables(f,specification,offset) if specification.glyphs then prepareglyps(fontdata) @@ -2202,10 +2223,20 @@ local function readdata(f,offset,specification) readtable("math",f,fontdata,specification) fontdata.locations = nil - fontdata.tables = nil fontdata.cidmaps = nil fontdata.dictionaries = nil -- fontdata.cff = nil + + if specification.tableoffsets then + fontdata.tableoffsets = tables + setmetatableindex(tables, { + version = fontdata.version, + noftables = fontdata.noftables, + searchrange = fontdata.searchrange, + entryselector = fontdata.entryselector, + rangeshift = fontdata.rangeshift, + }) + end return fontdata end @@ -2313,12 +2344,13 @@ local function loadfont(specification,n,instance) specification.instance = specification.instance or instance end local function message(str) - report("fatal error in file %a: %s\n%s",specification.filename,str,debug.traceback()) + report("fatal error in file %a: %s\n%s",specification.filename,str,debug and debug.traceback()) end local ok, result = xpcall(loadfontdata,message,specification) if ok then return result end +-- return loadfontdata(specification) end -- we need even less, but we can have a 'detail' variant @@ -2340,13 +2372,26 @@ function readers.loadshapes(filename,n,instance,streams) v.math = nil -- v.name = nil end + local names = fontdata.names + if names then + for k, v in next, names do + names[k] = fullstrip(v.content) + end + end end return fontdata and { - -- version = 0.123 -- todo - filename = filename, - format = fontdata.format, - glyphs = fontdata.glyphs, - units = fontdata.fontheader.units, + -- version = 0.123 -- todo + filename = filename, + format = fontdata.format, + glyphs = fontdata.glyphs, + units = fontdata.fontheader.units, + cffinfo = fontdata.cffinfo, + fontheader = fontdata.fontheader, + horizontalheader = fontdata.horizontalheader, + verticalheader = fontdata.verticalheader, + maximumprofile = fontdata.maximumprofile, + names = fontdata.names, + postscript = fontdata.postscript, } or { filename = filename, format = "unknown", @@ -2402,7 +2447,7 @@ function readers.loadfont(filename,n,instance) mathconstants = fontdata.mathconstants, colorpalettes = fontdata.colorpalettes, svgshapes = fontdata.svgshapes, - sbixshapes = fontdata.sbixshapes, + pngshapes = fontdata.pngshapes, variabledata = fontdata.variabledata, foundtables = fontdata.foundtables, }, @@ -2417,10 +2462,12 @@ function readers.getinfo(filename,specification) -- string, nil|number|table local platformnames = false local rawfamilynames = false local instancenames = true + local tableoffsets = false if type(specification) == "table" then subfont = tonumber(specification.subfont) platformnames = specification.platformnames rawfamilynames = specification.rawfamilynames + tableoffsets = specification.tableoffsets else subfont = tonumber(specification) end @@ -2429,6 +2476,7 @@ function readers.getinfo(filename,specification) -- string, nil|number|table details = true, platformnames = platformnames, instancenames = true, + tableoffsets = tableoffsets, -- rawfamilynames = rawfamilynames, } if fontdata then diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ots.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ots.lua index e3389b9daf7..880fbcc1f4a 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ots.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ots.lua @@ -784,23 +784,17 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip -- ok, goto next lookup end end - else -- is the check for disc still valid here ? and why only replace then + else local discfound = false - local lastdisc = nil local hasmarks = marks[startchar] while current do local char, id = ischar(current,currentfont) if char then if skiphash and skiphash[char] then current = getnext(current) - -- if stop then stop = current end -- ? - else -- ligature is a tree - local lg = ligature[char] -- can there be multiple in a row? maybe in a bad font + else + local lg = ligature[char] if lg then - if not discfound and lastdisc then - discfound = lastdisc - lastdisc = nil - end if marks[char] then hasmarks = true end @@ -815,58 +809,89 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip -- kind of weird break elseif id == disc_code then - -- - -- Kai: see chainprocs, we probably could do the same here or was there a reason - -- why we kept the replace check here. - -- - -- if not discfound then - -- discfound = current - -- end - -- if current == stop then - -- break -- okay? or before the disc - -- else - -- current = getnext(current) - -- end - -- - local replace = getfield(current,"replace") -- hm: pre and post - if replace then - -- of{f-}{}{f}e o{f-}{}{f}fe o{-}{}{ff}e (oe and ff ligature) - -- we can end up here when we have a start run .. testruns start at a disc but - -- so here we have the other case: char + disc - while replace do - local char, id = ischar(replace,currentfont) - if char then - local lg = ligature[char] -- can there be multiple in a row? maybe in a bad font - if lg then - if marks[char] then - hasmarks = true -- very unlikely - end - ligature = lg - replace = getnext(replace) - else - return head, start, false, false - end - else - return head, start, false, false - end - end - stop = current - end - lastdisc = current - current = getnext(current) + discfound = current + break else break end end + -- of{f-}{}{f}e o{f-}{}{f}fe o{-}{}{ff}e (oe and ff ligature) + -- we can end up here when we have a start run .. testruns start at a disc but + -- so here we have the other case: char + disc + if discfound then + -- don't assume marks in a disc and we don't run over a disc (for now) + local pre, post, replace = getdisc(discfound) + local match + if replace then + local char = ischar(replace,currentfont) + if char and ligature[char] then + match = true + end + end + if not match and pre then + local char = ischar(pre,currentfont) + if char and ligature[char] then + match = true + end + end + if not match and not pre or not replace then + local n = getnext(discfound) + local char = ischar(n,currentfont) + if char and ligature[char] then + match = true + end + end + if match then + -- we force a restart + local ishead = head == start + local prev = getprev(start) + if stop then + setnext(stop) + local tail = getprev(stop) + local copy = copy_node_list(start) + local liat = find_node_tail(copy) + if pre and replace then + setlink(liat,pre) + end + if replace then + setlink(tail,replace) + end + pre = copy + replace = start + else + setnext(start) + local copy = copy_node(start) + if pre then + setlink(copy,pre) + end + if replace then + setlink(start,replace) + end + pre = copy + replace = start + end + setdisc(discfound,pre,post,replace) + if prev then + setlink(prev,discfound) + else + setprev(discfound) + head = discfound + end + start = discfound + return head, start, true, true + end + end local lig = ligature.ligature if lig then if stop then if trace_ligatures then local stopchar = getchar(stop) - head, start = toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) + -- head, start = toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) + head, start = toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks) logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(lig)) else - head, start = toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) + -- head, start = toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) + head, start = toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks) end else -- weird but happens (in some arabic font) @@ -876,12 +901,12 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(dataset,sequence),gref(startchar),gref(lig)) end end - return head, start, true, discfound + return head, start, true, false else -- weird but happens, pseudo ligatures ... just the components end end - return head, start, false, discfound + return head, start, false, false end function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection) @@ -3960,12 +3985,14 @@ do a = true end if a then - local ok - head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + local ok, df + head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) -- if ok then -- done = true -- end - if start then + if df then +-- print("restart 1",typ) + elseif start then start = getnext(start) end else @@ -4023,6 +4050,7 @@ do a = true end if a then + local ok, df for i=m[1],m[2] do local step = steps[i] -- for i=1,#m do @@ -4031,9 +4059,11 @@ do local lookupmatch = lookupcache[char] if lookupmatch then -- we could move all code inline but that makes things even more unreadable - local ok - head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if ok then +-- local ok, df + head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + break + elseif ok then -- done = true break elseif not start then @@ -4042,7 +4072,9 @@ do end end end - if start then + if df then +-- print("restart 2",typ) + elseif start then start = getnext(start) end else diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua index cd44bfef7a0..e7f483642e5 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua @@ -740,7 +740,7 @@ local function unifymissing(fontdata) resources.unicodes = nil end -local firstprivate = fonts.privateoffsets.textbase or 0xF0000 +local firstprivate = fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000 local puafirst = 0xE000 local pualast = 0xF8FF diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-tfm.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-tfm.lua index 9f78f2c0a3d..6e4f8698052 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-tfm.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-tfm.lua @@ -9,6 +9,7 @@ if not modules then modules = { } end modules ['font-tfm'] = { local next, type = next, type local match, format = string.match, string.format local concat, sortedhash = table.concat, table.sortedhash +local idiv = number.idiv local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end) local trace_features = false trackers.register("tfm.features", function(v) trace_features = v end) @@ -117,219 +118,266 @@ local depth = { } -- table.setmetatableindex("number") -- -- So "czechdqcheat=yes" is then a valid feature. And yes, it's a cheat. +local read_from_tfm, check_tfm do -local function read_from_tfm(specification) - local filename = specification.filename - local size = specification.size - depth[filename] = (depth[filename] or 0) + 1 - if trace_defining then - report_defining("loading tfm file %a at size %s",filename,size) - end - local tfmdata = font.read_tfm(filename,size) -- not cached, fast enough - if tfmdata then - - local features = specification.features and specification.features.normal or { } - local features = constructors.checkedfeatures("tfm",features) - specification.features.normal = features + local tfmreaders = context and tfm.readers + local loadtfmvf = tfmreaders and tfmreaders.loadtfmvf + local loadtfm = font.read_tfm + local loadvf = font.read_vf - -- If reencode returns a new table, we assume that we're doing something - -- special. An 'auto' reencode pickt up its vector from the pfb file. + directives.register("fonts.tfm.builtin",function(v) + loadtfmvf = tfmreaders and tfmreaders.loadtfmvf + if v and loadtfm then + loadtfmvf = false + end + end) - local newtfmdata = (depth[filename] == 1) and tfm.reencode(tfmdata,specification) - if newtfmdata then - tfmdata = newtfmdata + read_from_tfm = function(specification) + local filename = specification.filename + local size = specification.size + depth[filename] = (depth[filename] or 0) + 1 + if trace_defining then + report_defining("loading tfm file %a at size %s",filename,size) end + local tfmdata -- not cached, fast enough + if loadtfmvf then + tfmdata = loadtfmvf(filename,size) + else + tfmdata = loadtfm(filename,size) + end + if tfmdata then - local resources = tfmdata.resources or { } - local properties = tfmdata.properties or { } - local parameters = tfmdata.parameters or { } - local shared = tfmdata.shared or { } - -- - shared.features = features - shared.resources = resources - -- - properties.name = tfmdata.name -- todo: fallback - properties.fontname = tfmdata.fontname -- todo: fallback - properties.psname = tfmdata.psname -- todo: fallback - properties.fullname = tfmdata.fullname -- todo: fallback - properties.filename = specification.filename -- todo: fallback - properties.format = fonts.formats.tfm -- better than nothing - -- - tfmdata.properties = properties - tfmdata.resources = resources - tfmdata.parameters = parameters - tfmdata.shared = shared - -- - shared.rawdata = { resources = resources } - shared.features = features - -- - -- The next branch is only entered when we have a proper encoded file i.e. - -- unicodes and such. It really nakes no sense to do feature juggling when - -- we have no names and unicodes. - -- - if newtfmdata then - -- - -- Some opentype processing assumes these to be present: - -- - if not resources.marks then - resources.marks = { } - end - if not resources.sequences then - resources.sequences = { } - end - if not resources.features then - resources.features = { - gsub = { }, - gpos = { }, - } - end - if not tfmdata.changed then - tfmdata.changed = { } - end - if not tfmdata.descriptions then - tfmdata.descriptions = tfmdata.characters + local features = specification.features and specification.features.normal or { } + local features = constructors.checkedfeatures("tfm",features) + specification.features.normal = features + + -- If reencode returns a new table, we assume that we're doing something + -- special. An 'auto' reencode picks up its vector from the pfb file. + + local newtfmdata = (depth[filename] == 1) and tfm.reencode(tfmdata,specification) + if newtfmdata then + tfmdata = newtfmdata end + + local resources = tfmdata.resources or { } + local properties = tfmdata.properties or { } + local parameters = tfmdata.parameters or { } + local shared = tfmdata.shared or { } -- - -- It might be handy to have this: - -- - otf.readers.addunicodetable(tfmdata) - -- - -- We make a pseudo opentype font, e.g. kerns and ligatures etc: - -- - tfmenhancers.apply(tfmdata,filename) - -- - -- Now user stuff can kick in. - -- - constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm) - -- - -- As that can also mess with names and such, we are now ready for finalizing - -- the unicode information. This is a different order that for instance type one - -- (afm) files. First we try to deduce unicodes from already present information. + shared.features = features + shared.resources = resources -- - otf.readers.unifymissing(tfmdata) + properties.name = tfmdata.name -- todo: fallback + properties.fontname = tfmdata.fontname -- todo: fallback + properties.psname = tfmdata.psname -- todo: fallback + properties.fullname = tfmdata.fullname -- todo: fallback + properties.filename = specification.filename -- todo: fallback + properties.format = tfmdata.format or fonts.formats.tfm -- better than nothing + properties.usedbitmap = tfmdata.usedbitmap -- - -- Next we fill in the gaps, based on names from teh agl. Probably not much will - -- happen here. + tfmdata.properties = properties + tfmdata.resources = resources + tfmdata.parameters = parameters + tfmdata.shared = shared -- - fonts.mappings.addtounicode(tfmdata,filename) + shared.rawdata = { resources = resources } + shared.features = features -- - -- The tounicode data is passed to the backend that constructs the vectors for us. + -- The next branch is only entered when we have a proper encoded file i.e. + -- unicodes and such. It really nakes no sense to do feature juggling when + -- we have no names and unicodes. -- - tfmdata.tounicode = 1 - local tounicode = fonts.mappings.tounicode - for unicode, v in next, tfmdata.characters do - local u = v.unicode - if u then - v.tounicode = tounicode(u) + if newtfmdata then + -- + -- Some opentype processing assumes these to be present: + -- + if not resources.marks then + resources.marks = { } + end + if not resources.sequences then + resources.sequences = { } + end + if not resources.features then + resources.features = { + gsub = { }, + gpos = { }, + } + end + if not tfmdata.changed then + tfmdata.changed = { } + end + if not tfmdata.descriptions then + tfmdata.descriptions = tfmdata.characters + end + -- + -- It might be handy to have this: + -- + otf.readers.addunicodetable(tfmdata) + -- + -- We make a pseudo opentype font, e.g. kerns and ligatures etc: + -- + tfmenhancers.apply(tfmdata,filename) + -- + -- Now user stuff can kick in. + -- + constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm) + -- + -- As that can also mess with names and such, we are now ready for finalizing + -- the unicode information. This is a different order that for instance type one + -- (afm) files. First we try to deduce unicodes from already present information. + -- + otf.readers.unifymissing(tfmdata) + -- + -- Next we fill in the gaps, based on names from teh agl. Probably not much will + -- happen here. + -- + fonts.mappings.addtounicode(tfmdata,filename) + -- + -- The tounicode data is passed to the backend that constructs the vectors for us. + -- + tfmdata.tounicode = 1 + local tounicode = fonts.mappings.tounicode + for unicode, v in next, tfmdata.characters do + local u = v.unicode + if u then + v.tounicode = tounicode(u) + end + end + -- + -- However, when we use a bitmap font those vectors can't be constructed because + -- that information is not carried with those fonts (there is no name info, nor + -- proper index info, nor unicodes at that end). So, we provide it ourselves. + -- + if tfmdata.usedbitmap then + tfm.addtounicode(tfmdata) end end -- - -- However, when we use a bitmap font those vectors can't be constructed because - -- that information is not carried with those fonts (there is no name info, nor - -- proper index info, nor unicodes at that end). So, we provide it ourselves. + shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil -- - if tfmdata.usedbitmap then - tfm.addtounicode(tfmdata) + if size < 0 then + size = idiv(65536 * -size,100) end - end - -- - shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil - -- - parameters.factor = 1 -- already scaled - parameters.size = size - parameters.slant = parameters.slant or parameters[1] or 0 - parameters.space = parameters.space or parameters[2] or 0 - parameters.space_stretch = parameters.space_stretch or parameters[3] or 0 - parameters.space_shrink = parameters.space_shrink or parameters[4] or 0 - parameters.x_height = parameters.x_height or parameters[5] or 0 - parameters.quad = parameters.quad or parameters[6] or 0 - parameters.extra_space = parameters.extra_space or parameters[7] or 0 - -- - constructors.enhanceparameters(parameters) -- official copies for us - -- - properties.private = properties.private or tfmdata.private or privateoffset - -- - if newtfmdata then + parameters.factor = 1 -- already scaled + parameters.units = 1000 -- just in case + parameters.size = size + parameters.slant = parameters.slant or parameters[1] or 0 + parameters.space = parameters.space or parameters[2] or 0 + parameters.space_stretch = parameters.space_stretch or parameters[3] or 0 + parameters.space_shrink = parameters.space_shrink or parameters[4] or 0 + parameters.x_height = parameters.x_height or parameters[5] or 0 + parameters.quad = parameters.quad or parameters[6] or 0 + parameters.extra_space = parameters.extra_space or parameters[7] or 0 + -- + constructors.enhanceparameters(parameters) -- official copies for us -- - -- We do nothing as we assume flat tfm files. It would become real messy - -- otherwise and I don't have something for testing on my system anyway. + properties.private = properties.private or tfmdata.private or privateoffset -- - elseif constructors.resolvevirtualtoo then - fonts.loggers.register(tfmdata,file.suffix(filename),specification) -- strange, why here - local vfname = findbinfile(specification.name, 'ovf') - if vfname and vfname ~= "" then - local vfdata = font.read_vf(vfname,size) -- not cached, fast enough - if vfdata then - local chars = tfmdata.characters - for k,v in next, vfdata.characters do - chars[k].commands = v.commands + if newtfmdata then + -- + -- We do nothing as we assume flat tfm files. It would become real messy + -- otherwise and I don't have something for testing on my system anyway. + -- + elseif loadtfmvf then + -- already loaded + local fonts = tfmdata.fonts + if fonts then + for i=1,#fonts do + local font = fonts[i] + local id = font.id + if not id then + local name = font.name + local size = font.size + if name and size then + local data, id = constructors.readanddefine(name,size) + if id then + font.id = id + font.name = nil + font.size = nil + end + end + end end - properties.virtualized = true - tfmdata.fonts = vfdata.fonts - tfmdata.type = "virtual" -- else nested calls with cummulative scaling - local fontlist = vfdata.fonts - local name = file.nameonly(filename) - for i=1,#fontlist do - local n = fontlist[i].name - local s = fontlist[i].size - local d = depth[filename] - s = constructors.scaled(s,vfdata.designsize) - if d > tfm.maxnestingdepth then - report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth) - fontlist[i] = { id = 0 } - elseif (d > 1) and (s > tfm.maxnestingsize) then - report_defining("virtual font %a exceeds size %s",n,s) - fontlist[i] = { id = 0 } - else - local t, id = fonts.constructors.readanddefine(n,s) - fontlist[i] = { id = id } + end + elseif constructors.resolvevirtualtoo then + fonts.loggers.register(tfmdata,file.suffix(filename),specification) -- strange, why here + local vfname = findbinfile(specification.name, 'ovf') + if vfname and vfname ~= "" then + local vfdata = loadvf(vfname,size) + if vfdata then + local chars = tfmdata.characters + for k,v in next, vfdata.characters do + chars[k].commands = v.commands + end + properties.virtualized = true + tfmdata.fonts = vfdata.fonts + tfmdata.type = "virtual" -- else nested calls with cummulative scaling + local fontlist = vfdata.fonts + local name = file.nameonly(filename) + for i=1,#fontlist do + local n = fontlist[i].name + local s = fontlist[i].size + local d = depth[filename] + s = constructors.scaled(s,vfdata.designsize) + if d > tfm.maxnestingdepth then + report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth) + fontlist[i] = { id = 0 } + elseif (d > 1) and (s > tfm.maxnestingsize) then + report_defining("virtual font %a exceeds size %s",n,s) + fontlist[i] = { id = 0 } + else + local t, id = constructors.readanddefine(n,s) + fontlist[i] = { id = id } + end end end end end + -- + -- This is for old times sake (and context specific) so we comment it. It has + -- to do with encoding prefixes (a context naming that was later adopted by + -- the lm/gyre project) + -- + -- if not features.encoding then + -- local encoding, filename = match(properties.filename,"^(.-)%-(.*)$") + -- if filename and encoding and encodings.known and encodings.known[encoding] then + -- features.encoding = encoding + -- end + -- end + -- + -- Some afterthoughts: + -- + properties.haskerns = true + properties.hasligatures = true + properties.hasitalics = true + resources.unicodes = { } + resources.lookuptags = { } + -- + depth[filename] = depth[filename] - 1 + -- + return tfmdata + else + depth[filename] = depth[filename] - 1 end - -- - -- This is for old times sake (and context specific) so we comment it. It has - -- to do with encoding prefixes (a context naming that was later adopted by - -- the lm/gyre project) - -- - -- if not features.encoding then - -- local encoding, filename = match(properties.filename,"^(.-)%-(.*)$") - -- if filename and encoding and encodings.known and encodings.known[encoding] then - -- features.encoding = encoding - -- end - -- end - -- - -- Some afterthoughts: - -- - properties.haskerns = true - properties.hasligatures = true - resources.unicodes = { } - resources.lookuptags = { } - -- - depth[filename] = depth[filename] - 1 - -- - return tfmdata - else - depth[filename] = depth[filename] - 1 end -end -local function check_tfm(specification,fullname) -- we could split up like afm/otf - local foundname = findbinfile(fullname, 'tfm') or "" - if foundname == "" then - foundname = findbinfile(fullname, 'ofm') or "" -- not needed in context - end - if foundname == "" then - foundname = fonts.names.getfilename(fullname,"tfm") or "" - end - if foundname ~= "" then - specification.filename = foundname - specification.format = "ofm" - return read_from_tfm(specification) - elseif trace_defining then - report_defining("loading tfm with name %a fails",specification.name) + check_tfm = function(specification,fullname) -- we could split up like afm/otf + local foundname = findbinfile(fullname, 'tfm') or "" + if foundname == "" then + foundname = findbinfile(fullname, 'ofm') or "" -- not needed in context + end + if foundname == "" then + foundname = fonts.names.getfilename(fullname,"tfm") or "" + end + if foundname ~= "" then + specification.filename = foundname + specification.format = "ofm" + return read_from_tfm(specification) + elseif trace_defining then + report_defining("loading tfm with name %a fails",specification.name) + end end + end readers.check_tfm = check_tfm @@ -412,7 +460,7 @@ do local vector = false if type(pfbfile) == "string" then - local pfb = fonts.constructors.handlers.pfb + local pfb = constructors.handlers.pfb if pfb and pfb.loadvector then local v, e = pfb.loadvector(pfbfile) if v then @@ -441,7 +489,7 @@ do local originals = tfmdata.characters local indices = { } local parentfont = { "font", 1 } - local private = tfmdata or fonts.constructors.privateoffset + local private = tfmdata.privateoffset or constructors.privateoffset local reported = encdone[tfmfile][encfile] -- create characters table @@ -466,7 +514,7 @@ do indices[index] = unicode original.name = name -- so one can lookup weird names if backmap then - original.index = backmap[name] + original.index = backmap[name] else -- probably bitmap original.commands = { parentfont, charcommand[index] } -- or "slot" original.oindex = index @@ -515,6 +563,7 @@ do tfmdata.psname = file.nameonly(pfbfile or tfmdata.name) tfmdata.filename = pfbfile tfmdata.encodingbytes = 2 + -- tfmdata.format = bitmap and "type3" or "type1" tfmdata.format = "type1" tfmdata.tounicode = 1 tfmdata.embedding = "subset" @@ -551,24 +600,18 @@ end end ]] - local flushstreamobject = lpdf and lpdf.flushstreamobject - local setfontattributes = pdf.setfontattributes + local flushstreamobject = lpdf and lpdf.flushstreamobject -- context + local setfontattributes = lpdf and lpdf.setfontattributes -- context - if flushstreamobject then - -- we're in context - else + if not flushstreamobject then flushstreamobject = function(data) - return pdf.obj { - immediate = true, - type = "stream", - string = data, - } + return pdf.obj { immediate = true, type = "stream", string = data } -- generic end end if not setfontattributes then setfontattributes = function(id,data) - print(format("your luatex is too old so no tounicode bitmap font%i",id)) + return pdf.setfontattributes(id,data) -- generic end end @@ -596,7 +639,7 @@ end -- Now we implement the regular features handlers. We need to convert the -- tfm specific structures to opentype structures. In basemode they are --- converted back so that is a bti of a waste but it's fast enough. +-- converted back so that is a bit of a waste but it's fast enough. do diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ttf.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ttf.lua index bdfa3e85906..58e999e260d 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ttf.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ttf.lua @@ -35,8 +35,10 @@ if not modules then modules = { } end modules ['font-ttf'] = { local next, type, unpack = next, type, unpack local band, rshift = bit32.band, bit32.rshift local sqrt, round = math.sqrt, math.round -local char = string.char +local char, rep = string.char, string.rep local concat = table.concat +local idiv = number.idiv +local setmetatableindex = table.setmetatableindex local report = logs.reporter("otf reader","ttf") @@ -115,22 +117,41 @@ local function mergecomposites(glyphs,shapes) local yscale = matrix[4] local xoffset = matrix[5] local yoffset = matrix[6] - for i=1,#subpoints do - local p = subpoints[i] - local x = p[1] - local y = p[2] - nofpoints = nofpoints + 1 - points[nofpoints] = { - xscale * x + xrotate * y + xoffset, - yscale * y + yrotate * x + yoffset, - p[3] - } + local count = #subpoints + if xscale == 1 and yscale == 1 and xrotate == 0 and yrotate == 0 then + for i=1,count do + local p = subpoints[i] + nofpoints = nofpoints + 1 + points[nofpoints] = { + p[1] + xoffset, + p[2] + yoffset, + p[3] + } + end + else + for i=1,count do + local p = subpoints[i] + local x = p[1] + local y = p[2] + nofpoints = nofpoints + 1 + points[nofpoints] = { + xscale * x + xrotate * y + xoffset, + yscale * y + yrotate * x + yoffset, + p[3] + } + end end - for i=1,#subcontours do + local subcount = #subcontours + if subcount == 1 then nofcontours = nofcontours + 1 - contours[nofcontours] = offset + subcontours[i] + contours[nofcontours] = offset + subcontours[1] + else + for i=1,#subcontours do + nofcontours = nofcontours + 1 + contours[nofcontours] = offset + subcontours[i] + end end - offset = offset + #subpoints + offset = offset + count else report("missing contours composite %s, component %s of %s, glyph %s",index,i,#components,subindex) end @@ -141,7 +162,8 @@ local function mergecomposites(glyphs,shapes) return contours, points end - for index=1,#glyphs do +-- for index=1,#glyphs do + for index=0,#glyphs-1 do local shape = shapes[index] if shape then local components = shape.components @@ -153,7 +175,7 @@ local function mergecomposites(glyphs,shapes) end -local function readnothing(f,nofcontours) +local function readnothing(f) return { type = "nothing", } @@ -284,7 +306,8 @@ end local quadratic = false local function contours2outlines_normal(glyphs,shapes) -- maybe accept the bbox overhead - for index=1,#glyphs do +-- for index=1,#glyphs do + for index=0,#glyphs-1 do local shape = shapes[index] if shape then local glyph = glyphs[index] @@ -404,7 +427,8 @@ local function contours2outlines_normal(glyphs,shapes) -- maybe accept the bbox end local function contours2outlines_shaped(glyphs,shapes,keepcurve) - for index=1,#glyphs do +-- for index=1,#glyphs do + for index=0,#glyphs-1 do local shape = shapes[index] if shape then local glyph = glyphs[index] @@ -583,8 +607,13 @@ end local c_zero = char(0) local s_zero = char(0,0) +-- local shorthash = setmetatableindex(function(t,k) +-- t[k] = char(band(rshift(k,8),0xFF),band(k,0xFF)) return t[k] +-- end) + local function toushort(n) return char(band(rshift(n,8),0xFF),band(n,0xFF)) + -- return shorthash[n] end local function toshort(n) @@ -592,124 +621,151 @@ local function toshort(n) n = n + 0x10000 end return char(band(rshift(n,8),0xFF),band(n,0xFF)) + -- return shorthash[n] end -- todo: we can reuse result, xpoints and ypoints +local chars = setmetatableindex(function(t,k) + for i=0,255 do local v = char(i) t[i] = v end return t[k] +end) + local function repackpoints(glyphs,shapes) local noboundingbox = { 0, 0, 0, 0 } local result = { } -- reused - for index=1,#glyphs do + local xpoints = { } -- reused + local ypoints = { } -- reused + for index=0,#glyphs-1 do local shape = shapes[index] if shape then local r = 0 local glyph = glyphs[index] - if false then -- shape.type == "composite" - -- we merged them - else - local contours = shape.contours - local nofcontours = contours and #contours or 0 - local boundingbox = glyph.boundingbox or noboundingbox - r = r + 1 result[r] = toshort(nofcontours) - r = r + 1 result[r] = toshort(boundingbox[1]) -- xmin - r = r + 1 result[r] = toshort(boundingbox[2]) -- ymin - r = r + 1 result[r] = toshort(boundingbox[3]) -- xmax - r = r + 1 result[r] = toshort(boundingbox[4]) -- ymax - if nofcontours > 0 then - for i=1,nofcontours do - r = r + 1 result[r] = toshort(contours[i]-1) - end - r = r + 1 result[r] = s_zero -- no instructions - local points = shape.points - local currentx = 0 - local currenty = 0 - local xpoints = { } - local ypoints = { } - local x = 0 - local y = 0 - local lastflag = nil - local nofflags = 0 - for i=1,#points do - local pt = points[i] - local px = pt[1] - local py = pt[2] - local fl = pt[3] and 0x01 or 0x00 - if px == currentx then - fl = fl + 0x10 + local contours = shape.contours + local nofcontours = contours and #contours or 0 + local boundingbox = glyph.boundingbox or noboundingbox + r = r + 1 result[r] = toshort(nofcontours) + r = r + 1 result[r] = toshort(boundingbox[1]) -- xmin + r = r + 1 result[r] = toshort(boundingbox[2]) -- ymin + r = r + 1 result[r] = toshort(boundingbox[3]) -- xmax + r = r + 1 result[r] = toshort(boundingbox[4]) -- ymax + if nofcontours > 0 then + for i=1,nofcontours do + r = r + 1 result[r] = toshort(contours[i]-1) + end + r = r + 1 result[r] = s_zero -- no instructions + local points = shape.points + local currentx = 0 + local currenty = 0 + -- local xpoints = { } + -- local ypoints = { } + local x = 0 + local y = 0 + local lastflag = nil + local nofflags = 0 + for i=1,#points do + local pt = points[i] + local px = pt[1] + local py = pt[2] + local fl = pt[3] and 0x01 or 0x00 + if px == currentx then + fl = fl + 0x10 + else + local dx = round(px - currentx) + x = x + 1 + if dx < -255 or dx > 255 then + xpoints[x] = toshort(dx) + elseif dx < 0 then + fl = fl + 0x02 + -- xpoints[x] = char(-dx) + xpoints[x] = chars[-dx] + elseif dx > 0 then + fl = fl + 0x12 + -- xpoints[x] = char(dx) + xpoints[x] = chars[dx] else - local dx = round(px - currentx) - if dx < -255 or dx > 255 then - x = x + 1 xpoints[x] = toshort(dx) - elseif dx < 0 then - fl = fl + 0x02 - x = x + 1 xpoints[x] = char(-dx) - elseif dx > 0 then - fl = fl + 0x12 - x = x + 1 xpoints[x] = char(dx) - else - fl = fl + 0x02 - x = x + 1 xpoints[x] = c_zero - end + fl = fl + 0x02 + xpoints[x] = c_zero end - if py == currenty then - fl = fl + 0x20 + end + if py == currenty then + fl = fl + 0x20 + else + local dy = round(py - currenty) + y = y + 1 + if dy < -255 or dy > 255 then + ypoints[y] = toshort(dy) + elseif dy < 0 then + fl = fl + 0x04 + -- ypoints[y] = char(-dy) + ypoints[y] = chars[-dy] + elseif dy > 0 then + fl = fl + 0x24 + -- ypoints[y] = char(dy) + ypoints[y] = chars[dy] else - local dy = round(py - currenty) - if dy < -255 or dy > 255 then - y = y + 1 ypoints[y] = toshort(dy) - elseif dy < 0 then - fl = fl + 0x04 - y = y + 1 ypoints[y] = char(-dy) - elseif dy > 0 then - fl = fl + 0x24 - y = y + 1 ypoints[y] = char(dy) - else - fl = fl + 0x04 - y = y + 1 ypoints[y] = c_zero - end - end - currentx = px - currenty = py - if lastflag == fl then - nofflags = nofflags + 1 - else -- if > 255 - if nofflags == 1 then - r = r + 1 result[r] = char(lastflag) - elseif nofflags == 2 then - r = r + 1 result[r] = char(lastflag,lastflag) - elseif nofflags > 2 then - lastflag = lastflag + 0x08 - r = r + 1 result[r] = char(lastflag,nofflags-1) - end - nofflags = 1 - lastflag = fl + fl = fl + 0x04 + ypoints[y] = c_zero end end - if nofflags == 1 then - r = r + 1 result[r] = char(lastflag) - elseif nofflags == 2 then - r = r + 1 result[r] = char(lastflag,lastflag) - elseif nofflags > 2 then - lastflag = lastflag + 0x08 - r = r + 1 result[r] = char(lastflag,nofflags-1) + currentx = px + currenty = py + if lastflag == fl then + nofflags = nofflags + 1 + else -- if > 255 + if nofflags == 1 then + -- r = r + 1 result[r] = char(lastflag) + r = r + 1 result[r] = chars[lastflag] + elseif nofflags == 2 then + r = r + 1 result[r] = char(lastflag,lastflag) + elseif nofflags > 2 then + lastflag = lastflag + 0x08 + r = r + 1 result[r] = char(lastflag,nofflags-1) + end + nofflags = 1 + lastflag = fl end - r = r + 1 result[r] = concat(xpoints) - r = r + 1 result[r] = concat(ypoints) end + if nofflags == 1 then + -- r = r + 1 result[r] = char(lastflag) + r = r + 1 result[r] = chars[lastflag] + elseif nofflags == 2 then + r = r + 1 result[r] = char(lastflag,lastflag) + elseif nofflags > 2 then + lastflag = lastflag + 0x08 + r = r + 1 result[r] = char(lastflag,nofflags-1) + end + -- r = r + 1 result[r] = concat(xpoints) + -- r = r + 1 result[r] = concat(ypoints) + r = r + 1 result[r] = concat(xpoints,"",1,x) + r = r + 1 result[r] = concat(ypoints,"",1,y) end - glyph.stream = concat(result,"",1,r) - else - -- fatal + -- can be helper or delegated to user + local stream = concat(result,"",1,r) + local length = #stream + local padding = idiv(length+3,4) * 4 - length + if padding > 0 then + -- stream = stream .. rep("\0",padding) -- can be a repeater + if padding == 1 then + padding = "\0" + elseif padding == 2 then + padding = "\0\0" + else + padding = "\0\0\0" + end + padding = stream .. padding + end + glyph.stream = stream end end end -- end of converter +local flags = { } + local function readglyph(f,nofcontours) -- read deltas here, saves space local points = { } - local instructions = { } - local flags = { } + -- local instructions = { } local contours = { } -- readintegertable(f,nofcontours,short) for i=1,nofcontours do contours[i] = readshort(f) + 1 @@ -724,9 +780,15 @@ local function readglyph(f,nofcontours) -- read deltas here, saves space local flag = readbyte(f) flags[i] = flag if band(flag,0x08) ~= 0 then - for j=1,readbyte(f) do + local n = readbyte(f) + if n == 1 then i = i + 1 flags[i] = flag + else + for j=1,n do + i = i + 1 + flags[i] = flag + end end end i = i + 1 @@ -735,16 +797,16 @@ local function readglyph(f,nofcontours) -- read deltas here, saves space -- can be repeated local x = 0 for i=1,nofpoints do - local flag = flags[i] - local short = band(flag,0x02) ~= 0 - local same = band(flag,0x10) ~= 0 - if short then - if same then + local flag = flags[i] + -- local short = band(flag,0x04) ~= 0 + -- local same = band(flag,0x20) ~= 0 + if band(flag,0x02) ~= 0 then + if band(flag,0x10) ~= 0 then x = x + readbyte(f) else x = x - readbyte(f) end - elseif same then + elseif band(flag,0x10) ~= 0 then -- copy else x = x + readshort(f) @@ -753,16 +815,16 @@ local function readglyph(f,nofcontours) -- read deltas here, saves space end local y = 0 for i=1,nofpoints do - local flag = flags[i] - local short = band(flag,0x04) ~= 0 - local same = band(flag,0x20) ~= 0 - if short then - if same then + local flag = flags[i] + -- local short = band(flag,0x04) ~= 0 + -- local same = band(flag,0x20) ~= 0 + if band(flag,0x04) ~= 0 then + if band(flag,0x20) ~= 0 then y = y + readbyte(f) else y = y - readbyte(f) end - elseif same then + elseif band(flag,0x20) ~= 0 then -- copy else y = y + readshort(f) @@ -858,7 +920,7 @@ local function readcomposite(f) if band(flags,0x0100) ~= 0 then instructions = true end - if not band(flags,0x0020) ~= 0 then -- f_more + if band(flags,0x0020) == 0 then -- f_more break end end @@ -883,21 +945,27 @@ function readers.loca(f,fontdata,specification) -- locations are relative to the glypdata table (glyf) local offset = fontdata.tables.glyf.offset local format = fontdata.fontheader.indextolocformat + local profile = fontdata.maximumprofile + local nofglyphs = profile and profile.nofglyphs local locations = { } setposition(f,datatable.offset) if format == 1 then - local nofglyphs = datatable.length/4 - 2 + if not nofglyphs then + nofglyphs = idiv(datatable.length,4) - 1 + end for i=0,nofglyphs do locations[i] = offset + readulong(f) end fontdata.nofglyphs = nofglyphs else - local nofglyphs = datatable.length/2 - 2 + if not nofglyphs then + nofglyphs = idiv(datatable.length,2) - 1 + end for i=0,nofglyphs do locations[i] = offset + readushort(f) * 2 end - fontdata.nofglyphs = nofglyphs end + fontdata.nofglyphs = nofglyphs fontdata.locations = locations end end @@ -913,15 +981,16 @@ function readers.glyf(f,fontdata,specification) -- part goes to cff module local filesize = fontdata.filesize local nothing = { 0, 0, 0, 0 } local shapes = { } - local loadshapes = specification.shapes or specification.instance - for index=0,nofglyphs do + local loadshapes = specification.shapes or specification.instance or specification.streams + for index=0,nofglyphs-1 do local location = locations[index] + local length = locations[index+1] - location if location >= filesize then report("discarding %s glyphs due to glyph location bug",nofglyphs-index+1) fontdata.nofglyphs = index - 1 fontdata.badfont = true break - elseif location > 0 then + elseif length > 0 then setposition(f,location) local nofcontours = readshort(f) glyphs[index].boundingbox = { @@ -933,7 +1002,7 @@ function readers.glyf(f,fontdata,specification) -- part goes to cff module if not loadshapes then -- save space elseif nofcontours == 0 then - shapes[index] = readnothing(f,nofcontours) + shapes[index] = readnothing(f) elseif nofcontours > 0 then shapes[index] = readglyph(f,nofcontours) else @@ -941,7 +1010,7 @@ function readers.glyf(f,fontdata,specification) -- part goes to cff module end else if loadshapes then - shapes[index] = { } + shapes[index] = readnothing(f) end glyphs[index].boundingbox = nothing end @@ -958,7 +1027,13 @@ function readers.glyf(f,fontdata,specification) -- part goes to cff module contours2outlines_shaped(glyphs,shapes,specification.shapes) end elseif specification.shapes then - contours2outlines_normal(glyphs,shapes) + if specification.streams then + repackpoints(glyphs,shapes) + else + contours2outlines_normal(glyphs,shapes) + end + elseif specification.streams then + repackpoints(glyphs,shapes) end end end @@ -1259,10 +1334,6 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) end end if shape.type == "glyph" then --- if glyph.name == "u1f31d" then --- if glyph.unicode == 127773 then --- inspect(deltas) --- end applyaxis(glyph,shape,deltas,dowidth) else -- todo: args_are_xy_values mess .. i have to be really bored diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-vfc.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-vfc.lua index 3e48422d621..dfe6b3afc46 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-vfc.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-vfc.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['font-vfc'] = { license = "see context related readme files" } -local select = select +local select, type = select, type local insert = table.insert local fonts = fonts @@ -25,7 +25,7 @@ local dummy = { "comment" } function helpers.prependcommands(commands,...) insert(commands,1,push) for i=select("#",...),1,-1 do - local s = select(i,...) + local s = (select(i,...)) if s then insert(commands,1,s) end @@ -38,7 +38,31 @@ function helpers.appendcommands(commands,...) insert(commands,1,push) insert(commands,pop) for i=1,select("#",...) do - local s = select(i,...) + local s = (select(i,...)) + if s then + insert(commands,s) + end + end + return commands +end + +function helpers.prependcommandtable(commands,t) + insert(commands,1,push) + for i=#t,1,-1 do + local s = t[i] + if s then + insert(commands,1,s) + end + end + insert(commands,pop) + return commands +end + +function helpers.appendcommandtable(commands,t) + insert(commands,1,push) + insert(commands,pop) + for i=1,#t do + local s = t[i] if s then insert(commands,s) end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-lpeg.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-lpeg.lua index 589fa2b0b22..51bc1d3df30 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-lpeg.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-lpeg.lua @@ -657,82 +657,6 @@ function lpeg.counter(pattern,action) end end --- utf extensies - -utf = utf or (unicode and unicode.utf8) or { } - -local utfcharacters = utf and utf.characters or string.utfcharacters -local utfgmatch = utf and utf.gmatch -local utfchar = utf and utf.char - -lpeg.UP = lpeg.P - -if utfcharacters then - - function lpeg.US(str) - local p = P(false) - for uc in utfcharacters(str) do - p = p + P(uc) - end - return p - end - - -elseif utfgmatch then - - function lpeg.US(str) - local p = P(false) - for uc in utfgmatch(str,".") do - p = p + P(uc) - end - return p - end - -else - - function lpeg.US(str) - local p = P(false) - local f = function(uc) - p = p + P(uc) - end - lpegmatch((utf8char/f)^0,str) - return p - end - -end - -local range = utf8byte * utf8byte + Cc(false) -- utf8byte is already a capture - -function lpeg.UR(str,more) - local first, last - if type(str) == "number" then - first = str - last = more or first - else - first, last = lpegmatch(range,str) - if not last then - return P(str) - end - end - if first == last then - return P(str) - elseif utfchar and (last - first < 8) then -- a somewhat arbitrary criterium - local p = P(false) - for i=first,last do - p = p + P(utfchar(i)) - end - return p -- nil when invalid range - else - local f = function(b) - return b >= first and b <= last - end - -- tricky, these nested captures - return utf8byte / f -- nil when invalid range - end -end - --- print(lpeg.match(lpeg.Cs((C(lpeg.UR("αω"))/{ ["χ"] = "OEPS" })^0),"αωχαω")) - -- lpeg.print(lpeg.R("ab","cd","gh")) -- lpeg.print(lpeg.P("a","b","c")) -- lpeg.print(lpeg.S("a","b","c")) @@ -1051,7 +975,6 @@ function lpeg.utfreplacer(list,insensitive) end end - -- local t = { "start", "stoep", "staart", "paard" } -- local p = lpeg.Cs((lpeg.utfchartabletopattern(t)/string.upper + 1)^1) diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-table.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-table.lua index 69f45d9b4cd..eae13513990 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-table.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-table.lua @@ -11,7 +11,6 @@ local table, string = table, string local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove local format, lower, dump = string.format, string.lower, string.dump local getmetatable, setmetatable = getmetatable, setmetatable -local getinfo = debug.getinfo local lpegmatch, patterns = lpeg.match, lpeg.patterns local floor = math.floor @@ -830,22 +829,25 @@ local function do_serialize(root,name,depth,level,indexed) end elseif tv == "function" then if functions then - local f = getinfo(v).what == "C" and dump(dummy) or dump(v) -- maybe strip - -- local f = getinfo(v).what == "C" and dump(function(...) return v(...) end) or dump(v) -- maybe strip - if tk == "number" then - if hexify then - handle(format("%s [0x%X]=load(%q),",depth,k,f)) + local getinfo = debug and debug.getinfo + if getinfo then + local f = getinfo(v).what == "C" and dump(dummy) or dump(v) -- maybe strip + -- local f = getinfo(v).what == "C" and dump(function(...) return v(...) end) or dump(v) -- maybe strip + if tk == "number" then + if hexify then + handle(format("%s [0x%X]=load(%q),",depth,k,f)) + else + handle(format("%s [%s]=load(%q),",depth,k,f)) + end + elseif tk == "boolean" then + handle(format("%s [%s]=load(%q),",depth,k and "true" or "false",f)) + elseif tk ~= "string" then + -- ignore + elseif noquotes and not reserved[k] and lpegmatch(propername,k) then + handle(format("%s %s=load(%q),",depth,k,f)) else - handle(format("%s [%s]=load(%q),",depth,k,f)) + handle(format("%s [%q]=load(%q),",depth,k,f)) end - elseif tk == "boolean" then - handle(format("%s [%s]=load(%q),",depth,k and "true" or "false",f)) - elseif tk ~= "string" then - -- ignore - elseif noquotes and not reserved[k] and lpegmatch(propername,k) then - handle(format("%s %s=load(%q),",depth,k,f)) - else - handle(format("%s [%q]=load(%q),",depth,k,f)) end end else diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-unicode.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-unicode.lua index b5f52d3127c..13e0a3fa1c1 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-unicode.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-l-unicode.lua @@ -21,13 +21,33 @@ if not modules then modules = { } end modules ['l-unicode'] = { -- todo: utf.sub replacement (used in syst-aux) -- we put these in the utf namespace: --- used : byte char gmatch len lower sub upper --- not used : dump find format gfind gsub match rep reverse +-- used : byte char len lower sub upper +-- not used : dump find format gmatch gfind gsub match rep reverse -utf = utf or (unicode and unicode.utf8) or { } +-- utf = utf or (unicode and unicode.utf8) or { } + +-- not supported: +-- +-- dump, find, format, gfind, gmatch, gsub, lower, match, rep, reverse, upper + +utf = utf or { } +unicode = nil + +if not string.utfcharacters then + + -- New: this gmatch hack is taken from the Lua 5.2 book. It's about two times slower + -- than the built-in string.utfcharacters. + + local gmatch = string.gmatch + + function string.characters(str) + return gmatch(str,".[\128-\191]*") + end -utf.characters = utf.characters or string.utfcharacters -utf.values = utf.values or string.utfvalues + +end + +utf.characters = string.utfcharacters -- string.utfvalues -- string.utfcharacters @@ -53,23 +73,19 @@ local bytepairs = string.bytepairs local finder = lpeg.finder local replacer = lpeg.replacer -local utfvalues = utf.values -local utfgmatch = utf.gmatch -- not always present - local p_utftype = patterns.utftype local p_utfstricttype = patterns.utfstricttype local p_utfoffset = patterns.utfoffset -local p_utf8char = patterns.utf8character +local p_utf8character = patterns.utf8character +local p_utf8char = patterns.utf8char local p_utf8byte = patterns.utf8byte local p_utfbom = patterns.utfbom local p_newline = patterns.newline local p_whitespace = patterns.whitespace -if not unicode then - - unicode = { utf = utf } -- for a while - -end +-- if not unicode then +-- unicode = { utf = utf } -- for a while +-- end if not utf.char then @@ -164,10 +180,8 @@ if not utf.byte then if not utf.byte then - local utf8byte = patterns.utf8byte - function utf.byte(c) - return lpegmatch(utf8byte,c) + return lpegmatch(p_utf8byte,c) end end @@ -281,7 +295,7 @@ if not utf.len then -- -- alternative 1: 0.77 -- - -- local utfcharcounter = utfbom^-1 * Cs((p_utf8char/'!')^0) + -- local utfcharcounter = utfbom^-1 * Cs((p_utf8character/'!')^0) -- -- function utf.len(str) -- return #lpegmatch(utfcharcounter,str or "") @@ -291,7 +305,7 @@ if not utf.len then -- -- local n = 0 -- - -- local utfcharcounter = utfbom^-1 * (p_utf8char/function() n = n + 1 end)^0 -- slow + -- local utfcharcounter = utfbom^-1 * (p_utf8character/function() n = n + 1 end)^0 -- slow -- -- function utf.length(str) -- n = 0 @@ -368,7 +382,7 @@ if not utf.sub then -- inefficient as lpeg just copies ^n -- local function sub(str,start,stop) - -- local pattern = p_utf8char^-(start-1) * C(p_utf8char^-(stop-start+1)) + -- local pattern = p_utf8character^-(start-1) * C(p_utf8character^-(stop-start+1)) -- inspect(pattern) -- return lpegmatch(pattern,str) or "" -- end @@ -391,7 +405,7 @@ if not utf.sub then -- end -- end -- - -- local pattern = Cmt(p_utf8char,slide)^0 + -- local pattern = Cmt(p_utf8character,slide)^0 -- -- function utf.sub(str,start,stop) -- todo: from the end -- if not start then @@ -446,11 +460,11 @@ if not utf.sub then end end - local pattern_zero = Cmt(p_utf8char,slide_zero)^0 - local pattern_one = Cmt(p_utf8char,slide_one )^0 - local pattern_two = Cmt(p_utf8char,slide_two )^0 + local pattern_zero = Cmt(p_utf8character,slide_zero)^0 + local pattern_one = Cmt(p_utf8character,slide_one )^0 + local pattern_two = Cmt(p_utf8character,slide_two )^0 - local pattern_first = C(patterns.utf8character) + local pattern_first = C(p_utf8character) function utf.sub(str,start,stop) if not start then @@ -546,7 +560,7 @@ end -- a replacement for simple gsubs: -- function utf.remapper(mapping) --- local pattern = Cs((p_utf8char/mapping)^0) +-- local pattern = Cs((p_utf8character/mapping)^0) -- return function(str) -- if not str or str == "" then -- return "" @@ -568,16 +582,16 @@ function utf.remapper(mapping,option,action) -- static also returns a pattern return "" else if not pattern then - pattern = Cs((tabletopattern(mapping)/action + p_utf8char)^0) + pattern = Cs((tabletopattern(mapping)/action + p_utf8character)^0) end return lpegmatch(pattern,str) end end elseif option == "pattern" then - return Cs((tabletopattern(mapping)/action + p_utf8char)^0) + return Cs((tabletopattern(mapping)/action + p_utf8character)^0) -- elseif option == "static" then else - local pattern = Cs((tabletopattern(mapping)/action + p_utf8char)^0) + local pattern = Cs((tabletopattern(mapping)/action + p_utf8character)^0) return function(str) if not str or str == "" then return "" @@ -588,9 +602,9 @@ function utf.remapper(mapping,option,action) -- static also returns a pattern end elseif variant == "function" then if option == "pattern" then - return Cs((p_utf8char/mapping + p_utf8char)^0) + return Cs((p_utf8character/mapping + p_utf8character)^0) else - local pattern = Cs((p_utf8char/mapping + p_utf8char)^0) + local pattern = Cs((p_utf8character/mapping + p_utf8character)^0) return function(str) if not str or str == "" then return "" @@ -637,9 +651,9 @@ end -- inspect(utf.split("a b c d",true)) local utflinesplitter = p_utfbom^-1 * lpeg.tsplitat(p_newline) -local utfcharsplitter_ows = p_utfbom^-1 * Ct(C(p_utf8char)^0) -local utfcharsplitter_iws = p_utfbom^-1 * Ct((p_whitespace^1 + C(p_utf8char))^0) -local utfcharsplitter_raw = Ct(C(p_utf8char)^0) +local utfcharsplitter_ows = p_utfbom^-1 * Ct(C(p_utf8character)^0) +local utfcharsplitter_iws = p_utfbom^-1 * Ct((p_whitespace^1 + C(p_utf8character))^0) +local utfcharsplitter_raw = Ct(C(p_utf8character)^0) patterns.utflinesplitter = utflinesplitter @@ -775,7 +789,7 @@ local utf_32_le_linesplitter = utf_32_le_getbom * lpeg.tsplitat(patterns.utf_32_ -- if right then -- local now = 256*left + right -- if more > 0 then --- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong +-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- more = 0 -- r = r + 1 -- result[r] = utfchar(now) @@ -804,7 +818,7 @@ local utf_32_le_linesplitter = utf_32_le_getbom * lpeg.tsplitat(patterns.utf_32_ -- if right then -- local now = 256*right + left -- if more > 0 then --- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong +-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- more = 0 -- r = r + 1 -- result[r] = utfchar(now) @@ -834,7 +848,7 @@ local utf_32_le_linesplitter = utf_32_le_getbom * lpeg.tsplitat(patterns.utf_32_ -- if right then -- local now = 256*right + left -- if more > 0 then --- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong +-- now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- more = 0 -- r = r + 1 -- result[r] = utfchar(now) @@ -911,7 +925,7 @@ local more = 0 local p_utf16_to_utf8_be = C(1) * C(1) /function(left,right) local now = 256*byte(left) + byte(right) if more > 0 then - now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong + now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 more = 0 return utfchar(now) elseif now >= 0xD800 and now <= 0xDBFF then @@ -925,7 +939,7 @@ end local p_utf16_to_utf8_le = C(1) * C(1) /function(right,left) local now = 256*byte(left) + byte(right) if more > 0 then - now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 -- the 0x10000 smells wrong + now = (more-0xD800)*0x400 + (now-0xDC00) + 0x10000 more = 0 return utfchar(now) elseif now >= 0xD800 and now <= 0xDBFF then @@ -1119,15 +1133,6 @@ function utf.utf8_to_utf16(str,littleendian,nobom) end end --- function utf.tocodes(str,separator) -- can be sped up with an lpeg --- local t, n = { }, 0 --- for u in utfvalues(str) do --- n = n + 1 --- t[n] = format("0x%04X",u) --- end --- return concat(t,separator or " ") --- end - local pattern = Cs ( (p_utf8byte / function(unicode ) return format( "0x%04X", unicode) end) * (p_utf8byte * Carg(1) / function(unicode,separator) return format("%s0x%04X",separator,unicode) end)^0 @@ -1163,25 +1168,10 @@ end -- -local p_nany = p_utf8char / "" - -if utfgmatch then - - function utf.count(str,what) - if type(what) == "string" then - local n = 0 - for _ in utfgmatch(str,what) do - n = n + 1 - end - return n - else -- 4 times slower but still faster than / function - return #lpegmatch(Cs((P(what)/" " + p_nany)^0),str) - end - end - -else +do - local cache = { } + local p_nany = p_utf8character / "" + local cache = { } function utf.count(str,what) if type(what) == "string" then @@ -1198,23 +1188,7 @@ else end --- maybe also register as string.utf* - - -if not utf.characters then - - -- New: this gmatch hack is taken from the Lua 5.2 book. It's about two times slower - -- than the built-in string.utfcharacters. - - function utf.characters(str) - return gmatch(str,".[\128-\191]*") - end - - string.utfcharacters = utf.characters - -end - -if not utf.values then +if not string.utfvalues then -- So, a logical next step is to check for the values variant. It over five times -- slower than the built-in string.utfvalues. I optimized it a bit for n=0,1. @@ -1226,7 +1200,7 @@ if not utf.values then -- we share this one end - -- function utf.values(str) + -- function string.utfvalues(str) -- local n = #str -- if n == 0 then -- return wrap(dummy) @@ -1241,7 +1215,7 @@ if not utf.values then -- -- faster: - function utf.values(str) + function string.utfvalues(str) local n = #str if n == 0 then return dummy @@ -1264,11 +1238,11 @@ if not utf.values then -- slower: -- - -- local pattern = C(patterns.utf8character) * Cp() - -- ----- pattern = patterns.utf8character/utfbyte * Cp() - -- ----- pattern = patterns.utf8byte * Cp() + -- local pattern = C(p_utf8character) * Cp() + -- ----- pattern = p_utf8character/utfbyte * Cp() + -- ----- pattern = p_utf8byte * Cp() -- - -- function utf.values(str) -- one of the cases where a find is faster than an lpeg + -- function string.utfvalues(str) -- one of the cases where a find is faster than an lpeg -- local n = #str -- if n == 0 then -- return dummy @@ -1287,10 +1261,10 @@ if not utf.values then -- end -- end - string.utfvalues = utf.values - end +utf.values = string.utfvalues + function utf.chrlen(u) -- u is number return (u < 0x80 and 1) or @@ -1310,7 +1284,7 @@ if bit32 then local extract = bit32.extract local char = string.char - function unicode.toutf32string(n) + function utf.toutf32string(n) if n <= 0xFF then return char(n) .. @@ -1359,3 +1333,73 @@ function string.utfpadd(s,n) end return s end + +-- goodies + +do + + local utfcharacters = utf.characters or string.utfcharacters + local utfchar = utf.char or string.utfcharacter + + lpeg.UP = P + + if utfcharacters then + + function lpeg.US(str) + local p = P(false) + for uc in utfcharacters(str) do + p = p + P(uc) + end + return p + end + + else + + function lpeg.US(str) + local p = P(false) + local f = function(uc) + p = p + P(uc) + end + lpegmatch((p_utf8char/f)^0,str) + return p + end + + end + + local range = p_utf8byte * p_utf8byte + Cc(false) -- utf8byte is already a capture + + function lpeg.UR(str,more) + local first, last + if type(str) == "number" then + first = str + last = more or first + else + first, last = lpegmatch(range,str) + if not last then + return P(str) + end + end + if first == last then + return P(str) + end + if not utfchar then + utfchar = utf.char -- maybe delayed + end + if utfchar and (last - first < 8) then -- a somewhat arbitrary criterium + local p = P(false) + for i=first,last do + p = p + P(utfchar(i)) + end + return p -- nil when invalid range + else + local f = function(b) + return b >= first and b <= last + end + -- tricky, these nested captures + return p_utf8byte / f -- nil when invalid range + end + end + + -- print(lpeg.match(lpeg.Cs((C(lpeg.UR("αω"))/{ ["χ"] = "OEPS" })^0),"αωχαω")) + +end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua index 0a14e6082d3..0c9bfcc380f 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 10/18/18 00:07:52 +-- merge date : 12/19/18 19:22:22 do -- begin closure to overcome local limits and interference @@ -554,64 +554,6 @@ function lpeg.counter(pattern,action) return function(str) n=0;lpegmatch(pattern,str);return n end end end -utf=utf or (unicode and unicode.utf8) or {} -local utfcharacters=utf and utf.characters or string.utfcharacters -local utfgmatch=utf and utf.gmatch -local utfchar=utf and utf.char -lpeg.UP=lpeg.P -if utfcharacters then - function lpeg.US(str) - local p=P(false) - for uc in utfcharacters(str) do - p=p+P(uc) - end - return p - end -elseif utfgmatch then - function lpeg.US(str) - local p=P(false) - for uc in utfgmatch(str,".") do - p=p+P(uc) - end - return p - end -else - function lpeg.US(str) - local p=P(false) - local f=function(uc) - p=p+P(uc) - end - lpegmatch((utf8char/f)^0,str) - return p - end -end -local range=utf8byte*utf8byte+Cc(false) -function lpeg.UR(str,more) - local first,last - if type(str)=="number" then - first=str - last=more or first - else - first,last=lpegmatch(range,str) - if not last then - return P(str) - end - end - if first==last then - return P(str) - elseif utfchar and (last-first<8) then - local p=P(false) - for i=first,last do - p=p+P(utfchar(i)) - end - return p - else - local f=function(b) - return b>=first and b<=last - end - return utf8byte/f - end -end function lpeg.is_lpeg(p) return p and lpegtype(p)=="pattern" end @@ -1107,7 +1049,6 @@ local table,string=table,string local concat,sort,insert,remove=table.concat,table.sort,table.insert,table.remove local format,lower,dump=string.format,string.lower,string.dump local getmetatable,setmetatable=getmetatable,setmetatable -local getinfo=debug.getinfo local lpegmatch,patterns=lpeg.match,lpeg.patterns local floor=math.floor local stripper=patterns.stripper @@ -1669,20 +1610,23 @@ local function do_serialize(root,name,depth,level,indexed) end elseif tv=="function" then if functions then - local f=getinfo(v).what=="C" and dump(dummy) or dump(v) - if tk=="number" then - if hexify then - handle(format("%s [0x%X]=load(%q),",depth,k,f)) + local getinfo=debug and debug.getinfo + if getinfo then + local f=getinfo(v).what=="C" and dump(dummy) or dump(v) + if tk=="number" then + if hexify then + handle(format("%s [0x%X]=load(%q),",depth,k,f)) + else + handle(format("%s [%s]=load(%q),",depth,k,f)) + end + elseif tk=="boolean" then + handle(format("%s [%s]=load(%q),",depth,k and "true" or "false",f)) + elseif tk~="string" then + elseif noquotes and not reserved[k] and lpegmatch(propername,k) then + handle(format("%s %s=load(%q),",depth,k,f)) else - handle(format("%s [%s]=load(%q),",depth,k,f)) + handle(format("%s [%q]=load(%q),",depth,k,f)) end - elseif tk=="boolean" then - handle(format("%s [%s]=load(%q),",depth,k and "true" or "false",f)) - elseif tk~="string" then - elseif noquotes and not reserved[k] and lpegmatch(propername,k) then - handle(format("%s %s=load(%q),",depth,k,f)) - else - handle(format("%s [%q]=load(%q),",depth,k,f)) end end else @@ -3088,699 +3032,6 @@ end -- closure do -- begin closure to overcome local limits and interference -if not modules then modules={} end modules ['l-unicode']={ - version=1.001, - comment="companion to luat-lib.mkiv", - author="Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright="PRAGMA ADE / ConTeXt Development Team", - license="see context related readme files" -} -utf=utf or (unicode and unicode.utf8) or {} -utf.characters=utf.characters or string.utfcharacters -utf.values=utf.values or string.utfvalues -local type=type -local char,byte,format,sub,gmatch=string.char,string.byte,string.format,string.sub,string.gmatch -local concat=table.concat -local P,C,R,Cs,Ct,Cmt,Cc,Carg,Cp=lpeg.P,lpeg.C,lpeg.R,lpeg.Cs,lpeg.Ct,lpeg.Cmt,lpeg.Cc,lpeg.Carg,lpeg.Cp -local lpegmatch=lpeg.match -local patterns=lpeg.patterns -local tabletopattern=lpeg.utfchartabletopattern -local bytepairs=string.bytepairs -local finder=lpeg.finder -local replacer=lpeg.replacer -local utfvalues=utf.values -local utfgmatch=utf.gmatch -local p_utftype=patterns.utftype -local p_utfstricttype=patterns.utfstricttype -local p_utfoffset=patterns.utfoffset -local p_utf8char=patterns.utf8character -local p_utf8byte=patterns.utf8byte -local p_utfbom=patterns.utfbom -local p_newline=patterns.newline -local p_whitespace=patterns.whitespace -if not unicode then - unicode={ utf=utf } -end -if not utf.char then - utf.char=string.utfcharacter or (utf8 and utf8.char) - if not utf.char then - local char=string.char - if bit32 then - local rshift=bit32.rshift - function utf.char(n) - if n<0x80 then - return char(n) - elseif n<0x800 then - return char( - 0xC0+rshift(n,6), - 0x80+(n%0x40) - ) - elseif n<0x10000 then - return char( - 0xE0+rshift(n,12), - 0x80+(rshift(n,6)%0x40), - 0x80+(n%0x40) - ) - elseif n<0x200000 then - return char( - 0xF0+rshift(n,18), - 0x80+(rshift(n,12)%0x40), - 0x80+(rshift(n,6)%0x40), - 0x80+(n%0x40) - ) - else - return "" - end - end - else - local floor=math.floor - function utf.char(n) - if n<0x80 then - return char(n) - elseif n<0x800 then - return char( - 0xC0+floor(n/0x40), - 0x80+(n%0x40) - ) - elseif n<0x10000 then - return char( - 0xE0+floor(n/0x1000), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) - elseif n<0x200000 then - return char( - 0xF0+floor(n/0x40000), - 0x80+(floor(n/0x1000)%0x40), - 0x80+(floor(n/0x40)%0x40), - 0x80+(n%0x40) - ) - else - return "" - end - end - end - end -end -if not utf.byte then - utf.byte=string.utfvalue or (utf8 and utf8.codepoint) - if not utf.byte then - local utf8byte=patterns.utf8byte - function utf.byte(c) - return lpegmatch(utf8byte,c) - end - end -end -local utfchar,utfbyte=utf.char,utf.byte -function utf.filetype(data) - return data and lpegmatch(p_utftype,data) or "unknown" -end -local toentities=Cs ( - ( - patterns.utf8one+( - patterns.utf8two+patterns.utf8three+patterns.utf8four - )/function(s) local b=utfbyte(s) if b<127 then return s else return format("&#%X;",b) end end - )^0 -) -patterns.toentities=toentities -function utf.toentities(str) - return lpegmatch(toentities,str) -end -local one=P(1) -local two=C(1)*C(1) -local four=C(R(utfchar(0xD8),utfchar(0xFF)))*C(1)*C(1)*C(1) -local pattern=P("\254\255")*Cs(( - four/function(a,b,c,d) - local ab=0xFF*byte(a)+byte(b) - local cd=0xFF*byte(c)+byte(d) - return utfchar((ab-0xD800)*0x400+(cd-0xDC00)+0x10000) - end+two/function(a,b) - return utfchar(byte(a)*256+byte(b)) - end+one - )^1 )+P("\255\254")*Cs(( - four/function(b,a,d,c) - local ab=0xFF*byte(a)+byte(b) - local cd=0xFF*byte(c)+byte(d) - return utfchar((ab-0xD800)*0x400+(cd-0xDC00)+0x10000) - end+two/function(b,a) - return utfchar(byte(a)*256+byte(b)) - end+one - )^1 ) -function string.toutf(s) - return lpegmatch(pattern,s) or s -end -local validatedutf=Cs ( - ( - patterns.utf8one+patterns.utf8two+patterns.utf8three+patterns.utf8four+P(1)/"�" - )^0 -) -patterns.validatedutf=validatedutf -function utf.is_valid(str) - return type(str)=="string" and lpegmatch(validatedutf,str) or false -end -if not utf.len then - utf.len=string.utflength or (utf8 and utf8.len) - if not utf.len then - local n,f=0,1 - local utfcharcounter=patterns.utfbom^-1*Cmt ( - Cc(1)*patterns.utf8one^1+Cc(2)*patterns.utf8two^1+Cc(3)*patterns.utf8three^1+Cc(4)*patterns.utf8four^1, - function(_,t,d) - n=n+(t-f)/d - f=t - return true - end - )^0 - function utf.len(str) - n,f=0,1 - lpegmatch(utfcharcounter,str or "") - return n - end - end -end -utf.length=utf.len -if not utf.sub then - local utflength=utf.length - local b,e,n,first,last=0,0,0,0,0 - local function slide_zero(s,p) - n=n+1 - if n>=last then - e=p-1 - else - return p - end - end - local function slide_one(s,p) - n=n+1 - if n==first then - b=p - end - if n>=last then - e=p-1 - else - return p - end - end - local function slide_two(s,p) - n=n+1 - if n==first then - b=p - else - return true - end - end - local pattern_zero=Cmt(p_utf8char,slide_zero)^0 - local pattern_one=Cmt(p_utf8char,slide_one )^0 - local pattern_two=Cmt(p_utf8char,slide_two )^0 - local pattern_first=C(patterns.utf8character) - function utf.sub(str,start,stop) - if not start then - return str - end - if start==0 then - start=1 - end - if not stop then - if start<0 then - local l=utflength(str) - start=l+start - else - start=start-1 - end - b,n,first=0,0,start - lpegmatch(pattern_two,str) - if n>=first then - return sub(str,b) - else - return "" - end - end - if start<0 or stop<0 then - local l=utf.length(str) - if start<0 then - start=l+start - if start<=0 then - start=1 - else - start=start+1 - end - end - if stop<0 then - stop=l+stop - if stop==0 then - stop=1 - else - stop=stop+1 - end - end - end - if start==1 and stop==1 then - return lpegmatch(pattern_first,str) or "" - elseif start>stop then - return "" - elseif start>1 then - b,e,n,first,last=0,0,0,start-1,stop - lpegmatch(pattern_one,str) - if n>=first and e==0 then - e=#str - end - return sub(str,b,e) - else - b,e,n,last=1,0,0,stop - lpegmatch(pattern_zero,str) - if e==0 then - e=#str - end - return sub(str,b,e) - end - end -end -function utf.remapper(mapping,option,action) - local variant=type(mapping) - if variant=="table" then - action=action or mapping - if option=="dynamic" then - local pattern=false - table.setmetatablenewindex(mapping,function(t,k,v) rawset(t,k,v) pattern=false end) - return function(str) - if not str or str=="" then - return "" - else - if not pattern then - pattern=Cs((tabletopattern(mapping)/action+p_utf8char)^0) - end - return lpegmatch(pattern,str) - end - end - elseif option=="pattern" then - return Cs((tabletopattern(mapping)/action+p_utf8char)^0) - else - local pattern=Cs((tabletopattern(mapping)/action+p_utf8char)^0) - return function(str) - if not str or str=="" then - return "" - else - return lpegmatch(pattern,str) - end - end,pattern - end - elseif variant=="function" then - if option=="pattern" then - return Cs((p_utf8char/mapping+p_utf8char)^0) - else - local pattern=Cs((p_utf8char/mapping+p_utf8char)^0) - return function(str) - if not str or str=="" then - return "" - else - return lpegmatch(pattern,str) - end - end,pattern - end - else - return function(str) - return str or "" - end - end -end -function utf.replacer(t) - local r=replacer(t,false,false,true) - return function(str) - return lpegmatch(r,str) - end -end -function utf.subtituter(t) - local f=finder (t) - local r=replacer(t,false,false,true) - return function(str) - local i=lpegmatch(f,str) - if not i then - return str - elseif i>#str then - return str - else - return lpegmatch(r,str) - end - end -end -local utflinesplitter=p_utfbom^-1*lpeg.tsplitat(p_newline) -local utfcharsplitter_ows=p_utfbom^-1*Ct(C(p_utf8char)^0) -local utfcharsplitter_iws=p_utfbom^-1*Ct((p_whitespace^1+C(p_utf8char))^0) -local utfcharsplitter_raw=Ct(C(p_utf8char)^0) -patterns.utflinesplitter=utflinesplitter -function utf.splitlines(str) - return lpegmatch(utflinesplitter,str or "") -end -function utf.split(str,ignorewhitespace) - if ignorewhitespace then - return lpegmatch(utfcharsplitter_iws,str or "") - else - return lpegmatch(utfcharsplitter_ows,str or "") - end -end -function utf.totable(str) - return lpegmatch(utfcharsplitter_raw,str) -end -function utf.magic(f) - local str=f:read(4) or "" - local off=lpegmatch(p_utfoffset,str) - if off<4 then - f:seek('set',off) - end - return lpegmatch(p_utftype,str) -end -local utf16_to_utf8_be,utf16_to_utf8_le -local utf32_to_utf8_be,utf32_to_utf8_le -local utf_16_be_getbom=patterns.utfbom_16_be^-1 -local utf_16_le_getbom=patterns.utfbom_16_le^-1 -local utf_32_be_getbom=patterns.utfbom_32_be^-1 -local utf_32_le_getbom=patterns.utfbom_32_le^-1 -local utf_16_be_linesplitter=utf_16_be_getbom*lpeg.tsplitat(patterns.utf_16_be_nl) -local utf_16_le_linesplitter=utf_16_le_getbom*lpeg.tsplitat(patterns.utf_16_le_nl) -local utf_32_be_linesplitter=utf_32_be_getbom*lpeg.tsplitat(patterns.utf_32_be_nl) -local utf_32_le_linesplitter=utf_32_le_getbom*lpeg.tsplitat(patterns.utf_32_le_nl) -local more=0 -local p_utf16_to_utf8_be=C(1)*C(1)/function(left,right) - local now=256*byte(left)+byte(right) - if more>0 then - now=(more-0xD800)*0x400+(now-0xDC00)+0x10000 - more=0 - return utfchar(now) - elseif now>=0xD800 and now<=0xDBFF then - more=now - return "" - else - return utfchar(now) - end -end -local p_utf16_to_utf8_le=C(1)*C(1)/function(right,left) - local now=256*byte(left)+byte(right) - if more>0 then - now=(more-0xD800)*0x400+(now-0xDC00)+0x10000 - more=0 - return utfchar(now) - elseif now>=0xD800 and now<=0xDBFF then - more=now - return "" - else - return utfchar(now) - end -end -local p_utf32_to_utf8_be=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d) - return utfchar(256*256*256*byte(a)+256*256*byte(b)+256*byte(c)+byte(d)) -end -local p_utf32_to_utf8_le=C(1)*C(1)*C(1)*C(1)/function(a,b,c,d) - return utfchar(256*256*256*byte(d)+256*256*byte(c)+256*byte(b)+byte(a)) -end -p_utf16_to_utf8_be=P(true)/function() more=0 end*utf_16_be_getbom*Cs(p_utf16_to_utf8_be^0) -p_utf16_to_utf8_le=P(true)/function() more=0 end*utf_16_le_getbom*Cs(p_utf16_to_utf8_le^0) -p_utf32_to_utf8_be=P(true)/function() more=0 end*utf_32_be_getbom*Cs(p_utf32_to_utf8_be^0) -p_utf32_to_utf8_le=P(true)/function() more=0 end*utf_32_le_getbom*Cs(p_utf32_to_utf8_le^0) -patterns.utf16_to_utf8_be=p_utf16_to_utf8_be -patterns.utf16_to_utf8_le=p_utf16_to_utf8_le -patterns.utf32_to_utf8_be=p_utf32_to_utf8_be -patterns.utf32_to_utf8_le=p_utf32_to_utf8_le -utf16_to_utf8_be=function(s) - if s and s~="" then - return lpegmatch(p_utf16_to_utf8_be,s) - else - return s - end -end -local utf16_to_utf8_be_t=function(t) - if not t then - return nil - elseif type(t)=="string" then - t=lpegmatch(utf_16_be_linesplitter,t) - end - for i=1,#t do - local s=t[i] - if s~="" then - t[i]=lpegmatch(p_utf16_to_utf8_be,s) - end - end - return t -end -utf16_to_utf8_le=function(s) - if s and s~="" then - return lpegmatch(p_utf16_to_utf8_le,s) - else - return s - end -end -local utf16_to_utf8_le_t=function(t) - if not t then - return nil - elseif type(t)=="string" then - t=lpegmatch(utf_16_le_linesplitter,t) - end - for i=1,#t do - local s=t[i] - if s~="" then - t[i]=lpegmatch(p_utf16_to_utf8_le,s) - end - end - return t -end -utf32_to_utf8_be=function(s) - if s and s~="" then - return lpegmatch(p_utf32_to_utf8_be,s) - else - return s - end -end -local utf32_to_utf8_be_t=function(t) - if not t then - return nil - elseif type(t)=="string" then - t=lpegmatch(utf_32_be_linesplitter,t) - end - for i=1,#t do - local s=t[i] - if s~="" then - t[i]=lpegmatch(p_utf32_to_utf8_be,s) - end - end - return t -end -utf32_to_utf8_le=function(s) - if s and s~="" then - return lpegmatch(p_utf32_to_utf8_le,s) - else - return s - end -end -local utf32_to_utf8_le_t=function(t) - if not t then - return nil - elseif type(t)=="string" then - t=lpegmatch(utf_32_le_linesplitter,t) - end - for i=1,#t do - local s=t[i] - if s~="" then - t[i]=lpegmatch(p_utf32_to_utf8_le,s) - end - end - return t -end -utf.utf16_to_utf8_le_t=utf16_to_utf8_le_t -utf.utf16_to_utf8_be_t=utf16_to_utf8_be_t -utf.utf32_to_utf8_le_t=utf32_to_utf8_le_t -utf.utf32_to_utf8_be_t=utf32_to_utf8_be_t -utf.utf16_to_utf8_le=utf16_to_utf8_le -utf.utf16_to_utf8_be=utf16_to_utf8_be -utf.utf32_to_utf8_le=utf32_to_utf8_le -utf.utf32_to_utf8_be=utf32_to_utf8_be -function utf.utf8_to_utf8_t(t) - return type(t)=="string" and lpegmatch(utflinesplitter,t) or t -end -function utf.utf16_to_utf8_t(t,endian) - return endian and utf16_to_utf8_be_t(t) or utf16_to_utf8_le_t(t) or t -end -function utf.utf32_to_utf8_t(t,endian) - return endian and utf32_to_utf8_be_t(t) or utf32_to_utf8_le_t(t) or t -end -local function little(b) - if b<0x10000 then - return char(b%256,rshift(b,8)) - else - b=b-0x10000 - local b1=rshift(b,10)+0xD800 - local b2=b%1024+0xDC00 - return char(b1%256,rshift(b1,8),b2%256,rshift(b2,8)) - end -end -local function big(b) - if b<0x10000 then - return char(rshift(b,8),b%256) - else - b=b-0x10000 - local b1=rshift(b,10)+0xD800 - local b2=b%1024+0xDC00 - return char(rshift(b1,8),b1%256,rshift(b2,8),b2%256) - end -end -local l_remap=Cs((p_utf8byte/little+P(1)/"")^0) -local b_remap=Cs((p_utf8byte/big+P(1)/"")^0) -local function utf8_to_utf16_be(str,nobom) - if nobom then - return lpegmatch(b_remap,str) - else - return char(254,255)..lpegmatch(b_remap,str) - end -end -local function utf8_to_utf16_le(str,nobom) - if nobom then - return lpegmatch(l_remap,str) - else - return char(255,254)..lpegmatch(l_remap,str) - end -end -utf.utf8_to_utf16_be=utf8_to_utf16_be -utf.utf8_to_utf16_le=utf8_to_utf16_le -function utf.utf8_to_utf16(str,littleendian,nobom) - if littleendian then - return utf8_to_utf16_le(str,nobom) - else - return utf8_to_utf16_be(str,nobom) - end -end -local pattern=Cs ( - (p_utf8byte/function(unicode ) return format("0x%04X",unicode) end)*(p_utf8byte*Carg(1)/function(unicode,separator) return format("%s0x%04X",separator,unicode) end)^0 -) -function utf.tocodes(str,separator) - return lpegmatch(pattern,str,1,separator or " ") -end -function utf.ustring(s) - return format("U+%05X",type(s)=="number" and s or utfbyte(s)) -end -function utf.xstring(s) - return format("0x%05X",type(s)=="number" and s or utfbyte(s)) -end -function utf.toeight(str) - if not str or str=="" then - return nil - end - local utftype=lpegmatch(p_utfstricttype,str) - if utftype=="utf-8" then - return sub(str,4) - elseif utftype=="utf-16-be" then - return utf16_to_utf8_be(str) - elseif utftype=="utf-16-le" then - return utf16_to_utf8_le(str) - else - return str - end -end -local p_nany=p_utf8char/"" -if utfgmatch then - function utf.count(str,what) - if type(what)=="string" then - local n=0 - for _ in utfgmatch(str,what) do - n=n+1 - end - return n - else - return #lpegmatch(Cs((P(what)/" "+p_nany)^0),str) - end - end -else - local cache={} - function utf.count(str,what) - if type(what)=="string" then - local p=cache[what] - if not p then - p=Cs((P(what)/" "+p_nany)^0) - cache[p]=p - end - return #lpegmatch(p,str) - else - return #lpegmatch(Cs((P(what)/" "+p_nany)^0),str) - end - end -end -if not utf.characters then - function utf.characters(str) - return gmatch(str,".[\128-\191]*") - end - string.utfcharacters=utf.characters -end -if not utf.values then - local find=string.find - local dummy=function() - end - function utf.values(str) - local n=#str - if n==0 then - return dummy - elseif n==1 then - return function() return utfbyte(str) end - else - local p=1 - return function() - local b,e=find(str,".[\128-\191]*",p) - if b then - p=e+1 - return utfbyte(sub(str,b,e)) - end - end - end - end - string.utfvalues=utf.values -end -function utf.chrlen(u) - return - (u<0x80 and 1) or - (u<0xE0 and 2) or - (u<0xF0 and 3) or - (u<0xF8 and 4) or - (u<0xFC and 5) or - (u<0xFE and 6) or 0 -end -if bit32 then - local extract=bit32.extract - local char=string.char - function unicode.toutf32string(n) - if n<=0xFF then - return - char(n).."\000\000\000" - elseif n<=0xFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8)).."\000\000" - elseif n<=0xFFFFFF then - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8)).."\000" - else - return - char(extract(n,0,8))..char(extract(n,8,8))..char(extract(n,16,8))..char(extract(n,24,8)) - end - end -end -local len=utf.len -local rep=rep -function string.utfpadd(s,n) - if n and n~=0 then - local l=len(s) - if n>0 then - local d=n-l - if d>0 then - return rep(c or " ",d)..s - end - else - local d=- n-l - if d>0 then - return s..rep(c or " ",d) - end - end - end - return s -end - -end -- closure - -do -- begin closure to overcome local limits and interference - if not modules then modules={} end modules ['util-str']={ version=1.001, comment="companion to luat-lib.mkiv", @@ -4649,6 +3900,10 @@ function strings.newcollector() end end end +local f_16_16=formatters["%0.5N"] +function number.to16dot16(n) + return f_16_16(n/65536.0) +end end -- closure @@ -4661,6 +3916,7 @@ if not modules then modules={} end modules ['util-fil']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } +local tonumber=tonumber local byte=string.byte local char=string.char utilities=utilities or {} @@ -4819,17 +4075,17 @@ end function files.readfixed2(f) local a,b=byte(f:read(2),1,2) if a>=0x80 then - return (a-0x100)+b/0x100 + tonumber((a-0x100).."."..b) else - return (a )+b/0x100 + tonumber((a ).."."..b) end end function files.readfixed4(f) local a,b,c,d=byte(f:read(4),1,4) if a>=0x80 then - return (0x100*a+b-0x10000)+(0x100*c+d)/0x10000 + tonumber((0x100*a+b-0x10000).."."..(0x100*c+d)) else - return (0x100*a+b )+(0x100*c+d)/0x10000 + tonumber((0x100*a+b ).."."..(0x100*c+d)) end end if bit32 then @@ -4963,6 +4219,7 @@ local match,gmatch,gsub,lower=string.match,string.gmatch,string.gsub,string.lowe local formatters,split,format,dump=string.formatters,string.split,string.format,string.dump local loadfile,type=loadfile,type local setmetatable,getmetatable,collectgarbage=setmetatable,getmetatable,collectgarbage +local floor=math.floor local dummyfunction=function() end local dummyreporter=function(c) @@ -5273,6 +4530,59 @@ if arg then end end end +if not number.idiv then + function number.idiv(i,d) + return floor(i/d) + end +end +local u=unicode and unicode.utf8 +if u then + utf.lower=u.lower + utf.upper=u.upper + utf.char=u.char + utf.byte=u.byte + utf.len=u.len + if lpeg.setutfcasers then + lpeg.setutfcasers(u.lower,u.upper) + end + local bytepairs=string.bytepairs + local utfchar=utf.char + local concat=table.concat + function utf.utf16_to_utf8_be(s) + if not s then + return nil + elseif s=="" then + return "" + end + local result,r,more={},0,0 + for left,right in bytepairs(s) do + if right then + local now=256*left+right + if more>0 then + now=(more-0xD800)*0x400+(now-0xDC00)+0x10000 + more=0 + r=r+1 + result[r]=utfchar(now) + elseif now>=0xD800 and now<=0xDBFF then + more=now + else + r=r+1 + result[r]=utfchar(now) + end + end + end + return concat(result) + end + local characters=string.utfcharacters + function utf.split(str) + local t,n={},0 + for s in characters(str) do + n=n+1 + t[n]=s + end + return t + end +end end -- closure @@ -9839,9 +9149,9 @@ function constructors.scale(tfmdata,specification) constructors.aftercopyingcharacters(target,tfmdata) constructors.trytosharefont(target,tfmdata) local vfonts=target.fonts -if isvirtual or target.type=="virtual" or properties.virtualized then + if isvirtual or target.type=="virtual" or properties.virtualized then properties.virtualized=true -target.type="virtual" + target.type="virtual" if not vfonts or #vfonts==0 then target.fonts={ { id=0 } } end @@ -9921,23 +9231,20 @@ function constructors.finalize(tfmdata) if not properties.virtualized then properties.virtualized=tfmdata.type=="virtual" end - if not tfmdata.properties then - tfmdata.properties={ - fontname=tfmdata.fontname, - filename=tfmdata.filename, - fullname=tfmdata.fullname, - name=tfmdata.name, - psname=tfmdata.psname, - encodingbytes=tfmdata.encodingbytes or 1, - embedding=tfmdata.embedding or "subset", - tounicode=tfmdata.tounicode or 1, - cidinfo=tfmdata.cidinfo or nil, - format=tfmdata.format or "type1", - direction=tfmdata.direction or 0, - writingmode=tfmdata.writingmode or "horizontal", - identity=tfmdata.identity or "horizontal", - } - end + properties.fontname=tfmdata.fontname + properties.filename=tfmdata.filename + properties.fullname=tfmdata.fullname + properties.name=tfmdata.name + properties.psname=tfmdata.psname + properties.encodingbytes=tfmdata.encodingbytes or 1 + properties.embedding=tfmdata.embedding or "subset" + properties.tounicode=tfmdata.tounicode or 1 + properties.cidinfo=tfmdata.cidinfo or nil + properties.format=tfmdata.format or "type1" + properties.direction=tfmdata.direction or 0 + properties.writingmode=tfmdata.writingmode or "horizontal" + properties.identity=tfmdata.identity or "horizontal" + properties.usedbitmap=tfmdata.usedbitmap if not tfmdata.resources then tfmdata.resources={} end @@ -11164,7 +10471,7 @@ if not modules then modules={} end modules ['font-vfc']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local select=select +local select,type=select,type local insert=table.insert local fonts=fonts local helpers=fonts.helpers @@ -11176,7 +10483,7 @@ local dummy={ "comment" } function helpers.prependcommands(commands,...) insert(commands,1,push) for i=select("#",...),1,-1 do - local s=select(i,...) + local s=(select(i,...)) if s then insert(commands,1,s) end @@ -11188,7 +10495,29 @@ function helpers.appendcommands(commands,...) insert(commands,1,push) insert(commands,pop) for i=1,select("#",...) do - local s=select(i,...) + local s=(select(i,...)) + if s then + insert(commands,s) + end + end + return commands +end +function helpers.prependcommandtable(commands,t) + insert(commands,1,push) + for i=#t,1,-1 do + local s=t[i] + if s then + insert(commands,1,s) + end + end + insert(commands,pop) + return commands +end +function helpers.appendcommandtable(commands,t) + insert(commands,1,push) + insert(commands,pop) + for i=1,#t do + local s=t[i] if s then insert(commands,s) end @@ -11244,6 +10573,7 @@ if not modules then modules={} end modules ['font-otr']={ } local next,type,tonumber=next,type,tonumber local byte,lower,char,gsub=string.byte,string.lower,string.char,string.gsub +local fullstrip=string.fullstrip local floor,round=math.floor,math.round local P,R,S,C,Cs,Cc,Ct,Carg,Cmt=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cc,lpeg.Ct,lpeg.Carg,lpeg.Cmt local lpegmatch=lpeg.match @@ -11520,19 +10850,29 @@ local helpers={} readers.helpers=helpers local function gotodatatable(f,fontdata,tag,criterium) if criterium and f then - local datatable=fontdata.tables[tag] - if datatable then - local tableoffset=datatable.offset - setposition(f,tableoffset) - return tableoffset + local tables=fontdata.tables + if tables then + local datatable=tables[tag] + if datatable then + local tableoffset=datatable.offset + setposition(f,tableoffset) + return tableoffset + end + else + report("no tables") end end end local function reportskippedtable(f,fontdata,tag,criterium) if criterium and f then - local datatable=fontdata.tables[tag] - if datatable then - report("loading of table %a skipped",tag) + local tables=fontdata.tables + if tables then + local datatable=tables[tag] + if datatable then + report("loading of table %a skipped",tag) + end + else + report("no tables") end end end @@ -11556,6 +10896,15 @@ local platformnames={ typographicsubfamily=true, compatiblefullname=true, } +local platformextras={ + uniqueid=true, + version=true, + copyright=true, + license=true, + licenseurl=true, + manufacturer=true, + vendorurl=true, +} function readers.name(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"name",true) if tableoffset then @@ -11608,6 +10957,17 @@ function readers.name(f,fontdata,specification) local names={} local done={} local extras={} + local function decoded(platform,encoding,content) + local decoder=decoders[platform] + if decoder then + decoder=decoder[encoding] + end + if decoder then + return decoder(content) + else + return content + end + end local function filter(platform,e,l) local namelist=namelists[platform] for i=1,#namelist do @@ -11619,14 +10979,7 @@ function readers.name(f,fontdata,specification) local language=name.language if (not e or encoding==e) and (not l or language==l) then setposition(f,name.offset) - local content=readstring(f,name.length) - local decoder=decoders[platform] - if decoder then - decoder=decoder[encoding] - end - if decoder then - content=decoder(content) - end + local content=decoded(platform,encoding,readstring(f,name.length)) if nametag then names[nametag]={ content=content, @@ -11650,22 +11003,15 @@ function readers.name(f,fontdata,specification) fontdata.extras=extras if specification.platformnames then local collected={} + local platformextras=specification.platformextras and platformextras for platform,namelist in next,namelists do local filtered=false for i=1,#namelist do local entry=namelist[i] local name=entry.name - if platformnames[name] then + if platformnames[name] or (platformextras and platformextras[name]) then setposition(f,entry.offset) - local content=readstring(f,entry.length) - local encoding=entry.encoding - local decoder=decoders[platform] - if decoder then - decoder=decoder[encoding] - end - if decoder then - content=decoder(content) - end + local content=decoded(platform,entry.encoding,readstring(f,entry.length)) if filtered then filtered[name]=content else @@ -11730,7 +11076,7 @@ readers["os/2"]=function(f,fontdata) if version>=1 then windowsmetrics.codepageranges={ readulong(f),readulong(f) } end - if version>=3 then + if version>=2 then windowsmetrics.xheight=readshort(f) windowsmetrics.capheight=readshort(f) windowsmetrics.defaultchar=readushort(f) @@ -11748,10 +11094,13 @@ end readers.head=function(f,fontdata) local tableoffset=gotodatatable(f,fontdata,"head",true) if tableoffset then + local version=readulong(f) + local fontversion=readulong(f) local fontheader={ - version=readfixed(f), - revision=readfixed(f), - checksum=readulong(f), + version=version, + fontversion=number.to16dot16(fontversion), + fontversionnumber=fontversion, + checksum=readushort(f)*0x10000+readushort(f), magic=readulong(f), flags=readushort(f), units=readushort(f), @@ -11777,7 +11126,7 @@ readers.hhea=function(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"hhea",specification.details) if tableoffset then fontdata.horizontalheader={ - version=readfixed(f), + version=readulong(f), ascender=readfword(f), descender=readfword(f), linegap=readfword(f), @@ -11805,7 +11154,7 @@ readers.vhea=function(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"vhea",specification.details) if tableoffset then fontdata.verticalheader={ - version=readfixed(f), + version=readulong(f), ascender=readfword(f), descender=readfword(f), linegap=readfword(f), @@ -11832,15 +11181,15 @@ end readers.maxp=function(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"maxp",specification.details) if tableoffset then - local version=readfixed(f) + local version=readulong(f) local nofglyphs=readushort(f) fontdata.nofglyphs=nofglyphs - if version==0.5 then + if version==0x00005000 then fontdata.maximumprofile={ version=version, nofglyphs=nofglyphs, } - elseif version==1.0 then + elseif version==0x00010000 then fontdata.maximumprofile={ version=version, nofglyphs=nofglyphs, @@ -11877,7 +11226,7 @@ readers.hmtx=function(f,fontdata,specification) local leftsidebearing=0 for i=0,nofmetrics-1 do local glyph=glyphs[i] - width=readshort(f) + width=readshort(f) leftsidebearing=readshort(f) if width~=0 then glyph.width=width @@ -11923,7 +11272,7 @@ end readers.post=function(f,fontdata,specification) local tableoffset=gotodatatable(f,fontdata,"post",true) if tableoffset then - local version=readfixed(f) + local version=readulong(f) fontdata.postscript={ version=version, italicangle=round(1000*readfixed(f))/1000, @@ -11936,11 +11285,11 @@ readers.post=function(f,fontdata,specification) maxmemtype1=readulong(f), } if not specification.glyphs then - elseif version==1.0 then + elseif version==0x00010000 then for index=0,#standardromanencoding do glyphs[index].name=standardromanencoding[index] end - elseif version==2.0 then + elseif version==0x00020000 then local glyphs=fontdata.glyphs local nofglyphs=readushort(f) local indices={} @@ -11971,8 +11320,6 @@ readers.post=function(f,fontdata,specification) end end end - elseif version==2.5 then - elseif version==3.0 then end else fontdata.postscript={} @@ -12529,14 +11876,16 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst designsize=fontdata.designsize, minsize=fontdata.minsize, maxsize=fontdata.maxsize, + boundingbox=fontheader and { fontheader.xmin or 0,fontheader.ymin or 0,fontheader.xmax or 0,fontheader.ymax or 0 } or nil, monospaced=(tonumber(postscript.monospaced or 0)>0) or metrics.panosewidth=="monospaced", averagewidth=metrics.averagewidth, xheight=metrics.xheight, - capheight=metrics.capheight, + capheight=metrics.capheight or fontdata.maxy, ascender=metrics.typoascender, descender=metrics.typodescender, platformnames=platformnames or nil, instancenames=instancenames or nil, + tableoffsets=fontdata.tableoffsets, } if metricstoo then local keys={ @@ -12594,7 +11943,7 @@ local function loadtables(f,specification,offset) } for i=1,fontdata.noftables do local tag=lower(stripstring(readstring(f,4))) - local checksum=readulong(f) + local checksum=readushort(f)*0x10000+readushort(f) local offset=readulong(f) local length=readulong(f) if offset+length>filesize then @@ -12612,7 +11961,7 @@ local function loadtables(f,specification,offset) else fontdata.format="truetype" end - return fontdata + return fontdata,tables end local function prepareglyps(fontdata) local glyphs=setmetatableindex(function(t,k) @@ -12633,7 +11982,7 @@ local function readtable(tag,f,fontdata,specification,...) end local variablefonts_supported=(context and true) or (logs and logs.application and true) or false local function readdata(f,offset,specification) - local fontdata=loadtables(f,specification,offset) + local fontdata,tables=loadtables(f,specification,offset) if specification.glyphs then prepareglyps(fontdata) end @@ -12743,9 +12092,18 @@ local function readdata(f,offset,specification) readtable("gpos",f,fontdata,specification) readtable("math",f,fontdata,specification) fontdata.locations=nil - fontdata.tables=nil fontdata.cidmaps=nil fontdata.dictionaries=nil + if specification.tableoffsets then + fontdata.tableoffsets=tables + setmetatableindex(tables,{ + version=fontdata.version, + noftables=fontdata.noftables, + searchrange=fontdata.searchrange, + entryselector=fontdata.entryselector, + rangeshift=fontdata.rangeshift, + }) + end return fontdata end local function loadfontdata(specification) @@ -12849,7 +12207,7 @@ local function loadfont(specification,n,instance) specification.instance=specification.instance or instance end local function message(str) - report("fatal error in file %a: %s\n%s",specification.filename,str,debug.traceback()) + report("fatal error in file %a: %s\n%s",specification.filename,str,debug and debug.traceback()) end local ok,result=xpcall(loadfontdata,message,specification) if ok then @@ -12871,12 +12229,25 @@ function readers.loadshapes(filename,n,instance,streams) v.index=nil v.math=nil end + local names=fontdata.names + if names then + for k,v in next,names do + names[k]=fullstrip(v.content) + end + end end return fontdata and { filename=filename, format=fontdata.format, glyphs=fontdata.glyphs, units=fontdata.fontheader.units, + cffinfo=fontdata.cffinfo, + fontheader=fontdata.fontheader, + horizontalheader=fontdata.horizontalheader, + verticalheader=fontdata.verticalheader, + maximumprofile=fontdata.maximumprofile, + names=fontdata.names, + postscript=fontdata.postscript, } or { filename=filename, format="unknown", @@ -12928,7 +12299,7 @@ function readers.loadfont(filename,n,instance) mathconstants=fontdata.mathconstants, colorpalettes=fontdata.colorpalettes, svgshapes=fontdata.svgshapes, - sbixshapes=fontdata.sbixshapes, + pngshapes=fontdata.pngshapes, variabledata=fontdata.variabledata, foundtables=fontdata.foundtables, }, @@ -12940,10 +12311,12 @@ function readers.getinfo(filename,specification) local platformnames=false local rawfamilynames=false local instancenames=true + local tableoffsets=false if type(specification)=="table" then subfont=tonumber(specification.subfont) platformnames=specification.platformnames rawfamilynames=specification.rawfamilynames + tableoffsets=specification.tableoffsets else subfont=tonumber(specification) end @@ -12952,6 +12325,7 @@ function readers.getinfo(filename,specification) details=true, platformnames=platformnames, instancenames=true, + tableoffsets=tableoffsets, } if fontdata then local subfonts=fontdata.subfonts @@ -14219,7 +13593,7 @@ if not modules then modules={} end modules ['font-cff']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local next,type,tonumber=next,type,tonumber +local next,type,tonumber,rawget=next,type,tonumber,rawget local byte,char,gmatch=string.byte,string.char,string.gmatch local concat,remove,unpack=table.concat,table.remove,table.unpack local floor,abs,round,ceil,min,max=math.floor,math.abs,math.round,math.ceil,math.min,math.max @@ -14227,6 +13601,8 @@ local P,C,R,S,C,Cs,Ct=lpeg.P,lpeg.C,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Ct local lpegmatch=lpeg.match local formatters=string.formatters local bytetable=string.bytetable +local idiv=number.idiv +local rshift,band,extract=bit32.rshift,bit32.band,bit32.extract local readers=fonts.handlers.otf.readers local streamreader=readers.streamreader local readstring=streamreader.readstring @@ -14421,8 +13797,25 @@ do end+P("\05")/function() result.fontbbox={ unpack(stack,1,4) } top=0 - end -+P("\13")/function() + end+P("\06")/function() + result.bluevalues={ unpack(stack,1,top) } + top=0 + end+P("\07")/function() + result.otherblues={ unpack(stack,1,top) } + top=0 + end+P("\08")/function() + result.familyblues={ unpack(stack,1,top) } + top=0 + end+P("\09")/function() + result.familyotherblues={ unpack(stack,1,top) } + top=0 + end+P("\10")/function() + result.strhw=stack[top] + top=0 + end+P("\11")/function() + result.strvw=stack[top] + top=0 + end+P("\13")/function() result.uniqueid=stack[top] top=0 end+P("\14")/function() @@ -14488,6 +13881,21 @@ do end+P("\08")/function() result.strokewidth=stack[top] top=0 + end+P("\09")/function() + result.bluescale=stack[top] + top=0 + end+P("\10")/function() + result.bluesnap=stack[top] + top=0 + end+P("\11")/function() + result.bluefuzz=stack[top] + top=0 + end+P("\12")/function() + result.stemsnaph={ unpack(stack,1,top) } + top=0 + end+P("\13")/function() + result.stemsnapv={ unpack(stack,1,top) } + top=0 end+P("\20")/function() result.syntheticbase=stack[top] top=0 @@ -14531,24 +13939,24 @@ do top=0 end ) - local p_last=P("\x0F")/"0"+P("\x1F")/"1"+P("\x2F")/"2"+P("\x3F")/"3"+P("\x4F")/"4"+P("\x5F")/"5"+P("\x6F")/"6"+P("\x7F")/"7"+P("\x8F")/"8"+P("\x9F")/"9"+P("\xAF")/""+P("\xBF")/""+P("\xCF")/""+P("\xDF")/""+P("\xEF")/""+R("\xF0\xFF")/"" local remap={ ["\x00"]="00",["\x01"]="01",["\x02"]="02",["\x03"]="03",["\x04"]="04",["\x05"]="05",["\x06"]="06",["\x07"]="07",["\x08"]="08",["\x09"]="09",["\x0A"]="0.",["\x0B"]="0E",["\x0C"]="0E-",["\x0D"]="0",["\x0E"]="0-",["\x0F"]="0", - ["\x10"]="10",["\x11"]="11",["\x12"]="12",["\x13"]="13",["\x14"]="14",["\x15"]="15",["\x16"]="16",["\x17"]="17",["\x18"]="18",["\x19"]="19",["\x1A"]="0.",["\x1B"]="0E",["\x1C"]="0E-",["\x1D"]="0",["\x1E"]="0-",["\x1F"]="0", - ["\x20"]="20",["\x21"]="21",["\x22"]="22",["\x23"]="23",["\x24"]="24",["\x25"]="25",["\x26"]="26",["\x27"]="27",["\x28"]="28",["\x29"]="29",["\x2A"]="0.",["\x2B"]="0E",["\x2C"]="0E-",["\x2D"]="0",["\x2E"]="0-",["\x2F"]="0", - ["\x30"]="30",["\x31"]="31",["\x32"]="32",["\x33"]="33",["\x34"]="34",["\x35"]="35",["\x36"]="36",["\x37"]="37",["\x38"]="38",["\x39"]="39",["\x3A"]="0.",["\x3B"]="0E",["\x3C"]="0E-",["\x3D"]="0",["\x3E"]="0-",["\x3F"]="0", - ["\x40"]="40",["\x41"]="41",["\x42"]="42",["\x43"]="43",["\x44"]="44",["\x45"]="45",["\x46"]="46",["\x47"]="47",["\x48"]="48",["\x49"]="49",["\x4A"]="0.",["\x4B"]="0E",["\x4C"]="0E-",["\x4D"]="0",["\x4E"]="0-",["\x4F"]="0", - ["\x50"]="50",["\x51"]="51",["\x52"]="52",["\x53"]="53",["\x54"]="54",["\x55"]="55",["\x56"]="56",["\x57"]="57",["\x58"]="58",["\x59"]="59",["\x5A"]="0.",["\x5B"]="0E",["\x5C"]="0E-",["\x5D"]="0",["\x5E"]="0-",["\x5F"]="0", - ["\x60"]="60",["\x61"]="61",["\x62"]="62",["\x63"]="63",["\x64"]="64",["\x65"]="65",["\x66"]="66",["\x67"]="67",["\x68"]="68",["\x69"]="69",["\x6A"]="0.",["\x6B"]="0E",["\x6C"]="0E-",["\x6D"]="0",["\x6E"]="0-",["\x6F"]="0", - ["\x70"]="70",["\x71"]="71",["\x72"]="72",["\x73"]="73",["\x74"]="74",["\x75"]="75",["\x76"]="76",["\x77"]="77",["\x78"]="78",["\x79"]="79",["\x7A"]="0.",["\x7B"]="0E",["\x7C"]="0E-",["\x7D"]="0",["\x7E"]="0-",["\x7F"]="0", - ["\x80"]="80",["\x81"]="81",["\x82"]="82",["\x83"]="83",["\x84"]="84",["\x85"]="85",["\x86"]="86",["\x87"]="87",["\x88"]="88",["\x89"]="89",["\x8A"]="0.",["\x8B"]="0E",["\x8C"]="0E-",["\x8D"]="0",["\x8E"]="0-",["\x8F"]="0", - ["\x90"]="90",["\x91"]="91",["\x92"]="92",["\x93"]="93",["\x94"]="94",["\x95"]="95",["\x96"]="96",["\x97"]="97",["\x98"]="98",["\x99"]="99",["\x9A"]="0.",["\x9B"]="0E",["\x9C"]="0E-",["\x9D"]="0",["\x9E"]="0-",["\x9F"]="0", + ["\x10"]="10",["\x11"]="11",["\x12"]="12",["\x13"]="13",["\x14"]="14",["\x15"]="15",["\x16"]="16",["\x17"]="17",["\x18"]="18",["\x19"]="19",["\x1A"]="1.",["\x1B"]="1E",["\x1C"]="1E-",["\x1D"]="1",["\x1E"]="1-",["\x1F"]="1", + ["\x20"]="20",["\x21"]="21",["\x22"]="22",["\x23"]="23",["\x24"]="24",["\x25"]="25",["\x26"]="26",["\x27"]="27",["\x28"]="28",["\x29"]="29",["\x2A"]="2.",["\x2B"]="2E",["\x2C"]="2E-",["\x2D"]="2",["\x2E"]="2-",["\x2F"]="2", + ["\x30"]="30",["\x31"]="31",["\x32"]="32",["\x33"]="33",["\x34"]="34",["\x35"]="35",["\x36"]="36",["\x37"]="37",["\x38"]="38",["\x39"]="39",["\x3A"]="3.",["\x3B"]="3E",["\x3C"]="3E-",["\x3D"]="3",["\x3E"]="3-",["\x3F"]="3", + ["\x40"]="40",["\x41"]="41",["\x42"]="42",["\x43"]="43",["\x44"]="44",["\x45"]="45",["\x46"]="46",["\x47"]="47",["\x48"]="48",["\x49"]="49",["\x4A"]="4.",["\x4B"]="4E",["\x4C"]="4E-",["\x4D"]="4",["\x4E"]="4-",["\x4F"]="4", + ["\x50"]="50",["\x51"]="51",["\x52"]="52",["\x53"]="53",["\x54"]="54",["\x55"]="55",["\x56"]="56",["\x57"]="57",["\x58"]="58",["\x59"]="59",["\x5A"]="5.",["\x5B"]="5E",["\x5C"]="5E-",["\x5D"]="5",["\x5E"]="5-",["\x5F"]="5", + ["\x60"]="60",["\x61"]="61",["\x62"]="62",["\x63"]="63",["\x64"]="64",["\x65"]="65",["\x66"]="66",["\x67"]="67",["\x68"]="68",["\x69"]="69",["\x6A"]="6.",["\x6B"]="6E",["\x6C"]="6E-",["\x6D"]="6",["\x6E"]="6-",["\x6F"]="6", + ["\x70"]="70",["\x71"]="71",["\x72"]="72",["\x73"]="73",["\x74"]="74",["\x75"]="75",["\x76"]="76",["\x77"]="77",["\x78"]="78",["\x79"]="79",["\x7A"]="7.",["\x7B"]="7E",["\x7C"]="7E-",["\x7D"]="7",["\x7E"]="7-",["\x7F"]="7", + ["\x80"]="80",["\x81"]="81",["\x82"]="82",["\x83"]="83",["\x84"]="84",["\x85"]="85",["\x86"]="86",["\x87"]="87",["\x88"]="88",["\x89"]="89",["\x8A"]="8.",["\x8B"]="8E",["\x8C"]="8E-",["\x8D"]="8",["\x8E"]="8-",["\x8F"]="8", + ["\x90"]="90",["\x91"]="91",["\x92"]="92",["\x93"]="93",["\x94"]="94",["\x95"]="95",["\x96"]="96",["\x97"]="97",["\x98"]="98",["\x99"]="99",["\x9A"]="9.",["\x9B"]="9E",["\x9C"]="9E-",["\x9D"]="9",["\x9E"]="9-",["\x9F"]="9", ["\xA0"]=".0",["\xA1"]=".1",["\xA2"]=".2",["\xA3"]=".3",["\xA4"]=".4",["\xA5"]=".5",["\xA6"]=".6",["\xA7"]=".7",["\xA8"]=".8",["\xA9"]=".9",["\xAA"]="..",["\xAB"]=".E",["\xAC"]=".E-",["\xAD"]=".",["\xAE"]=".-",["\xAF"]=".", ["\xB0"]="E0",["\xB1"]="E1",["\xB2"]="E2",["\xB3"]="E3",["\xB4"]="E4",["\xB5"]="E5",["\xB6"]="E6",["\xB7"]="E7",["\xB8"]="E8",["\xB9"]="E9",["\xBA"]="E.",["\xBB"]="EE",["\xBC"]="EE-",["\xBD"]="E",["\xBE"]="E-",["\xBF"]="E", ["\xC0"]="E-0",["\xC1"]="E-1",["\xC2"]="E-2",["\xC3"]="E-3",["\xC4"]="E-4",["\xC5"]="E-5",["\xC6"]="E-6",["\xC7"]="E-7",["\xC8"]="E-8",["\xC9"]="E-9",["\xCA"]="E-.",["\xCB"]="E-E",["\xCC"]="E-E-",["\xCD"]="E-",["\xCE"]="E--",["\xCF"]="E-", ["\xD0"]="-0",["\xD1"]="-1",["\xD2"]="-2",["\xD3"]="-3",["\xD4"]="-4",["\xD5"]="-5",["\xD6"]="-6",["\xD7"]="-7",["\xD8"]="-8",["\xD9"]="-9",["\xDA"]="-.",["\xDB"]="-E",["\xDC"]="-E-",["\xDD"]="-",["\xDE"]="--",["\xDF"]="-", } - local p_nibbles=P("\30")*Cs(((1-p_last)/remap)^0+p_last)/function(n) + local p_last=S("\x0F\x1F\x2F\x3F\x4F\x5F\x6F\x7F\x8F\x9F\xAF\xBF")+R("\xF0\xFF") + local p_nibbles=P("\30")*Cs(((1-p_last)/remap)^0*(P(1)/remap))/function(n) top=top+1 stack[top]=tonumber(n) or 0 end @@ -15169,7 +14577,7 @@ do if trace_charstrings then showstate("stem") end - stems=stems+top/2 + stems=stems+idiv(top,2) top=0 end local function getmask() @@ -15188,13 +14596,13 @@ do if trace_charstrings then showstate(operator==19 and "hintmark" or "cntrmask") end - stems=stems+top/2 + stems=stems+idiv(top,2) top=0 if stems==0 then elseif stems<=8 then return 1 else - return floor((stems+7)/8) + return idiv(stems+7,8) end end local function unsupported(t) @@ -15233,7 +14641,7 @@ do local function hsbw() if version==1 then if trace_charstrings then - showstate("dotsection") + showstate("hsbw") end width=stack[top] end @@ -15419,76 +14827,98 @@ do [036]=hflex1, [037]=flex1, } - local c_endchar=char(14) - local passon do - local rshift=bit32.rshift - local band=bit32.band - local round=math.round - local encode=table.setmetatableindex(function(t,i) - for i=-2048,-1130 do - t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF)) - end - for i=-1131,-108 do - local v=0xFB00-i-108 - t[i]=char(band(rshift(v,8),0xFF),band(v,0xFF)) - end - for i=-107,107 do - t[i]=char(i+139) - end - for i=108,1131 do - local v=0xF700+i-108 - t[i]=char(band(rshift(v,8),0xFF),band(v,0xFF)) - end - for i=1132,2048 do - t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF)) - end - return t[i] - end) - local function setvsindex() - local vsindex=stack[top] - updateregions(vsindex) - top=top-1 + local chars=setmetatableindex(function (t,k) + local v=char(k) + t[k]=v + return v + end) + local c_endchar=chars[14] + local encode={} + setmetatableindex(encode,function(t,i) + for i=-2048,-1130 do + t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF)) end - local function blend() - local n=stack[top] - top=top-1 - if not axis then - elseif n==1 then - top=top-nofregions - local v=stack[top] + for i=-1131,-108 do + local v=0xFB00-i-108 + t[i]=char(band(rshift(v,8),0xFF),band(v,0xFF)) + end + for i=-107,107 do + t[i]=chars[i+139] + end + for i=108,1131 do + local v=0xF700+i-108 + t[i]=char(extract(v,8,8),extract(v,0,8)) + end + for i=1132,2048 do + t[i]=char(28,band(rshift(i,8),0xFF),band(i,0xFF)) + end + setmetatableindex(encode,function(t,k) + local r=round(k) + local v=rawget(t,r) + if v then + return v + end + local v1=floor(k) + local v2=floor((k-v1)*0x10000) + return char(255,extract(v1,8,8),extract(v1,0,8),extract(v2,8,8),extract(v2,0,8)) + end) + return t[i] + end) + readers.cffencoder=encode + local function p_setvsindex() + local vsindex=stack[top] + updateregions(vsindex) + top=top-1 + end + local function p_blend() + local n=stack[top] + top=top-1 + if not axis then + elseif n==1 then + top=top-nofregions + local v=stack[top] + for r=1,nofregions do + v=v+stack[top+r]*factors[r] + end + stack[top]=round(v) + else + top=top-nofregions*n + local d=top + local k=top-n + for i=1,n do + k=k+1 + local v=stack[k] for r=1,nofregions do - v=v+stack[top+r]*factors[r] - end - stack[top]=round(v) - else - top=top-nofregions*n - local d=top - local k=top-n - for i=1,n do - k=k+1 - local v=stack[k] - for r=1,nofregions do - v=v+stack[d+r]*factors[r] - end - stack[k]=round(v) - d=d+nofregions + v=v+stack[d+r]*factors[r] end + stack[k]=round(v) + d=d+nofregions end end - passon=function(operation) - if operation==15 then - setvsindex() - elseif operation==16 then - blend() - else - for i=1,top do - r=r+1 - result[r]=encode[stack[i]] - end - r=r+1 - result[r]=char(operation) - top=0 - end + end + local function p_getstem() + local n=0 + if top%2~=0 then + n=1 + end + if top>n then + stems=stems+idiv(top-n,2) + end + end + local function p_getmask() + local n=0 + if top%2~=0 then + n=1 + end + if top>n then + stems=stems+idiv(top-n,2) + end + if stems==0 then + return 0 + elseif stems<=8 then + return 1 + else + return idiv(stems+7,8) end end local process @@ -15576,19 +15006,90 @@ do elseif t==12 then i=i+1 local t=tab[i] - local a=subactions[t] - if a then - a(t) + if justpass then + if t>=34 or t<=37 then + for i=1,top do + r=r+1;result[r]=encode[stack[i]] + end + r=r+1;result[r]=chars[12] + r=r+1;result[r]=chars[t] + top=0 + else + local a=subactions[t] + if a then + a(t) + else + top=0 + end + end else - if trace_charstrings then - showvalue("<subaction>",t) + local a=subactions[t] + if a then + a(t) + else + if trace_charstrings then + showvalue("<subaction>",t) + end + top=0 end - top=0 end i=i+1 elseif justpass then - passon(t) - i=i+1 + if t==15 then + p_setvsindex() + i=i+1 + elseif t==16 then + local s=p_blend() or 0 + i=i+s+1 + elseif t==1 or t==3 or t==18 or operation==23 then + p_getstem() +if true then + if top>0 then + for i=1,top do + r=r+1;result[r]=encode[stack[i]] + end + top=0 + end + r=r+1;result[r]=chars[t] +else + top=0 +end + i=i+1 + elseif t==19 or t==20 then + local s=p_getmask() or 0 +if true then + if top>0 then + for i=1,top do + r=r+1;result[r]=encode[stack[i]] + end + top=0 + end + r=r+1;result[r]=chars[t] + for j=1,s do + i=i+1 + r=r+1;result[r]=chars[tab[i]] + end +else + i=i+s + top=0 +end + i=i+1 + elseif t==9 then + top=0 + i=i+1 + elseif t==13 then + local s=hsbw() or 0 + i=i+s+1 + else + if top>0 then + for i=1,top do + r=r+1;result[r]=encode[stack[i]] + end + top=0 + end + r=r+1;result[r]=chars[t] + i=i+1 + end else local a=actions[t] if a then @@ -15609,18 +15110,20 @@ do end end local function setbias(globals,locals) - if version==1 then - return - false, - false - else local g,l=#globals,#locals return ((g<1240 and 107) or (g<33900 and 1131) or 32768)+1, ((l<1240 and 107) or (l<33900 and 1131) or 32768)+1 - end end local function processshape(tab,index) + if not tab then + glyphs[index]={ + boundingbox={ 0,0,0,0 }, + width=0, + name=charset and charset[index] or nil, + } + return + end tab=bytetable(tab) x=0 y=0 @@ -15733,15 +15236,18 @@ do glyphs=glphs or {} globalbias,localbias=setbias(globals,locals) nominalwidth,defaultwidth=setwidths(dictionary.private) - startparsing(fontdata,data,streams) - for index=1,#charstrings do - processshape(charstrings[index],index-1) - charstrings[index]=nil + if charstrings then + startparsing(fontdata,data,streams) + for index=1,#charstrings do + processshape(charstrings[index],index-1) + end + stopparsing(fontdata,data) + else + report("no charstrings") end - stopparsing(fontdata,data) return glyphs end - parsecharstring=function(fontdata,data,dictionary,tab,glphs,index,doshapes,tversion) + parsecharstring=function(fontdata,data,dictionary,tab,glphs,index,doshapes,tversion,streams) keepcurve=doshapes version=tversion strings=data.strings @@ -15750,6 +15256,7 @@ do charset=false vsindex=dictionary.vsindex or 0 glyphs=glphs or {} + justpass=streams==true globalbias,localbias=setbias(globals,locals) nominalwidth,defaultwidth=setwidths(dictionary.private) processshape(tab,index-1) @@ -15903,7 +15410,7 @@ local function readfdselect(f,fontdata,data,glyphs,doshapes,version,streams) local format=readbyte(f) if format==1 then for i=0,nofglyphs do - local index=readbyte(i) + local index=readbyte(f) fdindex[i]=index if index>maxindex then maxindex=index @@ -15932,30 +15439,33 @@ local function readfdselect(f,fontdata,data,glyphs,doshapes,version,streams) end if maxindex>=0 then local cidarray=cid.fdarray - setposition(f,header.offset+cidarray) - local dictionaries=readlengths(f) - for i=1,#dictionaries do - dictionaries[i]=readstring(f,dictionaries[i]) - end - parsedictionaries(data,dictionaries) - cid.dictionaries=dictionaries - readcidprivates(f,data) - for i=1,#dictionaries do - readlocals(f,data,dictionaries[i]) - end - startparsing(fontdata,data,streams) - for i=1,#charstrings do - parsecharstring(fontdata,data,dictionaries[fdindex[i]+1],charstrings[i],glyphs,i,doshapes,version) - charstrings[i]=nil + if cidarray then + setposition(f,header.offset+cidarray) + local dictionaries=readlengths(f) + for i=1,#dictionaries do + dictionaries[i]=readstring(f,dictionaries[i]) + end + parsedictionaries(data,dictionaries) + cid.dictionaries=dictionaries + readcidprivates(f,data) + for i=1,#dictionaries do + readlocals(f,data,dictionaries[i]) + end + startparsing(fontdata,data,streams) + for i=1,#charstrings do + parsecharstring(fontdata,data,dictionaries[fdindex[i]+1],charstrings[i],glyphs,i,doshapes,version,streams) + end + stopparsing(fontdata,data) + else + report("no cid array") end - stopparsing(fontdata,data) end end local gotodatatable=readers.helpers.gotodatatable local function cleanup(data,dictionaries) end function readers.cff(f,fontdata,specification) - local tableoffset=gotodatatable(f,fontdata,"cff",specification.details) + local tableoffset=gotodatatable(f,fontdata,"cff",specification.details or specification.glyphs) if tableoffset then local header=readheader(f) if header.major~=1 then @@ -15976,14 +15486,16 @@ function readers.cff(f,fontdata,specification) parsedictionaries(data,dictionaries,"cff") local dic=dictionaries[1] local cid=dic.cid - fontdata.cffinfo={ - familynamename=dic.familyname, + local cffinfo={ + familyname=dic.familyname, fullname=dic.fullname, boundingbox=dic.boundingbox, weight=dic.weight, italicangle=dic.italicangle, underlineposition=dic.underlineposition, underlinethickness=dic.underlinethickness, + defaultwidth=dic.defaultwidthx, + nominalwidth=dic.nominalwidthx, monospaced=dic.monospaced, } fontdata.cidinfo=cid and { @@ -15991,12 +15503,30 @@ function readers.cff(f,fontdata,specification) ordering=cid.ordering, supplement=cid.supplement, } - if specification.glyphs then - local all=specification.shapes or false + fontdata.cffinfo=cffinfo + local all=specification.shapes or specification.streams or false + if specification.glyphs or all then if cid and cid.fdselect then - readfdselect(f,fontdata,data,glyphs,all,"cff") + readfdselect(f,fontdata,data,glyphs,all,"cff",specification.streams) else - readnoselect(f,fontdata,data,glyphs,all,"cff") + readnoselect(f,fontdata,data,glyphs,all,"cff",specification.streams) + end + end + local private=dic.private + if private then + local data=private.data + if type(data)=="table" then + cffinfo.defaultwidth=data.defaultwidth or cffinfo.defaultwidth + cffinfo.nominalwidth=data.nominalwidth or cffinfo.nominalwidth + cffinfo.bluevalues=data.bluevalues + cffinfo.otherblues=data.otherblues + cffinfo.familyblues=data.familyblues + cffinfo.familyotherblues=data.familyotherblues + cffinfo.bluescale=data.bluescale + cffinfo.blueshift=data.blueshift + cffinfo.bluefuzz=data.bluefuzz + cffinfo.stdhw=data.stdhw + cffinfo.stdvw=data.stdvw end end cleanup(data,dictionaries) @@ -16030,7 +15560,7 @@ function readers.cff2(f,fontdata,specification) end data.factors=specification.factors local cid=data.dictionaries[1].cid - local all=specification.shapes or false + local all=specification.shapes or specification.streams or false if cid and cid.fdselect then readfdselect(f,fontdata,data,glyphs,all,"cff2",specification.streams) else @@ -16060,7 +15590,7 @@ function readers.cffcheck(filename) dictionaries=dictionaries, strings=strings, glyphs=glyphs, - nofglyphs=4, + nofglyphs=0, } parsedictionaries(data,dictionaries,"cff") local cid=data.dictionaries[1].cid @@ -16087,8 +15617,10 @@ if not modules then modules={} end modules ['font-ttf']={ local next,type,unpack=next,type,unpack local band,rshift=bit32.band,bit32.rshift local sqrt,round=math.sqrt,math.round -local char=string.char +local char,rep=string.char,string.rep local concat=table.concat +local idiv=number.idiv +local setmetatableindex=table.setmetatableindex local report=logs.reporter("otf reader","ttf") local trace_deltas=false local readers=fonts.handlers.otf.readers @@ -16153,22 +15685,41 @@ local function mergecomposites(glyphs,shapes) local yscale=matrix[4] local xoffset=matrix[5] local yoffset=matrix[6] - for i=1,#subpoints do - local p=subpoints[i] - local x=p[1] - local y=p[2] - nofpoints=nofpoints+1 - points[nofpoints]={ - xscale*x+xrotate*y+xoffset, - yscale*y+yrotate*x+yoffset, - p[3] - } + local count=#subpoints + if xscale==1 and yscale==1 and xrotate==0 and yrotate==0 then + for i=1,count do + local p=subpoints[i] + nofpoints=nofpoints+1 + points[nofpoints]={ + p[1]+xoffset, + p[2]+yoffset, + p[3] + } + end + else + for i=1,count do + local p=subpoints[i] + local x=p[1] + local y=p[2] + nofpoints=nofpoints+1 + points[nofpoints]={ + xscale*x+xrotate*y+xoffset, + yscale*y+yrotate*x+yoffset, + p[3] + } + end end - for i=1,#subcontours do + local subcount=#subcontours + if subcount==1 then nofcontours=nofcontours+1 - contours[nofcontours]=offset+subcontours[i] + contours[nofcontours]=offset+subcontours[1] + else + for i=1,#subcontours do + nofcontours=nofcontours+1 + contours[nofcontours]=offset+subcontours[i] + end end - offset=offset+#subpoints + offset=offset+count else report("missing contours composite %s, component %s of %s, glyph %s",index,i,#components,subindex) end @@ -16178,7 +15729,7 @@ local function mergecomposites(glyphs,shapes) shape.components=nil return contours,points end - for index=1,#glyphs do + for index=0,#glyphs-1 do local shape=shapes[index] if shape then local components=shape.components @@ -16188,7 +15739,7 @@ local function mergecomposites(glyphs,shapes) end end end -local function readnothing(f,nofcontours) +local function readnothing(f) return { type="nothing", } @@ -16282,8 +15833,8 @@ local function applyaxis(glyph,shape,deltas,dowidth) end end local quadratic=false -local function contours2outlines_normal(glyphs,shapes) - for index=1,#glyphs do +local function contours2outlines_normal(glyphs,shapes) + for index=0,#glyphs-1 do local shape=shapes[index] if shape then local glyph=glyphs[index] @@ -16398,7 +15949,7 @@ local function contours2outlines_normal(glyphs,shapes) end end local function contours2outlines_shaped(glyphs,shapes,keepcurve) - for index=1,#glyphs do + for index=0,#glyphs-1 do local shape=shapes[index] if shape then local glyph=glyphs[index] @@ -16577,115 +16128,128 @@ local function toshort(n) end return char(band(rshift(n,8),0xFF),band(n,0xFF)) end +local chars=setmetatableindex(function(t,k) + for i=0,255 do local v=char(i) t[i]=v end return t[k] +end) local function repackpoints(glyphs,shapes) local noboundingbox={ 0,0,0,0 } local result={} - for index=1,#glyphs do + local xpoints={} + local ypoints={} + for index=0,#glyphs-1 do local shape=shapes[index] if shape then local r=0 local glyph=glyphs[index] - if false then - else - local contours=shape.contours - local nofcontours=contours and #contours or 0 - local boundingbox=glyph.boundingbox or noboundingbox - r=r+1 result[r]=toshort(nofcontours) - r=r+1 result[r]=toshort(boundingbox[1]) - r=r+1 result[r]=toshort(boundingbox[2]) - r=r+1 result[r]=toshort(boundingbox[3]) - r=r+1 result[r]=toshort(boundingbox[4]) - if nofcontours>0 then - for i=1,nofcontours do - r=r+1 result[r]=toshort(contours[i]-1) - end - r=r+1 result[r]=s_zero - local points=shape.points - local currentx=0 - local currenty=0 - local xpoints={} - local ypoints={} - local x=0 - local y=0 - local lastflag=nil - local nofflags=0 - for i=1,#points do - local pt=points[i] - local px=pt[1] - local py=pt[2] - local fl=pt[3] and 0x01 or 0x00 - if px==currentx then - fl=fl+0x10 + local contours=shape.contours + local nofcontours=contours and #contours or 0 + local boundingbox=glyph.boundingbox or noboundingbox + r=r+1 result[r]=toshort(nofcontours) + r=r+1 result[r]=toshort(boundingbox[1]) + r=r+1 result[r]=toshort(boundingbox[2]) + r=r+1 result[r]=toshort(boundingbox[3]) + r=r+1 result[r]=toshort(boundingbox[4]) + if nofcontours>0 then + for i=1,nofcontours do + r=r+1 result[r]=toshort(contours[i]-1) + end + r=r+1 result[r]=s_zero + local points=shape.points + local currentx=0 + local currenty=0 + local x=0 + local y=0 + local lastflag=nil + local nofflags=0 + for i=1,#points do + local pt=points[i] + local px=pt[1] + local py=pt[2] + local fl=pt[3] and 0x01 or 0x00 + if px==currentx then + fl=fl+0x10 + else + local dx=round(px-currentx) + x=x+1 + if dx<-255 or dx>255 then + xpoints[x]=toshort(dx) + elseif dx<0 then + fl=fl+0x02 + xpoints[x]=chars[-dx] + elseif dx>0 then + fl=fl+0x12 + xpoints[x]=chars[dx] else - local dx=round(px-currentx) - if dx<-255 or dx>255 then - x=x+1 xpoints[x]=toshort(dx) - elseif dx<0 then - fl=fl+0x02 - x=x+1 xpoints[x]=char(-dx) - elseif dx>0 then - fl=fl+0x12 - x=x+1 xpoints[x]=char(dx) - else - fl=fl+0x02 - x=x+1 xpoints[x]=c_zero - end + fl=fl+0x02 + xpoints[x]=c_zero end - if py==currenty then - fl=fl+0x20 + end + if py==currenty then + fl=fl+0x20 + else + local dy=round(py-currenty) + y=y+1 + if dy<-255 or dy>255 then + ypoints[y]=toshort(dy) + elseif dy<0 then + fl=fl+0x04 + ypoints[y]=chars[-dy] + elseif dy>0 then + fl=fl+0x24 + ypoints[y]=chars[dy] else - local dy=round(py-currenty) - if dy<-255 or dy>255 then - y=y+1 ypoints[y]=toshort(dy) - elseif dy<0 then - fl=fl+0x04 - y=y+1 ypoints[y]=char(-dy) - elseif dy>0 then - fl=fl+0x24 - y=y+1 ypoints[y]=char(dy) - else - fl=fl+0x04 - y=y+1 ypoints[y]=c_zero - end - end - currentx=px - currenty=py - if lastflag==fl then - nofflags=nofflags+1 - else - if nofflags==1 then - r=r+1 result[r]=char(lastflag) - elseif nofflags==2 then - r=r+1 result[r]=char(lastflag,lastflag) - elseif nofflags>2 then - lastflag=lastflag+0x08 - r=r+1 result[r]=char(lastflag,nofflags-1) - end - nofflags=1 - lastflag=fl + fl=fl+0x04 + ypoints[y]=c_zero end end - if nofflags==1 then - r=r+1 result[r]=char(lastflag) - elseif nofflags==2 then - r=r+1 result[r]=char(lastflag,lastflag) - elseif nofflags>2 then - lastflag=lastflag+0x08 - r=r+1 result[r]=char(lastflag,nofflags-1) - end - r=r+1 result[r]=concat(xpoints) - r=r+1 result[r]=concat(ypoints) + currentx=px + currenty=py + if lastflag==fl then + nofflags=nofflags+1 + else + if nofflags==1 then + r=r+1 result[r]=chars[lastflag] + elseif nofflags==2 then + r=r+1 result[r]=char(lastflag,lastflag) + elseif nofflags>2 then + lastflag=lastflag+0x08 + r=r+1 result[r]=char(lastflag,nofflags-1) + end + nofflags=1 + lastflag=fl + end + end + if nofflags==1 then + r=r+1 result[r]=chars[lastflag] + elseif nofflags==2 then + r=r+1 result[r]=char(lastflag,lastflag) + elseif nofflags>2 then + lastflag=lastflag+0x08 + r=r+1 result[r]=char(lastflag,nofflags-1) + end + r=r+1 result[r]=concat(xpoints,"",1,x) + r=r+1 result[r]=concat(ypoints,"",1,y) + end + local stream=concat(result,"",1,r) + local length=#stream + local padding=idiv(length+3,4)*4-length + if padding>0 then + if padding==1 then + padding="\0" + elseif padding==2 then + padding="\0\0" + else + padding="\0\0\0" end + padding=stream..padding end - glyph.stream=concat(result,"",1,r) - else + glyph.stream=stream end end end +local flags={} local function readglyph(f,nofcontours) local points={} - local instructions={} - local flags={} local contours={} for i=1,nofcontours do contours[i]=readshort(f)+1 @@ -16698,9 +16262,15 @@ local function readglyph(f,nofcontours) local flag=readbyte(f) flags[i]=flag if band(flag,0x08)~=0 then - for j=1,readbyte(f) do + local n=readbyte(f) + if n==1 then i=i+1 flags[i]=flag + else + for j=1,n do + i=i+1 + flags[i]=flag + end end end i=i+1 @@ -16708,15 +16278,13 @@ local function readglyph(f,nofcontours) local x=0 for i=1,nofpoints do local flag=flags[i] - local short=band(flag,0x02)~=0 - local same=band(flag,0x10)~=0 - if short then - if same then + if band(flag,0x02)~=0 then + if band(flag,0x10)~=0 then x=x+readbyte(f) else x=x-readbyte(f) end - elseif same then + elseif band(flag,0x10)~=0 then else x=x+readshort(f) end @@ -16725,15 +16293,13 @@ local function readglyph(f,nofcontours) local y=0 for i=1,nofpoints do local flag=flags[i] - local short=band(flag,0x04)~=0 - local same=band(flag,0x20)~=0 - if short then - if same then + if band(flag,0x04)~=0 then + if band(flag,0x20)~=0 then y=y+readbyte(f) else y=y-readbyte(f) end - elseif same then + elseif band(flag,0x20)~=0 then else y=y+readshort(f) end @@ -16816,7 +16382,7 @@ local function readcomposite(f) if band(flags,0x0100)~=0 then instructions=true end - if not band(flags,0x0020)~=0 then + if band(flags,0x0020)==0 then break end end @@ -16831,21 +16397,27 @@ function readers.loca(f,fontdata,specification) if datatable then local offset=fontdata.tables.glyf.offset local format=fontdata.fontheader.indextolocformat + local profile=fontdata.maximumprofile + local nofglyphs=profile and profile.nofglyphs local locations={} setposition(f,datatable.offset) if format==1 then - local nofglyphs=datatable.length/4-2 + if not nofglyphs then + nofglyphs=idiv(datatable.length,4)-1 + end for i=0,nofglyphs do locations[i]=offset+readulong(f) end fontdata.nofglyphs=nofglyphs else - local nofglyphs=datatable.length/2-2 + if not nofglyphs then + nofglyphs=idiv(datatable.length,2)-1 + end for i=0,nofglyphs do locations[i]=offset+readushort(f)*2 end - fontdata.nofglyphs=nofglyphs end + fontdata.nofglyphs=nofglyphs fontdata.locations=locations end end @@ -16860,15 +16432,16 @@ function readers.glyf(f,fontdata,specification) local filesize=fontdata.filesize local nothing={ 0,0,0,0 } local shapes={} - local loadshapes=specification.shapes or specification.instance - for index=0,nofglyphs do + local loadshapes=specification.shapes or specification.instance or specification.streams + for index=0,nofglyphs-1 do local location=locations[index] + local length=locations[index+1]-location if location>=filesize then report("discarding %s glyphs due to glyph location bug",nofglyphs-index+1) fontdata.nofglyphs=index-1 fontdata.badfont=true break - elseif location>0 then + elseif length>0 then setposition(f,location) local nofcontours=readshort(f) glyphs[index].boundingbox={ @@ -16879,7 +16452,7 @@ function readers.glyf(f,fontdata,specification) } if not loadshapes then elseif nofcontours==0 then - shapes[index]=readnothing(f,nofcontours) + shapes[index]=readnothing(f) elseif nofcontours>0 then shapes[index]=readglyph(f,nofcontours) else @@ -16887,7 +16460,7 @@ function readers.glyf(f,fontdata,specification) end else if loadshapes then - shapes[index]={} + shapes[index]=readnothing(f) end glyphs[index].boundingbox=nothing end @@ -16904,7 +16477,13 @@ function readers.glyf(f,fontdata,specification) contours2outlines_shaped(glyphs,shapes,specification.shapes) end elseif specification.shapes then - contours2outlines_normal(glyphs,shapes) + if specification.streams then + repackpoints(glyphs,shapes) + else + contours2outlines_normal(glyphs,shapes) + end + elseif specification.streams then + repackpoints(glyphs,shapes) end end end @@ -17205,10 +16784,11 @@ local readers=fonts.handlers.otf.readers local streamreader=readers.streamreader local setposition=streamreader.setposition local getposition=streamreader.getposition -local readushort=streamreader.readcardinal2 -local readulong=streamreader.readcardinal4 +local readuinteger=streamreader.readcardinal1 +local readushort=streamreader.readcardinal2 +local readulong=streamreader.readcardinal4 local readinteger=streamreader.readinteger1 -local readshort=streamreader.readinteger2 +local readshort=streamreader.readinteger2 local readstring=streamreader.readstring local readtag=streamreader.readtag local readbytes=streamreader.readbytes @@ -17228,6 +16808,7 @@ directives.register("fonts.streamreader",function() streamreader=utilities.streams setposition=streamreader.setposition getposition=streamreader.getposition + readuinteger=streamreader.readcardinal1 readushort=streamreader.readcardinal2 readulong=streamreader.readcardinal4 readinteger=streamreader.readinteger1 @@ -19117,7 +18698,7 @@ do end local function loadvariations(f,fontdata,variationsoffset,lookuptypes,featurehash,featureorder) setposition(f,variationsoffset) - local version=readulong(f) + local version=readulong(f) local nofrecords=readulong(f) local records={} for i=1,nofrecords do @@ -19824,59 +19405,269 @@ function readers.sbix(f,fontdata,specification) for i=1,nofstrikes do strikes[i]=readulong(f) end + local shapes={} + local done=0 + for i=1,nofstrikes do + local strikeoffset=strikes[i]+tableoffset + setposition(f,strikeoffset) + strikes[i]={ + ppem=readushort(f), + ppi=readushort(f), + offset=strikeoffset + } + end + sort(strikes,function(a,b) + if b.ppem==a.ppem then + return b.ppi<a.ppi + else + return b.ppem<a.ppem + end + end) + local glyphs={} + for i=1,nofstrikes do + local strike=strikes[i] + local strikeppem=strike.ppem + local strikeppi=strike.ppi + local strikeoffset=strike.offset + setposition(f,strikeoffset) + for i=0,nofglyphs do + glyphs[i]=readulong(f) + end + local glyphoffset=glyphs[0] + for i=0,nofglyphs-1 do + local nextoffset=glyphs[i+1] + if not shapes[i] then + local datasize=nextoffset-glyphoffset + if datasize>0 then + setposition(f,strikeoffset+glyphoffset) + shapes[i]={ + x=readshort(f), + y=readshort(f), + tag=readtag(f), + data=readstring(f,datasize-8), + ppem=strikeppem, + ppi=strikeppi, + } + done=done+1 + if done==nofglyphs then + break + end + end + end + glyphoffset=nextoffset + end + end + fontdata.pngshapes=shapes + end +end +do + local function getmetrics(f) + return { + ascender=readinteger(f), + descender=readinteger(f), + widthmax=readuinteger(f), + caretslopedumerator=readinteger(f), + caretslopedenominator=readinteger(f), + caretoffset=readinteger(f), + minorigin=readinteger(f), + minadvance=readinteger(f), + maxbefore=readinteger(f), + minafter=readinteger(f), + pad1=readinteger(f), + pad2=readinteger(f), + } + end + local function getbigmetrics(f) + return { + height=readuinteger(f), + width=readuinteger(f), + horiBearingX=readinteger(f), + horiBearingY=readinteger(f), + horiAdvance=readuinteger(f), + vertBearingX=readinteger(f), + vertBearingY=readinteger(f), + vertAdvance=readuinteger(f), + } + end + local function getsmallmetrics(f) + return { + height=readuinteger(f), + width=readuinteger(f), + bearingX=readinteger(f), + bearingY=readinteger(f), + advance=readuinteger(f), + } + end + function readers.cblc(f,fontdata,specification) + local ctdttableoffset=gotodatatable(f,fontdata,"cbdt",specification.glyphs) + if not ctdttableoffset then + return + end + local cblctableoffset=gotodatatable(f,fontdata,"cblc",specification.glyphs) + if cblctableoffset then + local majorversion=readushort(f) + local minorversion=readushort(f) + local nofsizetables=readulong(f) + local sizetables={} local shapes={} - local done=0 - for i=1,nofstrikes do - local strikeoffset=strikes[i]+tableoffset - setposition(f,strikeoffset) - strikes[i]={ - ppem=readushort(f), - ppi=readushort(f), - offset=strikeoffset + local subtables={} + for i=1,nofsizetables do + sizetables[i]={ + subtables=readulong(f), + indexsize=readulong(f), + nofsubtables=readulong(f), + colorref=readulong(f), + hormetrics=getmetrics(f), + vermetrics=getmetrics(f), + firstindex=readushort(f), + lastindex=readushort(f), + ppemx=readbyte(f), + ppemy=readbyte(f), + bitdepth=readbyte(f), + flags=readbyte(f), } end - sort(strikes,function(a,b) - if b.ppem==a.ppem then - return b.ppi<a.ppi + sort(sizetables,function(a,b) + if b.ppemx==a.ppemx then + return b.bitdepth<a.bitdepth else - return b.ppem<a.ppem + return b.ppemx<a.ppemx end end) - local glyphs={} - for i=1,nofstrikes do - local strike=strikes[i] - local strikeppem=strike.ppem - local strikeppi=strike.ppi - local strikeoffset=strike.offset - setposition(f,strikeoffset) - for i=0,nofglyphs do - glyphs[i]=readulong(f) - end - local glyphoffset=glyphs[0] - for i=0,nofglyphs-1 do - local nextoffset=glyphs[i+1] - if not shapes[i] then - local datasize=nextoffset-glyphoffset - if datasize>0 then - setposition(f,strikeoffset+glyphoffset) - shapes[i]={ - x=readshort(f), - y=readshort(f), - tag=readtag(f), - data=readstring(f,datasize-8), - ppem=strikeppem, - ppi=strikeppi, - } - done=done+1 - if done==nofglyphs then - break + for i=1,nofsizetables do + local s=sizetables[i] + local d=false + for j=s.firstindex,s.lastindex do + if not shapes[j] then + shapes[j]=i + d=true + end + end + if d then + s.used=true + end + end + for i=1,nofsizetables do + local s=sizetables[i] + if s.used then + local offset=s.subtables + setposition(f,cblctableoffset+offset) + for j=1,s.nofsubtables do + local firstindex=readushort(f) + local lastindex=readushort(f) + local tableoffset=readulong(f)+offset + for k=firstindex,lastindex do + if shapes[k]==i then + local s=subtables[tableoffset] + if not s then + s={ + firstindex=firstindex, + lastindex=lastindex, + } + subtables[tableoffset]=s + end + shapes[k]=s end end end - glyphoffset=nextoffset end end - fontdata.sbixshapes=shapes + for offset,subtable in sortedhash(subtables) do + local tabletype=readushort(f) + subtable.format=readushort(f) + local baseoffset=readulong(f)+ctdttableoffset + local offsets={} + local metrics=nil + if tabletype==1 then + for i=subtable.firstindex,subtable.lastindex do + offsets[i]=readulong(f)+baseoffset + end + skipbytes(f,4) + elseif tabletype==2 then + local size=readulong(f) + local done=baseoffset + metrics=getbigmetrics(f) + for i=subtable.firstindex,subtable.lastindex do + offsets[i]=done + done=done+size + end + elseif tabletype==3 then + local n=subtable.lastindex-subtable.firstindex+2 + for i=subtable.firstindex,subtable.lastindex do + offsets[i]=readushort(f)+baseoffset + end + if math.odd(n) then + skipbytes(f,4) + else + skipbytes(f,2) + end + elseif tabletype==4 then + for i=1,readulong(f) do + offsets[readushort(f)]=readushort(f)+baseoffset + end + elseif tabletype==5 then + local size=readulong(f) + local done=baseoffset + metrics=getbigmetrics(f) + local n=readulong(f) + for i=1,n do + offsets[readushort(f)]=done + done=done+size + end + if math.odd(n) then + skipbytes(f,2) + end + else + return + end + subtable.offsets=offsets + subtable.metrics=metrics + end + local default={ width=0,height=0 } + local glyphs=fontdata.glyphs + for index,subtable in sortedhash(shapes) do + if type(subtable)=="table" then + local data=nil + local metrics=default + local format=subtable.format + local offset=subtable.offsets[index] + setposition(f,offset) + if format==17 then + metrics=getsmallmetrics(f) + data=readstring(f,readulong(f)) + elseif format==18 then + metrics=getbigmetrics(f) + data=readstring(f,readulong(f)) + elseif format==19 then + metrics=subtable.metrics + data=readstring(f,readulong(f)) + else + end + local x=metrics.width + local y=metrics.height + shapes[index]={ + x=x, + y=y, + data=data, + } + local glyph=glyphs[index] + if not glyph.boundingbox then + local width=glyph.width + local height=width*y/x + glyph.boundingbox={ 0,0,width,height } + end + else + shapes[index]={ + x=0, + y=0, + data="", + } + end + end + fontdata.pngshapes=shapes + end + end + function readers.cbdt(f,fontdata,specification) end end function readers.stat(f,fontdata,specification) @@ -19986,8 +19777,7 @@ function readers.avar(f,fontdata,specification) end return false end - local majorversion=readushort(f) - local minorversion=readushort(f) + local version=readulong(f) local reserved=readushort(f) local nofaxis=readushort(f) local segments={} @@ -20877,7 +20667,7 @@ local function unifymissing(fontdata) fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups) resources.unicodes=nil end -local firstprivate=fonts.privateoffsets.textbase or 0xF0000 +local firstprivate=fonts.privateoffsets and fonts.privateoffsets.textbase or 0xF0000 local puafirst=0xE000 local pualast=0xF8FF local function unifyglyphs(fontdata,usenames) @@ -22832,13 +22622,13 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_de local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf -otf.version=3.106 +otf.version=3.107 otf.cache=containers.define("fonts","otl",otf.version,true) otf.svgcache=containers.define("fonts","svg",otf.version,true) -otf.sbixcache=containers.define("fonts","sbix",otf.version,true) +otf.pngcache=containers.define("fonts","png",otf.version,true) otf.pdfcache=containers.define("fonts","pdf",otf.version,true) otf.svgenabled=false -otf.sbixenabled=false +otf.pngenabled=false local otfreaders=otf.readers local hashes=fonts.hashes local definers=fonts.definers @@ -22906,7 +22696,7 @@ function otf.load(filename,sub,instance) report_otf("forced reload of %a due to hard coded flag",filename) reload=true end - if reload then + if reload then report_otf("loading %a, hash %a",filename,hash) starttiming(otfreaders,true) data=otfreaders.loadfont(filename,sub or 1,instance) @@ -22914,7 +22704,7 @@ function otf.load(filename,sub,instance) local used=checkmemory() local resources=data.resources local svgshapes=resources.svgshapes - local sbixshapes=resources.sbixshapes + local pngshapes=resources.pngshapes if cleanup==0 then checkmemory(used,threshold,tracememory) end @@ -22937,15 +22727,15 @@ function otf.load(filename,sub,instance) checkmemory(used,threshold,tracememory) end end - if sbixshapes then - resources.sbixshapes=nil - if otf.sbixenabled then + if pngshapes then + resources.pngshapes=nil + if otf.pngenabled then local timestamp=os.date() - containers.write(otf.sbixcache,hash,{ - sbixshapes=sbixshapes, + containers.write(otf.pngcache,hash,{ + pngshapes=pngshapes, timestamp=timestamp, }) - data.properties.sbix={ + data.properties.png={ hash=hash, timestamp=timestamp, } @@ -26345,22 +26135,17 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip else end end - else + else local discfound=false - local lastdisc=nil local hasmarks=marks[startchar] while current do local char,id=ischar(current,currentfont) if char then if skiphash and skiphash[char] then current=getnext(current) - else - local lg=ligature[char] + else + local lg=ligature[char] if lg then - if not discfound and lastdisc then - discfound=lastdisc - lastdisc=nil - end if marks[char] then hasmarks=true end @@ -26374,42 +26159,82 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip elseif char==false then break elseif id==disc_code then - local replace=getfield(current,"replace") - if replace then - while replace do - local char,id=ischar(replace,currentfont) - if char then - local lg=ligature[char] - if lg then - if marks[char] then - hasmarks=true - end - ligature=lg - replace=getnext(replace) - else - return head,start,false,false - end - else - return head,start,false,false - end - end - stop=current - end - lastdisc=current - current=getnext(current) + discfound=current + break else break end end + if discfound then + local pre,post,replace=getdisc(discfound) + local match + if replace then + local char=ischar(replace,currentfont) + if char and ligature[char] then + match=true + end + end + if not match and pre then + local char=ischar(pre,currentfont) + if char and ligature[char] then + match=true + end + end + if not match and not pre or not replace then + local n=getnext(discfound) + local char=ischar(n,currentfont) + if char and ligature[char] then + match=true + end + end + if match then + local ishead=head==start + local prev=getprev(start) + if stop then + setnext(stop) + local tail=getprev(stop) + local copy=copy_node_list(start) + local liat=find_node_tail(copy) + if pre and replace then + setlink(liat,pre) + end + if replace then + setlink(tail,replace) + end + pre=copy + replace=start + else + setnext(start) + local copy=copy_node(start) + if pre then + setlink(copy,pre) + end + if replace then + setlink(start,replace) + end + pre=copy + replace=start + end + setdisc(discfound,pre,post,replace) + if prev then + setlink(prev,discfound) + else + setprev(discfound) + head=discfound + end + start=discfound + return head,start,true,true + end + end local lig=ligature.ligature if lig then if stop then if trace_ligatures then local stopchar=getchar(stop) - head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) + head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks) logprocess("%s: replacing %s upto %s by ligature %s case 2",pref(dataset,sequence),gref(startchar),gref(stopchar),gref(lig)) else - head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,discfound,hasmarks) + head,start=toligature(head,start,stop,lig,dataset,sequence,skiphash,false,hasmarks) end else resetinjection(start) @@ -26418,11 +26243,11 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip logprocess("%s: replacing %s by (no real) ligature %s case 3",pref(dataset,sequence),gref(startchar),gref(lig)) end end - return head,start,true,discfound + return head,start,true,false else end end - return head,start,false,discfound + return head,start,false,false end function handlers.gpos_single(head,start,dataset,sequence,kerns,rlmode,skiphash,step,injection) local startchar=getchar(start) @@ -28901,9 +28726,10 @@ do a=true end if a then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if start then + local ok,df + head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + elseif start then start=getnext(start) end else @@ -28957,21 +28783,24 @@ do a=true end if a then + local ok,df for i=m[1],m[2] do local step=steps[i] local lookupcache=step.coverage local lookupmatch=lookupcache[char] if lookupmatch then - local ok - head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) - if ok then + head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) + if df then + break + elseif ok then break elseif not start then break end end end - if start then + if df then + elseif start then start=getnext(start) end else @@ -31348,11 +31177,13 @@ else sharedpalettes[name]=values for i=1,#values do local v=values[i] - values[i]=hash[f_color( - max(round((v.r or 0)*255),255)/255, - max(round((v.g or 0)*255),255)/255, - max(round((v.b or 0)*255),255)/255 - )] + if v then + values[i]=hash[f_color( + max(round((v.r or 0)*255),255)/255, + max(round((v.g or 0)*255),255)/255, + max(round((v.b or 0)*255),255)/255 + )] + end end end end @@ -31376,7 +31207,7 @@ local pop={ "pdf","page","Q" } if not LUATEXFUNCTIONALITY or LUATEXFUNCTIONALITY<6472 then start={ "nop" } end -local function initialize(tfmdata,kind,value) +local function initialize(tfmdata,kind,value) if value then local resources=tfmdata.resources local palettes=resources.colorpalettes @@ -31386,7 +31217,13 @@ local function initialize(tfmdata,kind,value) converted=setmetatableindex(convert) resources.converted=converted end - local colorvalues=sharedpalettes[value] or converted[palettes[tonumber(value) or 1] or palettes[1]] or {} + local colorvalues=sharedpalettes[value] + local default=false + if colorvalues then + default=colorvalues[#colorvalues] + else + colorvalues=converted[palettes[tonumber(value) or 1] or palettes[1]] or {} + end local classes=#colorvalues if classes==0 then return @@ -31399,7 +31236,6 @@ local function initialize(tfmdata,kind,value) { id=0 } } local getactualtext=otf.getactualtext - local default=colorvalues[#colorvalues] local b,e=getactualtext(tounicode(0xFFFD)) local actualb={ "pdf","page",b } local actuale={ "pdf","page",e } @@ -31430,6 +31266,12 @@ local function initialize(tfmdata,kind,value) f=true n=n+1 t[n]=v l=v + else + if f then + n=n+1 t[n]=pop + end + f=false + l=nil end n=n+1 t[n]=charcommand[entry.slot] if s>1 and i<s and goback then @@ -31472,7 +31314,7 @@ do done=f_used(n) hashed[pdf]=done end - return nil,done,nil + return done end else local openpdf=pdfe.new @@ -31485,7 +31327,7 @@ do done=f_used(n) hashed[pdf]=done end - return nil,done,nil + return done end end end @@ -31506,6 +31348,10 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) local b,e=getactualtext(tounicode(0xFFFD)) local actualb={ "pdf","page",b } local actuale={ "pdf","page",e } + local vfimage=lpdf and lpdf.vfimage or function(wd,ht,dp,data,name) + local name=storepdfdata(data) + return { "image",{ filename=name,width=wd,height=ht,depth=dp } } + end for unicode,character in sortedhash(characters) do local index=character.index if index then @@ -31524,21 +31370,18 @@ local function pdftovirtual(tfmdata,pdfshapes,kind) dy=0 end if data then - local setcode,name,nilcode=storepdfdata(data) - if name then - local bt=unicode and getactualtext(unicode) - local wd=character.width or 0 - local ht=character.height or 0 - local dp=character.depth or 0 - character.commands={ - not unicode and actualb or { "pdf","page",(getactualtext(unicode)) }, - downcommand[dp+dy*hfactor], - rightcommand[dx*hfactor], - { "image",{ filename=name,width=wd,height=ht,depth=dp } }, - actuale, - } - character[kind]=true - end + local bt=unicode and getactualtext(unicode) + local wd=character.width or 0 + local ht=character.height or 0 + local dp=character.depth or 0 + character.commands={ + not unicode and actualb or { "pdf","page",(getactualtext(unicode)) }, + downcommand[dp+dy*hfactor], + rightcommand[dx*hfactor], + vfimage(wd,ht,dp,data,name), + actuale, + } + character[kind]=true end end end @@ -31654,40 +31497,40 @@ fonts.handlers.otf.features.register { node=initializesvg, } } -local otfsbix=otf.sbix or {} -otf.sbix=otfsbix -otf.sbixenabled=true +local otfpng=otf.png or {} +otf.png=otfpng +otf.pngenabled=true do - local report_sbix=logs.reporter("fonts","sbix conversion") + local report_png=logs.reporter("fonts","png conversion") local loaddata=io.loaddata local savedata=io.savedata local remove=os.remove local runner=sandbox and sandbox.registerrunner { - name="otfsbix", + name="otfpng", program="gm", - template="convert -quality 100 temp-otf-sbix-shape.sbix temp-otf-sbix-shape.pdf > temp-otf-svg-shape.log", + template="convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log", } if not runner then runner=function() - return os.execute("gm convert -quality 100 temp-otf-sbix-shape.sbix temp-otf-sbix-shape.pdf > temp-otf-svg-shape.log") + return os.execute("gm convert -quality 100 temp-otf-png-shape.png temp-otf-png-shape.pdf > temp-otf-svg-shape.log") end end - function otfsbix.topdf(sbixshapes) + function otfpng.topdf(pngshapes) local pdfshapes={} - local sbixfile="temp-otf-sbix-shape.sbix" - local pdffile="temp-otf-sbix-shape.pdf" + local pngfile="temp-otf-png-shape.png" + local pdffile="temp-otf-png-shape.pdf" local nofdone=0 - local indices=sortedkeys(sbixshapes) + local indices=sortedkeys(pngshapes) local nofindices=#indices - report_sbix("processing %i sbix containers",nofindices) + report_png("processing %i png containers",nofindices) statistics.starttiming() for i=1,nofindices do local index=indices[i] - local entry=sbixshapes[index] - local data=entry.data + local entry=pngshapes[index] + local data=entry.data local x=entry.x local y=entry.y - savedata(sbixfile,data) + savedata(pngfile,data) runner() pdfshapes[index]={ x=x~=0 and x or nil, @@ -31696,47 +31539,55 @@ do } nofdone=nofdone+1 if nofdone%100==0 then - report_sbix("%i shapes processed",nofdone) + report_png("%i shapes processed",nofdone) end end - report_sbix("processing %i pdf results",nofindices) - remove(sbixfile) + report_png("processing %i pdf results",nofindices) + remove(pngfile) remove(pdffile) statistics.stoptiming() if statistics.elapsedseconds then - report_sbix("sbix conversion time %s",statistics.elapsedseconds() or "-") + report_png("png conversion time %s",statistics.elapsedseconds() or "-") end return pdfshapes end end -local function initializesbix(tfmdata,kind,value) - if value and otf.sbixenabled then - local sbix=tfmdata.properties.sbix - local hash=sbix and sbix.hash - local timestamp=sbix and sbix.timestamp +local function initializepng(tfmdata,kind,value) + if value and otf.pngenabled then + local png=tfmdata.properties.png + local hash=png and png.hash + local timestamp=png and png.timestamp if not hash then return end local pdffile=containers.read(otf.pdfcache,hash) local pdfshapes=pdffile and pdffile.pdfshapes if not pdfshapes or pdffile.timestamp~=timestamp then - local sbixfile=containers.read(otf.sbixcache,hash) - local sbixshapes=sbixfile and sbixfile.sbixshapes - pdfshapes=sbixshapes and otfsbix.topdf(sbixshapes) or {} + local pngfile=containers.read(otf.pngcache,hash) + local pngshapes=pngfile and pngfile.pngshapes + pdfshapes=pngshapes and otfpng.topdf(pngshapes) or {} containers.write(otf.pdfcache,hash,{ pdfshapes=pdfshapes, timestamp=timestamp, }) end - pdftovirtual(tfmdata,pdfshapes,"sbix") + pdftovirtual(tfmdata,pdfshapes,"png") end end fonts.handlers.otf.features.register { name="sbix", description="sbix glyphs", manipulators={ - base=initializesbix, - node=initializesbix, + base=initializepng, + node=initializepng, + } +} +fonts.handlers.otf.features.register { + name="cblc", + description="cblc glyphs", + manipulators={ + base=initializepng, + node=initializepng, } } @@ -32508,7 +32359,7 @@ local match,lower,gsub,strip,find=string.match,string.lower,string.gsub,string.s local char,byte,sub=string.char,string.byte,string.sub local abs=math.abs local bxor,rshift=bit32.bxor,bit32.rshift -local P,S,R,Cmt,C,Ct,Cs,Carg,Cf,Cg=lpeg.P,lpeg.S,lpeg.R,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg,lpeg.Cf,lpeg.Cg +local P,S,R,V,Cmt,C,Ct,Cs,Carg,Cf,Cg,Cc=lpeg.P,lpeg.S,lpeg.R,lpeg.V,lpeg.Cmt,lpeg.C,lpeg.Ct,lpeg.Cs,lpeg.Carg,lpeg.Cf,lpeg.Cg,lpeg.Cc local lpegmatch,patterns=lpeg.match,lpeg.patterns local trace_indexing=false trackers.register("afm.indexing",function(v) trace_indexing=v end) local trace_loading=false trackers.register("afm.loading",function(v) trace_loading=v end) @@ -32551,14 +32402,21 @@ do local routines,vector,chars,n,m local initialize=function(str,position,size) n=0 - m=size + m=size return position+1 end local setroutine=function(str,position,index,size,filename) - local forward=position+tonumber(size) + if routines[index] then + return false + end + local forward=position+size local stream=decrypt(sub(str,position+1,forward),4330,4) routines[index]={ byte(stream,1,#stream) } - return forward + n=n+1 + if n>=m then + return #str + end + return forward+1 end local setvector=function(str,position,name,size,filename) local forward=position+tonumber(size) @@ -32598,7 +32456,7 @@ do local p_np=spacing*(P("NP")+P("|")) local p_nd=spacing*(P("ND")+P("|")) local p_filterroutines= - (1-subroutines)^0*subroutines*spaces*Cmt(cardinal,initialize)*(Cmt(cardinal*spaces*cardinal*p_rd*Carg(1),setroutine)*p_np+P(1))^1 + (1-subroutines)^0*subroutines*spaces*Cmt(cardinal,initialize)*(Cmt(cardinal*spaces*cardinal*p_rd*Carg(1),setroutine)*p_np+(1-p_nd))^1 local p_filtershapes= (1-charstrings)^0*charstrings*spaces*Cmt(cardinal,initialize)*(Cmt(name*spaces*cardinal*p_rd*Carg(1),setshapes)*p_nd+P(1))^1 local p_filternames=Ct ( @@ -32607,7 +32465,18 @@ do local p_filterencoding=(1-encoding)^0*encoding*spaces*digits*spaces*array*(1-dup)^0*Cf( Ct("")*Cg(spacing*dup*spaces*cardinal*spaces*name*spaces*put)^1 ,rawset) - local function loadpfbvector(filename,shapestoo) + local key=spacing*P("/")*R("az","AZ") + local str=spacing*Cs { (P("(")/"")*((1-P("\\(")-P("\\)")-S("()"))+V(1))^0*(P(")")/"") } + local num=spacing*(R("09")+S("+-."))^1/tonumber + local arr=spacing*Ct (S("[{")*(num)^0*spacing*S("]}")) + local boo=spacing*(P("true")*Cc(true)+P("false")*Cc(false)) + local nam=spacing*P("/")*Cs(R("az","AZ")^1) + local p_filtermetadata=( + P("/")*Carg(1)*(( + C("version")*str+C("Copyright")*str+C("Notice")*str+C("FullName")*str+C("FamilyName")*str+C("Weight")*str+C("ItalicAngle")*num+C("isFixedPitch")*boo+C("UnderlinePosition")*num+C("UnderlineThickness")*num+C("FontName")*nam+C("FontMatrix")*arr+C("FontBBox")*arr + ) )/function(t,k,v) t[lower(k)]=v end+P(1) + )^0*Carg(1) + local function loadpfbvector(filename,shapestoo,streams) local data=io.loaddata(resolvers.findfile(filename)) if not data then report_pfb("no data in %a",filename) @@ -32625,9 +32494,10 @@ do binary=decrypt(binary,55665,4) local names={} local encoding=lpegmatch(p_filterencoding,ascii) + local metadata=lpegmatch(p_filtermetadata,ascii,1,{}) local glyphs={} routines,vector,chars={},{},{} - if shapestoo then + if shapestoo or streams then lpegmatch(p_filterroutines,binary,1,filename) lpegmatch(p_filtershapes,binary,1,filename) local data={ @@ -32639,13 +32509,13 @@ do } }, } - fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,true) + fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams) else lpegmatch(p_filternames,binary,1,filename) end names=vector routines,vector,chars=nil,nil,nil - return names,encoding,glyphs + return names,encoding,glyphs,metadata end local pfb=handlers.pfb or {} handlers.pfb=pfb @@ -33731,6 +33601,7 @@ if not modules then modules={} end modules ['font-tfm']={ local next,type=next,type local match,format=string.match,string.format local concat,sortedhash=table.concat,table.sortedhash +local idiv=number.idiv local trace_defining=false trackers.register("fonts.defining",function(v) trace_defining=v end) local trace_features=false trackers.register("tfm.features",function(v) trace_features=v end) local report_defining=logs.reporter("fonts","defining") @@ -33766,147 +33637,190 @@ function tfm.setfeatures(tfmdata,features) end end local depth={} -local function read_from_tfm(specification) - local filename=specification.filename - local size=specification.size - depth[filename]=(depth[filename] or 0)+1 - if trace_defining then - report_defining("loading tfm file %a at size %s",filename,size) - end - local tfmdata=font.read_tfm(filename,size) - if tfmdata then - local features=specification.features and specification.features.normal or {} - local features=constructors.checkedfeatures("tfm",features) - specification.features.normal=features - local newtfmdata=(depth[filename]==1) and tfm.reencode(tfmdata,specification) - if newtfmdata then - tfmdata=newtfmdata +local read_from_tfm,check_tfm do + local tfmreaders=context and tfm.readers + local loadtfmvf=tfmreaders and tfmreaders.loadtfmvf + local loadtfm=font.read_tfm + local loadvf=font.read_vf + directives.register("fonts.tfm.builtin",function(v) + loadtfmvf=tfmreaders and tfmreaders.loadtfmvf + if v and loadtfm then + loadtfmvf=false end - local resources=tfmdata.resources or {} - local properties=tfmdata.properties or {} - local parameters=tfmdata.parameters or {} - local shared=tfmdata.shared or {} - shared.features=features - shared.resources=resources - properties.name=tfmdata.name - properties.fontname=tfmdata.fontname - properties.psname=tfmdata.psname - properties.fullname=tfmdata.fullname - properties.filename=specification.filename - properties.format=fonts.formats.tfm - tfmdata.properties=properties - tfmdata.resources=resources - tfmdata.parameters=parameters - tfmdata.shared=shared - shared.rawdata={ resources=resources } - shared.features=features - if newtfmdata then - if not resources.marks then - resources.marks={} - end - if not resources.sequences then - resources.sequences={} - end - if not resources.features then - resources.features={ - gsub={}, - gpos={}, - } - end - if not tfmdata.changed then - tfmdata.changed={} - end - if not tfmdata.descriptions then - tfmdata.descriptions=tfmdata.characters - end - otf.readers.addunicodetable(tfmdata) - tfmenhancers.apply(tfmdata,filename) - constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm) - otf.readers.unifymissing(tfmdata) - fonts.mappings.addtounicode(tfmdata,filename) - tfmdata.tounicode=1 - local tounicode=fonts.mappings.tounicode - for unicode,v in next,tfmdata.characters do - local u=v.unicode - if u then - v.tounicode=tounicode(u) - end - end - if tfmdata.usedbitmap then - tfm.addtounicode(tfmdata) - end - end - shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil - parameters.factor=1 - parameters.size=size - parameters.slant=parameters.slant or parameters[1] or 0 - parameters.space=parameters.space or parameters[2] or 0 - parameters.space_stretch=parameters.space_stretch or parameters[3] or 0 - parameters.space_shrink=parameters.space_shrink or parameters[4] or 0 - parameters.x_height=parameters.x_height or parameters[5] or 0 - parameters.quad=parameters.quad or parameters[6] or 0 - parameters.extra_space=parameters.extra_space or parameters[7] or 0 - constructors.enhanceparameters(parameters) - properties.private=properties.private or tfmdata.private or privateoffset - if newtfmdata then - elseif constructors.resolvevirtualtoo then - fonts.loggers.register(tfmdata,file.suffix(filename),specification) - local vfname=findbinfile(specification.name,'ovf') - if vfname and vfname~="" then - local vfdata=font.read_vf(vfname,size) - if vfdata then - local chars=tfmdata.characters - for k,v in next,vfdata.characters do - chars[k].commands=v.commands - end - properties.virtualized=true - tfmdata.fonts=vfdata.fonts - tfmdata.type="virtual" - local fontlist=vfdata.fonts - local name=file.nameonly(filename) - for i=1,#fontlist do - local n=fontlist[i].name - local s=fontlist[i].size - local d=depth[filename] - s=constructors.scaled(s,vfdata.designsize) - if d>tfm.maxnestingdepth then - report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth) - fontlist[i]={ id=0 } - elseif (d>1) and (s>tfm.maxnestingsize) then - report_defining("virtual font %a exceeds size %s",n,s) - fontlist[i]={ id=0 } - else - local t,id=fonts.constructors.readanddefine(n,s) - fontlist[i]={ id=id } + end) + read_from_tfm=function(specification) + local filename=specification.filename + local size=specification.size + depth[filename]=(depth[filename] or 0)+1 + if trace_defining then + report_defining("loading tfm file %a at size %s",filename,size) + end + local tfmdata + if loadtfmvf then + tfmdata=loadtfmvf(filename,size) + else + tfmdata=loadtfm(filename,size) + end + if tfmdata then + local features=specification.features and specification.features.normal or {} + local features=constructors.checkedfeatures("tfm",features) + specification.features.normal=features + local newtfmdata=(depth[filename]==1) and tfm.reencode(tfmdata,specification) + if newtfmdata then + tfmdata=newtfmdata + end + local resources=tfmdata.resources or {} + local properties=tfmdata.properties or {} + local parameters=tfmdata.parameters or {} + local shared=tfmdata.shared or {} + shared.features=features + shared.resources=resources + properties.name=tfmdata.name + properties.fontname=tfmdata.fontname + properties.psname=tfmdata.psname + properties.fullname=tfmdata.fullname + properties.filename=specification.filename + properties.format=tfmdata.format or fonts.formats.tfm + properties.usedbitmap=tfmdata.usedbitmap + tfmdata.properties=properties + tfmdata.resources=resources + tfmdata.parameters=parameters + tfmdata.shared=shared + shared.rawdata={ resources=resources } + shared.features=features + if newtfmdata then + if not resources.marks then + resources.marks={} + end + if not resources.sequences then + resources.sequences={} + end + if not resources.features then + resources.features={ + gsub={}, + gpos={}, + } + end + if not tfmdata.changed then + tfmdata.changed={} + end + if not tfmdata.descriptions then + tfmdata.descriptions=tfmdata.characters + end + otf.readers.addunicodetable(tfmdata) + tfmenhancers.apply(tfmdata,filename) + constructors.applymanipulators("tfm",tfmdata,features,trace_features,report_tfm) + otf.readers.unifymissing(tfmdata) + fonts.mappings.addtounicode(tfmdata,filename) + tfmdata.tounicode=1 + local tounicode=fonts.mappings.tounicode + for unicode,v in next,tfmdata.characters do + local u=v.unicode + if u then + v.tounicode=tounicode(u) + end + end + if tfmdata.usedbitmap then + tfm.addtounicode(tfmdata) + end + end + shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil + if size<0 then + size=idiv(65536*-size,100) + end + parameters.factor=1 + parameters.units=1000 + parameters.size=size + parameters.slant=parameters.slant or parameters[1] or 0 + parameters.space=parameters.space or parameters[2] or 0 + parameters.space_stretch=parameters.space_stretch or parameters[3] or 0 + parameters.space_shrink=parameters.space_shrink or parameters[4] or 0 + parameters.x_height=parameters.x_height or parameters[5] or 0 + parameters.quad=parameters.quad or parameters[6] or 0 + parameters.extra_space=parameters.extra_space or parameters[7] or 0 + constructors.enhanceparameters(parameters) + properties.private=properties.private or tfmdata.private or privateoffset + if newtfmdata then + elseif loadtfmvf then + local fonts=tfmdata.fonts + if fonts then + for i=1,#fonts do + local font=fonts[i] + local id=font.id + if not id then + local name=font.name + local size=font.size + if name and size then + local data,id=constructors.readanddefine(name,size) + if id then + font.id=id + font.name=nil + font.size=nil + end + end + end + end + end + elseif constructors.resolvevirtualtoo then + fonts.loggers.register(tfmdata,file.suffix(filename),specification) + local vfname=findbinfile(specification.name,'ovf') + if vfname and vfname~="" then + local vfdata=loadvf(vfname,size) + if vfdata then + local chars=tfmdata.characters + for k,v in next,vfdata.characters do + chars[k].commands=v.commands + end + properties.virtualized=true + tfmdata.fonts=vfdata.fonts + tfmdata.type="virtual" + local fontlist=vfdata.fonts + local name=file.nameonly(filename) + for i=1,#fontlist do + local n=fontlist[i].name + local s=fontlist[i].size + local d=depth[filename] + s=constructors.scaled(s,vfdata.designsize) + if d>tfm.maxnestingdepth then + report_defining("too deeply nested virtual font %a with size %a, max nesting depth %s",n,s,tfm.maxnestingdepth) + fontlist[i]={ id=0 } + elseif (d>1) and (s>tfm.maxnestingsize) then + report_defining("virtual font %a exceeds size %s",n,s) + fontlist[i]={ id=0 } + else + local t,id=constructors.readanddefine(n,s) + fontlist[i]={ id=id } + end end end end end + properties.haskerns=true + properties.hasligatures=true + properties.hasitalics=true + resources.unicodes={} + resources.lookuptags={} + depth[filename]=depth[filename]-1 + return tfmdata + else + depth[filename]=depth[filename]-1 end - properties.haskerns=true - properties.hasligatures=true - resources.unicodes={} - resources.lookuptags={} - depth[filename]=depth[filename]-1 - return tfmdata - else - depth[filename]=depth[filename]-1 end -end -local function check_tfm(specification,fullname) - local foundname=findbinfile(fullname,'tfm') or "" - if foundname=="" then - foundname=findbinfile(fullname,'ofm') or "" - end - if foundname=="" then - foundname=fonts.names.getfilename(fullname,"tfm") or "" - end - if foundname~="" then - specification.filename=foundname - specification.format="ofm" - return read_from_tfm(specification) - elseif trace_defining then - report_defining("loading tfm with name %a fails",specification.name) + check_tfm=function(specification,fullname) + local foundname=findbinfile(fullname,'tfm') or "" + if foundname=="" then + foundname=findbinfile(fullname,'ofm') or "" + end + if foundname=="" then + foundname=fonts.names.getfilename(fullname,"tfm") or "" + end + if foundname~="" then + specification.filename=foundname + specification.format="ofm" + return read_from_tfm(specification) + elseif trace_defining then + report_defining("loading tfm with name %a fails",specification.name) + end end end readers.check_tfm=check_tfm @@ -33966,7 +33880,7 @@ do local encoding=false local vector=false if type(pfbfile)=="string" then - local pfb=fonts.constructors.handlers.pfb + local pfb=constructors.handlers.pfb if pfb and pfb.loadvector then local v,e=pfb.loadvector(pfbfile) if v then @@ -33994,7 +33908,7 @@ do local originals=tfmdata.characters local indices={} local parentfont={ "font",1 } - local private=tfmdata or fonts.constructors.privateoffset + local private=tfmdata.privateoffset or constructors.privateoffset local reported=encdone[tfmfile][encfile] local backmap=vector and table.swapped(vector) local done={} @@ -34084,21 +33998,16 @@ CMapName currentdict /CMap defineresource pop end end end ]] - local flushstreamobject=lpdf and lpdf.flushstreamobject - local setfontattributes=pdf.setfontattributes - if flushstreamobject then - else + local flushstreamobject=lpdf and lpdf.flushstreamobject + local setfontattributes=lpdf and lpdf.setfontattributes + if not flushstreamobject then flushstreamobject=function(data) - return pdf.obj { - immediate=true, - type="stream", - string=data, - } + return pdf.obj { immediate=true,type="stream",string=data } end end if not setfontattributes then setfontattributes=function(id,data) - print(format("your luatex is too old so no tounicode bitmap font%i",id)) + return pdf.setfontattributes(id,data) end end function tfm.addtounicode(tfmdata) @@ -34373,9 +34282,6 @@ function resolvers.name(specification) features.normal=normal end normal.instance=instance - if not callbacks.supported.glyph_stream_provider then - normal.variableshapes=true - end end local suffix=lower(suffixonly(resolved)) if fonts.formats[suffix] then @@ -35233,7 +35139,7 @@ do -- begin closure to overcome local limits and interference if not modules then modules={} end modules ['font-imp-effects']={ version=1.001, - comment="companion to font-ini.mkiv and hand-ini.mkiv", + comment="companion to font-ini.mkiv", author="Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-fil.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-fil.lua index d568a2e1fd0..9f96a01b911 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-fil.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-fil.lua @@ -6,6 +6,7 @@ if not modules then modules = { } end modules ['util-fil'] = { license = "see context related readme files" } +local tonumber = tonumber local byte = string.byte local char = string.char @@ -196,41 +197,23 @@ function files.readinteger4le(f) end end --- function files.readfixed2(f) --- local a, b = byte(f:read(2),1,2) --- if a >= 0x80 then --- return (0x100 * a + b - 0x10000)/256.0 --- else --- return (0x100 * a + b)/256.0 --- end --- end - function files.readfixed2(f) local a, b = byte(f:read(2),1,2) if a >= 0x80 then - return (a - 0x100) + b/0x100 + tonumber((a - 0x100) .. "." .. b) else - return (a ) + b/0x100 + tonumber(( a ) .. "." .. b) end end --- (real) (n>>16) + ((n&0xffff)/65536.0)) - --- function files.readfixed4(f) --- local a, b, c, d = byte(f:read(4),1,4) --- if a >= 0x80 then --- return (0x1000000 * a + 0x10000 * b + 0x100 * c + d - 0x100000000)/65536.0 --- else --- return (0x1000000 * a + 0x10000 * b + 0x100 * c + d)/65536.0 --- end --- end +-- (real) (n>>16) + ((n&0xffff)/65536.0)) but no cast in lua (we could use unpack) function files.readfixed4(f) local a, b, c, d = byte(f:read(4),1,4) if a >= 0x80 then - return (0x100 * a + b - 0x10000) + (0x100 * c + d)/0x10000 + tonumber((0x100 * a + b - 0x10000) .. "." .. (0x100 * c + d)) else - return (0x100 * a + b ) + (0x100 * c + d)/0x10000 + tonumber((0x100 * a + b ) .. "." .. (0x100 * c + d)) end end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-str.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-str.lua index f090bce55cc..508d32d71cf 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-str.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-util-str.lua @@ -1415,3 +1415,11 @@ function strings.newcollector() end end end + +-- + +local f_16_16 = formatters["%0.5N"] + +function number.to16dot16(n) + return f_16_16(n/65536.0) +end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua index ee8e480769e..6f25eb29a88 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua @@ -6,8 +6,8 @@ local ProvidesLuaModule = { name = "luaotfload-auxiliary", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / auxiliary functions", license = "GPL v2.0" } diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-characters.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-characters.lua index d58cb8e0599..de59715f19e 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-characters.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-characters.lua @@ -8604,6 +8604,12 @@ return { linebreak="al", unicodeslot=0x55F, }, + [0x560]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x560, + }, [0x561]={ category="ll", direction="l", @@ -8839,6 +8845,12 @@ return { specials={ "compat", 0x565, 0x582 }, unicodeslot=0x587, }, + [0x588]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x588, + }, [0x589]={ category="po", direction="l", @@ -9361,6 +9373,12 @@ return { linebreak="hl", unicodeslot=0x5EA, }, + [0x5EF]={ + category="lo", + direction="r", + linebreak="hl", + unicodeslot=0x5EF, + }, [0x5F0]={ category="lo", direction="r", @@ -12337,6 +12355,24 @@ return { linebreak="al", unicodeslot=0x7FA, }, + [0x7FD]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x7FD, + }, + [0x7FE]={ + category="sc", + direction="r", + linebreak="pr", + unicodeslot=0x7FE, + }, + [0x7FF]={ + category="sc", + direction="r", + linebreak="pr", + unicodeslot=0x7FF, + }, [0x800]={ category="lo", direction="r", @@ -13117,6 +13153,12 @@ return { linebreak="al", unicodeslot=0x8BD, }, + [0x8D3]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x8D3, + }, [0x8D4]={ category="mn", direction="nsm", @@ -15044,6 +15086,12 @@ return { linebreak="al", unicodeslot=0x9FD, }, + [0x9FE]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x9FE, + }, [0xA01]={ category="mn", direction="nsm", @@ -15631,6 +15679,12 @@ return { linebreak="cm", unicodeslot=0xA75, }, + [0xA76]={ + category="po", + direction="l", + linebreak="al", + unicodeslot=0xA76, + }, [0xA81]={ category="mn", direction="nsm", @@ -17526,6 +17580,12 @@ return { linebreak="cm", unicodeslot=0xC03, }, + [0xC04]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0xC04, + }, [0xC05]={ category="lo", direction="l", @@ -18232,6 +18292,12 @@ return { linebreak="cm", unicodeslot=0xC83, }, + [0xC84]={ + category="po", + direction="l", + linebreak="bb", + unicodeslot=0xC84, + }, [0xC85]={ category="lo", direction="l", @@ -22474,234 +22540,273 @@ return { [0x1000]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1000, }, [0x1001]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1001, }, [0x1002]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1002, }, [0x1003]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1003, }, [0x1004]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1004, }, [0x1005]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1005, }, [0x1006]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1006, }, [0x1007]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1007, }, [0x1008]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1008, }, [0x1009]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1009, }, [0x100A]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x100A, }, [0x100B]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x100B, }, [0x100C]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x100C, }, [0x100D]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x100D, }, [0x100E]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x100E, }, [0x100F]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x100F, }, [0x1010]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1010, }, [0x1011]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1011, }, [0x1012]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1012, }, [0x1013]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1013, }, [0x1014]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1014, }, [0x1015]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1015, }, [0x1016]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1016, }, [0x1017]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1017, }, [0x1018]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1018, }, [0x1019]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1019, }, [0x101A]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x101A, }, [0x101B]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x101B, }, [0x101C]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x101C, }, [0x101D]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x101D, }, [0x101E]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x101E, }, [0x101F]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x101F, }, [0x1020]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1020, }, [0x1021]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1021, }, [0x1022]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1022, }, [0x1023]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1023, }, [0x1024]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1024, }, [0x1025]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1025, }, [0x1026]={ category="lo", direction="l", + indic="i", linebreak="sa", specials={ "char", 0x1025, 0x102E }, unicodeslot=0x1026, @@ -22709,726 +22814,904 @@ return { [0x1027]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1027, }, [0x1028]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1028, }, [0x1029]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1029, }, [0x102A]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x102A, }, [0x102B]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x102B, }, [0x102C]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x102C, }, [0x102D]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x102D, }, [0x102E]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x102E, }, [0x102F]={ category="mn", direction="nsm", + indic="d", + indicmark="b", linebreak="sa", unicodeslot=0x102F, }, [0x1030]={ category="mn", direction="nsm", + indic="d", + indicmark="b", linebreak="sa", unicodeslot=0x1030, }, [0x1031]={ category="mc", direction="l", + indic="d", + indicmark="l", linebreak="sa", unicodeslot=0x1031, }, [0x1032]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1032, }, [0x1033]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1033, }, [0x1034]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1034, }, [0x1035]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1035, }, [0x1036]={ category="mn", direction="nsm", + indic="m", + indicmark="t", linebreak="sa", unicodeslot=0x1036, }, [0x1037]={ category="mn", direction="nsm", + indic="s", + indicmark="b", linebreak="sa", unicodeslot=0x1037, }, [0x1038]={ category="mc", direction="l", + indic="m", + indicmark="r", linebreak="sa", unicodeslot=0x1038, }, [0x1039]={ category="mn", direction="nsm", + indic="m", + indicmark="b", linebreak="sa", unicodeslot=0x1039, }, [0x103A]={ category="mn", direction="nsm", + indic="m", + indicmark="t", linebreak="sa", unicodeslot=0x103A, }, [0x103B]={ category="mc", direction="l", + indic="c", + indicmark="r", linebreak="sa", unicodeslot=0x103B, }, [0x103C]={ category="mc", direction="l", + indic="c", linebreak="sa", unicodeslot=0x103C, }, [0x103D]={ category="mn", direction="nsm", + indic="c", + indicmark="b", linebreak="sa", unicodeslot=0x103D, }, [0x103E]={ category="mn", direction="nsm", + indic="c", + indicmark="b", linebreak="sa", unicodeslot=0x103E, }, [0x103F]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x103F, }, [0x1040]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1040, }, [0x1041]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1041, }, [0x1042]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1042, }, [0x1043]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1043, }, [0x1044]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1044, }, [0x1045]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1045, }, [0x1046]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1046, }, [0x1047]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1047, }, [0x1048]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1048, }, [0x1049]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1049, }, [0x104A]={ category="po", direction="l", + indic="o", linebreak="ba", unicodeslot=0x104A, }, [0x104B]={ category="po", direction="l", + indic="o", linebreak="ba", unicodeslot=0x104B, }, [0x104C]={ category="po", direction="l", + indic="o", linebreak="al", unicodeslot=0x104C, }, [0x104D]={ category="po", direction="l", + indic="o", linebreak="al", unicodeslot=0x104D, }, [0x104E]={ category="po", direction="l", + indic="o", linebreak="al", unicodeslot=0x104E, }, [0x104F]={ category="po", direction="l", + indic="o", linebreak="al", unicodeslot=0x104F, }, [0x1050]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1050, }, [0x1051]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1051, }, [0x1052]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1052, }, [0x1053]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1053, }, [0x1054]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1054, }, [0x1055]={ category="lo", direction="l", + indic="i", linebreak="sa", unicodeslot=0x1055, }, [0x1056]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x1056, }, [0x1057]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x1057, }, [0x1058]={ category="mn", direction="nsm", + indic="d", + indicmark="b", linebreak="sa", unicodeslot=0x1058, }, [0x1059]={ category="mn", direction="nsm", + indic="d", + indicmark="b", linebreak="sa", unicodeslot=0x1059, }, [0x105A]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x105A, }, [0x105B]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x105B, }, [0x105C]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x105C, }, [0x105D]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x105D, }, [0x105E]={ category="mn", direction="nsm", + indic="c", + indicmark="b", linebreak="sa", unicodeslot=0x105E, }, [0x105F]={ category="mn", direction="nsm", + indic="c", + indicmark="b", linebreak="sa", unicodeslot=0x105F, }, [0x1060]={ category="mn", direction="nsm", + indic="c", + indicmark="b", linebreak="sa", unicodeslot=0x1060, }, [0x1061]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1061, }, [0x1062]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x1062, }, [0x1063]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x1063, }, [0x1064]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x1064, }, [0x1065]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1065, }, [0x1066]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1066, }, [0x1067]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x1067, }, [0x1068]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x1068, }, [0x1069]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x1069, }, [0x106A]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x106A, }, [0x106B]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x106B, }, [0x106C]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x106C, }, [0x106D]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x106D, }, [0x106E]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x106E, }, [0x106F]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x106F, }, [0x1070]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1070, }, [0x1071]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1071, }, [0x1072]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1072, }, [0x1073]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1073, }, [0x1074]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1074, }, [0x1075]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1075, }, [0x1076]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1076, }, [0x1077]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1077, }, [0x1078]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1078, }, [0x1079]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1079, }, [0x107A]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x107A, }, [0x107B]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x107B, }, [0x107C]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x107C, }, [0x107D]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x107D, }, [0x107E]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x107E, }, [0x107F]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x107F, }, [0x1080]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1080, }, [0x1081]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x1081, }, [0x1082]={ category="mn", direction="nsm", + indic="c", + indicmark="b", linebreak="sa", unicodeslot=0x1082, }, [0x1083]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x1083, }, [0x1084]={ category="mc", direction="l", + indic="d", + indicmark="l", linebreak="sa", unicodeslot=0x1084, }, [0x1085]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1085, }, [0x1086]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x1086, }, [0x1087]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x1087, }, [0x1088]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x1088, }, [0x1089]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x1089, }, [0x108A]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x108A, }, [0x108B]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x108B, }, [0x108C]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x108C, }, [0x108D]={ category="mn", direction="nsm", + indic="s", + indicmark="b", linebreak="sa", unicodeslot=0x108D, }, [0x108E]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0x108E, }, [0x108F]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x108F, }, [0x1090]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1090, }, [0x1091]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1091, }, [0x1092]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1092, }, [0x1093]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1093, }, [0x1094]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1094, }, [0x1095]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1095, }, [0x1096]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1096, }, [0x1097]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1097, }, [0x1098]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1098, }, [0x1099]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0x1099, }, [0x109A]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x109A, }, [0x109B]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0x109B, }, [0x109C]={ category="mc", direction="l", + indic="d", + indicmark="r", linebreak="sa", unicodeslot=0x109C, }, [0x109D]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0x109D, }, [0x109E]={ category="so", direction="l", + indic="o", linebreak="sa", unicodeslot=0x109E, }, [0x109F]={ category="so", direction="l", + indic="o", linebreak="sa", unicodeslot=0x109F, }, @@ -34751,6 +35034,12 @@ return { linebreak="al", unicodeslot=0x1877, }, + [0x1878]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1878, + }, [0x1880]={ category="lo", direction="l", @@ -40012,6 +40301,282 @@ return { linebreak="al", unicodeslot=0x1C88, }, + [0x1C90]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C90, + }, + [0x1C91]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C91, + }, + [0x1C92]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C92, + }, + [0x1C93]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C93, + }, + [0x1C94]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C94, + }, + [0x1C95]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C95, + }, + [0x1C96]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C96, + }, + [0x1C97]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C97, + }, + [0x1C98]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C98, + }, + [0x1C99]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C99, + }, + [0x1C9A]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C9A, + }, + [0x1C9B]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C9B, + }, + [0x1C9C]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C9C, + }, + [0x1C9D]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C9D, + }, + [0x1C9E]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C9E, + }, + [0x1C9F]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1C9F, + }, + [0x1CA0]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA0, + }, + [0x1CA1]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA1, + }, + [0x1CA2]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA2, + }, + [0x1CA3]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA3, + }, + [0x1CA4]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA4, + }, + [0x1CA5]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA5, + }, + [0x1CA6]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA6, + }, + [0x1CA7]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA7, + }, + [0x1CA8]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA8, + }, + [0x1CA9]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CA9, + }, + [0x1CAA]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CAA, + }, + [0x1CAB]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CAB, + }, + [0x1CAC]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CAC, + }, + [0x1CAD]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CAD, + }, + [0x1CAE]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CAE, + }, + [0x1CAF]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CAF, + }, + [0x1CB0]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB0, + }, + [0x1CB1]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB1, + }, + [0x1CB2]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB2, + }, + [0x1CB3]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB3, + }, + [0x1CB4]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB4, + }, + [0x1CB5]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB5, + }, + [0x1CB6]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB6, + }, + [0x1CB7]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB7, + }, + [0x1CB8]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB8, + }, + [0x1CB9]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CB9, + }, + [0x1CBA]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CBA, + }, + [0x1CBD]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CBD, + }, + [0x1CBE]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CBE, + }, + [0x1CBF]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x1CBF, + }, [0x1CC0]={ category="po", direction="l", @@ -48569,24 +49134,28 @@ return { category="sm", direction="on", linebreak="ai", + mirror=0x2BFE, unicodeslot=0x221F, }, [0x2220]={ category="sm", direction="on", linebreak="ai", + mirror=0x29A3, unicodeslot=0x2220, }, [0x2221]={ category="sm", direction="on", linebreak="al", + mirror=0x299B, unicodeslot=0x2221, }, [0x2222]={ category="sm", direction="on", linebreak="al", + mirror=0x29A0, unicodeslot=0x2222, }, [0x2223]={ @@ -48599,6 +49168,7 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2AEE, specials={ "char", 0x2223, 0x338 }, unicodeslot=0x2224, }, @@ -48808,6 +49378,7 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x224C, unicodeslot=0x2245, }, [0x2246]={ @@ -48852,6 +49423,7 @@ return { category="sm", direction="on", linebreak="ai", + mirror=0x2245, unicodeslot=0x224C, }, [0x224D]={ @@ -49582,6 +50154,7 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x27DC, unicodeslot=0x22B8, }, [0x22B9]={ @@ -57424,6 +57997,7 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x22B8, unicodeslot=0x27DC, }, [0x27DD]={ @@ -60146,6 +60720,7 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2221, unicodeslot=0x299B, }, [0x299C]={ @@ -60176,6 +60751,7 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2222, unicodeslot=0x29A0, }, [0x29A1]={ @@ -60194,18 +60770,21 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2220, unicodeslot=0x29A3, }, [0x29A4]={ category="sm", direction="on", linebreak="al", + mirror=0x29A5, unicodeslot=0x29A4, }, [0x29A5]={ category="sm", direction="on", linebreak="al", + mirror=0x29A4, unicodeslot=0x29A5, }, [0x29A6]={ @@ -60224,48 +60803,56 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x29A9, unicodeslot=0x29A8, }, [0x29A9]={ category="sm", direction="on", linebreak="al", + mirror=0x29A8, unicodeslot=0x29A9, }, [0x29AA]={ category="sm", direction="on", linebreak="al", + mirror=0x29AB, unicodeslot=0x29AA, }, [0x29AB]={ category="sm", direction="on", linebreak="al", + mirror=0x29AA, unicodeslot=0x29AB, }, [0x29AC]={ category="sm", direction="on", linebreak="al", + mirror=0x29AD, unicodeslot=0x29AC, }, [0x29AD]={ category="sm", direction="on", linebreak="al", + mirror=0x29AC, unicodeslot=0x29AD, }, [0x29AE]={ category="sm", direction="on", linebreak="al", + mirror=0x29AF, unicodeslot=0x29AE, }, [0x29AF]={ category="sm", direction="on", linebreak="al", + mirror=0x29AE, unicodeslot=0x29AF, }, [0x29B0]={ @@ -60623,12 +61210,14 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x29E9, unicodeslot=0x29E8, }, [0x29E9]={ category="sm", direction="on", linebreak="al", + mirror=0x29E8, unicodeslot=0x29E9, }, [0x29EA]={ @@ -61526,12 +62115,14 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2A7C, unicodeslot=0x2A7B, }, [0x2A7C]={ category="sm", direction="on", linebreak="al", + mirror=0x2A7B, unicodeslot=0x2A7C, }, [0x2A7D]={ @@ -61594,36 +62185,42 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2A86, unicodeslot=0x2A85, }, [0x2A86]={ category="sm", direction="on", linebreak="al", + mirror=0x2A85, unicodeslot=0x2A86, }, [0x2A87]={ category="sm", direction="on", linebreak="al", + mirror=0x2A88, unicodeslot=0x2A87, }, [0x2A88]={ category="sm", direction="on", linebreak="al", + mirror=0x2A87, unicodeslot=0x2A88, }, [0x2A89]={ category="sm", direction="on", linebreak="al", + mirror=0x2A8A, unicodeslot=0x2A89, }, [0x2A8A]={ category="sm", direction="on", linebreak="al", + mirror=0x2A89, unicodeslot=0x2A8A, }, [0x2A8B]={ @@ -61644,24 +62241,28 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2A8E, unicodeslot=0x2A8D, }, [0x2A8E]={ category="sm", direction="on", linebreak="al", + mirror=0x2A8D, unicodeslot=0x2A8E, }, [0x2A8F]={ category="sm", direction="on", linebreak="al", + mirror=0x2A90, unicodeslot=0x2A8F, }, [0x2A90]={ category="sm", direction="on", linebreak="al", + mirror=0x2A8F, unicodeslot=0x2A90, }, [0x2A91]={ @@ -61752,24 +62353,28 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2A9E, unicodeslot=0x2A9D, }, [0x2A9E]={ category="sm", direction="on", linebreak="al", + mirror=0x2A9D, unicodeslot=0x2A9E, }, [0x2A9F]={ category="sm", direction="on", linebreak="al", + mirror=0x2AA0, unicodeslot=0x2A9F, }, [0x2AA0]={ category="sm", direction="on", linebreak="al", + mirror=0x2A9F, unicodeslot=0x2AA0, }, [0x2AA1]={ @@ -61884,12 +62489,14 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2AB2, unicodeslot=0x2AB1, }, [0x2AB2]={ category="sm", direction="on", linebreak="al", + mirror=0x2AB1, unicodeslot=0x2AB2, }, [0x2AB3]={ @@ -61910,36 +62517,42 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2AB6, unicodeslot=0x2AB5, }, [0x2AB6]={ category="sm", direction="on", linebreak="al", + mirror=0x2AB5, unicodeslot=0x2AB6, }, [0x2AB7]={ category="sm", direction="on", linebreak="al", + mirror=0x2AB8, unicodeslot=0x2AB7, }, [0x2AB8]={ category="sm", direction="on", linebreak="al", + mirror=0x2AB7, unicodeslot=0x2AB8, }, [0x2AB9]={ category="sm", direction="on", linebreak="al", + mirror=0x2ABA, unicodeslot=0x2AB9, }, [0x2ABA]={ category="sm", direction="on", linebreak="al", + mirror=0x2AB9, unicodeslot=0x2ABA, }, [0x2ABB]={ @@ -62030,36 +62643,42 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2AC8, unicodeslot=0x2AC7, }, [0x2AC8]={ category="sm", direction="on", linebreak="al", + mirror=0x2AC7, unicodeslot=0x2AC8, }, [0x2AC9]={ category="sm", direction="on", linebreak="al", + mirror=0x2ACA, unicodeslot=0x2AC9, }, [0x2ACA]={ category="sm", direction="on", linebreak="al", + mirror=0x2AC9, unicodeslot=0x2ACA, }, [0x2ACB]={ category="sm", direction="on", linebreak="al", + mirror=0x2ACC, unicodeslot=0x2ACB, }, [0x2ACC]={ category="sm", direction="on", linebreak="al", + mirror=0x2ACB, unicodeslot=0x2ACC, }, [0x2ACD]={ @@ -62281,6 +62900,7 @@ return { category="sm", direction="on", linebreak="al", + mirror=0x2224, unicodeslot=0x2AEE, }, [0x2AEF]={ @@ -63481,6 +64101,24 @@ return { linebreak="al", unicodeslot=0x2BB9, }, + [0x2BBA]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BBA, + }, + [0x2BBB]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BBB, + }, + [0x2BBC]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BBC, + }, [0x2BBD]={ category="so", direction="on", @@ -63607,6 +64245,156 @@ return { linebreak="al", unicodeslot=0x2BD2, }, + [0x2BD3]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BD3, + }, + [0x2BD4]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BD4, + }, + [0x2BD5]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BD5, + }, + [0x2BD6]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BD6, + }, + [0x2BD7]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BD7, + }, + [0x2BD8]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BD8, + }, + [0x2BD9]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BD9, + }, + [0x2BDA]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BDA, + }, + [0x2BDB]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BDB, + }, + [0x2BDC]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BDC, + }, + [0x2BDD]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BDD, + }, + [0x2BDE]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BDE, + }, + [0x2BDF]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BDF, + }, + [0x2BE0]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE0, + }, + [0x2BE1]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE1, + }, + [0x2BE2]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE2, + }, + [0x2BE3]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE3, + }, + [0x2BE4]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE4, + }, + [0x2BE5]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE5, + }, + [0x2BE6]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE6, + }, + [0x2BE7]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE7, + }, + [0x2BE8]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE8, + }, + [0x2BE9]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BE9, + }, + [0x2BEA]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BEA, + }, + [0x2BEB]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BEB, + }, [0x2BEC]={ category="so", direction="on", @@ -63631,6 +64419,97 @@ return { linebreak="al", unicodeslot=0x2BEF, }, + [0x2BF0]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF0, + }, + [0x2BF1]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF1, + }, + [0x2BF2]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF2, + }, + [0x2BF3]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF3, + }, + [0x2BF4]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF4, + }, + [0x2BF5]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF5, + }, + [0x2BF6]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF6, + }, + [0x2BF7]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF7, + }, + [0x2BF8]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF8, + }, + [0x2BF9]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BF9, + }, + [0x2BFA]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BFA, + }, + [0x2BFB]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BFB, + }, + [0x2BFC]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BFC, + }, + [0x2BFD]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x2BFD, + }, + [0x2BFE]={ + category="so", + direction="on", + linebreak="al", + mirror=0x221F, + unicodeslot=0x2BFE, + }, [0x2C00]={ category="lu", direction="l", @@ -66852,6 +67731,36 @@ return { linebreak="ba", unicodeslot=0x2E49, }, + [0x2E4A]={ + category="po", + direction="on", + linebreak="ba", + unicodeslot=0x2E4A, + }, + [0x2E4B]={ + category="po", + direction="on", + linebreak="al", + unicodeslot=0x2E4B, + }, + [0x2E4C]={ + category="po", + direction="on", + linebreak="ba", + unicodeslot=0x2E4C, + }, + [0x2E4D]={ + category="po", + direction="on", + linebreak="al", + unicodeslot=0x2E4D, + }, + [0x2E4E]={ + category="po", + direction="on", + linebreak="ba", + unicodeslot=0x2E4E, + }, [0x2E80]={ category="so", direction="on", @@ -70969,6 +71878,12 @@ return { linebreak="id", unicodeslot=0x312E, }, + [0x312F]={ + category="lo", + direction="l", + linebreak="id", + unicodeslot=0x312F, + }, [0x3131]={ category="lo", direction="l", @@ -87721,6 +88636,12 @@ return { linebreak="al", unicodeslot=0xA7AE, }, + [0xA7AF]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0xA7AF, + }, [0xA7B0]={ category="lu", direction="l", @@ -87769,6 +88690,18 @@ return { linebreak="al", unicodeslot=0xA7B7, }, + [0xA7B8]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0xA7B8, + }, + [0xA7B9]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0xA7B9, + }, [0xA7F7]={ category="lo", direction="l", @@ -89193,6 +90126,18 @@ return { linebreak="al", unicodeslot=0xA8FD, }, + [0xA8FE]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0xA8FE, + }, + [0xA8FF]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0xA8FF, + }, [0xA900]={ category="nd", direction="l", @@ -90426,186 +91371,218 @@ return { [0xA9E0]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9E0, }, [0xA9E1]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9E1, }, [0xA9E2]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9E2, }, [0xA9E3]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9E3, }, [0xA9E4]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9E4, }, [0xA9E5]={ category="mn", direction="nsm", + indic="d", + indicmark="t", linebreak="sa", unicodeslot=0xA9E5, }, [0xA9E6]={ category="lm", direction="l", + indic="o", linebreak="sa", unicodeslot=0xA9E6, }, [0xA9E7]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9E7, }, [0xA9E8]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9E8, }, [0xA9E9]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9E9, }, [0xA9EA]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9EA, }, [0xA9EB]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9EB, }, [0xA9EC]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9EC, }, [0xA9ED]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9ED, }, [0xA9EE]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9EE, }, [0xA9EF]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9EF, }, [0xA9F0]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F0, }, [0xA9F1]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F1, }, [0xA9F2]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F2, }, [0xA9F3]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F3, }, [0xA9F4]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F4, }, [0xA9F5]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F5, }, [0xA9F6]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F6, }, [0xA9F7]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F7, }, [0xA9F8]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F8, }, [0xA9F9]={ category="nd", direction="l", + indic="o", linebreak="nu", unicodeslot=0xA9F9, }, [0xA9FA]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9FA, }, [0xA9FB]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9FB, }, [0xA9FC]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9FC, }, [0xA9FD]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9FD, }, [0xA9FE]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xA9FE, }, @@ -91110,66 +92087,77 @@ return { [0xAA60]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA60, }, [0xAA61]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA61, }, [0xAA62]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA62, }, [0xAA63]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA63, }, [0xAA64]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA64, }, [0xAA65]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA65, }, [0xAA66]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA66, }, [0xAA67]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA67, }, [0xAA68]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA68, }, [0xAA69]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA69, }, [0xAA6A]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA6A, }, @@ -91182,120 +92170,143 @@ return { [0xAA6C]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA6C, }, [0xAA6D]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA6D, }, [0xAA6E]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA6E, }, [0xAA6F]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA6F, }, [0xAA70]={ category="lm", direction="l", + indic="o", linebreak="sa", unicodeslot=0xAA70, }, [0xAA71]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA71, }, [0xAA72]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA72, }, [0xAA73]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA73, }, [0xAA74]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA74, }, [0xAA75]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA75, }, [0xAA76]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA76, }, [0xAA77]={ category="so", direction="l", + indic="o", linebreak="sa", unicodeslot=0xAA77, }, [0xAA78]={ category="so", direction="l", + indic="o", linebreak="sa", unicodeslot=0xAA78, }, [0xAA79]={ category="so", direction="l", + indic="o", linebreak="sa", unicodeslot=0xAA79, }, [0xAA7A]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA7A, }, [0xAA7B]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0xAA7B, }, [0xAA7C]={ category="mn", direction="nsm", + indic="s", + indicmark="t", linebreak="sa", unicodeslot=0xAA7C, }, [0xAA7D]={ category="mc", direction="l", + indic="s", + indicmark="r", linebreak="sa", unicodeslot=0xAA7D, }, [0xAA7E]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA7E, }, [0xAA7F]={ category="lo", direction="l", + indic="c", linebreak="sa", unicodeslot=0xAA7F, }, @@ -115533,6 +116544,18 @@ return { linebreak="al", unicodeslot=0x10A33, }, + [0x10A34]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10A34, + }, + [0x10A35]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10A35, + }, [0x10A38]={ category="mn", direction="nsm", @@ -115605,6 +116628,12 @@ return { linebreak="al", unicodeslot=0x10A47, }, + [0x10A48]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10A48, + }, [0x10A50]={ category="po", direction="r", @@ -118317,6 +119346,306 @@ return { linebreak="al", unicodeslot=0x10CFF, }, + [0x10D00]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D00, + }, + [0x10D01]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D01, + }, + [0x10D02]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D02, + }, + [0x10D03]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D03, + }, + [0x10D04]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D04, + }, + [0x10D05]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D05, + }, + [0x10D06]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D06, + }, + [0x10D07]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D07, + }, + [0x10D08]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D08, + }, + [0x10D09]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D09, + }, + [0x10D0A]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D0A, + }, + [0x10D0B]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D0B, + }, + [0x10D0C]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D0C, + }, + [0x10D0D]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D0D, + }, + [0x10D0E]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D0E, + }, + [0x10D0F]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D0F, + }, + [0x10D10]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D10, + }, + [0x10D11]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D11, + }, + [0x10D12]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D12, + }, + [0x10D13]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D13, + }, + [0x10D14]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D14, + }, + [0x10D15]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D15, + }, + [0x10D16]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D16, + }, + [0x10D17]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D17, + }, + [0x10D18]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D18, + }, + [0x10D19]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D19, + }, + [0x10D1A]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D1A, + }, + [0x10D1B]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D1B, + }, + [0x10D1C]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D1C, + }, + [0x10D1D]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D1D, + }, + [0x10D1E]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D1E, + }, + [0x10D1F]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D1F, + }, + [0x10D20]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D20, + }, + [0x10D21]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D21, + }, + [0x10D22]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D22, + }, + [0x10D23]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10D23, + }, + [0x10D24]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10D24, + }, + [0x10D25]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10D25, + }, + [0x10D26]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10D26, + }, + [0x10D27]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10D27, + }, + [0x10D30]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D30, + }, + [0x10D31]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D31, + }, + [0x10D32]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D32, + }, + [0x10D33]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D33, + }, + [0x10D34]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D34, + }, + [0x10D35]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D35, + }, + [0x10D36]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D36, + }, + [0x10D37]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D37, + }, + [0x10D38]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D38, + }, + [0x10D39]={ + category="nd", + direction="an", + linebreak="nu", + unicodeslot=0x10D39, + }, [0x10E60]={ category="no", direction="an", @@ -118503,6 +119832,498 @@ return { linebreak="al", unicodeslot=0x10E7E, }, + [0x10F00]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F00, + }, + [0x10F01]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F01, + }, + [0x10F02]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F02, + }, + [0x10F03]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F03, + }, + [0x10F04]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F04, + }, + [0x10F05]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F05, + }, + [0x10F06]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F06, + }, + [0x10F07]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F07, + }, + [0x10F08]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F08, + }, + [0x10F09]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F09, + }, + [0x10F0A]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F0A, + }, + [0x10F0B]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F0B, + }, + [0x10F0C]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F0C, + }, + [0x10F0D]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F0D, + }, + [0x10F0E]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F0E, + }, + [0x10F0F]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F0F, + }, + [0x10F10]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F10, + }, + [0x10F11]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F11, + }, + [0x10F12]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F12, + }, + [0x10F13]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F13, + }, + [0x10F14]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F14, + }, + [0x10F15]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F15, + }, + [0x10F16]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F16, + }, + [0x10F17]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F17, + }, + [0x10F18]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F18, + }, + [0x10F19]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F19, + }, + [0x10F1A]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F1A, + }, + [0x10F1B]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F1B, + }, + [0x10F1C]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F1C, + }, + [0x10F1D]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F1D, + }, + [0x10F1E]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F1E, + }, + [0x10F1F]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F1F, + }, + [0x10F20]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F20, + }, + [0x10F21]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F21, + }, + [0x10F22]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F22, + }, + [0x10F23]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F23, + }, + [0x10F24]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F24, + }, + [0x10F25]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F25, + }, + [0x10F26]={ + category="no", + direction="r", + linebreak="al", + unicodeslot=0x10F26, + }, + [0x10F27]={ + category="lo", + direction="r", + linebreak="al", + unicodeslot=0x10F27, + }, + [0x10F30]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F30, + }, + [0x10F31]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F31, + }, + [0x10F32]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F32, + }, + [0x10F33]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F33, + }, + [0x10F34]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F34, + }, + [0x10F35]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F35, + }, + [0x10F36]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F36, + }, + [0x10F37]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F37, + }, + [0x10F38]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F38, + }, + [0x10F39]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F39, + }, + [0x10F3A]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F3A, + }, + [0x10F3B]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F3B, + }, + [0x10F3C]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F3C, + }, + [0x10F3D]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F3D, + }, + [0x10F3E]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F3E, + }, + [0x10F3F]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F3F, + }, + [0x10F40]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F40, + }, + [0x10F41]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F41, + }, + [0x10F42]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F42, + }, + [0x10F43]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F43, + }, + [0x10F44]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F44, + }, + [0x10F45]={ + category="lo", + direction="al", + linebreak="al", + unicodeslot=0x10F45, + }, + [0x10F46]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F46, + }, + [0x10F47]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F47, + }, + [0x10F48]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F48, + }, + [0x10F49]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F49, + }, + [0x10F4A]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4A, + }, + [0x10F4B]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4B, + }, + [0x10F4C]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4C, + }, + [0x10F4D]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4D, + }, + [0x10F4E]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4E, + }, + [0x10F4F]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F4F, + }, + [0x10F50]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x10F50, + }, + [0x10F51]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x10F51, + }, + [0x10F52]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x10F52, + }, + [0x10F53]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x10F53, + }, + [0x10F54]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x10F54, + }, + [0x10F55]={ + category="po", + direction="al", + linebreak="al", + unicodeslot=0x10F55, + }, + [0x10F56]={ + category="po", + direction="al", + linebreak="al", + unicodeslot=0x10F56, + }, + [0x10F57]={ + category="po", + direction="al", + linebreak="al", + unicodeslot=0x10F57, + }, + [0x10F58]={ + category="po", + direction="al", + linebreak="al", + unicodeslot=0x10F58, + }, + [0x10F59]={ + category="po", + direction="al", + linebreak="al", + unicodeslot=0x10F59, + }, [0x11000]={ category="mc", direction="l", @@ -119556,6 +121377,12 @@ return { linebreak="ba", unicodeslot=0x110C1, }, + [0x110CD]={ + category="cf", + direction="l", + linebreak="al", + unicodeslot=0x110CD, + }, [0x110D0]={ category="lo", direction="l", @@ -120170,6 +121997,24 @@ return { linebreak="ba", unicodeslot=0x11143, }, + [0x11144]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11144, + }, + [0x11145]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11145, + }, + [0x11146]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11146, + }, [0x11150]={ category="lo", direction="l", @@ -120844,8 +122689,8 @@ return { }, [0x111C9]={ category="po", - direction="l", - linebreak="al", + direction="nsm", + linebreak="cm", unicodeslot=0x111C9, }, [0x111CA]={ @@ -122402,6 +124247,12 @@ return { linebreak="al", unicodeslot=0x11339, }, + [0x1133B]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x1133B, + }, [0x1133C]={ category="mn", direction="nsm", @@ -123166,6 +125017,12 @@ return { linebreak="al", unicodeslot=0x1145D, }, + [0x1145E]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x1145E, + }, [0x11480]={ category="lo", direction="l", @@ -125319,6 +127176,12 @@ return { linebreak="sa", unicodeslot=0x11719, }, + [0x1171A]={ + category="lo", + direction="l", + linebreak="sa", + unicodeslot=0x1171A, + }, [0x1171D]={ category="mn", direction="nsm", @@ -125505,6 +127368,366 @@ return { linebreak="sa", unicodeslot=0x1173F, }, + [0x11800]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11800, + }, + [0x11801]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11801, + }, + [0x11802]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11802, + }, + [0x11803]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11803, + }, + [0x11804]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11804, + }, + [0x11805]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11805, + }, + [0x11806]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11806, + }, + [0x11807]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11807, + }, + [0x11808]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11808, + }, + [0x11809]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11809, + }, + [0x1180A]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1180A, + }, + [0x1180B]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1180B, + }, + [0x1180C]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1180C, + }, + [0x1180D]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1180D, + }, + [0x1180E]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1180E, + }, + [0x1180F]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1180F, + }, + [0x11810]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11810, + }, + [0x11811]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11811, + }, + [0x11812]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11812, + }, + [0x11813]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11813, + }, + [0x11814]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11814, + }, + [0x11815]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11815, + }, + [0x11816]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11816, + }, + [0x11817]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11817, + }, + [0x11818]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11818, + }, + [0x11819]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11819, + }, + [0x1181A]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1181A, + }, + [0x1181B]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1181B, + }, + [0x1181C]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1181C, + }, + [0x1181D]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1181D, + }, + [0x1181E]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1181E, + }, + [0x1181F]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1181F, + }, + [0x11820]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11820, + }, + [0x11821]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11821, + }, + [0x11822]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11822, + }, + [0x11823]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11823, + }, + [0x11824]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11824, + }, + [0x11825]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11825, + }, + [0x11826]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11826, + }, + [0x11827]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11827, + }, + [0x11828]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11828, + }, + [0x11829]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11829, + }, + [0x1182A]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1182A, + }, + [0x1182B]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x1182B, + }, + [0x1182C]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x1182C, + }, + [0x1182D]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x1182D, + }, + [0x1182E]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x1182E, + }, + [0x1182F]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x1182F, + }, + [0x11830]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11830, + }, + [0x11831]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11831, + }, + [0x11832]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11832, + }, + [0x11833]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11833, + }, + [0x11834]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11834, + }, + [0x11835]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11835, + }, + [0x11836]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11836, + }, + [0x11837]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11837, + }, + [0x11838]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11838, + }, + [0x11839]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11839, + }, + [0x1183A]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x1183A, + }, + [0x1183B]={ + category="po", + direction="l", + linebreak="al", + unicodeslot=0x1183B, + }, [0x118A0]={ category="lu", direction="l", @@ -126891,6 +129114,12 @@ return { linebreak="ba", unicodeslot=0x11A9C, }, + [0x11A9D]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11A9D, + }, [0x11A9E]={ category="po", direction="l", @@ -128703,6 +130932,534 @@ return { linebreak="nu", unicodeslot=0x11D59, }, + [0x11D60]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D60, + }, + [0x11D61]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D61, + }, + [0x11D62]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D62, + }, + [0x11D63]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D63, + }, + [0x11D64]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D64, + }, + [0x11D65]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D65, + }, + [0x11D67]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D67, + }, + [0x11D68]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D68, + }, + [0x11D6A]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D6A, + }, + [0x11D6B]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D6B, + }, + [0x11D6C]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D6C, + }, + [0x11D6D]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D6D, + }, + [0x11D6E]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D6E, + }, + [0x11D6F]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D6F, + }, + [0x11D70]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D70, + }, + [0x11D71]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D71, + }, + [0x11D72]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D72, + }, + [0x11D73]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D73, + }, + [0x11D74]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D74, + }, + [0x11D75]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D75, + }, + [0x11D76]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D76, + }, + [0x11D77]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D77, + }, + [0x11D78]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D78, + }, + [0x11D79]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D79, + }, + [0x11D7A]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D7A, + }, + [0x11D7B]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D7B, + }, + [0x11D7C]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D7C, + }, + [0x11D7D]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D7D, + }, + [0x11D7E]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D7E, + }, + [0x11D7F]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D7F, + }, + [0x11D80]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D80, + }, + [0x11D81]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D81, + }, + [0x11D82]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D82, + }, + [0x11D83]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D83, + }, + [0x11D84]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D84, + }, + [0x11D85]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D85, + }, + [0x11D86]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D86, + }, + [0x11D87]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D87, + }, + [0x11D88]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D88, + }, + [0x11D89]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D89, + }, + [0x11D8A]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11D8A, + }, + [0x11D8B]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11D8B, + }, + [0x11D8C]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11D8C, + }, + [0x11D8D]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11D8D, + }, + [0x11D8E]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11D8E, + }, + [0x11D90]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D90, + }, + [0x11D91]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D91, + }, + [0x11D93]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11D93, + }, + [0x11D94]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11D94, + }, + [0x11D95]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D95, + }, + [0x11D96]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11D96, + }, + [0x11D97]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11D97, + }, + [0x11D98]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11D98, + }, + [0x11DA0]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA0, + }, + [0x11DA1]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA1, + }, + [0x11DA2]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA2, + }, + [0x11DA3]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA3, + }, + [0x11DA4]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA4, + }, + [0x11DA5]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA5, + }, + [0x11DA6]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA6, + }, + [0x11DA7]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA7, + }, + [0x11DA8]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA8, + }, + [0x11DA9]={ + category="nd", + direction="l", + linebreak="nu", + unicodeslot=0x11DA9, + }, + [0x11EE0]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE0, + }, + [0x11EE1]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE1, + }, + [0x11EE2]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE2, + }, + [0x11EE3]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE3, + }, + [0x11EE4]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE4, + }, + [0x11EE5]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE5, + }, + [0x11EE6]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE6, + }, + [0x11EE7]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE7, + }, + [0x11EE8]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE8, + }, + [0x11EE9]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EE9, + }, + [0x11EEA]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EEA, + }, + [0x11EEB]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EEB, + }, + [0x11EEC]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EEC, + }, + [0x11EED]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EED, + }, + [0x11EEE]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EEE, + }, + [0x11EEF]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EEF, + }, + [0x11EF0]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EF0, + }, + [0x11EF1]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EF1, + }, + [0x11EF2]={ + category="lo", + direction="l", + linebreak="al", + unicodeslot=0x11EF2, + }, + [0x11EF3]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11EF3, + }, + [0x11EF4]={ + category="mn", + direction="nsm", + linebreak="cm", + unicodeslot=0x11EF4, + }, + [0x11EF5]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11EF5, + }, + [0x11EF6]={ + category="mc", + direction="l", + linebreak="cm", + unicodeslot=0x11EF6, + }, + [0x11EF7]={ + category="po", + direction="l", + linebreak="al", + unicodeslot=0x11EF7, + }, + [0x11EF8]={ + category="po", + direction="l", + linebreak="al", + unicodeslot=0x11EF8, + }, [0x12000]={ category="lo", direction="l", @@ -150681,6 +153438,552 @@ return { linebreak="al", unicodeslot=0x16B8F, }, + [0x16E40]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E40, + }, + [0x16E41]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E41, + }, + [0x16E42]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E42, + }, + [0x16E43]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E43, + }, + [0x16E44]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E44, + }, + [0x16E45]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E45, + }, + [0x16E46]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E46, + }, + [0x16E47]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E47, + }, + [0x16E48]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E48, + }, + [0x16E49]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E49, + }, + [0x16E4A]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E4A, + }, + [0x16E4B]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E4B, + }, + [0x16E4C]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E4C, + }, + [0x16E4D]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E4D, + }, + [0x16E4E]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E4E, + }, + [0x16E4F]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E4F, + }, + [0x16E50]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E50, + }, + [0x16E51]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E51, + }, + [0x16E52]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E52, + }, + [0x16E53]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E53, + }, + [0x16E54]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E54, + }, + [0x16E55]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E55, + }, + [0x16E56]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E56, + }, + [0x16E57]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E57, + }, + [0x16E58]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E58, + }, + [0x16E59]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E59, + }, + [0x16E5A]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E5A, + }, + [0x16E5B]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E5B, + }, + [0x16E5C]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E5C, + }, + [0x16E5D]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E5D, + }, + [0x16E5E]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E5E, + }, + [0x16E5F]={ + category="lu", + direction="l", + linebreak="al", + unicodeslot=0x16E5F, + }, + [0x16E60]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E60, + }, + [0x16E61]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E61, + }, + [0x16E62]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E62, + }, + [0x16E63]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E63, + }, + [0x16E64]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E64, + }, + [0x16E65]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E65, + }, + [0x16E66]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E66, + }, + [0x16E67]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E67, + }, + [0x16E68]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E68, + }, + [0x16E69]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E69, + }, + [0x16E6A]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E6A, + }, + [0x16E6B]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E6B, + }, + [0x16E6C]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E6C, + }, + [0x16E6D]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E6D, + }, + [0x16E6E]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E6E, + }, + [0x16E6F]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E6F, + }, + [0x16E70]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E70, + }, + [0x16E71]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E71, + }, + [0x16E72]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E72, + }, + [0x16E73]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E73, + }, + [0x16E74]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E74, + }, + [0x16E75]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E75, + }, + [0x16E76]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E76, + }, + [0x16E77]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E77, + }, + [0x16E78]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E78, + }, + [0x16E79]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E79, + }, + [0x16E7A]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E7A, + }, + [0x16E7B]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E7B, + }, + [0x16E7C]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E7C, + }, + [0x16E7D]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E7D, + }, + [0x16E7E]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E7E, + }, + [0x16E7F]={ + category="ll", + direction="l", + linebreak="al", + unicodeslot=0x16E7F, + }, + [0x16E80]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E80, + }, + [0x16E81]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E81, + }, + [0x16E82]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E82, + }, + [0x16E83]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E83, + }, + [0x16E84]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E84, + }, + [0x16E85]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E85, + }, + [0x16E86]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E86, + }, + [0x16E87]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E87, + }, + [0x16E88]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E88, + }, + [0x16E89]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E89, + }, + [0x16E8A]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E8A, + }, + [0x16E8B]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E8B, + }, + [0x16E8C]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E8C, + }, + [0x16E8D]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E8D, + }, + [0x16E8E]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E8E, + }, + [0x16E8F]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E8F, + }, + [0x16E90]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E90, + }, + [0x16E91]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E91, + }, + [0x16E92]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E92, + }, + [0x16E93]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E93, + }, + [0x16E94]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E94, + }, + [0x16E95]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E95, + }, + [0x16E96]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x16E96, + }, + [0x16E97]={ + category="po", + direction="l", + linebreak="ba", + unicodeslot=0x16E97, + }, + [0x16E98]={ + category="po", + direction="l", + linebreak="ba", + unicodeslot=0x16E98, + }, + [0x16E99]={ + category="po", + direction="l", + linebreak="al", + unicodeslot=0x16E99, + }, + [0x16E9A]={ + category="po", + direction="l", + linebreak="al", + unicodeslot=0x16E9A, + }, [0x16F00]={ category="lo", direction="l", @@ -164296,6 +167599,126 @@ return { linebreak="al", unicodeslot=0x1D245, }, + [0x1D2E0]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E0, + }, + [0x1D2E1]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E1, + }, + [0x1D2E2]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E2, + }, + [0x1D2E3]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E3, + }, + [0x1D2E4]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E4, + }, + [0x1D2E5]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E5, + }, + [0x1D2E6]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E6, + }, + [0x1D2E7]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E7, + }, + [0x1D2E8]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E8, + }, + [0x1D2E9]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2E9, + }, + [0x1D2EA]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2EA, + }, + [0x1D2EB]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2EB, + }, + [0x1D2EC]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2EC, + }, + [0x1D2ED]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2ED, + }, + [0x1D2EE]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2EE, + }, + [0x1D2EF]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2EF, + }, + [0x1D2F0]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2F0, + }, + [0x1D2F1]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2F1, + }, + [0x1D2F2]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2F2, + }, + [0x1D2F3]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D2F3, + }, [0x1D300]={ category="so", direction="on", @@ -164926,6 +168349,48 @@ return { linebreak="al", unicodeslot=0x1D371, }, + [0x1D372]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D372, + }, + [0x1D373]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D373, + }, + [0x1D374]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D374, + }, + [0x1D375]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D375, + }, + [0x1D376]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D376, + }, + [0x1D377]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D377, + }, + [0x1D378]={ + category="no", + direction="l", + linebreak="al", + unicodeslot=0x1D378, + }, [0x1D400]={ category="lu", direction="l", @@ -177958,6 +181423,414 @@ return { linebreak="op", unicodeslot=0x1E95F, }, + [0x1EC71]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC71, + }, + [0x1EC72]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC72, + }, + [0x1EC73]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC73, + }, + [0x1EC74]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC74, + }, + [0x1EC75]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC75, + }, + [0x1EC76]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC76, + }, + [0x1EC77]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC77, + }, + [0x1EC78]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC78, + }, + [0x1EC79]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC79, + }, + [0x1EC7A]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC7A, + }, + [0x1EC7B]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC7B, + }, + [0x1EC7C]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC7C, + }, + [0x1EC7D]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC7D, + }, + [0x1EC7E]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC7E, + }, + [0x1EC7F]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC7F, + }, + [0x1EC80]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC80, + }, + [0x1EC81]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC81, + }, + [0x1EC82]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC82, + }, + [0x1EC83]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC83, + }, + [0x1EC84]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC84, + }, + [0x1EC85]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC85, + }, + [0x1EC86]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC86, + }, + [0x1EC87]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC87, + }, + [0x1EC88]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC88, + }, + [0x1EC89]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC89, + }, + [0x1EC8A]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC8A, + }, + [0x1EC8B]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC8B, + }, + [0x1EC8C]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC8C, + }, + [0x1EC8D]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC8D, + }, + [0x1EC8E]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC8E, + }, + [0x1EC8F]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC8F, + }, + [0x1EC90]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC90, + }, + [0x1EC91]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC91, + }, + [0x1EC92]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC92, + }, + [0x1EC93]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC93, + }, + [0x1EC94]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC94, + }, + [0x1EC95]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC95, + }, + [0x1EC96]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC96, + }, + [0x1EC97]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC97, + }, + [0x1EC98]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC98, + }, + [0x1EC99]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC99, + }, + [0x1EC9A]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC9A, + }, + [0x1EC9B]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC9B, + }, + [0x1EC9C]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC9C, + }, + [0x1EC9D]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC9D, + }, + [0x1EC9E]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC9E, + }, + [0x1EC9F]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1EC9F, + }, + [0x1ECA0]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA0, + }, + [0x1ECA1]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA1, + }, + [0x1ECA2]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA2, + }, + [0x1ECA3]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA3, + }, + [0x1ECA4]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA4, + }, + [0x1ECA5]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA5, + }, + [0x1ECA6]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA6, + }, + [0x1ECA7]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA7, + }, + [0x1ECA8]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA8, + }, + [0x1ECA9]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECA9, + }, + [0x1ECAA]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECAA, + }, + [0x1ECAB]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECAB, + }, + [0x1ECAC]={ + category="so", + direction="al", + linebreak="po", + unicodeslot=0x1ECAC, + }, + [0x1ECAD]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECAD, + }, + [0x1ECAE]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECAE, + }, + [0x1ECAF]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECAF, + }, + [0x1ECB0]={ + category="sc", + direction="al", + linebreak="po", + unicodeslot=0x1ECB0, + }, + [0x1ECB1]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECB1, + }, + [0x1ECB2]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECB2, + }, + [0x1ECB3]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECB3, + }, + [0x1ECB4]={ + category="no", + direction="al", + linebreak="al", + unicodeslot=0x1ECB4, + }, [0x1EE00]={ category="lo", direction="al", @@ -180619,6 +184492,12 @@ return { specials={ "circle", 0x57, 0x5A }, unicodeslot=0x1F12E, }, + [0x1F12F]={ + category="so", + direction="on", + linebreak="al", + unicodeslot=0x1F12F, + }, [0x1F130]={ category="so", direction="l", @@ -187996,6 +191875,12 @@ return { linebreak="id", unicodeslot=0x1F6F8, }, + [0x1F6F9]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F6F9, + }, [0x1F700]={ category="so", direction="on", @@ -189202,6 +193087,30 @@ return { linebreak="al", unicodeslot=0x1F7D4, }, + [0x1F7D5]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F7D5, + }, + [0x1F7D6]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F7D6, + }, + [0x1F7D7]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F7D7, + }, + [0x1F7D8]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F7D8, + }, [0x1F800]={ category="so", direction="on", @@ -190522,6 +194431,24 @@ return { linebreak="id", unicodeslot=0x1F94C, }, + [0x1F94D]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F94D, + }, + [0x1F94E]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F94E, + }, + [0x1F94F]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F94F, + }, [0x1F950]={ category="so", direction="on", @@ -190690,6 +194617,90 @@ return { linebreak="id", unicodeslot=0x1F96B, }, + [0x1F96C]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F96C, + }, + [0x1F96D]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F96D, + }, + [0x1F96E]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F96E, + }, + [0x1F96F]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F96F, + }, + [0x1F970]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F970, + }, + [0x1F973]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F973, + }, + [0x1F974]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F974, + }, + [0x1F975]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F975, + }, + [0x1F976]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F976, + }, + [0x1F97A]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F97A, + }, + [0x1F97C]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F97C, + }, + [0x1F97D]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F97D, + }, + [0x1F97E]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F97E, + }, + [0x1F97F]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F97F, + }, [0x1F980]={ category="so", direction="on", @@ -190834,12 +194845,150 @@ return { linebreak="id", unicodeslot=0x1F997, }, + [0x1F998]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F998, + }, + [0x1F999]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F999, + }, + [0x1F99A]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F99A, + }, + [0x1F99B]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F99B, + }, + [0x1F99C]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F99C, + }, + [0x1F99D]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F99D, + }, + [0x1F99E]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F99E, + }, + [0x1F99F]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F99F, + }, + [0x1F9A0]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9A0, + }, + [0x1F9A1]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9A1, + }, + [0x1F9A2]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9A2, + }, + [0x1F9B0]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9B0, + }, + [0x1F9B1]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9B1, + }, + [0x1F9B2]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9B2, + }, + [0x1F9B3]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9B3, + }, + [0x1F9B4]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9B4, + }, + [0x1F9B5]={ + category="so", + direction="on", + linebreak="eb", + unicodeslot=0x1F9B5, + }, + [0x1F9B6]={ + category="so", + direction="on", + linebreak="eb", + unicodeslot=0x1F9B6, + }, + [0x1F9B7]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9B7, + }, + [0x1F9B8]={ + category="so", + direction="on", + linebreak="eb", + unicodeslot=0x1F9B8, + }, + [0x1F9B9]={ + category="so", + direction="on", + linebreak="eb", + unicodeslot=0x1F9B9, + }, [0x1F9C0]={ category="so", direction="on", linebreak="id", unicodeslot=0x1F9C0, }, + [0x1F9C1]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9C1, + }, + [0x1F9C2]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9C2, + }, [0x1F9D0]={ category="so", direction="on", @@ -190978,6 +195127,240 @@ return { linebreak="id", unicodeslot=0x1F9E6, }, + [0x1F9E7]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9E7, + }, + [0x1F9E8]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9E8, + }, + [0x1F9E9]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9E9, + }, + [0x1F9EA]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9EA, + }, + [0x1F9EB]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9EB, + }, + [0x1F9EC]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9EC, + }, + [0x1F9ED]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9ED, + }, + [0x1F9EE]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9EE, + }, + [0x1F9EF]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9EF, + }, + [0x1F9F0]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F0, + }, + [0x1F9F1]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F1, + }, + [0x1F9F2]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F2, + }, + [0x1F9F3]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F3, + }, + [0x1F9F4]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F4, + }, + [0x1F9F5]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F5, + }, + [0x1F9F6]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F6, + }, + [0x1F9F7]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F7, + }, + [0x1F9F8]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F8, + }, + [0x1F9F9]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9F9, + }, + [0x1F9FA]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9FA, + }, + [0x1F9FB]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9FB, + }, + [0x1F9FC]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9FC, + }, + [0x1F9FD]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9FD, + }, + [0x1F9FE]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9FE, + }, + [0x1F9FF]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1F9FF, + }, + [0x1FA60]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA60, + }, + [0x1FA61]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA61, + }, + [0x1FA62]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA62, + }, + [0x1FA63]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA63, + }, + [0x1FA64]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA64, + }, + [0x1FA65]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA65, + }, + [0x1FA66]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA66, + }, + [0x1FA67]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA67, + }, + [0x1FA68]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA68, + }, + [0x1FA69]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA69, + }, + [0x1FA6A]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA6A, + }, + [0x1FA6B]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA6B, + }, + [0x1FA6C]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA6C, + }, + [0x1FA6D]={ + category="so", + direction="on", + linebreak="id", + unicodeslot=0x1FA6D, + }, [0x2F800]={ category="lo", direction="l", @@ -195628,7 +200011,6 @@ return { [0x70B]=0x6, [0x70C]=0x6, [0x70D]=0x6, - [0x70F]=0x6, [0x710]=0x3, [0x711]=0x5, [0x712]=0x2, @@ -195798,6 +200180,9 @@ return { [0x7F8]=0x6, [0x7F9]=0x6, [0x7FA]=0x2, + [0x7FD]=0x5, + [0x7FE]=0x6, + [0x7FF]=0x6, [0x840]=0x3, [0x841]=0x2, [0x842]=0x2, @@ -195956,6 +200341,7 @@ return { [0x1875]=0x2, [0x1876]=0x2, [0x1877]=0x2, + [0x1878]=0x2, [0x1880]=0x4, [0x1881]=0x4, [0x1882]=0x4, @@ -196122,6 +200508,70 @@ return { [0x10BAD]=0x2, [0x10BAE]=0x2, [0x10BAF]=0x4, + [0x10D00]=0x1, + [0x10D01]=0x2, + [0x10D02]=0x2, + [0x10D03]=0x2, + [0x10D04]=0x2, + [0x10D05]=0x2, + [0x10D06]=0x2, + [0x10D07]=0x2, + [0x10D08]=0x2, + [0x10D09]=0x2, + [0x10D0A]=0x2, + [0x10D0B]=0x2, + [0x10D0C]=0x2, + [0x10D0D]=0x2, + [0x10D0E]=0x2, + [0x10D0F]=0x2, + [0x10D10]=0x2, + [0x10D11]=0x2, + [0x10D12]=0x2, + [0x10D13]=0x2, + [0x10D14]=0x2, + [0x10D15]=0x2, + [0x10D16]=0x2, + [0x10D17]=0x2, + [0x10D18]=0x2, + [0x10D19]=0x2, + [0x10D1A]=0x2, + [0x10D1B]=0x2, + [0x10D1C]=0x2, + [0x10D1D]=0x2, + [0x10D1E]=0x2, + [0x10D1F]=0x2, + [0x10D20]=0x2, + [0x10D21]=0x2, + [0x10D22]=0x3, + [0x10D23]=0x2, + [0x10F30]=0x2, + [0x10F31]=0x2, + [0x10F32]=0x2, + [0x10F33]=0x3, + [0x10F34]=0x2, + [0x10F35]=0x2, + [0x10F36]=0x2, + [0x10F37]=0x2, + [0x10F38]=0x2, + [0x10F39]=0x2, + [0x10F3A]=0x2, + [0x10F3B]=0x2, + [0x10F3C]=0x2, + [0x10F3D]=0x2, + [0x10F3E]=0x2, + [0x10F3F]=0x2, + [0x10F40]=0x2, + [0x10F41]=0x2, + [0x10F42]=0x2, + [0x10F43]=0x2, + [0x10F44]=0x2, + [0x10F45]=0x4, + [0x10F51]=0x2, + [0x10F52]=0x2, + [0x10F53]=0x2, + [0x10F54]=0x3, + [0x110BD]=0x4, + [0x110CD]=0x4, [0x1E900]=0x2, [0x1E901]=0x2, [0x1E902]=0x2, diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua index 624f35ddaa7..8dafe6a687d 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua @@ -5,8 +5,8 @@ local ProvidesLuaModule = { name = "luaotfload-colors", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / color", license = "GPL v2.0", author = "Khaled Hosny, Elie Roux, Philipp Gesang, Dohyun Kim, David Carlisle", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua index 004d4b1b249..ef897190439 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua @@ -7,8 +7,8 @@ local ProvidesLuaModule = { name = "luaotfload-configuration", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / config file reader", license = "GPL v2.0" } @@ -781,7 +781,7 @@ local resolve_config_path = function () local t, p = unpack (config_paths[i]) local fullname if t == kpse_t then - fullname = kpse.lookup (p) + fullname = kpse.find_file (p) logreport ("both", 6, "conf", "kpse lookup: %s -> %s.", p, fullname) elseif t == path_t then local expanded = tilde_expand (p) diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua index a596774e72c..c44b780113f 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua @@ -5,8 +5,8 @@ do -- block to avoid to many local variables error local ProvidesLuaModule = { name = "luaotfload-database", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / database", license = "GPL v2.0", author = "Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger", @@ -748,13 +748,14 @@ local get_font_file = function (index) end local basename = entry.basename if entry.location == "texmf" then - if kpselookup(basename) then - return true, basename, entry.subfont + local fullname = resolvers.findfile(basename) + if fullname then + return true, fullname, entry.subfont end else --- system, local local fullname = name_index.files.full [index] if lfsisfile (fullname) then - return true, basename, entry.subfont + return true, fullname, entry.subfont end end return false @@ -771,7 +772,7 @@ local verify_font_file = function (basename) if path and lfsisfile(path) then return true end - if kpsefind_file(basename) then + if resolvers.findfile(basename) then return true end return false @@ -1055,7 +1056,7 @@ local lookup_fontname = function (specification, name, style) or face.fullname == name or face.psname == name then - return face.basename, face.subfont + return face.fullpath, face.subfont elseif face.familyname == name then if typographicsubfamily == style or subfamily == style @@ -1074,10 +1075,10 @@ local lookup_fontname = function (specification, name, style) end end if fallback then - return fallback.basename, fallback.subfont + return fallback.fullpath, fallback.subfont end if lastresort then - return lastresort.basename, lastresort.subfont + return lastresort.fullpath, lastresort.subfont end return nil, nil end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-diagnostics.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-diagnostics.lua index 9db0f3fc605..9eaf77f5d63 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-diagnostics.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-diagnostics.lua @@ -7,8 +7,8 @@ local ProvidesLuaModule = { name = "luaotfload-diagnostics", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload-tool submodule / diagnostics", license = "GPL v2.0" } diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua index 526fb6f0fc6..b33bb861227 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua @@ -5,8 +5,8 @@ local ProvidesLuaModule = { name = "luaotfload-features", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / features", license = "GPL v2.0", author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger", @@ -1217,6 +1217,21 @@ local handle_request = function (specification) return handle_combination (request.combo, specification) end + local features = specification.features + if not features then + features = { } + specification.features = features + end + + features.raw = request.features or {} + request.features = {} + for k, v in pairs(features.raw) do + if type(v) == 'string' then + v = string.lower(v) + v = ({['true'] = true, ['false'] = false})[v] or v + end + request.features[k] = v + end request.features = apply_default_features(request.features) if name then @@ -1250,11 +1265,6 @@ local handle_request = function (specification) --- The next line sets the “rand” feature to “random”; I haven’t --- investigated it any further (luatex-fonts-ext), so it will --- just stay here. - local features = specification.features - if not features then - features = { } - specification.features = features - end features.normal = normalize (request.features) local subfont = tonumber (request.sub) if subfont and subfont >= 0 then @@ -1262,6 +1272,13 @@ local handle_request = function (specification) else specification.sub = false end + + if request.features and request.features.mode + and fonts.readers[request.features.mode] then + specification.forced = request.features.mode + return specification + end + return specification end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua index def5b2c7f80..97f9669837f 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua @@ -6,8 +6,8 @@ local ProvidesLuaModule = { name = "luaotfload-filelist", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / filelist", license = "GPL v2.0" } @@ -175,10 +175,10 @@ luaotfload.filelist.data = { name = "util-fil" , ours = "util-fil" , ext = ".lua", kind = kind_lualibs , gitdir=gitdirimp, texdir = texdirtex , ctxdir= ctxdirbas, ctxtype = "ctxbase" }, { name = "basics-gen" , ours = nil , ext = ".lua", kind = kind_essential , gitdir=gitdiress, texdir = texdirtex , ctxdir= ctxdirgen, ctxtype = "ctxgene" , ctxpref = "luatex-" }, --- files merged in the fontloader. Two files are ignored +-- files merged in the fontloader. One file is ignored { name = "data-con" , ours = "data-con" , ext = ".lua", kind = kind_merged , gitdir=gitdirimp, texdir = texdirtex , ctxdir= ctxdirbas, ctxtype = "ctxbase" }, { name = "basics-nod" , ours = nil , ext = ".lua", kind = kind_merged , gitdir=gitdirimp, texdir = texdirtex , ctxdir= ctxdirgen, ctxtype = "ctxgene" , ctxpref = "luatex-" }, - { name = "basics-chr" , ours = nil , ext = ".lua", kind = kind_ignored , gitdir=gitdirimp, texdir = texdirtex , ctxdir= ctxdirgen, ctxtype = "ctxgene" , ctxpref = "luatex-" }, + { name = "basics-chr" , ours = nil , ext = ".lua", kind = kind_merged , gitdir=gitdirimp, texdir = texdirtex , ctxdir= ctxdirgen, ctxtype = "ctxgene" , ctxpref = "luatex-" }, { name = "font-ini" , ours = "font-ini" , ext = ".lua", kind = kind_merged , gitdir=gitdirimp, texdir = texdirtex , ctxdir= ctxdirbas, ctxtype = "ctxbase" }, { name = "fonts-mis" , ours = nil , ext = ".lua", kind = kind_merged , gitdir=gitdirimp, texdir = texdirtex , ctxdir= ctxdirgen, ctxtype = "ctxgene" , ctxpref = "luatex-" }, { name = "font-con" , ours = "font-con" , ext = ".lua", kind = kind_merged , gitdir=gitdirimp, texdir = texdirtex , ctxdir= ctxdirbas, ctxtype = "ctxbase" }, diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-glyphlist.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-glyphlist.lua index bd8dc49af04..1cc0f8a9cb5 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-glyphlist.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-glyphlist.lua @@ -1,7 +1,7 @@ local ProvidesLuaModule = { name = "luaotfload-glyphlist", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / autogenerated glyphlist", copyright = "derived from https://raw.githubusercontent.com/adobe-type-tools/agl-aglfn/master/glyphlist.txt", original = "Adobe Glyph List, version 2.0, September 20, 2002", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua index 6223d1dfd01..105a605621e 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua @@ -7,8 +7,8 @@ local ProvidesLuaModule = { name = "luaotfload-init", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / initialization", license = "GPL v2.0" } @@ -20,7 +20,7 @@ end local setmetatable = setmetatable -local kpselookup = kpse.lookup +local kpsefind_file = kpse.find_file local lfsisdir = lfs.isdir --[[doc-- @@ -258,6 +258,7 @@ local context_modules = { { ltx, "luatex-basics-gen" }, { ctx, "data-con" }, { ltx, "luatex-basics-nod" }, + { ltx, "luatex-basics-chr" }, -- NEW UF 14.12.2018 { ctx, "font-ini" }, { ltx, "luatex-fonts-mis" }, -- NEW UF 19.09.2018 { ctx, "font-con" }, @@ -395,107 +396,109 @@ end --- [init_adapt] --doc]]-- -characters = characters or { } --- should be created in basics-gen -characters.data = nil -local chardef = "luaotfload-characters" - -do - local setmetatableindex = function (t, f) - local mt = getmetatable (t) - if mt then - mt.__index = f - else - setmetatable (t, { __index = f }) - end - end - - --- there are some special tables for each field that provide access - --- to fields of the character table by means of a metatable - - local mkcharspecial = function (characters, tablename, field) - - local chardata = characters.data - - if chardata then - local newspecial = { } - characters [tablename] = newspecial --> e.g. “characters.data.mirrors” - - local idx = function (t, char) - local c = chardata [char] - if c then - local m = c [field] --> e.g. “mirror” - if m then - t [char] = m - return m - end - end - newspecial [char] = false - return char - end - - setmetatableindex (newspecial, idx) - end - - end - - local mkcategories = function (characters) -- different from the others - - local chardata = characters.data - local categories = characters.categories or { } - characters.categories = categories - - setmetatable (categories, { __index = function (t, char) - if char then - local c = chardata [char] - c = c.category or char - t [char] = c - return c - end - end}) - - end - - local load_failed = false - local chardata --> characters.data; loaded on demand - - local load_chardef = function () - - logreport ("both", 1, "aux", "Loading character metadata from %s.", chardef) - chardata = dofile (kpse.find_file (chardef, "lua")) - - if chardata == nil then - logreport ("both", 0, "aux", - "Could not load %s; continuing with empty character table.", - chardef) - chardata = { } - load_failed = true - end - - characters = { } --- nuke metatable - characters.data = chardata - characters.classifiers = chardata.classifiers - chardata.classifiers = nil - - --- institute some of the functionality from char-ini.lua - - mkcharspecial (characters, "mirrors", "mirror") - mkcharspecial (characters, "directions", "direction") - mkcharspecial (characters, "textclasses", "textclass") - mkcategories (characters) - - end - - local charindex = function (t, k) - if chardata == nil and load_failed ~= true then - load_chardef () - end - - return rawget (characters, k) - end - - setmetatableindex (characters, charindex) - -end +--[[--14.12.2018disable characters +--characters = characters or { } --- should be created in basics-gen +--characters.data = nil +--local chardef = "luaotfload-characters" +-- +--do +-- local setmetatableindex = function (t, f) +-- local mt = getmetatable (t) +-- if mt then +-- mt.__index = f +-- else +-- setmetatable (t, { __index = f }) +-- end +-- end +-- +-- --- there are some special tables for each field that provide access +-- --- to fields of the character table by means of a metatable +-- +-- local mkcharspecial = function (characters, tablename, field) +-- +-- local chardata = characters.data +-- +-- if chardata then +-- local newspecial = { } +-- characters [tablename] = newspecial --> e.g. “characters.data.mirrors” +-- +-- local idx = function (t, char) +-- local c = chardata [char] +-- if c then +-- local m = c [field] --> e.g. “mirror” +-- if m then +-- t [char] = m +-- return m +-- end +-- end +-- newspecial [char] = false +-- return char +-- end +-- +-- setmetatableindex (newspecial, idx) +-- end +-- +-- end +-- +-- local mkcategories = function (characters) -- different from the others +-- +-- local chardata = characters.data +-- local categories = characters.categories or { } +-- characters.categories = categories +-- +-- setmetatable (categories, { __index = function (t, char) +-- if char then +-- local c = chardata [char] +-- c = c.category or char +-- t [char] = c +-- return c +-- end +-- end}) +-- +-- end +-- +-- local load_failed = false +-- local chardata --> characters.data; loaded on demand +-- +-- local load_chardef = function () +-- +-- logreport ("both", 1, "aux", "Loading character metadata from %s.", chardef) +-- chardata = dofile (kpse.find_file (chardef, "lua")) +-- +-- if chardata == nil then +-- logreport ("both", 0, "aux", +-- "Could not load %s; continuing with empty character table.", +-- chardef) +-- chardata = { } +-- load_failed = true +-- end +-- +-- characters = { } --- nuke metatable +-- characters.data = chardata +-- characters.classifiers = chardata.classifiers +-- chardata.classifiers = nil +-- +-- --- institute some of the functionality from char-ini.lua +-- +-- mkcharspecial (characters, "mirrors", "mirror") +-- mkcharspecial (characters, "directions", "direction") +-- mkcharspecial (characters, "textclasses", "textclass") +-- mkcategories (characters) +-- +-- end +-- +-- local charindex = function (t, k) +-- if chardata == nil and load_failed ~= true then +-- load_chardef () +-- end +-- +-- return rawget (characters, k) +-- end +-- +-- setmetatableindex (characters, charindex) +-- +--end +--]] --14.12.2018disable characters local init_main = function () @@ -549,6 +552,7 @@ local init_main = function () load_fontloader_module "data-con" load_fontloader_module "basics-nod" + load_fontloader_module "basics-chr" load_fontloader_module "font-ini" load_fontloader_module "fonts-mis" load_fontloader_module "font-con" @@ -604,14 +608,14 @@ local init_main = function () fontloader) local _void = require (fontloader) - elseif kpselookup (fontloader) then - local path = kpselookup (fontloader) + elseif kpsefind_file (fontloader) then + local path = kpsefind_file (fontloader) logreport ("log", 0, "init", "Loading fontloader “%s” from kpse-resolved path “%s”.", fontloader, path) local _void = require (path) - elseif kpselookup (("fontloader-%s.lua"):format(fontloader)) then + elseif kpsefind_file (("fontloader-%s.lua"):format(fontloader)) then logreport ("log", 0, "init", "Using predefined fontloader “%s”.", fontloader) diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua index 1db1139b333..5e6e4c69c59 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua @@ -5,8 +5,8 @@ local ProvidesLuaModule = { name = "luaotfload-letterspace", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / color", license = "GPL v2.0", copyright = "PRAGMA ADE / ConTeXt Development Team", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-loaders.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-loaders.lua index f61ee480474..964e935e463 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-loaders.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-loaders.lua @@ -8,8 +8,8 @@ local ProvidesLuaModule = { name = "luaotfload-loaders", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / callback handling", license = "GPL v2.0" } diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua index b33a7801485..ae4316a97df 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua @@ -6,8 +6,8 @@ local ProvidesLuaModule = { name = "luaotfload-log", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / logging", license = "GPL v2.0", author = "Khaled Hosny, Elie Roux, Philipp Gesang", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua index 5dfa14c8990..f933b634cf7 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua @@ -20,8 +20,8 @@ local authors = "\z -- version number is used below! local ProvidesLuaModule = { name = "luaotfload-main", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload entry point", author = authors, copyright = authors, diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua index 2605b6fec3c..a40356872fc 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-parsers.lua @@ -7,8 +7,8 @@ local ProvidesLuaModule = { name = "luaotfload-parsers", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / filelist", license = "GPL v2.0" } @@ -495,17 +495,6 @@ local splitcomma = Ct((C(noncomma^1) + comma)^1) --doc]]------------------------------------------------------------------------ -local handle_normal_option = function (key, val) - val = stringlower(val) - --- the former “toboolean()” handler - if val == "true" then - val = true - elseif val == "false" then - val = false - end - return key, val -end - --[[doc-- Xetex style indexing begins at zero which we just increment before @@ -513,35 +502,8 @@ end --doc]]-- -local handle_xetex_option = function (key, val) - val = stringlower(val) - local numeric = tonumber(val) --- decimal only; keeps colors intact - if numeric then --- ugh - if mathceil(numeric) == numeric then -- integer, possible index - val = tostring(numeric + 1) - end - elseif val == "true" then - val = true - elseif val == "false" then - val = false - end - return key, val -end - ---[[doc-- - - Instead of silently ignoring invalid options we emit a warning to - the log. - - Note that we have to return a pair to please rawset(). This creates - an entry on the resulting features hash which will later be removed - during set_default_features(). - ---doc]]-- - -local handle_invalid_option = function (opt) - logreport("log", 0, "load", "font option %q unknown.", opt) - return "", false +local handle_xetex_option = function (val) + return tostring(1 + tonumber(val)) end --[[doc-- @@ -674,22 +636,24 @@ local path_lookup = lbrk * Cg(Cs(path_balanced), "path") * rbrk * subfont^-1 --- features ---------------------------------------------------------- -local field_char = anum + S"+-.!?" --- sic! -local field = field_char^1 +local balanced_braces = P{((1 - S'{}') + '{' * V(1) * '}')^0} +local field_char = '{' * C(balanced_braces) * '}' + (1 - S'={}' - featuresep) +local field = '{' * C(balanced_braces) * '}' + C(field_char^1) --- assignments are “lhs=rhs” --- or “+lhs=rhs” (Xetex-style) --- switches are “+key” | “-key” -local normal_option = C(field) * ws * equals * ws * C(field) * ws -local xetex_option = P"+" * ws * normal_option +local normal_option = field * ws * equals * ws * field +local xetex_option = P"+" * ws * ( field * ws * equals * ws + * (digit^1/handle_xetex_option) + + normal_option) local ignore_option = (1 - equals - featuresep)^1 * equals * (1 - featuresep)^1 -local assignment = xetex_option / handle_xetex_option - + normal_option / handle_normal_option - + ignore_option / handle_invalid_option -local switch = P"+" * ws * C(field) * Cc(true) - + P"-" * ws * C(field) * Cc(false) - + C(field) * Cc(true) --- default +local assignment = xetex_option + + normal_option +local switch = P"+" * ws * field * Cc(true) + + P"-" * ws * field * Cc(false) + + field * Cc(true) --- default local feature_expr = ws * Cg(assignment + switch) * ws local option = feature_expr local feature_list = Cf(Ct"" diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-resolvers.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-resolvers.lua index 89d4fc7c5d3..d932aee3e46 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-resolvers.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-resolvers.lua @@ -11,8 +11,8 @@ local ProvidesLuaModule = { name = "luaotfload-resolvers", - version = "2.93", --TAGVERSION - date = "2018-10-28", --TAGDATE + version = "2.94", --TAGVERSION + date = "2018-12-19", --TAGDATE description = "luaotfload submodule / resolvers", license = "GPL v2.0" } @@ -77,7 +77,7 @@ local resolve_file resolve_file = function (specification) local name, _format, success = fonts.names.lookup_font_file (specification.name) local suffix = filesuffix (name) - if fonts.formats[suffix] then + if not specification.forced and fonts.formats[suffix] then specification.forced = stringlower (suffix) specification.forcedname = fileremovesuffix (name) else @@ -110,7 +110,7 @@ resolve_path = function (specification) return resolve_file (specification) end local suffix = filesuffix (name) - if fonts.formats [suffix] then + if not specification.forced and fonts.formats [suffix] then specification.forced = stringlower (suffix) specification.name = fileremovesuffix (name) specification.forcedname = name @@ -142,7 +142,8 @@ resolve_name = function (specification) subfont and stringformat ("(%d)", subfont) or "") specification.resolved = resolved specification.sub = subfont - specification.forced = stringlower (filesuffix (resolved) or "") + specification.forced = specification.forced + or stringlower (filesuffix (resolved) or "") specification.forcedname = resolved specification.name = fileremovesuffix (resolved) return true @@ -184,7 +185,7 @@ local resolve_tex_format = function (specification) if resolvers.findfile (name, format) then local usename = suffix == format and fileremovesuffix (name) or name specification.forcedname = file.addsuffix (usename, format) - specification.forced = format + specification.forced = specification.forced or format ---- specification.resolved = name return true end @@ -277,7 +278,7 @@ local resolve_kpse resolve_kpse = function (specification) local name = specification.name local suffix = filesuffix (name) - if suffix and fonts.formats[suffix] then + if not specification.forced and suffix and fonts.formats[suffix] then name = fileremovesuffix (name) if resolvers.findfile (name, suffix) then specification.forced = stringlower (suffix) diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua index 78033709b04..3f6ed7b8ed6 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua @@ -1,86 +1,87 @@ return { ["hashes"]={ - { "fontloader-2018-10-28.lua", "0e20fc0c2873c475b14d3858b221d0fc" }, - { "fontloader-util-fil.lua", "258d23db3b135c06ceb87faecbe785b4" }, - { "fontloader-util-str.lua", "48e82196229dca83ad7be2d8b42fc203" }, - { "fontloader-l-unicode.lua", "c8dd70435ced1bd05e257557a05b718b" }, - { "fontloader-l-math.lua", "082add08e0bb79f39191ae9534a79849" }, - { "fontloader-l-boolean.lua", "abe28515dd33e8f6c416c09bca351cf8" }, - { "fontloader-l-file.lua", "7496b10d145575310f3888ee0b22d04d" }, - { "fontloader-l-io.lua", "acbb79a157e9d141379ed4708bef1c04" }, - { "fontloader-l-table.lua", "d021aef90825ed5844f26395ee16916c" }, - { "fontloader-l-string.lua", "ce0b99ddb7749540105b13450971ca7e" }, - { "fontloader-l-function.lua", "a7e68a9703c35238729da41a474e951b" }, - { "fontloader-l-lpeg.lua", "a6f03f02106cc5353c5436afe99fd284" }, - { "fontloader-l-lua.lua", "a5deb6c4d9f8b0ca85740880eef75063" }, - { "fontloader-fonts-gbn.lua", "10ecdf01e7c926e5128ad8a9dff4d677" }, - { "fontloader-fonts-lig.lua", "fbd251eea3810a43a8d5542319361d68" }, - { "fontloader-fonts-ext.lua", "32013cbc5d5d336be8b1d1e5879d86c4" }, - { "fontloader-fonts-def.lua", "f435e0875f203f343157baeff876ec9c" }, - { "fontloader-fonts-enc.lua", "5ff4ca50493d7c4ecea0e15c203099f0" }, - { "fontloader-fonts-mis.lua", "17e967c9ec4d001deefd43ddf25e98f7" }, - { "fontloader-basics-nod.lua", "78f56219685f3145b9393c2b688aad94" }, - { "fontloader-font-imp-effects.lua", "3327181ef3db6f44dd234ad66ccc3f38" }, - { "fontloader-font-imp-italics.lua", "c2e6d6c4096a2c30d68fbffd3d7d58a7" }, - { "fontloader-font-imp-ligatures.lua", "26ffcf089391445f7af59536c8814364" }, - { "fontloader-font-imp-tex.lua", "ceb087ef6fa2f89aed7179f60ddf8f35" }, - { "fontloader-font-def.lua", "8e2cb2552bf02246da2ac43334b91795" }, - { "fontloader-font-lua.lua", "1fbfdf7b689b2bdfd0e3bb9bf74ce136" }, - { "fontloader-font-tfm.lua", "c9797c1b4ccb8fdb7f041e19207109a2" }, - { "fontloader-font-afk.lua", "9da14e0fb22129c053acc599d1312544" }, + { "fontloader-2018-12-19.lua", "3fc39dbede38f8a3dbf5b62d9ce243e7" }, + { "fontloader-util-fil.lua", "a12919215a51a443ad0128ff9d9f8b36" }, + { "fontloader-util-str.lua", "05a52244e789ab2ff15ae3255ed3ad14" }, + { "fontloader-l-unicode.lua", "d46cc6cf18fb3f368ef1e404dc9fcb5c" }, + { "fontloader-l-math.lua", "a373be3ed2db0d5f98588fa81abca48f" }, + { "fontloader-l-boolean.lua", "18ed6c4b2c40dd87224ea33229548d20" }, + { "fontloader-l-file.lua", "97e91122d940fc0007b2fc6b75b749e9" }, + { "fontloader-l-io.lua", "42608ad95eb2822fdc370d1c11f08fb5" }, + { "fontloader-l-table.lua", "ab29284239c2fadf3195c6af0d9da3fd" }, + { "fontloader-l-string.lua", "2b20a19dfc8d00e856196a446336625e" }, + { "fontloader-l-function.lua", "f771cc91839ebcdfc094083434fbe00f" }, + { "fontloader-l-lpeg.lua", "a5364ddabb490408da9276ea7f7a7ba1" }, + { "fontloader-l-lua.lua", "fa3744c1d3979f38ba498291de21d42a" }, + { "fontloader-fonts-gbn.lua", "d25472d54c4841db43a745764a63533e" }, + { "fontloader-fonts-lig.lua", "b9dbe77ce747d4c35bb2a20ffbe5aa51" }, + { "fontloader-fonts-ext.lua", "01015ab3758cdc2af29394e6d502a91a" }, + { "fontloader-fonts-def.lua", "5ad79120ebc5e60f4d322fb3ee13bffe" }, + { "fontloader-fonts-enc.lua", "3e71a54297e8f85a1ac438bb0f20dd79" }, + { "fontloader-fonts-mis.lua", "bc9eb43c27f63ce9d0fff67e104fe1c6" }, + { "fontloader-basics-chr.lua", "a8b8316248b40cc9bc1be19050f7074f" }, + { "fontloader-basics-nod.lua", "f899f78e915f8c428df33bd62d5520dc" }, + { "fontloader-font-imp-effects.lua", "73a660359a0ec71e44cc2b7225a715ac" }, + { "fontloader-font-imp-italics.lua", "fe1ca80fb5ea4a2f8d2d5c484e7ba913" }, + { "fontloader-font-imp-ligatures.lua", "043daa4fcccf2560868da359d71d3a4a" }, + { "fontloader-font-imp-tex.lua", "77c374b0ef00c2fb12188ec42beb4257" }, + { "fontloader-font-def.lua", "6569d90e55c91890b3b0650063a83ee6" }, + { "fontloader-font-lua.lua", "55b281fb98f7bd848fc19928f376f647" }, + { "fontloader-font-tfm.lua", "f1a3796cce3838210248eb1daee6ea83" }, + { "fontloader-font-afk.lua", "54d554530e75c57c56ee76234724e26d" }, { "fontloader-font-one.lua", "b0a175e8f123feb797c7a5a9b02b85a0" }, - { "fontloader-font-onr.lua", "cf93eb4ab34461d2b3797792dbdb035f" }, + { "fontloader-font-onr.lua", "20b0d2753f58ff91180947ce4078571e" }, { "fontloader-font-otc.lua", "088ba25667dfc5036867d007797e1602" }, - { "fontloader-font-ocl.lua", "49cf3230228aa7f2d19cd491f55f5395" }, - { "fontloader-font-osd.lua", "d2b542031aa693bb423b6d3272820c9a" }, - { "fontloader-font-ots.lua", "624f23e63b7430a51212c8824d09924f" }, - { "fontloader-font-ota.lua", "d883cf661bb8c27bfa9b7cc66420c1ed" }, - { "fontloader-font-otj.lua", "578448ae37a167319dbccd5af04738da" }, + { "fontloader-font-ocl.lua", "6552143d102c2dc5404293d10af3a1eb" }, + { "fontloader-font-osd.lua", "883c29eaccf966c9ad9ab205a920de08" }, + { "fontloader-font-ots.lua", "ca923deced1ed4cdd86e66acdb9e6420" }, + { "fontloader-font-ota.lua", "1b2feab42ed8081933768c1e3ef7d103" }, + { "fontloader-font-otj.lua", "91f45161817b7e8e33ad1d1b68e35fdb" }, { "fontloader-font-oto.lua", "6ba2e73177b18007e74de324c324806c" }, - { "fontloader-font-otl.lua", "40cdceeb682bac55b4a69465b76bcc33" }, - { "fontloader-font-oup.lua", "47feebddec74254caed369aa83f75dff" }, - { "fontloader-font-dsp.lua", "cb8138a91cfbe562467821c5e0c2568e" }, - { "fontloader-font-ttf.lua", "ff587471f4297aa8ba0fa022609adc6e" }, - { "fontloader-font-cff.lua", "98e33e8b6de9990678768744247634d0" }, - { "fontloader-font-ott.lua", "b20ddcf6360a2e35e79b7bdad0289a19" }, - { "fontloader-font-oti.lua", "309a75f9c14b77d87e94eba827dc4e71" }, - { "fontloader-font-otr.lua", "4a1dae571a43d7cb8afce7e906df89c6" }, - { "fontloader-font-vfc.lua", "237aff1862009b7850653c2098473bd4" }, + { "fontloader-font-otl.lua", "0836c8396cae2bcfd4020186e5e8d7e0" }, + { "fontloader-font-oup.lua", "26b481cd9efebf7047810800930dff58" }, + { "fontloader-font-dsp.lua", "7959312318af6ed8fbd9edbeb2b1a335" }, + { "fontloader-font-ttf.lua", "fe1b771df5d6442a10fcfa1388f3eed2" }, + { "fontloader-font-cff.lua", "fda3887cbaad0b82d06d3cbffdfff560" }, + { "fontloader-font-ott.lua", "3791be083c2eccf366792dc84baee67a" }, + { "fontloader-font-oti.lua", "dbae7722baae24d917a17176553825cf" }, + { "fontloader-font-otr.lua", "2c35abf43f9a64bdd99240593d432d8a" }, + { "fontloader-font-vfc.lua", "94937140f2c909e9c831ba021f1ab303" }, { "fontloader-font-map.lua", "210b9288eef0df624da638b65d27291b" }, - { "fontloader-font-cid.lua", "22b0367742fb253deef84ef7ccf5e8de" }, - { "fontloader-font-con.lua", "f30ef604ea0eece92e00cad7c7b56580" }, - { "fontloader-font-ini.lua", "dd3ff5febc73c79b23e16d713a1282fb" }, - { "fontloader-data-con.lua", "d8982c834ed9acc6193eee23067b9d5d" }, - { "fontloader-reference.lua", "6bd6dd7fcd2eeaa4f134cdce70ac673c" }, - { "fontloader-basics-gen.lua", "a1e8c7de52ec6a8afcce3b2105f0d355" }, + { "fontloader-font-cid.lua", "4d87988efa86020a14708ee03c23415f" }, + { "fontloader-font-con.lua", "6308f40e1b4fecfbe05b01c571d46936" }, + { "fontloader-font-ini.lua", "4299a02110bbd7c0d27e131235c5319d" }, + { "fontloader-data-con.lua", "7ce546725b1550f655c78ac9d69419ca" }, + { "fontloader-reference.lua", "389ff40a6d46834276d7f684e374c149" }, + { "fontloader-basics-gen.lua", "b21e91bbd534f77e368f0ec13f865aed" }, { "mktests", "c7cff7025962922944376acc1ffa9c47" }, - { "mkstatus", "66bd373bfc704d78084cfe95a6b9c192" }, + { "mkstatus", "2dc1052ac96cce3dfe7100a203346440" }, { "mkcharacters", "92c24bb582fc84c0365634f29eb89863" }, { "mkglyphlist", "557836886d4f0e6d656eac3ded4456a2" }, - { "mkimport", "8ae65973a281a304acfcd244c26e9a55" }, - { "luaotfload-glyphlist.lua", "c0f9733f411614335dbe3ff99ef1b606" }, - { "luaotfload-characters.lua", "985504f5dab5c87121dc0b072aaccdf9" }, - { "luaotfload-resolvers.lua", "04d3752afc03f4dcd1df2570f6c58897" }, - { "luaotfload-parsers.lua", "fd32fe8c4f2c5a1734b3d97f24f25fd2" }, - { "luaotfload-loaders.lua", "2975d6732a693e0a172f83b5c850fdde" }, - { "luaotfload-letterspace.lua", "0269e2a7c6fe8361782c0895b4e45bdb" }, - { "luaotfload-features.lua", "4bd608cd2e8d2c23b5a738a8ee7e35c0" }, - { "luaotfload-database.lua", "796e497e51621b0d61b9cdbfa5ad4877" }, - { "luaotfload-configuration.lua", "39c429ef28ea9ee0d7f5381652cc034e" }, - { "luaotfload-colors.lua", "64cf74969c1da3842d15b0b38af21091" }, - { "luaotfload-auxiliary.lua", "9369850a9c6d0e322c1d4d30b72de86b" }, - { "luaotfload-filelist.lua", "4b1d866cb5e31ca3317e3e2b5568cb10" }, - { "luaotfload-tool.lua", "33483fbcff3758eb4661297435500a83" }, - { "luaotfload-diagnostics.lua", "5dcd71d926529d31c6ce083e465f5b15" }, - { "luaotfload-log.lua", "faf32504a1c3310197f154caf015a7c4" }, - { "luaotfload-init.lua", "63d7b82023864b6d275cf6308eab7b60" }, - { "luaotfload-main.lua", "46ddf8c08ff99ea8fb596cc2f4c7e072" }, + { "mkimport", "1788927ee10b87112e200466151f1fbf" }, + { "luaotfload-glyphlist.lua", "efc1465fada68d1e3bece1b75429131d" }, + { "luaotfload-characters.lua", "1ef110e1710f53689b2e22783f648b14" }, + { "luaotfload-resolvers.lua", "04c5d0204e6cfaa9fc207fdb4a193554" }, + { "luaotfload-parsers.lua", "fd41173660f8a9d289f5f8bb053134a6" }, + { "luaotfload-loaders.lua", "b978ada88220348b777c598e41f34d95" }, + { "luaotfload-letterspace.lua", "614e6af4f4da1100a5077996196d550a" }, + { "luaotfload-features.lua", "1964f3859a34ac58a078aacaf5b4a6e1" }, + { "luaotfload-database.lua", "7569d402fb72be91945a6d39d6229b18" }, + { "luaotfload-configuration.lua", "4c6fabed260823c0e5180969084111c2" }, + { "luaotfload-colors.lua", "72218a7e422eb7a637c64be4a355fcec" }, + { "luaotfload-auxiliary.lua", "f07ebaa967330d0cb0e5291de8c15adf" }, + { "luaotfload-filelist.lua", "0b12db3e3dd4b7dfe268ec1573822fac" }, + { "luaotfload-tool.lua", "f3d0aaab89b9146275ab3dfa487812ae" }, + { "luaotfload-diagnostics.lua", "2e8522bacec415bc6c06822cfe75425f" }, + { "luaotfload-log.lua", "b26a15b98dde28cf8f5160ac949e5d40" }, + { "luaotfload-init.lua", "a6a7ea177dc7b95f7bfba912a5909523" }, + { "luaotfload-main.lua", "8fbb08aa0669812556db89fc810644d5" }, }, ["notes"]={ ["committer"]="Ulrike Fischer <fischer@troubleshooting-tex.de>", - ["description"]="newmoduledecl", - ["loader"]="fontloader-2018-10-28.lua", - ["revision"]="6c2ff36c05047c4ad2bc9b5aa8872287201b1b18", - ["timestamp"]="2018-10-28 00:13:17 +0200", + ["description"]="v2.94", + ["loader"]="fontloader-2018-12-19.lua", + ["revision"]="f983f3716bd6cc784e55db99fdcbcd280c8269b3", + ["timestamp"]="2019-01-15 21:57:50 +0100", }, }
\ No newline at end of file |