1
/* Copyright (C) 2001-2006 Artifex Software, Inc.
4
This software is provided AS-IS with no warranty, either express or
7
This software is distributed under license and may not be copied, modified
8
or distributed except as expressly authorized under the terms of that
9
license. Refer to licensing information at http://www.artifex.com/
10
or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
11
San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
14
/* $Id: zfdcte.c 8250 2007-09-25 13:31:24Z giles $ */
15
/* DCTEncode filter creation */
17
#include "stdio_.h" /* for jpeglib.h */
32
/* Import the parameter processing procedure from sdeparam.c */
33
stream_state_proc_put_params(s_DCTE_put_params, stream_DCT_state);
35
stream_state_proc_get_params(s_DCTE_get_params, stream_DCT_state);
38
/* <target> <dict> DCTEncode/filter <file> */
40
zDCTE(i_ctx_t *i_ctx_p)
43
gs_memory_t *mem = gs_memory_stable(imemory);
44
stream_DCT_state state;
46
jpeg_compress_data *jcdp;
51
/* First allocate space for IJG parameters. */
52
jcdp = gs_alloc_struct_immovable(mem, jpeg_compress_data,
53
&st_jpeg_compress_data, "zDCTE");
55
return_error(e_VMerror);
56
if (s_DCTE_template.set_defaults)
57
(*s_DCTE_template.set_defaults) ((stream_state *) & state);
58
state.data.compress = jcdp;
59
jcdp->memory = state.jpeg_memory = mem; /* set now for allocation */
60
state.report_error = filter_report_error; /* in case create fails */
61
if ((code = gs_jpeg_create_compress(&state)) < 0)
62
goto fail; /* correct to do jpeg_destroy here */
63
/* Read parameters from dictionary */
64
if (r_has_type(op, t_dictionary))
65
dop = op, dspace = r_space(op);
68
if ((code = dict_param_list_read(&list, dop, NULL, false, iimemory)) < 0)
70
if ((code = s_DCTE_put_params((gs_param_list *) & list, &state)) < 0)
72
/* Create the filter. */
73
jcdp->template = s_DCTE_template;
74
/* Make sure we get at least a full scan line of input. */
75
state.scan_line_size = jcdp->cinfo.input_components *
76
jcdp->cinfo.image_width;
77
jcdp->template.min_in_size =
78
max(s_DCTE_template.min_in_size, state.scan_line_size);
79
/* Make sure we can write the user markers in a single go. */
80
jcdp->template.min_out_size =
81
max(s_DCTE_template.min_out_size, state.Markers.size);
82
code = filter_write(i_ctx_p, 0, &jcdp->template,
83
(stream_state *) & state, dspace);
84
if (code >= 0) /* Success! */
86
/* We assume that if filter_write fails, the stream has not been
87
* registered for closing, so s_DCTE_release will never be called.
88
* Therefore we free the allocated memory before failing.
91
iparam_list_release(&list);
93
gs_jpeg_destroy(&state);
94
gs_free_object(mem, jcdp, "zDCTE fail");
101
/* <dict> <filter> <bool> .dcteparams <dict> */
103
zdcteparams(i_ctx_t *i_ctx_p)
107
dict_param_list list;
110
check_type(*op, t_boolean);
111
check_write_file(s, op - 1);
112
check_type(op[-2], t_dictionary);
113
/* The DCT filters copy the template.... */
114
if (s->state->template->process != s_DCTE_template.process)
115
return_error(e_rangecheck);
116
code = dict_param_list_write(&list, op - 2, NULL, iimemory);
119
code = s_DCTE_get_params((gs_param_list *) & list,
120
(stream_DCT_state *) s->state,
122
iparam_list_release(&list);
129
/* ------ Initialization procedure ------ */
131
const op_def zfdcte_op_defs[] =
134
{"3.dcteparams", zdcteparams},
136
op_def_begin_filter(),
137
{"2DCTEncode", zDCTE},