xref: /plan9-contrib/sys/src/cmd/gs/src/sdct.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* Copyright (C) 1994, 1997, 1998 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: sdct.h,v 1.7 2002/06/16 05:00:54 lpd Exp $ */
187dd7cddfSDavid du Colombier /* Definitions for DCT filters */
197dd7cddfSDavid du Colombier /* Requires stream.h, strimpl.h, jpeg/jpeglib.h */
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier #ifndef sdct_INCLUDED
227dd7cddfSDavid du Colombier #  define sdct_INCLUDED
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier #include <setjmp.h>		/* for jmp_buf */
257dd7cddfSDavid du Colombier 
267dd7cddfSDavid du Colombier /* ------ DCT filters ------ */
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier /*
293ff48bf5SDavid du Colombier  * We don't want to allocate JPEG's private data directly from
303ff48bf5SDavid du Colombier  * the C heap, but we must allocate it as immovable; and to avoid
313ff48bf5SDavid du Colombier  * garbage collection issues, we must keep GC-traceable pointers
323ff48bf5SDavid du Colombier  * to every block allocated.
333ff48bf5SDavid du Colombier  */
343ff48bf5SDavid du Colombier typedef struct jpeg_block_s jpeg_block_t;
353ff48bf5SDavid du Colombier struct jpeg_block_s {
363ff48bf5SDavid du Colombier     jpeg_block_t *next;
373ff48bf5SDavid du Colombier     void *data;
383ff48bf5SDavid du Colombier };
393ff48bf5SDavid du Colombier #define private_st_jpeg_block()	/* in sjpegc.c */\
403ff48bf5SDavid du Colombier   gs_private_st_ptrs2(st_jpeg_block, jpeg_block_t, "jpeg_block_t",\
413ff48bf5SDavid du Colombier     jpeg_block_enum_ptrs, jpeg_block_reloc_ptrs, next, data)
423ff48bf5SDavid du Colombier 
433ff48bf5SDavid du Colombier /*
447dd7cddfSDavid du Colombier  * Define the stream state.
457dd7cddfSDavid du Colombier  * The jpeg_xxx_data structs are allocated in immovable memory
467dd7cddfSDavid du Colombier  * to simplify use of the IJG library.
477dd7cddfSDavid du Colombier  */
487dd7cddfSDavid du Colombier #define jpeg_stream_data_common\
497dd7cddfSDavid du Colombier 		/* We put a copy of the stream template here, because */\
507dd7cddfSDavid du Colombier 		/* the minimum buffer sizes depend on the image parameters. */\
517dd7cddfSDavid du Colombier 	stream_template template;\
527dd7cddfSDavid du Colombier 	struct jpeg_error_mgr err;\
537dd7cddfSDavid du Colombier 	jmp_buf exit_jmpbuf;\
547dd7cddfSDavid du Colombier 	gs_memory_t *memory;	/* heap for library allocations */\
553ff48bf5SDavid du Colombier         jpeg_block_t *blocks;   /* ptr to allocated data block list */\
567dd7cddfSDavid du Colombier 		/* The following are documented in Adobe TN 5116. */\
577dd7cddfSDavid du Colombier 	int Picky;		/* 0 or 1 */\
587dd7cddfSDavid du Colombier 	int Relax		/* 0 or 1 */
593ff48bf5SDavid du Colombier 
607dd7cddfSDavid du Colombier typedef struct jpeg_stream_data_s {
617dd7cddfSDavid du Colombier     jpeg_stream_data_common;
627dd7cddfSDavid du Colombier } jpeg_stream_data;
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier /* Define initialization for the non-library part of the stream state. */
657dd7cddfSDavid du Colombier #define jpeg_stream_data_common_init(pdata)\
663ff48bf5SDavid du Colombier BEGIN\
673ff48bf5SDavid du Colombier   (pdata)->Picky = 0;\
683ff48bf5SDavid du Colombier   (pdata)->Relax = 0;\
693ff48bf5SDavid du Colombier   (pdata)->blocks = 0;\
703ff48bf5SDavid du Colombier END
717dd7cddfSDavid du Colombier 
727dd7cddfSDavid du Colombier typedef struct jpeg_compress_data_s {
737dd7cddfSDavid du Colombier     jpeg_stream_data_common;
747dd7cddfSDavid du Colombier     /* cinfo must immediately follow the common fields */
757dd7cddfSDavid du Colombier     struct jpeg_compress_struct cinfo;
767dd7cddfSDavid du Colombier     struct jpeg_destination_mgr destination;
777dd7cddfSDavid du Colombier     byte finish_compress_buf[100];
787dd7cddfSDavid du Colombier     int fcb_size, fcb_pos;
797dd7cddfSDavid du Colombier } jpeg_compress_data;
807dd7cddfSDavid du Colombier 
813ff48bf5SDavid du Colombier extern_st(st_jpeg_compress_data);
823ff48bf5SDavid du Colombier #define public_st_jpeg_compress_data()	/* in sdcte.c */\
833ff48bf5SDavid du Colombier   gs_public_st_ptrs1(st_jpeg_compress_data, jpeg_compress_data,\
843ff48bf5SDavid du Colombier     "JPEG compress data", jpeg_compress_data_enum_ptrs, jpeg_compress_data_reloc_ptrs, blocks)
853ff48bf5SDavid du Colombier 
867dd7cddfSDavid du Colombier typedef struct jpeg_decompress_data_s {
877dd7cddfSDavid du Colombier     jpeg_stream_data_common;
887dd7cddfSDavid du Colombier     /* dinfo must immediately follow the common fields, */
897dd7cddfSDavid du Colombier     /* so that it has same offset as cinfo. */
907dd7cddfSDavid du Colombier     struct jpeg_decompress_struct dinfo;
917dd7cddfSDavid du Colombier     struct jpeg_source_mgr source;
927dd7cddfSDavid du Colombier     long skip;			/* # of bytes remaining to skip in input */
937dd7cddfSDavid du Colombier     bool input_eod;		/* true when no more input data available */
947dd7cddfSDavid du Colombier     bool faked_eoi;		/* true when fill_input_buffer inserted EOI */
957dd7cddfSDavid du Colombier     byte *scanline_buffer;	/* buffer for oversize scanline, or NULL */
967dd7cddfSDavid du Colombier     uint bytes_in_scanline;	/* # of bytes remaining to output from same */
977dd7cddfSDavid du Colombier } jpeg_decompress_data;
987dd7cddfSDavid du Colombier 
993ff48bf5SDavid du Colombier #define private_st_jpeg_decompress_data()	/* in zfdctd.c */\
1003ff48bf5SDavid du Colombier   gs_private_st_ptrs2(st_jpeg_decompress_data, jpeg_decompress_data,\
1013ff48bf5SDavid du Colombier     "JPEG decompress data", jpeg_decompress_data_enum_ptrs,\
1023ff48bf5SDavid du Colombier     jpeg_decompress_data_reloc_ptrs, blocks, scanline_buffer)
1033ff48bf5SDavid du Colombier 
1047dd7cddfSDavid du Colombier /* The stream state itself.  This is kept in garbage-collectable memory. */
1057dd7cddfSDavid du Colombier typedef struct stream_DCT_state_s {
1067dd7cddfSDavid du Colombier     stream_state_common;
1077dd7cddfSDavid du Colombier     /* The following are set before initialization. */
1087dd7cddfSDavid du Colombier     /* Note that most JPEG parameters go straight into */
1097dd7cddfSDavid du Colombier     /* the IJG data structures, not into this struct. */
1107dd7cddfSDavid du Colombier     gs_const_string Markers;	/* NULL if no Markers parameter */
1117dd7cddfSDavid du Colombier     float QFactor;
1127dd7cddfSDavid du Colombier     int ColorTransform;		/* -1 if not specified */
1137dd7cddfSDavid du Colombier     bool NoMarker;		/* DCTEncode only */
1147dd7cddfSDavid du Colombier     gs_memory_t *jpeg_memory;	/* heap for library allocations */
1157dd7cddfSDavid du Colombier     /* This is a pointer to immovable storage. */
1167dd7cddfSDavid du Colombier     union _jd {
1177dd7cddfSDavid du Colombier 	jpeg_stream_data *common;
1187dd7cddfSDavid du Colombier 	jpeg_compress_data *compress;
1197dd7cddfSDavid du Colombier 	jpeg_decompress_data *decompress;
1207dd7cddfSDavid du Colombier     } data;
1217dd7cddfSDavid du Colombier     /* DCTEncode sets this before initialization;
1227dd7cddfSDavid du Colombier      * DCTDecode cannot set it until the JPEG headers are read.
1237dd7cddfSDavid du Colombier      */
1247dd7cddfSDavid du Colombier     uint scan_line_size;
1257dd7cddfSDavid du Colombier     /* The following are updated dynamically. */
1267dd7cddfSDavid du Colombier     int phase;
1277dd7cddfSDavid du Colombier } stream_DCT_state;
1287dd7cddfSDavid du Colombier 
1297dd7cddfSDavid du Colombier /* The state descriptor is public only to allow us to split up */
1307dd7cddfSDavid du Colombier /* the encoding and decoding filters. */
1317dd7cddfSDavid du Colombier extern_st(st_DCT_state);
1327dd7cddfSDavid du Colombier #define public_st_DCT_state()	/* in sdctc.c */\
1333ff48bf5SDavid du Colombier   gs_public_st_const_strings1_ptrs1(st_DCT_state, stream_DCT_state,\
1343ff48bf5SDavid du Colombier     "DCTEncode/Decode state", dct_enum_ptrs, dct_reloc_ptrs, Markers, data.common)
1357dd7cddfSDavid du Colombier /*
1367dd7cddfSDavid du Colombier  * NOTE: the client *must* invoke the set_defaults procedure in the
1377dd7cddfSDavid du Colombier  * template before calling the init procedure.
1387dd7cddfSDavid du Colombier  */
1397dd7cddfSDavid du Colombier extern const stream_template s_DCTD_template;
1407dd7cddfSDavid du Colombier extern const stream_template s_DCTE_template;
1417dd7cddfSDavid du Colombier 
1427dd7cddfSDavid du Colombier /* Define an internal procedure for setting stream defaults. */
1437dd7cddfSDavid du Colombier /* Clients do not call this. */
144*593dc095SDavid du Colombier void s_DCT_set_defaults(stream_state * st);
1457dd7cddfSDavid du Colombier 
1467dd7cddfSDavid du Colombier #endif /* sdct_INCLUDED */
147