xref: /plan9/sys/src/cmd/gs/src/gsstate.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1989, 2000 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: gsstate.c,v 1.24 2004/08/04 19:36:12 stefan Exp $ */
18 /* Miscellaneous graphics state operators for Ghostscript library */
19 #include "gx.h"
20 #include "memory_.h"
21 #include "gserrors.h"
22 #include "gsstruct.h"
23 #include "gsutil.h"		/* for gs_next_ids */
24 #include "gzstate.h"
25 #include "gxcspace.h"		/* here for gscolor2.h */
26 #include "gsalpha.h"
27 #include "gscolor2.h"
28 #include "gscoord.h"		/* for gs_initmatrix */
29 #include "gscie.h"
30 #include "gxclipsr.h"
31 #include "gxcmap.h"
32 #include "gxdevice.h"
33 #include "gxpcache.h"
34 #include "gzht.h"
35 #include "gzline.h"
36 #include "gspath.h"
37 #include "gzpath.h"
38 #include "gzcpath.h"
39 #include "gsovrc.h"
40 #include "gxcolor2.h"
41 #include "gxpcolor.h"
42 
43 /* Forward references */
44 private gs_state *gstate_alloc(gs_memory_t *, client_name_t,
45 			       const gs_state *);
46 private gs_state *gstate_clone(gs_state *, gs_memory_t *, client_name_t,
47 			       gs_state_copy_reason_t);
48 private void gstate_free_contents(gs_state *);
49 private int gstate_copy(gs_state *, const gs_state *,
50 			gs_state_copy_reason_t, client_name_t);
51 
52 /*
53  * Graphics state storage management is complicated.  There are many
54  * different classes of storage associated with a graphics state:
55  *
56  * (1) The gstate object itself.  This includes some objects physically
57  *      embedded within the gstate object, but because of garbage collection
58  *      requirements, there are no embedded objects that can be
59  *      referenced by non-transient pointers.  We assume that the gstate
60  *      stack "owns" its gstates and that we can free the top gstate when
61  *      doing a restore.
62  *
63  * (2) Objects that are referenced directly by the gstate and whose lifetime
64  *      is independent of the gstate.  These are garbage collected, not
65  *      reference counted, so we don't need to do anything special with them
66  *      when manipulating gstates.  Currently this includes:
67  *              font, device
68  *
69  * (3) Objects that are referenced directly by the gstate, may be shared
70  *      among gstates, and should disappear when no gstates reference them.
71  *      These fall into two groups:
72  *
73  *   (3a) Objects that are logically connected to individual gstates.
74  *      We use reference counting to manage these.  Currently these are:
75  *              halftone, dev_ht, cie_render, black_generation,
76  *              undercolor_removal, set_transfer.*, cie_joint_caches,
77  *		clip_stack, {opacity,shape}.mask
78  *      effective_transfer.* may point to some of the same objects as
79  *      set_transfer.*, but don't contribute to the reference count.
80  *      Similarly, dev_color may point to the dev_ht object.  For
81  *      simplicity, we initialize all of these pointers to 0 and then
82  *      allocate the object itself when needed.
83  *
84  *   (3b) Objects whose lifetimes are associated with something else.
85  *      Currently these are:
86  *              pattern_cache, which is associated with the entire
87  *                stack, is allocated when first needed, and currently
88  *                is never freed;
89  *              view_clip, which is associated with the current
90  *                save level (effectively, with the gstate sub-stack
91  *                back to the save) and is managed specially;
92  *		transparency_stack, which is associated with the entire
93  *		  stack but only stored in the topmost graphics state.
94  *
95  * (4) Objects that are referenced directly by exactly one gstate and that
96  *      are not referenced (except transiently) from any other object.
97  *      These fall into two groups:
98  *
99  *   (4b) Objects allocated individually, for the given reason:
100  *              line_params.dash.pattern (variable-length),
101  *              color_space, path, clip_path, effective_clip.path,
102  *              ccolor, dev_color
103  *                  (may be referenced from image enumerators or elsewhere)
104  *
105  *   (4b) The "client data" for a gstate.  For the interpreter, this is
106  *      the refs associated with the gstate, such as the screen procedures.
107  *      Client-supplied procedures manage client data.
108  *
109  * (5) Objects referenced indirectly from gstate objects of category (4),
110  *      including objects that may also be referenced directly by the gstate.
111  *      The individual routines that manipulate these are responsible
112  *      for doing the right kind of reference counting or whatever.
113  *      Currently:
114  *              path, clip_path, and (if different from both clip_path
115  *                and view_clip) effective_clip.path require
116  *                gx_path_assign/free, which uses a reference count;
117  *              color_space and ccolor require cs_adjust_color/cspace_count
118  *                or cs_adjust_counts, which use a reference count;
119  *              dev_color has no references to storage that it owns.
120  *      We count on garbage collection or restore to deallocate
121  *        sub-objects of halftone.
122  *
123  * Note that when after a gsave, the existing gstate references the related
124  * objects that we allocate at the same time, and the newly allocated gstate
125  * references the old related objects.  Similarly, during a grestore, we
126  * free the related objects referenced by the current gstate, but after the
127  * grestore, we free the saved gstate, not the current one.  However, when
128  * we allocate gstates off-stack, the newly allocated gstate does reference
129  * the newly allocated component objects.  Note also that setgstate /
130  * currentgstate may produce gstates in which different allocators own
131  * different sub-objects; this is OK, because restore guarantees that there
132  * won't be any dangling pointers (as long as we don't allow pointers from
133  * global gstates to local objects).
134  */
135 
136 /*
137  * Define these elements of the graphics state that are allocated
138  * individually for each state, except for line_params.dash.pattern.
139  * Note that effective_clip_shared is not on the list.
140  */
141 typedef struct gs_state_parts_s {
142     gx_path *path;
143     gx_clip_path *clip_path;
144     gx_clip_path *effective_clip_path;
145     gs_color_space *color_space;
146     gs_client_color *ccolor;
147     gx_device_color *dev_color;
148 } gs_state_parts;
149 
150 #define GSTATE_ASSIGN_PARTS(pto, pfrom)\
151   ((pto)->path = (pfrom)->path, (pto)->clip_path = (pfrom)->clip_path,\
152    (pto)->effective_clip_path = (pfrom)->effective_clip_path,\
153    (pto)->color_space = (pfrom)->color_space,\
154    (pto)->ccolor = (pfrom)->ccolor, (pto)->dev_color = (pfrom)->dev_color)
155 
156 /* GC descriptors */
157 extern_st(st_imager_state);
158 public_st_gs_state();
159 
160 /* GC procedures for gs_state */
161 private ENUM_PTRS_WITH(gs_state_enum_ptrs, gs_state *gsvptr)
162 ENUM_PREFIX(st_imager_state, gs_state_num_ptrs + 2);
163 #define e1(i,elt) ENUM_PTR(i,gs_state,elt);
164 gs_state_do_ptrs(e1)
165 case gs_state_num_ptrs:	/* handle device specially */
166 ENUM_RETURN(gx_device_enum_ptr(gsvptr->device));
167 case gs_state_num_ptrs + 1:	/* handle device filter stack specially */
168 ENUM_RETURN(gsvptr->dfilter_stack);
169 #undef e1
170 ENUM_PTRS_END
RELOC_PTRS_WITH(gs_state_reloc_ptrs,gs_state * gsvptr)171 private RELOC_PTRS_WITH(gs_state_reloc_ptrs, gs_state *gsvptr)
172 {
173     RELOC_PREFIX(st_imager_state);
174     {
175 #define r1(i,elt) RELOC_PTR(gs_state,elt);
176 	gs_state_do_ptrs(r1)
177 #undef r1
178 	gsvptr->device = gx_device_reloc_ptr(gsvptr->device, gcst);
179 	RELOC_PTR(gs_state, dfilter_stack);
180     }
181 }
182 RELOC_PTRS_END
183 
184 /* Copy client data, using the copy_for procedure if available, */
185 /* the copy procedure otherwise. */
186 private int
gstate_copy_client_data(gs_state * pgs,void * dto,void * dfrom,gs_state_copy_reason_t reason)187 gstate_copy_client_data(gs_state * pgs, void *dto, void *dfrom,
188 			gs_state_copy_reason_t reason)
189 {
190     return (pgs->client_procs.copy_for != 0 ?
191 	    (*pgs->client_procs.copy_for) (dto, dfrom, reason) :
192 	    (*pgs->client_procs.copy) (dto, dfrom));
193 }
194 
195 /* ------ Operations on the entire graphics state ------ */
196 
197 /* Define the initial value of the graphics state. */
198 private const gs_imager_state gstate_initial = {
199     gs_imager_state_initial(1.0)
200 };
201 
202 /*
203  * Allocate a path for the graphics state.  We use stable memory because
204  * some PostScript files have Type 3 fonts whose BuildChar procedure
205  * uses the sequence save ... setcachedevice ... restore, and the path
206  * built between the setcachedevice and the restore must not be freed.
207  * If it weren't for this, we don't think stable memory would be needed.
208  */
209 private gs_memory_t *
gstate_path_memory(gs_memory_t * mem)210 gstate_path_memory(gs_memory_t *mem)
211 {
212     return gs_memory_stable(mem);
213 }
214 
215 /* Allocate and initialize a graphics state. */
216 gs_state *
gs_state_alloc(gs_memory_t * mem)217 gs_state_alloc(gs_memory_t * mem)
218 {
219     gs_state *pgs = gstate_alloc(mem, "gs_state_alloc", NULL);
220     int code;
221 
222     if (pgs == 0)
223 	return 0;
224     pgs->saved = 0;
225     *(gs_imager_state *)pgs = gstate_initial;
226 
227     /*
228      * Just enough of the state is initialized at this point
229      * that it's OK to call gs_state_free if an allocation fails.
230      */
231 
232     code = gs_imager_state_initialize((gs_imager_state *) pgs, mem);
233     if (code < 0)
234 	goto fail;
235 
236     /* Finish initializing the color rendering state. */
237 
238     rc_alloc_struct_1(pgs->halftone, gs_halftone, &st_halftone, mem,
239 		      goto fail, "gs_state_alloc(halftone)");
240     pgs->halftone->type = ht_type_none;
241 
242     /* Initialize other things not covered by initgraphics */
243 
244     pgs->path = gx_path_alloc(gstate_path_memory(mem), "gs_state_alloc(path)");
245     pgs->clip_path = gx_cpath_alloc(mem, "gs_state_alloc(clip_path)");
246     pgs->clip_stack = 0;
247     pgs->view_clip = gx_cpath_alloc(mem, "gs_state_alloc(view_clip)");
248     pgs->view_clip->rule = 0;	/* no clipping */
249     pgs->effective_clip_id = pgs->clip_path->id;
250     pgs->effective_view_clip_id = gs_no_id;
251     pgs->effective_clip_path = pgs->clip_path;
252     pgs->effective_clip_shared = true;
253     /* Initialize things so that gx_remap_color won't crash. */
254     gs_cspace_init_DeviceGray(pgs->memory, pgs->color_space);
255     pgs->in_cachedevice = 0;
256     gx_set_device_color_1(pgs); /* sets colorspace and client color */
257     pgs->device = 0;		/* setting device adjusts refcts */
258     gs_nulldevice(pgs);
259     gs_setalpha(pgs, 1.0);
260     gs_settransfer(pgs, gs_identity_transfer);
261     gs_setflat(pgs, 1.0);
262     gs_setfilladjust(pgs, 0.25, 0.25);
263     gs_setlimitclamp(pgs, false);
264     gs_setstrokeadjust(pgs, true);
265     pgs->font = 0;		/* Not right, but acceptable until the */
266     /* PostScript code does the first setfont. */
267     pgs->root_font = 0;		/* ditto */
268     pgs->in_charpath = (gs_char_path_mode) 0;
269     pgs->show_gstate = 0;
270     pgs->level = 0;
271     pgs->dfilter_stack = 0;
272     pgs->transparency_group_stack = 0;
273     if (gs_initgraphics(pgs) >= 0)
274 	return pgs;
275     /* Something went very wrong. */
276 fail:
277     gs_state_free(pgs);
278     return 0;
279 }
280 
281 /* Set the client data in a graphics state. */
282 /* This should only be done to a newly created state. */
283 void
gs_state_set_client(gs_state * pgs,void * pdata,const gs_state_client_procs * pprocs,bool client_has_pattern_streams)284 gs_state_set_client(gs_state * pgs, void *pdata,
285 		    const gs_state_client_procs * pprocs, bool client_has_pattern_streams)
286 {
287     pgs->client_data = pdata;
288     pgs->client_procs = *pprocs;
289     pgs->have_pattern_streams = client_has_pattern_streams;
290 }
291 
292 /* Get the client data from a graphics state. */
293 #undef gs_state_client_data	/* gzstate.h makes this a macro */
294 void *
gs_state_client_data(const gs_state * pgs)295 gs_state_client_data(const gs_state * pgs)
296 {
297     return pgs->client_data;
298 }
299 
300 /* Free a graphics state. */
301 int
gs_state_free(gs_state * pgs)302 gs_state_free(gs_state * pgs)
303 {
304     gstate_free_contents(pgs);
305     gs_free_object(pgs->memory, pgs, "gs_state_free");
306     return 0;
307 }
308 
309 /* Save the graphics state. */
310 int
gs_gsave(gs_state * pgs)311 gs_gsave(gs_state * pgs)
312 {
313     gs_state *pnew = gstate_clone(pgs, pgs->memory, "gs_gsave",
314 				  copy_for_gsave);
315 
316     if (pnew == 0)
317 	return_error(gs_error_VMerror);
318     /*
319      * It isn't clear from the Adobe documentation whether gsave retains
320      * the current clip stack or clears it.  The following statement
321      * bets on the latter.  If it's the former, this should become
322      *	rc_increment(pnew->clip_stack);
323      */
324     pnew->clip_stack = 0;
325     rc_increment(pnew->dfilter_stack);
326     pgs->saved = pnew;
327     if (pgs->show_gstate == pgs)
328 	pgs->show_gstate = pnew->show_gstate = pnew;
329     pgs->level++;
330     if_debug2('g', "[g]gsave -> 0x%lx, level = %d\n",
331 	      (ulong) pnew, pgs->level);
332     return 0;
333 }
334 
335 /*
336  * Save the graphics state for a 'save'.
337  * We cut the stack below the new gstate, and return the old one.
338  * In addition to an ordinary gsave, we create a new view clip path.
339  */
340 int
gs_gsave_for_save(gs_state * pgs,gs_state ** psaved)341 gs_gsave_for_save(gs_state * pgs, gs_state ** psaved)
342 {
343     int code;
344     gx_clip_path *old_cpath = pgs->view_clip;
345     gx_clip_path *new_cpath;
346 
347     if (old_cpath) {
348 	new_cpath =
349 	    gx_cpath_alloc_shared(old_cpath, pgs->memory,
350 				  "gs_gsave_for_save(view_clip)");
351 	if (new_cpath == 0)
352 	    return_error(gs_error_VMerror);
353     } else {
354 	new_cpath = 0;
355     }
356     code = gs_gsave(pgs);
357     if (code < 0)
358 	goto fail;
359     if (pgs->effective_clip_path == pgs->view_clip)
360 	pgs->effective_clip_path = new_cpath;
361     pgs->view_clip = new_cpath;
362     /* Cut the stack so we can't grestore past here. */
363     *psaved = pgs->saved;
364     pgs->saved = 0;
365     return code;
366 fail:
367     if (new_cpath)
368 	gx_cpath_free(new_cpath, "gs_gsave_for_save(view_clip)");
369     return code;
370 }
371 
372 /* Restore the graphics state. Can fully empty graphics stack */
373 int	/* return 0 if ok, 1 if stack was empty */
gs_grestore_only(gs_state * pgs)374 gs_grestore_only(gs_state * pgs)
375 {
376     gs_state *saved = pgs->saved;
377     void *pdata = pgs->client_data;
378     void *sdata;
379     gs_transparency_state_t *tstack = pgs->transparency_stack;
380     bool prior_overprint = pgs->overprint;
381 
382     if_debug2('g', "[g]grestore 0x%lx, level was %d\n",
383 	      (ulong) saved, pgs->level);
384     if (!saved)
385 	return 1;
386     sdata = saved->client_data;
387     if (saved->pattern_cache == 0)
388 	saved->pattern_cache = pgs->pattern_cache;
389     /* Swap back the client data pointers. */
390     pgs->client_data = sdata;
391     saved->client_data = pdata;
392     if (pdata != 0 && sdata != 0)
393 	gstate_copy_client_data(pgs, pdata, sdata, copy_for_grestore);
394     gstate_free_contents(pgs);
395     *pgs = *saved;
396     pgs->transparency_stack = tstack;
397     if (pgs->show_gstate == saved)
398 	pgs->show_gstate = pgs;
399     gs_free_object(pgs->memory, saved, "gs_grestore");
400 
401     /* update the overprint compositor, if necessary */
402     if (prior_overprint || pgs->overprint)
403         return gs_do_set_overprint(pgs);
404     else
405         return 0;
406 }
407 
408 /* Restore the graphics state per PostScript semantics */
409 int
gs_grestore(gs_state * pgs)410 gs_grestore(gs_state * pgs)
411 {
412     int code;
413     if (!pgs->saved)
414 	return gs_gsave(pgs);	/* shouldn't ever happen */
415     code = gs_grestore_only(pgs);
416     if (code < 0)
417 	return code;
418 
419     /* Wraparound: make sure there are always >= 1 saves on stack */
420     if (pgs->saved)
421 	return 0;
422     return gs_gsave(pgs);
423 }
424 
425 /* Restore the graphics state for a 'restore', splicing the old stack */
426 /* back on.  Note that we actually do a grestoreall + 2 grestores. */
427 int
gs_grestoreall_for_restore(gs_state * pgs,gs_state * saved)428 gs_grestoreall_for_restore(gs_state * pgs, gs_state * saved)
429 {
430     int code;
431 
432     while (pgs->saved->saved) {
433 	code = gs_grestore(pgs);
434 	if (code < 0)
435 	    return code;
436     }
437     /* Make sure we don't leave dangling pointers in the caches. */
438     if (pgs->pattern_cache)
439 	(*pgs->pattern_cache->free_all) (pgs->pattern_cache);
440     pgs->saved->saved = saved;
441     code = gs_grestore(pgs);
442     if (code < 0)
443 	return code;
444     if (pgs->view_clip) {
445 	gx_cpath_free(pgs->view_clip, "gs_grestoreall_for_restore");
446 	pgs->view_clip = 0;
447     }
448     return gs_grestore(pgs);
449 }
450 
451 
452 /* Restore to the bottommost graphics state (at this save level). */
453 int
gs_grestoreall(gs_state * pgs)454 gs_grestoreall(gs_state * pgs)
455 {
456     if (!pgs->saved)		/* shouldn't happen */
457 	return gs_gsave(pgs);
458     while (pgs->saved->saved) {
459 	int code = gs_grestore(pgs);
460 
461 	if (code < 0)
462 	    return code;
463     }
464     return gs_grestore(pgs);
465 }
466 
467 /* Allocate and return a new graphics state. */
468 gs_state *
gs_gstate(gs_state * pgs)469 gs_gstate(gs_state * pgs)
470 {
471     return gs_state_copy(pgs, pgs->memory);
472 }
473 gs_state *
gs_state_copy(gs_state * pgs,gs_memory_t * mem)474 gs_state_copy(gs_state * pgs, gs_memory_t * mem)
475 {
476     gs_state *pnew;
477     /* Prevent 'capturing' the view clip path. */
478     gx_clip_path *view_clip = pgs->view_clip;
479 
480     pgs->view_clip = 0;
481     pnew = gstate_clone(pgs, mem, "gs_gstate", copy_for_gstate);
482     rc_increment(pnew->clip_stack);
483     rc_increment(pnew->dfilter_stack);
484     pgs->view_clip = view_clip;
485     if (pnew == 0)
486 	return 0;
487     pnew->saved = 0;
488     /*
489      * Prevent dangling references from the show_gstate pointer.  If
490      * this context is its own show_gstate, set the pointer in the clone
491      * to point to the clone; otherwise, set the pointer in the clone to
492      * 0, and let gs_setgstate fix it up.
493      */
494     pnew->show_gstate =
495 	(pgs->show_gstate == pgs ? pnew : 0);
496     return pnew;
497 }
498 
499 /* Copy one previously allocated graphics state to another. */
500 int
gs_copygstate(gs_state * pto,const gs_state * pfrom)501 gs_copygstate(gs_state * pto, const gs_state * pfrom)
502 {
503     return gstate_copy(pto, pfrom, copy_for_copygstate, "gs_copygstate");
504 }
505 
506 /* Copy the current graphics state to a previously allocated one. */
507 int
gs_currentgstate(gs_state * pto,const gs_state * pgs)508 gs_currentgstate(gs_state * pto, const gs_state * pgs)
509 {
510     int code =
511 	gstate_copy(pto, pgs, copy_for_currentgstate, "gs_currentgstate");
512 
513     if (code >= 0)
514 	pto->view_clip = 0;
515     return code;
516 }
517 
518 /* Restore the current graphics state from a previously allocated one. */
519 int
gs_setgstate(gs_state * pgs,const gs_state * pfrom)520 gs_setgstate(gs_state * pgs, const gs_state * pfrom)
521 {
522     /*
523      * The implementation is the same as currentgstate,
524      * except we must preserve the saved pointer, the level,
525      * the view clip, and possibly the show_gstate.
526      */
527     gs_state *saved_show = pgs->show_gstate;
528     int level = pgs->level;
529     gx_clip_path *view_clip = pgs->view_clip;
530     gs_transparency_state_t *tstack = pgs->transparency_stack;
531     int code;
532 
533     pgs->view_clip = 0;		/* prevent refcount decrementing */
534     code = gstate_copy(pgs, pfrom, copy_for_setgstate, "gs_setgstate");
535     if (code < 0)
536 	return code;
537     pgs->level = level;
538     pgs->view_clip = view_clip;
539     pgs->show_gstate =
540 	(pgs->show_gstate == pfrom ? pgs : saved_show);
541     pgs->transparency_stack = tstack;
542 
543     /* update the overprint compositor */
544     return gs_do_set_overprint(pgs);
545 }
546 
547 /* Get the allocator pointer of a graphics state. */
548 /* This is provided only for the interpreter */
549 /* and for color space implementation. */
550 gs_memory_t *
gs_state_memory(const gs_state * pgs)551 gs_state_memory(const gs_state * pgs)
552 {
553     return pgs->memory;
554 }
555 
556 /* Get the saved pointer of the graphics state. */
557 /* This is provided only for Level 2 grestore. */
558 gs_state *
gs_state_saved(const gs_state * pgs)559 gs_state_saved(const gs_state * pgs)
560 {
561     return pgs->saved;
562 }
563 
564 /* Swap the saved pointer of the graphics state. */
565 /* This is provided only for save/restore. */
566 gs_state *
gs_state_swap_saved(gs_state * pgs,gs_state * new_saved)567 gs_state_swap_saved(gs_state * pgs, gs_state * new_saved)
568 {
569     gs_state *saved = pgs->saved;
570 
571     pgs->saved = new_saved;
572     return saved;
573 }
574 
575 /* Swap the memory pointer of the graphics state. */
576 /* This is provided only for the interpreter. */
577 gs_memory_t *
gs_state_swap_memory(gs_state * pgs,gs_memory_t * mem)578 gs_state_swap_memory(gs_state * pgs, gs_memory_t * mem)
579 {
580     gs_memory_t *memory = pgs->memory;
581 
582     pgs->memory = mem;
583     return memory;
584 }
585 
586 /* ------ Operations on components ------ */
587 
588 /*
589  * Push an overprint compositor onto the current device. Note that if
590  * the current device already is an overprint compositor, the
591  * create_compositor will update its parameters but not create a new
592  * compositor device.
593  */
594 int
gs_state_update_overprint(gs_state * pgs,const gs_overprint_params_t * pparams)595 gs_state_update_overprint(gs_state * pgs, const gs_overprint_params_t * pparams)
596 {
597     gs_composite_t *    pct = 0;
598     gs_imager_state *   pis = (gs_imager_state *)pgs;
599     int                 code;
600     gx_device *         dev = pgs->device;
601     gx_device *         ovptdev;
602 
603     if ( (code = gs_create_overprint(&pct, pparams, pgs->memory)) >= 0 &&
604          (code = dev_proc(dev, create_compositor)( dev,
605                                                    &ovptdev,
606                                                    pct,
607                                                    pis,
608                                                    pgs->memory )) >= 0   ) {
609         if (ovptdev != dev)
610             gx_set_device_only(pgs, ovptdev);
611     }
612     if (pct != 0)
613         gs_free_object(pgs->memory, pct, "gs_state_update_overprint");
614 
615     /* the following hack handles devices that don't support compositors */
616     if (code == gs_error_unknownerror && !pparams->retain_any_comps)
617         code = 0;
618     return code;
619 }
620 
621 /*
622  * Reset the overprint mode for the current color space and color. This
623  * routine should be called  whenever the current device (i.e.: color
624  * model), overprint, overprint mode, color space, or color are modified.
625  *
626  * The need reason this routine must be called for changes in the current
627  * color and must consider the current color involves the Pattern color
628  * space. In that space, the "color" (pattern) can determine if the base
629  * color space is used (PatternType 1 with PaintType 2), or may provide
630  * is own color space (PatternType 1 with PaintType 1, PatternType 2).
631  *
632  * The most general situation (PatternType 1 with PaintType 1) cannot be
633  * handled properly due to limitations of the pattern cache mechanism,
634  * so in this case overprint is effectively disable by making all color
635  * components "drawn".
636  */
637 int
gs_do_set_overprint(gs_state * pgs)638 gs_do_set_overprint(gs_state * pgs)
639 {
640     const gs_color_space *  pcs = pgs->color_space;
641     const gs_client_color * pcc = pgs->ccolor;
642     int                     code = 0;
643 
644     if (cs_num_components(pcs) < 0 && pcc->pattern != 0)
645         code = pcc->pattern->type->procs.set_color(pcc, pgs);
646     else
647         pcs->type->set_overprint(pcs, pgs);
648     return code;
649 }
650 
651 /* setoverprint */
652 void
gs_setoverprint(gs_state * pgs,bool ovp)653 gs_setoverprint(gs_state * pgs, bool ovp)
654 {
655     bool    prior_ovp = pgs->overprint;
656 
657     pgs->overprint = ovp;
658     if (prior_ovp != ovp)
659         (void)gs_do_set_overprint(pgs);
660 }
661 
662 /* currentoverprint */
663 bool
gs_currentoverprint(const gs_state * pgs)664 gs_currentoverprint(const gs_state * pgs)
665 {
666     return pgs->overprint;
667 }
668 
669 /* setoverprintmode */
670 int
gs_setoverprintmode(gs_state * pgs,int mode)671 gs_setoverprintmode(gs_state * pgs, int mode)
672 {
673     int     prior_mode = pgs->effective_overprint_mode;
674     int     code = 0;
675 
676     if (mode < 0 || mode > 1)
677 	return_error(gs_error_rangecheck);
678     pgs->overprint_mode = mode;
679     if (pgs->overprint && prior_mode != mode)
680         code = gs_do_set_overprint(pgs);
681     return code;
682 }
683 
684 /* currentoverprintmode */
685 int
gs_currentoverprintmode(const gs_state * pgs)686 gs_currentoverprintmode(const gs_state * pgs)
687 {
688     return pgs->overprint_mode;
689 }
690 
691 
692 /*
693  * Reset most of the graphics state.
694  *
695  * NB: This routine no longer resets the current color or current color
696  *     space. It cannot do this for PostScript, due to color substitution.
697  *     Clients should perform the appropriate color/colorspace
698  *     initializaion themselves.
699  */
700 int
gs_initgraphics(gs_state * pgs)701 gs_initgraphics(gs_state * pgs)
702 {
703     int code;
704 
705     gs_initmatrix(pgs);
706     if ((code = gs_newpath(pgs)) < 0 ||
707 	(code = gs_initclip(pgs)) < 0 ||
708 	(code = gs_setlinewidth(pgs, 1.0)) < 0 ||
709 	(code = gs_setlinecap(pgs, gstate_initial.line_params.cap)) < 0 ||
710 	(code = gs_setlinejoin(pgs, gstate_initial.line_params.join)) < 0 ||
711 	(code = gs_setcurvejoin(pgs, gstate_initial.line_params.curve_join)) < 0 ||
712 	(code = gs_setdash(pgs, (float *)0, 0, 0.0)) < 0 ||
713 	(gs_setdashadapt(pgs, false),
714 	 (code = gs_setdotlength(pgs, 0.0, false))) < 0 ||
715 	(code = gs_setdotorientation(pgs)) < 0 ||
716 	(code = gs_setmiterlimit(pgs, gstate_initial.line_params.miter_limit)) < 0
717 	)
718 	return code;
719     gs_init_rop(pgs);
720     return 0;
721 }
722 
723 /* setfilladjust */
724 int
gs_setfilladjust(gs_state * pgs,floatp adjust_x,floatp adjust_y)725 gs_setfilladjust(gs_state * pgs, floatp adjust_x, floatp adjust_y)
726 {
727 #define CLAMP_TO_HALF(v)\
728     ((v) <= 0 ? fixed_0 : (v) >= 0.5 ? fixed_half : float2fixed(v));
729 
730     pgs->fill_adjust.x = CLAMP_TO_HALF(adjust_x);
731     pgs->fill_adjust.y = CLAMP_TO_HALF(adjust_y);
732     return 0;
733 #undef CLAMP_TO_HALF
734 }
735 
736 /* currentfilladjust */
737 int
gs_currentfilladjust(const gs_state * pgs,gs_point * adjust)738 gs_currentfilladjust(const gs_state * pgs, gs_point * adjust)
739 {
740     adjust->x = fixed2float(pgs->fill_adjust.x);
741     adjust->y = fixed2float(pgs->fill_adjust.y);
742     return 0;
743 }
744 
745 /* setlimitclamp */
746 void
gs_setlimitclamp(gs_state * pgs,bool clamp)747 gs_setlimitclamp(gs_state * pgs, bool clamp)
748 {
749     pgs->clamp_coordinates = clamp;
750 }
751 
752 /* currentlimitclamp */
753 bool
gs_currentlimitclamp(const gs_state * pgs)754 gs_currentlimitclamp(const gs_state * pgs)
755 {
756     return pgs->clamp_coordinates;
757 }
758 
759 /* settextrenderingmode */
760 void
gs_settextrenderingmode(gs_state * pgs,uint trm)761 gs_settextrenderingmode(gs_state * pgs, uint trm)
762 {
763     pgs->text_rendering_mode = trm;
764 }
765 
766 /* currenttextrenderingmode */
767 uint
gs_currenttextrenderingmode(const gs_state * pgs)768 gs_currenttextrenderingmode(const gs_state * pgs)
769 {
770     return pgs->text_rendering_mode;
771 }
772 
773 /* ------ Internal routines ------ */
774 
775 /* Free the privately allocated parts of a gstate. */
776 private void
gstate_free_parts(const gs_state * parts,gs_memory_t * mem,client_name_t cname)777 gstate_free_parts(const gs_state * parts, gs_memory_t * mem, client_name_t cname)
778 {
779     gs_free_object(mem, parts->dev_color, cname);
780     gs_free_object(mem, parts->ccolor, cname);
781     gs_free_object(mem, parts->color_space, cname);
782     if (!parts->effective_clip_shared)
783 	gx_cpath_free(parts->effective_clip_path, cname);
784     gx_cpath_free(parts->clip_path, cname);
785     gx_path_free(parts->path, cname);
786 }
787 
788 /* Allocate the privately allocated parts of a gstate. */
789 private int
gstate_alloc_parts(gs_state * parts,const gs_state * shared,gs_memory_t * mem,client_name_t cname)790 gstate_alloc_parts(gs_state * parts, const gs_state * shared,
791 		   gs_memory_t * mem, client_name_t cname)
792 {
793     gs_memory_t *path_mem = gstate_path_memory(mem);
794 
795     parts->path =
796 	(shared ?
797 	 gx_path_alloc_shared(shared->path, path_mem,
798 			      "gstate_alloc_parts(path)") :
799 	 gx_path_alloc(path_mem, "gstate_alloc_parts(path)"));
800     parts->clip_path =
801 	(shared ?
802 	 gx_cpath_alloc_shared(shared->clip_path, mem,
803 			       "gstate_alloc_parts(clip_path)") :
804 	 gx_cpath_alloc(mem, "gstate_alloc_parts(clip_path)"));
805     if (!shared || shared->effective_clip_shared) {
806 	parts->effective_clip_path = parts->clip_path;
807 	parts->effective_clip_shared = true;
808     } else {
809 	parts->effective_clip_path =
810 	    gx_cpath_alloc_shared(shared->effective_clip_path, mem,
811 				  "gstate_alloc_parts(effective_clip_path)");
812 	parts->effective_clip_shared = false;
813     }
814     parts->color_space =
815 	gs_alloc_struct(mem, gs_color_space, &st_color_space, cname);
816     parts->ccolor =
817 	gs_alloc_struct(mem, gs_client_color, &st_client_color, cname);
818     parts->dev_color =
819 	gs_alloc_struct(mem, gx_device_color, &st_device_color, cname);
820     if (parts->path == 0 || parts->clip_path == 0 ||
821 	parts->effective_clip_path == 0 ||
822 	parts->color_space == 0 || parts->ccolor == 0 ||
823 	parts->dev_color == 0
824 	) {
825 	gstate_free_parts(parts, mem, cname);
826 	return_error(gs_error_VMerror);
827     }
828     return 0;
829 }
830 
831 /*
832  * Allocate a gstate and its contents.
833  * If pfrom is not NULL, the path, clip_path, and (if distinct from both
834  * clip_path and view_clip) effective_clip_path share the segments of
835  * pfrom's corresponding path(s).
836  */
837 private gs_state *
gstate_alloc(gs_memory_t * mem,client_name_t cname,const gs_state * pfrom)838 gstate_alloc(gs_memory_t * mem, client_name_t cname, const gs_state * pfrom)
839 {
840     gs_state *pgs =
841 	gs_alloc_struct(mem, gs_state, &st_gs_state, cname);
842 
843     if (pgs == 0)
844 	return 0;
845     if (gstate_alloc_parts(pgs, pfrom, mem, cname) < 0) {
846 	gs_free_object(mem, pgs, cname);
847 	return 0;
848     }
849     pgs->memory = mem;
850     return pgs;
851 }
852 
853 /* Copy the dash pattern from one gstate to another. */
854 private int
gstate_copy_dash(gs_state * pto,const gs_state * pfrom)855 gstate_copy_dash(gs_state * pto, const gs_state * pfrom)
856 {
857     return gs_setdash(pto, pfrom->line_params.dash.pattern,
858 		      pfrom->line_params.dash.pattern_size,
859 		      pfrom->line_params.dash.offset);
860 }
861 
862 /* Clone an existing graphics state. */
863 /* Return 0 if the allocation fails. */
864 /* If reason is for_gsave, the clone refers to the old contents, */
865 /* and we switch the old state to refer to the new contents. */
866 private gs_state *
gstate_clone(gs_state * pfrom,gs_memory_t * mem,client_name_t cname,gs_state_copy_reason_t reason)867 gstate_clone(gs_state * pfrom, gs_memory_t * mem, client_name_t cname,
868 	     gs_state_copy_reason_t reason)
869 {
870     gs_state *pgs = gstate_alloc(mem, cname, pfrom);
871     gs_state_parts parts;
872 
873     if (pgs == 0)
874 	return 0;
875     GSTATE_ASSIGN_PARTS(&parts, pgs);
876     *pgs = *pfrom;
877     pgs->transparency_stack = 0;
878     /* Copy the dash pattern if necessary. */
879     if (pgs->line_params.dash.pattern) {
880 	int code;
881 
882 	pgs->line_params.dash.pattern = 0;	/* force allocation */
883 	code = gstate_copy_dash(pgs, pfrom);
884 	if (code < 0)
885 	    goto fail;
886     }
887     if (pgs->client_data != 0) {
888 	void *pdata = pgs->client_data = (*pgs->client_procs.alloc) (mem);
889 
890 	if (pdata == 0 ||
891 	 gstate_copy_client_data(pgs, pdata, pfrom->client_data, reason) < 0
892 	    )
893 	    goto fail;
894     }
895     gs_imager_state_copied((gs_imager_state *)pgs);
896     /* Don't do anything to clip_stack. */
897     rc_increment(pgs->device);
898     *parts.color_space = *pfrom->color_space;
899     *parts.ccolor = *pfrom->ccolor;
900     *parts.dev_color = *pfrom->dev_color;
901     if (reason == copy_for_gsave) {
902 	float *dfrom = pfrom->line_params.dash.pattern;
903 	float *dto = pgs->line_params.dash.pattern;
904 
905 	GSTATE_ASSIGN_PARTS(pfrom, &parts);
906 	pgs->line_params.dash.pattern = dfrom;
907 	pfrom->line_params.dash.pattern = dto;
908     } else {
909 	GSTATE_ASSIGN_PARTS(pgs, &parts);
910     }
911     cs_adjust_counts(pgs, 1);
912     return pgs;
913   fail:
914     gs_free_object(mem, pgs->line_params.dash.pattern, cname);
915     GSTATE_ASSIGN_PARTS(pgs, &parts);
916     gstate_free_parts(pgs, mem, cname);
917     gs_free_object(mem, pgs, cname);
918     return 0;
919 }
920 
921 /* Release the composite parts of a graphics state, */
922 /* but not the state itself. */
923 private void
gstate_free_contents(gs_state * pgs)924 gstate_free_contents(gs_state * pgs)
925 {
926     gs_memory_t *mem = pgs->memory;
927     const char *const cname = "gstate_free_contents";
928 
929     rc_decrement(pgs->device, cname);
930     rc_decrement(pgs->clip_stack, cname);
931     rc_decrement(pgs->dfilter_stack, cname);
932     cs_adjust_counts(pgs, -1);
933     if (pgs->client_data != 0)
934 	(*pgs->client_procs.free) (pgs->client_data, mem);
935     gs_free_object(mem, pgs->line_params.dash.pattern, cname);
936     gstate_free_parts(pgs, mem, cname);
937     gs_imager_state_release((gs_imager_state *)pgs);
938 }
939 
940 /* Copy one gstate to another. */
941 private int
gstate_copy(gs_state * pto,const gs_state * pfrom,gs_state_copy_reason_t reason,client_name_t cname)942 gstate_copy(gs_state * pto, const gs_state * pfrom,
943 	    gs_state_copy_reason_t reason, client_name_t cname)
944 {
945     gs_state_parts parts;
946 
947     GSTATE_ASSIGN_PARTS(&parts, pto);
948     /* Copy the dash pattern if necessary. */
949     if (pfrom->line_params.dash.pattern || pto->line_params.dash.pattern) {
950 	int code = gstate_copy_dash(pto, pfrom);
951 
952 	if (code < 0)
953 	    return code;
954     }
955     /*
956      * It's OK to decrement the counts before incrementing them,
957      * because anything that is going to survive has a count of
958      * at least 2 (pto and somewhere else) initially.
959      * Handle references from contents.
960      */
961     cs_adjust_counts(pto, -1);
962     gx_path_assign_preserve(pto->path, pfrom->path);
963     gx_cpath_assign_preserve(pto->clip_path, pfrom->clip_path);
964     /*
965      * effective_clip_shared will be copied, but we need to do the
966      * right thing with effective_clip_path.
967      */
968     if (pfrom->effective_clip_shared) {
969 	/*
970 	 * pfrom->effective_clip_path is either pfrom->view_clip or
971 	 * pfrom->clip_path.
972 	 */
973 	parts.effective_clip_path =
974 	    (pfrom->effective_clip_path == pfrom->view_clip ?
975 	     pto->view_clip : parts.clip_path);
976     } else
977 	gx_cpath_assign_preserve(pto->effective_clip_path,
978 				 pfrom->effective_clip_path);
979     *parts.color_space = *pfrom->color_space;
980     *parts.ccolor = *pfrom->ccolor;
981     *parts.dev_color = *pfrom->dev_color;
982     cs_adjust_counts(pto, 1);
983     /* Handle references from gstate object. */
984 #define RCCOPY(element)\
985     rc_pre_assign(pto->element, pfrom->element, cname)
986     RCCOPY(device);
987     RCCOPY(clip_stack);
988     RCCOPY(dfilter_stack);
989     {
990 	struct gx_pattern_cache_s *pcache = pto->pattern_cache;
991 	void *pdata = pto->client_data;
992 	gs_memory_t *mem = pto->memory;
993 	gs_state *saved = pto->saved;
994 	float *pattern = pto->line_params.dash.pattern;
995 
996 	gs_imager_state_pre_assign((gs_imager_state *)pto,
997 				   (const gs_imager_state *)pfrom);
998 	*pto = *pfrom;
999 	pto->client_data = pdata;
1000 	pto->memory = mem;
1001 	pto->saved = saved;
1002 	pto->line_params.dash.pattern = pattern;
1003 	if (pto->pattern_cache == 0)
1004 	    pto->pattern_cache = pcache;
1005 	if (pfrom->client_data != 0) {
1006 	    /* We need to break 'const' here. */
1007 	    gstate_copy_client_data((gs_state *) pfrom, pdata,
1008 				    pfrom->client_data, reason);
1009 	}
1010     }
1011     GSTATE_ASSIGN_PARTS(pto, &parts);
1012 #undef RCCOPY
1013     pto->show_gstate =
1014 	(pfrom->show_gstate == pfrom ? pto : 0);
1015     return 0;
1016 }
1017 
1018 /* Accessories. */
gx_get_clip_path_id(gs_state * pgs)1019 gs_id gx_get_clip_path_id(gs_state *pgs)
1020 {
1021     return pgs->clip_path->id;
1022 }
1023