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 | |
parent | 0aed99a49103b61e93d68ee7b3132fbc9f5adc42 (diff) | |
parent | 74f7e2976e65c04881ac16470c974ed052df125b (diff) | |
download | luaotfload-a5458c60dbbc0b81c6d39748772d6b2ce184c287.tar.gz |
Merge pull request #123 from phi-gamma/master
refine AFM support
-rw-r--r-- | filegraph.dot | 27 | ||||
-rw-r--r-- | luaotfload-loaders.lua | 124 | ||||
-rw-r--r-- | luaotfload.dtx | 38 | ||||
-rwxr-xr-x | mkstatus | 2 |
4 files changed, 153 insertions, 38 deletions
diff --git a/filegraph.dot b/filegraph.dot index e412279..f69c751 100644 --- a/filegraph.dot +++ b/filegraph.dot @@ -63,6 +63,17 @@ strict digraph luaotfload_files { //looks weird with circo ... luaotfload_libs -> font_names [label="luaotfload-database.lua"] luaotfload_libs -> typo_krn [label="luaotfload-extralibs.lua"] + luaotfload_libs -> font_afm [label="luaotfload-loaders.lua"] + luaotfload_libs -> font_afk [label="luaotfload-loaders.lua"] + + subgraph cluster_afm { rank = same; + label = "AFM support"; + node [style=filled, color=white]; + style = "filled,rounded"; + color = "grey90:white"; + font_afm; + font_afk; } + mkstatus -> status [label="generates from distribution files", style=dashed] @@ -147,6 +158,22 @@ strict digraph luaotfload_files { //looks weird with circo ... style = "filled,rounded", penwidth=2] + font_afk [label = "luaotfload-font-afk.lua", + shape = rect, + width = "3.2cm", + height = "1.2cm", + color = "#01012222", + style = "filled,rounded", + penwidth=2] + + font_afm [label = "luaotfload-font-afm.lua", + shape = rect, + width = "3.2cm", + height = "1.2cm", + color = "#01012222", + style = "filled,rounded", + penwidth=2] + typo_krn [label = "luaotfload-typo-krn.lua", shape = rect, width = "3.2cm", 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 diff --git a/luaotfload.dtx b/luaotfload.dtx index 4802844..56e9d4d 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1178,7 +1178,7 @@ and the derived files % % Also, the merged file at some point % loads the Adobe Glyph List from a \LUA table that is contained in -% \fileent{luaotfload-glyphlist.lua}, which is automatically generated by the % +% \fileent{luaotfload-glyphlist.lua}, which is automatically generated by the % script \fileent{mkglyphlist}.\footnote{% % See \fileent{luaotfload-font-enc.lua}. % The hard-coded file name is why we have to replace the procedure @@ -1199,20 +1199,28 @@ and the derived files % \normalitem{\fileent{#1}}% % \space--\hskip1em % } -% \ouritem {luaotfload-features.lua} font feature handling; -% incorporates some of the code from -% \fileent{font-otc} from \CONTEXT; -% \ouritem {luaotfload-override.lua} overrides the \CONTEXT logging -% functionality. -% \ouritem {luaotfload-loaders.lua} registers the \OpenType -% font reader as handler for -% Postscript fonts -% (\abbrev{pfa}, \abbrev{pfb}). -% \ouritem {luaotfload-database.lua} font names database. -% \ouritem {luaotfload-colors.lua} color handling. -% \ouritem {luaotfload-auxiliary.lua} access to internal functionality -% for package authors -% (proposals for additions welcome). +% \ouritem {luaotfload-features.lua} font feature handling; +% incorporates some of the code from +% \fileent{font-otc} from \CONTEXT; +% \ouritem {luaotfload-override.lua} overrides the \CONTEXT logging +% functionality. +% \ouritem {luaotfload-loaders.lua} registers the \OpenType +% font reader as handler for +% Postscript fonts +% (\abbrev{pfa}, \abbrev{pfb}). +% \ouritem {luaotfload-database.lua} font names database. +% \ouritem {luaotfload-colors.lua} color handling. +% \ouritem {luaotfload-auxiliary.lua} access to internal functionality +% for package authors +% (proposals for additions welcome). +% \ouritem {luaotfload-extralibs.lua} layer for loading of further +% Context libraries. +% \ouritem {luaotfload-letterspace.lua} font-based letterspacing. +% \ouritem {luaotfload-typo-krn.lua} attribute-based letterspacing. +% \ouritem {luaotfload-font-afm.lua} \abbrev{afm} loading. +% \ouritem {luaotfload-font-afk.lua} supplementary glyph +% information for \abbrev{afm} +% fonts. % \end{itemize} % % \begin{figure}[b] @@ -42,6 +42,8 @@ local names = { "luaotfload-diagnostics.lua", "luaotfload-extralibs.lua", "luaotfload-features.lua", + "luaotfload-font-afk.lua", + "luaotfload-font-afm.lua", "luaotfload-fonts-cbk.lua", "luaotfload-fonts-def.lua", "luaotfload-fonts-enc.lua", |