181 lines
6.7 KiB
C
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 */
|