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