1
/* Copyright (C) 2001-2006 Artifex Software, Inc.
4
This software is provided AS-IS with no warranty, either express or
7
This software is distributed under license and may not be copied, modified
8
or distributed except as expressly authorized under the terms of that
9
license. Refer to licensing information at http://www.artifex.com/
10
or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
11
San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
14
/* $Id: gsdps.c 8250 2007-09-25 13:31:24Z giles $ */
15
/* Display PostScript extensions */
19
#include "gspath.h" /* for newpath */
20
#include "gxdevice.h" /* for gxcpath.h */
21
#include "gzpath.h" /* for gzcpath.h */
25
/* ---------------- View clipping ---------------- */
27
/* Forward references */
28
static int common_viewclip(gs_state *, int);
31
gs_initviewclip(gs_state * pgs)
33
gx_clip_path *pcpath = pgs->view_clip;
35
if (pcpath != 0 && pcpath->rule != 0) {
36
gx_cpath_reset(pcpath);
43
gs_viewclip(gs_state * pgs)
45
return common_viewclip(pgs, gx_rule_winding_number);
49
gs_eoviewclip(gs_state * pgs)
51
return common_viewclip(pgs, gx_rule_even_odd);
54
/* This code is (almost) copied from common_clip in gspath.c. */
55
/* Someday we'll find a way to merge them. */
57
common_viewclip(gs_state * pgs, int rule)
62
gx_clip_path *pcpath = pgs->view_clip;
65
pcpath = gx_cpath_alloc(pgs->memory, "gs_[eo]viewclip");
67
return_error(gs_error_VMerror);
68
pgs->view_clip = pcpath;
70
if ((code = gx_path_bbox(pgs->path, &bbox)) < 0)
72
gx_cpath_init_local(&rpath, pgs->memory);
73
code = gx_cpath_from_rectangle(&rpath, &bbox);
75
code = gx_cpath_clip(pgs, &rpath, pgs->path, rule);
77
gx_cpath_free(&rpath, "gs_[eo]viewclip");
81
gx_cpath_assign_free(pcpath, &rpath);
87
gs_viewclippath(gs_state * pgs)
90
gx_clip_path *pcpath = pgs->view_clip;
93
gx_path_init_local(&cpath, pgs->memory);
94
if (pcpath == 0 || pcpath->rule == 0) {
95
/* No view clip path is active: fabricate one. */
98
code = gx_default_clip_box(pgs, &box);
101
code = gx_path_add_rectangle(&cpath, box.p.x, box.p.y,
104
code = gx_cpath_to_path(pcpath, &cpath);
108
return gx_path_assign_free(pgs->path, &cpath);