Hi, Jin-Hwan Cho wrote:
Looks quite interesting. Does it use fontforge library? I tested a little with the fontforge library in LuaTeX. But it was not successful for CJK fonts. It took too much time.
Yes, it uses fontforge. I attach a small plain.tex test file and hacked version of Wlodek's opentype.lua. This is just a rough demonstration, proper support needs (much?) more work done of course. I just wanted to show that the glyphs are really there and can be accessed. Best wishes, Taco callback.register('define_font', function(name, size) fonttype = nil filename = kpse.find_file(name,"opentype fonts") if (filename) then fonttype = 'opentype' else filename = kpse.find_file(name, "truetype fonts") end if filename and not fonttype then fonttype = 'truetype' end if fonttype then if (size < 0) then size = (- 655.36) * size end ff, messages = fontforge.open(filename) if messages and #messages > 0 then for _, m in ipairs(messages) do texio.write_nl("load otf: [" .. filename .. "] warning: " .. m) end end ttffont = fontforge.to_table(ff) if ttffont then f = { } f.name = ttffont.fontname f.fullname = ttffont.names[1].names.fullname f.parameters = { } f.designsize = size f.size = size direction = 0 f.parameters.slant = 0 f.parameters.space = size * 0.25 f.parameters.space_stretch = 0.3 * size f.parameters.space_shrink = 0.1 * size f.parameters.x_height = 0.4 * size f.parameters.quad = 1.0 * size f.parameters.extra_space = 0 f.characters = { } mag = size / ttffont.units_per_em names_of_char = { } if ttffont.map then for char, glyph in pairs(ttffont.map.map) do names_of_char[ttffont.glyphs[glyph].name] = ttffont.map.backmap[glyph] end names_of_glyph = { } for char, glyph in pairs(ttffont.map.map) do names_of_glyph[ttffont.glyphs[glyph].name] = glyph end for char, glyph in pairs(ttffont.map.map) do glyph_table = ttffont.glyphs[glyph] f.characters[char] = { index = glyph, width = glyph_table.width * mag, name = glyph_table.name, } if glyph_table.kerns then local kerns = { } for _, kern in pairs(glyph_table.kerns) do kerns[names_of_char[kern.char]] = kern.off * mag end f.characters[char].kerns = kerns end end elseif ttffont.subfonts then for _, subfont in pairs(ttffont.subfonts) do for char, glyph in pairs(subfont.glyphs) do if glyph.width then local unic = glyph.unicode if unic and unic >= 0 then f.characters[unic] = { index = char, width = glyph.width * mag, } end end end end f.encodingbytes = 2 end f.filename = filename f.type = 'real' f.format = fonttype f.embedding = "subset" f.cidinfo = { registry = "Adobe", ordering = "Identity", supplement = 0, version = 1 } end else f = font.read_tfm(name, size) end return f end )