summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/lpdf-col.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/lpdf-col.lua')
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-col.lua139
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" },
}