Skip to content
This repository has been archived by the owner on Aug 17, 2019. It is now read-only.

Commit

Permalink
[db] fix design size scaling
Browse files Browse the repository at this point in the history
As discussed in issue lualatex#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``.
  • Loading branch information
phi-gamma committed Feb 2, 2017
1 parent 7250ac9 commit 529578f
Showing 1 changed file with 29 additions and 14 deletions.
43 changes: 29 additions & 14 deletions src/luaotfload-database.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand Down

0 comments on commit 529578f

Please sign in to comment.