diff options
-rw-r--r-- | luaotfload-database.lua | 27 | ||||
-rw-r--r-- | luaotfload-legacy-database.lua | 4 | ||||
-rw-r--r-- | luaotfload-legacy.lua | 136 |
3 files changed, 144 insertions, 23 deletions
diff --git a/luaotfload-database.lua b/luaotfload-database.lua index ee7701d..60e321f 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -990,29 +990,14 @@ do path_normalize = function (path) path = stringgsub(path, '\\', '/') path = stringlower(path) - path = stringgsub(path, '^/cygdrive/(%a)/', '%1:/') - path = filecollapsepath(path) - return path - end - - elseif os_name == "cygwin" then -- union of ms + unix - path_normalize = function (path) - path = stringgsub(path, '\\', '/') - path = stringlower(path) - path = stringgsub(path, '^/cygdrive/(%a)/', '%1:/') - local dest = lfsreadlink(path) - if dest then - if kpsereadable_file(dest) then - path = dest - elseif kpsereadable_file(filejoin(filedirname(path), dest)) then - path = filejoin(file.dirname(path), dest) - else - -- broken symlink? - end - end path = filecollapsepath(path) return path end +--[[doc-- + Cygwin used to be treated different from windows and dos. This + special treatment was removed with a patch submitted by Ken Brown. + Reference: http://cygwin.com/ml/cygwin/2013-05/msg00006.html +--doc]]-- else -- posix path_normalize = function (path) @@ -1379,7 +1364,7 @@ local function get_os_dirs() "/System/Library/Fonts", "/Network/Library/Fonts", } - elseif os.type == "windows" or os.type == "msdos" or os.name == "cygwin" then + elseif os.type == "windows" or os.type == "msdos" then local windir = os.getenv("WINDIR") return { filejoin(windir, 'Fonts') } else diff --git a/luaotfload-legacy-database.lua b/luaotfload-legacy-database.lua index 4af05f5..b31fe88 100644 --- a/luaotfload-legacy-database.lua +++ b/luaotfload-legacy-database.lua @@ -425,7 +425,7 @@ local function path_normalize(path) - reading symlinks under non-Win32 - using kpse.readable_file on Win32 ]] - if os.type == "windows" or os.type == "msdos" or os.name == "cygwin" then + if os.type == "windows" or os.type == "msdos" then path = path:gsub('\\', '/') path = path:lower() path = path:gsub('^/cygdrive/(%a)/', '%1:/') @@ -635,7 +635,7 @@ local function get_os_dirs() "/System/Library/Fonts", "/Network/Library/Fonts", } - elseif os.type == "windows" or os.type == "msdos" or os.name == "cygwin" then + elseif os.type == "windows" or os.type == "msdos" then local windir = os.getenv("WINDIR") return { file.join(windir, 'Fonts') } else diff --git a/luaotfload-legacy.lua b/luaotfload-legacy.lua index e0c2230..8bb1790 100644 --- a/luaotfload-legacy.lua +++ b/luaotfload-legacy.lua @@ -263,4 +263,140 @@ end luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_diments, "unicodemath.set_sscale_diments") +--[[doc-- + Version 2.3c of fontspec dropped a couple features that are now + provided in the luaotfload auxiliary libraries. To avoid breaking + Mik\TEX (again), which is sorta the entire point of distributing the + legacy codebase, we temporarily restore those functions here. + + Note that apart from cosmetic changes these are still the same as in + pre-TL2013 fontspec, relying on pairs() and other inefficient methods. +--doc]]-- + +luaotfload.aux = luaotfload.aux or { } +local aux = luaotfload.aux + +local stringlower = string.lower +local fontid = font.id + +local identifiers = fonts.identifiers + +local check_script = function (id, script) + local s = stringlower(script) + if id and id > 0 then + local tfmdata = identifiers[id] + local otfdata = tfmdata.shared and tfmdata.shared.otfdata + if otfdata then + local features = otfdata.luatex.features + for i, _ in pairs(features) do + for j, _ in pairs(features[i]) do + if features[i][j][s] then + fontspec.log("script '%s' exists in font '%s'", + script, tfmdata.fullname) + return true + end + end + end + end + end +end + +local check_language = function (id, script, language) + local s = stringlower(script) + local l = stringlower(language) + if id and id > 0 then + local tfmdata = identifiers[id] + local otfdata = tfmdata.shared and tfmdata.shared.otfdata + if otfdata then + local features = otfdata.luatex.features + for i, _ in pairs(features) do + for j, _ in pairs(features[i]) do + if features[i][j][s] and features[i][j][s][l] then + fontspec.log("language '%s' for script '%s' exists in font '%s'", + language, script, tfmdata.fullname) + return true + end + end + end + end + end +end + +local check_feature = function (id, script, language, feature) + local s = stringlower(script) + local l = stringlower(language) + local f = stringlower(feature:gsub("^[+-]", ""):gsub("=.*$", "")) + if id and id > 0 then + local tfmdata = identifiers[id] + local otfdata = tfmdata.shared and tfmdata.shared.otfdata + if otfdata then + local features = otfdata.luatex.features + for i, _ in pairs(features) do + if features[i][f] and features[i][f][s] then + if features[i][f][s][l] == true then + fontspec.log("feature '%s' for language '%s' and script '%s' exists in font '%s'", + feature, language, script, tfmdata.fullname) + return true + end + end + end + end + end +end + +local get_math_dimension = function(fnt, str) + if type(fnt) == "string" then + fnt = fontid(fnt) + end + local tfmdata = identifiers[fnt] + if tfmdata then + local mathdata = tfmdata.MathConstants + if mathdata then + return mathdata[str] + end + end +end + +aux.provides_script = check_script +aux.provides_language = check_language +aux.provides_feature = check_feature +aux.get_math_dimension = get_math_dimension + +local set_capheight = function (tfmdata) + local capheight + local shared = tfmdata.shared + if shared then + local metadata = shared.otfdata.metadata + local units_per_em = metadata.units_per_em or tfmdata.units + local os2_capheight = shared.otfdata.pfminfo.os2_capheight + local size = tfmdata.size + + if os2_capheight > 0 then + capheight = os2_capheight / units_per_em * size + else + local X8 = string.byte"X" + if tfmdata.characters[X8] then + capheight = tfmdata.characters[X8].height + else + capheight = metadata.ascent / units_per_em * size + end + end + else + local X8 = string.byte"X" + if tfmdata.characters[X8] then + capheight = tfmdata.characters[X8].height + end + end + if capheight then + tfmdata.parameters[8] = capheight + end +end +luatexbase.add_to_callback("luaotfload.patch_font", + set_capheight, + "luaotfload.set_capheight") + +--[[doc-- +End of auxiliary functionality that was moved from fontspec.lua. +--doc]]-- + -- vim:ts=2:sw=2:expandtab:ft=lua |