Coverage Report

Created: 2025-06-10 07:06

/src/ghostpdl/base/gxclrast.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (C) 2001-2025 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  39 Mesa Street, Suite 108A, San Francisco,
13
   CA 94129, USA, for further information.
14
*/
15
16
17
/* Command list interpreter/rasterizer */
18
#include "memory_.h"
19
#include "gx.h"
20
#include "gp.h"                 /* for gp_fmode_rb */
21
#include "gpcheck.h"
22
#include "gserrors.h"
23
#include "gscdefs.h"            /* for image type table */
24
#include "gsbitops.h"
25
#include "gsparams.h"
26
#include "gsstate.h"            /* (should only be gs_gstate) */
27
#include "gstrans.h"    /* for gs_is_pdf14trans_compositor */
28
#include "gxdcolor.h"
29
#include "gxdevice.h"
30
#include "gscoord.h"            /* requires gsmatrix.h */
31
#include "gsdevice.h"           /* for gs_deviceinitialmatrix */
32
#include "gsiparm4.h"
33
#include "gxdevmem.h"           /* must precede gxcldev.h */
34
#include "gxcldev.h"
35
#include "gxclpath.h"
36
#include "gxcmap.h"
37
#include "gxcolor2.h"
38
#include "gxcspace.h"           /* for gs_color_space_type */
39
#include "gxdhtres.h"
40
#include "gxgetbit.h"
41
#include "gxpaint.h"            /* for gx_fill/stroke_params */
42
#include "gxpcolor.h"
43
#include "gxhttile.h"
44
#include "gxiparam.h"
45
#include "gximask.h"
46
#include "gzpath.h"
47
#include "gzcpath.h"
48
#include "gzacpath.h"
49
#include "stream.h"
50
#include "strimpl.h"
51
#include "gxcomp.h"
52
#include "gsserial.h"
53
#include "gxdhtserial.h"
54
#include "gzht.h"
55
#include "gxshade.h"
56
#include "gxshade4.h"
57
#include "gsicc_manage.h"
58
#include "gsicc.h"
59
60
extern_gx_device_halftone_list();
61
extern_gx_image_type_table();
62
63
/* We need color space types for constructing temporary color spaces. */
64
extern const gs_color_space_type gs_color_space_type_Indexed;
65
66
/* Print a bitmap for tracing */
67
#ifdef DEBUG
68
static void
69
cmd_print_bits(gs_memory_t *mem, const byte * data, int width, int height, int raster)
70
{
71
    int i, j;
72
73
    dmlprintf3(mem, "[L]width=%d, height=%d, raster=%d\n",
74
              width, height, raster);
75
    for (i = 0; i < height; i++) {
76
        const byte *row = data + i * raster;
77
78
        dmlprintf(mem, "[L]");
79
        for (j = 0; j < raster; j++)
80
            dmprintf1(mem, " %02x", row[j]);
81
        dmputc(mem, '\n');
82
    }
83
}
84
#else
85
#  define cmd_print_bits(mem, data, width, height, raster) DO_NOTHING
86
#endif
87
88
/* Get a variable-length integer operand. */
89
#define cmd_getw(var, p)\
90
21.2M
  BEGIN\
91
21.2M
    if ( *p < 0x80 ) var = *p++;\
92
21.2M
    else { const byte *_cbp; var = cmd_get_w(p, &_cbp); p = _cbp; }\
93
21.2M
  END
94
95
static long
96
cmd_get_w(const byte * p, const byte ** rp)
97
12.5M
{
98
12.5M
    int val = *p++ & 0x7f;
99
12.5M
    int shift = 7;
100
101
20.6M
    for (; val |= (int)(*p & 0x7f) << shift, *p++ > 0x7f; shift += 7);
102
12.5M
    *rp = p;
103
12.5M
    return val;
104
12.5M
}
105
106
/* Get a variable-length fractional operand. */
107
#define cmd_getfrac(var, p)\
108
13.2M
  BEGIN\
109
13.2M
    if ( !(*p & 1) ) var = (*p++) << 24;\
110
13.2M
    else { const byte *_cbp; var = cmd_get_frac31(p, &_cbp); p = _cbp; }\
111
13.2M
  END
112
static frac31
113
cmd_get_frac31(const byte * p, const byte ** rp)
114
4.50M
{
115
4.50M
    frac31 val = (*p++ & 0xFE) << 24;
116
4.50M
    int shift = 24 - 7;
117
118
4.50M
    for (; val |= (frac31)(*p & 0xFE) << shift, *p++ & 1; shift -= 7);
119
4.50M
    *rp = p;
120
4.50M
    return val;
121
4.50M
}
122
123
/*
124
 * Define the structure for keeping track of the command reading buffer.
125
 *
126
 * The ptr member is only used for passing the current pointer to, and
127
 * receiving an updated pointer from, commands implemented as separate
128
 * procedures: normally it is kept in a register.
129
 */
130
typedef struct command_buf_s {
131
    byte *data;                 /* actual buffer, guaranteed aligned */
132
    uint size;
133
    const byte *ptr;            /* next byte to be read (see above) */
134
    const byte *warn_limit;     /* refill warning point */
135
    const byte *end;            /* byte just beyond valid data */
136
    stream *s;                  /* for refilling buffer */
137
    int end_status;
138
} command_buf_t;
139
140
/* Set the end of a command buffer. */
141
static void
142
set_cb_end(command_buf_t *pcb, const byte *end)
143
1.80M
{
144
1.80M
    pcb->end = end;
145
1.80M
    pcb->warn_limit = pcb->data + (pcb->size - cmd_largest_size + 1);
146
1.80M
    if ( pcb->warn_limit > pcb->end )
147
181k
        pcb->warn_limit = pcb->end;     /**** This is dangerous. Other places ****/
148
                                        /**** assume that the limit is a soft ****/
149
                                        /**** limit and should check 'end'    ****/
150
1.80M
}
151
152
static inline void
153
advance_buffer(command_buf_t *pcb, const byte *cbp)
154
1.62M
{
155
#ifdef DEBUG
156
    stream_state *st = pcb->s->state;
157
158
    top_up_offset_map(st, pcb->data, cbp, pcb->end);
159
#endif
160
1.62M
    memmove(pcb->data, cbp, pcb->end - cbp);
161
1.62M
}
162
163
static inline void
164
next_is_skip(command_buf_t *pcb)
165
4.79k
{
166
#ifdef DEBUG
167
    stream_state *st = pcb->s->state;
168
169
    offset_map_next_data_out_of_band(st);
170
#endif
171
4.79k
}
172
173
/* Read more data into a command buffer. */
174
static int
175
top_up_cbuf(command_buf_t *pcb, const byte **pcbp)
176
2.32M
{
177
2.32M
    uint nread;
178
2.32M
    const byte *cbp = *pcbp;
179
2.32M
    byte *cb_top = pcb->data + (pcb->end - cbp);
180
181
2.32M
    if (cbp < pcb->data || cbp > pcb->end) {
182
0
        errprintf(pcb->s->memory, "Clist I/O error: cbp outside of buffer\n");
183
0
        return (gs_error_ioerror);
184
0
    }
185
186
2.32M
    if (seofp(pcb->s)) {
187
        /* Can't use offset_map, because s_close resets s->state. Don't top up. */
188
702k
        pcb->end_status = pcb->s->end_status;
189
702k
        return 0;
190
702k
    }
191
1.62M
    advance_buffer(pcb, cbp);
192
1.62M
    nread = pcb->end - cb_top;
193
1.62M
    pcb->end_status = sgets(pcb->s, cb_top, nread, &nread);
194
1.62M
    if ( nread == 0 ) {
195
        /* No data for this band at all. */
196
3
        if (cb_top >= pcb->end) {
197
            /* should not happen */
198
0
            *pcbp = pcb->data;
199
0
            pcb->data[0] = cmd_opv_end_run;
200
0
            return_error(gs_error_ioerror);
201
0
        }
202
3
        *cb_top = cmd_opv_end_run;
203
3
        nread = 1;
204
3
    }
205
1.62M
    set_cb_end(pcb, cb_top + nread);
206
1.62M
    process_interrupts(pcb->s->memory);
207
1.62M
    *pcbp = pcb->data;
208
1.62M
    return 0;
209
1.62M
}
210
211
/* Read data from the command buffer and stream. */
212
/* From the command_buffer pcb, read rsize bytes to ptr, starting from cbp.
213
 * Return the new value for pcb->ptr. */
214
static const byte *
215
cmd_read_data(command_buf_t *pcb, byte *ptr, uint rsize, const byte *cbp)
216
783k
{
217
783k
    if (pcb->end - cbp >= rsize) {
218
781k
        memmove(ptr, cbp, rsize);
219
781k
        return cbp + rsize;
220
781k
    } else {
221
2.65k
        uint cleft = pcb->end - cbp;
222
2.65k
        uint rleft = rsize - cleft;
223
224
2.65k
        memmove(ptr, cbp, cleft);
225
2.65k
        sgets(pcb->s, ptr + cleft, rleft, &rleft);
226
#ifdef DEBUG
227
        {
228
            stream_state *st = pcb->s->state;
229
230
            adjust_offset_map_for_skipped_data(st, (uint)(pcb->end - pcb->data), rleft);
231
        }
232
#endif
233
2.65k
        return pcb->end;
234
2.65k
    }
235
783k
}
236
237
/* Read a fixed-size value from the command buffer. */
238
static inline const byte *
239
cmd_copy_value(void *pvar, int var_size, const byte *cbp)
240
125k
{
241
125k
    memcpy(pvar, cbp, var_size);
242
125k
    return cbp + var_size;
243
125k
}
244
#define cmd_get_value(var, cbp)\
245
125k
  cbp = cmd_copy_value(&var, sizeof(var), cbp)
246
247
/*
248
 * Define a buffer structure to hold a serialized halftone. This is
249
 * used only if the serialized halftone is too large to fit into
250
 * the command buffer.
251
 */
252
typedef struct ht_buff_s {
253
    uint    ht_size, read_size;
254
    byte *  pcurr;
255
    byte *  pbuff;
256
} ht_buff_t;
257
258
/*
259
 * Render one band to a specified target device.  Note that if
260
 * action == setup, target may be 0.
261
 */
262
static int read_set_tile_size(command_buf_t *pcb, tile_slot *bits, bool for_pattern);
263
static int read_set_bits(command_buf_t *pcb, tile_slot *bits,
264
                          int compress, gx_clist_state *pcls,
265
                          gx_strip_bitmap *tile, tile_slot **pslot,
266
                          gx_device_clist_reader *cdev, gs_memory_t *mem);
267
static int read_set_misc2(command_buf_t *pcb, gs_gstate *pgs,
268
                           segment_notes *pnotes);
269
static int read_set_color_space(command_buf_t *pcb, gs_gstate *pgs,
270
                                 gx_device_clist_reader *cdev, gs_memory_t *mem);
271
static int read_begin_image(command_buf_t *pcb, gs_image_common_t *pic,
272
                             gs_color_space *pcs);
273
static int read_put_params(command_buf_t *pcb, gs_gstate *pgs,
274
                            gx_device_clist_reader *cdev,
275
                            gs_memory_t *mem);
276
static int read_composite(command_buf_t *pcb, gs_memory_t *mem, gs_composite_t **ppcomp);
277
static int apply_composite(gx_device_clist_reader *cdev, gs_gstate *pgs,
278
                                   gs_memory_t *mem, gs_composite_t *pcomp,
279
                                   int x0, int y0, gx_device **ptarget);
280
static int read_alloc_ht_buff(ht_buff_t *, uint, gs_memory_t *);
281
static int read_ht_segment(ht_buff_t *, command_buf_t *, gs_gstate *,
282
                            gx_device *, gs_memory_t *);
283
284
static const byte *cmd_read_rect(int, gx_cmd_rect *, const byte *);
285
static const byte *cmd_read_short_bits(command_buf_t *pcb, byte *data, int tot_bytes,
286
                                        int width_bytes, int height,
287
                                        uint raster, const byte *cbp);
288
static int cmd_select_map(cmd_map_index, cmd_map_contents,
289
                           gs_gstate *, int **,
290
                           frac **, uint *, gs_memory_t *);
291
static int cmd_create_dev_ht(gx_device_halftone **, gs_memory_t *);
292
static int cmd_resize_halftone(gx_device_halftone **, uint,
293
                                gs_memory_t *);
294
static int clist_decode_segment(gx_path *, int, fixed[6],
295
                                 gs_fixed_point *, int, int,
296
                                 segment_notes);
297
static int clist_do_polyfill(gx_device *, gx_path *,
298
                              const gx_drawing_color *,
299
                              gs_logical_operation_t);
300
301
static inline void
302
enqueue_compositor(gs_composite_t **ppcomp_first, gs_composite_t **ppcomp_last, gs_composite_t *pcomp)
303
6.58M
{
304
6.58M
    if (*ppcomp_last == NULL) {
305
421k
        pcomp->prev = pcomp->next = NULL;
306
421k
        *ppcomp_last = *ppcomp_first = pcomp;
307
6.16M
    } else {
308
6.16M
        (*ppcomp_last)->next = pcomp;
309
6.16M
        pcomp->prev = *ppcomp_last;
310
6.16M
        pcomp->next = NULL;
311
6.16M
        *ppcomp_last = pcomp;
312
6.16M
    }
313
6.58M
}
314
315
#if 0 /* Appears unused - keep for a while. */
316
static inline gs_composite_t *
317
dequeue_last_compositor(gs_composite_t **ppcomp_first, gs_composite_t **ppcomp_last)
318
{
319
    gs_composite_t *pcomp = *ppcomp_last;
320
321
    if (*ppcomp_first == *ppcomp_last)
322
        *ppcomp_first = *ppcomp_last = NULL;
323
    else {
324
        *ppcomp_last = (*ppcomp_last)->prev;
325
        pcomp->prev = NULL;
326
        (*ppcomp_last)->next = NULL;
327
    }
328
    return pcomp;
329
}
330
331
static inline gs_composite_t *
332
dequeue_first_compositor(gs_composite_t **ppcomp_first, gs_composite_t **ppcomp_last)
333
{
334
    gs_composite_t *pcomp = *ppcomp_first;
335
336
    if (*ppcomp_first == *ppcomp_last)
337
        *ppcomp_first = *ppcomp_last = NULL;
338
    else {
339
        *ppcomp_first = (*ppcomp_first)->next;
340
        pcomp->next = NULL;
341
        (*ppcomp_last)->prev = NULL;
342
    }
343
    return pcomp;
344
}
345
#endif
346
347
static inline int
348
dequeue_compositor(gs_composite_t **ppcomp_first, gs_composite_t **ppcomp_last, gs_composite_t *pcomp)
349
6.58M
{
350
6.58M
    if (*ppcomp_last == *ppcomp_first) {
351
421k
        if (*ppcomp_last == pcomp) {
352
421k
            *ppcomp_last = *ppcomp_first = NULL;
353
421k
            return 0;
354
421k
        } else
355
0
            return_error(gs_error_unregistered); /* Must not happen. */
356
6.16M
    } else {
357
6.16M
        gs_composite_t *pcomp_next = pcomp->next, *pcomp_prev = pcomp->prev;
358
359
6.16M
        if (*ppcomp_last == pcomp)
360
283k
            *ppcomp_last = pcomp->prev;
361
5.88M
        else
362
5.88M
            pcomp_next->prev = pcomp_prev;
363
6.16M
        if (*ppcomp_first == pcomp)
364
5.88M
            *ppcomp_first = pcomp->next;
365
283k
        else
366
283k
            pcomp_prev->next = pcomp_next;
367
6.16M
        pcomp->next = pcomp->prev = NULL;
368
6.16M
        return 0;
369
6.16M
    }
370
6.58M
}
371
372
static inline void
373
free_compositor(gs_composite_t *pcomp, gs_memory_t *mem)
374
463k
{
375
463k
    gs_free_object(mem, pcomp, "free_compositor");
376
463k
}
377
378
static inline bool
379
is_null_compositor_op(const byte *cbp, int *length)
380
3.91M
{
381
3.91M
    if (cbp[0] == cmd_opv_end_run) {
382
3.61M
        *length = 1;
383
3.61M
        return true;
384
3.61M
    }
385
303k
    return false;
386
3.91M
}
387
388
static int
389
execute_compositor_queue(gx_device_clist_reader *cdev, gx_device **target, gx_device **tdev, gs_gstate *pgs,
390
                         gs_composite_t **ppcomp_first, gs_composite_t **ppcomp_last, gs_composite_t *pcomp_from,
391
                         int x0, int y0, gs_memory_t *mem, bool idle)
392
335k
{
393
6.45M
    while (pcomp_from != NULL) {
394
6.12M
        gs_composite_t *pcomp = pcomp_from;
395
6.12M
        int code;
396
397
6.12M
        pcomp_from = pcomp->next;
398
6.12M
        code = dequeue_compositor(ppcomp_first, ppcomp_last, pcomp);
399
6.12M
        if (code < 0)
400
0
            return code;
401
6.12M
        pcomp->idle |= idle;
402
6.12M
        code = apply_composite(cdev, pgs, mem, pcomp, x0, y0, target); /* Releases the compositor. */
403
6.12M
        if (code < 0)
404
0
            return code;
405
6.12M
        *tdev = *target;
406
6.12M
    }
407
335k
    return 0;
408
335k
}
409
410
static void
411
mark_as_idle(gs_composite_t *pcomp_start, gs_composite_t *pcomp_end)
412
64.8k
{
413
64.8k
    gs_composite_t *pcomp = pcomp_start;
414
415
141k
    while (pcomp != NULL) {
416
141k
        pcomp->idle = true;
417
141k
        if (pcomp == pcomp_end)
418
64.8k
            break;
419
76.6k
        pcomp = pcomp->next;
420
76.6k
    }
421
64.8k
}
422
423
static inline int
424
drop_compositor_queue(gs_composite_t **ppcomp_first, gs_composite_t **ppcomp_last,
425
                      gs_composite_t *pcomp_from, gs_memory_t *mem, int x0, int y0,
426
                      gs_gstate *pgs)
427
56
{
428
56
    gs_composite_t *pcomp;
429
430
280
    do {
431
280
        int code;
432
433
280
        pcomp = *ppcomp_last;
434
280
        if (pcomp == NULL)
435
0
            return 0;
436
280
        dequeue_compositor(ppcomp_first, ppcomp_last, *ppcomp_last);
437
280
        code = pcomp->type->procs.adjust_ctm(pcomp, x0, y0, pgs);
438
280
        if (code < 0)
439
0
            return code;
440
280
        free_compositor(pcomp, mem);
441
280
    } while (pcomp != pcomp_from);
442
56
    return 0;
443
56
}
444
445
static int
446
read_set_misc_map(byte cb, command_buf_t *pcb, gs_gstate *pgs, gs_memory_t *mem)
447
320k
{
448
320k
    const byte *cbp = pcb->ptr;
449
320k
    frac *mdata;
450
320k
    int *pcomp_num;
451
320k
    uint count = 0;   /* quiet compiler */
452
320k
    cmd_map_contents cont =
453
320k
        (cmd_map_contents)(cb & 0x30) >> 4;
454
320k
    int code;
455
456
320k
    code = cmd_select_map(cb & 0xf, cont,
457
320k
                          pgs,
458
320k
                          &pcomp_num,
459
320k
                          &mdata, &count, mem);
460
461
320k
    if (code < 0)
462
0
        return code;
463
    /* Get component number if relevant */
464
320k
    if (pcomp_num == NULL)
465
320k
        cbp++;
466
522
    else {
467
522
        *pcomp_num = (int) *cbp++;
468
522
        if_debug1m('L', mem, " comp_num=%d", *pcomp_num);
469
522
    }
470
320k
    if (cont == cmd_map_other) {
471
220k
        cbp = cmd_read_data(pcb, (byte *)mdata, count, cbp);
472
473
#ifdef DEBUG
474
        if (gs_debug_c('L')) {
475
            uint i;
476
477
            for (i = 0; i < count / sizeof(*mdata); ++i)
478
                dmprintf1(mem, " 0x%04x", mdata[i]);
479
            dmputc(mem, '\n');
480
        }
481
    } else {
482
        if_debug0m('L', mem, " none\n");
483
#endif
484
220k
    }
485
    /* Recompute the effective transfer, */
486
    /* in case this was a transfer map. */
487
320k
    gx_gstate_set_effective_xfer(pgs);
488
320k
    pcb->ptr = cbp;
489
320k
    return 0;
490
320k
}
491
492
#ifdef DEBUG
493
void clist_debug_op(gs_memory_t *mem, const unsigned char *cbp)
494
{
495
    unsigned char op = *cbp++;
496
    const char *const *sub = cmd_sub_op_names[op >> 4];
497
    if (op == cmd_opv_extend) {
498
        unsigned char op2 = *cbp;
499
        if (cmd_extend_op_names[op2])
500
            dmlprintf1(mem, " %s", cmd_extend_op_names[op2]);
501
        else
502
            dmlprintf1(mem, " ?0x%02x?", (int)op2);
503
    } else if (sub)
504
        dmlprintf1(mem, " %s", sub[op & 0xf]);
505
    else
506
        dmlprintf2(mem, " %s %d", cmd_op_names[op >> 4], op & 0xf);
507
}
508
#endif
509
510
int
511
clist_playback_band(clist_playback_action playback_action, /* lgtm [cpp/use-of-goto] */
512
                    gx_device_clist_reader *cdev, stream *s,
513
                    gx_device *target, int x0, int y0,
514
                    gs_memory_t * mem)
