summaryrefslogtreecommitdiff
path: root/luaotfload-database.lua
diff options
context:
space:
mode:
Diffstat (limited to 'luaotfload-database.lua')
-rw-r--r--luaotfload-database.lua74
1 files changed, 58 insertions, 16 deletions
diff --git a/luaotfload-database.lua b/luaotfload-database.lua
index 98c5d3f..09106a5 100644
--- a/luaotfload-database.lua
+++ b/luaotfload-database.lua
@@ -1479,10 +1479,7 @@ local organize_styledata = function (fontname,
return {
-- see http://www.microsoft.com/typography/OTSPEC/features_pt.htm#size
size = get_size_info (metadata),
- weight = {
- pfminfo.weight, -- integer (multiple of 100?)
- sanitize_fontname (info.weight), -- style name
- },
+ weight = pfminfo.weight or 400,
split = split_fontname (fontname),
width = pfminfo.width,
italicangle = metadata.italicangle,
@@ -1601,8 +1598,7 @@ t1_fullinfo = function (filename, _subfont, location, basename, format)
size = false,
splitstyle = splitstyle,
fontstyle_name = style ~= "" and style or weight,
- weight = { metadata.pfminfo.weight,
- weight },
+ weight = metadata.pfminfo.weight or 400,
italicangle = italicangle,
}
end
@@ -2458,13 +2454,55 @@ local check_regular
do
local splitfontname = lpeg.splitat "-"
- local choose_exact = function (field)
- if italic_synonym [field] then
+ --[[doc--
+
+ Regarding the italic angle, only a small minority of fonts advertise
+ oblique shape despite having a zero angle. On my machine, these are
+
+
+ # /luaotfload-tool.lua --list=subfamily:italic --fields=italicangle,plainname | grep -e '\s0\s' | cut -f 2,3
+ 0 Quattrocento Sans Italic
+ 0 Libre Baskerville Italic
+ 0 Cabin Italic
+ 0 PersianModern-Italic
+ 0 PersianModern-ItalicShadow
+ 0 PersianModern-ItalicOutline
+ 0 Alegreya SC Italic
+ 0 Alegreya Italic
+ 0 XB Niloofar Italic
+ 0 Bukyvede-Italic
+
+ (Weirdly, some of those set a nonzero italic angle only for the
+ bold italic variant, while neglecting to do so for the oblique
+ shape with normal weight ...)
+ These outliers can be detected by checking the appropriate subfamily
+ etc. fields.
+
+ --doc]]--
+
+ local choose_exact = function (field, weight, italicangle)
+ local i = false
+ local b = false
+
+ if italicangle ~= 0 or italic_synonym [field] then
+ i = true
+ end
+
+ if weight == 700 or field == "bold" then
+ b = true
+ end
+
+ if field == "bolditalic" or field == "boldoblique" then
+ b = true
+ i = true
+ end
+
+ if i and b then
+ return "bi"
+ elseif i then
return "i"
- elseif field == "bold" then
+ elseif b then
return "b"
- elseif field == "bolditalic" or field == "boldoblique" then
- return "bi"
end
return false
@@ -2473,16 +2511,18 @@ do
pick_style = function (fontstyle_name,
prefmodifiers,
subfamily,
- splitstyle)
+ splitstyle,
+ weight,
+ italicangle)
local style
if fontstyle_name then
- style = choose_exact (fontstyle_name)
+ style = choose_exact (fontstyle_name, weight, italicangle)
end
if not style then
if prefmodifiers then
- style = choose_exact (prefmodifiers)
+ style = choose_exact (prefmodifiers, weight, italicangle)
elseif subfamily then
- style = choose_exact (subfamily)
+ style = choose_exact (subfamily, weight, italicangle)
end
end
-- if not style and splitstyle then
@@ -2628,7 +2668,9 @@ local collect_families = function (mappings)
local modifier = pick_style (fontstyle_name,
prefmodifiers,
subfamily,
- splitstyle)
+ splitstyle,
+ weight,
+ italicangle)
if not modifier then --- regular, exact only
modifier = check_regular (fontstyle_name,