summaryrefslogtreecommitdiff
path: root/imdi/imdi_tab.h
diff options
context:
space:
mode:
Diffstat (limited to 'imdi/imdi_tab.h')
-rw-r--r--imdi/imdi_tab.h170
1 files changed, 170 insertions, 0 deletions
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 */