diff options
| author | Philipp Gesang <phg42.2a@gmail.com> | 2013-04-25 17:26:16 +0200 | 
|---|---|---|
| committer | Philipp Gesang <phg42.2a@gmail.com> | 2013-04-25 17:26:16 +0200 | 
| commit | 3a645a338fc4297bc9a61dae1fece13533d2f3ee (patch) | |
| tree | e908457bb4245325026be0b48eda0975b9d9fd7c | |
| parent | 38c8611e8af03e7da61919b3c723cc34e9a62c27 (diff) | |
| download | luaotfload-3a645a338fc4297bc9a61dae1fece13533d2f3ee.tar.gz | |
store preprocessed font names with db
| -rw-r--r-- | luaotfload-database.lua | 82 | 
1 files changed, 47 insertions, 35 deletions
diff --git a/luaotfload-database.lua b/luaotfload-database.lua index acc351f..bd664a6 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -436,12 +436,18 @@ resolve = function (_,_,specification) -- the 1st two parameters are used by Con      for _,face in next, data.mappings do          --- TODO we really should store those in dedicated          --- .sanitized field -        local family    = sanitize_string(face.names and face.names.family) -        local subfamily = sanitize_string(face.names and face.names.subfamily) -        local fullname  = sanitize_string(face.names and face.names.fullname) -        local psname    = sanitize_string(face.names and face.names.psname) -        local fontname  = sanitize_string(face.fontname) -        local pfullname = sanitize_string(face.fullname) +        local family, subfamily, fullname, psname, fontname, pfullname + +        local facenames = face.sanitized +        if facenames then +            family      = facenames.family +            subfamily   = facenames.subfamily +            fullname    = facenames.fullname +            psname      = facenames.psname +        end +        fontname  = facenames.fontname  or sanitize_string(face.fontname) +        pfullname = facenames.pfullname or sanitize_string(face.fullname) +          local optsize, dsnsize, maxsize, minsize          if #face.size > 0 then              optsize = face.size @@ -483,30 +489,24 @@ resolve = function (_,_,specification) -- the 1st two parameters are used by Con              elseif subfamily == "regular" or                      synonym_set.regular[subfamily] then                  found.fallback = face -            elseif name == fullname then -                --- happens with Libertine Mono which has -                --- “mono” as subfamily -                found[1] = face -                break              end +        end -        else -            if name == fullname -            or name == pfullname -            or name == fontname -            or name == psname then -                if optsize then -                    if dsnsize == size -                    or (size > minsize and size <= maxsize) then -                        found[1] = face -                        break -                    else -                        found[#found+1] = face -                    end -                else +        if name == fullname +        or name == pfullname +        or name == fontname +        or name == psname then +            if optsize then +                if dsnsize == size +                or (size > minsize and size <= maxsize) then                      found[1] = face                      break +                else +                    found[#found+1] = face                  end +            else +                found[1] = face +                break              end          end      end @@ -623,7 +623,7 @@ find_closest = function (name, limit)      for n = 1, n_fonts do          local current    = mappings[n] -        local cnames     = current.names +        local cnames     = current.sanitized          --[[              This is simplistic but surpisingly fast.              Matching is performed against the “family” name @@ -675,6 +675,14 @@ find_closest = function (name, limit)      return false  end --- find_closest() +local sanitize_names = function (names) +    local res = { } +    for idx, name in next, names do +        res[idx] = sanitize_string(name) +    end +    return res +end +  --[[doc--  The data inside an Opentype font file can be quite heterogeneous.  Thus in order to get the relevant information, parts of the original @@ -701,18 +709,22 @@ font_fullinfo = function (filename, subfont, texmf)      if metadata.names then          for _, namedata in next, metadata.names do              if namedata.lang == "English (US)" then -                tfmdata.names = { +                local names = {                      --- see                      --- https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html -                    fullname = namedata.names.compatfull -                            or namedata.names.fullname, -                    family   = namedata.names.preffamilyname -                            or namedata.names.family, -                    subfamily= tfmdata.fontstyle_name -                            or namedata.names.prefmodifiers -                            or namedata.names.subfamily, -                    psname   = namedata.names.postscriptname +                    fullname  = namedata.names.compatfull +                             or namedata.names.fullname, +                    family    = namedata.names.preffamilyname +                             or namedata.names.family, +                    subfamily = tfmdata.fontstyle_name +                             or namedata.names.prefmodifiers +                             or namedata.names.subfamily, +                    psname    = namedata.names.postscriptname, +                    pfullname = metadata.fullname, +                    fontname  = metadata.fontname,                  } +                tfmdata.names     = names +                tfmdata.sanitized = sanitize_names(names)              end          end      else  | 
