Coverage Report

Created: 2022-10-31 07:00

/src/ghostpdl/base/gdevdflt.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (C) 2001-2022 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.,  1305 Grant Avenue - Suite 200, Novato,
13
   CA 94945, U.S.A., +1(415)492-9861, for further information.
14
*/
15
16
/* Default device implementation */
17
#include "math_.h"
18
#include "memory_.h"
19
#include "gx.h"
20
#include "gsstruct.h"
21
#include "gxobj.h"
22
#include "gserrors.h"
23
#include "gsropt.h"
24
#include "gxcomp.h"
25
#include "gxdevice.h"
26
#include "gxdevsop.h"
27
#include "gdevp14.h"        /* Needed to patch up the procs after compositor creation */
28
#include "gstrans.h"        /* For gs_pdf14trans_t */
29
#include "gxgstate.h"       /* for gs_image_state_s */
30
31
32
/* defined in gsdpram.c */
33
int gx_default_get_param(gx_device *dev, char *Param, void *list);
34
35
/* ---------------- Default device procedures ---------------- */
36
37
/*
38
 * Set a color model polarity to be additive or subtractive. In either
39
 * case, indicate an error (and don't modify the polarity) if the current
40
 * setting differs from the desired and is not GX_CINFO_POLARITY_UNKNOWN.
41
 */
42
static void
43
set_cinfo_polarity(gx_device * dev, gx_color_polarity_t new_polarity)
44
4.62M
{
45
#ifdef DEBUG
46
    /* sanity check */
47
    if (new_polarity == GX_CINFO_POLARITY_UNKNOWN) {
48
        dmprintf(dev->memory, "set_cinfo_polarity: illegal operand\n");
49
        return;
50
    }
51
#endif
52
    /*
53
     * The meory devices assume that single color devices are gray.
54
     * This may not be true if SeparationOrder is specified.  Thus only
55
     * change the value if the current value is unknown.
56
     */
57
4.62M
    if (dev->color_info.polarity == GX_CINFO_POLARITY_UNKNOWN)
58
0
        dev->color_info.polarity = new_polarity;
59
4.62M
}
60
61
static gx_color_index
62
(*get_encode_color(gx_device *dev))(gx_device *, const gx_color_value *)
63
68.9M
{
64
68.9M
    dev_proc_encode_color(*encode_proc);
65
66
    /* use encode_color if it has been provided */
67
68.9M
    if ((encode_proc = dev_proc(dev, encode_color)) == 0) {
68
4.62M
        if (dev->color_info.num_components == 1                          &&
69
4.62M
            dev_proc(dev, map_rgb_color) != 0) {
70
3.62M
            set_cinfo_polarity(dev, GX_CINFO_POLARITY_ADDITIVE);
71
3.62M
            encode_proc = gx_backwards_compatible_gray_encode;
72
3.62M
        } else  if ( (dev->color_info.num_components == 3    )           &&
73
994k
             (encode_proc = dev_proc(dev, map_rgb_color)) != 0  )
74
30.5k
            set_cinfo_polarity(dev, GX_CINFO_POLARITY_ADDITIVE);
75
963k
        else if ( dev->color_info.num_components == 4                    &&
76
963k
                 (encode_proc = dev_proc(dev, map_cmyk_color)) != 0   )
77
0
            set_cinfo_polarity(dev, GX_CINFO_POLARITY_SUBTRACTIVE);
78
4.62M
    }
79
80
    /*
81
     * If no encode_color procedure at this point, the color model had
82
     * better be monochrome (though not necessarily bi-level). In this
83
     * case, it is assumed to be additive, as that is consistent with
84
     * the pre-DeviceN code.
85
     *
86
     * If this is not the case, then the color model had better be known
87
     * to be separable and linear, for there is no other way to derive
88
     * an encoding. This is the case even for weakly linear and separable
89
     * color models with a known polarity.
90
     */
91
68.9M
    if (encode_proc == 0) {
92
963k
        if (dev->color_info.num_components == 1 && dev->color_info.depth != 0) {
93
963k
            set_cinfo_polarity(dev, GX_CINFO_POLARITY_ADDITIVE);
94
963k
            if (dev->color_info.max_gray == (1 << dev->color_info.depth) - 1)
95
963k
                encode_proc = gx_default_gray_fast_encode;
96
0
            else
97
0
                encode_proc = gx_default_gray_encode;
98
963k
            dev->color_info.separable_and_linear = GX_CINFO_SEP_LIN;
99
963k
        } else if (colors_are_separable_and_linear(&dev->color_info)) {
100
0
            gx_color_value  max_gray = dev->color_info.max_gray;
101
0
            gx_color_value  max_color = dev->color_info.max_color;
102
103
0
            if ( (max_gray & (max_gray + 1)) == 0  &&
104
0
                 (max_color & (max_color + 1)) == 0  )
105
                /* NB should be gx_default_fast_encode_color */
106
0
                encode_proc = gx_default_encode_color;
107
0
            else
108
0
                encode_proc = gx_default_encode_color;
109
0
        }
110
963k
    }
111
112
68.9M
    return encode_proc;
113
68.9M
}
114
115
/*
116
 * Determine if a color model has the properties of a DeviceRGB
117
 * color model. This procedure is, in all likelihood, high-grade
118
 * overkill, but since this is not a performance sensitive area
119
 * no harm is done.
120
 *
121
 * Since there is little benefit to checking the values 0, 1, or
122
 * 1/2, we use the values 1/4, 1/3, and 3/4 in their place. We
123
 * compare the results to see if the intensities match to within
124
 * a tolerance of .01, which is arbitrarily selected.
125
 */
126
127
static bool
128
is_like_DeviceRGB(gx_device * dev)
129
4.62M
{
130
4.62M
    frac                            cm_comp_fracs[3];
131
4.62M
    int                             i;
132
4.62M
    const gx_device                *cmdev;
133
4.62M
    const gx_cm_color_map_procs    *cmprocs;
134
135
4.62M
    if ( dev->color_info.num_components != 3                   ||
136
4.62M
         dev->color_info.polarity != GX_CINFO_POLARITY_ADDITIVE  )
137
4.59M
        return false;
138
139
30.5k
    cmprocs = dev_proc(dev, get_color_mapping_procs)(dev, &cmdev);
140
141
    /* check the values 1/4, 1/3, and 3/4 */
142
30.5k
    cmprocs->map_rgb(cmdev, 0, frac_1 / 4, frac_1 / 3, 3 * frac_1 / 4, cm_comp_fracs);
143
144
    /* verify results to .01 */
145
30.5k
    cm_comp_fracs[0] -= frac_1 / 4;
146
30.5k
    cm_comp_fracs[1] -= frac_1 / 3;
147
30.5k
    cm_comp_fracs[2] -= 3 * frac_1 / 4;
148
30.5k
    for ( i = 0;
149
122k
           i < 3                            &&
150
122k
           -frac_1 / 100 < cm_comp_fracs[i] &&
151
122k
           cm_comp_fracs[i] < frac_1 / 100;
152
91.7k
          i++ )
153
91.7k
        ;
154
30.5k
    return i == 3;
155
4.62M
}
156
157
/*
158
 * Similar to is_like_DeviceRGB, but for DeviceCMYK.
159
 */
160
static bool
161
is_like_DeviceCMYK(gx_device * dev)
162
0
{
163
0
    frac                            cm_comp_fracs[4];
164
0
    int                             i;
165
0
    const gx_device                *cmdev;
166
0
    const gx_cm_color_map_procs    *cmprocs;
167
168
0
    if ( dev->color_info.num_components != 4                      ||
169
0
         dev->color_info.polarity != GX_CINFO_POLARITY_SUBTRACTIVE  )
170
0
        return false;
171
172
0
    cmprocs = dev_proc(dev, get_color_mapping_procs)(dev, &cmdev);
173
    /* check the values 1/4, 1/3, 3/4, and 1/8 */
174
175
0
    cmprocs->map_cmyk(cmdev,
176
0
                      frac_1 / 4,
177
0
                      frac_1 / 3,
178
0
                      3 * frac_1 / 4,
179
0
                      frac_1 / 8,
180
0
                      cm_comp_fracs);
181
182
    /* verify results to .01 */
183
0
    cm_comp_fracs[0] -= frac_1 / 4;
184
0
    cm_comp_fracs[1] -= frac_1 / 3;
185
0
    cm_comp_fracs[2] -= 3 * frac_1 / 4;
186
0
    cm_comp_fracs[3] -= frac_1 / 8;
187
0
    for ( i = 0;
188
0
           i < 4                            &&
189
0
           -frac_1 / 100 < cm_comp_fracs[i] &&
190
0
           cm_comp_fracs[i] < frac_1 / 100;
191
0
          i++ )
192
0
        ;
193
0
    return i == 4;
194
0
}
195
196
/*
197
 * Two default decode_color procedures to use for monochrome devices.
198
 * These will make use of the map_color_rgb routine, and use the first
199
 * component of the returned value or its inverse.
200
 */
201
static int
202
gx_default_1_add_decode_color(
203
    gx_device *     dev,
204
    gx_color_index  color,
205
    gx_color_value  cv[1] )
206
0
{
207
0
    gx_color_value  rgb[3];
208
0
    int             code = dev_proc(dev, map_color_rgb)(dev, color, rgb);
209
210
0
    cv[0] = rgb[0];
211
0
    return code;
212
0
}
213
214
static int
215
gx_default_1_sub_decode_color(
216
    gx_device *     dev,
217
    gx_color_index  color,
218
    gx_color_value  cv[1] )
219
0
{
220
0
    gx_color_value  rgb[3];
221
0
    int             code = dev_proc(dev, map_color_rgb)(dev, color, rgb);
222
223
0
    cv[0] = gx_max_color_value - rgb[0];
224
0
    return code;
225
0
}
226
227
/*
228
 * A default decode_color procedure for DeviceCMYK color models.
229
 *
230
 * There is no generally accurate way of decode a DeviceCMYK color using
231
 * the map_color_rgb method. Unfortunately, there are many older devices
232
 * employ the DeviceCMYK color model but don't provide a decode_color
233
 * method. The code below works on the assumption of full undercolor
234
 * removal and black generation. This may not be accurate, but is the
235
 * best that can be done in the general case without other information.
236
 */
237
static int
238
gx_default_cmyk_decode_color(
239
    gx_device *     dev,
240
    gx_color_index  color,
241
    gx_color_value  cv[4] )
242
0
{
243
    /* The device may have been determined to be 'separable'. */
244
0
    if (colors_are_separable_and_linear(&dev->color_info))
245
0
        return gx_default_decode_color(dev, color, cv);
246
0
    else {
247
0
        int i, code = dev_proc(dev, map_color_rgb)(dev, color, cv);
248
0
        gx_color_value min_val = gx_max_color_value;
249
250
0
        for (i = 0; i < 3; i++) {
251
0
            if ((cv[i] = gx_max_color_value - cv[i]) < min_val)
252
0
                min_val = cv[i];
253
0
        }
254
0
        for (i = 0; i < 3; i++)
255
0
            cv[i] -= min_val;
256
0
        cv[3] = min_val;
257
258
0
        return code;
259
0
    }
260
0
}
261
262
/*
263
 * Special case default color decode routine for a canonical 1-bit per
264
 * component DeviceCMYK color model.
265
 */
266
static int
267
gx_1bit_cmyk_decode_color(
268
    gx_device *     dev,
269
    gx_color_index  color,
270
    gx_color_value  cv[4] )
271
0
{
272
0
    cv[0] = ((color & 0x8) != 0 ? gx_max_color_value : 0);
273
0
    cv[1] = ((color & 0x4) != 0 ? gx_max_color_value : 0);
274
0
    cv[2] = ((color & 0x2) != 0 ? gx_max_color_value : 0);
275
0
    cv[3] = ((color & 0x1) != 0 ? gx_max_color_value : 0);
276
0
    return 0;
277
0
}
278
279
static int
280
(*get_decode_color(gx_device * dev))(gx_device *, gx_color_index, gx_color_value *)
281
68.9M
{
282
    /* if a method has already been provided, use it */
283
68.9M
    if (dev_proc(dev, decode_color) != 0)
284
64.3M
        return dev_proc(dev, decode_color);
285
286
    /*
287
     * If a map_color_rgb method has been provided, we may be able to use it.
288
     * Currently this will always be the case, as a default value will be
289
     * provided this method. While this default may not be correct, we are not
290
     * introducing any new errors by using it.
291
     */
292
4.62M
    if (dev_proc(dev, map_color_rgb) != 0) {
293
294
        /* if the device has a DeviceRGB color model, use map_color_rgb */
295
4.62M
        if (is_like_DeviceRGB(dev))
296
30.5k
            return dev_proc(dev, map_color_rgb);
297
298
        /* If separable ande linear then use default */
299
4.59M
        if (colors_are_separable_and_linear(&dev->color_info))
300
963k
            return &gx_default_decode_color;
301
302
        /* gray devices can be handled based on their polarity */
303
3.62M
        if ( dev->color_info.num_components == 1 &&
304
3.62M
             dev->color_info.gray_index == 0       )
305
3.62M
            return dev->color_info.polarity == GX_CINFO_POLARITY_ADDITIVE
306
3.62M
                       ? &gx_default_1_add_decode_color
307
3.62M
                       : &gx_default_1_sub_decode_color;
308
309
        /*
310
         * There is no accurate way to decode colors for cmyk devices
311
         * using the map_color_rgb procedure. Unfortunately, this cases
312
         * arises with some frequency, so it is useful not to generate an
313
         * error in this case. The mechanism below assumes full undercolor
314
         * removal and black generation, which may not be accurate but are
315
         * the  best that can be done in the general case in the absence of
316
         * other information.
317
         *
318
         * As a hack to handle certain common devices, if the map_rgb_color
319
         * routine is cmyk_1bit_map_color_rgb, we provide a direct one-bit
320
         * decoder.
321
         */
322
0
        if (is_like_DeviceCMYK(dev)) {
323
0
            if (dev_proc(dev, map_color_rgb) == cmyk_1bit_map_color_rgb)
324
0
                return &gx_1bit_cmyk_decode_color;
325
0
            else
326
0
                return &gx_default_cmyk_decode_color;
327
0
        }
328
0
    }
329
330
    /*
331
     * The separable and linear case will already have been handled by
332
     * code in gx_device_fill_in_procs, so at this point we can only hope
333
     * the device doesn't use the decode_color method.
334
     */
335
0
    if (colors_are_separable_and_linear(&dev->color_info))
336
0
        return &gx_default_decode_color;
337
0
    else
338
0
        return &gx_error_decode_color;
339
0
}
340
341
/*
342
 * If a device has a linear and separable encode color function then
343
 * set up the comp_bits, comp_mask, and comp_shift fields.  Note:  This
344
 * routine assumes that the colorant shift factor decreases with the
345
 * component number.  See check_device_separable() for a general routine.
346
 */
