xref: /plan9-contrib/sys/src/cmd/gs/src/sjpege.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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