diff options
Diffstat (limited to 'src/fontloader/misc')
-rw-r--r-- | src/fontloader/misc/fontloader-plain-tfm.lua | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/fontloader/misc/fontloader-plain-tfm.lua b/src/fontloader/misc/fontloader-plain-tfm.lua new file mode 100644 index 0000000..4a08fb4 --- /dev/null +++ b/src/fontloader/misc/fontloader-plain-tfm.lua @@ -0,0 +1,120 @@ +if not modules then modules = { } end modules ['luatex-plain-tfm'] = { + version = 1.001, + comment = "companion to luatex-*.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- \font\foo=file:luatex-plain-tfm.lua:tfm=csr10;enc=csr;pfb=csr10 at 12pt +-- \font\bar=file:luatex-plain-tfm.lua:tfm=csr10;enc=csr at 12pt +-- +-- \foo áäčďěíĺľňóôŕřšťúýž ff ffi \input tufte\par +-- \bar áäčďěíĺľňóôŕřšťúýž ff ffi \input tufte\par + +local outfiles = { } + +return function(specification) + + local size = specification.size + local name = specification.name + local feat = specification.features and specification.features.normal + + if not feat then + return + end + + local tfm = feat.tfm + local enc = feat.enc or tfm + local pfb = feat.pfb + + if not tfm then + return + end + + local tfmfile = tfm .. ".tfm" + local encfile = enc .. ".enc" + + local tfmdata, id = fonts.constructors.readanddefine("file:"..tfmfile,size) + + local encoding = fonts.encodings.load(encfile) + if encoding then + encoding = encoding.hash + else + encoding = false + end + + local unicoding = fonts.encodings.agl and fonts.encodings.agl.unicodes + + if tfmdata and encoding and unicoding then + + tfmdata = table.copy(tfmdata) -- good enough for small fonts + + local characters = { } + local originals = tfmdata.characters + local indices = { } + local parentfont = { "font", 1 } + local private = fonts.constructors.privateoffset + + -- create characters table + + for name, index in table.sortedhash(encoding) do -- predictable order + local unicode = unicoding[name] + local original = originals[index] + if not unicode then + unicode = private + private = private + 1 + report_tfm("glyph %a in font %a gets private unicode %U",name,tfmfile,private) + end + characters[unicode] = original + indices[index] = unicode + original.name = name -- so one can lookup weird names + original.commands = { parentfont, { "char", index } } + end + + -- redo kerns and ligatures + + for k, v in next, characters do + local kerns = v.kerns + if kerns then + local t = { } + for k, v in next, kerns do + local i = indices[k] + t[i] = v + end + v.kerns = t + end + local ligatures = v.ligatures + if ligatures then + local t = { } + for k, v in next, ligatures do + t[indices[k]] = v + v.char = indices[v.char] + end + v.ligatures = t + end + end + + -- wrap up + + tfmdata.fonts = { { id = id } } + tfmdata.characters = characters + + -- resources + + local outfile = outfiles[tfmfile] + + if outfile == nil then + if pfb then + outfile = pfb .. ".pfb" + pdf.mapline(tfm .. "<" .. outfile) + else + outfile = false + end + outfiles[tfmfile] = outfile + end + + end + + return tfmdata +end |