347
void
348
set_linear_color_bits_mask_shift(gx_device * dev)
349
33.5k
{
350
33.5k
    int i;
351
33.5k
    byte gray_index = dev->color_info.gray_index;
352
33.5k
    gx_color_value max_gray = dev->color_info.max_gray;
353
33.5k
    gx_color_value max_color = dev->color_info.max_color;
354
33.5k
    int num_components = dev->color_info.num_components;
355
356
486k
#define comp_bits (dev->color_info.comp_bits)
357
243k
#define comp_mask (dev->color_info.comp_mask)
358
695k
#define comp_shift (dev->color_info.comp_shift)
359
33.5k
    comp_shift[num_components - 1] = 0;
360
243k
    for ( i = num_components - 1 - 1; i >= 0; i-- ) {
361
209k
        comp_shift[i] = comp_shift[i + 1] +
362
209k
            ( i == gray_index ? ilog2(max_gray + 1) : ilog2(max_color + 1) );
363
209k
    }
364
276k
    for ( i = 0; i < num_components; i++ ) {
365
243k
        comp_bits[i] = ( i == gray_index ?
366
26.1k
                         ilog2(max_gray + 1) :
367
243k
                         ilog2(max_color + 1) );
368
243k
        comp_mask[i] = (((gx_color_index)1 << comp_bits[i]) - 1)
369
243k
                                               << comp_shift[i];
370
243k
    }
371
33.5k
#undef comp_bits
372
33.5k
#undef comp_mask
373
33.5k
#undef comp_shift
374
33.5k
}
375
376
/* Determine if a number is a power of two.  Works only for integers. */
377
62.1M
#define is_power_of_two(x) ((((x) - 1) & (x)) == 0)
378
379
/* A brutish way to check if we are a HT device */
380
bool
381
device_is_contone(gx_device* pdev)
382
1.25M
{
383
1.25M
    if ((float)pdev->color_info.depth / (float)pdev->color_info.num_components >= 8)
384
361k
        return true;
385
897k
    return false;
386
1.25M
}
387
388
/*
389
 * This routine attempts to determine if a device's encode_color procedure
390
 * produces gx_color_index values which are 'separable'.  A 'separable' value
391
 * means two things.  Each colorant has a group of bits in the gx_color_index
392
 * value which is associated with the colorant.  These bits are separate.
393
 * I.e. no bit is associated with more than one colorant.  If a colorant has
394
 * a value of zero then the bits associated with that colorant are zero.
395
 * These criteria allows the graphics library to build gx_color_index values
396
 * from the colorant values and not using the encode_color routine. This is
397
 * useful and necessary for overprinting, halftoning more
398
 * than four colorants, and the fast shading logic.  However this information
399
 * is not setup by the default device macros.  Thus we attempt to derive this
400
 * information.
401
 *
402
 * This routine can be fooled.  However it usually errors on the side of
403
 * assuing that a device is not separable.  In this case it does not create
404
 * any new problems.  In theory it can be fooled into believing that a device
405
 * is separable when it is not.  However we do not know of any real cases that
406
 * will fool it.
407
 */
408
void
409
check_device_separable(gx_device * dev)
410
74.0M
{
411
74.0M
    int i, j;
412
74.0M
    gx_device_color_info * pinfo = &(dev->color_info);
413
74.0M
    int num_components = pinfo->num_components;
414
74.0M
    byte comp_shift[GX_DEVICE_COLOR_MAX_COMPONENTS];
415
74.0M
    byte comp_bits[GX_DEVICE_COLOR_MAX_COMPONENTS];
416
74.0M
    gx_color_index comp_mask[GX_DEVICE_COLOR_MAX_COMPONENTS];
417
74.0M
    gx_color_index color_index;
418
74.0M
    gx_color_index current_bits = 0;
419
74.0M
    gx_color_value colorants[GX_DEVICE_COLOR_MAX_COMPONENTS] = { 0 };
420
421
    /* If this is already known then we do not need to do anything. */
422
74.0M
    if (pinfo->separable_and_linear != GX_CINFO_UNKNOWN_SEP_LIN)
423
49.6M
        return;
424
    /* If there is not an encode_color_routine then we cannot proceed. */
425
24.3M
    if (dev_proc(dev, encode_color) == NULL)
426
3.62M
        return;
427
    /*
428
     * If these values do not check then we should have an error.  However
429
     * we do not know what to do so we are simply exitting and hoping that
430
     * the device will clean up its values.
431
     */
432
20.7M
    if (pinfo->gray_index < num_components &&
433
20.7M
        (!pinfo->dither_grays || pinfo->dither_grays != (pinfo->max_gray + 1)))
434
0
            return;
435
20.7M
    if ((num_components > 1 || pinfo->gray_index != 0) &&
436
20.7M
        (!pinfo->dither_colors || pinfo->dither_colors != (pinfo->max_color + 1)))
437
0
        return;
438
    /*
439
     * If dither_grays or dither_colors is not a power of two then we assume
440
     * that the device is not separable.  In theory this not a requirement
441
     * but it has been true for all of the devices that we have seen so far.
442
     * This assumption also makes the logic in the next section easier.
443
     */
444
20.7M
    if (!is_power_of_two(pinfo->dither_grays)
445
20.7M
                    || !is_power_of_two(pinfo->dither_colors))
446
0
        return;
447
    /*
448
     * Use the encode_color routine to try to verify that the device is
449
     * separable and to determine the shift count, etc. for each colorant.
450
     */
451
20.7M
    color_index = dev_proc(dev, encode_color)(dev, colorants);
452
20.7M
    if (color_index != 0)
453
20.4M
        return;    /* Exit if zero colorants produce a non zero index */
454
668k
    for (i = 0; i < num_components; i++) {
455
        /* Check this colorant = max with all others = 0 */
456
959k
        for (j = 0; j < num_components; j++)
457
588k
            colorants[j] = 0;
458
370k
        colorants[i] = gx_max_color_value;
459
370k
        color_index = dev_proc(dev, encode_color)(dev, colorants);
460
370k
        if (color_index == 0)  /* If no bits then we have a problem */
461
0
            return;
462
370k
        if (color_index & current_bits)  /* Check for overlapping bits */
463
0
            return;
464
370k
        current_bits |= color_index;
465
370k
        comp_mask[i] = color_index;
466
        /* Determine the shift count for the colorant */
467
1.24M
        for (j = 0; (color_index & 1) == 0 && color_index != 0; j++)
468
873k
            color_index >>= 1;
469
370k
        comp_shift[i] = j;
470
        /* Determine the bit count for the colorant */
471
1.60M
        for (j = 0; color_index != 0; j++) {
472
1.23M
            if ((color_index & 1) == 0) /* check for non-consecutive bits */
473
0
                return;
474
1.23M
            color_index >>= 1;
475
1.23M
        }
476
370k
        comp_bits[i] = j;
477
        /*
478
         * We could verify that the bit count matches the dither_grays or
479
         * dither_colors values, but this is not really required unless we
480
         * are halftoning.  Thus we are allowing for non equal colorant sizes.
481
         */
482
        /* Check for overlap with other colorant if they are all maxed */
483
959k
        for (j = 0; j < num_components; j++)
484
588k
            colorants[j] = gx_max_color_value;
485
370k
        colorants[i] = 0;
486
370k
        color_index = dev_proc(dev, encode_color)(dev, colorants);
487
370k
        if (color_index & comp_mask[i])  /* Check for overlapping bits */
488
0
            return;
489
370k
    }
490
    /* If we get to here then the device is very likely to be separable. */
491
297k
    pinfo->separable_and_linear = GX_CINFO_SEP_LIN;
492
668k
    for (i = 0; i < num_components; i++) {
493
370k
        pinfo->comp_shift[i] = comp_shift[i];
494
370k
        pinfo->comp_bits[i] = comp_bits[i];
495
370k
        pinfo->comp_mask[i] = comp_mask[i];
496
370k
    }
497
    /*
498
     * The 'gray_index' value allows one colorant to have a different number
499
     * of shades from the remainder.  Since the default macros only guess at
500
     * an appropriate value, we are setting its value based upon the data that
501
     * we just determined.  Note:  In some cases the macros set max_gray to 0
502
     * and dither_grays to 1.  This is not valid so ignore this case.
503
     */
504
297k
    for (i = 0; i < num_components; i++) {
505
297k
        int dither = 1 << comp_bits[i];
506
507
297k
        if (pinfo->dither_grays != 1 && dither == pinfo->dither_grays) {
508
297k
            pinfo->gray_index = i;
509
297k
            break;
510
297k
        }
511
297k
    }
512
297k
}
513
#undef is_power_of_two
514
515
/*
516
 * This routine attempts to determine if a device's encode_color procedure
517
 * produces values that are in keeping with "the standard encoding".
518
 * i.e. that given by pdf14_encode_color.
519
 *
520
 * It works by first checking to see if we are separable_and_linear. If not
521
 * we cannot hope to be the standard encoding.
522
 *
523
 * Then, we check to see if we are a dev device - if so, we must be
524
 * compatible.
525
 *
526
 * Failing that it checks to see if the encoding uses the appropriate
527
 * bit ranges for each individual color.
528
 *
529
 * If those (quick) tests pass, then we try the slower test of checking
530
 * the encodings. We can do this far faster than an exhaustive check, by
531
 * relying on the separability and linearity - we only need to check 256
532
 * possible values.
533
 *
534
 * The one tricky section there is to avoid the special case for
535
 * gx_no_color_index_value (which can occur when we have a 32bit
536
 * gx_color_index type, and a 4 component device, such as cmyk).
537
 * We allow the encoding to be off in the lower bits for that case.
538
 */
539
void check_device_compatible_encoding(gx_device *dev)
540
59.8M
{
541
59.8M
    gx_device_color_info * pinfo = &(dev->color_info);
542
59.8M
    int num_components = pinfo->num_components;
543
59.8M
    gx_color_index mul, color_index;
544
59.8M
    int i, j;
545
59.8M
    gx_color_value colorants[GX_DEVICE_COLOR_MAX_COMPONENTS];
546
59.8M
    bool deep = device_is_deep(dev);
547
548
59.8M
    if (pinfo->separable_and_linear == GX_CINFO_UNKNOWN_SEP_LIN)
549
10.1M
        check_device_separable(dev);
550
59.8M
    if (pinfo->separable_and_linear != GX_CINFO_SEP_LIN)
551
59.8M
        return;
552
553
28.3k
    if (dev_proc(dev, ret_devn_params)(dev) != NULL) {
554
        /* We know all devn devices are compatible. */
555
14.2k
        pinfo->separable_and_linear = GX_CINFO_SEP_LIN_STANDARD;
556
14.2k
        return;
557
14.2k
    }
558
559
    /* Do the superficial quick checks */
560
42.4k
    for (i = 0; i < num_components; i++) {
561
28.2k
        int shift = (num_components-1-i)*(8<<deep);
562
28.2k
        if (pinfo->comp_shift[i] != shift)
563
0
            goto bad;
564
28.2k
        if (pinfo->comp_bits[i] != 8<<deep)
565
0
            goto bad;
566
28.2k
        if (pinfo->comp_mask[i] != ((gx_color_index)(deep ? 65535 : 255))<<shift)
567
0
            goto bad;
568
28.2k
    }
569
570
    /* OK, now we are going to be slower. */
571
14.1k
    mul = 0;
572
42.4k
    for (i = 0; i < num_components; i++) {
573
28.2k
        mul = (mul<<(8<<deep)) | 1;
574
28.2k
    }
575
    /* In the deep case, we don't exhaustively test */
576
3.61M
    for (i = 0; i < 255; i++) {
577
10.8M
        for (j = 0; j < num_components; j++)
578
7.21M
            colorants[j] = i*257;
579
3.60M
        color_index = dev_proc(dev, encode_color)(dev, colorants);
580
3.60M
        if (color_index != i*mul*(deep ? 257 : 1) && (i*mul*(deep ? 257 : 1) != gx_no_color_index_value))
581
0
            goto bad;
582
3.60M
    }
583
    /* If we reach here, then every value matched, except possibly the last one.
584
     * We'll allow that to differ just in the lowest bits. */
585
14.1k
    if ((color_index | mul) != 255*mul*(deep ? 257 : 1))
586
0
        goto bad;
587
588
14.1k
    pinfo->separable_and_linear = GX_CINFO_SEP_LIN_STANDARD;
589
14.1k
    return;
590
0
bad:
591
0
    pinfo->separable_and_linear = GX_CINFO_SEP_LIN_NON_STANDARD;
592
0
}
593
594
int gx_default_no_copy_alpha_hl_color(gx_device * dev, const byte * data, int data_x, int raster, gx_bitmap_id id, int x, int y, int width, int height, const gx_drawing_color *pdcolor, int depth);
595
596
/* Fill in NULL procedures in a device procedure record. */
597
void
598
gx_device_fill_in_procs(register gx_device * dev)
599
68.9M
{
600
68.9M
    fill_dev_proc(dev, open_device, gx_default_open_device);
601
68.9M
    fill_dev_proc(dev, get_initial_matrix, gx_default_get_initial_matrix);
602
68.9M
    fill_dev_proc(dev, sync_output, gx_default_sync_output);
603
68.9M
    fill_dev_proc(dev, output_page, gx_default_output_page);
604
68.9M
    fill_dev_proc(dev, close_device, gx_default_close_device);
605
    /* see below for map_rgb_color */
606
68.9M
    fill_dev_proc(dev, map_color_rgb, gx_default_map_color_rgb);
607
    /* NOT fill_rectangle */
608
68.9M
    fill_dev_proc(dev, copy_mono, gx_default_copy_mono);
609
68.9M
    fill_dev_proc(dev, copy_color, gx_default_copy_color);
610
68.9M
    fill_dev_proc(dev, get_params, gx_default_get_params);
611
68.9M
    fill_dev_proc(dev, put_params, gx_default_put_params);
612
    /* see below for map_cmyk_color */
613
68.9M
    fill_dev_proc(dev, get_page_device, gx_default_get_page_device);
614
68.9M
    fill_dev_proc(dev, get_alpha_bits, gx_default_get_alpha_bits);
615
68.9M
    fill_dev_proc(dev, copy_alpha, gx_default_copy_alpha);
616
68.9M
    fill_dev_proc(dev, fill_path, gx_default_fill_path);
617
68.9M
    fill_dev_proc(dev, stroke_path, gx_default_stroke_path);
618
68.9M
    fill_dev_proc(dev, fill_mask, gx_default_fill_mask);
619
68.9M
    fill_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid);