515
182k
{
516
182k
    byte *cbuf_storage;
517
182k
    command_buf_t cbuf;
518
    /* data_bits is for short copy_* bits and copy_* compressed, */
519
    /* must be aligned */
520
182k
    byte *data_bits = 0;
521
182k
    const byte *cbp;
522
182k
    int dev_depth;              /* May vary due to compositing devices */
523
182k
    int dev_depth_bytes;
524
182k
    int odd_delta_shift;
525
182k
    int num_zero_bytes;
526
182k
    gx_device *tdev;
527
182k
    gx_clist_state state;
528
182k
    gx_color_index *set_colors;
529
182k
    gx_device_color *set_dev_colors;
530
182k
    tile_slot *state_slot;
531
182k
    gx_strip_bitmap state_tile; /* parameters for reading tiles */
532
182k
    tile_slot tile_bits;        /* parameters of current tile */
533
182k
    gs_int_point tile_phase;
534
182k
    gx_path path;
535
182k
    bool in_path;
536
182k
    gs_fixed_point ppos;
537
182k
    gx_clip_path clip_path;
538
182k
    bool use_clip;
539
182k
    gx_clip_path *pcpath;
540
182k
    gx_device_cpath_accum clip_accum;
541
182k
    gs_fixed_rect target_box;
542
182k
    struct _cas {
543
182k
        bool lop_enabled;
544
182k
        gx_device_color dcolor;
545
182k
        gs_fixed_point fa_save;
546
182k
    } clip_save;
547
182k
    bool in_clip = false;
548
182k
    gs_gstate gs_gstate;
549
182k
    gx_device_color fill_color = { 0 };
550
182k
    gx_device_color stroke_color = { 0 };
551
182k
    float dash_pattern[cmd_max_dash];
552
182k
    gx_fill_params fill_params;
553
182k
    gx_stroke_params stroke_params;
554
#ifdef DEBUG
555
    gs_halftone_type halftone_type;
556
#endif
557
182k
    union im_ {
558
182k
        gs_image_common_t c;
559
182k
        gs_data_image_t d;
560
182k
        gs_image1_t i1;
561
182k
        gs_image4_t i4;
562
182k
    } image;
563
182k
    gs_int_rect image_rect;
564
182k
    gs_color_space *pcs = NULL;
565
182k
    gx_image_enum_common_t *image_info;
566
182k
    gx_image_plane_t planes[32];
567
182k
    uint data_height;
568
182k
    uint data_size;
569
182k
    byte *data_on_heap;
570
182k
    fixed vs[6];
571
182k
    segment_notes notes;
572
182k
    int data_x;
573
182k
    int code = 0;
574
182k
    ht_buff_t  ht_buff;
575
182k
    gx_device *const orig_target = target;
576
182k
    gx_device_clip clipper_dev;
577
182k
    bool clipper_dev_open = false;
578
182k
    patch_fill_state_t pfs;
579
182k
    int op = 0;
580
182k
    int plane_height = 0;
581
582
#ifdef DEBUG
583
    stream_state *st = s->state; /* Save because s_close resets s->state. */
584
#endif
585
182k
    gs_composite_t *pcomp_first = NULL, *pcomp_last = NULL;
586
182k
    tile_slot bits;             /* parameters for reading bits */
587
588
    /* pad the cbuf data area a bit (just in case) */
589
182k
    if ((cbuf_storage = gs_alloc_bytes(mem, cbuf_size + sizeof(double),
590
182k
                               "clist_playback_band(cbuf_storage)")) == NULL) {
591
0
        return_error(gs_error_VMerror);
592
0
    }
593
182k
    cbuf.data = (byte *)cbuf_storage;
594
182k
    cbuf.size = cbuf_size;
595
182k
    cbuf.s = s;
596
182k
    cbuf.end_status = 0;
597
182k
    set_cb_end(&cbuf, cbuf.data + cbuf.size);
598
182k
    cbp = cbuf.end;
599
600
182k
    pfs.dev = NULL; /* Indicate "not initialized". */
601
182k
    memset(&ht_buff, 0, sizeof(ht_buff));
602
603
    /* The following initializations are to quiet gcc warnings. */
604
182k
    memset(&bits, 0, sizeof(bits));
605
182k
    memset(&tile_bits, 0, sizeof(tile_bits));
606
182k
    memset(&clip_save, 0, sizeof(clip_save));
607
182k
    memset(&state_slot, 0, sizeof(state_slot));
608
182k
    ppos.x = ppos.y = 0;
609
610
182k
in:                             /* Initialize for a new page. */
611
182k
    tdev = target;
612
182k
    set_colors = state.colors;
613
182k
    set_dev_colors = state.tile_color_devn;
614
182k
    use_clip = false;
615
182k
    pcpath = NULL;
616
182k
    if (clipper_dev_open)
617
0
        gx_destroy_clip_device_on_stack(&clipper_dev);
618
182k
    clipper_dev_open = false;
619
182k
    notes = sn_none;
620
182k
    data_x = 0;
621
182k
    {
622
182k
        static const gx_clist_state cls_initial = { cls_initial_values };
623
624
182k
        state = cls_initial;
625
182k
    }
626
182k
    state_tile.id = gx_no_bitmap_id;
627
182k
    state_tile.shift = state_tile.rep_shift = 0;
628
182k
    state_tile.size.x = state_tile.size.y = 0;
629
182k
    state_tile.num_planes = 1;
630
182k
    tile_phase.x = x0;
631
182k
    tile_phase.y = y0;
632
182k
    gx_path_init_local(&path, mem);
633
182k
    in_path = false;
634
    /*
635
     * Initialize the clipping region to the full page.
636
     * (Since we also initialize use_clip to false, this is arbitrary.)
637
     */
638
182k
    {
639
182k
        gs_fixed_rect cbox;
640
641
182k
        gx_cpath_init_local(&clip_path, mem);
642
182k
        cbox.p.x = 0;
643
182k
        cbox.p.y = 0;
644
182k
        cbox.q.x = cdev->width;
645
182k
        cbox.q.y = cdev->height;
646
182k
        gx_cpath_from_rectangle(&clip_path, &cbox);
647
182k
    }
648
182k
    if (target != 0)
649
182k
        (*dev_proc(target, get_clipping_box))(target, &target_box);
650
182k
    memset(&gs_gstate, 0, sizeof(gs_gstate));
651
182k
    GS_STATE_INIT_VALUES_CLIST((&gs_gstate));
652
182k
    code = gs_gstate_initialize(&gs_gstate, mem);
653
182k
    if (code < 0)
654
0
        goto out;
655
182k
    gs_gstate.device = tdev;
656
182k
    gs_gstate.view_clip = NULL; /* Avoid issues in pdf14 fill stroke */
657
182k
    gs_gstate.clip_path = &clip_path;
658
182k
    pcs = gs_cspace_new_DeviceGray(mem);
659
182k
    if (pcs == NULL) {
660
0
        code = gs_note_error(gs_error_VMerror);
661
0
        goto out;
662
0
    }
663
182k
    code = pcs->type->install_cspace(pcs, &gs_gstate);
664
182k
    if (code < 0) {
665
0
        rc_decrement(pcs, "clist_playback_band");
666
0
        goto out;
667
0
    }
668
182k
    gs_gstate.color[0].color_space = pcs; /* we already have one ref */
669
182k
    gs_gstate.color[1].color_space = pcs;
670
182k
    rc_increment_cs(pcs); /* increment for second ref */
671
    /* Initialize client color and device color */
672
182k
    gs_gstate.color[0].ccolor =
673
182k
        gs_alloc_struct(mem, gs_client_color, &st_client_color, "clist_playback_band");
674
182k
    gs_gstate.color[1].ccolor =
675
182k
        gs_alloc_struct(mem, gs_client_color, &st_client_color, "clist_playback_band");
676
182k
    gs_gstate.color[0].dev_color =
677
182k
        gs_alloc_struct(mem, gx_device_color, &st_device_color, "clist_playback_band");
678
182k
    gs_gstate.color[1].dev_color =
679
182k
        gs_alloc_struct(mem, gx_device_color, &st_device_color, "clist_playback_band");
680
182k
    if (gs_gstate.color[0].ccolor == 0 || gs_gstate.color[0].dev_color == 0 ||
681
182k
        gs_gstate.color[1].ccolor == 0 || gs_gstate.color[1].dev_color == 0
682
182k
        ) {
683
0
        gs_free_object(mem, gs_gstate.color[0].ccolor, "clist_playback_band");
684
0
        gs_free_object(mem, gs_gstate.color[1].ccolor, "clist_playback_band");
685
0
        gs_free_object(mem, gs_gstate.color[0].dev_color, "clist_playback_band");
686
0
        gs_free_object(mem, gs_gstate.color[1].dev_color, "clist_playback_band");
687
0
        if (clipper_dev_open)
688
0
            gx_destroy_clip_device_on_stack(&clipper_dev);
689
0
        return_error(gs_error_VMerror);
690
0
    }
691
182k
    gs_gstate.color[0].color_space->pclient_color_space_data =
692
182k
        pcs->pclient_color_space_data;
693
182k
    cs_full_init_color(gs_gstate.color[0].ccolor, pcs);
694
182k
    gx_unset_dev_color(&gs_gstate);
695
696
182k
    gs_gstate.color[1].color_space->pclient_color_space_data =
697
182k
        pcs->pclient_color_space_data;
698
182k
    cs_full_init_color(gs_gstate.color[1].ccolor, pcs);
699
182k
    gx_unset_dev_color(&gs_gstate);
700
701
    /* Remove the ICC link cache and replace with the device link cache
702
       so that we share the cache across bands */
703
182k
    rc_decrement(gs_gstate.icc_link_cache,"clist_playback_band");
704
182k
    gs_gstate.icc_link_cache = cdev->icc_cache_cl;
705
    /* Need to lock during the increment of the link cache */
706
182k
    gx_monitor_enter(cdev->icc_cache_cl->lock);
707
182k
    rc_increment(cdev->icc_cache_cl);
708
182k
    gx_monitor_leave(cdev->icc_cache_cl->lock); /* let everyone run */
709
182k
    if (code < 0)
710
0
        goto out;
711
712
182k
    gs_gstate.line_params.dash.pattern = dash_pattern;
713
182k
    if (tdev != 0) {
714
182k
        gx_set_cmap_procs(&gs_gstate, tdev);
715
182k
    }
716
182k
    gx_gstate_setscreenphase(&gs_gstate, -x0, -y0, gs_color_select_all);
717
#ifdef DEBUG
718
    halftone_type = ht_type_none;
719
#endif
720
182k
    fill_color.ccolor_valid = false;
721
182k
    color_unset(&fill_color);
722
182k
    data_bits = gs_alloc_bytes(mem, data_bits_size,
723
182k
                               "clist_playback_band(data_bits)");
724
182k
    if (data_bits == 0) {
725
0
        code = gs_note_error(gs_error_VMerror);
726
0
        goto out;
727
0
    }
728
29.1M
    while (code >= 0) {
729
29.1M
        int compress;
730
29.1M
        int depth = 0x7badf00d; /* Initialize against indeterminizm. */
731
29.1M
        int raster = 0x7badf00d; /* Initialize against indeterminizm. */
732
29.1M
        byte *source = NULL;  /* Initialize against indeterminizm. */
733
29.1M
        gx_color_index colors[2];
734
29.1M
        gx_color_index *pcolor;
735
29.1M
        gx_device_color *pdcolor = NULL;
736
29.1M
        gs_logical_operation_t log_op;
737
738
        /* Make sure the buffer contains a full command. */
739
29.1M
        if (cbp >= cbuf.warn_limit) {
740
215k
            if (cbuf.end_status < 0) {  /* End of file or error. */
741
1.23k
                if (cbp >= cbuf.end) {
742
0
                    code = (cbuf.end_status == EOFC ? 0 :
743
0
                            gs_note_error(gs_error_ioerror));
744
0
                    break;
745
0
                }
746
213k
            } else {
747
213k
                code = top_up_cbuf(&cbuf, &cbp);
748
213k
                if (code < 0)
749
0
                    goto top_up_failed;
750
213k
            }
751
215k
        }
752
29.1M
        op = *cbp++;
753
#ifdef DEBUG
754
        if (gs_debug_c('L')) {
755
            int64_t offset = clist_file_offset(st, cbp - 1 - cbuf.data);
756
757
            dmlprintf1(mem, "[L] %"PRIu64":", offset);
758
            clist_debug_op(mem, cbp-1);
759
        }
760
#endif
761
29.1M
        switch (op >> 4) {
762
6.93M
            case cmd_op_misc >> 4:
763
6.93M
                switch (op) {
764
335k
                    case cmd_opv_end_run:
765
335k
                        if_debug0m('L', mem, "\n");
766
335k
                        continue;
767
24
                    case cmd_opv_set_tile_size:
768
24
                        cbuf.ptr = cbp;
769
24
                        code = read_set_tile_size(&cbuf, &tile_bits,
770
24
                                    gx_device_is_pattern_clist((gx_device *)cdev));
771
24
                        cbp = cbuf.ptr;
772
24
                        if (code < 0)
773
0
                            goto out;
774
24
                        continue;
775
5.95k
                    case cmd_opv_set_tile_phase:
776
5.95k
                        cmd_getw(state.tile_phase.x, cbp);
777
5.95k
                        cmd_getw(state.tile_phase.y, cbp);
778
5.95k
                        if_debug2m('L', mem, " (%d,%d)\n",
779
5.95k
                                   state.tile_phase.x,
780
5.95k
                                   state.tile_phase.y);
781
5.95k
                        goto set_tile_phase;
782
2.92k
                    case cmd_opv_set_screen_phaseT:
783
2.92k
                        cmd_getw(state.screen_phase[gs_color_select_texture].x, cbp);
784
2.92k
                        cmd_getw(state.screen_phase[gs_color_select_texture].y, cbp);
785
2.92k
                        if_debug2m('L', mem, " (%d,%d)\n",
786
2.92k
                                   state.screen_phase[0].x,
787
2.92k
                                   state.screen_phase[gs_color_select_texture].y);
788
2.92k
                        gx_gstate_setscreenphase(&gs_gstate,
789
2.92k
                                                 state.screen_phase[gs_color_select_texture].x - x0,
790
2.92k
                                                 state.screen_phase[gs_color_select_texture].y - y0,
791
2.92k
                                                 gs_color_select_texture);
792
2.92k
                        continue;
793
0
                    case cmd_opv_set_screen_phaseS:
794
0
                        cmd_getw(state.screen_phase[gs_color_select_source].x, cbp);
795
0
                        cmd_getw(state.screen_phase[gs_color_select_source].y, cbp);
796
0
                        if_debug2m('L', mem, " (%d,%d)\n",
797
0
                                   state.screen_phase[gs_color_select_source].x,
798
0
                                   state.screen_phase[gs_color_select_source].y);
799
0
                        gx_gstate_setscreenphase(&gs_gstate,
800
0
                                                 state.screen_phase[gs_color_select_source].x - x0,
801
0
                                                 state.screen_phase[gs_color_select_source].y - y0,
802
0
                                                 gs_color_select_source);
803
0
                        continue;
804
30
                    case cmd_opv_set_tile_bits:
805
30
                        bits = tile_bits;
806
30
                        compress = 0;
807
648k
                      stb:
808
648k
                        cbuf.ptr = cbp;
809
648k
                        code = read_set_bits(&cbuf, &bits, compress,
810
648k
                                             &state, &state_tile, &state_slot,
811
648k
                                             cdev, mem);
812
648k
                        cbp = cbuf.ptr;
813
648k
                        if (code < 0)
814
0
                            goto out;
815
648k
                        goto stp;
816
648k
                    case cmd_opv_set_bits:
817
648k
do_opv_set_bits:
818
648k
                        compress = *cbp & 3;
819
648k
                        bits.head.depth = *cbp++ >> 2;
820
648k
                        cmd_getw(bits.width, cbp);
821
648k
                        cmd_getw(bits.height, cbp);
822
648k
                        if (op == cmd_opv_set_bits_planar)
823
648k
                            cmd_getw(bits.num_planes, cbp);
824
648k
                        else
825
648k
                            bits.num_planes = 1;
826
648k
                        if_debug5m('L', mem, " compress=%d depth=%d size=(%d,%d) planes=%d",
827
648k
                                   compress, bits.head.depth,
828
648k
                                   bits.width, bits.height, bits.num_planes);
829
648k
                        bits.raster =
830
648k
                            bitmap_raster(bits.width * bits.head.depth);
831
648k
                        bits.x_reps = bits.y_reps = 1;
832
648k
                        bits.shift = bits.rep_shift = 0;
833
648k
                        goto stb;
834
24
                    case cmd_opv_set_tile_color:
835
24
                        set_colors = state.tile_colors;
836
24
                        if_debug0m('L', mem, "\n");
837
24
                        continue;
838
340k
                    case cmd_opv_set_misc:
839
340k
                        {
840
340k
                            uint cb = *cbp++;
841
842
340k
                            switch (cb >> 6) {
843
35.0k
                                case cmd_set_misc_lop >> 6:
844
35.0k
                                    cmd_getw(state.lop, cbp);
845
35.0k
                                    state.lop = (state.lop << 6) + (cb & 0x3f);
846
35.0k
                                    if_debug1m('L', mem, " lop=0x%x\n", state.lop);
847
35.0k
                                    if (state.lop_enabled)
848
24.2k
                                        gs_gstate.log_op = state.lop;
849
35.0k
                                    break;
850
1.32k
                                case cmd_set_misc_data_x >> 6:
851
1.32k
                                    if (cb & 0x20)
852
1.32k
                                        cmd_getw(data_x, cbp);
853
1.32k
                                    else
854
1.32k
                                        data_x = 0;
855
1.32k
                                    data_x = (data_x << 5) + (cb & 0x1f);
856
1.32k
                                    if_debug1m('L', mem, " data_x=%d\n", data_x);
857
1.32k
                                    break;
858
304k
                                case cmd_set_misc_map >> 6:
859
304k
                                    cbuf.ptr = cbp;
860
304k
                                    code = read_set_misc_map(cb, &cbuf, &gs_gstate, mem);
861
304k
                                    if (code < 0)
862
0
                                        goto out;
863
304k
                                    cbp = cbuf.ptr;
864
304k
                                    break;
865
0
                                case cmd_set_misc_halftone >> 6: {
866
0
                                    uint num_comp;
867
#ifdef DEBUG
868
                                    halftone_type = cb & 0x3f;
869
#endif
870
0
                                    cmd_getw(num_comp, cbp);
871
#ifdef DEBUG
872
                                    if_debug2m('L', mem, " halftone type=%d num_comp=%u\n",
873
                                               halftone_type, num_comp);
874
#endif
875
0
                                    code = cmd_resize_halftone(
876
0
                                                        &gs_gstate.dev_ht[HT_OBJTYPE_DEFAULT],
877
0
                                                        num_comp, mem);
878
0
                                    if (code < 0)
879
0
                                        goto out;
880
0
                                    break;
881
0
                                }
882
0
                                default:
883
0
                                    goto bad_op;
884
340k
                            }
885
340k
                        }
886
340k
                        continue;
887
340k
                    case cmd_opv_enable_lop:
888
10.8k
                        state.lop_enabled = true;
889
10.8k
                        gs_gstate.log_op = state.lop;
890
10.8k
                        if_debug0m('L', mem, "\n");
891
10.8k
                        continue;
892
6.44k
                    case cmd_opv_disable_lop:
893
6.44k
                        state.lop_enabled = false;
894
6.44k
                        gs_gstate.log_op = lop_default;
895
6.44k
                        if_debug0m('L', mem, "\n");
896
6.44k
                        continue;
897
182k
                    case cmd_opv_end_page:
898
182k
                        if_debug0m('L', mem, "\n");
899
                        /*
900
                         * Do end-of-page cleanup, then reinitialize if
901
                         * there are more pages to come.
902
                         */
903
182k
                        goto out;
904
0
                    case cmd_opv_delta_color0:
905
0
                        pcolor = &set_colors[0];
906
0
                        goto delta2_c;
907
5.40M
                    case cmd_opv_delta_color1:
908
5.40M
                        pcolor = &set_colors[1];
909
5.40M
                      delta2_c:set_colors = state.colors;
910
                        /* See comments for cmd_put_color() in gxclutil.c. */
911
5.40M
                        {
912
5.40M
                            gx_color_index delta = 0;
913
5.40M
                            uint data;
914
915
5.40M
                            dev_depth = (tdev->color_info.depth <= 8*sizeof(gx_color_index) ?
916
5.40M
                                         tdev->color_info.depth : 8*sizeof(gx_color_index));
917
5.40M
                            dev_depth_bytes = (dev_depth + 7) >> 3;
918
5.40M
                            switch (dev_depth_bytes) {
919
                                /* For cases with an even number of bytes */
920
0
                                case 8:
921
0
                                    data = *cbp++;
922
0
                                    delta = (((gx_color_index)
923
0
                                        ((data & 0xf0) << 4) + (data & 0x0f)) << 24) << 24;
924
                                    /* fall through */
925
0
                                case 6:
926
0
                                    data = *cbp++;
927
0
                                    delta |= (((gx_color_index)
928
0
                                        ((data & 0xf0) << 4) + (data & 0x0f)) << 16) << 16;
929
                                    /* fall through */
930
2.52M
                                case 4:
931
2.52M
                                    data = *cbp++;
932
2.52M
                                    delta |= ((gx_color_index)
933
2.52M
                                        ((data & 0xf0) << 4) + (data & 0x0f)) << 16;
934
                                    /* fall through */
935
2.52M
                                case 2:
936
2.52M
                                    data = *cbp++;
937
2.52M
                                    delta |= ((gx_color_index)
938
2.52M
                                        ((data & 0xf0) << 4) + (data & 0x0f));
939
2.52M
                                    break;
940
                                /* For cases with an odd number of bytes */
941
0
                                case 7:
942
0
                                    data = *cbp++;
943
0
                                    delta = ((gx_color_index)
944
0
                                        ((data & 0xf0) << 4) + (data & 0x0f)) << 16;
945
                                    /* fall through */
946
0
                                case 5:
947
0
                                    data = *cbp++;
948
0
                                    delta |= ((gx_color_index)
949
0
                                        ((data & 0xf0) << 4) + (data & 0x0f));
950
                                    /* fall through */
951
2.87M
                                case 3:
952
2.87M
                                    data = *cbp++;
953
2.87M
                                    odd_delta_shift = (dev_depth_bytes - 3) * 8;
954
2.87M
                                    delta |= ((gx_color_index)
955
2.87M
                                        ((data & 0xe0) << 3) + (data & 0x1f)) << odd_delta_shift;
956
2.87M
                                    data = *cbp++;
957
2.87M
                                    delta |= ((gx_color_index) ((data & 0xf8) << 2) + (data & 0x07))
958
2.87M
                                                        << (odd_delta_shift + 11);
959
5.40M
                            }
960
5.40M
                            *pcolor += delta - cmd_delta_offsets[dev_depth_bytes];
961
5.40M
                        }
962
5.40M
                        if (sizeof(*pcolor) <= sizeof(ulong))
963
5.40M
                            if_debug1m('L', mem, " 0x%lx\n", (ulong)*pcolor);
964
0
                        else
965
5.40M
                            if_debug2m('L', mem, " 0x%8lx%08lx\n",
966
5.40M
                                       (ulong)(*pcolor >> 8*(sizeof(*pcolor) - sizeof(ulong))), (ulong)*pcolor);
967
5.40M
                        continue;
968
0
                    case cmd_opv_set_copy_color:
969
0
                        state.color_is_alpha = 0;
970
0
                        if_debug0m('L', mem, "\n");
971
0
                        continue;
972
0
                    case cmd_opv_set_copy_alpha:
973
0
                        state.color_is_alpha = 1;
974
0
                        if_debug0m('L', mem, "\n");
975
0
                        continue;
976
0
                    default:
977
0
                        goto bad_op;
978
6.93M
                }
979
                /*NOTREACHED */
980
32
            case cmd_op_set_color0 >> 4:
981
32
                pcolor = &set_colors[0];
982
32
                goto set_color;
983
2.78M
            case cmd_op_set_color1 >> 4:
984
2.78M
                pcolor = &set_colors[1];
985
2.78M
              set_color:set_colors = state.colors;
986
                /*
987
                 * We have a special case for gx_no_color_index. If the low
988
                 * order 4 bits are "cmd_no_color_index" then we really
989
                 * have a value of gx_no_color_index.  Otherwise the these
990
                 * bits indicate the number of low order zero bytes in the
991
                 * value.  See comments for cmd_put_color() in gxclutil.c.
992
                 */
993
2.78M
                num_zero_bytes = op & 0x0f;
994
995
2.78M
                if (num_zero_bytes == cmd_no_color_index)
996
4
                    *pcolor = gx_no_color_index;
997
2.78M
                else {
998
2.78M
                    gx_color_index color = 0;
999
1000
2.78M
                    dev_depth = (tdev->color_info.depth < 8*sizeof(gx_color_index) ?
1001
2.78M
                                 tdev->color_info.depth : 8*sizeof(gx_color_index));
1002
2.78M
                    dev_depth_bytes = (dev_depth + 7) >> 3;
1003
2.78M
                    switch (dev_depth_bytes - num_zero_bytes) {
1004
0
                        case 8:
1005
0
                            color = (gx_color_index) * cbp++;
1006
0
                        case 7:
1007
0
                            color = (color << 8) | (gx_color_index) * cbp++;
1008
0
                        case 6:
1009
0
                            color = (color << 8) | (gx_color_index) * cbp++;
1010
0
                        case 5:
1011
0
                            color = (color << 8) | (gx_color_index) * cbp++;
1012
192k
                        case 4:
1013
192k
                            color = (color << 8) | (gx_color_index) * cbp++;
1014
596k
                        case 3:
1015
596k
                            color = (color << 8) | (gx_color_index) * cbp++;
1016
632k
                        case 2:
1017
632k
                            color = (color << 8) | (gx_color_index) * cbp++;
1018
2.71M
                        case 1:
1019
2.71M
                            color = (color << 8) | (gx_color_index) * cbp++;
1020
2.78M
                        default:
1021
2.78M
                            break;
1022
2.78M
                    }
1023
2.78M
                    color <<= num_zero_bytes * 8;
1024
2.78M
                    *pcolor = color;
1025
2.78M
                }
1026
2.78M
                if (sizeof(*pcolor) <= sizeof(ulong))
1027
2.78M
                    if_debug1m('L', mem, " 0x%lx\n", (ulong)*pcolor);
1028
0
                else
1029
2.78M
                    if_debug2m('L', mem, " 0x%8lx%08lx\n",
1030
2.78M
                               (ulong)(*pcolor >> 8*(sizeof(*pcolor) - sizeof(ulong))), (ulong)*pcolor);
1031
2.78M
                continue;
1032
341k
            case cmd_op_fill_rect >> 4:
1033
341k
            case cmd_op_tile_rect >> 4:
1034
341k
                cbp = cmd_read_rect(op, &state.rect, cbp);
1035
341k
                break;
1036
801k
            case cmd_op_fill_rect_short >> 4:
1037
804k
            case cmd_op_tile_rect_short >> 4:
1038
804k
                state.rect.x += *cbp + cmd_min_short;
1039
804k
                state.rect.width += cbp[1] + cmd_min_short;
1040
804k
                if (op & 0xf) {
1041
524k
                    state.rect.height += (op & 0xf) + cmd_min_dxy_tiny;
1042
524k
                    cbp += 2;
1043
524k
                } else {
1044
279k
                    state.rect.y += cbp[2] + cmd_min_short;
1045
279k
                    state.rect.height += cbp[3] + cmd_min_short;
1046
279k
                    cbp += 4;
1047
279k
                }
1048
804k
                break;
1049
9.34M
            case cmd_op_fill_rect_tiny >> 4:
1050
9.34M
            case cmd_op_tile_rect_tiny >> 4:
1051
9.34M
                if (op & 8)
1052
6.98M
                    state.rect.x += state.rect.width;
1053
2.36M
                else {
1054
2.36M
                    int txy = *cbp++;
1055
1056
2.36M
                    state.rect.x += (txy >> 4) + cmd_min_dxy_tiny;
1057
2.36M
                    state.rect.y += (txy & 0xf) + cmd_min_dxy_tiny;
1058
2.36M
                }
1059
9.34M
                state.rect.width += (op & 7) + cmd_min_dw_tiny;
1060
9.34M
                break;
1061
1.46M
            case cmd_op_copy_mono_planes >> 4:
1062
1.46M
                cmd_getw(plane_height, cbp);
1063
1.46M
                if (plane_height == 0) {
1064
                    /* We are doing a copy mono */
1065
1.46M
                    depth = 1;
1066
1.46M
                } else {
1067
0
                    depth = tdev->color_info.depth;
1068
0
                }
1069
1.46M
                if_debug1m('L', mem, " plane_height=0x%x", plane_height);
1070
1.46M
                goto copy;
1071
22.3k
            case cmd_op_copy_color_alpha >> 4:
1072
22.3k
                if (state.color_is_alpha) {
1073
0
                    if (!(op & 8))
1074
0
                        depth = *cbp++;
1075
0
                } else
1076
22.3k
                    depth = tdev->color_info.depth;
1077
22.3k
                plane_height = 0;
1078
1.48M
              copy:cmd_getw(state.rect.x, cbp);
1079
1.48M
                cmd_getw(state.rect.y, cbp);
1080
1.48M
                if (op & cmd_copy_use_tile) {   /* Use the current "tile". */
1081
#ifdef DEBUG
1082
                    if (state_slot->index != state.tile_index) {
1083
                        mlprintf2(mem, "state_slot->index = %d, state.tile_index = %d!\n",
1084
                                  state_slot->index,
1085
                                  state.tile_index);
1086
                        code = gs_note_error(gs_error_ioerror);
1087
                        goto out;
1088
                    }
1089
#endif
1090
1.45M
                    depth = state_slot->head.depth;
1091
1.45M
                    state.rect.width = state_slot->width;
1092
1.45M
                    state.rect.height = state_slot->height;
1093
1.45M
                    if (state.rect.y + state.rect.height > cdev->height)
1094
972
                        state.rect.height = cdev->height - state.rect.y; /* clamp as writer did */
1095
1.45M
                    raster = state_slot->raster;
1096
1.45M
                    source = (byte *) (state_slot + 1);
1097
1.45M
                } else {        /* Read width, height, bits. */
1098
                    /* depth was set already. */
1099
29.3k
                    uint width_bits, width_bytes;
1100
29.3k
                    uint bytes;
1101
29.3k
                    uchar planes = 1;
1102
29.3k
                    uint plane_depth = depth;
1103
29.3k
                    uint pln;
1104
29.3k
                    byte compression = op & 3;
1105
29.3k
                    uint out_bytes;
1106
1107
29.3k
                    cmd_getw(state.rect.width, cbp);
1108
29.3k
                    cmd_getw(state.rect.height, cbp);
1109
29.3k
                    if (plane_height != 0) {
1110
0
                        planes = tdev->color_info.num_components;
1111
0
                        plane_depth /= planes;
1112
0
                    }
1113
29.3k
                    width_bits = state.rect.width * plane_depth;
1114
29.3k
                    bytes = clist_bitmap_bytes(width_bits,
1115
29.3k
                                               state.rect.height,
1116
29.3k
                                               op & 3, &width_bytes,
1117
29.3k
                                               (uint *)&raster);
1118
29.3k
                    if (planes > 1) {
1119
0
                        out_bytes = raster * state.rect.height;
1120
0
                        plane_height = state.rect.height;
1121
29.3k
                    } else {
1122
29.3k
                        out_bytes = bytes;
1123
29.3k
                    }
1124
                    /* copy_mono and copy_color/alpha */
1125
                    /* ensure that the bits will fit in a single buffer, */
1126
                    /* even after decompression if compressed. */
1127
#ifdef DEBUG
1128
                    if (planes * out_bytes > data_bits_size) {
1129
                        mlprintf6(mem, "bitmap size exceeds buffer!  width=%d raster=%d height=%d\n    file pos %"PRId64" buf pos %d/%d\n",
1130
                                  state.rect.width, raster,
1131
                                  state.rect.height,
1132
                                  stell(s), (int)(cbp - cbuf.data),
1133
                                  (int)(cbuf.end - cbuf.data));
1134
                        code = gs_note_error(gs_error_ioerror);
1135
                        goto out;
1136
                    }
1137
#endif
1138
58.6k
                    for (pln = 0; pln < planes; pln++) {
1139
29.3k
                        byte *plane_bits = data_bits + pln * plane_height * raster;
1140
1141
                        /* Fill the cbuf if needed to get the data for the plane */
1142
29.3k
                        if (cbp + out_bytes >= cbuf.warn_limit) {
1143
2.92k
                            code = top_up_cbuf(&cbuf, &cbp);
1144
2.92k
                            if (code < 0)
1145
0
                                goto top_up_failed;
1146
2.92k
                        }
1147
29.3k
                        if (pln)
1148
0
                            compression = *cbp++;
1149
1150
29.3k
                        if (compression == cmd_compress_const) {
1151
0
                            cbp = cmd_read_data(&cbuf, plane_bits, 1, cbp);
1152
0
                            if (width_bytes > 0 && state.rect.height > 0)
1153
0
                                memset(plane_bits+1, *plane_bits, width_bytes * state.rect.height - 1);
1154
0
                            if (pln == 0)
1155
0
                                source = data_bits;
1156
1157
29.3k
                        } else if (compression) {       /* Decompress the image data. */
1158
0
                            stream_cursor_read r;
1159
0
                            stream_cursor_write w;
1160
1161
                            /* We don't know the data length a priori, */
1162
                            /* so to be conservative, we read */
1163
                            /* the uncompressed size. */
1164
0
                            uint cleft = cbuf.end - cbp;
1165
1166
0
                            if (cleft < bytes  && !cbuf.end_status) {
1167
0
                                uint nread = cbuf_size - cleft;
1168
1169
0
                                advance_buffer(&cbuf, cbp);
1170
0
                                cbuf.end_status = sgets(s, cbuf.data + cleft, nread, &nread);
1171
0
                                set_cb_end(&cbuf, cbuf.data + cleft + nread);
1172
0
                                cbp = cbuf.data;
1173
0
                            }
1174
0
                            r.ptr = cbp - 1;
1175
0
                            r.limit = cbuf.end - 1;
1176
0
                            w.ptr = plane_bits - 1;
1177
0
                            w.limit = w.ptr + data_bits_size;
1178
0
                            switch (compression) {
1179
0
                                case cmd_compress_rle:
1180
0
                                    {
1181
0
                                        stream_RLD_state sstate;
1182
1183
0
                                        clist_rld_init(&sstate);
1184
                                        /* The process procedure can't fail. */
1185
0
                                        (*s_RLD_template.process)
1186
0
                                            ((stream_state *)&sstate, &r, &w, true);
1187
0
                                    }
1188
0
                                    break;
1189
0
                                case cmd_compress_cfe:
1190
0
                                    {
1191
0
                                        stream_CFD_state sstate;
1192
1193
0
                                        clist_cfd_init(&sstate,
1194
0
                                        width_bytes << 3 /*state.rect.width */ ,
1195
0
                                                       state.rect.height, mem);
1196
                                        /* The process procedure can't fail. */
1197
0
                                        (*s_CFD_template.process)
1198
0
                                            ((stream_state *)&sstate, &r, &w, true);
1199
0
                                        (*s_CFD_template.release)
1200
0
                                            ((stream_state *)&sstate);
1201
0
                                    }
1202
0
                                    break;
1203
0
                                default:
1204
0
                                    goto bad_op;
1205
0
                            }
1206
0
                            cbp = r.ptr + 1;
1207
0
                            if (pln == 0)
1208
0
                                source = data_bits;
1209
29.3k
                        } else if ((state.rect.height > 1 && width_bytes != raster) ||
1210
29.3k
                                   (plane_height != 0)) {
1211
954
                            cbp = cmd_read_short_bits(&cbuf, plane_bits, bytes, width_bytes,
1212
954
                                                      state.rect.height, raster, cbp);
1213
954
                            if (pln == 0)
1214
954
                                source = data_bits;
1215
28.3k
                        } else {
1216
                            /* Never used for planar data */
1217
28.3k
                            cbp = cmd_read_data(&cbuf, cbuf.data, bytes, cbp);
1218
28.3k
                            source = cbuf.data;
1219
28.3k
                        }
1220
29.3k
                    }
1221
#ifdef DEBUG
1222
                    if (gs_debug_c('L')) {
1223
                        dmprintf2(mem, " depth=%d, data_x=%d\n",
1224
                                  depth, data_x);
1225
                        cmd_print_bits(mem, source, state.rect.width,
1226
                                       state.rect.height, raster);
1227
                    }
1228
#endif
1229
29.3k
                }
1230
1.48M
                break;
1231
1.48M
            case cmd_op_delta_tile_index >> 4:
1232
265k
                state.tile_index += (int)(op & 0xf) - 8;
1233
265k
                goto sti;
1234
461k
            case cmd_op_set_tile_index >> 4:
1235
461k
                state.tile_index =
1236
461k
                    ((op & 0xf) << 8) + *cbp++;
1237
726k
              sti:state_slot =
1238
726k
                    (tile_slot *) (cdev->cache_chunk->data +
1239
726k
                                 cdev->tile_table[state.tile_index].offset);
1240
726k
                if_debug2m('L', mem, " index=%u offset=%lu\n",
1241
726k
                           state.tile_index,
1242
726k
                           cdev->tile_table[state.tile_index].offset);
1243
726k
                state_tile.data = (byte *) (state_slot + 1);
1244
1.37M
              stp:state_tile.size.x = state_slot->width;
1245
1.37M
                state_tile.size.y = state_slot->height;
1246
1.37M
                state_tile.raster = state_slot->raster;
1247
1.37M
                state_tile.rep_width = state_tile.size.x /
1248
1.37M
                    state_slot->x_reps;
1249
1.37M
                state_tile.rep_height = state_tile.size.y /
1250
1.37M
                    state_slot->y_reps;
1251
1.37M
                state_tile.rep_shift = state_slot->rep_shift;
1252
1.37M
                state_tile.shift = state_slot->shift;
1253
1.37M
                state_tile.id = state_slot->id;
1254
1.37M
                state_tile.num_planes = state_slot->num_planes;
1255
1.38M
set_tile_phase:
1256
1.38M
                if (state_tile.size.x)
1257
1.38M
                    tile_phase.x =
1258
1.38M
                        (state.tile_phase.x + x0) % state_tile.size.x;
1259
                /*
1260
                 * The true tile height for shifted tiles is not
1261
                 * size.y: see gxbitmap.h for the computation.
1262
                 */
1263
1.38M
                if (state_tile.size.y) {
1264
1.38M
                    int full_height;
1265
1266
1.38M
                    if (state_tile.shift == 0)
1267
1.38M
                        full_height = state_tile.size.y;
1268
0
                    else
1269
0
                        full_height = state_tile.rep_height *
1270
0
                                    (state_tile.rep_width /
1271
0
                                     igcd(state_tile.rep_shift,
1272
0
                                          state_tile.rep_width));
1273
1.38M
                    tile_phase.y = (state.tile_phase.y + y0) % full_height;
1274
1.38M
                }
1275
1.38M
                continue;
1276
1.71M
            case cmd_op_misc2 >> 4:
1277
1.71M
                switch (op) {
1278
0
                    case cmd_opv_set_bits_planar:
1279
0
                        goto do_opv_set_bits;
1280
10.2k
                    case cmd_opv_set_fill_adjust:
1281
10.2k
                        cmd_get_value(gs_gstate.fill_adjust.x, cbp);
1282
10.2k
                        cmd_get_value(gs_gstate.fill_adjust.y, cbp);
1283
10.2k
                        if_debug2m('L', mem, " (%g,%g)\n",
1284
10.2k
                                   fixed2float(gs_gstate.fill_adjust.x),
1285
10.2k
                                   fixed2float(gs_gstate.fill_adjust.y));
1286
10.2k
                        continue;
1287
91.2k
                    case cmd_opv_set_ctm:
1288
91.2k
                        {
1289
91.2k
                            gs_matrix mat;
1290
1291
91.2k
                            cbp = cmd_read_matrix(&mat, cbp);
1292
91.2k
                            if_debug6m('L', mem, " [%g %g %g %g %g %g]\n",
1293
91.2k
                                       mat.xx, mat.xy, mat.yx, mat.yy,
1294
91.2k
                                       mat.tx, mat.ty);
1295
91.2k
                            mat.tx -= x0;
1296
91.2k
                            mat.ty -= y0;
1297
91.2k
                            gs_gstate_setmatrix(&gs_gstate, &mat);
1298
91.2k
                        }
1299
91.2k
                        continue;
1300
121k
                    case cmd_opv_set_misc2:
1301
121k
                        cbuf.ptr = cbp;
1302
121k
                        code = read_set_misc2(&cbuf, &gs_gstate, &notes);
1303
121k
                        cbp = cbuf.ptr;
1304
121k
                        if (code < 0)
1305
0
                            goto out;
1306
121k
                        continue;
1307
121k
                    case cmd_opv_set_dash:
1308
3.03k
                        {
1309
3.03k
                            int nb = *cbp++;
1310
3.03k
                            int n = nb & 0x3f;
1311
3.03k
                            float dot_length, offset;
1312
1313
3.03k
                            cmd_get_value(dot_length, cbp);
1314
3.03k
                            cmd_get_value(offset, cbp);
1315
3.03k
                            memcpy(dash_pattern, cbp, n * sizeof(float));
1316
1317
3.03k
                            gx_set_dash(&gs_gstate.line_params.dash,
1318
3.03k
                                        dash_pattern, n, offset,
1319
3.03k
                                        NULL);
1320
3.03k
                            gx_set_dash_adapt(&gs_gstate.line_params.dash,
1321
3.03k
                                              (nb & 0x80) != 0);
1322
3.03k
                            gx_set_dot_length(&gs_gstate.line_params,
1323
3.03k
                                              dot_length,
1324
3.03k
                                              (nb & 0x40) != 0);
1325
#ifdef DEBUG
1326
                            if (gs_debug_c('L')) {
1327
                                int i;
1328
1329
                                dmprintf4(mem, " dot=%g(mode %d) adapt=%d offset=%g [",
1330
                                         dot_length,
1331
                                         (nb & 0x40) != 0,
1332
                                         (nb & 0x80) != 0, offset);
1333
                                for (i = 0; i < n; ++i)
1334
                                    dmprintf1(mem, "%g ", dash_pattern[i]);
1335
                                dmputs(mem, "]\n");
1336
                            }
1337
#endif
1338
3.03k
                            cbp += n * sizeof(float);
1339
3.03k
                        }
1340
3.03k
                        break;
1341
619
                    case cmd_opv_enable_clip:
1342
619
                        pcpath = (use_clip ? &clip_path : NULL);
1343
619
                        if (pcpath) {
1344
33
                            code = gx_cpath_ensure_path_list(pcpath);
1345
33
                            if (code < 0)
1346
0
                                goto out;
1347
33
                        }
1348
619
                        if (clipper_dev_open)
1349
0
                            gx_destroy_clip_device_on_stack(&clipper_dev);
1350
619
                        clipper_dev_open = false;
1351
619
                        if_debug0m('L', mem, "\n");
1352
619
                        break;
1353
1.03k
                    case cmd_opv_disable_clip:
1354
1.03k
                        pcpath = NULL;
1355
1.03k
                        if (clipper_dev_open)
1356
0
                            gx_destroy_clip_device_on_stack(&clipper_dev);
1357
1.03k
                        clipper_dev_open = false;
1358
1.03k
                        if_debug0m('L', mem, "\n");
1359
1.03k
                        break;
1360
226k
                    case cmd_opv_begin_clip:
1361
226k
                        pcpath = NULL;
1362
226k
                        if (clipper_dev_open)
1363
375
                            gx_destroy_clip_device_on_stack(&clipper_dev);
1364
226k
                        clipper_dev_open = false;
1365
226k
                        in_clip = true;
1366
226k
                        if_debug0m('L', mem, "\n");
1367
226k
                        code = gx_cpath_reset(&clip_path);
1368
226k
                        if (code < 0)
1369
0
                            goto out;
1370
226k
                        gx_cpath_accum_begin(&clip_accum, mem, false);
1371
226k
                        gx_cpath_accum_set_cbox(&clip_accum,
1372
226k
                                                &target_box);
1373
226k
                        tdev = (gx_device *)&clip_accum;
1374
226k
                        clip_save.lop_enabled = state.lop_enabled;
1375
226k
                        clip_save.dcolor = fill_color;
1376
226k
                        clip_save.fa_save.x = gs_gstate.fill_adjust.x;
1377
226k
                        clip_save.fa_save.y = gs_gstate.fill_adjust.y;
1378
226k
                        cmd_getw(gs_gstate.fill_adjust.x, cbp);
1379
226k
                        cmd_getw(gs_gstate.fill_adjust.y, cbp);
1380
                        /* temporarily set a solid color */
1381
226k
                        color_set_pure(&fill_color, (gx_color_index)1);
1382
226k
                        state.lop_enabled = false;
1383
226k
                        gs_gstate.log_op = lop_default;
1384
226k
                        break;
1385
226k
                    case cmd_opv_end_clip:
1386
226k
                        if_debug0m('L', mem, "\n");
1387
226k
                        gx_cpath_accum_end(&clip_accum, &clip_path);
1388
226k
                        tdev = target;
1389
                        /*
1390
                         * If the entire band falls within the clip
1391
                         * path, no clipping is needed.
1392
                         */
1393
226k
                        {
1394
226k
                            gs_fixed_rect cbox;
1395
1396
226k
                            gx_cpath_inner_box(&clip_path, &cbox);
1397
226k
                            use_clip =
1398
226k
                                !(cbox.p.x <= target_box.p.x &&
1399
226k
                                  cbox.q.x >= target_box.q.x &&
1400
226k
                                  cbox.p.y <= target_box.p.y &&
1401
226k
                                  cbox.q.y >= target_box.q.y);
1402
226k
                        }
1403
226k
                        pcpath = (use_clip ? &clip_path : NULL);
1404
226k
                        if (pcpath) {
1405
137k
                            code = gx_cpath_ensure_path_list(pcpath);
1406
137k
                            if (code < 0)
1407
0
                                goto out;
1408
137k
                        }
1409
226k
                        if (clipper_dev_open)
1410
0
                            gx_destroy_clip_device_on_stack(&clipper_dev);
1411
226k
                        clipper_dev_open = false;
1412
226k
                        state.lop_enabled = clip_save.lop_enabled;
1413
226k
                        gs_gstate.log_op =
1414
226k
                            (state.lop_enabled ? state.lop :
1415
226k
                             lop_default);
1416
226k
                        fill_color = clip_save.dcolor;
1417
                        /* restore the fill_adjust if it was changed by begin_clip */
1418
226k
                        gs_gstate.fill_adjust.x = clip_save.fa_save.x;
1419
226k
                        gs_gstate.fill_adjust.y = clip_save.fa_save.y;
1420
226k
                        in_clip = false;
1421
226k
                        break;
1422
22.8k
                    case cmd_opv_set_color_space:
1423
22.8k
                        cbuf.ptr = cbp;
1424
22.8k
                        code = read_set_color_space(&cbuf, &gs_gstate, cdev, mem);
1425
22.8k
                        pcs = gs_gstate.color[0].color_space;
1426
22.8k
                        cbp = cbuf.ptr;
1427
22.8k
                        if (code < 0) {
1428
0
                            if (code == gs_error_rangecheck)
1429
0
                                goto bad_op;
1430
0
                            goto out;
1431
0
                        }
1432
22.8k
                        break;
1433
22.8k
                    case cmd_op_fill_rect_hl:
1434
0
                        {
1435
0
                            gs_fixed_rect rect_hl;
1436
1437
0
                            cbp = cmd_read_rect(op & 0xf0, &state.rect, cbp);
1438
0
                            if (fill_color.type != gx_dc_type_devn) {
1439
0
                                if_debug0m('L', mem, "hl rect fill without devn color\n");
1440
0
                                code = gs_note_error(gs_error_typecheck);
1441
0
                                goto out;
1442
0
                            }
1443
0
                            if_debug4m('L', mem, " x=%d y=%d w=%d h=%d\n",
1444
0
                                       state.rect.x, state.rect.y,
1445
0
                                       state.rect.width,state.rect.height);
1446
0
                            rect_hl.p.x = int2fixed(state.rect.x - x0);
1447
0
                            rect_hl.p.y = int2fixed(state.rect.y - y0);
1448
0
                            rect_hl.q.x = int2fixed(state.rect.width) + rect_hl.p.x;
1449
0
                            rect_hl.q.y = int2fixed(state.rect.height) + rect_hl.p.y;
1450
0
                            code = dev_proc(tdev, fill_rectangle_hl_color) (tdev,
1451
0
                                                        &rect_hl, NULL,
1452
0
                                                        &fill_color, NULL);
1453
0
                        }
1454
0
                        continue;
1455
24.7k
                    case cmd_opv_begin_image_rect:
1456
24.7k
                        cbuf.ptr = cbp;
1457
24.7k
                        code = read_begin_image(&cbuf, &image.c, pcs);
1458
24.7k
                        cbp = cbuf.ptr;
1459
24.7k
                        if (code < 0)
1460
0
                            goto out;
1461
24.7k
                        {
1462
24.7k
                            uint diff;
1463
1464
24.7k
                            cmd_getw(image_rect.p.x, cbp);
1465
24.7k
                            cmd_getw(image_rect.p.y, cbp);
1466
24.7k
                            cmd_getw(diff, cbp);
1467
24.7k
                            image_rect.q.x = image.d.Width - diff;
1468
24.7k
                            cmd_getw(diff, cbp);
1469
24.7k
                            image_rect.q.y = image.d.Height - diff;
1470
24.7k
                            if_debug4m('L', mem, " rect=(%d,%d),(%d,%d)",
1471
24.7k
                                       image_rect.p.x, image_rect.p.y,
1472
24.7k
                                       image_rect.q.x, image_rect.q.y);
1473
24.7k
                        }
1474
24.7k
                        goto ibegin;
1475
4.13k
                    case cmd_opv_begin_image:
1476
4.13k
                        cbuf.ptr = cbp;
1477
4.13k
                        code = read_begin_image(&cbuf, &image.c, pcs);
1478
4.13k
                        cbp = cbuf.ptr;
1479
4.13k
                        if (code < 0)
1480
0
                            goto out;
1481
4.13k
                        image_rect.p.x = 0;
1482
4.13k
                        image_rect.p.y = 0;
1483
4.13k
                        image_rect.q.x = image.d.Width;
1484
4.13k
                        image_rect.q.y = image.d.Height;
1485
4.13k
                        if_debug2m('L', mem, " size=(%d,%d)",
1486
4.13k
                                  image.d.Width, image.d.Height);
1487
28.9k
ibegin:                 if_debug0m('L', mem, "\n");
1488
28.9k
                        {
1489
                            /* Processing an image operation */
1490
28.9k
                            dev_proc(tdev, set_graphics_type_tag)(tdev, GS_IMAGE_TAG);/* FIXME: what about text bitmaps? */
1491
28.9k
                            image.i4.override_in_smask = 0;
1492
28.9k
                            code = (*dev_proc(tdev, begin_typed_image))
1493
28.9k
                                (tdev, &gs_gstate, NULL,
1494
28.9k
                                 (const gs_image_common_t *)&image,
1495
28.9k
                                 &image_rect, &fill_color, pcpath, mem,
1496
28.9k
                                 &image_info);
1497
28.9k
                        }
1498
28.9k
                        if (code < 0)
1499
0
                            goto out;
1500
28.9k
                        break;
1501
28.9k
                    case cmd_opv_image_plane_data:
1502
0
                        cmd_getw(data_height, cbp);
1503
0
                        if (data_height == 0) {
1504
0
                            if_debug0m('L', mem, " done image\n");
1505
0
                            code = gx_image_end(image_info, true);
1506
0
                            if (code < 0)
1507
0
                                goto out;
1508
0
                            continue;
1509
0
                        }
1510
0
                        {
1511
0
                            uint flags;
1512
0
                            int plane;
1513
0
                            uint raster1 = 0xbaadf00d; /* Initialize against indeterminizm. */
1514
1515
0
                            cmd_getw(flags, cbp);
1516
0
                            for (plane = 0;
1517
0
                                 plane < image_info->num_planes;
1518
0
                                 ++plane, flags >>= 1) {
1519
0
                                if (flags & 1) {
1520
0
                                    if (cbuf.end - cbp <
1521
0
                                        2 * cmd_max_intsize(sizeof(uint))) {
1522
0
                                        code = top_up_cbuf(&cbuf, &cbp);
1523
0
                                        if (code < 0)
1524
0
                                            goto top_up_failed;
1525
0
                                    }
1526
0
                                    cmd_getw(planes[plane].raster, cbp);
1527
0
                                    if ((raster1 = planes[plane].raster) != 0)
1528
0
                                        cmd_getw(data_x, cbp);
1529
0
                                } else {
1530
0
                                    planes[plane].raster = raster1;
1531
0
                                }
1532
0
                                planes[plane].data_x = data_x;
1533
0
                            }
1534
0
                        }
1535
0
                        goto idata;
1536
167k
                    case cmd_opv_image_data:
1537
167k
                        cmd_getw(data_height, cbp);
1538
167k
                        if (data_height == 0) {
1539
28.9k
                            if_debug0m('L', mem, " done image\n");
1540
28.9k
                            code = gx_image_end(image_info, true);
1541
28.9k
                            if (code < 0)
1542
0
                                goto out;
1543
28.9k
                            continue;
1544
28.9k
                        }
1545
138k
                        {
1546
138k
                            uint bytes_per_plane;
1547
138k
                            int plane;
1548
1549
138k
                            cmd_getw(bytes_per_plane, cbp);
1550
138k
                            if_debug2m('L', mem, " height=%u raster=%u\n",
1551
138k
                                       data_height, bytes_per_plane);
1552
138k
                            for (plane = 0;
1553
276k
                                 plane < image_info->num_planes;
1554
138k
                                 ++plane
1555
138k
                                 ) {
1556
138k
                                planes[plane].data_x = data_x;
1557
138k
                                planes[plane].raster = bytes_per_plane;
1558
138k
                            }
1559
138k
                        }
1560
138k
idata:                  data_size = 0;
1561
138k
                        {
1562
138k
                            int plane;
1563
1564
276k
                            for (plane = 0; plane < image_info->num_planes;
1565
138k
                                 ++plane)
1566
138k
                                data_size += planes[plane].raster;
1567
138k
                        }
1568
138k
                        data_size *= data_height;
1569
138k
                        data_on_heap = 0;
1570
138k
                        if (cbuf.end - cbp < data_size) {
1571
21.0k
                            code = top_up_cbuf(&cbuf, &cbp);
1572
21.0k
                            if (code < 0)
1573
0
                                goto top_up_failed;
1574
21.0k
                        }
1575
138k
                        if (cbuf.end - cbp >= data_size) {
1576
133k
                            planes[0].data = cbp;
1577
133k
                            cbp += data_size;
1578
133k
                        } else {
1579
4.79k
                            uint cleft = cbuf.end - cbp;
1580
4.79k
                            uint rleft = data_size - cleft;
1581
4.79k
                            byte *rdata;
1582
1583
4.79k
                            if (data_size > cbuf.end - cbuf.data) {
1584
                                /* Allocate a separate buffer. */
1585
4.79k
                                rdata = data_on_heap =
1586
4.79k
                                    gs_alloc_bytes(mem, data_size,
1587
4.79k
                                                   "clist image_data");
1588
4.79k
                                if (rdata == 0) {
1589
0
                                    code = gs_note_error(gs_error_VMerror);
1590
0
                                    goto out;
1591
0
                                }
1592
4.79k
                            } else
1593
0
                                rdata = cbuf.data;
1594
4.79k
                            memmove(rdata, cbp, cleft);
1595
4.79k
                            if (data_on_heap)
1596
4.79k
                                next_is_skip(&cbuf);
1597
4.79k
                            if (sgets(s, rdata + cleft, rleft, &rleft) < 0) {
1598
0
                                code = gs_note_error(gs_error_unregistered); /* Must not happen. */
1599
0
                                goto out;
1600
0
                            }
1601
4.79k
                            planes[0].data = rdata;
1602
4.79k
                            cbp = cbuf.end;     /* force refill */
1603
4.79k
                        }
1604
138k
                        {
1605
138k
                            int plane;
1606
138k
                            const byte *data = planes[0].data;
1607
1608
138k
                            for (plane = 0;
1609
276k
                                 plane < image_info->num_planes;
1610
138k
                                 ++plane
1611
138k
                                 ) {
1612
138k
                                if (planes[plane].raster == 0)
1613
0
                                    planes[plane].data = 0;
1614
138k
                                else {
1615
138k
                                    planes[plane].data = data;
1616
138k
                                    data += planes[plane].raster *
1617
138k
                                        data_height;
1618
138k
                                }
1619
138k
                            }
1620
138k
                        }
1621
#ifdef DEBUG
1622
                        if (gs_debug_c('L')) {
1623
                            int plane;
1624
1625
                            for (plane = 0; plane < image_info->num_planes;
1626
                                 ++plane)
1627
                                if (planes[plane].data != 0)
1628
                                    cmd_print_bits(mem,
1629
                                                   planes[plane].data,
1630
                                                   image_rect.q.x -
1631
                                                   image_rect.p.x,
1632
                                                   data_height,
1633
                                                   planes[plane].raster);
1634
                        }
1635
#endif
1636
138k
                        code = gx_image_plane_data(image_info, planes,
1637
138k
                                                   data_height);
1638
138k
                        if (code < 0)
1639
0
                            gx_image_end(image_info, false);
1640
138k
                        if (data_on_heap)
1641
4.79k
                            gs_free_object(mem, data_on_heap,
1642
138k
                                           "clist image_data");
1643
138k
                        data_x = 0;
1644
138k
                        if (code < 0)
1645
0
                            goto out;
1646
138k
                        continue;
1647
814k
                    case cmd_opv_extend:
1648
814k
                        switch (*cbp++) {
1649
0
                            case cmd_opv_ext_put_params:
1650
0
                                if_debug0m('L', mem, "put_params\n");
1651
0
                                cbuf.ptr = cbp;
1652
0
                                code = read_put_params(&cbuf, &gs_gstate,
1653
0
                                                        cdev, mem);
1654
0
                                cbp = cbuf.ptr;
1655
0
                                if (code > 0)
1656
0
                                    break; /* empty list */
1657
0
                                if (code < 0)
1658
0
                                    goto out;
1659
0
                                if (playback_action == playback_action_setup)
1660
0
                                    goto out;
1661
0
                                break;
1662
287k
                            case cmd_opv_ext_composite:
1663
287k
                                if_debug0m('L', mem, " ext_composite\n");
1664
287k
                                cbuf.ptr = cbp;
1665
                                /*
1666
                                 * The screen phase may have been changed during
1667
                                 * the processing of masked images.
1668
                                 */
1669
287k
                                gx_gstate_setscreenphase(&gs_gstate,
1670
287k
                                            -x0, -y0, gs_color_select_all);
1671
287k
                                cbp -= 2; /* Step back to simplify the cycle invariant below. */
1672
11.0M
                                for (;;) {
1673
                                    /* This internal loop looks ahead for compositor commands and
1674
                                       copies them into a temporary queue. Compositors, which do not paint something,
1675
                                       are marked as idle and later executed with a reduced functionality
1676
                                       for reducing time and memory expense. */
1677
11.0M
                                    int len;
1678
1679
11.0M
                                    if (cbp >= cbuf.warn_limit) {
1680
2.52k
                                        code = top_up_cbuf(&cbuf, &cbp);
1681
2.52k
                                        if (code < 0)
1682
0
                                            goto out;
1683
2.52k
                                    }
1684
#ifdef DEBUG
1685
                                    if (gs_debug_c('L')) {
1686
                                       long offset = (long)clist_file_offset(st, cbp - cbuf.data);
1687
1688
                                       dmlprintf1(mem, "[L]  %ld:", offset);
1689
                                       clist_debug_op(mem, cbp);
1690
                                       dmlprintf(mem, "\n");
1691
                                    }
1692
#endif
1693
11.0M
                                    if (cbp[0] == cmd_opv_extend && cbp[1] == cmd_opv_ext_composite) {
1694
7.13M
                                        gs_composite_t *pcomp, *pcomp_opening;
1695
7.13M
                                        gs_compositor_closing_state closing_state;
1696
1697
7.13M
                                        cbuf.ptr = cbp += 2;
1698
7.13M
                                        code = read_composite(&cbuf, mem, &pcomp);
1699
7.13M
                                        if (code < 0)
1700
0
                                            goto out;
1701
7.13M
                                        cbp = cbuf.ptr;
1702
7.13M
                                        if (pcomp == NULL)
1703
0
                                            continue;
1704
7.13M
                                        if (gs_is_pdf14trans_compositor(pcomp) &&
1705
7.13M
                                            playback_action == playback_action_render_no_pdf14) {
1706
                                            /* free the compositor object */
1707
545k
                                            gs_free_object(mem, pcomp, "read_composite");
1708
545k
                                            pcomp = NULL;
1709
545k
                                            continue;
1710
545k
                                        }
1711
6.58M
                                        pcomp_opening = pcomp_last;
1712
6.58M
                                        closing_state = pcomp->type->procs.is_closing(pcomp, &pcomp_opening, tdev);
1713
6.58M
                                        switch(closing_state)
1714
6.58M
                                        {
1715
0
                                        default:
1716
0
                                            code = (int)closing_state;
1717
0
                                            if (code >= 0)
1718
0
                                                code = gs_note_error(gs_error_unregistered); /* Must not happen. */
1719
0
                                            goto out;
1720
6.00M
                                        case COMP_ENQUEUE:
1721
                                            /* Enqueue. */
1722
6.00M
                                            enqueue_compositor(&pcomp_first, &pcomp_last, pcomp);
1723
6.00M
                                            break;
1724
0
                                        case COMP_EXEC_IDLE:
1725
                                            /* Execute idle. */
1726
0
                                            enqueue_compositor(&pcomp_first, &pcomp_last, pcomp);
1727
0
                                            code = execute_compositor_queue(cdev, &target, &tdev,
1728
0
                                                &gs_gstate, &pcomp_first, &pcomp_last, pcomp_opening, x0, y0, mem, true);
1729
0
                                            if (code < 0)
1730
0
                                                goto out;
1731
0
                                            break;
1732
48.5k
                                        case COMP_EXEC_QUEUE:
1733
                                            /* The opening command was executed. Execute the queue. */
1734
48.5k
                                            enqueue_compositor(&pcomp_first, &pcomp_last, pcomp);
1735
48.5k
                                            code = execute_compositor_queue(cdev, &target, &tdev,
1736
48.5k
                                                &gs_gstate, &pcomp_first, &pcomp_last, pcomp_first, x0, y0, mem, false);
1737
48.5k
                                            if (code < 0)
1738
0
                                                goto out;
1739
48.5k
                                            break;
1740
48.5k
                                        case COMP_REPLACE_PREV:
1741
                                            /* Replace last compositors. */
1742
0
                                            code = execute_compositor_queue(cdev, &target, &tdev,
1743
0
                                                &gs_gstate, &pcomp_first, &pcomp_last, pcomp_opening, x0, y0, mem, true);
1744
0
                                            if (code < 0)
1745
0
                                                goto out;
1746
0
                                            enqueue_compositor(&pcomp_first, &pcomp_last, pcomp);
1747
0
                                            break;
1748
463k
                                        case COMP_REPLACE_CURR:
1749
                                            /* Replace specific compositor. */
1750
463k
                                            code = dequeue_compositor(&pcomp_first, &pcomp_last, pcomp_opening);
1751
463k
                                            if (code < 0)
1752
0
                                                goto out;
1753
463k
                                            enqueue_compositor(&pcomp_first, &pcomp_last, pcomp);
1754
463k
                                            free_compositor(pcomp_opening, mem);
1755
463k
                                            break;
1756
56
                                        case COMP_DROP_QUEUE:
1757
                                            /* Annihilate the last compositors. */
1758
56
                                            enqueue_compositor(&pcomp_first, &pcomp_last, pcomp);
1759
56
                                            code = drop_compositor_queue(&pcomp_first, &pcomp_last, pcomp_opening, mem, x0, y0, &gs_gstate);
1760
56
                                            if (code < 0)
1761
0
                                                goto out;
1762
56
                                            break;
1763
64.8k
                                        case COMP_MARK_IDLE:
1764
                                            /* Mark as idle. */
1765
64.8k
                                            enqueue_compositor(&pcomp_first, &pcomp_last, pcomp);
1766
64.8k
                                            mark_as_idle(pcomp_opening, pcomp);
1767
6.58M
                                        }
1768
6.58M
                                    } else if (is_null_compositor_op(cbp, &len)) {
1769
3.61M
                                        cbuf.ptr = cbp += len;
1770
3.61M
                                    } else if (cbp[0] == cmd_opv_end_page) {
1771
                                        /* End page, drop the queue. */
1772
88.7k
                                        code = execute_compositor_queue(cdev, &target, &tdev,
1773
88.7k
                                                &gs_gstate, &pcomp_first, &pcomp_last, pcomp_first, x0, y0, mem, true);
1774
88.7k
                                        if (code < 0)
1775
0
                                            goto out;
1776
88.7k
                                        break;
1777
215k
                                    } else if (pcomp_last != NULL &&
1778
215k
                                            pcomp_last->type->procs.is_friendly(pcomp_last, cbp[0], cbp[1])) {
1779
                                        /* Immediately execute friendly commands
1780
                                           inside the compositor lookahead loop.
1781
                                           Currently there are few friendly commands for the pdf14 compositor only
1782
                                           due to the logic defined in c_pdf14trans_is_friendly.
1783
                                           This code duplicates some code portions from the main loop,
1784
                                           but we have no better idea with no slowdown to the main loop.
1785
                                         */
1786
16.5k
                                        uint cb;
1787
1788
16.5k
                                        switch (*cbp++) {
1789
0
                                            case cmd_opv_extend:
1790
0
                                                switch (*cbp++) {
1791
0
                                                    case cmd_opv_ext_put_halftone:
1792
0
                                                        {
1793
0
                                                            uint    ht_size;
1794
1795
0
                                                            enc_u_getw(ht_size, cbp);
1796
0
                                                            code = read_alloc_ht_buff(&ht_buff, ht_size, mem);
1797
0
                                                            if (code < 0)
1798
0
                                                                goto out;
1799
0
                                                        }
1800
0
                                                        break;
1801
0
                                                    case cmd_opv_ext_put_ht_seg:
1802
0
                                                        cbuf.ptr = cbp;
1803
0
                                                        code = read_ht_segment(&ht_buff, &cbuf,
1804
0
                                                                               &gs_gstate, tdev,
1805
0
                                                                               mem);
1806
0
                                                        cbp = cbuf.ptr;
1807
0
                                                        if (code < 0)
1808
0
                                                            goto out;
1809
0
                                                        break;
1810
0
                                                    default:
1811
0
                                                        code = gs_note_error(gs_error_unregistered); /* Must not happen. */
1812
0
                                                        goto out;
1813
0
                                                }
1814
0
                                                break;
1815
16.5k
                                            case cmd_opv_set_misc:
1816
16.5k
                                                cb = *cbp++;
1817
16.5k
                                                switch (cb >> 6) {
1818
16.5k
                                                    case cmd_set_misc_map >> 6:
1819
16.5k
                                                        cbuf.ptr = cbp;
1820
16.5k
                                                        code = read_set_misc_map(cb, &cbuf, &gs_gstate, mem);
1821
16.5k
                                                        if (code < 0)
1822
0
                                                            goto out;
1823
16.5k
                                                        cbp = cbuf.ptr;
1824
16.5k
                                                        break;
1825
0
                                                    default:
1826
0
                                                        code = gs_note_error(gs_error_unregistered); /* Must not happen. */
1827
0
                                                        goto out;
1828
16.5k
                                                }
1829
16.5k
                                                break;
1830
16.5k
                                            default:
1831
0
                                                code = gs_note_error(gs_error_unregistered); /* Must not happen. */
1832
0
                                                goto out;
1833
16.5k
                                        }
1834
198k
                                    } else {
1835
                                        /* A drawing command, execute entire queue. */
1836
198k
                                        code = execute_compositor_queue(cdev, &target, &tdev,
1837
198k
                                            &gs_gstate, &pcomp_first, &pcomp_last, pcomp_first, x0, y0, mem, false);
1838
198k
                                        if (code < 0)
1839
0
                                            goto out;
1840
198k
                                        break;
1841
198k
                                    }
1842
11.0M
                                }
1843
287k
                                if (pcomp_last != NULL) {
1844
0
                                    code = gs_note_error(gs_error_unregistered);
1845
0
                                    goto out;
1846
0
                                }
1847
287k
                                break;
1848
287k
                            case cmd_opv_ext_put_halftone:
1849
93
                                {
1850
93
                                    uint    ht_size;
1851
1852
93
                                    if_debug0m('L', mem, " ext_put_halftone\n");
1853
93
                                    enc_u_getw(ht_size, cbp);
1854
93
                                    code = read_alloc_ht_buff(&ht_buff, ht_size, mem);
1855
93
                                    if (code < 0)
1856
0
                                        goto out;
1857
93
                                }
1858
93
                                break;
1859
93
                            case cmd_opv_ext_put_ht_seg:
1860
93
                                if_debug0m('L', mem, " ext_put_ht_seg\n");
1861
93
                                cbuf.ptr = cbp;
1862
93
                                code = read_ht_segment(&ht_buff, &cbuf,
1863
93
                                                       &gs_gstate, tdev,
1864
93
                                                       mem);
1865
93
                                cbp = cbuf.ptr;
1866
93
                                if (code < 0)
1867
0
                                    goto out;
1868
93
                                break;
1869
93
                            case cmd_opv_ext_set_color_is_devn:
1870
0
                                state.color_is_devn = true;
1871
0
                                if_debug0m('L', mem, " ext_set_color_is_devn\n");
1872
0
                                break;
1873
0
                            case cmd_opv_ext_unset_color_is_devn:
1874
0
                                state.color_is_devn = false;
1875
0
                                if_debug0m('L', mem, " ext_unset_color_is_devn\n");
1876
0
                                break;
1877
0
                            case cmd_opv_ext_tile_rect_hl:
1878
                                /* Strip tile with devn colors */
1879
0
                                cbp = cmd_read_rect(op & 0xf0, &state.rect, cbp);
1880
0
                                if_debug4m('L', mem, " x=%d y=%d w=%d h=%d\n",
1881
0
                                           state.rect.x, state.rect.y,
1882
0
                                           state.rect.width,state.rect.height);
1883
0
                                code = (*dev_proc(tdev, strip_tile_rect_devn))
1884
0
                                    (tdev, &state_tile,
1885
0
                                     state.rect.x - x0, state.rect.y - y0,
1886
0
                                     state.rect.width, state.rect.height,
1887
0
                                     &(state.tile_color_devn[0]),
1888
0
                                     &(state.tile_color_devn[1]),
1889
0
                                     tile_phase.x, tile_phase.y);
1890
0
                                break;
1891
472k
                            case cmd_opv_ext_put_fill_dcolor:
1892
472k
                                pdcolor = &fill_color;
1893
472k
                                goto load_dcolor;
1894
54.1k
                            case cmd_opv_ext_put_stroke_dcolor:
1895
54.1k
                                pdcolor = &stroke_color;
1896
54.1k
                                goto load_dcolor;
1897
0
                            case cmd_opv_ext_put_tile_devn_color0:
1898
0
                                pdcolor = &set_dev_colors[0];
1899
0
                                goto load_dcolor;
1900
0
                            case cmd_opv_ext_put_tile_devn_color1:
1901
0
                                pdcolor = &set_dev_colors[1];
1902
526k
                    load_dcolor:{
1903
526k
                                    uint    color_size;
1904
526k
                                    int left, offset, l;
1905
526k
                                    const gx_device_color_type_t *  pdct;
1906
526k
                                    byte type_and_flag = *cbp++;
1907
526k
                                    byte is_continuation = type_and_flag & 0x80;
1908
1909
526k
                                    if_debug0m('L', mem, " cmd_opv_ext_put_drawing_color\n");
1910
526k
                                    pdct = gx_get_dc_type_from_index(type_and_flag & 0x7F);
1911
526k
                                    if (pdct == 0) {
1912
0
                                        code = gs_note_error(gs_error_rangecheck);
1913
0
                                        goto out;
1914
0
                                    }
1915
526k
                                    offset = 0;
1916
526k
                                    if (is_continuation)
1917
526k
                                        enc_u_getw(offset, cbp);
1918
526k
                                    enc_u_getw(color_size, cbp);
1919
526k
                                    left = color_size;
1920
526k
                                    if (!left) {
1921
                                        /* We still need to call pdct->read because it may change dev_color.type -
1922
                                           see gx_dc_null_read.*/
1923
70.0k
                                        code = pdct->read(pdcolor, &gs_gstate,
1924
70.0k
                                                          pdcolor, tdev, offset,
1925
70.0k
                                                          cbp, 0, mem, x0, y0);
1926
70.0k
                                        if (code < 0)
1927
0
                                            goto out;
1928
70.0k
                                    }
1929
2.28M
                                    while (left) {
1930
1.76M
                                        if (cbuf.warn_limit - cbp < (int)left) {  /* cbp can be past warn_limit */
1931
1.35M
                                            code = top_up_cbuf(&cbuf, &cbp);
1932
1.35M
                                            if (code < 0)
1933
0
                                                goto top_up_failed;
1934
1.35M
                                        }
1935
1.76M
                                        l = min(left, cbuf.end - cbp);
1936
1.76M
                                        code = pdct->read(pdcolor, &gs_gstate,
1937
1.76M
                                                          pdcolor, tdev, offset,
1938
1.76M
                                                          cbp, l, mem, x0, y0);
1939
1.76M
                                        if (code < 0)
1940
0
                                            goto out;
1941
1.76M
                                        l = code;
1942
1.76M
                                        cbp += l;
1943
1.76M
                                        offset += l;
1944
1.76M
                                        left -= l;
1945
1.76M
                                    }
1946
526k
                                    code = gx_color_load(pdcolor, &gs_gstate,
1947
526k
                                                         tdev);
1948
526k
                                    if (code < 0)
1949
0
                                        goto out;
1950
526k
                                }
1951
526k
                                break;
1952
526k
                            default:
1953
0
                                goto bad_op;
1954
814k
                        }
1955
814k
                        break;
1956
814k
                    default:
1957
0
                        goto bad_op;
1958
1.71M
                }
1959
1.32M
                continue;
1960
3.36M
            case cmd_op_segment >> 4:
1961
3.36M
                {
1962
3.36M
                    int i;
1963
3.36M
                    static const byte op_num_operands[] = {
1964
3.36M
                        cmd_segment_op_num_operands_values
1965
3.36M
                    };
1966
3.36M
                  rgapto:
1967
3.36M
                    if (!in_path) {
1968
740k
                        ppos.x = int2fixed(state.rect.x);
1969
740k
                        ppos.y = int2fixed(state.rect.y);
1970
740k
                        if_debug2m('L', mem, " (%d,%d)", state.rect.x,
1971
740k
                                   state.rect.y);
1972
740k
                        notes = sn_none;
1973
740k
                        in_path = true;
1974
740k
                    }
1975
8.63M
                    for (i = 0; i < op_num_operands[op & 0xf]; ++i) {
1976
5.27M
                        fixed v;
1977
5.27M
                        int b = *cbp;
1978
1979
5.27M
                        switch (b >> 5) {
1980
767k
                            case 0:
1981
1.26M
                            case 1:
1982
1.26M
                                vs[i++] =
1983
1.26M
                                    ((fixed) ((b ^ 0x20) - 0x20) << 13) +
1984
1.26M
                                    ((int)cbp[1] << 5) + (cbp[2] >> 3);
1985
1.26M
                                if_debug1m('L', mem, " %g", fixed2float(vs[i - 1]));
1986
1.26M
                                cbp += 2;
1987
1.26M
                                v = (int)((*cbp & 7) ^ 4) - 4;
1988
1.26M
                                break;
1989
1.37M
                            case 2:
1990
2.60M
                            case 3:
1991
2.60M
                                v = (b ^ 0x60) - 0x20;
1992
2.60M
                                break;
1993
495k
                            case 4:
1994
869k
                            case 5:
1995
                                /*
1996
                                 * Without the following cast, C's
1997
                                 * brain-damaged coercion rules cause the
1998
                                 * result to be considered unsigned, and not
1999
                                 * sign-extended on machines where
2000
                                 * sizeof(long) > sizeof(int).
2001
                                 */
2002
869k
                                v = (((b ^ 0xa0) - 0x20) << 8) + (int)*++cbp;
2003
869k
                                break;
2004
477k
                            case 6:
2005
477k
                                v = (b ^ 0xd0) - 0x10;
2006
477k
                                vs[i] =
2007
477k
                                    ((v << 8) + cbp[1]) << (_fixed_shift - 2);
2008
477k
                                if_debug1m('L', mem, " %g", fixed2float(vs[i]));
2009
477k
                                cbp += 2;
2010
477k
                                continue;
2011
51.6k
                            default /*case 7 */ :
2012
51.6k
                                v = (int)(*++cbp ^ 0x80) - 0x80;
2013
103k
                                for (b = 0; b < sizeof(fixed) - 3; ++b)
2014
51.6k
                                    v = (v << 8) + *++cbp;
2015
51.6k
                                break;
2016
5.27M
                        }
2017
4.79M
                        cbp += 3;
2018
                        /* Absent the cast in the next statement, */
2019
                        /* the Borland C++ 4.5 compiler incorrectly */
2020
                        /* sign-extends the result of the shift. */
2021
4.79M
                        vs[i] = (v << 16) + (uint) (cbp[-2] << 8) + cbp[-1];
2022
4.79M
                        if_debug1m('L', mem, " %g", fixed2float(vs[i]));
2023
4.79M
                    }
2024
3.36M
                    if_debug0m('L', mem, "\n");
2025
3.36M
                    code = clist_decode_segment(&path, op, vs, &ppos,
2026
3.36M
                                                x0, y0, notes);
2027
3.36M
                    if (code < 0)
2028
0
                        goto out;
2029
3.36M
                }
2030
3.36M
                continue;
2031
3.36M
            case cmd_op_path >> 4:
2032
1.63M
                if (op == cmd_opv_rgapto)
2033
0
                    goto rgapto;
2034
1.63M
                else if (op == cmd_opv_lock_pattern) {
2035
447
                    gs_id id;
2036
447
                    int lock = *cbp++;
2037
447
                    cmd_get_value(id, cbp);
2038
447
                    if_debug2m('L', mem, "id=0x%lx, lock=%d\n", id, lock);
2039
                    /* We currently lock the pattern in all the bands, even in ones
2040
                     * where we haven't used the pattern. This can cause the following
2041
                     * call to return with 'undefined' because the pattern is not
2042
                     * found. Just swallow this error and continue. */
2043
447
                    code = gx_pattern_cache_entry_set_lock(&gs_gstate, id, lock);
2044
447
                    if (code == gs_error_undefined)
2045
0
                        code = 0;
2046
447
                    if (code < 0)
2047
0
                        goto out;
2048
447
                    continue;
2049
1.63M
                } else {
2050
1.63M
                    gx_path fpath;
2051
1.63M
                    gx_path *ppath = &path;
2052
2053
1.63M
                    if_debug0m('L', mem, "\n");
2054
                    /* if in clip, flatten path first */
2055
1.63M
                    if (in_clip) {
2056
117k
                        gx_path_init_local(&fpath, mem);
2057
117k
                        code = gx_path_add_flattened_accurate(&path, &fpath,
2058
117k
                                             gs_currentflat_inline(&gs_gstate),
2059
117k
                                             gs_gstate.accurate_curves);
2060
117k
                        if (code < 0)
2061
0
                            goto out;
2062
117k
                        ppath = &fpath;
2063
117k
                    }
2064
1.63M
                    switch (op) {
2065
650k
                        case cmd_opv_fill:
2066
650k
                            fill_params.rule = gx_rule_winding_number;
2067
650k
                            goto fill;
2068
6.60k
                        case cmd_opv_eofill:
2069
6.60k
                            fill_params.rule = gx_rule_even_odd;
2070
657k
                        fill:
2071
657k
                            fill_params.adjust = gs_gstate.fill_adjust;
2072
657k
                            fill_params.flatness = gs_gstate.flatness;
2073
657k
                            code = (*dev_proc(tdev, fill_path))(tdev, &gs_gstate, ppath,
2074
657k
                                                                &fill_params, &fill_color, pcpath);
2075
657k
                            break;
2076
7.01k
                        case cmd_opv_fill_stroke:
2077
7.01k
                            fill_params.rule = gx_rule_winding_number;
2078
7.01k
                            goto fill_stroke;
2079
2.33k
                        case cmd_opv_eofill_stroke:
2080
2.33k
                            fill_params.rule = gx_rule_even_odd;
2081
9.35k
                        fill_stroke:
2082
9.35k
                            fill_params.adjust = gs_gstate.fill_adjust;
2083
9.35k
                            fill_params.flatness = gs_gstate.flatness;
2084
9.35k
                            stroke_params.flatness = gs_gstate.flatness;
2085
9.35k
                            stroke_params.traditional = false;
2086
9.35k
                            code = (*dev_proc(tdev, fill_stroke_path))(tdev, &gs_gstate, ppath,
2087
9.35k
                                                                &fill_params, &fill_color,
2088
9.35k
                                                                &stroke_params, &stroke_color, pcpath);
2089
9.35k
                            break;
2090
164k
                        case cmd_opv_stroke:
2091
164k
                            stroke_params.flatness = gs_gstate.flatness;
2092
164k
                            stroke_params.traditional = false;
2093
164k
                            code = (*dev_proc(tdev, stroke_path))
2094
164k
                                                       (tdev, &gs_gstate,
2095
164k
                                                       ppath, &stroke_params,
2096
164k
                                                       &stroke_color, pcpath);
2097
164k
                            break;
2098
19.3k
                        case cmd_opv_polyfill:
2099
19.3k
                            code = clist_do_polyfill(tdev, ppath, &fill_color,
2100
19.3k
                                                     gs_gstate.log_op);
2101
19.3k
                            break;
2102
786k
                        case cmd_opv_fill_trapezoid:
2103
786k
                            {
2104
786k
                                gs_fixed_edge left, right;
2105
786k
                                fixed ybot, ytop;
2106
786k
                                int options, swap_axes, wh;
2107
786k
                                fixed x0f;
2108
786k
                                fixed y0f;
2109
786k
                                gx_device *ttdev = tdev;
2110
2111
786k
                                if (pcpath != NULL && !clipper_dev_open) {
2112
777
                                    gx_make_clip_device_on_stack(&clipper_dev, pcpath, tdev);
2113
777
                                    clipper_dev_open = true;
2114
777
                                }
2115
786k
                                if (clipper_dev_open)
2116
533k
                                    ttdev = (gx_device *)&clipper_dev;
2117
                                /* Note that if we have transparency present, the clipper device may need to have
2118
                                   its color information updated to be synced up with the target device.
2119
                                   This can occur if we had fills of a path first with a transparency mask to get
2120
                                   an XPS opacity followed by a fill with a transparency group. This occurs in
2121
                                   the XPS gradient code */
2122
786k
                                if (tdev->color_info.num_components != ttdev->color_info.num_components){
2123
                                    /* Reset the clipper device color information. Only worry about
2124
                                       the information that is used in the trap code */
2125
0
                                    ttdev->color_info.num_components = tdev->color_info.num_components;
2126
0
                                    ttdev->color_info.depth = tdev->color_info.depth;
2127
0
                                    ttdev->color_info.polarity = tdev->color_info.polarity;
2128
0
                                    memcpy(&(ttdev->color_info.comp_bits),&(tdev->color_info.comp_bits),GX_DEVICE_COLOR_MAX_COMPONENTS);
2129
0
                                    memcpy(&(ttdev->color_info.comp_shift),&(tdev->color_info.comp_shift),GX_DEVICE_COLOR_MAX_COMPONENTS);
2130
0
                                }
2131
786k
                                cmd_getw(left.start.x, cbp);
2132
786k
                                cmd_getw(left.start.y, cbp);
2133
786k
                                cmd_getw(left.end.x, cbp);
2134
786k
                                cmd_getw(left.end.y, cbp);
2135
786k
                                cmd_getw(right.start.x, cbp);
2136
786k
                                cmd_getw(right.start.y, cbp);
2137
786k
                                cmd_getw(right.end.x, cbp);
2138
786k
                                cmd_getw(right.end.y, cbp);
2139
786k
                                cmd_getw(options, cbp);
2140
786k
                                if (!(options & 4)) {
2141
110k
                                    cmd_getw(ybot, cbp);
2142
110k
                                    cmd_getw(ytop, cbp);
2143
110k
                                } else
2144
676k
                                    ytop = ybot = 0; /* Unused, but quiet gcc warning. */
2145
786k
                                swap_axes = options & 1;
2146
786k
                                wh = swap_axes ? tdev->width : tdev->height;
2147
786k
                                x0f = int2fixed(swap_axes ? y0 : x0);
2148
786k
                                y0f = int2fixed(swap_axes ? x0 : y0);
2149
786k
                                left.start.x -= x0f;
2150
786k
                                left.start.y -= y0f;
2151
786k
                                left.end.x -= x0f;
2152
786k
                                left.end.y -= y0f;
2153
786k
                                right.start.x -= x0f;
2154
786k
                                right.start.y -= y0f;
2155
786k
                                right.end.x -= x0f;
2156
786k
                                right.end.y -= y0f;
2157
786k
                                if (options & 2) {
2158
767k
                                    uchar num_components = tdev->color_info.num_components;
2159
767k
                                    frac31 c[4][GX_DEVICE_COLOR_MAX_COMPONENTS], *cc[4];
2160
767k
                                    byte colors_mask, i, j, m = 1;
2161
767k
                                    gs_fill_attributes fa;
2162
767k
                                    gs_fixed_rect clip;
2163
767k
                                    fixed hh = int2fixed(swap_axes ? target->width : target->height);
2164
2165
767k
                                    if (cbuf.end - cbp < 5 * cmd_max_intsize(sizeof(frac31))) {
2166
208
                                        code = top_up_cbuf(&cbuf, &cbp);
2167
208
                                        if (code < 0)
2168
0
                                            goto top_up_failed;
2169
208
                                    }
2170
767k
                                    cmd_getw(clip.p.x, cbp);
2171
767k
                                    cmd_getw(clip.p.y, cbp);
2172
767k
                                    cmd_getw(clip.q.x, cbp);
2173
767k
                                    cmd_getw(clip.q.y, cbp);
2174
767k
                                    clip.p.x -= x0f;
2175
767k
                                    clip.p.y -= y0f;
2176
767k
                                    clip.q.x -= x0f;
2177
767k
                                    clip.q.y -= y0f;
2178
767k
                                    if (clip.p.y < 0)
2179
662k
                                        clip.p.y = 0;
2180
767k
                                    if (clip.q.y > hh)
2181
574k
                                        clip.q.y = hh;
2182
767k
                                    fa.clip = &clip;
2183
767k
                                    fa.swap_axes = swap_axes;
2184
767k
                                    fa.ht = NULL;
2185
767k
                                    fa.lop = lop_default; /* fgixme: gs_gstate.log_op; */
2186
767k
                                    fa.ystart = ybot - y0f;
2187
767k
                                    fa.yend = ytop - y0f;
2188
767k
                                    cmd_getw(colors_mask, cbp);
2189
3.83M
                                    for (i = 0; i < 4; i++, m <<= 1) {
2190
3.06M
                                        if (colors_mask & m) {
2191
2.21M
                                            if (cbuf.end - cbp < num_components * cmd_max_intsize(sizeof(frac31))) {
2192
2.01k
                                                code = top_up_cbuf(&cbuf, &cbp);
2193
2.01k
                                                if (code < 0)
2194
0
                                                    goto top_up_failed;
2195
2.01k
                                            }
2196
2.21M
                                            cc[i] = c[i];
2197
8.84M
                                            for (j = 0; j < num_components; j++)
2198
6.63M
                                                cmd_getfrac(c[i][j], cbp);
2199
2.21M
                                        } else
2200
857k
                                            cc[i] = NULL;
2201
3.06M
                                    }
2202
767k
                                    if (options & 4) {
2203
676k
#                                       if 1 /* Disable to debug gx_fill_triangle_small. */
2204
676k
                                        code = dev_proc(ttdev, fill_linear_color_triangle)(ttdev, &fa,
2205
676k
                                                        &left.start, &left.end, &right.start,
2206
676k
                                                        cc[0], cc[1], cc[2]);
2207
#                                       else
2208
                                        code = 0;
2209
#                                       endif
2210
676k
                                        if (code == 0) {
2211
                                            /* The target device didn't fill the trapezoid and
2212
                                               requests a decomposition. Subdivide into smaller triangles : */
2213
0
                                            if (pfs.dev == NULL)
2214
0
                                                code = gx_init_patch_fill_state_for_clist(tdev, &pfs, mem);
2215
0
                                            if (code >= 0) {
2216
0
                                                pfs.dev = ttdev;
2217
0
                                                pfs.rect = clip; /* fixme: eliminate 'clip'. */
2218
0
                                                fa.pfs = &pfs;
2219
0
                                                code = gx_fill_triangle_small(ttdev, &fa,
2220
0
                                                            &left.start, &left.end, &right.start,
2221
0
                                                            cc[0], cc[1], cc[2]);
2222
0
                                            }
2223
0
                                        }
2224
676k
                                    } else {
2225
90.5k
                                        code = dev_proc(ttdev, fill_linear_color_trapezoid)(ttdev, &fa,
2226
90.5k
                                                        &left.start, &left.end, &right.start, &right.end,
2227
90.5k
                                                        cc[0], cc[1], cc[2], cc[3]);
2228
90.5k
                                        if (code == 0) {
2229
                                            /* Fixme : The target device didn't fill the trapezoid and
2230
                                               requests a decomposition.
2231
                                               Currently we never call it with 4 colors (see gxshade6.c)
2232
                                               and 2 colors must not return 0 - see comment to
2233
                                               dev_t_proc_fill_linear_color_trapezoid in gxdevcli.c .
2234
                                               Must not happen. */
2235
0
                                            code = gs_note_error(gs_error_unregistered);
2236
0
                                        }
2237
90.5k
                                    }
2238
767k
                                } else
2239
19.4k
                                    code = gx_default_fill_trapezoid(ttdev, &left, &right,
2240
19.4k
                                        max(ybot - y0f, fixed_half),
2241
19.4k
                                        min(ytop - y0f, int2fixed(wh)), swap_axes,
2242
19.4k
                                        &fill_color, gs_gstate.log_op);
2243
786k
                            }
2244
786k
                           break;
2245
786k
                        default:
2246
0
                            goto bad_op;
2247
1.63M
                    }
2248
1.63M
                    if (ppath != &path)
2249
117k
                        gx_path_free(ppath, "clist_render_band");
2250
1.63M
                }
2251
1.63M
                if (in_path) {  /* path might be empty! */
2252
740k
                    state.rect.x = fixed2int_var(ppos.x);
2253
740k
                    state.rect.y = fixed2int_var(ppos.y);
2254
740k
                    in_path = false;
2255
740k
                }
2256
1.63M
                gx_path_free(&path, "clist_render_band");
2257
1.63M
                gx_path_init_local(&path, mem);
2258
1.63M
                if (code < 0)
2259
0
                    goto out;
2260
1.63M
                continue;
2261
1.63M
            default:
2262
0
              bad_op:mlprintf5(mem, "Bad op %02x band y0 = %d file pos %"PRId64" buf pos %d/%d\n",
2263
0
                 op, y0, stell(s), (int)(cbp - cbuf.data), (int)(cbuf.end - cbuf.data));
2264
0
                {
2265
0
                    const byte *pp;
2266
2267
0
                    for (pp = cbuf.data; pp < cbuf.end; pp += 10) {
2268
0
                        dmlprintf1(mem, "%4d:", (int)(pp - cbuf.data));
2269
0
                        dmprintf10(mem, " %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
2270
0
                                  pp[0], pp[1], pp[2], pp[3], pp[4],
2271
0
                                  pp[5], pp[6], pp[7], pp[8], pp[9]);
2272
0
                    }
2273
0
                }
2274
0
                code = gs_note_error(gs_error_Fatal);
2275
0
                goto out;
2276
29.1M
        }
2277
29.1M
        if_debug4m('L', mem, " x=%d y=%d w=%d h=%d\n",
2278
11.9M
                  state.rect.x, state.rect.y, state.rect.width,
2279
11.9M
                  state.rect.height);
2280
11.9M
        switch (op >> 4) {
2281
341k
            case cmd_op_fill_rect >> 4:
2282
341k
                if (state.rect.width == 0 && state.rect.height == 0 &&
2283
341k
                    state.rect.x == 0 && state.rect.y == 0) {
2284
                    /* FIXME: This test should be unnecessary. Bug 692076
2285
                     * is open pending a proper fix. */
2286
179k
                    code = (dev_proc(tdev, fillpage) == NULL ? 0 :
2287
179k
                            (*dev_proc(tdev, fillpage))(tdev, &gs_gstate,
2288
179k
                                                        &fill_color));
2289
179k
                    break;
2290
179k
                }
2291
963k
            case cmd_op_fill_rect_short >> 4:
2292
10.3M
            case cmd_op_fill_rect_tiny >> 4:
2293
10.3M
                if (!state.lop_enabled) {
2294
10.3M
                    code = (*dev_proc(tdev, fill_rectangle))
2295
10.3M
                        (tdev, state.rect.x - x0, state.rect.y - y0,
2296
10.3M
                         state.rect.width, state.rect.height,
2297
10.3M
                         state.colors[1]);
2298
10.3M
                    break;
2299
10.3M
                }
2300
0
                source = NULL;
2301
0
                data_x = 0;
2302
0
                raster = 0;
2303
0
                colors[0] = colors[1] = state.colors[1];
2304
0
                log_op = state.lop;
2305
0
                pcolor = colors;
2306
0
         do_rop:code = (*dev_proc(tdev, strip_copy_rop2))
2307
0
                                (tdev, source, data_x, raster, gx_no_bitmap_id,
2308
0
                                 pcolor, &state_tile,
2309
0
                                 (state.tile_colors[0] == gx_no_color_index &&
2310
0
                                  state.tile_colors[1] == gx_no_color_index ?
2311
0
                                  NULL : state.tile_colors),
2312
0
                                 state.rect.x - x0, state.rect.y - y0,
2313
0
                                 state.rect.width - data_x, state.rect.height,
2314
0
                                 tile_phase.x, tile_phase.y, log_op,
2315
0
                                 plane_height);
2316
0
                     plane_height = 0;
2317
0
                data_x = 0;
2318
0
                break;
2319
11
            case cmd_op_tile_rect >> 4:
2320
11
                if (state.rect.width == 0 && state.rect.height == 0 &&
2321
11
                    state.rect.x == 0 && state.rect.y == 0) {
2322
0
                    code = (*dev_proc(tdev, fillpage))(tdev, &gs_gstate, &fill_color);
2323
0
                    break;
2324
0
                }
2325
2.88k
            case cmd_op_tile_rect_short >> 4:
2326
6.18k
            case cmd_op_tile_rect_tiny >> 4:
2327
                /* Currently we don't use lop with strip_tile_rectangle. */
2328
6.18k
                code = (*dev_proc(tdev, strip_tile_rectangle))
2329
6.18k
                    (tdev, &state_tile,
2330
6.18k
                     state.rect.x - x0, state.rect.y - y0,
2331
6.18k
                     state.rect.width, state.rect.height,
2332
6.18k
                     state.tile_colors[0], state.tile_colors[1],
2333
6.18k
                     tile_phase.x, tile_phase.y);
2334
6.18k
                break;
2335
1.46M
            case cmd_op_copy_mono_planes >> 4:
2336
1.46M
                if (state.lop_enabled) {
2337
0
                    pcolor = state.colors;
2338
0
                    log_op = state.lop;
2339
0
                    goto do_rop;
2340
0
                }
2341
1.46M
                if ((op & cmd_copy_use_tile) || pcpath != NULL) {       /*
2342
                                                                         * This call of copy_mono originated as a call
2343
                                                                         * of fill_mask.
2344
                                                                         */
2345
1.45M
                    code = gx_image_fill_masked
2346
1.45M
                        (tdev, source, data_x, raster, gx_no_bitmap_id,
2347
1.45M
                         state.rect.x - x0, state.rect.y - y0,
2348
1.45M
                         state.rect.width - data_x, state.rect.height,
2349
1.45M
                         &fill_color, 1, gs_gstate.log_op, pcpath);
2350
1.45M
                } else {
2351
6.99k
                    if (plane_height == 0) {
2352
6.99k
                        code = (*dev_proc(tdev, copy_mono))
2353
6.99k
                             (tdev, source, data_x, raster, gx_no_bitmap_id,
2354
6.99k
                              state.rect.x - x0, state.rect.y - y0,
2355
6.99k
                              state.rect.width - data_x, state.rect.height,
2356
6.99k
                              state.colors[0], state.colors[1]);
2357
6.99k
                    } else {
2358
0
                        code = (*dev_proc(tdev, copy_planes))
2359
0
                             (tdev, source, data_x, raster, gx_no_bitmap_id,
2360
0
                              state.rect.x - x0, state.rect.y - y0,
2361
0
                              state.rect.width - data_x, state.rect.height,
2362
0
                              plane_height);
2363
0
                    }
2364
6.99k
                }
2365
1.46M
                plane_height = 0;
2366
1.46M
                data_x = 0;
2367
1.46M
                break;
2368
22.3k
            case cmd_op_copy_color_alpha >> 4:
2369
22.3k
                if (state.color_is_alpha) {
2370
/****** CAN'T DO ROP WITH ALPHA ******/
2371
0
                    if (state.color_is_devn &&
2372
0
                        dev_proc(tdev, copy_alpha_hl_color) != gx_default_no_copy_alpha_hl_color) { /* FIXME */
2373
0
                        code = (*dev_proc(tdev, copy_alpha_hl_color))
2374
0
                            (tdev, source, data_x, raster, gx_no_bitmap_id,
2375
0
                             state.rect.x - x0, state.rect.y - y0,
2376
0
                             state.rect.width - data_x, state.rect.height,
2377
0
                             &fill_color, depth);
2378
0
                    } else {
2379
0
                        code = (*dev_proc(tdev, copy_alpha))
2380
0
                            (tdev, source, data_x, raster, gx_no_bitmap_id,
2381
0
                             state.rect.x - x0, state.rect.y - y0,
2382
0
                             state.rect.width - data_x, state.rect.height,
2383
0
                             state.colors[1], depth);
2384
0
                    }
2385
22.3k
                } else {
2386
22.3k
                    if (state.lop_enabled) {
2387
0
                        pcolor = NULL;
2388
0
                        log_op = state.lop;
2389
0
                        goto do_rop;
2390
0
                    }
2391
22.3k
                    code = (*dev_proc(tdev, copy_color))
2392
22.3k
                        (tdev, source, data_x, raster, gx_no_bitmap_id,
2393
22.3k
                         state.rect.x - x0, state.rect.y - y0,
2394
22.3k
                         state.rect.width - data_x, state.rect.height);
2395
22.3k
                }
2396
22.3k
                data_x = 0;
2397
22.3k
                break;
2398
0
            default:            /* can't happen */
2399
0
                goto bad_op;
2400
11.9M
        }
2401
11.9M
    }
2402
    /* Clean up before we exit. */
2403
182k
  out:
2404
182k
    if (ht_buff.pbuff != 0) {
2405
0
        gs_free_object(mem, ht_buff.pbuff, "clist_playback_band(ht_buff)");
2406
0
        ht_buff.pbuff = 0;
2407
0
        ht_buff.pcurr = 0;
2408
0
    }
2409
182k
    ht_buff.ht_size = 0;
2410
182k
    ht_buff.read_size = 0;
2411
2412
182k
    if (pcomp_last != NULL) {
2413
0
        int code1 = drop_compositor_queue(&pcomp_first, &pcomp_last, NULL, mem, x0, y0, &gs_gstate);
2414
2415
0
        if (code == 0)
2416
0
            code = code1;
2417
0
    }
2418
182k
    gx_cpath_free(&clip_path, "clist_render_band exit");
2419
182k
    gx_path_free(&path, "clist_render_band exit");
2420
182k
    if (gs_gstate.pattern_cache != NULL) {
2421
3.75k
        gx_pattern_cache_free(gs_gstate.pattern_cache);
2422
3.75k
        gs_gstate.pattern_cache = NULL;
2423
3.75k
    }
2424
    /* Free the client color and device colors allocated upon entry */
2425
182k
    gs_free_object(mem, gs_gstate.color[0].ccolor, "clist_playback_band");
2426
182k
    gs_free_object(mem, gs_gstate.color[1].ccolor, "clist_playback_band");
2427
182k
    gs_free_object(mem, gs_gstate.color[0].dev_color, "clist_playback_band");
2428
182k
    gs_free_object(mem, gs_gstate.color[1].dev_color, "clist_playback_band");
2429
182k
    gs_gstate.color[0].ccolor = gs_gstate.color[1].ccolor = NULL;
2430
182k
    gs_gstate.color[0].dev_color = gs_gstate.color[1].dev_color = NULL;
2431
2432
    /* The imager state release will decrement the icc link cache.  To avoid
2433
       race conditions lock the cache */
2434
182k
    gx_monitor_enter(cdev->icc_cache_cl->lock);
2435
182k
    gs_gstate_release(&gs_gstate);
2436
182k
    gx_monitor_leave(cdev->icc_cache_cl->lock); /* done with increment, let everyone run */
2437
182k
    gs_free_object(mem, data_bits, "clist_playback_band(data_bits)");
2438
182k
    if (target != orig_target) {
2439
47.1k
        if (target->rc.ref_count != 1) {
2440
            /* This can occur if we are coming from a pattern clist that
2441
               includes transparency.  In this case, we do not want to
2442
               free the compositor since it is really the main target that
2443
               we are tiling into.  i.e. the tile itself does not have
2444
               a pdf14 device, but rather we push a trans group, draw and
2445
               then pop the group to properly blend */
2446
0
            rc_decrement(target, "gxclrast(target compositor)");
2447
47.1k
        } else {
2448
            /* Ref count was 1. close the device and then free it */
2449
47.1k
            if (target->is_open)
2450
0
                dev_proc(target, close_device)(target);
2451
47.1k
            gs_free_object(target->memory, target, "gxclrast discard compositor");
2452
47.1k
        }
2453
47.1k
        target = orig_target;
2454
47.1k
    }
2455
182k
    if (code < 0) {
2456
0
        if (pfs.dev != NULL)
2457
0
            term_patch_fill_state(&pfs);
2458
0
        rc_decrement(gs_gstate.color[0].color_space, "clist_playback_band");
2459
0
        rc_decrement(gs_gstate.color[1].color_space, "clist_playback_band");
2460
0
        gs_free_object(mem, cbuf_storage, "clist_playback_band(cbuf_storage)");
2461
0
        gx_cpath_free(&clip_path, "clist_playback_band");
2462
0
        if (pcpath != &clip_path)
2463
0
            gx_cpath_free(pcpath, "clist_playback_band");
2464
0
        if (clipper_dev_open)
2465
0
            gx_destroy_clip_device_on_stack(&clipper_dev);
2466
0
        return_error(code);
2467
0
    }
2468
    /* Check whether we have more pages to process. */
2469
182k
    if ((playback_action != playback_action_setup &&
2470
182k
        (cbp < cbuf.end || !seofp(s)) && (op != cmd_opv_end_page) )
2471
182k
        )
2472
0
        goto in;
2473
182k
    if (pfs.dev != NULL)
2474
0
        term_patch_fill_state(&pfs);
2475
182k
    rc_decrement(gs_gstate.color[0].color_space, "clist_playback_band");
2476
182k
    rc_decrement(gs_gstate.color[1].color_space, "clist_playback_band");
2477
182k
    gs_free_object(mem, cbuf_storage, "clist_playback_band(cbuf_storage)");
2478
182k
    gx_cpath_free(&clip_path, "clist_playback_band");
2479
182k
    if (pcpath != &clip_path)
2480
151k
        gx_cpath_free(pcpath, "clist_playback_band");
2481
182k
    if (clipper_dev_open)
2482
402
        gx_destroy_clip_device_on_stack(&clipper_dev);
2483
182k
    return code;
2484
0
top_up_failed:
2485
0
    gx_cpath_free(&clip_path, "clist_playback_band");
2486
0
    if (pcpath != &clip_path)
2487
0
        gx_cpath_free(pcpath, "clist_playback_band");
2488
0
    if (clipper_dev_open)
2489
0
        gx_destroy_clip_device_on_stack(&clipper_dev);
2490
0
    return code;
2491
182k
}
2492
2493
/* ---------------- Individual commands ---------------- */
2494
2495
/*
2496
 * These single-use procedures implement a few large individual commands,
2497
 * primarily for readability but also to avoid overflowing compilers'
2498
 * optimization limits.  They all take the command buffer as their first
2499
 * parameter (pcb), assume that the current buffer pointer is in pcb->ptr,
2500
 * and update it there.
2501
 */
