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