summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Gesang <phg42.2a@gmail.com>2013-08-11 04:22:36 -0700
committerPhilipp Gesang <phg42.2a@gmail.com>2013-08-11 04:22:36 -0700
commita5458c60dbbc0b81c6d39748772d6b2ce184c287 (patch)
tree413707122c0b4aa5ebc200841c0ed16442d281ff
parent0aed99a49103b61e93d68ee7b3132fbc9f5adc42 (diff)
parent74f7e2976e65c04881ac16470c974ed052df125b (diff)
downloadluaotfload-a5458c60dbbc0b81c6d39748772d6b2ce184c287.tar.gz
Merge pull request #123 from phi-gamma/master
refine AFM support
-rw-r--r--filegraph.dot27
-rw-r--r--luaotfload-loaders.lua124
-rw-r--r--luaotfload.dtx38
-rwxr-xr-xmkstatus2
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]
diff --git a/mkstatus b/mkstatus
index 16d0b5d..5cd73d8 100755
--- a/mkstatus
+++ b/mkstatus
@@ -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",