2502
2503
static int
2504
read_set_tile_size(command_buf_t *pcb, tile_slot *bits, bool for_pattern)
2505
24
{
2506
24
    const byte *cbp = pcb->ptr;
2507
24
    uint rep_width, rep_height;
2508
24
    uint pdepth;
2509
24
    byte bd = *cbp++;
2510
2511
24
    bits->head.depth = cmd_code_to_depth(bd);
2512
24
    if (for_pattern)
2513
24
        cmd_getw(bits->id, cbp);
2514
24
    cmd_getw(rep_width, cbp);
2515
24
    cmd_getw(rep_height, cbp);
2516
24
    if (bd & 0x20) {
2517
24
        cmd_getw(bits->x_reps, cbp);
2518
24
        bits->width = rep_width * bits->x_reps;
2519
24
    } else {
2520
0
        bits->x_reps = 1;
2521
0
        bits->width = rep_width;
2522
0
    }
2523
24
    if (bd & 0x40) {
2524
0
        cmd_getw(bits->y_reps, cbp);
2525
0
        bits->height = rep_height * bits->y_reps;
2526
24
    } else {
2527
24
        bits->y_reps = 1;
2528
24
        bits->height = rep_height;
2529
24
    }
2530
24
    if (bd & 0x80)
2531
24
        cmd_getw(bits->rep_shift, cbp);
2532
24
    else
2533
24
        bits->rep_shift = 0;
2534
24
    if (bd & 0x10)
2535
0
        bits->num_planes = *cbp++;
2536
24
    else
2537
24
        bits->num_planes = 1;
2538
24
    if_debug7('L', " depth=%d size=(%d,%d), rep_size=(%d,%d), rep_shift=%d, num_planes=%d\n",
2539
24
              bits->head.depth, bits->width,
2540
24
              bits->height, rep_width,
2541
24
              rep_height, bits->rep_shift, bits->num_planes);
2542
24
    bits->shift =
2543
24
        (bits->rep_shift == 0 ? 0 :
2544
24
         (bits->rep_shift * (bits->height / rep_height)) % rep_width);
2545
24
    pdepth = bits->head.depth;
2546
24
    if (bits->num_planes != 1)
2547
0
        pdepth /= bits->num_planes;
2548
24
    bits->raster = bitmap_raster(bits->width * pdepth);
2549
24
    pcb->ptr = cbp;
2550
24
    return 0;
2551
24
}
2552
2553
static int
2554
read_set_bits(command_buf_t *pcb, tile_slot *bits, int compress,
2555
              gx_clist_state *pcls, gx_strip_bitmap *tile, tile_slot **pslot,
2556
              gx_device_clist_reader *cdev, gs_memory_t *mem)
