1 /* Test support code */
2 /*
3  * Copyright 2000 Graeme W. Gill
4  * All rights reserved.
5  *
6  * This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
7  * see the License.txt file for licencing details.
8  */
9 
10 #include "stdio.h"
11 #include "stdlib.h"
12 #include "refi.h"
13 
14 /* Callbackes used to setup rspl's */
inputlu(void * cbctx,double * out,double * in)15 static void inputlu(
16 void *cbctx,
17 double *out,
18 double *in
19 ) {
20 	int i;
21 	refi *r = (refi *)cbctx;
22 	double ov[MXDI], iv[MXDI];
23 
24 	for (i = 0; i < r->id; i++)
25 		iv[i] = *in;
26 	r->input_curves(r->cntx, ov, iv);
27 
28 	*out = ov[r->chan];
29 }
30 
clutlu(void * cbctx,double * out,double * in)31 static void clutlu(
32 void *cbctx,
33 double *out,
34 double *in
35 ) {
36 	refi *r = (refi *)cbctx;
37 
38 	r->md_table(r->cntx, out, in);
39 }
40 
outputlu(void * cbctx,double * out,double * in)41 static void outputlu(
42 void *cbctx,
43 double *out,
44 double *in
45 ) {
46 	int i;
47 	refi *r = (refi *)cbctx;
48 	double ov[MXDO], iv[MXDO];
49 
50 	for (i = 0; i < r->od; i++)
51 		iv[i] = *in;
52 	r->output_curves(r->cntx, ov, iv);
53 
54 	*out = ov[r->chan];
55 }
56 
57 
new_refi(int id,int od,int inres,int clutres,int outres,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)58 refi *new_refi(
59 int id,			/* Number of input dimensions */
60 int od,			/* Number of output dimensions */
61 int inres,		/* Desired input table resolution */
62 int clutres,	/* Desired clut table resolution */
63 int outres,		/* Desired output table resolution */
64 
65 /* Callbacks to lookup the table values */
66 void (*input_curves) (void *cntx, double *out_vals, double *in_vals),
67 void (*md_table)     (void *cntx, double *out_vals, double *in_vals),
68 void (*output_curves)(void *cntx, double *out_vals, double *in_vals),
69 void *cntx		/* Context to callbacks */
70 ) {
71 	refi *r;
72 	int e;
73 	int gres[MXDI];
74 
75 	if ((r = (refi *)malloc(sizeof(refi))) == NULL) {
76 		fprintf(stderr,"Malloc of refi failed\n");
77 		exit (-1);
78 	}
79 
80 	r->id = id;
81 	r->od = od;
82 	r->inres = inres;
83 	r->clutres = clutres;
84 	r->outres = outres;
85 	r->input_curves  = input_curves;
86 	r->md_table      = md_table;
87 	r->output_curves = output_curves;
88 	r->cntx		     = cntx;
89 
90 	/* Create some input interpolations */
91 	for (e = 0; e < id; e++) {
92 		if ((r->in[e] = new_rspl(RSPL_NOFLAGS, 1, 1)) == NULL) {
93 			fprintf(stderr,"new_rspl failed\n");
94 			exit (-1);
95 		}
96 		r->chan = e;
97 		r->in[e]->set_rspl(r->in[e], 0, (void *)r, inputlu, NULL, NULL, &inres, NULL, NULL);
98 	}
99 
100 	/* Clut */
101 	if ((r->clut = new_rspl(RSPL_NOFLAGS, id, od)) == NULL) {
102 		fprintf(stderr,"new_rspl failed\n");
103 		exit (-1);
104 	}
105 	for (e = 0; e < id; e++)
106 		gres[e] = clutres;
107 	r->clut->set_rspl(r->clut, 0, (void *)r, clutlu, NULL, NULL, gres, NULL, NULL);
108 
109 	/* Create some output interpolations */
110 	for (e = 0; e < od; e++) {
111 		if ((r->out[e] = new_rspl(RSPL_NOFLAGS, 1, 1)) == NULL) {
112 			fprintf(stderr,"new_rspl failed\n");
113 			exit (-1);
114 		}
115 		r->chan = e;
116 		r->out[e]->set_rspl(r->out[e], 0, (void *)r, outputlu, NULL, NULL, &outres, NULL, NULL);
117 	}
118 
119 	return r;
120 }
121 
122 /* Run an interpolation through an input table */
refi_input(void * cntx,double * out_vals,double * in_vals)123 void refi_input(
124 void *cntx,
125 double *out_vals,
126 double *in_vals
127 ) {
128 	refi *r = (refi *)cntx;
129 	int e;
130 	co vals;				/* Input and output values */
131 
132 	for (e = 0; e < r->id; e++) {
133 		vals.p[0] = in_vals[e];
134 		r->in[e]->interp(r->in[e], &vals);
135 		out_vals[e] = vals.v[0];
136 	}
137 }
138 
139 /* Run an interpolation through an clut table */
refi_clut(void * cntx,double * out_vals,double * in_vals)140 void refi_clut(
141 void *cntx,
142 double *out_vals,
143 double *in_vals
144 ) {
145 	refi *r = (refi *)cntx;
146 	int e;
147 	co vals;				/* Input and output values */
148 
149 	for (e = 0; e < r->id; e++)
150 		vals.p[e] = in_vals[e];
151 	r->clut->interp(r->clut, &vals);
152 	for (e = 0; e < r->od; e++)
153 		out_vals[e] = vals.v[e];
154 }
155 
156 /* Run an interpolation through an output table */
refi_output(void * cntx,double * out_vals,double * in_vals)157 void refi_output(
158 void *cntx,
159 double *out_vals,
160 double *in_vals
161 ) {
162 	refi *r = (refi *)cntx;
163 	int e;
164 	co vals;				/* Input and output values */
165 
166 	for (e = 0; e < r->od; e++) {
167 		vals.p[0] = in_vals[e];
168 		r->out[e]->interp(r->out[e], &vals);
169 		out_vals[e] = vals.v[0];
170 	}
171 }
172 
173 void
refi_free(refi * r)174 refi_free(
175 refi *r
176 ) {
177 	int e;
178 
179 	for (e = 0; e < r->id; e++) {
180 		r->in[e]->del(r->in[e]);
181 	}
182 
183 	r->clut->del(r->clut);
184 
185 	for (e = 0; e < r->od; e++) {
186 		r->out[e]->del(r->out[e]);
187 	}
188 }
189 
190 
191 
192 
193 
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 
210 
211 
212 
213