diff options
| -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",  | 