2557
648k
{
2558
648k
    const byte *cbp = pcb->ptr;
2559
648k
    uint rep_width = bits->width / bits->x_reps;
2560
648k
    uint rep_height = bits->height / bits->y_reps;
2561
648k
    uint index;
2562
648k
    ulong offset;
2563
648k
    uint width_bits;
2564
648k
    uint width_bytes;
2565
648k
    uint raster;
2566
648k
    uint bytes;
2567
648k
    byte *data;
2568
648k
    tile_slot *slot;
2569
648k
    uint depth = bits->head.depth;
2570
2571
648k
    if (bits->num_planes != 1)
2572
0
        depth /= bits->num_planes;
2573
648k
    width_bits = rep_width * depth;
2574
2575
648k
    bytes = clist_bitmap_bytes(width_bits, rep_height * bits->num_planes,
2576
648k
                               compress |
2577
648k
                               (rep_width < bits->width ?
2578
648k
                                decompress_spread : 0) |
2579
648k
                               decompress_elsewhere,
2580
648k
                               &width_bytes,
2581
648k
                               (uint *)&raster);
2582
2583
648k
    cmd_getw(index, cbp);
2584
648k
    cmd_getw(offset, cbp);
2585
648k
    if_debug2m('L', mem, " index=%d offset=%lu\n", index, offset);
2586
648k
    pcls->tile_index = index;
2587
648k
    cdev->tile_table[pcls->tile_index].offset = offset;
2588
648k
    slot = (tile_slot *)(cdev->cache_chunk->data + offset);
2589
648k
    *pslot = slot;
2590
648k
    *slot = *bits;
2591
648k
    tile->data = data = (byte *)(slot + 1);
2592
#ifdef DEBUG
2593
    slot->index = pcls->tile_index;
2594
#endif
2595
648k
    if (compress == cmd_compress_const) {
2596
0
        cbp = cmd_read_data(pcb, data, 1, cbp);
2597
0
        if (width_bytes > 0 && rep_height > 0)
2598
0
            memset(data+1, *data, width_bytes * rep_height - 1);
2599
648k
    } else if (compress) {
2600
        /*
2601
         * Decompress the image data.  We'd like to share this code with the
2602
         * similar code in copy_*, but right now we don't see how.
2603
         */
2604
114k
        stream_cursor_read r;
2605
114k
        stream_cursor_write w;
2606
        /*
2607
         * We don't know the data length a priori, so to be conservative, we
2608
         * read the uncompressed size.
2609
         */
2610
114k
        uint cleft = pcb->end - cbp;
2611
2612
114k
        if (cleft < bytes && !pcb->end_status) {
2613
219
            uint nread = cbuf_size - cleft;
2614
2615
219
            advance_buffer(pcb, cbp);
2616
219
            pcb->end_status = sgets(pcb->s, pcb->data + cleft, nread, &nread);
2617
219
            set_cb_end(pcb, pcb->data + cleft + nread);
2618
219
            cbp = pcb->data;
2619
219
        }
2620
114k
        r.ptr = cbp - 1;
2621
114k
        r.limit = pcb->end - 1;
2622
114k
        w.ptr = data - 1;
2623
114k
        w.limit = w.ptr + bytes;
2624
114k
        switch (compress) {
2625
0
        case cmd_compress_rle:
2626
0
            {
2627
0
                stream_RLD_state sstate;
2628
2629
0
                clist_rld_init(&sstate);
2630
0
                (*s_RLD_template.process)
2631
0
                    ((stream_state *)&sstate, &r, &w, true);
2632
0
            }
2633
0
            break;
2634
114k
        case cmd_compress_cfe:
2635
114k
            {
2636
114k
                stream_CFD_state sstate;
2637
2638
114k
                clist_cfd_init(&sstate,
2639
114k
                               width_bytes << 3 /*width_bits */ ,
2640
114k
                               rep_height, mem);
2641
114k
                (*s_CFD_template.process)
2642
114k
                    ((stream_state *)&sstate, &r, &w, true);
2643
114k
                (*s_CFD_template.release)
2644
114k
                    ((stream_state *)&sstate);
2645
114k
            }
2646
114k
            break;
2647
0
        default:
2648
0
            return_error(gs_error_unregistered);
2649
114k
        }
2650
114k
        cbp = r.ptr + 1;
2651
533k
    } else if (rep_height * bits->num_planes > 1 && width_bytes != bits->raster) {
2652
530k
        cbp = cmd_read_short_bits(pcb, data, bytes,
2653
530k
                                  width_bytes, rep_height * bits->num_planes,
2654
530k
                                  bits->raster, cbp);
2655
530k
    } else {
2656
3.32k
        cbp = cmd_read_data(pcb, data, bytes, cbp);
2657
3.32k
    }
2658
648k
    if (bits->width > rep_width)
2659
30
        bits_replicate_horizontally(data,
2660
30
                                    rep_width * depth, rep_height * bits->num_planes,
2661
30
                                    bits->raster,
2662
30
                                    bits->width * depth,
2663
30
                                    bits->raster);
2664
648k
    if (bits->height > rep_height)
2665
0
        bits_replicate_vertically(data,
2666
0
                                  rep_height, bits->raster,
2667
0
                                  bits->height);
2668
#ifdef DEBUG
2669
    if (gs_debug_c('L'))
2670
        cmd_print_bits(mem, data, bits->width, bits->height, bits->raster);
2671
#endif
2672
648k
    pcb->ptr = cbp;
2673
648k
    return 0;
2674
648k
}
2675
2676
/* if necessary, allocate a buffer to hold a serialized halftone */
2677
static int
2678
read_alloc_ht_buff(ht_buff_t * pht_buff, uint ht_size, gs_memory_t * mem)
2679
93
{
2680
    /* free the existing buffer, if any (usually none) */
2681
93
    if (pht_buff->pbuff != 0) {
2682
0
        gs_free_object(mem, pht_buff->pbuff, "read_alloc_ht_buff");
2683
0
        pht_buff->pbuff = 0;
2684
0
    }
2685
2686
    /*
2687
     * If the serialized halftone fits in the command buffer, no
2688
     * additional buffer is required.
2689
     */
2690
93
    if (ht_size > cbuf_ht_seg_max_size) {
2691
0
        pht_buff->pbuff = gs_alloc_bytes(mem, ht_size, "read_alloc_ht_buff");
2692
0
        if (pht_buff->pbuff == 0)
2693
0
            return_error(gs_error_VMerror);
2694
0
    }
2695
93
    pht_buff->ht_size = ht_size;
2696
93
    pht_buff->read_size = 0;
2697
93
    pht_buff->pcurr = pht_buff->pbuff;
2698
93
    return 0;
2699
93
}
2700
2701
/* read a halftone segment; if it is the final segment, build the halftone */
2702
static int
2703
read_ht_segment(
2704
    ht_buff_t *                 pht_buff,
2705
    command_buf_t *             pcb,
2706
    gs_gstate *           pgs,
2707
    gx_device *                 dev,
2708
    gs_memory_t *               mem )