620
68.9M
    fill_dev_proc(dev, fill_parallelogram, gx_default_fill_parallelogram);
621
68.9M
    fill_dev_proc(dev, fill_triangle, gx_default_fill_triangle);
622
68.9M
    fill_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line);
623
68.9M
    fill_dev_proc(dev, get_alpha_bits, gx_default_get_alpha_bits);
624
68.9M
    fill_dev_proc(dev, strip_tile_rectangle, gx_default_strip_tile_rectangle);
625
68.9M
    fill_dev_proc(dev, strip_copy_rop2, gx_default_strip_copy_rop2);
626
68.9M
    fill_dev_proc(dev, strip_tile_rect_devn, gx_default_strip_tile_rect_devn);
627
68.9M
    fill_dev_proc(dev, get_clipping_box, gx_default_get_clipping_box);
628
68.9M
    fill_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image);
629
68.9M
    fill_dev_proc(dev, get_bits_rectangle, gx_default_get_bits_rectangle);
630
68.9M
    fill_dev_proc(dev, composite, gx_default_composite);
631
68.9M
    fill_dev_proc(dev, get_hardware_params, gx_default_get_hardware_params);
632
68.9M
    fill_dev_proc(dev, text_begin, gx_default_text_begin);
633
634
68.9M
    set_dev_proc(dev, encode_color, get_encode_color(dev));
635
68.9M
    if (dev->color_info.num_components == 3)
636
24.1M
        set_dev_proc(dev, map_rgb_color, dev_proc(dev, encode_color));
637
68.9M
    if (dev->color_info.num_components == 4)
638
23.3M
        set_dev_proc(dev, map_cmyk_color, dev_proc(dev, encode_color));
639
640
68.9M
    if (colors_are_separable_and_linear(&dev->color_info)) {
641
22.4M
        fill_dev_proc(dev, encode_color, gx_default_encode_color);
642
22.4M
        fill_dev_proc(dev, map_cmyk_color, gx_default_encode_color);
643
22.4M
        fill_dev_proc(dev, map_rgb_color, gx_default_encode_color);
644
46.5M
    } else {
645
        /* if it isn't set now punt */
646
46.5M
        fill_dev_proc(dev, encode_color, gx_error_encode_color);
647
46.5M
        fill_dev_proc(dev, map_cmyk_color, gx_error_encode_color);
648
46.5M
        fill_dev_proc(dev, map_rgb_color, gx_error_encode_color);
649
46.5M
    }
650
651
    /*
652
     * Fill in the color mapping procedures and the component index
653
     * assignment procedure if they have not been provided by the client.
654
     *
655
     * Because it is difficult to provide default encoding procedures
656
     * that handle level inversion, this code needs to check both
657
     * the number of components and the polarity of color model.
658
     */
659
68.9M
    switch (dev->color_info.num_components) {
660
21.3M
    case 1:     /* DeviceGray or DeviceInvertGray */
661
        /*
662
         * If not gray then the device must provide the color
663
         * mapping procs.
664
         */
665
21.3M
        if (dev->color_info.polarity == GX_CINFO_POLARITY_ADDITIVE) {
666
21.3M
            fill_dev_proc( dev,
667
21.3M
                       get_color_mapping_procs,
668
21.3M
                       gx_default_DevGray_get_color_mapping_procs );
669
21.3M
        } else
670
2.14k
            fill_dev_proc(dev, get_color_mapping_procs, gx_error_get_color_mapping_procs);
671
21.3M
        fill_dev_proc( dev,
672
21.3M
                       get_color_comp_index,
673
21.3M
                       gx_default_DevGray_get_color_comp_index );
674
21.3M
        break;
675
676
24.1M
    case 3:
677
24.1M
        if (dev->color_info.polarity == GX_CINFO_POLARITY_ADDITIVE) {
678
24.1M
            fill_dev_proc( dev,
679
24.1M
                       get_color_mapping_procs,
680
24.1M
                       gx_default_DevRGB_get_color_mapping_procs );
681
24.1M
            fill_dev_proc( dev,
682
24.1M
                       get_color_comp_index,
683
24.1M
                       gx_default_DevRGB_get_color_comp_index );
684
24.1M
        } else {
685
0
            fill_dev_proc(dev, get_color_mapping_procs, gx_error_get_color_mapping_procs);
686
0
            fill_dev_proc(dev, get_color_comp_index, gx_error_get_color_comp_index);
687
0
        }
688
24.1M
        break;
689
690
23.3M
    case 4:
691
23.3M
        fill_dev_proc(dev, get_color_mapping_procs, gx_default_DevCMYK_get_color_mapping_procs);
692
23.3M
        fill_dev_proc(dev, get_color_comp_index, gx_default_DevCMYK_get_color_comp_index);
693
23.3M
        break;
694
41.7k
    default:    /* Unknown color model - set error handlers */
695
41.7k
        if (dev_proc(dev, get_color_mapping_procs) == NULL) {
696
0
            fill_dev_proc(dev, get_color_mapping_procs, gx_error_get_color_mapping_procs);
697
0
            fill_dev_proc(dev, get_color_comp_index, gx_error_get_color_comp_index);
698
0
        }
699
68.9M
    }
700
701
68.9M
    set_dev_proc(dev, decode_color, get_decode_color(dev));
702
68.9M
    fill_dev_proc(dev, get_profile, gx_default_get_profile);
703
68.9M
    fill_dev_proc(dev, set_graphics_type_tag, gx_default_set_graphics_type_tag);
704
705
68.9M
    fill_dev_proc(dev, fill_rectangle_hl_color, gx_default_fill_rectangle_hl_color);
706
68.9M
    fill_dev_proc(dev, include_color_space, gx_default_include_color_space);
707
68.9M
    fill_dev_proc(dev, fill_linear_color_scanline, gx_default_fill_linear_color_scanline);
708
68.9M
    fill_dev_proc(dev, fill_linear_color_trapezoid, gx_default_fill_linear_color_trapezoid);
709
68.9M
    fill_dev_proc(dev, fill_linear_color_triangle, gx_default_fill_linear_color_triangle);
710
68.9M
    fill_dev_proc(dev, update_spot_equivalent_colors, gx_default_update_spot_equivalent_colors);
711
68.9M
    fill_dev_proc(dev, ret_devn_params, gx_default_ret_devn_params);
712
68.9M
    fill_dev_proc(dev, fillpage, gx_default_fillpage);
713
68.9M
    fill_dev_proc(dev, copy_alpha_hl_color, gx_default_no_copy_alpha_hl_color);
714
715
68.9M
    fill_dev_proc(dev, begin_transparency_group, gx_default_begin_transparency_group);
716
68.9M
    fill_dev_proc(dev, end_transparency_group, gx_default_end_transparency_group);
717
718
68.9M
    fill_dev_proc(dev, begin_transparency_mask, gx_default_begin_transparency_mask);
719
68.9M
    fill_dev_proc(dev, end_transparency_mask, gx_default_end_transparency_mask);
720
68.9M
    fill_dev_proc(dev, discard_transparency_layer, gx_default_discard_transparency_layer);
721
722
68.9M
    fill_dev_proc(dev, push_transparency_state, gx_default_push_transparency_state);
723
68.9M
    fill_dev_proc(dev, pop_transparency_state, gx_default_pop_transparency_state);
724
725
68.9M
    fill_dev_proc(dev, put_image, gx_default_put_image);
726
727
68.9M
    fill_dev_proc(dev, dev_spec_op, gx_default_dev_spec_op);
728
68.9M
    fill_dev_proc(dev, copy_planes, gx_default_copy_planes);
729
68.9M
    fill_dev_proc(dev, process_page, gx_default_process_page);
730
68.9M
    fill_dev_proc(dev, transform_pixel_region, gx_default_transform_pixel_region);
731
68.9M
    fill_dev_proc(dev, fill_stroke_path, gx_default_fill_stroke_path);
732
68.9M
    fill_dev_proc(dev, lock_pattern, gx_default_lock_pattern);
733
68.9M
}
734
735
736
int
737
gx_default_open_device(gx_device * dev)
738
250k
{
739
    /* Initialize the separable status if not known. */
740
250k
    check_device_separable(dev);
741
250k
    return 0;
742
250k
}
743
744
/* Get the initial matrix for a device with inverted Y. */
745
/* This includes essentially all printers and displays. */
746
/* Supports LeadingEdge, but no margins or viewports */
747
void
748
gx_default_get_initial_matrix(gx_device * dev, register gs_matrix * pmat)
749
33.3M
{
750
    /* NB this device has no paper margins */
751
33.3M
    double fs_res = dev->HWResolution[0] / 72.0;
752
33.3M
    double ss_res = dev->HWResolution[1] / 72.0;
753
754
33.3M
    switch(dev->LeadingEdge & LEADINGEDGE_MASK) {
755
0
    case 1: /* 90 degrees */
756
0
        pmat->xx = 0;
757
0
        pmat->xy = -ss_res;
758
0
        pmat->yx = -fs_res;
759
0
        pmat->yy = 0;
760
0
        pmat->tx = (float)dev->width;
761
0
        pmat->ty = (float)dev->height;
762
0
        break;
763
0
    case 2: /* 180 degrees */
764
0
        pmat->xx = -fs_res;
765
0
        pmat->xy = 0;
766
0
        pmat->yx = 0;
767
0
        pmat->yy = ss_res;
768
0
        pmat->tx = (float)dev->width;
769
0
        pmat->ty = 0;
770
0
        break;
771
0
    case 3: /* 270 degrees */
772
0
        pmat->xx = 0;
773
0
        pmat->xy = ss_res;
774
0
        pmat->yx = fs_res;
775
0
        pmat->yy = 0;
776
0
        pmat->tx = 0;
777
0
        pmat->ty = 0;
778
0
        break;
779
0
    default:
780
33.3M
    case 0:
781
33.3M
        pmat->xx = fs_res;
782
33.3M
        pmat->xy = 0;
783
33.3M
        pmat->yx = 0;
784
33.3M
        pmat->yy = -ss_res;
785
33.3M
        pmat->tx = 0;
786
33.3M
        pmat->ty = (float)dev->height;
787
        /****** tx/y is WRONG for devices with ******/
788
        /****** arbitrary initial matrix ******/
789
33.3M
        break;
790
33.3M
    }
791
33.3M
}
792
/* Get the initial matrix for a device with upright Y. */
793
/* This includes just a few printers and window systems. */
794
void
795
gx_upright_get_initial_matrix(gx_device * dev, register gs_matrix * pmat)
796
1.19M
{
797
1.19M
    pmat->xx = dev->HWResolution[0] / 72.0; /* x_pixels_per_inch */
798
1.19M
    pmat->xy = 0;
799
1.19M
    pmat->yx = 0;
800
1.19M
    pmat->yy = dev->HWResolution[1] / 72.0; /* y_pixels_per_inch */
801
    /****** tx/y is WRONG for devices with ******/
802
    /****** arbitrary initial matrix ******/
803
1.19M
    pmat->tx = 0;
804
1.19M
    pmat->ty = 0;
805
1.19M
}
806
807
int
808
gx_default_sync_output(gx_device * dev) /* lgtm [cpp/useless-expression] */
809
628k
{
810
628k
    return 0;
811
628k
}
812
813
int
814
gx_default_output_page(gx_device * dev, int num_copies, int flush)
815
4
{
816
4
    int code = dev_proc(dev, sync_output)(dev);
817
818
4
    if (code >= 0)
819
4
        code = gx_finish_output_page(dev, num_copies, flush);
820
4
    return code;
821
4
}
822
823
int
824
gx_default_close_device(gx_device * dev)
825
316k
{
826
316k
    return 0;
827
316k
}
828
829
gx_device *
830
gx_default_get_page_device(gx_device * dev)
831
296k
{
832
296k
    return NULL;
833
296k
}
834
gx_device *
835
gx_page_device_get_page_device(gx_device * dev)
836
9.69M
{
837
9.69M
    return dev;
838
9.69M
}
839
840
int
841
gx_default_get_alpha_bits(gx_device * dev, graphics_object_type type)
842
33.0M
{
843
33.0M
    return (type == go_text ? dev->color_info.anti_alias.text_bits :
844
33.0M
            dev->color_info.anti_alias.graphics_bits);
845
33.0M
}
846
847
void
848
gx_default_get_clipping_box(gx_device * dev, gs_fixed_rect * pbox)
849
14.0M
{
850
14.0M
    pbox->p.x = 0;
851
14.0M
    pbox->p.y = 0;
852
14.0M
    pbox->q.x = int2fixed(dev->width);
853
14.0M
    pbox->q.y = int2fixed(dev->height);
854
14.0M
}
855
void
856
gx_get_largest_clipping_box(gx_device * dev, gs_fixed_rect * pbox)
857
18
{
858
18
    pbox->p.x = min_fixed;
859
18
    pbox->p.y = min_fixed;
860
18
    pbox->q.x = max_fixed;
861
18
    pbox->q.y = max_fixed;
862
18
}
863
864
int
865
gx_no_composite(gx_device * dev, gx_device ** pcdev,
866
                        const gs_composite_t * pcte,
867
                        gs_gstate * pgs, gs_memory_t * memory,
868
                        gx_device *cdev)
