71
71
for (i = 0; i < num_colors; ++i)
72
write |= (samples[i] = (is_vert ? comp_info[i].v_samp_factor :
73
comp_info[i].h_samp_factor)) != 1;
72
write |= (samples[i] = (is_vert ? comp_info[i].v_samp_factor :
73
comp_info[i].h_samp_factor)) != 1;
75
int *data = (int *)gs_alloc_byte_array(mem, num_colors, sizeof(int),
77
gs_param_int_array sa;
75
int *data = (int *)gs_alloc_byte_array(mem, num_colors, sizeof(int),
77
gs_param_int_array sa;
80
return_error(gs_error_VMerror);
84
memcpy(data, samples, num_colors * sizeof(samples[0]));
85
return param_write_int_array(plist, key, &sa);
80
return_error(gs_error_VMerror);
84
memcpy(data, samples, num_colors * sizeof(samples[0]));
85
return param_write_int_array(plist, key, &sa);
101
jpeg_compress_data *jcdp_default = gs_alloc_struct_immovable(mem,
101
jpeg_compress_data *jcdp_default = gs_alloc_struct_immovable(mem,
102
102
jpeg_compress_data, &st_jpeg_compress_data, "s_DCTE_get_params");
103
if (jcdp_default == 0)
104
return_error(gs_error_VMerror);
105
defaults = &dcts_defaults;
106
(*s_DCTE_template.set_defaults) ((stream_state *) & dcts_defaults);
107
dcts_defaults.data.compress = jcdp_default;
108
jcdp_default->memory = dcts_defaults.jpeg_memory = mem;
109
if ((code = gs_jpeg_create_compress(&dcts_defaults)) < 0)
110
goto fail; /* correct to do jpeg_destroy here */
103
if (jcdp_default == 0)
104
return_error(gs_error_VMerror);
105
defaults = &dcts_defaults;
106
(*s_DCTE_template.set_defaults) ((stream_state *) & dcts_defaults);
107
dcts_defaults.data.compress = jcdp_default;
108
jcdp_default->memory = dcts_defaults.jpeg_memory = mem;
109
if ((code = gs_jpeg_create_compress(&dcts_defaults)) < 0)
110
goto fail; /* correct to do jpeg_destroy here */
111
111
/****** SET DEFAULTS HERE ******/
112
dcts_defaults.data.common->Picky = 0;
113
dcts_defaults.data.common->Relax = 0;
112
dcts_defaults.data.common->Picky = 0;
113
dcts_defaults.data.common->Relax = 0;
115
115
params.Columns = jcdp->cinfo.image_width;
116
116
params.Rows = jcdp->cinfo.image_height;
122
122
params.Resync = jcdp->cinfo.restart_interval;
123
123
/* What about Blend?? */
124
124
if ((code = s_DCT_get_params(plist, ss, defaults)) < 0 ||
125
(code = gs_param_write_items(plist, ¶ms,
126
&dcte_scalars_default,
127
s_DCTE_param_items)) < 0 ||
128
(code = dcte_get_samples(plist, "HSamples", params.Colors,
129
jcdp, mem, false, all)) < 0 ||
130
(code = dcte_get_samples(plist, "VSamples", params.Colors,
131
jcdp, mem, true, all)) < 0 ||
125
(code = gs_param_write_items(plist, ¶ms,
126
&dcte_scalars_default,
127
s_DCTE_param_items)) < 0 ||
128
(code = dcte_get_samples(plist, "HSamples", params.Colors,
129
jcdp, mem, false, all)) < 0 ||
130
(code = dcte_get_samples(plist, "VSamples", params.Colors,
131
jcdp, mem, true, all)) < 0 ||
132
132
(code = s_DCT_get_quantization_tables(plist, ss, defaults, true)) < 0 ||
133
(code = s_DCT_get_huffman_tables(plist, ss, defaults, true)) < 0
133
(code = s_DCT_get_huffman_tables(plist, ss, defaults, true)) < 0
136
136
/****** NYI ******/
137
137
fail:if (defaults) {
138
gs_jpeg_destroy(&dcts_defaults);
139
gs_free_object(mem, dcts_defaults.data.compress,
140
"s_DCTE_get_params");
138
gs_jpeg_destroy(&dcts_defaults);
139
gs_free_object(mem, dcts_defaults.data.compress,
140
"s_DCTE_get_params");
198
198
code = gs_param_read_items(plist, ¶ms, s_DCTE_param_items);
201
201
if (params.Columns <= 0 || params.Columns > 0xffff ||
202
params.Rows <= 0 || params.Rows > 0xffff ||
203
params.Colors <= 0 || params.Colors == 2 || params.Colors > 4 ||
204
params.Resync < 0 || params.Resync > 0xffff ||
205
params.Blend < 0 || params.Blend > 1
207
return_error(gs_error_rangecheck);
202
params.Rows <= 0 || params.Rows > 0xffff ||
203
params.Colors <= 0 || params.Colors == 2 || params.Colors > 4 ||
204
params.Resync < 0 || params.Resync > 0xffff ||
205
params.Blend < 0 || params.Blend > 1
207
return_error(gs_error_rangecheck);
210
210
if ((code = s_DCT_put_params(plist, pdct)) < 0)
212
212
/* Set up minimal image description & call set_defaults */
213
213
jcdp->cinfo.image_width = params.Columns;
214
214
jcdp->cinfo.image_height = params.Rows;
215
215
jcdp->cinfo.input_components = params.Colors;
216
216
switch (params.Colors) {
218
jcdp->cinfo.in_color_space = JCS_GRAYSCALE;
221
jcdp->cinfo.in_color_space = JCS_RGB;
224
jcdp->cinfo.in_color_space = JCS_CMYK;
227
jcdp->cinfo.in_color_space = JCS_UNKNOWN;
218
jcdp->cinfo.in_color_space = JCS_GRAYSCALE;
221
jcdp->cinfo.in_color_space = JCS_RGB;
224
jcdp->cinfo.in_color_space = JCS_CMYK;
227
jcdp->cinfo.in_color_space = JCS_UNKNOWN;
229
229
if ((code = gs_jpeg_set_defaults(pdct)) < 0)
231
231
if ((code = s_DCT_put_huffman_tables(plist, pdct, true)) < 0)
233
233
switch ((code = s_DCT_put_quantization_tables(plist, pdct, true))) {
239
/* No QuantTables, but maybe a QFactor to apply to default. */
240
if (pdct->QFactor != 1.0) {
241
code = gs_jpeg_set_linear_quality(pdct,
242
(int)(min(pdct->QFactor, 100.0)
239
/* No QuantTables, but maybe a QFactor to apply to default. */
240
if (pdct->QFactor != 1.0) {
241
code = gs_jpeg_set_linear_quality(pdct,
242
(int)(min(pdct->QFactor, 100.0)
249
249
/* Change IJG colorspace defaults as needed;
250
250
* set ColorTransform to what will go in the Adobe marker.
252
252
switch (params.Colors) {
254
if (pdct->ColorTransform < 0)
255
pdct->ColorTransform = 1; /* default */
256
if (pdct->ColorTransform == 0) {
257
if ((code = gs_jpeg_set_colorspace(pdct, JCS_RGB)) < 0)
260
pdct->ColorTransform = 1; /* flag YCC xform */
263
if (pdct->ColorTransform < 0)
264
pdct->ColorTransform = 0; /* default */
265
if (pdct->ColorTransform != 0) {
266
if ((code = gs_jpeg_set_colorspace(pdct, JCS_YCCK)) < 0)
268
pdct->ColorTransform = 2; /* flag YCCK xform */
270
if ((code = gs_jpeg_set_colorspace(pdct, JCS_CMYK)) < 0)
275
pdct->ColorTransform = 0; /* no transform otherwise */
254
if (pdct->ColorTransform < 0)
255
pdct->ColorTransform = 1; /* default */
256
if (pdct->ColorTransform == 0) {
257
if ((code = gs_jpeg_set_colorspace(pdct, JCS_RGB)) < 0)
260
pdct->ColorTransform = 1; /* flag YCC xform */
263
if (pdct->ColorTransform < 0)
264
pdct->ColorTransform = 0; /* default */
265
if (pdct->ColorTransform != 0) {
266
if ((code = gs_jpeg_set_colorspace(pdct, JCS_YCCK)) < 0)
268
pdct->ColorTransform = 2; /* flag YCCK xform */
270
if ((code = gs_jpeg_set_colorspace(pdct, JCS_CMYK)) < 0)
275
pdct->ColorTransform = 0; /* no transform otherwise */
278
278
/* Optional encoding-only parameters */
279
279
pdct->Markers.data = params.Markers.data;
280
280
pdct->Markers.size = params.Markers.size;
281
281
pdct->NoMarker = params.NoMarker;
282
282
if ((code = dcte_put_samples(plist, "HSamples", params.Colors,
284
(code = dcte_put_samples(plist, "VSamples", params.Colors,
284
(code = dcte_put_samples(plist, "VSamples", params.Colors,
288
288
jcdp->cinfo.write_JFIF_header = FALSE;
289
289
jcdp->cinfo.write_Adobe_marker = FALSE; /* must do it myself */
290
290
jcdp->cinfo.restart_interval = params.Resync;
291
291
/* What to do with Blend ??? */
292
292
if (pdct->data.common->Relax == 0) {
293
jpeg_component_info *comp_info = jcdp->cinfo.comp_info;
293
jpeg_component_info *comp_info = jcdp->cinfo.comp_info;
296
for (i = 0, num_samples = 0; i < params.Colors; i++)
297
num_samples += comp_info[i].h_samp_factor *
298
comp_info[i].v_samp_factor;
299
if (num_samples > 10)
300
return_error(gs_error_rangecheck);
302
* Note: by default the IJG software does not allow
303
* num_samples to exceed 10, Relax or no. For full
304
* compatibility with Adobe's non-JPEG-compliant
305
* software, set MAX_BLOCKS_IN_MCU to 64 in jpeglib.h.
296
for (i = 0, num_samples = 0; i < params.Colors; i++)
297
num_samples += comp_info[i].h_samp_factor *
298
comp_info[i].v_samp_factor;
299
if (num_samples > 10)
300
return_error(gs_error_rangecheck);
302
* Note: by default the IJG software does not allow
303
* num_samples to exceed 10, Relax or no. For full
304
* compatibility with Adobe's non-JPEG-compliant
305
* software, set MAX_BLOCKS_IN_MCU to 64 in jpeglib.h.