2709
93
{
2710
93
    const byte *                cbp = pcb->ptr;
2711
93
    const byte *                pbuff = 0;
2712
93
    uint                        ht_size = pht_buff->ht_size, seg_size;
2713
93
    int                         code = 0;
2714
2715
    /* get the segment size; refill command buffer if necessary */
2716
93
    enc_u_getw(seg_size, cbp);
2717
93
    if (pcb->warn_limit - cbp < (int)seg_size) { /* cbp can be past warn_limit */
2718
0
        code = top_up_cbuf(pcb, &cbp);
2719
0
        if (code < 0)
2720
0
            return code;
2721
0
        if (pcb->end - cbp < (int)seg_size) {
2722
0
            emprintf(mem, " *** ht segment size doesn't fit in buffer ***\n");
2723
0
            return_error(gs_error_unknownerror);
2724
0
        }
2725
0
    }
2726
2727
93
    if (pht_buff->pbuff == 0) {
2728
        /* if not separate buffer, must be only one segment */
2729
93
        if (seg_size != ht_size)
2730
0
            return_error(gs_error_unknownerror);
2731
93
        pbuff = cbp;
2732
93
    } else {
2733
0
        if (seg_size + pht_buff->read_size > pht_buff->ht_size)
2734
0
            return_error(gs_error_unknownerror);
2735
0
        memcpy(pht_buff->pcurr, cbp, seg_size);
2736
0
        pht_buff->pcurr += seg_size;
2737
0
        if ((pht_buff->read_size += seg_size) == ht_size)
2738
0
            pbuff = pht_buff->pbuff;
2739
0
    }
2740
2741
    /* if everything has been read, convert back to a halftone */
2742
93
    if (pbuff != 0) {
2743
93
        code = gx_ht_read_and_install(pgs, dev, pbuff, ht_size, mem);
2744
2745
        /* release any buffered information */
2746
93
        if (pht_buff->pbuff != 0) {
2747
0
            gs_free_object(mem, pht_buff->pbuff, "read_alloc_ht_buff");
2748
0
            pht_buff->pbuff = 0;
2749
0
            pht_buff->pcurr = 0;
2750
0
        }
2751
93
        pht_buff->ht_size = 0;
2752
93
        pht_buff->read_size = 0;
2753
93
    }
2754
2755
    /* update the command buffer ponter */
2756
93
    pcb->ptr = cbp + seg_size;
2757
2758
93
    return code;
2759
93
}
2760
2761
static int
2762
read_set_misc2(command_buf_t *pcb, gs_gstate *pgs, segment_notes *pnotes)
2763
121k
{
2764
121k
    const byte *cbp = pcb->ptr;
2765
121k
    uint mask, cb;
2766
2767
121k
    if_debug0m('L', pgs->memory, "\n");
2768
121k
    cmd_getw(mask, cbp);
2769
121k
    if (mask & cap_join_known) {
2770
13.4k
        cb = *cbp++;
2771
13.4k
        pgs->line_params.start_cap = (gs_line_cap)((cb >> 3) & 7);
2772
13.4k
        pgs->line_params.join = (gs_line_join)(cb & 7);
2773
13.4k
        if_debug2m('L', pgs->memory, "[L]      start_cap=%d join=%d\n",
2774
13.4k
                   pgs->line_params.start_cap, pgs->line_params.join);
2775
13.4k
        cb = *cbp++;
2776
13.4k
        pgs->line_params.end_cap = (gs_line_cap)((cb >> 3) & 7);
2777
13.4k
        pgs->line_params.dash_cap = (gs_line_cap)(cb & 7);
2778
13.4k
        if_debug2m('L', pgs->memory, "[L]      end_cap=%d dash_cap=%d\n",
2779
13.4k
                   pgs->line_params.end_cap, pgs->line_params.dash_cap);
2780
13.4k
    }
2781
121k
    if (mask & cj_ac_sa_known) {
2782
3.99k
        cb = *cbp++;
2783
3.99k
        pgs->line_params.curve_join = ((cb >> 2) & 7) - 1;
2784
3.99k
        pgs->accurate_curves = (cb & 2) != 0;
2785
3.99k
        pgs->stroke_adjust = cb & 1;
2786
3.99k
        if_debug3m('L', pgs->memory, "[L]      CJ=%d AC=%d SA=%d\n",
2787
3.99k
                   pgs->line_params.curve_join, pgs->accurate_curves,
2788
3.99k
                   pgs->stroke_adjust);
2789
3.99k
    }
2790
121k
    if (mask & flatness_known) {
2791
16.5k
        cmd_get_value(pgs->flatness, cbp);
2792
16.5k
        if_debug1m('L', pgs->memory, "[L]      flatness=%g\n", pgs->flatness);
2793
16.5k
    }
2794
121k
    if (mask & line_width_known) {
2795
40.1k
        float width;
2796
2797
40.1k
        cmd_get_value(width, cbp);
2798
40.1k
        if_debug1m('L', pgs->memory, "[L]      line_width=%g\n", width);
2799
40.1k
        gx_set_line_width(&pgs->line_params, width);
2800
40.1k
    }
2801
121k
    if (mask & miter_limit_known) {
2802
679
        float limit;
2803
2804
679
        cmd_get_value(limit, cbp);
2805
679
        if_debug1m('L', pgs->memory, "[L]      miter_limit=%g\n", limit);
2806
679
        gx_set_miter_limit(&pgs->line_params, limit);
2807
679
    }
2808
121k
    if (mask & op_bm_tk_known) {
2809
80.5k
        cb = *cbp++;
2810
80.5k
        pgs->blend_mode = cb >> 3;
2811
80.5k
        pgs->text_knockout = cb & 1;
2812
        /* the following usually have no effect; see gxclpath.c */
2813
80.5k
        cb = *cbp++;
2814
80.5k
        pgs->overprint_mode = (cb >> 2) & 1;
2815
80.5k
        pgs->stroke_overprint = (cb >> 1) & 1;
2816
80.5k
        pgs->overprint = cb & 1;
2817
80.5k
        cb = *cbp++;
2818
80.5k
        pgs->renderingintent = cb;
2819
80.5k
        if_debug6m('L', pgs->memory, "[L]      BM=%d TK=%d OPM=%d OP=%d op=%d RI=%d\n",
2820
80.5k
                   pgs->blend_mode, pgs->text_knockout, pgs->overprint_mode,
2821
80.5k
                   pgs->stroke_overprint, pgs->overprint, pgs->renderingintent);
2822
80.5k
    }
2823
121k
    if (mask & segment_notes_known) {
2824
0
        cb = *cbp++;
2825
0
        *pnotes = (segment_notes)(cb & 0x3f);
2826
0
        if_debug1m('L', pgs->memory, "[L]      notes=%d\n", *pnotes);
2827
0
    }
2828
121k
    if (mask & ais_known) {
2829
2.56k
        cmd_get_value(pgs->alphaisshape, cbp);
2830
2.56k
        if_debug1m('L', pgs->memory, "[L]      alphaisshape=%d\n", pgs->alphaisshape);
2831
2.56k
    }
2832
121k
    if (mask & stroke_alpha_known) {
2833
18.6k
        cmd_get_value(pgs->strokeconstantalpha, cbp);
2834
18.6k
        if_debug1m('L', pgs->memory, "[L]      strokeconstantalpha=%g\n", pgs->strokeconstantalpha);
2835
18.6k
    }
2836
121k
    if (mask & fill_alpha_known) {
2837
20.2k
        cmd_get_value(pgs->fillconstantalpha, cbp);
2838
20.2k
        if_debug1m('L', pgs->memory, "[L]      fillconstantalpha=%u\n", (uint)(pgs->fillconstantalpha));
2839
20.2k
    }
2840
121k
    pcb->ptr = cbp;
2841
121k
    return 0;
2842
121k
}
2843
2844
static int
2845
read_set_color_space(command_buf_t *pcb, gs_gstate *pgs,
2846
                     gx_device_clist_reader *cdev, gs_memory_t *mem)