869
0
{
870
0
    return_error(gs_error_unknownerror);  /* not implemented */
871
0
}
872
int
873
gx_default_composite(gx_device * dev, gx_device ** pcdev,
874
                             const gs_composite_t * pcte,
875
                             gs_gstate * pgs, gs_memory_t * memory,
876
                             gx_device *cdev)
877
1.81M
{
878
1.81M
    return pcte->type->procs.create_default_compositor
879
1.81M
        (pcte, pcdev, dev, pgs, memory);
880
1.81M
}
881
int
882
gx_null_composite(gx_device * dev, gx_device ** pcdev,
883
                          const gs_composite_t * pcte,
884
                          gs_gstate * pgs, gs_memory_t * memory,
885
                          gx_device *cdev)
886
0
{
887
0
    *pcdev = dev;
888
0
    return 0;
889
0
}
890
891
/*
892
 * Default handler for creating a compositor device when writing the clist. */
893
int
894
gx_default_composite_clist_write_update(const gs_composite_t *pcte, gx_device * dev,
895
                gx_device ** pcdev, gs_gstate * pgs, gs_memory_t * mem)
896
167k
{
897
167k
    *pcdev = dev;   /* Do nothing -> return the same device */
898
167k
    return 0;
899
167k
}
900
901
/* Default handler for adjusting a compositor's CTM. */
902
int
903
gx_default_composite_adjust_ctm(gs_composite_t *pcte, int x0, int y0, gs_gstate *pgs)
904
8.74M
{
905
8.74M
    return 0;
906
8.74M
}
907
908
/*
909
 * Default check for closing compositor.
910
 */
911
gs_compositor_closing_state
912
gx_default_composite_is_closing(const gs_composite_t *this, gs_composite_t **pcte, gx_device *dev)
913
0
{
914
0
    return COMP_ENQUEUE;
915
0
}
916
917
/*
918
 * Default check whether a next operation is friendly to the compositor.
919
 */
920
bool
921
gx_default_composite_is_friendly(const gs_composite_t *this, byte cmd0, byte cmd1)
922
54.1k
{
923
54.1k
    return false;
924
54.1k
}
925
926
/*
927
 * Default handler for updating the clist device when reading a compositing
928
 * device.
929
 */
930
int
931
gx_default_composite_clist_read_update(gs_composite_t *pxcte, gx_device * cdev,
932
                gx_device * tdev, gs_gstate * pgs, gs_memory_t * mem)
933
8.74M
{
934
8.74M
    return 0;     /* Do nothing */
935
8.74M
}
936
937
/*
938
 * Default handler for get_cropping returns no cropping.
939
 */
940
int
941
gx_default_composite_get_cropping(const gs_composite_t *pxcte, int *ry, int *rheight,
942
                                  int cropping_min, int cropping_max)
943
167k
{
944
167k
    return 0;     /* No cropping. */
945
167k
}
946
947
int
948
gx_default_initialize_device(gx_device *dev)
949
0
{
950
0
    return 0;
951
0
}
952
953
int
954
gx_default_dev_spec_op(gx_device *pdev, int dev_spec_op, void *data, int size)
955
76.4M
{
956
76.4M
    switch(dev_spec_op) {
957
0
        case gxdso_form_begin:
958
0
        case gxdso_form_end:
959
2.58k
        case gxdso_pattern_can_accum:
960
2.58k
        case gxdso_pattern_start_accum:
961
2.58k
        case gxdso_pattern_finish_accum:
962
37.7k
        case gxdso_pattern_load:
963
1.57M
        case gxdso_pattern_shading_area:
964
1.63M
        case gxdso_pattern_is_cpath_accum:
965
1.63M
        case gxdso_pattern_handles_clip_path:
966
1.65M
        case gxdso_is_pdf14_device:
967
4.95M
        case gxdso_supports_devn:
968
4.96M
        case gxdso_supports_hlcolor:
969
5.10M
        case gxdso_supports_saved_pages:
970
5.10M
        case gxdso_needs_invariant_palette:
971
5.25M
        case gxdso_supports_iccpostrender:
972
5.43M
        case gxdso_supports_alpha:
973
5.46M
        case gxdso_pdf14_sep_device:
974
5.91M
        case gxdso_supports_pattern_transparency:
975
5.91M
        case gxdso_overprintsim_state:
976
6.01M
        case gxdso_skip_icc_component_validation:
977
6.01M
            return 0;
978
55
        case gxdso_pattern_shfill_doesnt_need_path:
979
55
            return (dev_proc(pdev, fill_path) == gx_default_fill_path);
980
5.99M
        case gxdso_is_std_cmyk_1bit:
981
5.99M
            return (dev_proc(pdev, map_cmyk_color) == cmyk_1bit_map_cmyk_color);
982
0
        case gxdso_interpolate_antidropout:
983
0
            return pdev->color_info.use_antidropout_downscaler;
984
257k
        case gxdso_interpolate_threshold:
985
257k
            if ((pdev->color_info.num_components == 1 &&
986
257k
                 pdev->color_info.max_gray < 15) ||
987
257k
                (pdev->color_info.num_components > 1 &&
988
253k
                 pdev->color_info.max_color < 15)) {
989
                /* If we are a limited color device (i.e. we are halftoning)
990
                 * then only interpolate if we are upscaling by at least 4 */
991
146k
                return 4;
992
146k
            }
993
110k
            return 0; /* Otherwise no change */
994
2.76M
        case gxdso_get_dev_param:
995
2.76M
            {
996
2.76M
                dev_param_req_t *request = (dev_param_req_t *)data;
997
2.76M
                return gx_default_get_param(pdev, request->Param, request->list);
998
257k
            }
999
1.30M
        case gxdso_current_output_device:
1000
1.30M
            {
1001
1.30M
                *(gx_device **)data = pdev;
1002
1.30M
                return 0;
1003
257k
            }
1004
7.53k
        case gxdso_copy_color_is_fast:
1005
7.53k
            return (dev_proc(pdev, copy_color) != gx_default_copy_color);
1006
923k
        case gxdso_is_encoding_direct:
1007
923k
            if (pdev->color_info.depth != 8 * pdev->color_info.num_components)
1008
0
                return 0;
1009
923k
            return (dev_proc(pdev, encode_color) == gx_default_encode_color ||
1010
923k
                    dev_proc(pdev, encode_color) == gx_default_rgb_map_rgb_color);
1011
        /* Just ignore information about events */
1012
0
        case gxdso_event_info:
1013
0
            return 0;
1014
5.03M
        case gxdso_overprint_active:
1015
5.03M
            return 0;
1016
76.4M
    }
1017
76.4M
    return_error(gs_error_undefined);
1018
76.4M
}
1019
1020
int
1021
gx_default_fill_rectangle_hl_color(gx_device *pdev,
1022
    const gs_fixed_rect *rect,
1023
    const gs_gstate *pgs, const gx_drawing_color *pdcolor,
1024
    const gx_clip_path *pcpath)
1025
0
{
1026
0
    return_error(gs_error_rangecheck);
1027
0
}
1028
1029
int
1030
gx_default_include_color_space(gx_device *pdev, gs_color_space *cspace,
1031
        const byte *res_name, int name_length)
1032
0
{
1033
0
    return 0;
1034
0
}
1035
1036
/*
1037
 * If a device wants to determine an equivalent color for its spot colors then
1038
 * it needs to implement this method.  See comments at the start of
1039
 * src/gsequivc.c.
1040
 */
1041
int
1042
gx_default_update_spot_equivalent_colors(gx_device *pdev, const gs_gstate * pgs, const gs_color_space *pcs)
1043
2.15k
{
1044
2.15k
    return 0;
1045
2.15k
}
1046
1047
/*
1048
 * If a device wants to determine implement support for spot colors then
1049
 * it needs to implement this method.
1050
 */
1051
gs_devn_params *
1052
gx_default_ret_devn_params(gx_device *pdev)
1053
59.2M
{
1054
59.2M
    return NULL;
1055
59.2M
}
1056
1057
int
1058
gx_default_process_page(gx_device *dev, gx_process_page_options_t *options)
1059
0
{
1060
0
    gs_int_rect rect;
1061
0
    int code = 0;
1062
0
    void *buffer = NULL;
1063
1064
    /* Possible future improvements in here could be given by us dividing the
1065
     * page up into n chunks, and spawning a thread per chunk to do the
1066
     * process_fn call on. n could be given by NumRenderingThreads. This
1067
     * would give us multi-core advantages even without clist. */
1068
0
    if (options->init_buffer_fn) {
1069
0
        code = options->init_buffer_fn(options->arg, dev, dev->memory, dev->width, dev->height, &buffer);
1070
0
        if (code < 0)
1071
0
            return code;
1072
0
    }
1073
1074
0
    rect.p.x = 0;
1075
0
    rect.p.y = 0;
1076
0
    rect.q.x = dev->width;
1077
0
    rect.q.y = dev->height;
1078
0
    if (options->process_fn)
1079
0
        code = options->process_fn(options->arg, dev, dev, &rect, buffer);
1080
0
    if (code >= 0 && options->output_fn)
1081
0
        code = options->output_fn(options->arg, dev, buffer);
1082
1083
0
    if (options->free_buffer_fn)
1084
0
        options->free_buffer_fn(options->arg, dev, dev->memory, buffer);
1085
1086
0
    return code;
1087
0
}
1088
1089
int
1090
gx_default_begin_transparency_group(gx_device *dev, const gs_transparency_group_params_t *ptgp, const gs_rect *pbbox, gs_gstate *pgs, gs_memory_t *mem)
1091
0
{
1092
0
    return 0;
1093
0
}
1094
1095
int
1096
gx_default_end_transparency_group(gx_device *dev, gs_gstate *pgs)
1097
0
{
1098
0
    return 0;
1099
0
}
1100
1101
int
1102
gx_default_begin_transparency_mask(gx_device *dev, const gx_transparency_mask_params_t *ptgp, const gs_rect *pbbox, gs_gstate *pgs, gs_memory_t *mem)
1103
0
{
1104
0
    return 0;
1105
0
}
1106
1107
int
1108
gx_default_end_transparency_mask(gx_device *dev, gs_gstate *pgs)
1109
0
{
1110
0
    return 0;
1111
0
}
1112
1113
int
1114
gx_default_discard_transparency_layer(gx_device *dev, gs_gstate *pgs)
1115
0
{
1116
0
    return 0;
1117
0
}
1118
1119
int
1120
gx_default_push_transparency_state(gx_device *dev, gs_gstate *pgs)
1121
0
{
1122
0
    return 0;
1123
0
}
1124
1125
int
1126
gx_default_pop_transparency_state(gx_device *dev, gs_gstate *pgs)
1127
0
{
1128
0
    return 0;
1129
0
}
1130
1131
int
1132
gx_default_put_image(gx_device *dev, gx_device *mdev, const byte **buffers, int num_chan, int x, int y, int width, int height, int row_stride, int alpha_plane_index, int tag_plane_index)
1133
6.33k
{
1134
6.33k
    return_error(gs_error_undefined);
1135
6.33k
}
1136
1137
int
1138
gx_default_no_copy_alpha_hl_color(gx_device * dev, const byte * data, int data_x, int raster, gx_bitmap_id id, int x, int y, int width, int height, const gx_drawing_color *pdcolor, int depth)
1139
0
{
1140
0
    return_error(gs_error_undefined);
1141
0
}
1142
1143
int
1144
gx_default_copy_planes(gx_device *dev, const byte *data, int data_x, int raster, gx_bitmap_id id, int x, int y, int width, int height, int plane_height)
1145
0
{
1146
0
    return_error(gs_error_undefined);
1147
0
}
1148
1149
/* ---------------- Default per-instance procedures ---------------- */
1150
1151
int
1152
gx_default_install(gx_device * dev, gs_gstate * pgs)
1153
375k
{
1154
375k
    return 0;
1155
375k
}
1156
1157
int
1158
gx_default_begin_page(gx_device * dev, gs_gstate * pgs)
1159
448k
{
1160
448k
    return 0;
1161
448k
}
1162
1163
int
1164
gx_default_end_page(gx_device * dev, int reason, gs_gstate * pgs)
1165
546k
{
1166
546k
    return (reason != 2 ? 1 : 0);
1167
546k
}
1168
1169
void
1170
gx_default_set_graphics_type_tag(gx_device *dev, gs_graphics_type_tag_t graphics_type_tag)
1171
1.33M
{
1172
    /* set the tag but carefully preserve GS_DEVICE_ENCODES_TAGS */
1173
1.33M
    dev->graphics_type_tag = (dev->graphics_type_tag & GS_DEVICE_ENCODES_TAGS) | graphics_type_tag;
1174
1.33M
}
1175
1176
/* ---------------- Device subclassing procedures ---------------- */
1177
1178
/* Non-obvious code. The 'dest_procs' is the 'procs' memory occupied by the original device that we decided to subclass,
1179
 * 'src_procs' is the newly allocated piece of memory, to which we have already copied the content of the
1180
 * original device (including the procs), prototype is the device structure prototype for the subclassing device.
1181
 * Here we copy the methods from the prototype to the original device procs memory *but* if the original (src_procs)
1182
 * device had a NULL method, we make the new device procs have a NULL method too.
1183
 * The reason for ths is ugly, there are some places in the graphics library which explicitly check for
1184
 * a device having a NULL method and take different code paths depending on the result.
1185
 * Now in general we expect subclassing devices to implement *every* method, so if we didn't copy
1186
 * over NULL methods present in the original source device then the code path could be inappropriate for
1187
 * that underlying (now subclassed) device.
1188
 */
1189
/* November 10th 2017 Restored the original behaviour of the device methods, they should now never be NULL.
1190
 * Howwever, there are still places in the code which take different code paths if the device method is (now)
1191
 * the default device method, rather than a device-specific method.
1192
 * So instead of checking for NULL, we now need to check against the default implementation, and *NOT* copy the
1193
 * prototype (subclass device) method if the original device had the default implementation.
1194
 * I suspect a combination of forwarding and subclassing devices will not work properly for this reason.
1195
 */
