diff options
author | Philipp Gesang <phg@phi-gamma.net> | 2017-02-02 22:59:15 +0100 |
---|---|---|
committer | Philipp Gesang <phg@phi-gamma.net> | 2017-02-02 22:59:21 +0100 |
commit | 529578f58c8221f7fe3deaceecec3a4cf3ff8f2d (patch) | |
tree | 8ed3858cdff0d0dce95a79a5bd41ea0f03d0448e | |
parent | 7250ac958d842f45d28220db87203506d3ae65c0 (diff) | |
download | luaotfload-529578f58c8221f7fe3deaceecec3a4cf3ff8f2d.tar.gz |
[db] fix design size scaling
As discussed in issue #398.
Ad futuram rei memoriam the gist of it:
- For the index, all values are scaled (decipoints * sp) / 10 *
(7227 / 7200).
- The ``bp`` case (the default, OT-standard), needs no conversion
because it matches how values are stored in the index.
- The ``pt`` case essentially reverts the bp→pt part of scaling
done for the database by scaling the asked size by the same
factor, i. e. by 7227 / 7200.
- The ``dd`` needs an extra 1238 / 1157.
Requesting a font at 10pt will then:
- ask for a size of 655360 for ``bp`` / default;
- ask for 657817 for ``pt``;
- ask for 703870 for ``dd``.
-rw-r--r-- | src/luaotfload-database.lua | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/src/luaotfload-database.lua b/src/luaotfload-database.lua index 5e4fd7a..fbe0961 100644 --- a/src/luaotfload-database.lua +++ b/src/luaotfload-database.lua @@ -1042,22 +1042,27 @@ local lookup_fontname = function (specification, name, style) return nil, nil end -local design_size_dimension -local set_size_dimension +local design_size_dimension --- scale asked size if not using bp +local set_size_dimension --- called from config do - --- cf. TeXbook p. 57 + --- cf. TeXbook p. 57; the index stores sizes pre-scaled from bp to + --- sp. This allows requesting sizes we got from the TeX end + --- without further conversion. For the other options *pt* and *dd* + --- we scale the requested size as though the value in the font was + --- specified in the requested unit. + local dimens = { - pt = function (v) return v end, - bp = function (v) return (v * 7227) / 7200 end, - dd = function (v) return (v * 1238) / 1157 end, + bp = false, + pt = function (v) return v * (7227 / 7200) end, + dd = function (v) return v * (7227 / 7200) * (1238 / 1157) end, } design_size_dimension = dimens.bp set_size_dimension = function (dim) local f = dimens [dim] - if f then + if f ~= nil then logreport ("both", 4, "db", "Interpreting design sizes as %q, factor %.6f.", dim, f (1.000000)) @@ -1135,7 +1140,10 @@ lookup_font_name = function (specification) askedsize = 0 end end - askedsize = design_size_dimension (askedsize) + + if design_size_dimension ~= false then + askedsize = design_size_dimension (askedsize) + end resolved, subfont = lookup_familyname (specification, name, @@ -1350,9 +1358,16 @@ local load_font_file = function (filename, subfont) return ret end +--- Design sizes in the fonts are specified in decipoints. For the +--- index these values are prescaled to sp which is what we’re dealing +--- with at the TeX end. + local get_size_info do --- too many upvalues :/ --- rawdata -> (int * int * int | bool) + local sp = 2^16 -- pt + local bp = 7227 / 7200 -- pt + get_size_info = function (rawinfo) local design_size = rawinfo.design_size local design_range_top = rawinfo.design_range_top @@ -1363,13 +1378,13 @@ local get_size_info do --- too many upvalues :/ or design_range_top ~= 0 and design_range_top if fallback_size then - design_size = ((design_size or fallback_size) * 2^16) / 10 - design_range_top = ((design_range_top or fallback_size) * 2^16) / 10 - design_range_bottom = ((design_range_bottom or fallback_size) * 2^16) / 10 + design_size = ((design_size or fallback_size) * sp) / 10 + design_range_top = ((design_range_top or fallback_size) * sp) / 10 + design_range_bottom = ((design_range_bottom or fallback_size) * sp) / 10 - design_size = (design_size * 7227) / 7200 - design_range_top = (design_range_top * 7227) / 7200 - design_range_bottom = (design_range_bottom * 7227) / 7200 + design_size = design_size * bp + design_range_top = design_range_top * bp + design_range_bottom = design_range_bottom * bp return { design_size, design_range_top, design_range_bottom, |