2847
22.8k
{
2848
22.8k
    const byte *cbp = pcb->ptr;
2849
22.8k
    byte b = *cbp++;
2850
22.8k
    int index = b >> 4;
2851
22.8k
    gs_color_space *pcs;
2852
22.8k
    int code = 0;
2853
22.8k
    cmm_profile_t *picc_profile;
2854
22.8k
    clist_icc_color_t icc_information;
2855
2856
22.8k
    if_debug3m('L', mem, " %d%s%s\n", index,
2857
22.8k
               (b & 8 ? " (indexed)" : ""),
2858
22.8k
               (b & 4 ? "(proc)" : ""));
2859
    /* They all store the ICC information.  Even if it is NULL
2860
       it is used in the ICC case to avoid reading from the
2861
       serialized profile data which is stored elsewhere in the
2862
       clist.  Hence we avoid jumping around in the file. */
2863
22.8k
    memcpy(&icc_information, cbp, sizeof(clist_icc_color_t));
2864
22.8k
    cbp = cbp + sizeof(clist_icc_color_t);
2865
22.8k
    switch (index) {
2866
0
    case gs_color_space_index_DeviceGray:
2867
0
        pcs = gs_cspace_new_DeviceGray(mem);
2868
0
        break;
2869
0
    case gs_color_space_index_DeviceRGB:
2870
0
        pcs = gs_cspace_new_DeviceRGB(mem);
2871
0
        break;
2872
0
    case gs_color_space_index_DeviceCMYK:
2873
0
        pcs = gs_cspace_new_DeviceCMYK(mem);
2874
0
        break;
2875
22.8k
    case gs_color_space_index_ICC:
2876
        /* build the color space object */
2877
22.8k
        code = gs_cspace_build_ICC(&pcs, NULL, mem);
2878
        /* Don't bother getting the ICC stuff from the clist yet */
2879
22.8k
        picc_profile = gsicc_profile_new(NULL, cdev->memory, NULL, 0);
2880
22.8k
        if (picc_profile == NULL)
2881
0
            return gs_rethrow(-1, "Failed to find ICC profile during clist read");
2882
22.8k
        picc_profile->num_comps = icc_information.icc_num_components;
2883
22.8k
        picc_profile->hashcode = icc_information.icc_hash;
2884
22.8k
        picc_profile->hash_is_valid = true;
2885
22.8k
        picc_profile->islab = icc_information.is_lab;
2886
22.8k
        picc_profile->default_match = icc_information.default_match;
2887
22.8k
        picc_profile->data_cs = icc_information.data_cs;
2888
        /* Store the clist reader address in the profile
2889
           structure so that we can get to the buffer
2890
           data if we really neeed it.  Ideally, we
2891
           will use a cached link and only access this once. */
2892
22.8k
        picc_profile->dev = (gx_device*) cdev;
2893
        /* Assign it to the colorspace */
2894
22.8k
        code = gsicc_set_gscs_profile(pcs, picc_profile, mem);
2895
        /* And we no longer need our reference to the profile */
2896
22.8k
        gsicc_adjust_profile_rc(picc_profile, -1, "read_set_color_space");
2897
22.8k
        break;
2898
0
    default:
2899
0
        code = gs_note_error(gs_error_rangecheck);      /* others are NYI */
2900
0
        goto out;
2901
22.8k
    }
2902
2903
22.8k
    if (pcs == NULL) {
2904
0
        code = gs_note_error(gs_error_VMerror);
2905
0
        goto out;
2906
0
    }
2907
2908
22.8k
    if (b & 8) {
2909
399
        bool use_proc = (b & 4) != 0;
2910
399
        int hival;
2911
399
        int num_values;
2912
399
        byte *data;
2913
399
        uint data_size;
2914
399
        gs_color_space *pcs_indexed;
2915
2916
399
        pcs_indexed = gs_cspace_alloc(mem, &gs_color_space_type_Indexed);
2917
399
        if (pcs_indexed == 0) {
2918
0
            rc_decrement_cs(pcs, "read_set_color_space");
2919
0
            code = gs_note_error(gs_error_VMerror);
2920
0
            goto out;
2921
0
        }
2922
399
        pcs_indexed->base_space = pcs;
2923
399
        pcs = pcs_indexed;
2924
399
        pcs->params.indexed.use_proc = 0;
2925
399
        pcs->params.indexed.lookup.table.data = 0;
2926
399
        pcs->params.indexed.lookup.table.size = 0;
2927
399
        cmd_getw(hival, cbp);
2928
399
        pcs->params.indexed.n_comps = gs_color_space_num_components(pcs->base_space);
2929
399
        num_values = (hival + 1) * pcs->params.indexed.n_comps;
2930
399
        if (use_proc) {
2931
0
            gs_indexed_map *map;
2932
2933
0
            code = alloc_indexed_map(&map, num_values, mem, "indexed map");
2934
0
            if (code < 0) {
2935
0
                rc_decrement_cs(pcs, "read_set_color_space");
2936
0
                goto out;
2937
0
            }
2938
0
            map->proc.lookup_index = lookup_indexed_map;
2939
0
            pcs->params.indexed.lookup.map = map;
2940
0
            data = (byte *)map->values;
2941
0
            data_size = num_values * sizeof(map->values[0]);
2942
399
        } else {
2943
399
            byte *table = gs_alloc_string(mem, num_values, "color_space indexed table");
2944
2945
399
            if (table == 0) {
2946
0
                code = gs_note_error(gs_error_VMerror);
2947
0
                rc_decrement_cs(pcs, "read_set_color_space");
2948
0
                goto out;
2949
0
            }
2950
399
            pcs->params.indexed.lookup.table.data = table;
2951
399
            pcs->params.indexed.lookup.table.size = num_values;
2952
399
            data = table;
2953
399
            data_size = num_values;
2954
399
        }
2955
399
        cbp = cmd_read_data(pcb, data, data_size, cbp);
2956
399
        pcs->params.indexed.hival = hival;
2957
399
        pcs->params.indexed.use_proc = use_proc;
2958
399
    }
2959
2960
    /* Release reference to old color space before installing new one. */
2961
22.8k
    if (pgs->color[0].color_space != NULL)
2962
22.8k
        rc_decrement_only_cs(pgs->color[0].color_space, "read_set_color_space");
2963
22.8k
    pgs->color[0].color_space = pcs;
2964
22.8k
out:
2965
22.8k
    pcb->ptr = cbp;
2966
22.8k
    return code;
2967
22.8k
}
2968
2969
static int
2970
read_begin_image(command_buf_t *pcb, gs_image_common_t *pic,
2971
                 gs_color_space *pcs)
