diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2010-04-02 05:55:23 +0200 |
---|---|---|
committer | Khaled Hosny <khaledhosny@eglug.org> | 2010-04-02 07:07:41 +0200 |
commit | 6ef791e91eb0c497494cbb12063d9ef72841080e (patch) | |
tree | a8ed0cc3104c691a92b67e81fb1f847238f26d0a | |
parent | 868e6b8d73fc2e9d75d39507ff261c7b34b78002 (diff) | |
download | luaotfload-6ef791e91eb0c497494cbb12063d9ef72841080e.tar.gz |
Rewrite font matching logic to be more consistent
We now simply loop over the whole data.mappings table, so loading font
by family, fullname, psname etc is all the same, but it is a bit slower
now (~0.25s with syatemfonts.tex).
-rw-r--r-- | otfl-font-nms.lua | 118 | ||||
-rw-r--r-- | tests/fullname.tex | 2 |
2 files changed, 68 insertions, 52 deletions
diff --git a/otfl-font-nms.lua b/otfl-font-nms.lua index 3cedaa2..51db3bd 100644 --- a/otfl-font-nms.lua +++ b/otfl-font-nms.lua @@ -29,7 +29,11 @@ local trace_search = false --trackers.register("names.search", function(v) t local trace_loading = false --trackers.register("names.loading", function(v) trace_loading = v end) local function sanitize(str) - return utfgsub(lower(str), "[^%a%d]", "") + if str then + return utfgsub(lower(str), "[^%a%d]", "") + else + return str -- nil + end end function names.load() @@ -57,8 +61,8 @@ local synonyms = { } function names.resolve(specification) - local name = specification.name - local style = specification.style or "regular" + local name = sanitize(specification.name) + local style = sanitize(specification.style) or "regular" if not loaded then names.data = names.load() loaded = true @@ -66,59 +70,69 @@ function names.resolve(specification) local data = names.data if type(data) == "table" and data.version == names.version then if data.mappings then - local family = data.families[sanitize(name)] - if family and type(family) == "table" then - for _,v in ipairs(family) do - local face = data.mappings[v] - local subfamily = sanitize(face.names.subfamily) - local filename = face.filename - local optsize, rqssize, dsnsize, maxsize, minsize - if #face.size > 0 then - optsize = face.size - rqssize = tonumber(specification.optsize) or specification.size and specification.size / 65536 - dsnsize = optsize[1] and optsize[1] / 10 - maxsize = optsize[2] and optsize[2] / 10 or dsnsize -- can be nil - minsize = optsize[3] and optsize[3] / 10 or dsnsize -- can be nil - end - if subfamily then - if subfamily == style then - if optsize then - if dsnsize == rqssize or (rqssize > minsize and rqssize <= maxsize) then - logs.report("load font", "font family='%s', subfamily='%s' found: %s", name, style, filename) - return filename, false - end - else - logs.report("load font", "font family='%s', subfamily='%s' found: %s", name, style, filename) - return filename, false - end - else - if synonyms[style] then - for _,v in ipairs(synonyms[style]) do - if subfamily == v then - if optsize then - if dsnsize == rqssize or (rqssize > minsize and rqssize <= maxsize) then - logs.report("load font", "font family='%s', subfamily='%s' found: %s", name, style, filename) - return filename, false - end - else - logs.report("load font", "font family='%s', subfamily='%s' found: %s", name, style, filename) - return filename, false - end - end - end - end - end - end + local found + for _,face in ipairs(data.mappings) do + local family = sanitize(face.names.family) + local subfamily = sanitize(face.names.subfamily) + local fullname = sanitize(face.names.fullname) + local psname = sanitize(face.names.psname) + local filename = face.filename + local optsize, rqssize, dsnsize, maxsize, minsize + if #face.size > 0 then + optsize = face.size + rqssize = tonumber(specification.optsize) or specification.size and specification.size / 65536 + dsnsize = optsize[1] and optsize[1] / 10 + maxsize = optsize[2] and optsize[2] / 10 or dsnsize -- can be nil + minsize = optsize[3] and optsize[3] / 10 or dsnsize -- can be nil end - else - for i,v in ipairs(data.mappings) do - if sanitize(v.fullname) == sanitize(name) or sanitize(v.names.fullname) == sanitize(name) then - logs.report("load font", "font fullname='%s' found: %s", name, v.filename) - return v.filename, false + if name == family and subfamily then + if subfamily == style then + if optsize then + if dsnsize == rqssize or (rqssize > minsize and rqssize <= maxsize) then + found = filename + break + end + else + found = filename + break + end + else + if synonyms[style] then + for _,v in ipairs(synonyms[style]) do + if subfamily == v then + if optsize then + if dsnsize == rqssize or (rqssize > minsize and rqssize <= maxsize) then + found = filename + break + end + else + found = filename + break + end + end + end + end + end + else + if name == family or name == fullname or name == psname then + if optsize then + if dsnsize == rqssize or (rqssize > minsize and rqssize <= maxsize) then + found = filename + break + end + else + found = filename + break + end end end end - return name, false -- fallback to filename + if found then + logs.report("load font", "font family='%s', subfamily='%s' found: %s", name, style, found) + return found, false + else + return name, false -- fallback to filename + end end else logs.report("load font", "no font names database loaded") diff --git a/tests/fullname.tex b/tests/fullname.tex index ec73cb3..0209c98 100644 --- a/tests/fullname.tex +++ b/tests/fullname.tex @@ -2,6 +2,8 @@ \font\testa={LM Roman Slanted 10 Regular} at 10pt \font\testb={LM Roman 9 Italic} at 10pt +\font\testc={TeX Gyre Termes Bold} at 25pt \testa abcd ABCD\par \testb abcd ABCD\par +\testc abcd ABCD\par \bye |