~ubuntu-branches/ubuntu/oneiric/ghostscript/oneiric

« back to all changes in this revision

Viewing changes to base/sdeparam.c

  • Committer: Bazaar Package Importer
  • Author(s): Till Kamppeter
  • Date: 2011-07-15 16:49:55 UTC
  • mfrom: (1.1.23 upstream)
  • Revision ID: james.westby@ubuntu.com-20110715164955-uga6qibao6kez05c
Tags: 9.04~dfsg~20110715-0ubuntu1
* New upstream release
   - GIT snapshot from Jult, 12 2011.
* debian/patches/020110406~a54df2d.patch,
  debian/patches/020110408~0791cc8.patch,
  debian/patches/020110408~507cbee.patch,
  debian/patches/020110411~4509a49.patch,
  debian/patches/020110412~78bb9a6.patch,
  debian/patches/020110418~a05ab8a.patch,
  debian/patches/020110420~20b6c78.patch,
  debian/patches/020110420~4ddefa2.patch: Removed upstream patches.
* debian/rules: Generate ABI version number (variable "abi") correctly,
  cutting off repackaging and pre-release parts.
* debian/rules: Added ./lcms2/ directory to DEB_UPSTREAM_REPACKAGE_EXCLUDES.
* debian/copyright: Added lcms2/* to the list of excluded files.
* debian/symbols.common: Updated for new upstream source. Applied patch
  which dpkg-gensymbols generated for debian/libgs9.symbols to this file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* Copyright (C) 2001-2006 Artifex Software, Inc.
2
2
   All Rights Reserved.
3
 
  
 
3
 
4
4
   This software is provided AS-IS with no warranty, either express or
5
5
   implied.
6
6
 
11
11
   San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12
12
*/
13
13
 
14
 
/* $Id: sdeparam.c 12003 2011-01-06 19:18:56Z alexcher $ */
 
14
/* $Id$ */
15
15
/* DCTEncode filter parameter setting and reading */
16
16
#include "memory_.h"
17
17
#include "jpeglib_.h"
69
69
    int i;
70
70
 
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;
74
74
    if (write) {
75
 
        int *data = (int *)gs_alloc_byte_array(mem, num_colors, sizeof(int),
76
 
                                               "dcte_get_samples");
77
 
        gs_param_int_array sa;
 
75
        int *data = (int *)gs_alloc_byte_array(mem, num_colors, sizeof(int),
 
76
                                               "dcte_get_samples");
 
77
        gs_param_int_array sa;
78
78
 
79
 
        if (data == 0)
80
 
            return_error(gs_error_VMerror);
81
 
        sa.data = data;
82
 
        sa.size = num_colors;
83
 
        sa.persistent = true;
84
 
        memcpy(data, samples, num_colors * sizeof(samples[0]));
85
 
        return param_write_int_array(plist, key, &sa);
 
79
        if (data == 0)
 
80
            return_error(gs_error_VMerror);
 
81
        sa.data = data;
 
82
        sa.size = num_colors;
 
83
        sa.persistent = true;
 
84
        memcpy(data, samples, num_colors * sizeof(samples[0]));
 
85
        return param_write_int_array(plist, key, &sa);
86
86
    }
87
87
    return 0;
88
88
}
98
98
    int code;
99
99
 
100
100
    if (!all) {
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;
114
114
    }
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, &params,
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, &params,
 
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
134
 
        )
135
 
        DO_NOTHING;
 
133
        (code = s_DCT_get_huffman_tables(plist, ss, defaults, true)) < 0
 
134
        )
 
135
        DO_NOTHING;
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");
141
141
    }
142
142
    return code;
143
143
}
149
149
/* Put a set of sampling values. */
150
150
static int
151
151
dcte_put_samples(gs_param_list * plist, gs_param_name key, int num_colors,
152
 
                 jpeg_compress_data * jcdp, bool is_vert)
 
152
                 jpeg_compress_data * jcdp, bool is_vert)
153
153
{
154
154
    int code;
155
155
    int i;
161
161
     * which is NOT the IJG default, so we must always assign values.
162
162
     */
163
163
    switch ((code = s_DCT_byte_params(plist, key, 0, num_colors,
164
 
                                      samples))
165
 
        ) {
166
 
        default:                /* error */
167
 
            return code;
168
 
        case 0:
169
 
            break;
170
 
        case 1:
171
 
            samples[0] = samples[1] = samples[2] = samples[3] = 1;
 
164
                                      samples))
 
165
        ) {
 
166
        default:                /* error */
 
167
            return code;
 
168
        case 0:
 
169
            break;
 
170
        case 1:
 
171
            samples[0] = samples[1] = samples[2] = samples[3] = 1;
172
172
    }
173
173
    for (i = 0; i < num_colors; i++) {
174
 
        if (samples[i] < 1 || samples[i] > 4)
175
 
            return_error(gs_error_rangecheck);
176
 
        if (is_vert)
177
 
            comp_info[i].v_samp_factor = samples[i];
178
 
        else
179
 
            comp_info[i].h_samp_factor = samples[i];
 
174
        if (samples[i] < 1 || samples[i] > 4)
 
175
            return_error(gs_error_rangecheck);
 
176
        if (is_vert)
 
177
            comp_info[i].v_samp_factor = samples[i];
 
178
        else
 
179
            comp_info[i].h_samp_factor = samples[i];
180
180
    }
