From adbde7d798a5b39d6524fe39396fe1cc8de71d09 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 12 Apr 2016 08:14:23 +0200 Subject: [db] adjust names extraction to Lua loader --- src/luaotfload-database.lua | 138 +++++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 59 deletions(-) diff --git a/src/luaotfload-database.lua b/src/luaotfload-database.lua index 6c02344..24c2745 100644 --- a/src/luaotfload-database.lua +++ b/src/luaotfload-database.lua @@ -58,9 +58,10 @@ local fontshandlers = fonts.handlers or { } local otfhandler = fonts.handlers.otf or { } fonts.handlers = fontshandlers -local read_font_file = otfhandler.readers.getinfo +local read_font_file = otfhandler.readers.loadfont local read_font_info = read_font_file local close_font_file = function () end +local get_english_names local gzipload = gzip.load local gzipsave = gzip.save @@ -297,7 +298,6 @@ This is a sketch of the luaotfload db: prefmodifiers : string; // sanitized preferred subfamily (names table 14) psname : string; // PostScript name size : (false | float * float * float); // if available, size info from the size table converted from decipoints - splainname : string; // sanitized version of the “plainname” field splitstyle : string; // style information obtained by splitting the full name at the last dash subfamily : string; // sanitized subfamily (names table 2) subfont : (int | bool); // integer if font is part of a TrueType collection ("ttc") @@ -943,7 +943,6 @@ local lookup_fontname = function (specification, name, style) local prefmodifiers = face.prefmodifiers local subfamily = face.subfamily if face.fontname == name - or face.splainname == name or face.fullname == name or face.psname == name then @@ -1240,10 +1239,10 @@ end --- rawdata -> (int * int * int | bool) -local get_size_info = function (metadata) - local design_size = metadata.design_size - local design_range_top = metadata.design_range_top - local design_range_bottom = metadata.design_range_bottom +local get_size_info = function (rawinfo) + local design_size = rawinfo.design_size + local design_range_top = rawinfo.design_range_top + local design_range_bottom = rawinfo.design_range_bottom local fallback_size = design_size ~= 0 and design_size or design_range_bottom ~= 0 and design_range_bottom @@ -1261,10 +1260,14 @@ local get_size_info = function (metadata) return false end -local get_english_names = function (metadata) - local names = metadata.names - local english_names +--[[doc-- + get_english_names_from_ff -- For legacy Fontforge-style names + tables. Extracted from the actual names table, not the font item + itself. +--doc]]-- +local get_english_names_from_ff = function (metadata) + local names = metadata.names if names then for _, raw_namedata in next, names do if raw_namedata.lang == "English (US)" then @@ -1280,6 +1283,33 @@ local get_english_names = function (metadata) fullname = metadata.fullname, } end +--[[doc-- + map_enlish_names -- Names-table for Lua fontloader objects. This + may vanish eventually once we ditch Fontforge completely. Only + subset of entries of that table are actually relevant so we’ll + stick to that part. +--doc]]-- + +local names_items = { + compatfull = "compatiblename", + fullname = "fullname", + postscriptname = "fontname", + preffamily = "familyname", + prefmodifiers = "subfamilyname", + family = "family", + subfamily = "subfamily", +} + +local map_english_names = function (metadata) + local nameinfo = { } + for ours, theirs in next, names_items do + nameinfo [ours] = metadata [theirs] + end + return nameinfo +end + +get_english_names = map_english_names + --[[-- In case of broken PS names we set some dummies. @@ -1287,10 +1317,8 @@ end structure the same as in the tfmdata. --]]-- local get_raw_info = function (metadata, basename) - local fullname local fontname = metadata.fontname local fullname = metadata.fullname - local psname local validation_state = metadata.validation_state if (validation_state and tablecontains (validation_state, "bad_ps_fontname")) @@ -1313,32 +1341,31 @@ local get_raw_info = function (metadata, basename) fullname = fullname, italicangle = metadata.italicangle, names = metadata.names, - pfminfo = metadata.pfminfo, units_per_em = metadata.units_per_em, version = metadata.version, - design_size = metadata.design_size, - design_range_top = metadata.design_range_top, - design_range_bottom = metadata.design_range_bottom, + design_size = metadata.design_size or metadata.designsize, + design_range_top = metadata.design_range_top or metadata.maxsize, + design_range_bottom = metadata.design_range_bottom or metadata.minsize, } end local organize_namedata = function (rawinfo, - english_names, + nametable, basename, info) - local default_name = english_names.compatfull - or english_names.fullname - or english_names.postscriptname + local default_name = nametable.compatfull + or nametable.fullname + or nametable.postscriptname or rawinfo.fullname or rawinfo.fontname or info.fullname or info.fontname - local default_family = english_names.preffamily - or english_names.family + local default_family = nametable.preffamily + or nametable.family or rawinfo.familyname or info.familyname --- local default_modifier = english_names.prefmodifiers --- or english_names.subfamily +-- local default_modifier = nametable.prefmodifiers +-- or nametable.subfamily local fontnames = { --- see --- https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html @@ -1353,19 +1380,19 @@ local organize_namedata = function (rawinfo, --- non-abbreviated fashion, for most fonts at any rate. --- However, in some fonts (e.g. CMU) all three fields are --- identical. - fullname = --[[ 18 ]] english_names.compatfull - or --[[ 4 ]] english_names.fullname + fullname = --[[ 18 ]] nametable.compatfull + or --[[ 4 ]] nametable.fullname or default_name, --- we keep both the “preferred family” and the “family” --- values around since both are valid but can turn out --- quite differently, e.g. with Latin Modern: --- preffamily: “Latin Modern Sans”, --- family: “LM Sans 10” - preffamily = --[[ 16 ]] english_names.preffamilyname, - family = --[[ 1 ]] english_names.family or default_family, - prefmodifiers = --[[ 17 ]] english_names.prefmodifiers, - subfamily = --[[ 2 ]] english_names.subfamily, - psname = --[[ 6 ]] english_names.postscriptname, + preffamily = --[[ 16 ]] nametable.preffamilyname, + family = --[[ 1 ]] nametable.family or default_family, + prefmodifiers = --[[ 17 ]] nametable.prefmodifiers, + subfamily = --[[ 2 ]] nametable.subfamily or rawinfo.subfamilyname, + psname = --[[ 6 ]] nametable.postscriptname, }, metadata = { @@ -1417,22 +1444,19 @@ local split_fontname = function (fontname) end end -local organize_styledata = function (fontname, - metadata, - english_names, - info) - local pfminfo = metadata.pfminfo or { } - local names = metadata.names +local organize_styledata = function (metadata, rawinfo, info) + local pfminfo = metadata.pfminfo + local names = rawinfo.names return { --- see http://www.microsoft.com/typography/OTSPEC/features_pt.htm#size - size = get_size_info (metadata), - weight = pfminfo.weight or 400, - split = split_fontname (fontname), - width = pfminfo.width, + size = get_size_info (rawinfo), + weight = pfminfo and pfminfo.weight or metadata.pfmweight or 400, + split = split_fontname (rawinfo.fontname), + width = pfminfo and pfminfo.width or metadata.pfmwidth, italicangle = metadata.italicangle, --- this is for querying, see www.ntg.nl/maps/40/07.pdf for details - units_per_em = metadata.units_per_em, + units_per_em = metadata.units_per_em or metadata.units, version = metadata.version, } end @@ -1458,14 +1482,13 @@ ot_fullinfo = function (filename, end local rawinfo = get_raw_info (metadata, basename) - local english_names = get_english_names (rawinfo) + local nametable = get_english_names (metadata) local namedata = organize_namedata (rawinfo, - english_names, + nametable, basename, info) - local style = organize_styledata (namedata.fontname, + local style = organize_styledata (metadata, rawinfo, - english_names, info) local res = { @@ -1508,7 +1531,6 @@ t1_fullinfo = function (filename, _subfont, location, basename, format) sanitized = sanitize_fontnames ({ fontname = fontname, psname = fullname, - pfullname = fullname, metafamily = family, familyname = familyname, weight = metadata.weight, --- string identifier @@ -1535,13 +1557,12 @@ t1_fullinfo = function (filename, _subfont, location, basename, format) fontname = sanitized.fontname, familyname = sanitized.familyname, plainname = fullname, - splainname = sanitized.fullname, psname = sanitized.fontname, version = metadata.version, size = false, splitstyle = splitstyle, fontstyle_name = style ~= "" and style or weight, - weight = metadata.pfminfo.weight or 400, + weight = metadata.pfminfo and pfminfo.weight or 400, italicangle = italicangle, } end @@ -2553,7 +2574,6 @@ local pull_values = function (entry) entry.psname = english.psname entry.fontname = info.fontname or metadata.fontname entry.fullname = english.fullname or info.fullname - entry.splainname = metadata.fullname entry.prefmodifiers = english.prefmodifiers local metafamily = metadata.familyname local familyname = english.preffamily or english.family @@ -2588,8 +2608,6 @@ local add_family = function (name, subtable, modifier, entry) subtable [name] = familytable end - local size = entry.size - familytable [#familytable + 1] = { index = entry.index, modifier = modifier, @@ -3423,14 +3441,16 @@ end local use_fontforge = function (val) if val == true then - local fontloader = fontloader - read_font_info = fontloader.info - read_font_file = fontloader.open - close_font_file = fontloader.close + local fontloader = fontloader + read_font_info = fontloader.info + read_font_file = fontloader.open + close_font_file = fontloader.close + get_english_names = get_english_names_from_ff else - read_font_file = otfhandler.readers.getinfo - read_font_info = read_font_file - close_font_file = function () end + read_font_file = otfhandler.readers.getinfo + read_font_info = read_font_file + close_font_file = function () end + get_english_names = map_english_names end end -- cgit v1.2.3