summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/font-tpk.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/font-tpk.lmt')
-rw-r--r--tex/context/base/mkxl/font-tpk.lmt135
1 files changed, 105 insertions, 30 deletions
diff --git a/tex/context/base/mkxl/font-tpk.lmt b/tex/context/base/mkxl/font-tpk.lmt
index bf74dedd9..2ad74d2a9 100644
--- a/tex/context/base/mkxl/font-tpk.lmt
+++ b/tex/context/base/mkxl/font-tpk.lmt
@@ -44,12 +44,11 @@ if not fonts then fonts = { handlers = { tfm = { } } } end
local handlers = fonts.handlers
local tfm = handlers.tfm or { }
handlers.tfm = tfm
+tfm.version = 1.005
+
local readers = tfm.readers or { }
tfm.readers = readers
-tfm.version = 1.005
-tfm.cache = containers.define("fonts", "tfm", tfm.version, true)
-
-- Performance is no real issue here so I didn't optimize too much. After
-- all, these files are small and we mostly use opentype or type1 fonts.
@@ -434,9 +433,66 @@ do
local rightboundary = -2
local boundarychar = 65536
+ local function toparts(extensible)
+ local top = extensible.top or 0
+ local middle = extensible.middle or 0
+ local extender = extensible.extender or 0
+ local bottom = extensible.bottom or 0
+ local extend = extender ~= 0 and { glyph = extender, extender = 1 }
+ if bottom == 0 and top == 0 and middle == 0 then
+ if extend then
+ return {
+ { glyph = extender },
+ extend,
+ }
+ end
+ else
+ local list = { }
+ local l = 0
+ if bottom ~= 0 then
+ l = l + 1 ; list[l] = { glyph = bottom }
+ end
+ if extend then
+ l = l + 1 ; list[l] = extend
+ end
+ if middle ~= 0 then
+ l = l + 1 ; list[l] = { glyph = middle }
+ if extend then
+ l = l + 1 ; list[l] = extend
+ end
+ end
+ if top ~= 0 then
+ l = l + 1 ; list[l] = { glyph = top }
+ end
+ return list
+ end
+ end
+
+ -- We don't cache because we hardly load tfm files multiple times and we need
+ -- to copy them anyway.
+
+ tfm.cache = containers.define("fonts", "tfm", tfm.version, true, true) -- reload: true
+
+ local filecache = tfm.cache
+ local cleanname = fonts.handlers.otf.readers.helpers.cleanname
+
+ local caching = true -- mainly for MS and HH as they test huge files with many instances
+
function readers.loadtfm(filename)
local data
--
+ local fileattr = lfs.attributes(filename)
+ local filesize = fileattr and fileattr.size or 0
+ local filetime = fileattr and fileattr.modification or 0
+ local fileformat = "tfm"
+ local filehash = cleanname(file.basename(filename))
+ --
+ data = caching and containers.read(filecache,filehash)
+ --
+ if data and data.filetime == filetime and data.filesize == filesize and data.fileformat == fileformat then
+ return data
+ end
+ --
local function someerror(m)
if not data then
data = { }
@@ -623,13 +679,13 @@ do
for i=0,ne-1 do
extensibles[i] = wide and {
top = readcardinal2(s),
- bottom = readcardinal2(s),
middle = readcardinal2(s),
+ bottom = readcardinal2(s),
extender = readcardinal2(s),
} or {
top = readcardinal1(s),
- bottom = readcardinal1(s),
middle = readcardinal1(s),
+ bottom = readcardinal1(s),
extender = readcardinal1(s),
}
end
@@ -764,7 +820,7 @@ do
remainder = 0
end
end
- glyphs[i] = {
+ local glyph = {
width = widths [width],
height = heights[height],
depth = depths [depth],
@@ -775,6 +831,15 @@ do
extensible = extensible,
next = nextinsize,
}
+ if extensible then
+ extensible = toparts(extensible)
+ if extensible then
+ glyph.parts = extensible
+ glyph.partsorientation = "vertical"
+ glyph.partsitalic = glyph.italic
+ end
+ end
+ glyphs[i] = glyph
end
end
for i=bc,ec do
@@ -838,7 +903,7 @@ do
-- v.remainder = nil
-- end
--
- return {
+ data = {
name = file.nameonly(filename),
fontarea = file.pathpart(filename),
glyphs = glyphs,
@@ -862,14 +927,24 @@ do
-- width = 0,
-- writingmode = "unknown",
}
+ --
+ data.filesize = filesize
+ data.fileformat = fileformat
+ data.filetime = filetime
+ if caching then
+ containers.write(filecache,filehash,data)
+ end
+ --
+ return data
end
end
do
- local push = { "push" }
- local push = { "pop" }
+ local pushcommand = fonts.helpers.commands.push
+ local popcommand = fonts.helpers.commands.pop
+ local slotcommand = fonts.helpers.commands.slot
local w, x, y, z, f
local stack
@@ -928,10 +1003,10 @@ do
local actions = {
- [128] = function() r = r + 1 result[r] = { "slot", f or 1, readcardinal1(s) } p = p + 1 end,
- [129] = function() r = r + 1 result[r] = { "slot", f or 1, readcardinal2(s) } p = p + 2 end,
- [130] = function() r = r + 1 result[r] = { "slot", f or 1, readcardinal3(s) } p = p + 3 end,
- [131] = function() r = r + 1 result[r] = { "slot", f or 1, readcardinal4(s) } p = p + 4 end,
+ [128] = function() r = r + 1 result[r] = slotcommand[f or 1][readcardinal1(s)] p = p + 1 end,
+ [129] = function() r = r + 1 result[r] = slotcommand[f or 1][readcardinal2(s)] p = p + 2 end,
+ [130] = function() r = r + 1 result[r] = slotcommand[f or 1][readcardinal3(s)] p = p + 3 end,
+ [131] = function() r = r + 1 result[r] = slotcommand[f or 1][readcardinal4(s)] p = p + 4 end,
[132] = function()
r = r + 1
@@ -940,34 +1015,34 @@ do
end,
[133] = function()
- r = r + 1 result[r] = push
- r = r + 1 result[r] = { "slot", f or 1, readcardinal1(s) }
- r = r + 1 result[r] = pop
+ r = r + 1 result[r] = pushcommand
+ r = r + 1 result[r] = slotcommand[f or 1][readcardinal1(s)]
+ r = r + 1 result[r] = popcommand
p = p + 1
end,
[134] = function()
- r = r + 1 result[r] = push
- r = r + 1 result[r] = { "slot", f or 1, readcardinal2(s) }
- r = r + 1 result[r] = pop
+ r = r + 1 result[r] = pushcommand
+ r = r + 1 result[r] = slotcommand[f or 1][readcardinal2(s)]
+ r = r + 1 result[r] = popcommand
p = p + 2
end,
[135] = function()
- r = r + 1 result[r] = push
- r = r + 1 result[r] = { "slot", f or 1, readcardinal2(s) }
- r = r + 1 result[r] = pop
+ r = r + 1 result[r] = pushcommand
+ r = r + 1 result[r] = slotcommand[f or 1][readcardinal3(s)]
+ r = r + 1 result[r] = popcommand
p = p + 3
end,
[136] = function()
- r = r + 1 result[r] = push
- r = r + 1 result[r] = { "slot", f or 1, readcardinal4(s) }
- r = r + 1 result[r] = pop
+ r = r + 1 result[r] = pushcommand
+ r = r + 1 result[r] = slotcommand[f or 1][readcardinal4(s)]
+ r = r + 1 result[r] = popcommand
p = p + 4
end,
[137] = function()
- r = r + 1 result[r] = push
+ r = r + 1 result[r] = pushcommand
r = r + 1 result[r] = { "rule", scaled4(), scaled4() }
- r = r + 1 result[r] = pop
+ r = r + 1 result[r] = popcommand
p = p + 8
end,
@@ -978,14 +1053,14 @@ do
[141] = function()
insert(stack, { w, x, y, z })
r = r + 1
- result[r] = push
+ result[r] = pushcommand
end,
[142] = function()
local t = remove(stack)
if t then
w, x, y, z = t[1], t[2], t[3], t[4]
r = r + 1
- result[r] = pop
+ result[r] = popcommand
end
end,
@@ -1048,7 +1123,7 @@ do
if f == 0 then
f = 1
end
- r = r + 1 ; result[r] = { "slot", f, cmd }
+ r = r + 1 ; result[r] = slotcommand[f][cmd]
end
elseif cmd >= 171 and cmd <= 234 then
cmd = cmd - 170