181
181
    return 0;
182
182
}
197
197
     */
198
198
    code = gs_param_read_items(plist, &params, s_DCTE_param_items);
199
199
    if (code < 0)
200
 
        return code;
 
200
        return code;
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
206
 
        )
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
 
206
        )
 
207
        return_error(gs_error_rangecheck);
208
208
    jcdp->Picky = 0;
209
209
    jcdp->Relax = 0;
210
210
    if ((code = s_DCT_put_params(plist, pdct)) < 0)
211
 
        return code;
 
211
        return code;
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) {
217
 
        case 1:
218
 
            jcdp->cinfo.in_color_space = JCS_GRAYSCALE;
219
 
            break;
220
 
        case 3:
221
 
            jcdp->cinfo.in_color_space = JCS_RGB;
222
 
            break;
223
 
        case 4:
224
 
            jcdp->cinfo.in_color_space = JCS_CMYK;
225
 
            break;
226
 
        default:
227
 
            jcdp->cinfo.in_color_space = JCS_UNKNOWN;
 
217
        case 1:
 
218
            jcdp->cinfo.in_color_space = JCS_GRAYSCALE;
 
219
            break;
 
220
        case 3:
 
221
            jcdp->cinfo.in_color_space = JCS_RGB;
 
222
            break;
 
223
        case 4:
 
224
            jcdp->cinfo.in_color_space = JCS_CMYK;
 
225
            break;
 
226
        default:
 
227
            jcdp->cinfo.in_color_space = JCS_UNKNOWN;
228
228
    }
229
229
    if ((code = gs_jpeg_set_defaults(pdct)) < 0)
230
 
        return code;
 
230
        return code;
231
231
    if ((code = s_DCT_put_huffman_tables(plist, pdct, true)) < 0)
232
 
        return code;
 
232
        return code;
233
233
    switch ((code = s_DCT_put_quantization_tables(plist, pdct, true))) {
234
 
        case 0:
235
 
            break;
236
 
        default:
237
 
            return code;
238
 
        case 1:
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)
243
 
                                                   * 100.0 + 0.5),
244
 
                                                  TRUE);
245
 
                if (code < 0)
246
 
                    return code;
247
 
            }
 
234
        case 0:
 
235
            break;
 
236
        default:
 
237
            return code;
 
238
        case 1:
 
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)
 
243
                                                   * 100.0 + 0.5),
 
244
                                                  TRUE);
 
245
                if (code < 0)
 
246
                    return code;
 
247
            }
248
248
    }
249
249
    /* Change IJG colorspace defaults as needed;
250
250
     * set ColorTransform to what will go in the Adobe marker.
251
251
     */
252
252
    switch (params.Colors) {
253
 
        case 3:
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)
258
 
                    return code;
259
 
            } else
260
 
                pdct->ColorTransform = 1;       /* flag YCC xform */
261
 
            break;
262
 
        case 4:
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)
267
 
                    return code;
268
 
                pdct->ColorTransform = 2;       /* flag YCCK xform */
269
 
            } else {
270
 
                if ((code = gs_jpeg_set_colorspace(pdct, JCS_CMYK)) < 0)
271
 
                    return code;
272
 
            }
273
 
            break;
274
 
        default:
275
 
            pdct->ColorTransform = 0;   /* no transform otherwise */
276
 
            break;
 
253
        case 3:
 
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)
 
258
                    return code;
 
259
            } else
 
260
                pdct->ColorTransform = 1;       /* flag YCC xform */
 
261
            break;
 
262
        case 4:
 
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)
 
267
                    return code;
 
268
                pdct->ColorTransform = 2;       /* flag YCCK xform */
 
269
            } else {
 
270
                if ((code = gs_jpeg_set_colorspace(pdct, JCS_CMYK)) < 0)
 
271
                    return code;
 
272
            }
 
273
            break;
 
274
        default:
 
275
            pdct->ColorTransform = 0;   /* no transform otherwise */
 
276
            break;
277
277
    }
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,
283
 
                                 jcdp, false)) < 0 ||
284
 
        (code = dcte_put_samples(plist, "VSamples", params.Colors,
285
 
                                 jcdp, true)) < 0
286
 
        )
287
 
        return code;
 
283
                                 jcdp, false)) < 0 ||
 
284
        (code = dcte_put_samples(plist, "VSamples", params.Colors,
 
285
                                 jcdp, true)) < 0
 
286
        )
 
287
        return code;
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;
294
 
        int num_samples;
 
293
        jpeg_component_info *comp_info = jcdp->cinfo.comp_info;
 
294
        int num_samples;
295
295
 
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);
301
 
        /*
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.
306
 
         */
 
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);
 
301
        /*
 
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.
 
306
         */
307
307
    }
308
308
    return 0;
309
309
}