1196
int gx_copy_device_procs(gx_device *dest, const gx_device *src, const gx_device *pprototype)
1197
20.7k
{
1198
20.7k
    gx_device prototype = *pprototype;
1199
1200
    /* In the new (as of 2021) world, the prototype does not contain
1201
     * device procs. We need to call the 'initialize_device_procs'
1202
     * function to properly populate the procs array. We can't write to
1203
     * the const prototype pointer we are passed in, so copy it to a
1204
     * local block, and initialize that instead, */
1205
20.7k
    prototype.initialize_device_procs(&prototype);
1206
    /* Fill in missing entries with the global defaults */
1207
20.7k
    gx_device_fill_in_procs(&prototype);
1208
1209
20.7k
    if (dest->initialize_device_procs == NULL)
1210
0
       dest->initialize_device_procs = prototype.initialize_device_procs;
1211
1212
20.7k
    set_dev_proc(dest, initialize_device, dev_proc(&prototype, initialize_device));
1213
20.7k
    set_dev_proc(dest, open_device, dev_proc(&prototype, open_device));
1214
20.7k
    set_dev_proc(dest, get_initial_matrix, dev_proc(&prototype, get_initial_matrix));
1215
20.7k
    set_dev_proc(dest, sync_output, dev_proc(&prototype, sync_output));
1216
20.7k
    set_dev_proc(dest, output_page, dev_proc(&prototype, output_page));
1217
20.7k
    set_dev_proc(dest, close_device, dev_proc(&prototype, close_device));
1218
20.7k
    set_dev_proc(dest, map_rgb_color, dev_proc(&prototype, map_rgb_color));
1219
20.7k
    set_dev_proc(dest, map_color_rgb, dev_proc(&prototype, map_color_rgb));
1220
20.7k
    set_dev_proc(dest, fill_rectangle, dev_proc(&prototype, fill_rectangle));
1221
20.7k
    set_dev_proc(dest, copy_mono, dev_proc(&prototype, copy_mono));
1222
20.7k
    set_dev_proc(dest, copy_color, dev_proc(&prototype, copy_color));
1223
20.7k
    set_dev_proc(dest, get_params, dev_proc(&prototype, get_params));
1224
20.7k
    set_dev_proc(dest, put_params, dev_proc(&prototype, put_params));
1225
20.7k
    set_dev_proc(dest, map_cmyk_color, dev_proc(&prototype, map_cmyk_color));
1226
20.7k
    set_dev_proc(dest, get_page_device, dev_proc(&prototype, get_page_device));
1227
20.7k
    set_dev_proc(dest, get_alpha_bits, dev_proc(&prototype, get_alpha_bits));
1228
20.7k
    set_dev_proc(dest, copy_alpha, dev_proc(&prototype, copy_alpha));
1229
20.7k
    set_dev_proc(dest, fill_path, dev_proc(&prototype, fill_path));
1230
20.7k
    set_dev_proc(dest, stroke_path, dev_proc(&prototype, stroke_path));
1231
20.7k
    set_dev_proc(dest, fill_trapezoid, dev_proc(&prototype, fill_trapezoid));
1232
20.7k
    set_dev_proc(dest, fill_parallelogram, dev_proc(&prototype, fill_parallelogram));
1233
20.7k
    set_dev_proc(dest, fill_triangle, dev_proc(&prototype, fill_triangle));
1234
20.7k
    set_dev_proc(dest, draw_thin_line, dev_proc(&prototype, draw_thin_line));
1235
20.7k
    set_dev_proc(dest, strip_tile_rectangle, dev_proc(&prototype, strip_tile_rectangle));
1236
20.7k
    set_dev_proc(dest, get_clipping_box, dev_proc(&prototype, get_clipping_box));
1237
20.7k
    set_dev_proc(dest, begin_typed_image, dev_proc(&prototype, begin_typed_image));
1238
20.7k
    set_dev_proc(dest, get_bits_rectangle, dev_proc(&prototype, get_bits_rectangle));
1239
20.7k
    set_dev_proc(dest, composite, dev_proc(&prototype, composite));
1240
20.7k
    set_dev_proc(dest, get_hardware_params, dev_proc(&prototype, get_hardware_params));
1241
20.7k
    set_dev_proc(dest, text_begin, dev_proc(&prototype, text_begin));
1242
20.7k
    set_dev_proc(dest, discard_transparency_layer, dev_proc(&prototype, discard_transparency_layer));
1243
20.7k
    set_dev_proc(dest, get_color_mapping_procs, dev_proc(&prototype, get_color_mapping_procs));
1244
20.7k
    set_dev_proc(dest, get_color_comp_index, dev_proc(&prototype, get_color_comp_index));
1245
20.7k
    set_dev_proc(dest, encode_color, dev_proc(&prototype, encode_color));
1246
20.7k
    set_dev_proc(dest, decode_color, dev_proc(&prototype, decode_color));
1247
20.7k
    set_dev_proc(dest, fill_rectangle_hl_color, dev_proc(&prototype, fill_rectangle_hl_color));
1248
20.7k
    set_dev_proc(dest, include_color_space, dev_proc(&prototype, include_color_space));
1249
20.7k
    set_dev_proc(dest, fill_linear_color_scanline, dev_proc(&prototype, fill_linear_color_scanline));
1250
20.7k
    set_dev_proc(dest, fill_linear_color_trapezoid, dev_proc(&prototype, fill_linear_color_trapezoid));
1251
20.7k
    set_dev_proc(dest, fill_linear_color_triangle, dev_proc(&prototype, fill_linear_color_triangle));
1252
20.7k
    set_dev_proc(dest, update_spot_equivalent_colors, dev_proc(&prototype, update_spot_equivalent_colors));
1253
20.7k
    set_dev_proc(dest, ret_devn_params, dev_proc(&prototype, ret_devn_params));
1254
20.7k
    set_dev_proc(dest, fillpage, dev_proc(&prototype, fillpage));
1255
20.7k
    set_dev_proc(dest, push_transparency_state, dev_proc(&prototype, push_transparency_state));
1256
20.7k
    set_dev_proc(dest, pop_transparency_state, dev_proc(&prototype, pop_transparency_state));
1257
20.7k
    set_dev_proc(dest, dev_spec_op, dev_proc(&prototype, dev_spec_op));
1258
20.7k
    set_dev_proc(dest, get_profile, dev_proc(&prototype, get_profile));
1259
20.7k
    set_dev_proc(dest, strip_copy_rop2, dev_proc(&prototype, strip_copy_rop2));
1260
20.7k
    set_dev_proc(dest, strip_tile_rect_devn, dev_proc(&prototype, strip_tile_rect_devn));
1261
20.7k
    set_dev_proc(dest, process_page, dev_proc(&prototype, process_page));
1262
20.7k
    set_dev_proc(dest, transform_pixel_region, dev_proc(&prototype, transform_pixel_region));
1263
20.7k
    set_dev_proc(dest, fill_stroke_path, dev_proc(&prototype, fill_stroke_path));
1264
20.7k
    set_dev_proc(dest, lock_pattern, dev_proc(&prototype, lock_pattern));
1265
1266
    /*
1267
     * We absolutely must set the 'set_graphics_type_tag' to the default subclass one
1268
     * even if the subclassed device is using the default. This is because the
1269
     * default implementation sets a flag in the device structure, and if we
1270
     * copy the default method, we'll end up setting the flag in the subclassing device
1271
     * instead of the subclassed device!
1272
     */
1273
20.7k
    set_dev_proc(dest, set_graphics_type_tag, dev_proc(&prototype, set_graphics_type_tag));
1274
1275
    /* These are the routines whose existence is checked against the default at
1276
     * some point in the code. The code path differs when the device implements a
1277
     * method other than the default, so the subclassing device needs to ensure that
1278
     * if the subclassed device has one of these methods set to the default, we
1279
     * do not overwrite the default method.
1280
     */
1281
20.7k
    if (dev_proc(src, fill_mask) != gx_default_fill_mask)
1282
13.0k
        set_dev_proc(dest, fill_mask, dev_proc(&prototype, fill_mask));
1283
20.7k
    if (dev_proc(src, begin_transparency_group) != gx_default_begin_transparency_group)
1284
0
        set_dev_proc(dest, begin_transparency_group, dev_proc(&prototype, begin_transparency_group));
1285
20.7k
    if (dev_proc(src, end_transparency_group) != gx_default_end_transparency_group)
1286
0
        set_dev_proc(dest, end_transparency_group, dev_proc(&prototype, end_transparency_group));
1287
20.7k
    if (dev_proc(src, put_image) != gx_default_put_image)
1288
0
        set_dev_proc(dest, put_image, dev_proc(&prototype, put_image));
1289
20.7k
    if (dev_proc(src, copy_planes) != gx_default_copy_planes)
1290
0
        set_dev_proc(dest, copy_planes, dev_proc(&prototype, copy_planes));
1291
20.7k
    if (dev_proc(src, copy_alpha_hl_color) != gx_default_no_copy_alpha_hl_color)
1292
0
        set_dev_proc(dest, copy_alpha_hl_color, dev_proc(&prototype, copy_alpha_hl_color));
1293
1294
20.7k
    return 0;
1295
20.7k
}
1296
1297
int gx_device_subclass(gx_device *dev_to_subclass, gx_device *new_prototype, unsigned int private_data_size)
1298
20.7k
{
1299
20.7k
    gx_device *child_dev;
1300
20.7k
    void *psubclass_data;
1301
20.7k
    gs_memory_struct_type_t *a_std, *b_std = NULL;
1302
20.7k
    int dynamic = dev_to_subclass->stype_is_dynamic;
1303
20.7k
    char *ptr, *ptr1;
1304
1305
    /* If this happens we are stuffed, as there is no way to get hold
1306
     * of the original device's stype structure, which means we cannot
1307
     * allocate a replacement structure. Abort if so.
1308
     * Also abort if the new_prototype device struct is too large.
1309
     */
1310
20.7k
    if (!dev_to_subclass->stype ||
1311
20.7k
        dev_to_subclass->stype->ssize < new_prototype->params_size)
1312
0
        return_error(gs_error_VMerror);
1313
1314
    /* We make a 'stype' structure for our new device, and copy the old stype into it
1315
     * This means our new device will always have the 'stype_is_dynamic' flag set
1316
     */
1317
20.7k
    a_std = (gs_memory_struct_type_t *)
1318
20.7k
        gs_alloc_bytes_immovable(dev_to_subclass->memory->non_gc_memory, sizeof(*a_std),
1319
20.7k
                                 "gs_device_subclass(stype)");
1320
20.7k
    if (!a_std)
1321
0
        return_error(gs_error_VMerror);
1322
20.7k
    *a_std = *dev_to_subclass->stype;
1323
20.7k
    a_std->ssize = dev_to_subclass->params_size;
1324
1325
20.7k
    if (!dynamic) {
1326
20.7k
        b_std = (gs_memory_struct_type_t *)
1327
20.7k
            gs_alloc_bytes_immovable(dev_to_subclass->memory->non_gc_memory, sizeof(*b_std),
1328
20.7k
                                     "gs_device_subclass(stype)");
1329
20.7k
        if (!b_std)
1330
0
            return_error(gs_error_VMerror);
1331
20.7k
    }
1332
1333
    /* Allocate a device structure for the new child device */
1334
20.7k
    child_dev = gs_alloc_struct_immovable(dev_to_subclass->memory->stable_memory, gx_device, a_std,
1335
20.7k
                                        "gs_device_subclass(device)");
1336
20.7k
    if (child_dev == 0) {
1337
0
        gs_free_const_object(dev_to_subclass->memory->non_gc_memory, a_std, "gs_device_subclass(stype)");
1338
0
        gs_free_const_object(dev_to_subclass->memory->non_gc_memory, b_std, "gs_device_subclass(stype)");
1339
0
        return_error(gs_error_VMerror);
1340
0
    }
1341
1342
    /* Make sure all methods are filled in, note this won't work for a forwarding device
1343
     * so forwarding devices will have to be filled in before being subclassed. This doesn't fill
1344
     * in the fill_rectangle proc, that gets done in the ultimate device's open proc.
1345
     */
1346
20.7k
    gx_device_fill_in_procs(dev_to_subclass);
1347
20.7k
    memcpy(child_dev, dev_to_subclass, dev_to_subclass->stype->ssize);
1348
20.7k
    child_dev->stype = a_std;
1349
20.7k
    child_dev->stype_is_dynamic = 1;
1350
1351
    /* At this point, the only counted reference to the child is from its parent, and we need it to use the right allocator */
1352
20.7k
    rc_init(child_dev, dev_to_subclass->memory->stable_memory, 1);
1353
1354
20.7k
    psubclass_data = (void *)gs_alloc_bytes(dev_to_subclass->memory->non_gc_memory, private_data_size, "subclass memory for subclassing device");
1355
20.7k
    if (psubclass_data == 0){
1356
0
        gs_free_const_object(dev_to_subclass->memory->non_gc_memory, b_std, "gs_device_subclass(stype)");
1357
        /* We *don't* want to run the finalize routine. This would free the stype and
1358
         * properly handle the icc_struct and PageList, but for devices with a custom
1359
         * finalize (eg psdcmyk) it might also free memory it had allocated, and we're
1360
         * still pointing at that memory in the parent.
1361
         */
1362
0
        a_std->finalize = NULL;
1363
0
        gs_set_object_type(dev_to_subclass->memory->stable_memory, child_dev, a_std);
1364
0
        gs_free_object(dev_to_subclass->memory->stable_memory, child_dev, "free subclass memory for subclassing device");
1365
0
        gs_free_const_object(dev_to_subclass->memory->non_gc_memory, a_std, "gs_device_subclass(stype)");
1366
0
        return_error(gs_error_VMerror);
1367
0
    }
1368
20.7k
    memset(psubclass_data, 0x00, private_data_size);
1369
1370
20.7k
    gx_copy_device_procs(dev_to_subclass, child_dev, new_prototype);
1371
20.7k
    dev_to_subclass->finalize = new_prototype->finalize;
1372
20.7k
    dev_to_subclass->dname = new_prototype->dname;
1373
20.7k
    if (dev_to_subclass->icc_struct)
1374
20.7k
        rc_increment(dev_to_subclass->icc_struct);
1375
20.7k
    if (dev_to_subclass->PageList)
1376
20.7k
        rc_increment(dev_to_subclass->PageList);
1377
20.7k
    if (dev_to_subclass->NupControl)
1378
20.7k
        rc_increment(dev_to_subclass->NupControl);
1379
1380
20.7k
    dev_to_subclass->page_procs = new_prototype->page_procs;
1381
20.7k
    gx_subclass_fill_in_page_procs(dev_to_subclass);
1382
1383
    /* In case the new device we're creating has already been initialised, copy
1384
     * its additional data.
1385
     */
1386
20.7k
    ptr = ((char *)dev_to_subclass) + sizeof(gx_device);
1387
20.7k
    ptr1 = ((char *)new_prototype) + sizeof(gx_device);
1388
20.7k
    memcpy(ptr, ptr1, new_prototype->params_size - sizeof(gx_device));
1389
1390
    /* If the original device's stype structure was dynamically allocated, we need
1391
     * to 'fixup' the contents, it's procs need to point to the new device's procs
1392
     * for instance.
1393
     */
1394
20.7k
    if (dynamic) {
1395
0
        if (new_prototype->stype) {
1396
0
            b_std = (gs_memory_struct_type_t *)dev_to_subclass->stype;
1397
0
            *b_std = *new_prototype->stype;
1398
0
            b_std->ssize = a_std->ssize;
1399
0
            dev_to_subclass->stype_is_dynamic = 1;
1400
0
        } else {
1401
0
            gs_free_const_object(child_dev->memory->non_gc_memory, dev_to_subclass->stype,
1402
0
                             "unsubclass");
1403
0
            dev_to_subclass->stype = NULL;
1404
0
            b_std = (gs_memory_struct_type_t *)new_prototype->stype;
1405
0
            dev_to_subclass->stype_is_dynamic = 0;
1406
0
        }
1407
0
    }
1408
20.7k
    else {
1409
20.7k
        *b_std = *new_prototype->stype;
1410
20.7k
        b_std->ssize = a_std->ssize;
1411
20.7k
        dev_to_subclass->stype_is_dynamic = 1;
1412
20.7k
    }
1413
20.7k
    dev_to_subclass->stype = b_std;
1414
    /* We have to patch up the "type" parameters that the memory manage/garbage
1415
     * collector will use, as well.
1416
     */
1417
20.7k
    gs_set_object_type(child_dev->memory, dev_to_subclass, b_std);
1418
1419
20.7k
    dev_to_subclass->subclass_data = psubclass_data;
1420
20.7k
    dev_to_subclass->child = child_dev;
1421
20.7k
    if (child_dev->parent) {
1422
0
        dev_to_subclass->parent = child_dev->parent;
1423
0
        child_dev->parent->child = dev_to_subclass;
1424
0
    }
1425
20.7k
    if (child_dev->child) {
1426
0
        child_dev->child->parent = child_dev;
1427
0
    }
1428
20.7k
    child_dev->parent = dev_to_subclass;
1429
1430
20.7k
    return 0;
1431
20.7k
}
1432
1433
void gx_device_unsubclass(gx_device *dev)
1434
0
{
1435
0
    generic_subclass_data *psubclass_data;
1436
0
    gx_device *parent, *child;
1437
0
    gs_memory_struct_type_t *a_std = 0, *b_std = 0;
1438
0
    int dynamic, ref_count;
1439
0
    gs_memory_t *rcmem;
1440
1441
    /* This should not happen... */
1442
0
    if (!dev)
1443
0
        return;
1444
1445
0
    ref_count = dev->rc.ref_count;
1446
0
    rcmem = dev->rc.memory;
1447
1448
0
    child = dev->child;
1449
0
    psubclass_data = (generic_subclass_data *)dev->subclass_data;
1450
0
    parent = dev->parent;
1451
0
    dynamic = dev->stype_is_dynamic;
1452
1453
    /* We need to account for the fact that we are removing ourselves from
1454
     * the device chain after a clist device has been pushed, due to a
1455
     * compositor action. Since we patched the clist 'composite'
1456
     * method (and target device) when it was pushed.
1457
     * A point to note; we *don't* want to change the forwarding device's
1458
     * 'target', because when we copy the child up to replace 'this' device
1459
     * we do still want the forwarding device to point here. NB its the *child*
1460
     * device that goes away.
1461
     */
1462
0
    if (psubclass_data != NULL && psubclass_data->forwarding_dev != NULL && psubclass_data->saved_compositor_method)
1463
0
        psubclass_data->forwarding_dev->procs.composite = psubclass_data->saved_compositor_method;
1464
1465
    /* If ths device's stype is dynamically allocated, keep a copy of it
1466
     * in case we might need it.
1467
     */
1468
0
    if (dynamic) {
1469
0
        a_std = (gs_memory_struct_type_t *)dev->stype;
1470
0
        if (child)
1471
0
            *a_std = *child->stype;
1472
0
    }
1473
1474
    /* If ths device has any private storage, free it now */
1475
0
    if (psubclass_data)
1476
0
        gs_free_object(dev->memory->non_gc_memory, psubclass_data, "gx_device_unsubclass");
1477
1478
    /* Copy the child device into ths device's memory */
1479
0
    if (child) {
1480
0
        b_std = (gs_memory_struct_type_t *)dev->stype;
1481
0
        rc_decrement(dev->icc_struct, "unsubclass device");
1482
0
        rc_increment(child->icc_struct);
1483
0
        memcpy(dev, child, child->stype->ssize);
1484
        /* Patch back the 'stype' in the memory manager */
1485
0
        gs_set_object_type(child->memory, dev, b_std);
1486
1487
0
        dev->stype = b_std;
1488
        /* The reference count of the subclassing device may have been
1489
         * changed (eg graphics states pointing to it) after we subclassed
1490
         * the device. We need to ensure that we do not overwrite this
1491
         * when we copy back the subclassed device.
1492
         */
1493
0
        dev->rc.ref_count = ref_count;
1494
0
        dev->rc.memory = rcmem;
1495
1496
        /* If we have a chain of devices, make sure the chain beyond the
1497
         * device we're unsubclassing doesn't get broken, we need to
1498
         * detach the lower chain and reattach it at the new highest level.
1499
         */
1500
0
        if (child->child)
1501
0
            child->child->parent = dev;
1502
0
        child->parent->child = child->child;
1503
0
    }
1504
1505
    /* How can we have a subclass device with no child ? Simples; when we
1506
     * hit the end of job restore, the devices are not freed in device
1507
     * chain order. To make sure we don't end up following stale pointers,
1508
     * when a device is freed we remove it from the chain and update
1509
     * any dangling pointers to NULL. When we later free the remaining
1510
     * devices it's possible that their child pointer can then be NULL.
1511
     */
1512
0
    if (child) {
1513
        /* We cannot afford to free the child device if its stype is not
1514
         * dynamic because we can't 'null' the finalise routine, and we
1515
         * cannot permit the device to be finalised because we have copied
1516
         * it up one level, not discarded it. (This shouldn't happen! Child
1517
         * devices are always created with a dynamic stype.) If this ever
1518
         * happens garbage collecton will eventually clean up the memory.
1519
         */
1520
0
        if (child->stype_is_dynamic) {
1521
            /* Make sure that nothing will try to follow the device chain,
1522
             * just security here. */
1523
0
            child->parent = NULL;
1524
0
            child->child = NULL;
1525
1526
            /* We *don't* want to run the finalize routine. This would free
1527
             * the stype and properly handle the icc_struct and PageList,
1528
             * but for devices with a custom finalize (eg psdcmyk) it might
1529
             * also free memory it had allocated, and we're still pointing
1530
             * at that memory in the parent. The indirection through a
1531
             * variable is just to get rid of const warnings.
1532
             */
1533
0
            b_std = (gs_memory_struct_type_t *)child->stype;
1534
0
            gs_free_const_object(dev->memory->non_gc_memory, b_std, "gs_device_unsubclass(stype)");
1535
            /* Make this into a generic device */
1536
0
            child->stype = &st_device;
1537
0
            child->stype_is_dynamic = false;
1538
1539
            /* We can't simply discard the child device, because there may be references to it elsewhere,
1540
               but equally, we really don't want it doing anything, so set the procs so actions are just discarded.
1541
             */
1542
0
            gx_copy_device_procs(child, (gx_device *)&gs_null_device, (gx_device *)&gs_null_device);
1543
1544
            /* Having changed the stype, we need to make sure the memory
1545
             * manager uses it. It keeps a copy in its own data structure,
1546
             * and would use that copy, which would mean it would call the
1547
             * finalize routine that we just patched out.
1548
             */
1549
0
            gs_set_object_type(dev->memory->stable_memory, child, child->stype);
1550
0
            child->finalize = NULL;
1551
            /* Now (finally) free the child memory */
1552
0
            rc_decrement(child, "gx_device_unsubclass(device)");
1553
0
        }
1554
0
    }
1555
0
    dev->parent = parent;
1556
1557
    /* If this device has a dynamic stype, we wnt to keep using it, but we copied
1558
     * the stype pointer from the child when we copied the rest of the device. So
1559
     * we update the stype pointer with the saved pointer to this device's stype.
1560
     */
1561
0
    if (dynamic) {
1562
0
        dev->stype = a_std;
1563
0
        dev->stype_is_dynamic = 1;
1564
0
    } else {
1565
0
        dev->stype_is_dynamic = 0;
1566
0
    }
1567
0
}
1568
1569
int gx_update_from_subclass(gx_device *dev)
1570
84.4k
{
1571
84.4k
    if (!dev->child)
1572
0
        return 0;
1573
1574
84.4k
    memcpy(&dev->color_info, &dev->child->color_info, sizeof(gx_device_color_info));
1575
84.4k
    memcpy(&dev->cached_colors, &dev->child->cached_colors, sizeof(gx_device_cached_colors_t));
1576
84.4k
    dev->max_fill_band = dev->child->max_fill_band;
1577
84.4k
    dev->width = dev->child->width;
1578
84.4k
    dev->height = dev->child->height;
1579
84.4k
    dev->pad = dev->child->pad;
1580
84.4k
    dev->log2_align_mod = dev->child->log2_align_mod;
1581
84.4k
    dev->max_fill_band = dev->child->max_fill_band;
1582
84.4k
    dev->is_planar = dev->child->is_planar;
1583
84.4k
    dev->LeadingEdge = dev->child->LeadingEdge;
1584
84.4k
    memcpy(&dev->ImagingBBox, &dev->child->ImagingBBox, sizeof(dev->child->ImagingBBox));
1585
84.4k
    dev->ImagingBBox_set = dev->child->ImagingBBox_set;
1586
84.4k
    memcpy(&dev->MediaSize, &dev->child->MediaSize, sizeof(dev->child->MediaSize));
1587
84.4k
    memcpy(&dev->HWResolution, &dev->child->HWResolution, sizeof(dev->child->HWResolution));
1588
84.4k
    memcpy(&dev->Margins, &dev->child->Margins, sizeof(dev->child->Margins));
1589
84.4k
    memcpy(&dev->HWMargins, &dev->child->HWMargins, sizeof(dev->child->HWMargins));
1590
84.4k
    dev->FirstPage = dev->child->FirstPage;
1591
84.4k
    dev->LastPage = dev->child->LastPage;
1592
84.4k
    dev->PageCount = dev->child->PageCount;
1593
84.4k
    dev->ShowpageCount = dev->child->ShowpageCount;
1594
84.4k
    dev->NumCopies = dev->child->NumCopies;
1595
84.4k
    dev->NumCopies_set = dev->child->NumCopies_set;
1596
84.4k
    dev->IgnoreNumCopies = dev->child->IgnoreNumCopies;
1597
84.4k
    dev->UseCIEColor = dev->child->UseCIEColor;
1598
84.4k
    dev->LockSafetyParams= dev->child->LockSafetyParams;
1599
84.4k
    dev->band_offset_x = dev->child->band_offset_y;
1600
84.4k
    dev->sgr = dev->child->sgr;
1601
84.4k
    dev->MaxPatternBitmap = dev->child->MaxPatternBitmap;
1602
84.4k
    dev->page_uses_transparency = dev->child->page_uses_transparency;
1603
84.4k
    memcpy(&dev->space_params, &dev->child->space_params, sizeof(gdev_space_params));
1604
84.4k
    dev->graphics_type_tag = dev->child->graphics_type_tag;
1605
1606
84.4k
    return 0;
1607
84.4k
}
1608
1609
int gx_subclass_composite(gx_device *dev, gx_device **pcdev, const gs_composite_t *pcte,
1610
    gs_gstate *pgs, gs_memory_t *memory, gx_device *cdev)
