1 /* Copyright (C) 2001-2012 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied,
8    modified or distributed except as expressly authorized under the terms
9    of the license contained in the file LICENSE in this distribution.
10 
11    Refer to licensing information at http://www.artifex.com or contact
12    Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134, San Rafael,
13    CA  94903, U.S.A., +1(415)492-9861, for further information.
14 */
15 
16 
17 /* Interface routines for IJG encoding code. */
18 #include "stdio_.h"
19 #include "string_.h"
20 #include "jpeglib_.h"
21 #include "jerror_.h"
22 #include "gx.h"
23 #include "strimpl.h"
24 #include "sdct.h"
25 #include "sjpeg.h"
26 
27 /*
28  * Interface routines.  This layer of routines exists solely to limit
29  * side-effects from using setjmp.
30  */
31 
32 int
gs_jpeg_create_compress(stream_DCT_state * st)33 gs_jpeg_create_compress(stream_DCT_state * st)
34 {				/* Initialize error handling */
35     gs_jpeg_error_setup(st);
36     /* Establish the setjmp return context for gs_jpeg_error_exit to use. */
37     if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
38         return_error(gs_jpeg_log_error(st));
39 
40     jpeg_stream_data_common_init(st->data.compress);
41     jpeg_create_compress(&st->data.compress->cinfo);
42     return 0;
43 }
44 
45 int
gs_jpeg_set_defaults(stream_DCT_state * st)46 gs_jpeg_set_defaults(stream_DCT_state * st)
47 {
48     if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
49         return_error(gs_jpeg_log_error(st));
50     jpeg_set_defaults(&st->data.compress->cinfo);
51     return 0;
52 }
53 
54 int
gs_jpeg_set_colorspace(stream_DCT_state * st,J_COLOR_SPACE colorspace)55 gs_jpeg_set_colorspace(stream_DCT_state * st,
56                        J_COLOR_SPACE colorspace)
57 {
58     if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
59         return_error(gs_jpeg_log_error(st));
60     jpeg_set_colorspace(&st->data.compress->cinfo, colorspace);
61     return 0;
62 }
63 
64 int
gs_jpeg_set_linear_quality(stream_DCT_state * st,int scale_factor,boolean force_baseline)65 gs_jpeg_set_linear_quality(stream_DCT_state * st,
66                            int scale_factor, boolean force_baseline)
67 {
68     if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
69         return_error(gs_jpeg_log_error(st));
70     jpeg_set_linear_quality(&st->data.compress->cinfo,
71                             scale_factor, force_baseline);
72     return 0;
73 }
74 
75 int
gs_jpeg_set_quality(stream_DCT_state * st,int quality,boolean force_baseline)76 gs_jpeg_set_quality(stream_DCT_state * st,
77                     int quality, boolean force_baseline)
78 {
79     if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
80         return_error(gs_jpeg_log_error(st));
81     jpeg_set_quality(&st->data.compress->cinfo,
82                      quality, force_baseline);
83     return 0;
84 }
85 
86 int
gs_jpeg_start_compress(stream_DCT_state * st,boolean write_all_tables)87 gs_jpeg_start_compress(stream_DCT_state * st,
88                        boolean write_all_tables)
89 {
90     if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
91         return_error(gs_jpeg_log_error(st));
92     jpeg_start_compress(&st->data.compress->cinfo, write_all_tables);
93     return 0;
94 }
95 
96 int
gs_jpeg_write_scanlines(stream_DCT_state * st,JSAMPARRAY scanlines,int num_lines)97 gs_jpeg_write_scanlines(stream_DCT_state * st,
98                         JSAMPARRAY scanlines,
99                         int num_lines)
100 {
101     if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
102         return_error(gs_jpeg_log_error(st));
103     return (int)jpeg_write_scanlines(&st->data.compress->cinfo,
104                                      scanlines, (JDIMENSION) num_lines);
105 }
106 
107 int
gs_jpeg_finish_compress(stream_DCT_state * st)108 gs_jpeg_finish_compress(stream_DCT_state * st)
109 {
110     if (setjmp(find_jmp_buf(st->data.common->exit_jmpbuf)))
111         return_error(gs_jpeg_log_error(st));
112     jpeg_finish_compress(&st->data.compress->cinfo);
113     return 0;
114 }
115