2972
28.9k
{
2973
28.9k
    uint index = *(pcb->ptr)++;
2974
28.9k
    const gx_image_type_t *image_type = gx_image_type_table[index];
2975
28.9k
    stream s;
2976
28.9k
    int code;
2977
2978
    /* This is sloppy, but we don't have enough information to do better. */
2979
28.9k
    code = top_up_cbuf(pcb, &pcb->ptr);
2980
28.9k
    if (code < 0)
2981
0
        return code;
2982
28.9k
    s_init(&s, NULL);
2983
28.9k
    sread_string(&s, pcb->ptr, pcb->end - pcb->ptr);
2984
28.9k
    code = image_type->sget(pic, &s, pcs);
2985
28.9k
    pcb->ptr = sbufptr(&s);
2986
28.9k
    pic->imagematrices_are_untrustworthy = 0;
2987
28.9k
    return code;
2988
28.9k
}
2989
2990
static int
2991
read_put_params(command_buf_t *pcb, gs_gstate *pgs,
2992
                gx_device_clist_reader *cdev, gs_memory_t *mem)
2993
0
{
2994
0
    const byte *cbp = pcb->ptr;
2995
0
    gs_c_param_list param_list;
2996
0
    uint cleft;
2997
0
    uint rleft;
2998
0
    bool alloc_data_on_heap = false;
2999
0
    byte *param_buf;
3000
0
    uint param_length;
3001
0
    int code;
3002
3003
0
    cmd_get_value(param_length, cbp);
3004
0
    if_debug1m('L', mem, " length=%d\n", param_length);
3005
0
    if (param_length == 0) {
3006
0
        code = 1;               /* empty list */
3007
0
        goto out;
3008
0
    }
3009
3010
    /* Make sure entire serialized param list is in cbuf */
3011
    /* + force void* alignment */
3012
0
    code = top_up_cbuf(pcb, &cbp);
3013
0
    if (code < 0)
3014
0
        return code;
3015
0
    if (pcb->end - cbp >= param_length) {
3016
0
        param_buf = (byte *)cbp;
3017
0
        cbp += param_length;
3018
0
    } else {
3019
        /* NOTE: param_buf must be maximally aligned */
3020
0
        param_buf = gs_alloc_bytes(mem, param_length,
3021
0
                                   "clist put_params");
3022
0
        if (param_buf == 0) {
3023
0
            code = gs_note_error(gs_error_VMerror);
3024
0
            goto out;
3025
0
        }
3026
0
        alloc_data_on_heap = true;
3027
0
        cleft = pcb->end - cbp;
3028
0
        rleft = param_length - cleft;
3029
0
        memmove(param_buf, cbp, cleft);
3030
0
        next_is_skip(pcb);
3031
0
        pcb->end_status = sgets(pcb->s, param_buf + cleft, rleft, &rleft);
3032
0
        cbp = pcb->end;  /* force refill */
3033
0
    }
3034
3035
    /*
3036
     * Create a gs_c_param_list & expand into it.
3037
     * NB that gs_c_param_list doesn't copy objects into
3038
     * it, but rather keeps *pointers* to what's passed.
3039
     * That's OK because the serialized format keeps enough
3040
     * space to hold expanded versions of the structures,
3041
     * but this means we cannot deallocate source buffer
3042
     * until the gs_c_param_list is deleted.
3043
     */
3044
0
    gs_c_param_list_write(&param_list, mem);
3045
0
    code = gs_param_list_unserialize
3046
0
        ( (gs_param_list *)&param_list, param_buf );
3047
0
    if (code >= 0 && code != param_length)
3048
0
        code = gs_error_unknownerror;  /* must match */
3049
0
    if (code >= 0) {
3050
0
        gs_c_param_list_read(&param_list);
3051
0
        code = gs_gstate_putdeviceparams(pgs, (gx_device *)cdev,
3052
0
                                         (gs_param_list *)&param_list);
3053
0
    }
3054
0
    gs_c_param_list_release(&param_list);
3055
0
    if (alloc_data_on_heap)
3056
0
        gs_free_object(mem, param_buf, "clist put_params");
3057
3058
0
out:
3059
0
    pcb->ptr = cbp;
3060
0
    return code;
3061
0
}
3062
3063
/*
3064
 * Read a "composite" command, and execute the command.
3065
 *
3066
 * This code assumes that a the largest create compositor command,
3067
 * including the compositor name size, is smaller than the data buffer
3068
 * size. This assumption is inherent in the basic design of the coding
3069
 * and the de-serializer interface, as no length field is provided.
3070
 *
3071
 * At the time of this writing, no compositor violates this assumption.
3072
 * The largest composite is currently 1275 bytes, while the command
3073
 * data buffer is 4096 bytes.
3074
 *
3075
 * In the event that this assumption is violated, a change in the encoding
3076
 * would be called for.
3077
 *
3078
 * See comment in gdevp14.c c_pdf14trans_read PDF14_BEGIN_TRANS_MASK case.
3079
 */
3080
extern_gs_find_compositor();
3081
3082
static int
3083
read_composite(
3084
    command_buf_t *pcb,  gs_memory_t *mem, gs_composite_t **ppcomp)