1611
0
{
1612
0
    pdf14_clist_device *p14dev;
1613
0
    generic_subclass_data *psubclass_data;
1614
0
    int code = 0;
1615
1616
0
    p14dev = (pdf14_clist_device *)dev;
1617
0
    psubclass_data = (generic_subclass_data *)p14dev->target->subclass_data;
1618
1619
0
    set_dev_proc(dev, composite, psubclass_data->saved_compositor_method);
1620
1621
0
    if (gs_is_pdf14trans_compositor(pcte) != 0 && strncmp(dev->dname, "pdf14clist", 10) == 0) {
1622
0
        const gs_pdf14trans_t * pdf14pct = (const gs_pdf14trans_t *) pcte;
1623
1624
0
        switch (pdf14pct->params.pdf14_op) {
1625
0
            case PDF14_POP_DEVICE:
1626
0
                {
1627
0
                    pdf14_clist_device *p14dev = (pdf14_clist_device *)dev;
1628
0
                    gx_device *subclass_device;
1629
1630
0
                    p14dev->target->color_info = p14dev->saved_target_color_info;
1631
0
                    if (p14dev->target->child) {
1632
0
                        p14dev->target->child->color_info = p14dev->saved_target_color_info;
1633
1634
0
                        set_dev_proc(p14dev->target->child, encode_color, p14dev->saved_target_encode_color);
1635
0
                        set_dev_proc(p14dev->target->child, decode_color, p14dev->saved_target_decode_color);
1636
0
                        set_dev_proc(p14dev->target->child, get_color_mapping_procs, p14dev->saved_target_get_color_mapping_procs);
1637
0
                        set_dev_proc(p14dev->target->child, get_color_comp_index, p14dev->saved_target_get_color_comp_index);
1638
0
                    }
1639
1640
0
                    pgs->get_cmap_procs = p14dev->save_get_cmap_procs;
1641
0
                    gx_set_cmap_procs(pgs, p14dev->target);
1642
1643
0
                    subclass_device = p14dev->target;
1644
0
                    p14dev->target = p14dev->target->child;
1645
1646
0
                    code = dev_proc(dev, composite)(dev, pcdev, pcte, pgs, memory, cdev);
1647
1648
0
                    p14dev->target = subclass_device;
1649
1650
                    /* We return 0, rather than 1, as we have not created
1651
                     * a new compositor that wraps dev. */
1652
0
                    if (code == 1)
1653
0
                        code = 0;
1654
0
                    return code;
1655
0
                }
1656
0
                break;
1657
0
            default:
1658
0
                code = dev_proc(dev, composite)(dev, pcdev, pcte, pgs, memory, cdev);
1659
0
                break;
1660
0
        }
1661
0
    } else {
1662
0
        code = dev_proc(dev, composite)(dev, pcdev, pcte, pgs, memory, cdev);
1663
0
    }
1664
0
    set_dev_proc(dev, composite, gx_subclass_composite);
1665
0
    return code;
1666
0
}
1667
1668
typedef enum
1669
{
1670
    transform_pixel_region_portrait,
1671
    transform_pixel_region_landscape,
1672
    transform_pixel_region_skew
1673
} transform_pixel_region_posture;
1674
1675
typedef struct gx_default_transform_pixel_region_state_s gx_default_transform_pixel_region_state_t;
1676
1677
typedef int (gx_default_transform_pixel_region_render_fn)(gx_device *dev, gx_default_transform_pixel_region_state_t *state, const unsigned char **buffer, int data_x, gx_cmapper_t *cmapper, const gs_gstate *pgs);
1678
1679
struct gx_default_transform_pixel_region_state_s
1680
{
1681
    gs_memory_t *mem;
1682
    gx_dda_fixed_point pixels;
1683
    gx_dda_fixed_point rows;
1684
    gs_int_rect clip;
1685
    int w;
1686
    int h;
1687
    int spp;
1688
    transform_pixel_region_posture posture;
1689
    gs_logical_operation_t lop;
1690
    byte *line;
1691
    gx_default_transform_pixel_region_render_fn *render;
1692
};
1693
1694
static void
1695
get_portrait_y_extent(gx_default_transform_pixel_region_state_t *state, int *iy, int *ih)
1696
1.76M
{
1697
1.76M
    fixed y0, y1;
1698
1.76M
    gx_dda_fixed row = state->rows.y;
1699
1700
1.76M
    y0 = dda_current(row);
1701
1.76M
    dda_next(row);
1702
1.76M
    y1 = dda_current(row);
1703
1704
1.76M
    if (y1 < y0) {
1705
348k
        fixed t = y1; y1 = y0; y0 = t;
1706
348k
    }
1707
1708
1.76M
    *iy = fixed2int_pixround_perfect(y0);
1709
1.76M
    *ih = fixed2int_pixround_perfect(y1) - *iy;
1710
1.76M
}
1711
1712
static void
1713
get_landscape_x_extent(gx_default_transform_pixel_region_state_t *state, int *ix, int *iw)
1714
0
{
1715
0
    fixed x0, x1;
1716
0
    gx_dda_fixed row = state->rows.x;
1717
1718
0
    x0 = dda_current(row);
1719
0
    dda_next(row);
1720
0
    x1 = dda_current(row);
1721
1722
0
    if (x1 < x0) {
1723
0
        fixed t = x1; x1 = x0; x0 = t;
1724
0
    }
1725
1726
0
    *ix = fixed2int_pixround_perfect(x0);
1727
0
    *iw = fixed2int_pixround_perfect(x1) - *ix;
1728
0
}
1729
1730
static void
1731
get_skew_extents(gx_default_transform_pixel_region_state_t *state, fixed *w, fixed *h)
1732
2.23k
{
1733
2.23k
    fixed x0, x1, y0, y1;
1734
2.23k
    gx_dda_fixed_point row = state->rows;
1735
1736
2.23k
    x0 = dda_current(row.x);
1737
2.23k
    y0 = dda_current(row.y);
1738
2.23k
    dda_next(row.x);
1739
2.23k
    dda_next(row.y);
1740
2.23k
    x1 = dda_current(row.x);
1741
2.23k
    y1 = dda_current(row.y);
1742
1743
2.23k
    *w = x1-x0;
1744
2.23k
    *h = y1-y0;
1745
2.23k
}
1746
1747
static int
1748
transform_pixel_region_render_portrait(gx_device *dev, gx_default_transform_pixel_region_state_t *state, const unsigned char **buffer, int data_x, gx_cmapper_t *cmapper, const gs_gstate *pgs)
1749
855k
{
1750
855k
    gs_logical_operation_t lop = state->lop;
1751
855k
    gx_dda_fixed_point pnext;
1752
855k
    int vci, vdi;
1753
855k
    int irun;     /* int x/rrun */
1754
855k
    int w = state->w;
1755
855k
    int h = state->h;
1756
855k
    int spp = state->spp;
1757
855k
    const byte *data = buffer[0] + data_x * spp;
1758
855k
    const byte *bufend = NULL;
1759
855k
    int code = 0;
1760
855k
    const byte *run;
1761
855k
    int k;
1762
855k
    gx_color_value *conc = &cmapper->conc[0];
1763
855k
    int to_rects;
1764
855k
    gx_cmapper_fn *mapper = cmapper->set_color;
1765
855k
    int minx, maxx;
1766
1767
855k
    if (h == 0)
1768
0
        return 0;
1769
1770
    /* Clip on Y */
1771
855k
    get_portrait_y_extent(state, &vci, &vdi);
1772
855k
    if (vci < state->clip.p.y)
1773
40.0k
        vdi += vci - state->clip.p.y, vci = state->clip.p.y;
1774
855k
    if (vci+vdi > state->clip.q.y)
1775
17.9k
        vdi = state->clip.q.y - vci;
1776
855k
    if (vdi <= 0)
1777
387k
        return 0;
1778
1779
467k
    pnext = state->pixels;
1780
467k
    dda_translate(pnext.x,  (-fixed_epsilon));
1781
467k
    irun = fixed2int_var_rounded(dda_current(pnext.x));
1782
467k
    if_debug5m('b', dev->memory, "[b]y=%d data_x=%d w=%d xt=%f yt=%f\n",
1783
467k
               vci, data_x, w, fixed2float(dda_current(pnext.x)), fixed2float(dda_current(pnext.y)));
1784
467k
    to_rects = (dev->color_info.depth != spp*8);
1785
467k
    if (to_rects == 0) {
1786
467k
        if (dev_proc(dev, dev_spec_op)(dev, gxdso_copy_color_is_fast, NULL, 0) <= 0)
1787
461k
            to_rects = 1;
1788
467k
    }
1789
1790
467k
    minx = state->clip.p.x;
1791
467k
    maxx = state->clip.q.x;
1792
467k
    bufend = data + w * spp;
1793
467k
    if (to_rects) {
1794
55.0M
        while (data < bufend) {
1795
            /* Find the length of the next run. It will either end when we hit
1796
             * the end of the source data, or when the pixel data differs. */
1797
54.6M
            run = data + spp;
1798
182M
            while (1) {
1799
182M
                dda_next(pnext.x);
1800
182M
                if (run >= bufend)
1801
461k
                    break;
1802
182M
                if (memcmp(run, data, spp))
1803
54.1M
                    break;
1804
127M
                run += spp;
1805
127M
            }
1806
            /* So we have a run of pixels from data to run that are all the same. */
1807
            /* This needs to be sped up */
1808
214M
            for (k = 0; k < spp; k++) {
1809
160M
                conc[k] = gx_color_value_from_byte(data[k]);
1810
160M
            }
1811
54.6M
            mapper(cmapper);
1812
            /* Fill the region between irun and fixed2int_var_rounded(pnext.x) */
1813
54.6M
            {
1814
54.6M
                int xi = irun;
1815
54.6M
                int wi = (irun = fixed2int_var_rounded(dda_current(pnext.x))) - xi;
1816
1817
54.6M
                if (wi < 0)
1818
1.66k
                    xi += wi, wi = -wi;
1819
54.6M
                if (xi < minx)
1820
27.5k
                    wi += xi - minx, xi = minx;
1821
54.6M
                if (xi + wi > maxx)
1822
35.8k
                    wi = maxx - xi;
1823
54.6M
                if (wi > 0)
1824
50.6M
                    code = gx_fill_rectangle_device_rop(xi, vci, wi, vdi,
1825
54.6M
                                                        &cmapper->devc, dev, lop);
1826
54.6M
            }
1827
54.6M
            if (code < 0)
1828
0
                goto err;
1829
54.6M
            data = run;
1830
54.6M
        }
1831
461k
    } else {
1832
6.81k
        int pending_left = irun;
1833
6.81k
        int pending_right;
1834
6.81k
        byte *out;
1835
6.81k
        int depth = spp;
1836
6.81k
        if (state->line == NULL) {
1837
66
            state->line = gs_alloc_bytes(state->mem,
1838
66
                                         (size_t)dev->width * depth,
1839
66
                                         "image line");
1840
66
            if (state->line == NULL)
1841
0
                return gs_error_VMerror;
1842
66
        }
1843
6.81k
        out = state->line;
1844
1845
6.81k
        if (minx < 0)
1846
0
            minx = 0;
1847
6.81k
        if (maxx > dev->width)
1848
0
            maxx = dev->width;
1849
1850
6.81k
        if (pending_left < minx)
1851
28
            pending_left = minx;
1852
6.78k
        else if (pending_left > maxx)
1853
0
            pending_left = maxx;
1854
6.81k
        pending_right = pending_left;
1855
1856
1.90M
        while (data < bufend) {
1857
            /* Find the length of the next run. It will either end when we hit
1858
             * the end of the source data, or when the pixel data differs. */
1859
1.89M
            run = data + spp;
1860
3.90M
            while (1) {
1861
3.90M
                dda_next(pnext.x);
1862
3.90M
                if (run >= bufend)
1863
6.81k
                    break;
1864
3.89M
                if (memcmp(run, data, spp))
1865
1.89M
                    break;
1866
2.00M
                run += spp;
1867
2.00M
            }
1868
            /* So we have a run of pixels from data to run that are all the same. */
1869
            /* This needs to be sped up */
1870
7.34M
            for (k = 0; k < spp; k++) {
1871
5.44M
                conc[k] = gx_color_value_from_byte(data[k]);
1872
5.44M
            }
1873
1.89M
            mapper(cmapper);
1874
            /* Fill the region between irun and fixed2int_var_rounded(pnext.x) */
1875
1.89M
            {
1876
1.89M
                int xi = irun;
1877
1.89M
                int wi = (irun = fixed2int_var_rounded(dda_current(pnext.x))) - xi;
1878
1879
1.89M
                if (wi < 0)
1880
0
                    xi += wi, wi = -wi;
1881
1882
1.89M
                if (xi < minx)
1883
136
                    wi += xi - minx, xi = minx;
1884
1.89M
                if (xi + wi > maxx)
1885
30.0k
                    wi = maxx - xi;
1886
1887
1.89M
                if (wi > 0) {
1888
1.86M
                    if (color_is_pure(&cmapper->devc)) {
1889
1.86M
                        gx_color_index color = cmapper->devc.colors.pure;
1890
1.86M
                        int xii = xi * spp;
1891
1892
1.86M
                        if (pending_left > xi)
1893
0
                            pending_left = xi;
1894
1.86M
                        else
1895
1.86M
                            pending_right = xi + wi;
1896
6.19M
                        do {
1897
                            /* Excuse the double shifts below, that's to stop the
1898
                             * C compiler complaining if the color index type is
1899
                             * 32 bits. */
1900
6.19M
                            switch(depth)
1901
6.19M
                            {
1902
0
                            case 8: out[xii++] = ((color>>28)>>28) & 0xff;
1903
0
                            case 7: out[xii++] = ((color>>24)>>24) & 0xff;
1904
0
                            case 6: out[xii++] = ((color>>24)>>16) & 0xff;
1905
0
                            case 5: out[xii++] = ((color>>24)>>8) & 0xff;
1906
0
                            case 4: out[xii++] = (color>>24) & 0xff;
1907
5.73M
                            case 3: out[xii++] = (color>>16) & 0xff;
1908
5.73M
                            case 2: out[xii++] = (color>>8) & 0xff;
1909
6.19M
                            case 1: out[xii++] = color & 0xff;
1910
6.19M
                            }
1911
6.19M
                        } while (--wi != 0);
1912
1.86M
                    } else {
1913
0
                        if (pending_left != pending_right) {
1914
0
                            code = dev_proc(dev, copy_color)(dev, out, pending_left, 0, 0, pending_left, vci, pending_right - pending_left, vdi);
1915
0
                            if (code < 0)
1916
0
                                goto err;
1917
0
                        }
1918
0
                        pending_left = pending_right = xi + (pending_left > xi ? 0 : wi);
1919
0
                        code = gx_fill_rectangle_device_rop(xi, vci, wi, vdi,
1920
0
                                                            &cmapper->devc, dev, lop);
1921
0
                    }
1922
1.86M
                }
1923
1.89M
                if (code < 0)
1924
0
                    goto err;
1925
1.89M
            }
1926
1.89M
            data = run;
1927
1.89M
        }
1928
6.81k
        if (pending_left != pending_right) {
1929
6.78k
            code = dev_proc(dev, copy_color)(dev, out, pending_left, 0, 0, pending_left, vci, pending_right - pending_left, vdi);
1930
6.78k
            if (code < 0)
1931
0
                goto err;
1932
6.78k
        }
1933
6.81k
    }
1934
467k
    return 1;
1935
    /* Save position if error, in case we resume. */
1936
0
err:
1937
0
    buffer[0] = run;
1938
0
    return code;
1939
467k
}
1940
1941
static int
1942
transform_pixel_region_render_landscape(gx_device *dev, gx_default_transform_pixel_region_state_t *state, const unsigned char **buffer, int data_x, gx_cmapper_t *cmapper, const gs_gstate *pgs)
1943
0
{
1944
0
    gs_logical_operation_t lop = state->lop;
1945
0
    gx_dda_fixed_point pnext;
1946
0
    int vci, vdi;
1947
0
    int irun;     /* int x/rrun */
1948
0
    int w = state->w;
1949
0
    int h = state->h;
1950
0
    int spp = state->spp;
1951
0
    const byte *data = buffer[0] + data_x * spp;
1952
0
    const byte *bufend = NULL;
1953
0
    int code = 0;
1954
0
    const byte *run;
1955
0
    int k;
1956
0
    gx_color_value *conc = &cmapper->conc[0];
1957
0
    int to_rects;
1958
0
    gx_cmapper_fn *mapper = cmapper->set_color;
1959
0
    int miny, maxy;
1960
1961
0
    if (h == 0)
1962
0
        return 0;
1963
1964
    /* Clip on X */
1965
0
    get_landscape_x_extent(state, &vci, &vdi);
1966
0
    if (vci < state->clip.p.x)
1967
0
        vdi += vci - state->clip.p.x, vci = state->clip.p.x;
1968
0
    if (vci+vdi > state->clip.q.x)
1969
0
        vdi = state->clip.q.x - vci;
1970
0
    if (vdi <= 0)
1971
0
        return 0;
1972
1973
0
    pnext = state->pixels;
1974
0
    dda_translate(pnext.x,  (-fixed_epsilon));
1975
0
    irun = fixed2int_var_rounded(dda_current(pnext.y));
1976
0
    if_debug5m('b', dev->memory, "[b]y=%d data_x=%d w=%d xt=%f yt=%f\n",
1977
0
               vci, data_x, w, fixed2float(dda_current(pnext.x)), fixed2float(dda_current(pnext.y)));
1978
0
    to_rects = (dev->color_info.depth != spp*8);
1979
0
    if (to_rects == 0) {
1980
0
        if (dev_proc(dev, dev_spec_op)(dev, gxdso_copy_color_is_fast, NULL, 0) <= 0)
1981
0
            to_rects = 1;
1982
0
    }
1983
1984
0
    miny = state->clip.p.y;
1985
0
    maxy = state->clip.q.y;
1986
0
    bufend = data + w * spp;
1987
0
    while (data < bufend) {
1988
        /* Find the length of the next run. It will either end when we hit
1989
         * the end of the source data, or when the pixel data differs. */
1990
0
        run = data + spp;
1991
0
        while (1) {
1992
0
            dda_next(pnext.y);
1993
0
            if (run >= bufend)
1994
0
                break;
1995
0
            if (memcmp(run, data, spp))
1996
0
                break;
1997
0
            run += spp;
1998
0
        }
1999
        /* So we have a run of pixels from data to run that are all the same. */
2000
        /* This needs to be sped up */
2001
0
        for (k = 0; k < spp; k++) {
2002
0
            conc[k] = gx_color_value_from_byte(data[k]);
2003
0
        }
2004
0
        mapper(cmapper);
2005
        /* Fill the region between irun and fixed2int_var_rounded(pnext.y) */
2006
0
        {              /* 90 degree rotated rectangle */
2007
0
            int yi = irun;
2008
0
            int hi = (irun = fixed2int_var_rounded(dda_current(pnext.y))) - yi;
2009
2010
0
            if (hi < 0)
2011
0
                yi += hi, hi = -hi;
2012
0
            if (yi < miny)
2013
0
                hi += yi - miny, yi = miny;
2014
0
            if (yi + hi > maxy)
2015
0
                hi = maxy - yi;
2016
0
            if (hi > 0)
2017
0
                code = gx_fill_rectangle_device_rop(vci, yi, vdi, hi,
2018
0
                                                    &cmapper->devc, dev, lop);
2019
0
        }
2020
0
        if (code < 0)
2021
0
            goto err;
2022
0
        data = run;
2023
0
    }
2024
0
    return 1;
2025
    /* Save position if error, in case we resume. */
2026
0
err:
2027
0
    buffer[0] = run;
2028
0
    return code;
2029
0
}
2030
2031
static int
2032
transform_pixel_region_render_skew(gx_device *dev, gx_default_transform_pixel_region_state_t *state, const unsigned char **buffer, int data_x, gx_cmapper_t *cmapper, const gs_gstate *pgs)
2033
2.23k
{
2034
2.23k
    gs_logical_operation_t lop = state->lop;
2035
2.23k
    gx_dda_fixed_point pnext;
2036
2.23k
    fixed xprev, yprev;
2037
2.23k
    fixed pdyx, pdyy;   /* edge of parallelogram */
2038
2.23k
    int w = state->w;
2039
2.23k
    int h = state->h;
2040
2.23k
    int spp = state->spp;
2041
2.23k
    const byte *data = buffer[0] + data_x * spp;
2042
2.23k
    fixed xpos;     /* x ditto */
2043
2.23k
    fixed ypos;     /* y ditto */
2044
2.23k
    const byte *bufend = data + w * spp;
2045
2.23k
    int code = 0;
2046
2.23k
    int k;
2047
2.23k
    byte initial_run[GX_DEVICE_COLOR_MAX_COMPONENTS] = { 0 };
2048
2.23k
    const byte *prev = &initial_run[0];
2049
2.23k
    gx_cmapper_fn *mapper = cmapper->set_color;
2050
2.23k
    gx_color_value *conc = &cmapper->conc[0];
2051
2052
2.23k
    if (h == 0)
2053
0
        return 0;
2054
2.23k
    pnext = state->pixels;
2055
2.23k
    get_skew_extents(state, &pdyx, &pdyy);
2056
2.23k
    dda_translate(pnext.x,  (-fixed_epsilon));
2057
2.23k
    xprev = dda_current(pnext.x);
2058
2.23k
    yprev = dda_current(pnext.y);
2059
2.23k
    if_debug4m('b', dev->memory, "[b]y=? data_x=%d w=%d xt=%f yt=%f\n",
2060
2.23k
               data_x, w, fixed2float(xprev), fixed2float(yprev));
2061
2.23k
    initial_run[0] = ~data[0];  /* Force intial setting */
2062
303k
    while (data < bufend) {
2063
301k
        dda_next(pnext.x);
2064
301k
        dda_next(pnext.y);
2065
301k
        xpos = dda_current(pnext.x);
2066
301k
        ypos = dda_current(pnext.y);
2067
2068
301k
        if (memcmp(prev, data, spp) != 0)
2069
143k
        {
2070
            /* This needs to be sped up */
2071
331k
            for (k = 0; k < spp; k++) {
2072
188k
                conc[k] = gx_color_value_from_byte(data[k]);
2073
188k
            }
2074
143k
            mapper(cmapper);
2075
143k
        }
2076
        /* Fill the region between */
2077
        /* xprev/yprev and xpos/ypos */
2078
        /* Parallelogram */
2079
301k
        code = (*dev_proc(dev, fill_parallelogram))
2080
301k
                    (dev, xprev, yprev, xpos - xprev, ypos - yprev, pdyx, pdyy,
2081
301k
                     &cmapper->devc, lop);
2082
301k
        xprev = xpos;
2083
301k
        yprev = ypos;
2084
301k
        if (code < 0)
2085
0
            goto err;
2086
301k
        prev = data;
2087
301k
        data += spp;
2088
301k
    }
2089
2.23k
    return 1;
2090
    /* Save position if error, in case we resume. */
2091
0
err:
2092
    /* Only set buffer[0] if we've managed to set prev to something valid. */
2093
0
    if (prev != &initial_run[0]) buffer[0] = prev;
2094
0
    return code;
2095
2.23k
}
2096
2097
static int
2098
gx_default_transform_pixel_region_begin(gx_device *dev, int w, int h, int spp,
2099
                             const gx_dda_fixed_point *pixels, const gx_dda_fixed_point *rows,
2100
                             const gs_int_rect *clip, gs_logical_operation_t lop,
2101
                             gx_default_transform_pixel_region_state_t **statep)
