From 22f703cab05b7cd368f4de9e03991b7664dc5022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Mon, 1 Sep 2014 13:56:46 +0200 Subject: Initial import of argyll version 1.5.1-8 --- imdi/imdi_tab.h | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 imdi/imdi_tab.h (limited to 'imdi/imdi_tab.h') diff --git a/imdi/imdi_tab.h b/imdi/imdi_tab.h new file mode 100644 index 0000000..403fcaa --- /dev/null +++ b/imdi/imdi_tab.h @@ -0,0 +1,170 @@ +#ifndef IMDI_TAB_H +#define IMDI_TAB_H + +/* Integer Multi-Dimensional Interpolation */ + +/* + * Copyright 2000 - 2007 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. + */ + +/* + * Implementation details needed for table initialisation for a particular + * kernel. This is private implementation for imdi.[ch] + * + * The tabspec structure holds detailed information on the algorithms used + * by the runtime code, and (implicit in this) the layout of the runtime + * tables needed to match the algorithm. There are also implicit dependencies on + * the genspec structure, since this determines the overall features + * supported by a particular pixel kernel module. + * + * This is effectively the product of the genspec, the architechure, + * and the coding choices made by the code generator + * (ie. gen_c_kernel() in cgen.c) + * + */ + +/* entries marked with '#' are not currently used by imdi_tab() */ +/* NOTE :- if you change this, you need to change the code in cgen.c */ +/* labeled !genspec and tabspec delta code! */ +struct _tabspec { + + int sort; /* NZ for explicit sort rather than simplex table lookup */ + int it_xs; /* NZ if separate interp index and simplex index/Weighting+Offset values */ + int wo_xs; /* NZ if separate weighting and vertex offset entries are to be used */ + + int it_ix; /* Non-zero if input value extraction should be done in input table */ + int it_ab; /* Input table entry size in bits */ + int it_ts; /* Input table :- total input table entry size in bytes */ + /* Bit packing order is (ms to ls) : + sort: ix, we, vo + sort: ix, wo + !sort: ix, sx + */ + + /* Interpolation index is always in the input table */ + int ix_ab; /* # Interpolation index entry size in bits */ + int ix_es; /* Interpolation index entry size in bytes */ + int ix_eo; /* Interpolation index entry offset in bytes */ + + /* Simplex Index is always in the input table */ + int sx_ab; /* Simplex Index entry size in bits */ + int sx_es; /* Simplex Index entry size in bytes */ + int sx_eo; /* Simplex Index entry offset in bytes */ + + int sm_ts; /* Simplex table entry total size in bytes */ + /* Bit packing order is (ms to ls) : we, vo */ + + /* Combined Weighting + Offset may be in input table or Simplex entry */ + int wo_ab; /* Combined Weighting + Offset entry size in bits */ + int wo_es; /* Combined Weighting + Offset entry size in bytes */ + int wo_eo; /* Combined Weighting + Offset entry offset in bytes */ + + /* Weighting may be in input table or Simplex entry */ + int we_ab; /* # Weighting entry size in bits */ + int we_es; /* Weighting entry size in bytes */ + int we_eo; /* Weighting entry offset in bytes */ + + /* Vertex offset may be in input table or Simplex entry */ + int vo_ab; /* Vertex Offset entry size in bits */ + int vo_es; /* Vertex Offset entry size in bytes */ + int vo_eo; /* Vertex Offset entry offset in bytes */ + int vo_om; /* Vertex Offset scaling multiplier */ + + int im_cd; /* Non-zero if interpolation table entries are padded with fraction */ + int im_ts; /* Interp. multidim :- total interp table entry size in bytes */ + int im_oc; /* # Interp. multidim :- offset scale to apply to index into interp entry */ + int im_fs; /* Interp. multidim :- full table entry size in bytes */ + int im_fn; /* Interp. multidim :- number of full entries */ + int im_fv; /* Interp. multidim :- output values per full entry . */ + int im_ps; /* Interp. multidim :- partial table entry size in bytes, used & unsused */ + int im_pn; /* Interp. multidim :- number of partial entries - must be 0 or 1 */ + int im_pv; /* Interp. multidim :- used output values per partial entry . */ + + int ot_ts; /* Output table :- total entry size in bytes of every table */ + int ot_off[IXDO]; /* Offset for each output value within the output word needed */ + int ot_bits[IXDO]; /* Number of bits for value within the output word needed */ + + /* Associated interpolation function */ + void (*interp)(struct _imdi *s, void **inp, void **outp, unsigned int npix); /* At run time */ +}; typedef struct _tabspec tabspec; + +/* Runtime conversion needed */ +typedef enum { + conv_none = 0x00, /* No conversion needed */ + conv_istr = 0x01, /* Input stride conversion */ + conv_ostr = 0x02, /* Output stride conversion */ + conv_irep = 0x04, /* Input representation conversion */ + conv_orep = 0x08, /* Output representation conversion */ + conv_rev = 0x10, /* Reverse direction conversion */ + conv_skip = 0x20 /* Skip output channel write conversion */ +} imdi_conv; + +/* The actual run time table that tabspec describes */ +typedef struct { + /* Runtime setup */ + int id; /* Number of input dimensions */ + int od; /* Number of output dimensions (including skip channels) */ + int wod; /* Number of written output dimensions ( < od if skipf != 0) */ + int it_map[IXDI]; /* Mapping from input raster channels to callback channels. */ + int im_map[IXDO]; /* Mapping from output raster channels to callback channels. */ + imdi_pixrep cirep; /* High level input pixel representation called with */ + imdi_pixrep corep; /* High level output pixel representation called with */ + imdi_pixrep firep; /* High level input pixel representation of interp func. */ + imdi_pixrep forep; /* High level output pixel representation of interp func. */ + imdi_conv cnv; /* Runtime argument conversion needed */ + void (*interp)(struct _imdi *s, void **outp, int outst, /* Underlying conversion function */ + void **inp, int inst, + unsigned int npixels); + /* Output channel check data */ + unsigned long checkv[IXDO]; /* Output per channel check values. Set flag if != checkv */ + unsigned int checkf; /* Output per channel check flags (one per bit) */ + unsigned int skipf; /* Output per channel skip flags (one per bit) */ + + /* Table data */ + void *in_tables[IXDI]; /* Input dimension input lookup tables */ + void *sw_table; /* Simplex weighting lookup table */ + void *im_table; /* Interpolation Multi-dimensional lookup table */ + void *out_tables[IXDO]; /* Output dimension output lookup tables */ + int nintabs; /* Number of input tables */ + int nouttabs; /* Number of output tables */ + + /* Extra reporting data */ + unsigned long size; /* Number of bytes allocated to imdi_imp */ + unsigned int gres, sres; /* Grid and simplex table resolutions. sres = 0 = sort */ +} imdi_imp; + +/* + * The runtime function that knows how to setup an imdi_imp + * table for for our chosen kernel and the color mapping we + * want to perform. + */ + +imdi_imp * +imdi_tab( + genspec *gs, /* Pointer to gen spec */ + tabspec *ts, /* Pointer to table spec */ + imdi_conv cnv, /* Runtime argument conversion needed */ + imdi_pixrep irep, /* High level input pixel representation to match */ + imdi_pixrep orep, /* High level output pixel representation to match */ + void (*interp)(struct _imdi *s, void **outp, int outst, /* Underlying conversion function */ + void **inp, int inst, + unsigned int npixels), + int *inm, /* Input raster channel to callback channel mapping, NULL for none. */ + int *outm, /* Output raster channel to callback channel mapping, NULL for none. */ + imdi_ooptions oopt, /* Output per channel options (Callback channel, NOT written channel) */ + unsigned int *checkv, /* Output channel check values (Callback channel, NULL for none == 0. */ + + /* Callbacks to initialse the imdi 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 of callbacks */ +); + +void imdi_tab_free(imdi_imp *it); + +#endif /* IMDI_TAB_H */ -- cgit v1.2.3