xref: /plan9/sys/src/cmd/gs/src/gxsample.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1997, 1999 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: gxsample.h,v 1.7 2005/06/08 14:38:21 igor Exp $ */
18 /* Sample lookup and expansion */
19 
20 #ifndef gxsample_INCLUDED
21 #  define gxsample_INCLUDED
22 
23 /*
24  * The following union implements the expansion of sample
25  * values from N bits to 8, and a possible linear transformation.
26  */
27 typedef union sample_lookup_s {
28     bits32 lookup4x1to32[16];	/* 1 bit/sample, not spreading */
29     bits16 lookup2x2to16[16];	/* 2 bits/sample, not spreading */
30     byte lookup8[256];		/* 1 bit/sample, spreading [2] */
31     /* 2 bits/sample, spreading [4] */
32     /* 4 bits/sample [16] */
33     /* 8 bits/sample [256] */
34 } sample_lookup_t;
35 
36 /*
37  * Define identity and inverted expansion lookups for 1-bit input values.
38  * These can be cast to a const sample_lookup_t.
39  */
40 extern const bits32 lookup4x1to32_identity[16];
41 extern const bits32 lookup4x1to32_inverted[16];
42 
43 #ifndef sample_map_DEFINED
44 #define sample_map_DEFINED
45 typedef struct sample_map_s sample_map;
46 #endif
47 
48 /*
49  * Define procedures to unpack and shuffle image data samples.  The Unix C
50  * compiler can't handle typedefs for procedure (as opposed to
51  * pointer-to-procedure) types, so we have to do it with macros instead.
52  *
53  * The original data start at sample data_x relative to data.
54  * bptr points to the buffer normally used to deliver the unpacked data.
55  * The unpacked data are at sample *pdata_x relative to the return value.
56  *
57  * Note that this procedure may return either a pointer to the buffer, or
58  * a pointer to the original data.
59  */
60 #define SAMPLE_UNPACK_PROC(proc)\
61   const byte *proc(byte *bptr, int *pdata_x, const byte * data, int data_x,\
62 		   uint dsize, const sample_map *smap, int spread,\
63 		   int num_components_per_plane)
64 typedef SAMPLE_UNPACK_PROC((*sample_unpack_proc_t));
65 
66 /*
67  * Declare the 1-for-1 unpacking procedure.
68  */
69 SAMPLE_UNPACK_PROC(sample_unpack_copy);
70 /*
71  * Declare unpacking procedures for 1, 2, 4, and 8 bits per pixel,
72  * with optional spreading of the result.
73  */
74 SAMPLE_UNPACK_PROC(sample_unpack_1);
75 SAMPLE_UNPACK_PROC(sample_unpack_2);
76 SAMPLE_UNPACK_PROC(sample_unpack_4);
77 SAMPLE_UNPACK_PROC(sample_unpack_8);
78 
79 SAMPLE_UNPACK_PROC(sample_unpack_1_interleaved);
80 SAMPLE_UNPACK_PROC(sample_unpack_2_interleaved);
81 SAMPLE_UNPACK_PROC(sample_unpack_4_interleaved);
82 SAMPLE_UNPACK_PROC(sample_unpack_8_interleaved);
83 
84 #endif /* gxsample_INCLUDED */
85