2102
51.6k
{
2103
51.6k
    gx_default_transform_pixel_region_state_t *state;
2104
51.6k
    gs_memory_t *mem = dev->memory->non_gc_memory;
2105
2106
51.6k
    *statep = state = (gx_default_transform_pixel_region_state_t *)gs_alloc_bytes(mem, sizeof(gx_default_transform_pixel_region_state_t), "gx_default_transform_pixel_region_state_t");
2107
51.6k
    if (state == NULL)
2108
0
        return gs_error_VMerror;
2109
51.6k
    state->mem = mem;
2110
51.6k
    state->rows = *rows;
2111
51.6k
    state->pixels = *pixels;
2112
51.6k
    state->clip = *clip;
2113
51.6k
    state->w = w;
2114
51.6k
    state->h = h;
2115
51.6k
    state->spp = spp;
2116
51.6k
    state->lop = lop;
2117
51.6k
    state->line = NULL;
2118
2119
    /* FIXME: Consider sheers here too. Probably happens rarely enough not to be worth it. */
2120
51.6k
    if (rows->x.step.dQ == 0 && rows->x.step.dR == 0 && pixels->y.step.dQ == 0 && pixels->y.step.dR == 0)
2121
51.5k
        state->posture = transform_pixel_region_portrait;
2122
86
    else if (rows->y.step.dQ == 0 && rows->y.step.dR == 0 && pixels->x.step.dQ == 0 && pixels->x.step.dR == 0)
2123
0
        state->posture = transform_pixel_region_landscape;
2124
86
    else
2125
86
        state->posture = transform_pixel_region_skew;
2126
2127
51.6k
    if (state->posture == transform_pixel_region_portrait)
2128
51.5k
        state->render = transform_pixel_region_render_portrait;
2129
86
    else if (state->posture == transform_pixel_region_landscape)
2130
0
        state->render = transform_pixel_region_render_landscape;
2131
86
    else
2132
86
        state->render = transform_pixel_region_render_skew;
2133
2134
51.6k
    return 0;
2135
51.6k
}
2136
2137
static void
2138
step_to_next_line(gx_default_transform_pixel_region_state_t *state)
2139
908k
{
2140
908k
    fixed x = dda_current(state->rows.x);
2141
908k
    fixed y = dda_current(state->rows.y);
2142
2143
908k
    dda_next(state->rows.x);
2144
908k
    dda_next(state->rows.y);
2145
908k
    x = dda_current(state->rows.x) - x;
2146
908k
    y = dda_current(state->rows.y) - y;
2147
908k
    dda_translate(state->pixels.x, x);
2148
908k
    dda_translate(state->pixels.y, y);
2149
908k
}
2150
2151
static int
2152
gx_default_transform_pixel_region_data_needed(gx_device *dev, gx_default_transform_pixel_region_state_t *state)
2153
907k
{
2154
907k
    if (state->posture == transform_pixel_region_portrait) {
2155
905k
        int iy, ih;
2156
2157
905k
        get_portrait_y_extent(state, &iy, &ih);
2158
2159
905k
        if (iy + ih < state->clip.p.y || iy >= state->clip.q.y) {
2160
            /* Skip this line. */
2161
49.9k
            step_to_next_line(state);
2162
49.9k
            return 0;
2163
49.9k
        }
2164
905k
    } else if (state->posture == transform_pixel_region_landscape) {
2165
0
        int ix, iw;
2166
2167
0
        get_landscape_x_extent(state, &ix, &iw);
2168
2169
0
        if (ix + iw < state->clip.p.x || ix >= state->clip.q.x) {
2170
            /* Skip this line. */
2171
0
            step_to_next_line(state);
2172
0
            return 0;
2173
0
        }
2174
0
    }
2175
2176
858k
    return 1;
2177
907k
}
2178
2179
static int
2180
gx_default_transform_pixel_region_process_data(gx_device *dev, gx_default_transform_pixel_region_state_t *state, const unsigned char **buffer, int data_x, gx_cmapper_t *cmapper, const gs_gstate *pgs)
2181
858k
{
2182
858k
    int ret = state->render(dev, state, buffer, data_x, cmapper, pgs);
2183
2184
858k
    step_to_next_line(state);
2185
858k
    return ret;
2186
858k
}
2187
2188
static int
2189
gx_default_transform_pixel_region_end(gx_device *dev, gx_default_transform_pixel_region_state_t *state)
2190
51.6k
{
2191
51.6k
    if (state) {
2192
51.6k
        gs_free_object(state->mem, state->line, "image line");
2193
51.6k
        gs_free_object(state->mem, state, "gx_default_transform_pixel_region_state_t");
2194
51.6k
    }
2195
51.6k
    return 0;
2196
51.6k
}
2197
2198
int
2199
gx_default_transform_pixel_region(gx_device *dev,
2200
                       transform_pixel_region_reason reason,
2201
                       transform_pixel_region_data *data)
