Coverage Report

Created: 2022-04-16 11:23

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