1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
if not modules then modules = { } end modules ['font-imp-dimensions'] = {
version = 1.001,
comment = "companion to font-ini.mkiv and hand-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
if not context then return end
local next, type, tonumber = next, type, tonumber
local fonts = fonts
local utilities = utilities
local helpers = fonts.helpers
local prependcommands = helpers.prependcommands
local charcommand = helpers.commands.char
local rightcommand = helpers.commands.right
local handlers = fonts.handlers
local otf = handlers.otf
local afm = handlers.afm
local registerotffeature = otf.features.register
local registerafmfeature = afm.features.register
local settings_to_array = utilities.parsers.settings_to_array
local gettexdimen = tex.getdimen
-- For Wolfgang Schuster:
--
-- \definefontfeature[thisway][default][script=hang,language=zhs,dimensions={2,2,2}]
-- \definedfont[file:kozminpr6nregular*thisway]
local function initialize(tfmdata,key,value)
if type(value) == "string" and value ~= "" then
local characters = tfmdata.characters
local parameters = tfmdata.parameters
local emwidth = parameters.quad
local exheight = parameters.xheight
local newwidth = false
local newheight = false
local newdepth = false
local newshift = false
if value == "strut" then
newheight = gettexdimen("strutht")
newdepth = gettexdimen("strutdp")
elseif value == "mono" then
newwidth = emwidth
elseif value == "halfmono" then
newwidth = emwidth / 2
else
-- there are fonts out there with no x_height ...
local spec = settings_to_array(value)
newwidth = spec[1]
newheight = spec[2]
newdepth = spec[3]
newshift = spec[4]
local quad = parameters.quad or 0
local ascender = parameters.ascender or 0
local descender = parameters.descender or 0
if newwidth == "max" then
newwidth = quad
else
newwidth = tonumber(newwidth)
if newwidth then
newwidth = newwidth * emwidth
end
end
if newheight == "max" then
newheight = ascender
else
newheight = tonumber(newheight)
if newheight then
newheight = newheight * exheight
end
end
if newdepth == "max" then
newdepth = descender
else
newdepth = tonumber(newdepth)
if newdepth then
newdepth = newdepth * exheight
end
end
if parameters.x_heigth == 0 then
-- maybe a fourth parameter
parameters.x_heigth = (ascender + descender) / 2
end
end
-- todo: hshift too
if newwidth or newheight or newdepth then
for unicode, character in next, characters do
local oldwidth = character.width
local oldheight = character.height
local olddepth = character.depth
local width = newwidth or oldwidth or 0
local height = newheight or oldheight or 0
local depth = newdepth or olddepth or 0
if oldwidth ~= width or oldheight ~= height or olddepth ~= depth then
character.width = width
-- character.advance = oldwidth
character.height = height
character.depth = depth
if oldwidth ~= width then
-- todo: xoffset
local commands = character.commands
local hshift = rightcommand[newshift or ((width - oldwidth) / 2)]
if commands then
character.commands = prependcommands (
commands,
hshift
)
else
character.commands = {
hshift,
charcommand[unicode],
}
end
end
end
end
end
end
end
local specification = {
name = "dimensions",
description = "force dimensions",
manipulators = {
base = initialize,
node = initialize,
}
}
registerotffeature(specification)
registerafmfeature(specification)
|