2202
1.86M
{
2203
1.86M
    gx_default_transform_pixel_region_state_t *state = (gx_default_transform_pixel_region_state_t *)data->state;
2204
2205
1.86M
    switch (reason)
2206
1.86M
    {
2207
51.6k
    case transform_pixel_region_begin:
2208
51.6k
        return gx_default_transform_pixel_region_begin(dev, data->u.init.w, data->u.init.h, data->u.init.spp, data->u.init.pixels, data->u.init.rows, data->u.init.clip, data->u.init.lop, (gx_default_transform_pixel_region_state_t **)&data->state);
2209
907k
    case transform_pixel_region_data_needed:
2210
907k
        return gx_default_transform_pixel_region_data_needed(dev, state);
2211
858k
    case transform_pixel_region_process_data:
2212
858k
        return gx_default_transform_pixel_region_process_data(dev, state, data->u.process_data.buffer, data->u.process_data.data_x, data->u.process_data.cmapper, data->u.process_data.pgs);
2213
51.6k
    case transform_pixel_region_end:
2214
51.6k
        data->state = NULL;
2215
51.6k
        return gx_default_transform_pixel_region_end(dev, state);
2216
0
    default:
2217
0
        return gs_error_unknownerror;
2218
1.86M
    }
2219
1.86M
}