diff options
-rw-r--r-- | luaotfload-auxiliary.lua | 12 | ||||
-rw-r--r-- | luaotfload-features.lua | 11 | ||||
-rw-r--r-- | luaotfload-merged.lua | 95 | ||||
-rw-r--r-- | luaotfload.dtx | 6 |
4 files changed, 85 insertions, 39 deletions
diff --git a/luaotfload-auxiliary.lua b/luaotfload-auxiliary.lua index c08f775..be380e3 100644 --- a/luaotfload-auxiliary.lua +++ b/luaotfload-auxiliary.lua @@ -31,6 +31,7 @@ local stringlower = string.lower local stringformat = string.format local stringgsub = string.gsub local stringbyte = string.byte +local stringfind = string.find ----------------------------------------------------------------------- --- font patches @@ -64,18 +65,17 @@ local add_fontdata_fallbacks = function (fontdata) else --- otf metadata = fontdata.shared.rawdata.metadata + fontdata.name = fontdata.name + or fontdata.fullname + or fontdata.psname fontdata.units = fontdata.units_per_em + fontdata.size = fontdata.size or fontparameters.size local resources = fontdata.resources - --- the next line is a hack that fixes scaling of fonts with - --- non-standard em-sizes (most ms fonts have 2048, others - --- come with 256) - --fontdata.size = fontparameters.size * fontdata.units / 1000 --- for legacy fontspec.lua and unicode-math.lua fontdata.shared.otfdata = { pfminfo = { os2_capheight = metadata.pfminfo.os2_capheight }, metadata = { ascent = metadata.ascent }, } - --fontdata.shared.otfdata.metadata = metadata --- brr, that’s meta indeed --- for microtype and fontspec local fake_features = { } -- wrong: table.copy(resources.features) setmetatable(fake_features, { __index = function (tab, idx) @@ -98,8 +98,6 @@ end --if config.luaotfload.compatibility == true then if true then - --- this will cause the output pdf to be garbled - --- in pdf.js luatexbase.add_to_callback( "luaotfload.patch_font", add_fontdata_fallbacks, diff --git a/luaotfload-features.lua b/luaotfload-features.lua index 8852596..220b362 100644 --- a/luaotfload-features.lua +++ b/luaotfload-features.lua @@ -337,7 +337,9 @@ local import_values = { --- That’s what the 1.x parser did, not quite as graciously, --- with an array of branch expressions. -- "style", "optsize",--> from slashed notation; handled otherwise - "lookup", "sub", "mode", + { "lookup", false }, + { "sub", false }, + { "mode", true }, } local lookup_types = { "anon", "file", "name", "path" } @@ -411,11 +413,14 @@ local handle_request = function (specification) end for n=1, #import_values do - local feat = import_values[n] + local feat = import_values[n][1] + local keep = import_values[n][2] local newvalue = request.features[feat] if newvalue then specification[feat] = request.features[feat] - --request.features[feat] = nil + if not keep then + request.features[feat] = nil + end end end diff --git a/luaotfload-merged.lua b/luaotfload-merged.lua index a0a58cc..008b02a 100644 --- a/luaotfload-merged.lua +++ b/luaotfload-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 05/09/13 15:23:31 +-- merge date : 05/10/13 15:05:28 do -- begin closure to overcome local limits and interference @@ -5046,7 +5046,7 @@ local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf otf.glists={ "gsub","gpos" } -otf.version=2.742 +otf.version=2.743 otf.cache=containers.define("fonts","otf",otf.version,true) local fontdata=fonts.hashes.identifiers local chardata=characters and characters.data @@ -5065,6 +5065,7 @@ local usemetatables=false local packdata=true local syncspace=true local forcenotdef=false +local includesubfonts=false local wildcard="*" local default="dflt" local fontloaderfields=fontloader.fields @@ -5191,8 +5192,8 @@ local ordered_enhancers={ "check glyphs", "check metadata", "check extra features", - "add duplicates", "check encoding", + "add duplicates", "cleanup tables", } local actions=allocate() @@ -5536,7 +5537,7 @@ actions["prepare glyphs"]=function(data,filename,raw) local duplicates=resources.duplicates local variants=resources.variants if rawsubfonts then - metadata.subfonts={} + metadata.subfonts=includesubfonts and {} properties.cidinfo=rawcidinfo if rawcidinfo.registry then local cidmap=fonts.cid.getmap(rawcidinfo) @@ -5547,7 +5548,9 @@ actions["prepare glyphs"]=function(data,filename,raw) for cidindex=1,#rawsubfonts do local subfont=rawsubfonts[cidindex] local cidglyphs=subfont.glyphs - metadata.subfonts[cidindex]=somecopy(subfont) + if includesubfonts then + metadata.subfonts[cidindex]=somecopy(subfont) + end for index=0,subfont.glyphcnt-1 do local glyph=cidglyphs[index] if glyph then @@ -5556,6 +5559,10 @@ actions["prepare glyphs"]=function(data,filename,raw) if not unicode or unicode==-1 or unicode>=criterium then unicode=cidunicodes[index] end + if unicode and descriptions[unicode] then + report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode) + unicode=-1 + end if not unicode or unicode==-1 or unicode>=criterium then if not name then name=format("u%06X",private) @@ -5659,7 +5666,8 @@ actions["check encoding"]=function(data,filename,raw) local resources=data.resources local properties=data.properties local unicodes=resources.unicodes - local indices=resources.indices + local indices=resources.indices + local duplicates=resources.duplicates local mapdata=raw.map or {} local unicodetoindex=mapdata and mapdata.map or {} local encname=lower(data.enc_name or mapdata.enc_name or "") @@ -5671,10 +5679,35 @@ actions["check encoding"]=function(data,filename,raw) for unicode,index in next,unicodetoindex do if unicode<=criterium and not descriptions[unicode] then local parent=indices[index] - if parent then - report_otf("weird, unicode %U points to %U with index %H",unicode,parent,index) - else + if not parent then report_otf("weird, unicode %U points to nowhere with index %H",unicode,index) + else + local parentdescription=descriptions[parent] + if parentdescription then + local altuni=parentdescription.altuni + if not altuni then + altuni={ { unicode=parent } } + parentdescription.altuni=altuni + duplicates[parent]={ unicode } + else + local done=false + for i=1,#altuni do + if altuni[i].unicode==parent then + done=true + break + end + end + if not done then + altuni[#altuni+1]={ unicode=parent } + table.insert(duplicates[parent],unicode) + end + end + if trace_loading then + report_otf("weird, unicode %U points to nowhere with index %H",unicode,index) + end + else + report_otf("weird, unicode %U points to %U with index %H",unicode,index) + end end end end @@ -8468,29 +8501,18 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) end head,current=insert_node_after(head,current,copy_node(start)) + elseif trace_marks then + logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char)) end start=start.next end - local start=components - while start and start.id==glyph_code do - local char=start.char - if marks[char] then - start[a_ligacomp]=baseindex+(start[a_ligacomp] or componentindex) - if trace_marks then - logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) - end - else - break - end - start=start.next - end - local start=base.next - while start and start.id==glyph_code do + local start=current.next + while start and start.id==glyph_code do local char=start.char if marks[char] then start[a_ligacomp]=baseindex+(start[a_ligacomp] or componentindex) if trace_marks then - logwarning("%s: find mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) + logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp]) end else break @@ -10702,6 +10724,12 @@ local function packdata(data) end end end + local altuni=description.altuni + if altuni then + for i=1,#altuni do + altuni[i]=pack_flat(altuni[i]) + end + end end local lookups=data.lookups if lookups then @@ -10806,6 +10834,10 @@ local function packdata(data) mlookups[tag]=pack_normal(mlookup) end end + local altuni=description.altuni + if altuni then + description.altuni=pack_normal(altuni) + end end local lookups=data.lookups if lookups then @@ -10997,6 +11029,19 @@ local function unpackdata(data) end end end + local altuni=description.altuni + if altuni then + local altuni=tables[altuni] + if altuni then + description.altuni=altuni + for i=1,#altuni do + local tv=tables[altuni[i]] + if tv then + altuni[i]=tv + end + end + end + end end local lookups=data.lookups if lookups then diff --git a/luaotfload.dtx b/luaotfload.dtx index 0d062a6..75d1221 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -133,7 +133,7 @@ and the derived files \usepackage{fontspec} \usepackage{unicode-math} \setmainfont[ - Numbers = OldStyle, +% Numbers = OldStyle, %% buggy with font cache Ligatures = TeX, BoldFont = {Linux Libertine O Bold}, ItalicFont = {Linux Libertine O Italic}, @@ -407,7 +407,7 @@ and the derived files % \fileent{GFSBodoni.otf}, and % \fileent{PTZ56F.ttf}. % -% \subsection{\hologo{XeTeX} Compatibility Layer} +% \subsection{Compatibility Layer} % % In addition to the regular prefixed requests, \identifier{luaotfload} % accepts loading fonts the \XETEX way. @@ -1720,8 +1720,6 @@ local patch_defined_font = function (specification, size, id) return tfmdata end -caches.compilemethod = "both" - reset_callback("define_font") % \end{macrocode} |