17dd7cddfSDavid du Colombier /* Copyright (C) 1994, 1998, 1999 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: sjpege.c,v 1.5 2002/02/21 22:24:54 giles Exp $ */
187dd7cddfSDavid du Colombier /* Interface routines for IJG encoding code. */
197dd7cddfSDavid du Colombier #include "stdio_.h"
207dd7cddfSDavid du Colombier #include "string_.h"
217dd7cddfSDavid du Colombier #include "jpeglib_.h"
227dd7cddfSDavid du Colombier #include "jerror_.h"
237dd7cddfSDavid du Colombier #include "gx.h"
247dd7cddfSDavid du Colombier #include "gserrors.h"
257dd7cddfSDavid du Colombier #include "strimpl.h"
267dd7cddfSDavid du Colombier #include "sdct.h"
277dd7cddfSDavid du Colombier #include "sjpeg.h"
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier /*
307dd7cddfSDavid du Colombier * Interface routines. This layer of routines exists solely to limit
317dd7cddfSDavid du Colombier * side-effects from using setjmp.
327dd7cddfSDavid du Colombier */
337dd7cddfSDavid du Colombier
347dd7cddfSDavid du Colombier int
gs_jpeg_create_compress(stream_DCT_state * st)357dd7cddfSDavid du Colombier gs_jpeg_create_compress(stream_DCT_state * st)
367dd7cddfSDavid du Colombier { /* Initialize error handling */
377dd7cddfSDavid du Colombier gs_jpeg_error_setup(st);
387dd7cddfSDavid du Colombier /* Establish the setjmp return context for gs_jpeg_error_exit to use. */
397dd7cddfSDavid du Colombier if (setjmp(st->data.common->exit_jmpbuf))
407dd7cddfSDavid du Colombier return_error(gs_jpeg_log_error(st));
417dd7cddfSDavid du Colombier
427dd7cddfSDavid du Colombier jpeg_stream_data_common_init(st->data.compress);
433ff48bf5SDavid du Colombier jpeg_create_compress(&st->data.compress->cinfo);
447dd7cddfSDavid du Colombier return 0;
457dd7cddfSDavid du Colombier }
467dd7cddfSDavid du Colombier
477dd7cddfSDavid du Colombier int
gs_jpeg_set_defaults(stream_DCT_state * st)487dd7cddfSDavid du Colombier gs_jpeg_set_defaults(stream_DCT_state * st)
497dd7cddfSDavid du Colombier {
507dd7cddfSDavid du Colombier if (setjmp(st->data.common->exit_jmpbuf))
517dd7cddfSDavid du Colombier return_error(gs_jpeg_log_error(st));
527dd7cddfSDavid du Colombier jpeg_set_defaults(&st->data.compress->cinfo);
537dd7cddfSDavid du Colombier return 0;
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier int
gs_jpeg_set_colorspace(stream_DCT_state * st,J_COLOR_SPACE colorspace)577dd7cddfSDavid du Colombier gs_jpeg_set_colorspace(stream_DCT_state * st,
587dd7cddfSDavid du Colombier J_COLOR_SPACE colorspace)
597dd7cddfSDavid du Colombier {
607dd7cddfSDavid du Colombier if (setjmp(st->data.common->exit_jmpbuf))
617dd7cddfSDavid du Colombier return_error(gs_jpeg_log_error(st));
627dd7cddfSDavid du Colombier jpeg_set_colorspace(&st->data.compress->cinfo, colorspace);
637dd7cddfSDavid du Colombier return 0;
647dd7cddfSDavid du Colombier }
657dd7cddfSDavid du Colombier
667dd7cddfSDavid du Colombier int
gs_jpeg_set_linear_quality(stream_DCT_state * st,int scale_factor,boolean force_baseline)677dd7cddfSDavid du Colombier gs_jpeg_set_linear_quality(stream_DCT_state * st,
687dd7cddfSDavid du Colombier int scale_factor, boolean force_baseline)
697dd7cddfSDavid du Colombier {
707dd7cddfSDavid du Colombier if (setjmp(st->data.common->exit_jmpbuf))
717dd7cddfSDavid du Colombier return_error(gs_jpeg_log_error(st));
727dd7cddfSDavid du Colombier jpeg_set_linear_quality(&st->data.compress->cinfo,
737dd7cddfSDavid du Colombier scale_factor, force_baseline);
747dd7cddfSDavid du Colombier return 0;
757dd7cddfSDavid du Colombier }
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier int
gs_jpeg_set_quality(stream_DCT_state * st,int quality,boolean force_baseline)787dd7cddfSDavid du Colombier gs_jpeg_set_quality(stream_DCT_state * st,
797dd7cddfSDavid du Colombier int quality, boolean force_baseline)
807dd7cddfSDavid du Colombier {
817dd7cddfSDavid du Colombier if (setjmp(st->data.common->exit_jmpbuf))
827dd7cddfSDavid du Colombier return_error(gs_jpeg_log_error(st));
837dd7cddfSDavid du Colombier jpeg_set_quality(&st->data.compress->cinfo,
847dd7cddfSDavid du Colombier quality, force_baseline);
857dd7cddfSDavid du Colombier return 0;
867dd7cddfSDavid du Colombier }
877dd7cddfSDavid du Colombier
887dd7cddfSDavid du Colombier int
gs_jpeg_start_compress(stream_DCT_state * st,boolean write_all_tables)897dd7cddfSDavid du Colombier gs_jpeg_start_compress(stream_DCT_state * st,
907dd7cddfSDavid du Colombier boolean write_all_tables)
917dd7cddfSDavid du Colombier {
927dd7cddfSDavid du Colombier if (setjmp(st->data.common->exit_jmpbuf))
937dd7cddfSDavid du Colombier return_error(gs_jpeg_log_error(st));
947dd7cddfSDavid du Colombier jpeg_start_compress(&st->data.compress->cinfo, write_all_tables);
957dd7cddfSDavid du Colombier return 0;
967dd7cddfSDavid du Colombier }
977dd7cddfSDavid du Colombier
987dd7cddfSDavid du Colombier int
gs_jpeg_write_scanlines(stream_DCT_state * st,JSAMPARRAY scanlines,int num_lines)997dd7cddfSDavid du Colombier gs_jpeg_write_scanlines(stream_DCT_state * st,
1007dd7cddfSDavid du Colombier JSAMPARRAY scanlines,
1017dd7cddfSDavid du Colombier int num_lines)
1027dd7cddfSDavid du Colombier {
1037dd7cddfSDavid du Colombier if (setjmp(st->data.common->exit_jmpbuf))
1047dd7cddfSDavid du Colombier return_error(gs_jpeg_log_error(st));
1057dd7cddfSDavid du Colombier return (int)jpeg_write_scanlines(&st->data.compress->cinfo,
1067dd7cddfSDavid du Colombier scanlines, (JDIMENSION) num_lines);
1077dd7cddfSDavid du Colombier }
1087dd7cddfSDavid du Colombier
1097dd7cddfSDavid du Colombier int
gs_jpeg_finish_compress(stream_DCT_state * st)1107dd7cddfSDavid du Colombier gs_jpeg_finish_compress(stream_DCT_state * st)
1117dd7cddfSDavid du Colombier {
1127dd7cddfSDavid du Colombier if (setjmp(st->data.common->exit_jmpbuf))
1137dd7cddfSDavid du Colombier return_error(gs_jpeg_log_error(st));
1147dd7cddfSDavid du Colombier jpeg_finish_compress(&st->data.compress->cinfo);
1157dd7cddfSDavid du Colombier return 0;
1167dd7cddfSDavid du Colombier }
117