1
/* Copyright (C) 2001-2006 Artifex Software, Inc.
4
This software is provided AS-IS with no warranty, either express or
7
This software is distributed under license and may not be copied, modified
8
or distributed except as expressly authorized under the terms of that
9
license. Refer to licensing information at http://www.artifex.com/
10
or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
11
San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
14
/* $Id: sjpegc.c 8250 2007-09-25 13:31:24Z giles $ */
15
/* Interface routines for IJG code, common to encode/decode. */
27
Ghostscript uses a non-public interface to libjpeg in order to
28
override the library's default memory manager implementation.
29
Since many users will want to compile Ghostscript using the
30
shared jpeg library, we provide these prototypes so that a copy
31
of the libjpeg source distribution is not needed.
33
The presence of the jmemsys.h header file is detected in
34
unix-aux.mak, and written to gconfig_.h
38
#ifdef DONT_HAVE_JMEMSYS_H
41
jpeg_get_small(j_common_ptr cinfo, size_t size);
44
jpeg_free_small(j_common_ptr cinfo, void *object, size_t size);
47
jpeg_get_large(j_common_ptr cinfo, size_t size);
50
jpeg_free_large(j_common_ptr cinfo, void FAR * object, size_t size);
51
typedef void *backing_store_ptr;
54
jpeg_mem_available(j_common_ptr cinfo, long min_bytes_needed,
55
long max_bytes_needed, long already_allocated);
58
jpeg_open_backing_store(j_common_ptr cinfo, backing_store_ptr info,
59
long total_bytes_needed);
62
jpeg_mem_init(j_common_ptr cinfo);
65
jpeg_mem_term(j_common_ptr cinfo);
68
#include "jmemsys.h" /* for prototypes */
71
private_st_jpeg_block();
74
* Error handling routines (these replace corresponding IJG routines from
75
* jpeg/jerror.c). These are used for both compression and decompression.
77
* offset_of(jpeg_compress_data, cinfo)==offset_of(jpeg_decompress_data, dinfo)
81
gs_jpeg_error_exit(j_common_ptr cinfo)
83
jpeg_stream_data *jcomdp =
84
(jpeg_stream_data *) ((char *)cinfo -
85
offset_of(jpeg_compress_data, cinfo));
87
longjmp(find_jmp_buf(jcomdp->exit_jmpbuf), 1);
91
gs_jpeg_emit_message(j_common_ptr cinfo, int msg_level)
93
if (msg_level < 0) { /* GS policy is to ignore IJG warnings when Picky=0,
94
* treat them as errors when Picky=1.
96
jpeg_stream_data *jcomdp =
97
(jpeg_stream_data *) ((char *)cinfo -
98
offset_of(jpeg_compress_data, cinfo));
101
gs_jpeg_error_exit(cinfo);
103
/* Trace messages are always ignored. */
107
* This routine initializes the error manager fields in the JPEG object.
108
* It is based on jpeg_std_error from jpeg/jerror.c.
112
gs_jpeg_error_setup(stream_DCT_state * st)
114
struct jpeg_error_mgr *err = &st->data.common->err;
116
/* Initialize the JPEG compression object with default error handling */
119
/* Replace some methods with our own versions */
120
err->error_exit = gs_jpeg_error_exit;
121
err->emit_message = gs_jpeg_emit_message;
123
st->data.compress->cinfo.err = err; /* works for decompress case too */
126
/* Stuff the IJG error message into errorinfo after an error exit. */
129
gs_jpeg_log_error(stream_DCT_state * st)
131
j_common_ptr cinfo = (j_common_ptr) & st->data.compress->cinfo;
132
char buffer[JMSG_LENGTH_MAX];
134
/* Format the error message */
135
(*cinfo->err->format_message) (cinfo, buffer);
136
(*st->report_error) ((stream_state *) st, buffer);
137
return gs_error_ioerror; /* caller will do return_error() */
142
* Interface routines. This layer of routines exists solely to limit
143
* side-effects from using setjmp.
148
gs_jpeg_alloc_quant_table(stream_DCT_state * st)
150
if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf))) {
151
gs_jpeg_log_error(st);
154
return jpeg_alloc_quant_table((j_common_ptr)
155
& st->data.compress->cinfo);
159
gs_jpeg_alloc_huff_table(stream_DCT_state * st)
161
if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf))) {
162
gs_jpeg_log_error(st);
165
return jpeg_alloc_huff_table((j_common_ptr)
166
& st->data.compress->cinfo);
170
gs_jpeg_destroy(stream_DCT_state * st)
172
if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
173
return_error(gs_jpeg_log_error(st));
174
jpeg_destroy((j_common_ptr) & st->data.compress->cinfo);
180
* These routines replace the low-level memory manager of the IJG library.
181
* They pass malloc/free calls to the Ghostscript memory manager.
182
* Note we do not need these to be declared in any GS header file.
185
static inline jpeg_compress_data *
186
cinfo2jcd(j_common_ptr cinfo)
187
{ /* We use the offset of cinfo in jpeg_compress data here, but we */
188
/* could equally well have used jpeg_decompress_data. */
189
return (jpeg_compress_data *)
190
((byte *)cinfo - offset_of(jpeg_compress_data, cinfo));
194
jpeg_alloc(j_common_ptr cinfo, size_t size, const char *info)
196
jpeg_compress_data *jcd = cinfo2jcd(cinfo);
197
gs_memory_t *mem = jcd->memory;
199
jpeg_block_t *p = gs_alloc_struct_immovable(mem, jpeg_block_t,
200
&st_jpeg_block, "jpeg_alloc(block)");
201
void *data = gs_alloc_bytes_immovable(mem, size, info);
203
if (p == 0 || data == 0) {
204
gs_free_object(mem, data, info);
205
gs_free_object(mem, p, "jpeg_alloc(block)");
209
p->next = jcd->blocks;
215
jpeg_free(j_common_ptr cinfo, void *data, const char *info)
217
jpeg_compress_data *jcd = cinfo2jcd(cinfo);
218
gs_memory_t *mem = jcd->memory;
219
jpeg_block_t *p = jcd->blocks;
220
jpeg_block_t **pp = &jcd->blocks;
222
gs_free_object(mem, data, info);
223
while(p && p->data != data)
228
lprintf1("Freeing unrecorded JPEG data 0x%lx!\n", (ulong)data);
231
gs_free_object(mem, p, "jpeg_free(block)");
235
jpeg_get_small(j_common_ptr cinfo, size_t size)
237
return jpeg_alloc(cinfo, size, "JPEG small internal data allocation");
241
jpeg_free_small(j_common_ptr cinfo, void *object, size_t size)
243
jpeg_free(cinfo, object, "Freeing JPEG small internal data");
247
jpeg_get_large(j_common_ptr cinfo, size_t size)
249
return jpeg_alloc(cinfo, size, "JPEG large internal data allocation");
253
jpeg_free_large(j_common_ptr cinfo, void FAR * object, size_t size)
255
jpeg_free(cinfo, object, "Freeing JPEG large internal data");
259
jpeg_mem_available(j_common_ptr cinfo, long min_bytes_needed,
260
long max_bytes_needed, long already_allocated)
262
return max_bytes_needed;
266
jpeg_open_backing_store(j_common_ptr cinfo, backing_store_ptr info,
267
long total_bytes_needed)
269
ERREXIT(cinfo, JERR_NO_BACKING_STORE);
273
jpeg_mem_init(j_common_ptr cinfo)
275
return 0; /* just set max_memory_to_use to 0 */
279
jpeg_mem_term(j_common_ptr cinfo)