diff options
author | Philipp Gesang <phg42.2a@gmail.com> | 2013-08-11 04:22:36 -0700 |
---|---|---|
committer | Philipp Gesang <phg42.2a@gmail.com> | 2013-08-11 04:22:36 -0700 |
commit | a5458c60dbbc0b81c6d39748772d6b2ce184c287 (patch) | |
tree | 413707122c0b4aa5ebc200841c0ed16442d281ff /luaotfload-loaders.lua | |
parent | 0aed99a49103b61e93d68ee7b3132fbc9f5adc42 (diff) | |
parent | 74f7e2976e65c04881ac16470c974ed052df125b (diff) | |
download | luaotfload-a5458c60dbbc0b81c6d39748772d6b2ce184c287.tar.gz |
Merge pull request #123 from phi-gamma/master
refine AFM support
Diffstat (limited to 'luaotfload-loaders.lua')
-rw-r--r-- | luaotfload-loaders.lua | 124 |
1 files changed, 101 insertions, 23 deletions
diff --git a/luaotfload-loaders.lua b/luaotfload-loaders.lua index fd7c8c6..6d6f409 100644 --- a/luaotfload-loaders.lua +++ b/luaotfload-loaders.lua @@ -1,35 +1,27 @@ if not modules then modules = { } end modules ["loaders"] = { - version = "2.3a", + version = "2.4", comment = "companion to luaotfload.lua", author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } -local fonts = fonts -local readers = fonts.readers +local fonts = fonts +local readers = fonts.readers +local handlers = fonts.handlers +local formats = fonts.formats ---- ---- opentype reader (from font-otf.lua): ---- (spec : table) -> (suffix : string) -> (format : string) -> (font : table) ---- - -local pfb_reader = function (specification) - return readers.opentype(specification,"pfb","type1") -end - -local pfa_reader = function (specification) - return readers.opentype(specification,"pfa","type1") -end - -fonts.formats.pfb = "type1" -fonts.readers.pfb = pfb_reader -fonts.handlers.pfb = { } --- empty, as with tfm - -fonts.formats.pfa = "type1" -fonts.readers.pfa = pfa_reader -fonts.handlers.pfa = { } +local lfsisfile = lfs.isfile +local fileaddsuffix = file.addsuffix +local filebasename = file.basename +local stringsub = string.sub +local stringlower = string.lower +local stringupper = string.upper +local findbinfile = resolvers.findbinfile +local lpeg = require "lpeg" +local lpegmatch = lpeg.match +local P, S, Cp = lpeg.P, lpeg.S, lpeg.Cp resolvers.openbinfile = function (filename) if filename and filename ~= "" then @@ -61,6 +53,31 @@ resolvers.loadbinfile = function (filename, filetype) end +--- this function is required because AFM precedes TFM in the reader +--- chain (see definers.loadfont() in font-def.lua + +local 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 font.read_tfm (specification.filename, + specification.size) + end +end + +readers.check_tfm = check_tfm + --[[ <EXPERIMENTAL> ]] --[[doc-- @@ -87,4 +104,65 @@ require "luaotfload-font-afk.lua" --[[ </EXPERIMENTAL> ]] +--[[doc-- + + The PFB/PFA reader checks whether there is a corresponding AFM file + and hands the spec over to the AFM loader if appropriate. Context + uses string.gsub() to accomplish this but that can cause collateral + damage. + +--doc]]-- + +local mk_type1_reader = function (format) + + format = stringlower (format) + local first = stringsub (format, 1, 1) + local second = stringsub (format, 2, 2) + local third = stringsub (format, 3, 3) + + local p_format = P"." + * (P(first) + P(stringupper (first))) + * (P(second) + P(stringupper (second))) + * (P(third) + P(stringupper (third))) + --- we have to be careful here so we don’t affect + --- harmless substrings + * (P"(" --- subfont + + P":" --- feature list + + P(-1)) --- end of string + local no_format = 1 - p_format + local p_format_file = no_format^1 * Cp() * p_format * Cp() + + local reader = function (specification, method) + + local afmfile = fileaddsuffix (specification.name, "afm") + + if lfsisfile (afmfile) then + --- switch to afm reader + logs.names_report ("log", 0, "type1", + "Found corresponding AFM file %s, using that.", + filebasename (afmfile)) + local oldspec = specification.specification + local before, after = lpegmatch (p_format_file, oldspec) + specification.specification = stringsub (oldspec, 1, before) + .. "afm" + .. stringsub (oldspec, after - 1) + specification.forced = "afm" + return readers.afm (specification, method) + end + + --- else read pfb via opentype mechanism + return readers.opentype (specification, format, "type1") + end + + return reader +end + +formats.pfa = "type1" +readers.pfa = mk_type1_reader "pfa" +handlers.pfa = { } + +formats.pfb = "type1" +readers.pfb = mk_type1_reader "pfb" +handlers.pfb = { } --- empty, as with tfm + -- vim:tw=71:sw=2:ts=2:expandtab |