-- -- -- Experimental svg back end -- -- --print ("mflua_svg_backend") local MFbuiltin = mflua.MFbuiltin local MF = mflua.MF print_scaled = mflua.MF.print_scaled local svg = svg or {} svg = { ['enabled']=true, ['enabled_raw']=false, ['output_dir']='svg', ['svg_preamble'] = [=[ cubic Bézier commands in path data B char %s ]=], ['emsize']= 1000, ['filename']= 'SourceCode', ['font'] = [=[ Created by FontForge 20110222 at Sun Sep 18 10:37:34 2011 By root Copyleft 2002, 2003, 2005 Free Software Foundation. %s ]=], ['glyph'] = [==[%s ]==], ['hkern'] = [==[]==], ['vkern'] = [==[]==], ['hkerns']='', ['vkerns']='', ['char']={ ['0']={glyph_name='uni0393',unicode='Γ'}, -- U+0393 GREEK CAPITAL LETTER GAMMA ['1']={glyph_name='uni0394',unicode='Δ'}, --U+0394 GREEK CAPITAL LETTER DELTA ['2']={glyph_name='uni0398',unicode='Θ'}, -- U+0398 GREEK CAPITAL LETTER THETA ['3']={glyph_name='uni039b',unicode='Λ'}, -- U+039B GREEK CAPITAL LETTER LAMBDA ['4']={glyph_name='uni039e',unicode='Ξ'}, --U+039E GREEK CAPITAL LETTER XI ['5']={glyph_name='uni03a0',unicode='Π'}, --U+03A0 GREEK CAPITAL LETTER PI ['6']={glyph_name='uni03a3',unicode='Σ'}, -- U+03A3 GREEK CAPITAL LETTER SIGMA ['7']={glyph_name='uni03a5',unicode='Υ'}, --U+03A5 GREEK CAPITAL LETTER UPSILON ['8']={glyph_name='uni03a6',unicode='Φ'}, -- U+03A6 GREEK CAPITAL LETTER PHI ['9']={glyph_name='uni03a8',unicode='Ψ'}, -- U+03A8 GREEK CAPITAL LETTER PSI ['10']={glyph_name='uni03a9',unicode='Ω'}, -- U+03A9 GREEK CAPITAL LETTER OMEGA ['11']={glyph_name='unifb00',unicode='ff'}, -- U+FB00 LATIN SMALL LIGATURE FF ['12']={glyph_name='unifb01',unicode='fi'}, --U+FB01 LATIN SMALL LIGATURE FI ['13']={glyph_name='unifb02',unicode='fl'}, -- U+FB02 LATIN SMALL LIGATURE FL ['14']={glyph_name='unifb03',unicode='ffi'}, --U+FB03 LATIN SMALL LIGATURE FFI ['15']={glyph_name='unifb04',unicode='ffl'}, -- U+FB04 LATIN SMALL LIGATURE FFL ['16']={glyph_name='uni0131',unicode='ı'}, -- U+0131 LATIN SMALL LETTER DOTLESS I ['17']={glyph_name='uni0237',unicode='ȷ'}, -- U+0237 LATIN SMALL LETTER DOTLESS J ['18']={glyph_name='uni0060',unicode='`'}, -- U+0060 GRAVE ACCENT ['19']={glyph_name='uni00b4',unicode='´'}, -- U+00B4 ACUTE ACCENT ['20']={glyph_name='uni02c7',unicode='ˇ'}, -- U+02C7 CARON ['21']={glyph_name='uni02d8',unicode='˘'}, -- U+02D8 BREVE ['22']={glyph_name='uni00af',unicode='¯'}, -- U+00AF MACRON ['23']={glyph_name='uni02da',unicode='˚'}, -- U+02DA RING ABOVE ['24']={glyph_name='uni00b8',unicode='¸'}, -- U+00B8 CEDILLA ['25']={glyph_name='uni00df',unicode='ß'}, -- U+00DF LATIN SMALL LETTER SHARP S ['26']={glyph_name='uni00e6',unicode='æ'}, -- U+00E6 LATIN SMALL LETTER AE ['27']={glyph_name='uni0153',unicode='œ'}, -- U+0153 LATIN SMALL LIGATURE OE ['28']={glyph_name='uni00f8',unicode='ø'}, -- U+00F8 LATIN SMALL LETTER O WITH STROKE ['29']={glyph_name='uni00c6',unicode='Æ'}, --U+00C6 LATIN CAPITAL LETTER AE ['30']={glyph_name='uni0152',unicode='Œ'}, --U+0152 LATIN CAPITAL LIGATURE OE ['31']={glyph_name='uni00D8',unicode='Ø'}, --U+00D8 LATIN CAPITAL LETTER O WITH STROKE ['32']={glyph_name='uni0337',unicode='̷'}, --U+0337 COMBINING SHORT SOLIDUS OVERLAY ['33']={glyph_name='uni0021',unicode='!'}, ['34']={glyph_name='uni201d',unicode='”'}, -- U+201D RIGHT DOUBLE QUOTATION MARK ['35']={glyph_name='uni0023',unicode='#'}, ['36']={glyph_name='uni0024',unicode='$'}, ['37']={glyph_name='uni0025',unicode='%'}, ['38']={glyph_name='uni0026',unicode='&'}, ['39']={glyph_name='uni0027',unicode='''}, ['40']={glyph_name='uni0028',unicode='('}, ['41']={glyph_name='uni0029',unicode=')'}, ['42']={glyph_name='uni002a',unicode='*'}, ['43']={glyph_name='uni002b',unicode='+'}, ['44']={glyph_name='uni002c',unicode=','}, ['45']={glyph_name='uni002d',unicode='-'}, -- U+002D HYPHEN-MINUS ['46']={glyph_name='uni002e',unicode='.'}, ['47']={glyph_name='uni002f',unicode='/'}, ['48']={glyph_name='uni0030',unicode='0'}, ['49']={glyph_name='uni0031',unicode='1'}, ['50']={glyph_name='uni0032',unicode='2'}, ['51']={glyph_name='uni0033',unicode='3'}, ['52']={glyph_name='uni0034',unicode='4'}, ['53']={glyph_name='uni0035',unicode='5'}, ['54']={glyph_name='uni0036',unicode='6'}, ['55']={glyph_name='uni0037',unicode='7'}, ['56']={glyph_name='uni0038',unicode='8'}, ['57']={glyph_name='uni0039',unicode='9'}, ['58']={glyph_name='uni003a',unicode=':'}, ['59']={glyph_name='uni003b',unicode=';'}, ['60']={glyph_name='uni00a1',unicode='¡'}, -- U+00A1 INVERTED EXCLAMATION MARK, but only if ligs>1 ['61']={glyph_name='uni003d',unicode='='}, ['62']={glyph_name='uni00bf',unicode='¿'}, --U+00BF INVERTED QUESTION MARK ['63']={glyph_name='uni003f',unicode='?'}, ['64']={glyph_name='uni0040',unicode='@'}, ['65']={glyph_name='uni0041',unicode='A'}, ['66']={glyph_name='uni0042',unicode='B'}, ['67']={glyph_name='uni0043',unicode='C'}, ['68']={glyph_name='uni0044',unicode='D'}, ['69']={glyph_name='uni0045',unicode='E'}, ['70']={glyph_name='uni0046',unicode='F'}, ['71']={glyph_name='uni0047',unicode='G'}, ['72']={glyph_name='uni0048',unicode='H'}, ['73']={glyph_name='uni0049',unicode='I'}, ['74']={glyph_name='uni004a',unicode='J'}, ['75']={glyph_name='uni004b',unicode='K'}, ['76']={glyph_name='uni004c',unicode='L'}, ['77']={glyph_name='uni004d',unicode='M'}, ['78']={glyph_name='uni004e',unicode='N'}, ['79']={glyph_name='uni004f',unicode='O'}, ['80']={glyph_name='uni0050',unicode='P'}, ['81']={glyph_name='uni0051',unicode='Q'}, ['82']={glyph_name='uni0052',unicode='R'}, ['83']={glyph_name='uni0053',unicode='S'}, ['84']={glyph_name='uni0054',unicode='T'}, ['85']={glyph_name='uni0055',unicode='U'}, ['86']={glyph_name='uni0056',unicode='V'}, ['87']={glyph_name='uni0057',unicode='W'}, ['88']={glyph_name='uni0058',unicode='X'}, ['89']={glyph_name='uni0059',unicode='Y'}, ['90']={glyph_name='uni005a',unicode='Z'}, ['91']={glyph_name='uni005b',unicode='['}, ['92']={glyph_name='uni201c',unicode='“'}, -- U+201C LEFT DOUBLE QUOTATION MARK ['93']={glyph_name='uni005d',unicode=']'}, ['94']={glyph_name='uni0302',unicode='̂'}, --U+0302 COMBINING CIRCUMFLEX ACCENT ['95']={glyph_name='uni0307',unicode='̇'}, --U+0307 COMBINING DOT ABOVE ['96']={glyph_name='uni2018',unicode='‘'}, --U+2018 LEFT SINGLE QUOTATION MARK ['97']={glyph_name='uni0061',unicode='a'}, ['98']={glyph_name='uni0062',unicode='b'}, ['99']={glyph_name='uni0063',unicode='c'}, ['100']={glyph_name='uni0064',unicode='d'}, ['101']={glyph_name='uni0065',unicode='e'}, ['102']={glyph_name='uni0066',unicode='f'}, ['103']={glyph_name='uni0067',unicode='g'}, ['104']={glyph_name='uni0068',unicode='h'}, ['105']={glyph_name='uni0069',unicode='i'}, ['106']={glyph_name='uni006a',unicode='j'}, ['107']={glyph_name='uni006b',unicode='k'}, ['108']={glyph_name='uni006c',unicode='l'}, ['109']={glyph_name='uni006d',unicode='m'}, ['110']={glyph_name='uni006e',unicode='n'}, ['111']={glyph_name='uni006f',unicode='o'}, ['112']={glyph_name='uni0070',unicode='p'}, ['113']={glyph_name='uni0071',unicode='q'}, ['114']={glyph_name='uni0072',unicode='r'}, ['115']={glyph_name='uni0073',unicode='s'}, ['116']={glyph_name='uni0074',unicode='t'}, ['117']={glyph_name='uni0075',unicode='u'}, ['118']={glyph_name='uni0076',unicode='v'}, ['119']={glyph_name='uni0077',unicode='w'}, ['120']={glyph_name='uni0078',unicode='x'}, ['121']={glyph_name='uni0079',unicode='y'}, ['122']={glyph_name='uni007a',unicode='z'}, ['123']={glyph_name='uni2013',unicode='–'}, -- U+2013 EN DASH ['124']={glyph_name='uni2014',unicode='—'}, -- U+2014 EM DASH ['125']={glyph_name='uni030b',unicode='̋'}, --U+030B COMBINING DOUBLE ACUTE ACCENT ['126']={glyph_name='uni0303',unicode='̃'}, --U+0303 COMBINING TILDE ['127']={glyph_name='uni0308',unicode='̈'}, --U+0308 COMBINING DIAERESIS ['128']={glyph_name='uni0080',unicode='€'}, ['129']={glyph_name='uni0081',unicode=''}, ['130']={glyph_name='uni0082',unicode='‚'}, ['131']={glyph_name='uni0083',unicode='ƒ'}, ['132']={glyph_name='uni0084',unicode='„'}, ['133']={glyph_name='uni0085',unicode='…'}, ['134']={glyph_name='uni0086',unicode='†'}, ['135']={glyph_name='uni0087',unicode='‡'}, ['136']={glyph_name='uni0088',unicode='ˆ'}, ['137']={glyph_name='uni0089',unicode='‰'}, ['138']={glyph_name='uni008a',unicode='Š'}, ['139']={glyph_name='uni008b',unicode='‹'}, ['140']={glyph_name='uni008c',unicode='Œ'}, ['141']={glyph_name='uni008d',unicode=''}, ['142']={glyph_name='uni008e',unicode='Ž'}, ['143']={glyph_name='uni008f',unicode=''}, ['144']={glyph_name='uni0090',unicode=''}, ['145']={glyph_name='uni0091',unicode='‘'}, ['146']={glyph_name='uni0092',unicode='’'}, ['147']={glyph_name='uni0093',unicode='“'}, ['148']={glyph_name='uni0094',unicode='”'}, ['149']={glyph_name='uni0095',unicode='•'}, ['150']={glyph_name='uni0096',unicode='–'}, ['151']={glyph_name='uni0097',unicode='—'}, ['152']={glyph_name='uni0098',unicode='˜'}, ['153']={glyph_name='uni0099',unicode='™'}, ['154']={glyph_name='uni009a',unicode='š'}, ['155']={glyph_name='uni009b',unicode='›'}, ['156']={glyph_name='uni009c',unicode='œ'}, ['157']={glyph_name='uni009d',unicode=''}, ['158']={glyph_name='uni009e',unicode='ž'}, ['159']={glyph_name='uni009f',unicode='Ÿ'}, ['160']={glyph_name='uni00a0',unicode=' '}, ['161']={glyph_name='uni00a1',unicode='¡'}, ['162']={glyph_name='uni00a2',unicode='¢'}, ['163']={glyph_name='uni00a3',unicode='£'}, ['164']={glyph_name='uni00a4',unicode='¤'}, ['165']={glyph_name='uni00a5',unicode='¥'}, ['166']={glyph_name='uni00a6',unicode='¦'}, ['167']={glyph_name='uni00a7',unicode='§'}, ['168']={glyph_name='uni00a8',unicode='¨'}, ['169']={glyph_name='uni00a9',unicode='©'}, ['170']={glyph_name='uni00aa',unicode='ª'}, ['171']={glyph_name='uni00ab',unicode='«'}, ['172']={glyph_name='uni00ac',unicode='¬'}, ['173']={glyph_name='uni00ad',unicode='­'}, ['174']={glyph_name='uni00ae',unicode='®'}, ['175']={glyph_name='uni00af',unicode='¯'}, ['176']={glyph_name='uni00b0',unicode='°'}, ['177']={glyph_name='uni00b1',unicode='±'}, ['178']={glyph_name='uni00b2',unicode='²'}, ['179']={glyph_name='uni00b3',unicode='³'}, ['180']={glyph_name='uni00b4',unicode='´'}, ['181']={glyph_name='uni00b5',unicode='µ'}, ['182']={glyph_name='uni00b6',unicode='¶'}, ['183']={glyph_name='uni00b7',unicode='·'}, ['184']={glyph_name='uni00b8',unicode='¸'}, ['185']={glyph_name='uni00b9',unicode='¹'}, ['186']={glyph_name='uni00ba',unicode='º'}, ['187']={glyph_name='uni00bb',unicode='»'}, ['188']={glyph_name='uni00bc',unicode='¼'}, ['189']={glyph_name='uni00bd',unicode='½'}, ['190']={glyph_name='uni00be',unicode='¾'}, ['191']={glyph_name='uni00bf',unicode='¿'}, ['192']={glyph_name='uni00c0',unicode='À'}, -- ['193']={glyph_name='uni00c1',unicode='Á'}, ['193']={glyph_name='uni0060',unicode='`'}, -- ['194']={glyph_name='uni00c2',unicode='Â'}, ['194']={glyph_name='uni00b4',unicode='´'}, -- ['195']={glyph_name='uni00c3',unicode='Ã'}, ['195']={glyph_name='uni005e',unicode='^'}, ['196']={glyph_name='uni00c4',unicode='Ä'}, ['197']={glyph_name='uni00c5',unicode='Å'}, ['198']={glyph_name='uni00c6',unicode='Æ'}, ['199']={glyph_name='uni00c7',unicode='Ç'}, ['200']={glyph_name='uni00c8',unicode='È'}, ['201']={glyph_name='uni00c9',unicode='É'}, ['202']={glyph_name='uni00ca',unicode='Ê'}, ['203']={glyph_name='uni00cb',unicode='Ë'}, ['204']={glyph_name='uni00cc',unicode='Ì'}, ['205']={glyph_name='uni00cd',unicode='Í'}, ['206']={glyph_name='uni00ce',unicode='Î'}, ['207']={glyph_name='uni00cf',unicode='Ï'}, ['208']={glyph_name='uni00d0',unicode='Ð'}, ['209']={glyph_name='uni00d1',unicode='Ñ'}, ['210']={glyph_name='uni00d2',unicode='Ò'}, ['211']={glyph_name='uni00d3',unicode='Ó'}, ['212']={glyph_name='uni00d4',unicode='Ô'}, ['213']={glyph_name='uni00d5',unicode='Õ'}, ['214']={glyph_name='uni00d6',unicode='Ö'}, ['215']={glyph_name='uni00d7',unicode='×'}, ['216']={glyph_name='uni00d8',unicode='Ø'}, ['217']={glyph_name='uni00d9',unicode='Ù'}, ['218']={glyph_name='uni00da',unicode='Ú'}, ['219']={glyph_name='uni00db',unicode='Û'}, ['220']={glyph_name='uni00dc',unicode='Ü'}, ['221']={glyph_name='uni00dd',unicode='Ý'}, ['222']={glyph_name='uni00de',unicode='Þ'}, ['223']={glyph_name='uni00df',unicode='ß'}, ['224']={glyph_name='uni00e0',unicode='à'}, ['225']={glyph_name='uni00e1',unicode='á'}, ['226']={glyph_name='uni00e2',unicode='â'}, ['227']={glyph_name='uni00e3',unicode='ã'}, ['228']={glyph_name='uni00e4',unicode='ä'}, ['229']={glyph_name='uni00e5',unicode='å'}, ['230']={glyph_name='uni00e6',unicode='æ'}, ['231']={glyph_name='uni00e7',unicode='ç'}, ['232']={glyph_name='uni00e8',unicode='è'}, ['233']={glyph_name='uni00e9',unicode='é'}, ['234']={glyph_name='uni00ea',unicode='ê'}, ['235']={glyph_name='uni00eb',unicode='ë'}, ['236']={glyph_name='uni00ec',unicode='ì'}, ['237']={glyph_name='uni00ed',unicode='í'}, ['238']={glyph_name='uni00ee',unicode='î'}, ['239']={glyph_name='uni00ef',unicode='ï'}, ['240']={glyph_name='uni00f0',unicode='ð'}, ['241']={glyph_name='uni00f1',unicode='ñ'}, ['242']={glyph_name='uni00f2',unicode='ò'}, ['243']={glyph_name='uni00f3',unicode='ó'}, ['244']={glyph_name='uni00f4',unicode='ô'}, ['245']={glyph_name='uni00f5',unicode='õ'}, ['246']={glyph_name='uni00f6',unicode='ö'}, ['247']={glyph_name='uni00f7',unicode='÷'}, ['248']={glyph_name='uni00f8',unicode='ø'}, ['249']={glyph_name='uni00f9',unicode='ù'}, ['250']={glyph_name='uni00fa',unicode='ú'}, ['251']={glyph_name='uni00fb',unicode='û'}, ['252']={glyph_name='uni00fc',unicode='ü'}, ['253']={glyph_name='uni00fd',unicode='ý'}, ['254']={glyph_name='uni00fe',unicode='þ'}, ['255']={glyph_name='uni00ff',unicode='ÿ'}, ['256']={glyph_name='uni0100',unicode='Ā'}, }, } local function _eval_tonumber(q,offset) local qx,qy,xo,yo local w local _offset = offset if _offset == nil then _offset = '(0,0)' end w=string.gmatch(q,"[-0-9.]+"); qx,qy=w(),w() w=string.gmatch(_offset,"[-0-9.]+"); xo,yo=w(),w() return {tonumber(qx+xo),tonumber(qy+yo)} end local function get_svg_glyph(valid_curves,char,cycles,tfm) -- Write the svg -- -- print('BEZ MFbuiltin.hppp='..print_scaled(MFbuiltin.hppp())) -- print('BEZ MFbuiltin.vppp='..print_scaled(MFbuiltin.vppp())) -- print('BEZ MFbuiltin.designsize='..print_scaled(MFbuiltin.designsize())) local tfm = tfm local index = tostring( char['index'] ) -- better a string or a number local design_size=tonumber ( print_scaled(MFbuiltin.designsize()) ) --pt local char_wd=tonumber( char['char_wd'] ) -- pt local char_ht=tonumber( char['char_ht'] ) -- pt local char_dp=tonumber( char['char_dp'] ) -- pt --local xheight = 0.458333 * design_size -- must be read from tfm !! local x_resolution = math.floor(0.5+tonumber( print_scaled(MFbuiltin.hppp()) )* 72.27) local y_resolution = math.floor(0.5+tonumber( print_scaled(MFbuiltin.vppp()) )* 72.27) assert(x_resolution==y_resolution, string.format('Error on _get_svg_glyph x_res=%d and y_res=%d differ',x_resolution,y_resolution)) local resolution = x_resolution local emsize = mflua.svg.emsize -- 1000, type 1, also known as em_unit: 1000 emsize = 1em local em_unit = emsize local em_unit_for_pixel = (72.27/design_size) * (emsize / resolution) local bp_for_pt = 72/72.27 local char_wd_emunit = (char_wd/design_size) *em_unit local char_ht_emunit = (char_ht/design_size) *em_unit local char_dp_emunit = (char_dp/design_size) *em_unit local outdir = mflua.svg.output_dir or '.' local fname = tostring(char['charname']) if fname and fname ~= '' then mflua.svg.char[index] ={glyph_name='', unicode = ''}; mflua.svg.char[index].glyph_name = fname local w = string.gmatch(fname,'uni(.+)') local unicode_hex = w() mflua.svg.char[index].unicode = [[&#x]] .. unicode_hex ..';' end fname = mflua.svg.char[index].glyph_name assert(fname~=nil, string.format("Error on svg file name for char index %s: it's nil",index)) --local f = io.open(outdir..'/'.. fname..'.svg','w') local w = string.gmatch(fname,'uni(.+)') local unicode_hex = w() local unicode = mflua.svg.char[index].unicode local unicode_range = 'U+'..unicode_hex local glyph_name = fname local bezier = '' local maxx,maxy=-1e9,-1e9 local minx,miny=1e9,1e9 for i,cycle in pairs(cycles) do local path='' local _i=1 for _,j in ipairs(cycle) do --local curve = valid_curves[j] local curve = j local p,c1,c2,q,offset=curve[1],curve[2],curve[3],curve[4],curve[5] p=_eval_tonumber(p,offset) c1=_eval_tonumber(c1,offset) c2=_eval_tonumber(c2,offset) q=_eval_tonumber(q,offset) -- em_unit_for_pixel p[1],p[2] = p[1]*em_unit_for_pixel,p[2]*em_unit_for_pixel q[1],q[2] = q[1]*em_unit_for_pixel,q[2]*em_unit_for_pixel c1[1],c1[2] = c1[1]*em_unit_for_pixel,c1[2]*em_unit_for_pixel c2[1],c2[2] = c2[1]*em_unit_for_pixel,c2[2]*em_unit_for_pixel if _i==1 then bezier = bezier..string.format("M%s %s ",p[1],p[2]) end _i=_i+1 bezier = bezier .. string.format("C%s %s %s %s %s %s\n",c1[1],c1[2],c2[1],c2[2],q[1],q[2]) --print("BEZ bez="..bezier) if p[1]>maxx then maxx=p[1] end if c1[1]>maxx then maxx=c1[1] end if c2[1]>maxx then maxx=c2[1] end if q[1]>maxx then maxx=q[1] end if p[2]>maxy then maxy=p[2] end if c1[2]>maxy then maxy=c1[2] end if c2[2]>maxy then maxy=c2[2] end if q[2]>maxy then maxy=q[2] end -- if p[1]', bezier) local raw=string.format(svg_preamble,minx,miny,maxx,maxy,-maxy,paths) return trunk,raw end -- _get_svg_glyph local function svg_kern_and_lig(chartable,t,tfm) -- -- Store kerns and ligs -- local current_chars={} local index local kern, next_char,additional_space local bp_for_pt = 72/72.27 local x_resolution = math.floor(0.5+tonumber( print_scaled(MFbuiltin.hppp()) )* bp_for_pt) local y_resolution = math.floor(0.5+tonumber( print_scaled(MFbuiltin.vppp()) )* bp_for_pt) local design_size=tfm.font.designsize -- pt assert(x_resolution==y_resolution, string.format('Error on _get_svg_glyph x_res=%d and y_res=%d differ',x_resolution,y_resolution)) local resolution = x_resolution local emsize = mflua.svg.emsize -- 1000, type 1, also known as em_unit: 1000 emsize = 1em local em_unit = emsize local em_unit_for_pixel = (bp_for_pt/design_size) * (emsize / resolution) local hkern,vkern = '' ,'' for i,_ in ipairs(t) do index = t[i] current_chars[index]=true end for i,_ in ipairs(t) do index = t[i] if tfm.chars[index] and tfm.chars[index].kern then kerntable = tfm.chars[index].kern for _,k in ipairs(kerntable) do next_char,additional_space = tostring(k.next_char),tonumber(k.additional_space) -- if additional_space~=0 then local a_name,a_unicode = mflua.svg.char[tostring(index)].glyph_name,mflua.svg.char[tostring(index)].unicode local b_name,b_unicode = mflua.svg.char[next_char].glyph_name,mflua.svg.char[next_char].unicode hkern = hkern .. "\n".. string.format(mflua.svg.hkern, a_name,a_unicode, b_name,b_unicode, additional_space*design_size*em_unit_for_pixel) end end end end return hkern,vkern end local function store_svg_font(tfm) -- local outdir = mflua.svg.output_dir or '.' -- local fname = mflua.svg.filename -- assert(fname~=nil, string.format("Error on svg file name for %s: it's nil",fname)) -- local f = io.open(outdir..'/'.. fname..'.svg','w') local svg_font = mflua.svg.font local design_size=tonumber ( print_scaled(MFbuiltin.designsize()) ) --pt local emsize = mflua.svg.emsize -- 1000, type 1, also known as em_unit: 1000 emsize = 1em local bp_for_pt = 72/72.27 local xheight = tfm.font.x_height * design_size --0.458333 * design_size -- must be read from tfm !! local trunk ='' local char = mflua.svg.char for index=0,2^16-1 do if not(char[tostring(index)]==nil) then --print("BEZ char[tostring(index)].data=",index,char[tostring(index)].data) trunk= trunk.. (char[tostring(index)].data or '') end end trunk = trunk.."\n"..mflua.svg.hkerns.."\n"..mflua.svg.vkerns trunk = string.format(svg_font, string.format("%2.2f",design_size*bp_for_pt), emsize, string.format("%2.2f",xheight*bp_for_pt), trunk) return trunk end svg.get_svg_glyph = get_svg_glyph svg.svg_kern_and_lig = svg_kern_and_lig svg.store_svg_font = store_svg_font return svg