Files
argyllcms/imdi/refi.c
T
2026-08-20 20:28:40 +01:00

213 lines
3.8 KiB
C

/* Test support code */
/*
* Copyright 2000 Graeme W. Gill
* All rights reserved.
*
* This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
* see the License.txt file for licencing details.
*/
#include "stdio.h"
#include "stdlib.h"
#include "refi.h"
/* Callbackes used to setup rspl's */
static void inputlu(
void *cbctx,
double *out,
double *in
) {
int i;
refi *r = (refi *)cbctx;
double ov[MXDI], iv[MXDI];
for (i = 0; i < r->id; i++)
iv[i] = *in;
r->input_curves(r->cntx, ov, iv);
*out = ov[r->chan];
}
static void clutlu(
void *cbctx,
double *out,
double *in
) {
refi *r = (refi *)cbctx;
r->md_table(r->cntx, out, in);
}
static void outputlu(
void *cbctx,
double *out,
double *in
) {
int i;
refi *r = (refi *)cbctx;
double ov[MXDO], iv[MXDO];
for (i = 0; i < r->od; i++)
iv[i] = *in;
r->output_curves(r->cntx, ov, iv);
*out = ov[r->chan];
}
refi *new_refi(
int id, /* Number of input dimensions */
int od, /* Number of output dimensions */
int inres, /* Desired input table resolution */
int clutres, /* Desired clut table resolution */
int outres, /* Desired output table resolution */
/* Callbacks to lookup the table values */
void (*input_curves) (void *cntx, double *out_vals, double *in_vals),
void (*md_table) (void *cntx, double *out_vals, double *in_vals),
void (*output_curves)(void *cntx, double *out_vals, double *in_vals),
void *cntx /* Context to callbacks */
) {
refi *r;
int e;
int gres[MXDI];
if ((r = (refi *)malloc(sizeof(refi))) == NULL) {
fprintf(stderr,"Malloc of refi failed\n");
exit (-1);
}
r->id = id;
r->od = od;
r->inres = inres;
r->clutres = clutres;
r->outres = outres;
r->input_curves = input_curves;
r->md_table = md_table;
r->output_curves = output_curves;
r->cntx = cntx;
/* Create some input interpolations */
for (e = 0; e < id; e++) {
if ((r->in[e] = new_rspl(RSPL_NOFLAGS, 1, 1)) == NULL) {
fprintf(stderr,"new_rspl failed\n");
exit (-1);
}
r->chan = e;
r->in[e]->set_rspl(r->in[e], 0, (void *)r, inputlu, NULL, NULL, &inres, NULL, NULL);
}
/* Clut */
if ((r->clut = new_rspl(RSPL_NOFLAGS, id, od)) == NULL) {
fprintf(stderr,"new_rspl failed\n");
exit (-1);
}
for (e = 0; e < id; e++)
gres[e] = clutres;
r->clut->set_rspl(r->clut, 0, (void *)r, clutlu, NULL, NULL, gres, NULL, NULL);
/* Create some output interpolations */
for (e = 0; e < od; e++) {
if ((r->out[e] = new_rspl(RSPL_NOFLAGS, 1, 1)) == NULL) {
fprintf(stderr,"new_rspl failed\n");
exit (-1);
}
r->chan = e;
r->out[e]->set_rspl(r->out[e], 0, (void *)r, outputlu, NULL, NULL, &outres, NULL, NULL);
}
return r;
}
/* Run an interpolation through an input table */
void refi_input(
void *cntx,
double *out_vals,
double *in_vals
) {
refi *r = (refi *)cntx;
int e;
co vals; /* Input and output values */
for (e = 0; e < r->id; e++) {
vals.p[0] = in_vals[e];
r->in[e]->interp(r->in[e], &vals);
out_vals[e] = vals.v[0];
}
}
/* Run an interpolation through an clut table */
void refi_clut(
void *cntx,
double *out_vals,
double *in_vals
) {
refi *r = (refi *)cntx;
int e;
co vals; /* Input and output values */
for (e = 0; e < r->id; e++)
vals.p[e] = in_vals[e];
r->clut->interp(r->clut, &vals);
for (e = 0; e < r->od; e++)
out_vals[e] = vals.v[e];
}
/* Run an interpolation through an output table */
void refi_output(
void *cntx,
double *out_vals,
double *in_vals
) {
refi *r = (refi *)cntx;
int e;
co vals; /* Input and output values */
for (e = 0; e < r->od; e++) {
vals.p[0] = in_vals[e];
r->out[e]->interp(r->out[e], &vals);
out_vals[e] = vals.v[0];
}
}
void
refi_free(
refi *r
) {
int e;
for (e = 0; e < r->id; e++) {
r->in[e]->del(r->in[e]);
}
r->clut->del(r->clut);
for (e = 0; e < r->od; e++) {
r->out[e]->del(r->out[e]);
}
}