#include "driver.h"
#include <math.h>
void
cupsLutDelete(cups_lut_t *lut)
{
if (lut != NULL)
free(lut);
}
cups_lut_t *
cupsLutLoad(ppd_file_t *ppd,
const char *colormodel,
const char *media,
const char *resolution,
const char *ink)
{
char name[PPD_MAX_NAME],
spec[PPD_MAX_NAME];
ppd_attr_t *attr;
int nvals;
float vals[4];
if (!ppd || !colormodel || !media || !resolution || !ink)
return (NULL);
snprintf(name, sizeof(name), "cups%sDither", ink);
if ((attr = cupsFindAttr(ppd, name, colormodel, media, resolution, spec,
sizeof(spec))) == NULL)
attr = cupsFindAttr(ppd, "cupsAllDither", colormodel, media,
resolution, spec, sizeof(spec));
if (!attr)
return (NULL);
vals[0] = 0.0;
vals[1] = 0.0;
vals[2] = 0.0;
vals[3] = 0.0;
nvals = sscanf(attr->value, "%f%f%f", vals + 1, vals + 2, vals + 3) + 1;
fprintf(stderr, "DEBUG: Loaded LUT %s from PPD with values [%.3f %.3f %.3f %.3f]\n",
name, vals[0], vals[1], vals[2], vals[3]);
return (cupsLutNew(nvals, vals));
}
cups_lut_t *
cupsLutNew(int num_values,
const float *values)
{
int pixel;
cups_lut_t *lut;
int start,
end,
maxval;
if (!num_values || !values)
return (NULL);
if ((lut = (cups_lut_t *)calloc((CUPS_MAX_LUT + 1),
sizeof(cups_lut_t))) == NULL)
return (NULL);
maxval = CUPS_MAX_LUT / values[num_values - 1];
for (start = 0; start <= CUPS_MAX_LUT; start ++)
lut[start].intensity = start * maxval / CUPS_MAX_LUT;
for (pixel = 0; pixel < num_values; pixel ++)
{
if (pixel == 0)
start = 0;
else
start = (int)(0.5 * maxval * (values[pixel - 1] +
values[pixel])) + 1;
if (start < 0)
start = 0;
else if (start > CUPS_MAX_LUT)
start = CUPS_MAX_LUT;
if (pixel == (num_values - 1))
end = CUPS_MAX_LUT;
else
end = (int)(0.5 * maxval * (values[pixel] + values[pixel + 1]));
if (end < 0)
end = 0;
else if (end > CUPS_MAX_LUT)
end = CUPS_MAX_LUT;
if (start == end)
break;
while (start <= end)
{
lut[start].pixel = pixel;
if (start == 0)
lut[0].error = 0;
else
lut[start].error = start - maxval * values[pixel];
start ++;
}
}
for (start = 0; start <= CUPS_MAX_LUT; start += CUPS_MAX_LUT / 15)
fprintf(stderr, "DEBUG: %d = %d/%d/%d\n", start, lut[start].intensity,
lut[start].pixel, lut[start].error);
return (lut);
}