if not modules then modules = { } end modules ['lpdf-mis'] = {
    version   = 1.001,
    comment   = "companion to lpdf-ini.mkiv",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

local type = type
local format, gsub = string.format, string.gsub

-- colors         = colors         or { }
-- transparencies = transparencies or { }

local registercolor        = colors.register
local registertransparancy = transparencies.register
local colorsvalue          = colors.value
local transparenciesvalue  = transparencies.value

-- 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.
--
-- This module assumes that some functions are defined in the colors namespace
-- which mostlikely will be loaded later.

function lpdf.color(model,ca,default) -- todo: use gray when no color
    local cv = colorsvalue(ca)
    if cv then
        if model == 1 then
            model = cv[1]
        end
        if model == 2 then
            local s = cv[2]
            return format("%s g %s G",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)
        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)
        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)
        end
    else
        return format("%s g %s G",default or 0,default or 0)
    end
end

function lpdf.transparency(ct,default) -- kind of overlaps with transparencycode
    -- beware, we need this hack because normally transparencies are not
    -- yet registered and therefore the number is not not known ... we
    -- might use the attribute number itself in the future
    local ct = transparenciesvalue(ct)
    if ct then
        return format("/Tr%s gs",registertransparancy(nil,ct[1],ct[2],true))
    else
        return "/Tr0 gs"
    end
end

function lpdf.colorvalue(model,ca,default)
    local cv = colorsvalue(ca)
    if cv then
        if model == 1 then
            model = cv[1]
        end
        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])
        else
            return format("%s",cv[13])
        end
    else
        return format("%s",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
        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.colorspace(model,ca)
    local cv = colorsvalue(ca)
    if cv then
        if model == 1 then
            model = cv[1]
        end
        if model == 2 then
            return "DeviceGray"
        elseif model == 3 then
            return "DeviceRGB"
        elseif model == 4 then
            return "DeviceCMYK"
        end
    end
    return "DeviceGRAY"
end

-- by registering we getconversion for free (ok, at the cost of overhead)

local intransparency = false
local pdfcolor       = lpdf.color

function lpdf.rgbcode(model,r,g,b)
    return pdfcolor(model,registercolor(nil,'rgb',r,g,b))
end
function lpdf.cmykcode(model,c,m,y,k)
    return pdfcolor(model,registercolor(nil,'cmyk',c,m,y,k))
end
function lpdf.graycode(model,s)
    return pdfcolor(model,registercolor(nil,'gray',s))
end
function lpdf.spotcode(model,n,f,d,p)
    return pdfcolor(model,registercolor(nil,'spot',n,f,d,p)) -- incorrect
end
function lpdf.transparencycode(a,t)
    intransparency = true
    return format("/Tr%s gs",registertransparancy(nil,a,t,true)) -- true forces resource
end
function lpdf.finishtransparencycode()
    if intransparency then
        intransparency = false
        return "/Tr0 gs"  -- we happen to know this -)
    else
        return ""
    end
end
