Files
argyllcms/render/thscreen.h
2026-08-20 20:28:40 +01:00

181 lines
6.7 KiB
C

#ifndef THSCREEN_H
#define THSCREEN_H
/*
* render2d
*
* Threshold or Error diffusion screen pixel processing object.
* (Simplified from DPS code)
*
* Author: Graeme W. Gill
* Date: 11/7/2005
* Version: 1.00
*
* Copyright 2005, 2012, 2014 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.
*
*/
#define THMXCH2D 8 /* Maximum color channels */
/* Light Separation in screening flag */
typedef enum {
scls_false = 0, /* Don't do light ink separation during screening. */
scls_true = 0 /* Do light ink separation during screening. */
} sc_lightsep;
/* Input encoding */
typedef enum {
scie_8 = 0, /* 8 bit per component */
scie_16 = 1 /* 16 bit per component */
} sc_iencoding;
/* Output bit order within byte */
typedef enum {
scoo_l = 0, /* Little endian */
scoo_b = 1 /* Big endian */
} sc_oorder;
/* ---------------------------- */
/* Setup a set of screens */
struct _thscreens {
int np; /* Number of planes */
struct _thscreen **sc; /* List of screens */
int oebpc; /* Output encoding bits per component, 1,2,4 or 8 */
int oelev; /* Output encoding levels. Must be <= 2 ^ oebpc */
int oevalues[256]; /* Output encoding values for each level */
int edif; /* nz if using error diffusion */
int **luts; /* Lookup tables */
int mxwidth; /* max width in pixels of raster to be screened */
int lastyoff; /* Last y offset */
float **ebuf; /* Error buffer for each plane */
/* ebuf[][-1] is used for next pixel error */
void (*quant)(void *qcntx, double *out, double *in); /* optional quantization func. for edif */
void *qcntx; /* Context for quant */
double mxerr; /* if != 0, max error to propogate */
sobol *so; /* Random number generator for error diffusion */
/* Screen pixel values */
void (* screen)( /* Pointer to dither function */
struct _thscreens *t, /* Screening object pointer */
int width, int height, /* Width and height to screen in pixels */
int xoff, int yoff, /* Offset into screening pattern */
unsigned char *out, /* Output pixel buffer */
unsigned long opitch, /* Increment between output lines in components */
unsigned char *in, /* Input pixel buffer */
unsigned long ipitch); /* Increment between input lines in components */
void (* del)( /* Destructor */
struct _thscreens *t); /* Screening objects pointer */
}; typedef struct _thscreens thscreens;
/* Return a thscreens object */
/* Screen data is used that best matches the requested parameters. */
/* Return NULL on error */
thscreens *new_thscreens(
int exact, /* Return only exact matches */
int nplanes, /* Number of planes to screen */
double asp, /* Target aspect ratio (== dpiX/dpiY) */
int size, /* Target screen size */
sc_iencoding ie, /* Input encoding - must be scie_16 */
int oebpc, /* Output encoding bits per component - must be 8 */
int oelev, /* Output encoding levels. Must be <= 2 ^ oebpc */
int *oevalues, /* Optional output encoding values for each level */
/* Must be oelev entries. Default is 0 .. oelev-1 */
sc_oorder oo, /* Output bit ordering */
double overlap, /* Overlap between levels, 0 - 1.0 */
int mxwidth, /* max width in pixels of raster to be screened */
void **cntx, /* List of contexts for lookup table callback */
double (**lutfunc)(void *cntx, double in), /* List of callback function, NULL if none */
int edif, /* nz if using error diffusion */
void (*quant)(void *qcntx, double *out, double *in), /* optional quantization func. for edif */
void *qcntx,
double mxerr /* If error diffusion anf != 0, max error to propogate */
);
/* ---------------------------- */
/* Screen defintion information */
typedef struct {
int x;
int y;
} ccoord;
typedef struct {
int size; /* General size */
int width; /* width in pixels */
int height; /* Height in pixels */
double asp; /* Aspect ratio (== dpiX/dpiY) */
int joint; /* na for joint screens */
ccoord **list; /* Pointer to list of pointers to threshold coordinates */
} thscdef;
/* ------------------------ */
/* Setup of a single screen */
struct _thscreen {
sc_iencoding ie; /* Input encoding */
int oebpc; /* Output encoding bits per component, 1,2,4 or 8 */
int oelev; /* Output encoding levels. Must be <= 2 ^ oebpc */
int oevalues[256]; /* Output encoding values for each level */
sc_oorder oo; /* Output bit ordering */
double asp; /* Aspect ratio (== dpiX/dpiY) */
double overlap; /* Overlap between levels, 0 - 1.0 */
int *lut; /* Lookup table */
unsigned char _tht[65536 * 3];/* Threshold table */
unsigned char *tht; /* Pointer to base of threshold table */
unsigned char **thp; /* Pointers to threshold table (offset int _tht) */
int swidth; /* Given screen width */
int sheight; /* Given screen height */
int twidth; /* Rounded up screen table width & stride */
int theight; /* Screen table height */
void (* screen)( /* Pointer to dither function */
struct _thscreen *t, /* Screening object pointer */
int width, int height, /* Width and height to screen in pixels */
int xoff, int yoff, /* Offset into screening pattern */
unsigned char *out, /* Output pixel buffer */
unsigned long opinc, /* Increment between output pixels in components */
unsigned long opitch, /* Increment between output lines in components */
unsigned char *in, /* Input pixel buffer */
unsigned long ipinc, /* Increment between input pixels in components */
unsigned long ipitch); /* Increment between input lines in components */
void (* del)( /* Destructor */
struct _thscreen *t); /* Screening object pointer */
}; typedef struct _thscreen thscreen;
/* Create a new thscreen object */
/* Return NULL on error */
thscreen *new_thscreen(
int width, /* width in pixels of screen */
int height, /* Height in pixels of screen */
int xoff, int yoff, /* Pattern offsets into width & height (must be +ve) */
double asp, /* Aspect ratio (== dpiX/dpiY) */
int swap, /* Swap X & Y to invert aspect ratio */
ccoord *thli, /* List of screen initialisation threshold coordinates */
sc_iencoding ie, /* Input encoding - must be scie_16 */
int oebpc, /* Output encoding bits per component - must be 8 */
int oelev, /* Output encoding levels. Must be <= 2 ^ oebpc */
int *oevalues, /* Optional output encoding values for each level */
/* Must be oelev entries. Default is 0 .. oelev-1 */
sc_oorder oo, /* Output bit ordering */
double olap, /* Overlap between levels, 0 - 1.0 */
void *cntx, /* Context for LUT table callback */
double (*lutfunc)(void *cntx, double in) /* Callback function, NULL if none */
);
#endif /* THSCREEN_H */