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