3085
7.13M
{
3086
7.13M
    const byte *                cbp = pcb->ptr;
3087
7.13M
    int                         comp_id = 0, code = 0;
3088
7.13M
    const gs_composite_type_t * pcomp_type = 0;
3089
3090
    /* fill the command buffer (see comment above) */
3091
7.13M
    if (pcb->end - cbp < MAX_CLIST_COMPOSITOR_SIZE + sizeof(comp_id)) {
3092
705k
        code = top_up_cbuf(pcb, &cbp);
3093
705k
        if (code < 0)
3094
0
            return code;
3095
705k
    }
3096
3097
    /* find the appropriate compositor method vector */
3098
7.13M
    comp_id = *cbp++;
3099
7.13M
    if ((pcomp_type = gs_find_compositor(comp_id)) == 0)
3100
0
        return_error(gs_error_unknownerror);
3101
3102
    /* de-serialize the compositor */
3103
7.13M
    code = pcomp_type->procs.read(ppcomp, cbp, pcb->end - cbp, mem);
3104
3105
    /* If we read more than the maximum expected, return a rangecheck error */
3106
7.13M
    if ( code > MAX_CLIST_COMPOSITOR_SIZE )
3107
0
        return_error(gs_error_rangecheck);
3108
3109
7.13M
    if (code > 0)
3110
7.13M
        cbp += code;
3111
7.13M
    pcb->ptr = cbp;
3112
7.13M
    return code;
3113
7.13M
}
3114
3115
static int apply_composite(gx_device_clist_reader *cdev, gs_gstate *pgs,
3116
                                   gs_memory_t *mem, gs_composite_t *pcomp,
3117
                                   int x0, int y0, gx_device **ptarget)
3118
6.12M
{
3119
6.12M
    gx_device *tdev = *ptarget;
3120
6.12M
    int code;
3121
3122
6.12M
    code = pcomp->type->procs.adjust_ctm(pcomp, x0, y0, pgs);
3123
6.12M
    if (code < 0)
3124
0
        goto exit;
3125
    /*
3126
     * Apply the compositor to the target device; note that this may
3127
     * change the target device.
3128
     */
3129
6.12M
    code = dev_proc(tdev, composite)(tdev, &tdev, pcomp, pgs, mem, (gx_device*) cdev);
3130
6.12M
    if (code == 1) {
3131
        /* A new compositor was created that wrapped tdev. This should
3132
         * be our new target. */
3133
47.1k
        *ptarget = tdev;
3134
47.1k
        code = 0;
3135
47.1k
    }
3136
6.12M
    if (code < 0)
3137
0
        goto exit;
3138
3139
    /* Perform any updates for the clist device required */
3140
6.12M
    code = pcomp->type->procs.clist_compositor_read_update(pcomp,
3141
6.12M
                                        (gx_device *)cdev, tdev, pgs, mem);
3142
6.12M
exit:
3143
    /* free the compositor object */
3144
6.12M
    gs_free_object(mem, pcomp, "read_composite");
3145
3146
6.12M
    return code;
3147
6.12M
}
3148
3149
/* ---------------- Utilities ---------------- */
3150
3151
/* Read and unpack a short bitmap */
3152
/*
3153
 * The 'raster' in the dest buffer may be larger than the 'width_bytes'
3154
 * in the src, so after reading we memmove data down to the proper
3155
 * alignment from the last line backwards.
3156
 * THIS RELIES on width_bytes <= raster to work.
3157
 */
3158
static const byte *
3159
cmd_read_short_bits(command_buf_t *pcb, byte *data, int tot_bytes,
3160
                    int width_bytes, int height, uint raster, const byte *cbp)
3161
531k
{
3162
    /* Note the following may read from the file past the end of the buffer */
3163
    /* leaving cbp at pcb->end. No further reading using cbp can be done    */
3164
    /* without top_up_cbuf to reload the buffer.                            */
3165
531k
    cbp = cmd_read_data(pcb, data, tot_bytes, cbp);
3166
3167
    /* if needed, adjust buffer contents for dest raster > width_bytes */
3168
531k
    if (width_bytes < raster) {
3169
531k
        const byte *pdata = data /*src*/ + width_bytes * height;
3170
531k
        byte *udata = data /*dest*/ + height * raster;
3171
3172
8.43M
        while (--height > 0) { /* don't need to move the first line to itself */
3173
7.90M
            udata -= raster, pdata -= width_bytes;
3174
7.90M
            switch (width_bytes) {
3175
0
                default:
3176
0
                    memmove(udata, pdata, width_bytes);
3177
0
                    break;
3178
4.34k
                case 6:
3179
4.34k
                    udata[5] = pdata[5];
3180
16.1k
                case 5:
3181
16.1k
                    udata[4] = pdata[4];
3182
72.5k
                case 4:
3183
72.5k
                    udata[3] = pdata[3];
3184
1.18M
                case 3:
3185
1.18M
                    udata[2] = pdata[2];
3186
6.29M
                case 2:
3187
6.29M
                    udata[1] = pdata[1];
3188
7.90M
                case 1:
3189
7.90M
                    udata[0] = pdata[0];
3190
7.90M
                case 0:;            /* shouldn't happen */
3191
7.90M
            }
3192
7.90M
        }
3193
531k
    }
3194
531k
    return cbp;
3195
531k
}
3196
3197
/* Read a rectangle. */
3198
static const byte *
3199
cmd_read_rect(int op, gx_cmd_rect * prect, const byte * cbp)
3200
341k
{
3201
341k
    cmd_getw(prect->x, cbp);
3202
341k
    if (op & 0xf)
3203
62.0k
        prect->y += ((op >> 2) & 3) - 2;
3204
279k
    else {
3205
279k
        cmd_getw(prect->y, cbp);
3206
279k
    }
3207
341k
    cmd_getw(prect->width, cbp);
3208
341k
    if (op & 0xf)
3209
62.0k
        prect->height += (op & 3) - 2;
3210
279k
    else {
3211
279k
        cmd_getw(prect->height, cbp);
3212
279k
    }
3213
341k
    return cbp;
3214
341k
}
3215
3216
/*
3217
 * Select a map for loading with data.
3218
 *
3219
 * This routine has three outputs:
3220
 *   *pmdata - points to the map data.
3221
 *   *pcomp_num - points to a component number if the map is a transfer
3222
 *               map which has been set via the setcolortransfer operator.
3223
 *               A. value of NULL indicates that no component number is to
3224
 *               be sent for this map.
3225
 *   *pcount - the size of the map (in bytes).
3226
 */
3227
static int
3228
cmd_select_map(cmd_map_index map_index, cmd_map_contents cont,
3229
               gs_gstate * pgs, int ** pcomp_num, frac ** pmdata,
3230
               uint * pcount, gs_memory_t * mem)
3231
320k
{
3232
320k
    gx_transfer_map *map;
3233
320k
    gx_transfer_map **pmap;
3234
320k
    const char *cname;
3235
3236
320k
    *pcomp_num = NULL;          /* Only used for color transfer maps */
3237
320k
    switch (map_index) {
3238
100k
        case cmd_map_transfer:
3239
100k
            if_debug0m('L', mem, " transfer");
3240
100k
            rc_unshare_struct(pgs->set_transfer.gray, gx_transfer_map,
3241
100k
                &st_transfer_map, mem, return_error(gs_error_VMerror),
3242
100k
                "cmd_select_map(default_transfer)");
3243
100k
            map = pgs->set_transfer.gray;
3244
            /* Release all current maps */
3245
100k
            rc_decrement(pgs->set_transfer.red, "cmd_select_map(red)");
3246
100k
            pgs->set_transfer.red = NULL;
3247
100k
            pgs->set_transfer.red_component_num = -1;
3248
100k
            rc_decrement(pgs->set_transfer.green, "cmd_select_map(green)");
3249
100k
            pgs->set_transfer.green = NULL;
3250
100k
            pgs->set_transfer.green_component_num = -1;
3251
100k
            rc_decrement(pgs->set_transfer.blue, "cmd_select_map(blue)");
3252
100k
            pgs->set_transfer.blue = NULL;
3253
100k
            pgs->set_transfer.blue_component_num = -1;
3254
100k
            goto transfer2;
3255
174
        case cmd_map_transfer_0:
3256
174
            pmap = &pgs->set_transfer.red;
3257
174
            *pcomp_num = &pgs->set_transfer.red_component_num;
3258
174
            goto transfer1;
3259
174
        case cmd_map_transfer_1:
3260
174
            pmap = &pgs->set_transfer.green;
3261
174
            *pcomp_num = &pgs->set_transfer.green_component_num;
3262
174
            goto transfer1;
3263
174
        case cmd_map_transfer_2:
3264
174
            pmap = &pgs->set_transfer.blue;
3265
174
            *pcomp_num = &pgs->set_transfer.blue_component_num;
3266
174
            goto transfer1;
3267
0
        case cmd_map_transfer_3:
3268
0
            pmap = &pgs->set_transfer.gray;
3269
0
            *pcomp_num = &pgs->set_transfer.gray_component_num;
3270
522
transfer1:  if_debug1m('L', mem, " transfer[%d]", (int)(map_index - cmd_map_transfer_0));
3271
522
            rc_unshare_struct(*pmap, gx_transfer_map, &st_transfer_map, mem,
3272
522
                return_error(gs_error_VMerror), "cmd_select_map(transfer)");
3273
522
            map = *pmap;
3274
3275
100k
transfer2:  if (cont != cmd_map_other) {
3276
100k
                gx_set_identity_transfer(map);
3277
100k
                *pmdata = 0;
3278
100k
                *pcount = 0;
3279
100k
                return 0;
3280
100k
            }
3281
696
            break;
3282
109k
        case cmd_map_black_generation:
3283
109k
            if_debug0m('L', mem, " black generation");
3284
109k
            pmap = &pgs->black_generation;
3285
109k
            cname = "cmd_select_map(black generation)";
3286
109k
            goto alloc;
3287
109k
        case cmd_map_undercolor_removal:
3288
109k
            if_debug0m('L', mem, " undercolor removal");
3289
109k
            pmap = &pgs->undercolor_removal;
3290
109k
            cname = "cmd_select_map(undercolor removal)";
3291
219k
alloc:      if (cont == cmd_map_none) {
3292
0
                rc_decrement(*pmap, cname);
3293
0
                *pmap = 0;
3294
0
                *pmdata = 0;
3295
0
                *pcount = 0;
3296
0
                return 0;
3297
0
            }
3298
219k
            rc_unshare_struct(*pmap, gx_transfer_map, &st_transfer_map,
3299
219k
                              mem, return_error(gs_error_VMerror), cname);
3300
219k
            map = *pmap;
3301
219k
            if (cont == cmd_map_identity) {
3302
0
                gx_set_identity_transfer(map);
3303
0
                *pmdata = 0;
3304
0
                *pcount = 0;
3305
0
                return 0;
3306
0
            }
3307
219k
            break;
3308
219k
        default:
3309
0
            *pmdata = 0;
3310
0
            return 0;
3311
320k
    }
3312
220k
    map->proc = gs_mapped_transfer;
3313
220k
    *pmdata = map->values;
3314
220k
    *pcount = sizeof(map->values);
3315
220k
    return 0;
3316
320k
}
3317
3318
/* Create a device halftone for the imager if necessary. */
3319
static int
3320
cmd_create_dev_ht(gx_device_halftone **ppdht, gs_memory_t *mem)
3321
0
{
3322
0
    gx_device_halftone *pdht = *ppdht;
3323
3324
0
    if (pdht == 0) {
3325
0
        rc_header rc;
3326
3327
0
        rc_alloc_struct_1(pdht, gx_device_halftone, &st_device_halftone, mem,
3328
0
                          return_error(gs_error_VMerror),
3329
0
                          "cmd_create_dev_ht");
3330
0
        rc = pdht->rc;
3331
0
        memset(pdht, 0, sizeof(*pdht));
3332
0
        pdht->rc = rc;
3333
0
        *ppdht = pdht;
3334
0
    }
3335
0
    return 0;
3336
0
}
3337
3338
/* Resize the halftone components array if necessary. */
3339
static int
3340
cmd_resize_halftone(gx_device_halftone **ppdht, uint num_comp,
3341
                    gs_memory_t * mem)
3342
0
{
3343
0
    int code = cmd_create_dev_ht(ppdht, mem);
3344
0
    gx_device_halftone *pdht = *ppdht;
3345
3346
0
    if (code < 0)
3347
0
        return code;
3348
0
    if (num_comp != pdht->num_comp) {
3349
0
        gx_ht_order_component *pcomp;
3350
3351
        /*
3352
         * We must be careful not to shrink or free the components array
3353
         * before releasing any relevant elements.
3354
         */
3355
0
        if (num_comp < pdht->num_comp) {
3356
0
            uint i;
3357
3358
            /* Don't release the default order. */
3359
0
            for (i = pdht->num_comp; i-- > num_comp;)
3360
0
                if (pdht->components[i].corder.bit_data != pdht->order.bit_data)
3361
0
                    gx_ht_order_release(&pdht->components[i].corder, mem, true);
3362
0
            if (num_comp == 0) {
3363
0
                gs_free_object(mem, pdht->components, "cmd_resize_halftone");
3364
0
                pcomp = 0;
3365
0
            } else {
3366
0
                pcomp = gs_resize_object(mem, pdht->components, num_comp,
3367
0
                                         "cmd_resize_halftone");
3368
0
                if (pcomp == 0) {
3369
0
                    pdht->num_comp = num_comp;  /* attempt consistency */
3370
0
                    return_error(gs_error_VMerror);
3371
0
                }
3372
0
            }
3373
0
        } else {
3374
            /* num_comp > pdht->num_comp */
3375
0
            if (pdht->num_comp == 0)
3376
0
                pcomp = gs_alloc_struct_array(mem, num_comp,
3377
0
                                              gx_ht_order_component,
3378
0
                                              &st_ht_order_component_element,
3379
0
                                              "cmd_resize_halftone");
3380
0
            else
3381
0
                pcomp = gs_resize_object(mem, pdht->components, num_comp,
3382
0
                                         "cmd_resize_halftone");
3383
0
            if (pcomp == 0)
3384
0
                return_error(gs_error_VMerror);
3385
0
            memset(&pcomp[pdht->num_comp], 0,
3386
0
                   sizeof(*pcomp) * (num_comp - pdht->num_comp));
3387
0
        }
3388
0
        pdht->num_comp = num_comp;
3389
0
        pdht->components = pcomp;
3390
0
    }
3391
0
    return 0;
3392
0
}
3393
3394
/* ------ Path operations ------ */
3395
3396
/* Decode a path segment. */
3397
static int
3398
clist_decode_segment(gx_path * ppath, int op, fixed vs[6],
3399
                 gs_fixed_point * ppos, int x0, int y0, segment_notes notes)
3400
3.36M
{
3401
3.36M
    fixed px = ppos->x - int2fixed(x0);
3402
3.36M
    fixed py = ppos->y - int2fixed(y0);
3403
3.36M
    int code;
3404
3405
4.04M
#define A vs[0]
3406
3.36M
#define B vs[1]
3407
3.36M
#define C vs[2]
3408
3.36M
#define D vs[3]
3409
3.36M
#define E vs[4]
3410
3.36M
#define F vs[5]
3411
3412
3.36M
    switch (op) {
3413
684k
        case cmd_opv_rmoveto:
3414
684k
            code = gx_path_add_point(ppath, px += A, py += B);
3415
684k
            break;
3416
340k
        case cmd_opv_rlineto:
3417
340k
            code = gx_path_add_line_notes(ppath, px += A, py += B, notes);
3418
340k
            break;
3419
0
        case cmd_opv_rgapto:
3420
0
            code = gx_path_add_gap_notes(ppath, px += A, py += B, notes);
3421
0
            break;
3422
657k
        case cmd_opv_hlineto:
3423
657k
            code = gx_path_add_line_notes(ppath, px += A, py, notes);
3424
657k
            break;
3425
898k
        case cmd_opv_vlineto:
3426
898k
            code = gx_path_add_line_notes(ppath, px, py += A, notes);
3427
898k
            break;
3428
79.5k
        case cmd_opv_rmlineto:
3429
79.5k
            if ((code = gx_path_add_point(ppath, px += A, py += B)) < 0)
3430
0
                break;
3431
79.5k
            code = gx_path_add_line_notes(ppath, px += C, py += D, notes);
3432
79.5k
            break;
3433
18.9k
        case cmd_opv_rm2lineto:
3434
18.9k
            if ((code = gx_path_add_point(ppath, px += A, py += B)) < 0 ||
3435
18.9k
                (code = gx_path_add_line_notes(ppath, px += C, py += D,
3436
18.9k
                                               notes)) < 0
3437
18.9k
                )
3438
0
                break;
3439
18.9k
            code = gx_path_add_line_notes(ppath, px += E, py += F, notes);
3440
18.9k
            break;
3441
18.0k
        case cmd_opv_rm3lineto:
3442
18.0k
            if ((code = gx_path_add_point(ppath, px += A, py += B)) < 0 ||
3443
18.0k
                (code = gx_path_add_line_notes(ppath, px += C, py += D,
3444
18.0k
                                               notes)) < 0 ||
3445
18.0k
                (code = gx_path_add_line_notes(ppath, px += E, py += F,
3446
18.0k
                                               notes)) < 0
3447
18.0k
                )
3448
0
                break;
3449
18.0k
            code = gx_path_add_line_notes(ppath, px -= C, py -= D, notes);
3450
18.0k
            break;
3451
267k
        case cmd_opv_rrcurveto: /* a b c d e f => a b a+c b+d a+c+e b+d+f */
3452
268k
rrc:        E += (C += A);
3453
268k
            F += (D += B);
3454
469k
curve:      code = gx_path_add_curve_notes(ppath, px + A, py + B,
3455
469k
                                           px + C, py + D,
3456
469k
                                           px + E, py + F, notes);
3457
469k
            px += E, py += F;
3458
469k
            break;
3459
103k
        case cmd_opv_hvcurveto: /* a b c d => a 0 a+b c a+b c+d */
3460
104k
hvc:        F = C + D, D = C, E = C = A + B, B = 0;
3461
104k
            goto curve;
3462
90.0k
        case cmd_opv_vhcurveto: /* a b c d => 0 a b a+c b+d a+c */
3463
96.6k
vhc:        E = B + D, F = D = A + C, C = B, B = A, A = 0;
3464
96.6k
            goto curve;
3465
154
        case cmd_opv_nrcurveto: /* a b c d => 0 0 a b a+c b+d */
3466
154
            F = B + D, E = A + C, D = B, C = A, B = A = 0;
3467
154
            goto curve;
3468
411
        case cmd_opv_rncurveto: /* a b c d => a b a+c b+d a+c b+d */
3469
411
            F = D += B, E = C += A;
3470
411
            goto curve;
3471
6.53k
        case cmd_opv_vqcurveto: /* a b => VH a b TS(a,b) TS(b,a) */
3472
6.53k
            if ((A ^ B) < 0)
3473
5.29k
                C = -B, D = -A;
3474
1.24k
            else
3475
1.24k
                C = B, D = A;
3476
6.53k
            goto vhc;
3477
1.30k
        case cmd_opv_hqcurveto: /* a b => HV a TS(a,b) b TS(b,a) */
3478
1.30k
            if ((A ^ B) < 0)
3479
361
                D = -A, C = B, B = -B;
3480
942
            else
3481
942
                D = A, C = B;
3482
1.30k
            goto hvc;
3483
546
        case cmd_opv_scurveto: /* (a b c d e f) => */
3484
546
            {
3485
546
                fixed a = A, b = B;
3486
3487
                /* See gxclpath.h for details on the following. */
3488
546
                if (A == 0) {
3489
                    /* Previous curve was vh or vv */
3490
520
                    A = E - C, B = D - F, C = C - a, D = b - D, E = a, F = -b;
3491
520
                } else {
3492
                    /* Previous curve was hv or hh */
3493
26
                    A = C - E, B = F - D, C = a - C, D = D - b, E = -a, F = b;
3494
26
                }
3495
546
            }
3496
546
            goto rrc;
3497
192k
        case cmd_opv_closepath:
3498
192k
            if ((code = gx_path_close_subpath(ppath)) < 0)
3499
192k
                return code;;
3500
192k
            if ((code = gx_path_current_point(ppath, (gs_fixed_point *) vs)) < 0)
3501
192k
                return code;;
3502
192k
            px = A, py = B;
3503
192k
            break;
3504
0
        default:
3505
0
            return_error(gs_error_rangecheck);
3506
3.36M
    }
3507
3.36M
#undef A
3508
3.36M
#undef B
3509
3.36M
#undef C
3510
3.36M
#undef D
3511
3.36M
#undef E
3512
3.36M
#undef F
3513
3.36M
    ppos->x = px + int2fixed(x0);
3514
3.36M
    ppos->y = py + int2fixed(y0);
3515
3.36M
    return code;
3516
3.36M
}
3517
3518
/*
3519
 * Execute a polyfill -- either a fill_parallelogram or a fill_triangle.
3520
 *
3521
 * Note that degenerate parallelograms or triangles may collapse into
3522
 * a single line or point.  We must check for this so we don't try to
3523
 * access non-existent segments.
3524
 */
3525
static int
3526
clist_do_polyfill(gx_device *dev, gx_path *ppath,
3527
                  const gx_drawing_color *pdcolor,
3528
                  gs_logical_operation_t lop)
3529
19.3k
{
3530
19.3k
    const subpath *psub = ppath->first_subpath;
3531
19.3k
    const segment *pseg1;
3532
19.3k
    const segment *pseg2;
3533
19.3k
    int code;
3534
3535
19.3k
    if (psub && (pseg1 = psub->next) != 0 && (pseg2 = pseg1->next) != 0) {
3536
19.3k
        fixed px = psub->pt.x, py = psub->pt.y;
3537
19.3k
        fixed ax = pseg1->pt.x - px, ay = pseg1->pt.y - py;
3538
19.3k
        fixed bx, by;
3539
        /*
3540
         * We take advantage of the fact that the parameter lists for
3541
         * fill_parallelogram and fill_triangle are identical.
3542
         */
3543
19.3k
        dev_proc_fill_parallelogram((*fill));
3544
3545
        /* close_path of 3 point triangle adds 4th point, detected here.*/
3546
        /* close_path on parallelogram adds 5th point also ignored. */
3547
19.3k
        if (pseg2->next && !(px == pseg2->next->pt.x && py == pseg2->next->pt.y)) {
3548
            /* Parallelogram */
3549
18.5k
            fill = dev_proc(dev, fill_parallelogram);
3550
18.5k
            bx = pseg2->pt.x - pseg1->pt.x;
3551
18.5k
            by = pseg2->pt.y - pseg1->pt.y;
3552
18.5k
        } else {
3553
            /* Triangle */
3554
819
            fill = dev_proc(dev, fill_triangle);
3555
819
            bx = pseg2->pt.x - px;
3556
819
            by = pseg2->pt.y - py;
3557
819
        }
3558
19.3k
        code = fill(dev, px, py, ax, ay, bx, by, pdcolor, lop);
3559
19.3k
    } else
3560
0
        code = 0;
3561
19.3k
    gx_path_new(ppath);
3562
19.3k
    return code;
3563
19.3k
}