Coverage Report

Created: 2026-10-28 08:05

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