diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/lpdf-col.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/lpdf-col.lua | 139 |
1 files changed, 68 insertions, 71 deletions
diff --git a/Master/texmf-dist/tex/context/base/lpdf-col.lua b/Master/texmf-dist/tex/context/base/lpdf-col.lua index 0c2a49ebef2..b358d082098 100644 --- a/Master/texmf-dist/tex/context/base/lpdf-col.lua +++ b/Master/texmf-dist/tex/context/base/lpdf-col.lua @@ -1,4 +1,4 @@ -if not modules then modules = { } end modules ['lpdf-mis'] = { +if not modules then modules = { } end modules ['lpdf-col'] = { version = 1.001, comment = "companion to lpdf-ini.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", @@ -6,13 +6,17 @@ if not modules then modules = { } end modules ['lpdf-mis'] = { license = "see context related readme files" } -local type, next, tostring = type, next, tostring +local type, next, tostring, tonumber = type, next, tostring, tonumber local char, byte, format, gsub, rep, gmatch = string.char, string.byte, string.format, string.gsub, string.rep, string.gmatch local concat = table.concat local round = math.round +local formatters = string.formatters local backends, lpdf, nodes = backends, lpdf, nodes +local allocate = utilities.storage.allocate +local formatters = string.formatters + local nodeinjections = backends.pdf.nodeinjections local codeinjections = backends.pdf.codeinjections local registrations = backends.pdf.registrations @@ -40,11 +44,24 @@ local forcedmodel = colors.forcedmodel local c_transparency = pdfconstant("Transparency") +local f_gray = formatters["%.3f g %.3f G"] +local f_rgb = formatters["%.3f %.3f %.3f rg %.3f %.3f %.3f RG"] +local f_cmyk = formatters["%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K"] +local f_spot = formatters["/%s cs /%s CS %s SCN %s scn"] +local f_tr = formatters["Tr%s"] +local f_cm = formatters["q %f %f %f %f %f %f cm"] +local f_effect = formatters["%s Tc %s w %s Tr"] +local f_tr_gs = formatters["/Tr%s gs"] +local f_num_1 = tostring +local f_num_2 = formatters["%s %s"] +local f_num_3 = formatters["%s %s %s"] +local f_num_4 = formatters["%s %s %s %s"] + local report_color = logs.reporter("colors","backend") -- page groups (might move to lpdf-ini.lua) -local colorspaceconstants = { -- v_none is ignored +local colorspaceconstants = allocate { -- v_none is ignored gray = pdfconstant("DeviceGray"), rgb = pdfconstant("DeviceRGB"), cmyk = pdfconstant("DeviceCMYK"), @@ -97,26 +114,26 @@ commands.synchronizecolormodel = synchronizecolormodel -- color injection function nodeinjections.rgbcolor(r,g,b) - return register(pdfliteral(format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b))) + return register(pdfliteral(f_rgb(r,g,b,r,g,b))) end function nodeinjections.cmykcolor(c,m,y,k) - return register(pdfliteral(format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k))) + return register(pdfliteral(f_cmyk(c,m,y,k,c,m,y,k))) end function nodeinjections.graycolor(s) -- caching 0/1 does not pay off - return register(pdfliteral(format("%s g %s G",s,s))) + return register(pdfliteral(f_gray(s,s))) end function nodeinjections.spotcolor(n,f,d,p) if type(p) == "string" then p = gsub(p,","," ") -- brr misuse of spot end - return register(pdfliteral(format("/%s cs /%s CS %s SCN %s scn",n,n,p,p))) + return register(pdfliteral(f_spot(n,n,p,p))) end function nodeinjections.transparency(n) - return register(pdfliteral(format("/Tr%s gs",n))) + return register(pdfliteral(f_tr_gs(n))) end -- a bit weird but let's keep it here for a while @@ -135,7 +152,7 @@ function nodeinjections.effect(effect,stretch,rulethickness) -- always, no zero test (removed) rulethickness = bp * rulethickness effect = effects[effect] or effects['normal'] - return register(pdfliteral(format("%s Tc %s w %s Tr",stretch,rulethickness,effect))) -- watch order + return register(pdfliteral(f_effect(stretch,rulethickness,effect))) -- watch order end -- spot- and indexcolors @@ -152,9 +169,9 @@ local pdf_rbg_range = pdfarray { 0, 1, 0, 1, 0, 1 } local pdf_cmyk_range = pdfarray { 0, 1, 0, 1, 0, 1, 0, 1 } local pdf_gray_range = pdfarray { 0, 1 } -local rgb_function = "dup %s mul exch dup %s mul exch %s mul" -local cmyk_function = "dup %s mul exch dup %s mul exch dup %s mul exch %s mul" -local gray_function = "%s mul" +local f_rgb_function = formatters["dup %s mul exch dup %s mul exch %s mul"] +local f_cmyk_function = formatters["dup %s mul exch dup %s mul exch dup %s mul exch %s mul"] +local f_gray_function = formatters["%s mul"] local documentcolorspaces = pdfdictionary() @@ -191,12 +208,12 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range, Range = range, } local calculations = pdfflushstreamobject(format("{ %s }",funct),dictionary) - -- local calculations = pdfobject { - -- type = "stream", - -- immediate = true, - -- string = format("{ %s }",funct), - -- attr = dictionary(), - -- } + -- local calculations = pdfobject { + -- type = "stream", + -- immediate = true, + -- string = format("{ %s }",funct), + -- attr = dictionary(), + -- } local array = pdfarray { pdf_separation, pdfconstant(spotcolornames[name] or name), @@ -227,7 +244,7 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range, if sn then colorants[name] = pdfreference(sn) else - report_color("unknown colorant %s, using black instead",name or n) + report_color("unknown colorant %a, using black instead",name or n) name = "Black" end end @@ -343,47 +360,47 @@ end function registrations.rgbspotcolor(name,noffractions,names,p,r,g,b) if noffractions == 1 then - registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,format(rgb_function,r,g,b)) + registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,f_rgb_function(r,g,b)) else - registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,format("%s %s %s",r,g,b)) + registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,f_num_3(r,g,b)) end delayindexcolor(name,names,function() - return registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,format(rgb_function,r,g,b)) + return registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,f_rgb_function(r,g,b)) end) end function registrations.cmykspotcolor(name,noffractions,names,p,c,m,y,k) if noffractions == 1 then - registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k)) + registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,f_cmyk_function(c,m,y,k)) else - registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format("%s %s %s %s",c,m,y,k)) + registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,f_num_4(c,m,y,k)) end delayindexcolor(name,names,function() - return registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k)) + return registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,f_cmyk_function(c,m,y,k)) end) end function registrations.grayspotcolor(name,noffractions,names,p,s) if noffractions == 1 then - registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,format(gray_function,s)) + registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,f_gray_function(s)) else - registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,s) + registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,f_num_1(s)) end delayindexcolor(name,names,function() - return registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,format(gray_function,s)) + return registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,f_gray_function(s)) end) end function registrations.rgbindexcolor(name,noffractions,names,p,r,g,b) - registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,format(rgb_function,r,g,b)) + registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,f_rgb_function(r,g,b)) end function registrations.cmykindexcolor(name,noffractions,names,p,c,m,y,k) - registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k)) + registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,f_cmyk_function(c,m,y,k)) end function registrations.grayindexcolor(name,noffractions,names,p,s) - registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,gray_function) + registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,f_gray_function(s)) end function codeinjections.setfigurecolorspace(data,figure) @@ -453,17 +470,16 @@ function registrations.transparency(n,a,t) local mr = pdfreference(m) transparencyhash[n] = m documenttransparencies[n] = mr - lpdf.adddocumentextgstate(format("Tr%s",n),mr) + lpdf.adddocumentextgstate(f_tr(n),mr) end end statistics.register("page group warning", function() if done and not transparencygroups[currentgroupcolormodel] then - return format("transparencies are used but no pagecolormodel is set") + return "transparencies are used but no pagecolormodel is set" end end) - -- Literals needed to inject code in the mp stream, we cannot use attributes there -- since literals may have qQ's, much may go away once we have mplib code in place. -- @@ -480,22 +496,22 @@ local function lpdfcolor(model,ca,default) -- todo: use gray when no color model = forcedmodel(model) if model == 2 then local s = cv[2] - return format("%s g %s G",s,s) + return f_gray(s,s) elseif model == 3 then local r, g, b = cv[3], cv[4], cv[5] - return format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b) + return f_rgb(r,g,b,r,g,b) elseif model == 4 then local c, m, y, k = cv[6],cv[7],cv[8],cv[9] - return format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k) + return f_cmyk(c,m,y,k,c,m,y,k) else local n,f,d,p = cv[10],cv[11],cv[12],cv[13] if type(p) == "string" then p = gsub(p,","," ") -- brr misuse of spot end - return format("/%s cs /%s CS %s SCN %s scn",n,n,p,p) + return f_spot(n,n,p,p) end else - return format("%s g %s G",default or 0,default or 0) + return f_gray(default or 0,default or 0) end else return "" @@ -538,9 +554,9 @@ function lpdf.transparency(ct,default) -- kind of overlaps with transparencycode if transparencies.supported then local ct = transparenciesvalue(ct) if ct then - return format("/Tr%s gs",registertransparancy(nil,ct[1],ct[2],true)) + return f_tr_gs(registertransparancy(nil,ct[1],ct[2],true)) else - return "/Tr0 gs" + return f_tr_gs(0) end else return "" @@ -555,40 +571,19 @@ function lpdf.colorvalue(model,ca,default) end model = forcedmodel(model) if model == 2 then - return format("%s",cv[2]) + return f_num_1(cv[2]) elseif model == 3 then - return format("%s %s %s",cv[3],cv[4],cv[5]) + return f_num_3(cv[3],cv[4],cv[5]) elseif model == 4 then - return format("%s %s %s %s",cv[6],cv[7],cv[8],cv[9]) + return f_num_4(cv[6],cv[7],cv[8],cv[9]) else - return format("%s",cv[13]) + return f_num_1(cv[13]) end else - return format("%s",default or 0) + return f_num_1(default or 0) end end ---~ function lpdf.fdfcolor(model,ca,default) ---~ local cv = colorsvalue(ca) ---~ if cv then ---~ if model == 1 then ---~ model = cv[1] ---~ end ---~ model = forcedmodel(model) ---~ if model == 2 then ---~ return format("[%s]",cv[2]) ---~ elseif model == 3 then ---~ return format("[%s %s %s]",cv[3],cv[4],cv[5]) ---~ elseif model == 4 then ---~ return format("[%s %s %s %s]",cv[6],cv[7],cv[8],cv[9]) ---~ elseif model == 4 then ---~ return format("[%s]",cv[13]) ---~ end ---~ else ---~ return format("[%s]",default or 0) ---~ end ---~ end - function lpdf.colorvalues(model,ca,default) local cv = colorsvalue(ca) if cv then @@ -677,7 +672,7 @@ end function lpdf.transparencycode(a,t) if transparencies.supported then intransparency = true - return format("/Tr%s gs",registertransparancy(nil,a,t,true)) -- true forces resource + return f_tr_gs(registertransparancy(nil,a,t,true)) -- true forces resource else return "" end @@ -686,7 +681,7 @@ end function lpdf.finishtransparencycode() if transparencies.supported and intransparency then intransparency = false - return "/Tr0 gs" -- we happen to know this -) + return f_tr_gs(0) -- we happen to know this -) else return "" end @@ -694,7 +689,9 @@ end -- this will move to lpdf-spe.lua -backends.pdf.tables.vfspecials = { -- todo: distinguish between glyph and rule color +local f_slant = formatters["pdf: q 1 0 %f 1 0 0 cm"] + +backends.pdf.tables.vfspecials = allocate { -- todo: distinguish between glyph and rule color red = { "special", 'pdf: 1 0 0 rg 1 0 0 RG' }, green = { "special", 'pdf: 0 1 0 rg 0 1 0 RG' }, @@ -714,7 +711,7 @@ backends.pdf.tables.vfspecials = { -- todo: distinguish between glyph and rule c palegray = { "special", 'pdf: .75 g' }, }, - startslant = function(a) return { "special", format("pdf: q 1 0 %s 1 0 0 cm",a) } end, + startslant = function(a) return { "special", f_slant(a) } end, stopslant = { "special", "pdf: Q" }, } |