xref: /plan9-contrib/sys/src/cmd/gs/src/gxpaint.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* Copyright (C) 1995, 1996, 1998, 1999 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gxpaint.c,v 1.5 2004/09/09 21:01:31 igor Exp $ */
187dd7cddfSDavid du Colombier /* Graphics-state-aware fill and stroke procedures */
197dd7cddfSDavid du Colombier #include "gx.h"
207dd7cddfSDavid du Colombier #include "gzstate.h"
217dd7cddfSDavid du Colombier #include "gxdevice.h"
227dd7cddfSDavid du Colombier #include "gxhttile.h"
237dd7cddfSDavid du Colombier #include "gxpaint.h"
247dd7cddfSDavid du Colombier #include "gxpath.h"
25*593dc095SDavid du Colombier #include "gxfont.h"
26*593dc095SDavid du Colombier 
caching_an_outline_font(const gs_state * pgs)27*593dc095SDavid du Colombier private bool caching_an_outline_font(const gs_state * pgs)
28*593dc095SDavid du Colombier {
29*593dc095SDavid du Colombier     return pgs->in_cachedevice > 1 &&
30*593dc095SDavid du Colombier 	    pgs->font != NULL &&
31*593dc095SDavid du Colombier 	    pgs->font->FontType != ft_user_defined &&
32*593dc095SDavid du Colombier 	    pgs->font->FontType != ft_CID_user_defined;
33*593dc095SDavid du Colombier }
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier /* Fill a path. */
367dd7cddfSDavid du Colombier int
gx_fill_path(gx_path * ppath,gx_device_color * pdevc,gs_state * pgs,int rule,fixed adjust_x,fixed adjust_y)377dd7cddfSDavid du Colombier gx_fill_path(gx_path * ppath, gx_device_color * pdevc, gs_state * pgs,
387dd7cddfSDavid du Colombier 	     int rule, fixed adjust_x, fixed adjust_y)
397dd7cddfSDavid du Colombier {
407dd7cddfSDavid du Colombier     gx_device *dev = gs_currentdevice_inline(pgs);
417dd7cddfSDavid du Colombier     gx_clip_path *pcpath;
427dd7cddfSDavid du Colombier     int code = gx_effective_clip_path(pgs, &pcpath);
437dd7cddfSDavid du Colombier     gx_fill_params params;
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier     if (code < 0)
467dd7cddfSDavid du Colombier 	return code;
477dd7cddfSDavid du Colombier     params.rule = rule;
487dd7cddfSDavid du Colombier     params.adjust.x = adjust_x;
497dd7cddfSDavid du Colombier     params.adjust.y = adjust_y;
50*593dc095SDavid du Colombier     params.flatness = (caching_an_outline_font(pgs) ? 0.0 : pgs->flatness);
517dd7cddfSDavid du Colombier     params.fill_zero_width = (adjust_x | adjust_y) != 0;
527dd7cddfSDavid du Colombier     return (*dev_proc(dev, fill_path))
537dd7cddfSDavid du Colombier 	(dev, (const gs_imager_state *)pgs, ppath, &params, pdevc, pcpath);
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier 
567dd7cddfSDavid du Colombier /* Stroke a path for drawing or saving. */
577dd7cddfSDavid du Colombier int
gx_stroke_fill(gx_path * ppath,gs_state * pgs)587dd7cddfSDavid du Colombier gx_stroke_fill(gx_path * ppath, gs_state * pgs)
597dd7cddfSDavid du Colombier {
607dd7cddfSDavid du Colombier     gx_device *dev = gs_currentdevice_inline(pgs);
617dd7cddfSDavid du Colombier     gx_clip_path *pcpath;
627dd7cddfSDavid du Colombier     int code = gx_effective_clip_path(pgs, &pcpath);
637dd7cddfSDavid du Colombier     gx_stroke_params params;
647dd7cddfSDavid du Colombier 
657dd7cddfSDavid du Colombier     if (code < 0)
667dd7cddfSDavid du Colombier 	return code;
67*593dc095SDavid du Colombier     params.flatness = (caching_an_outline_font(pgs) ? 0.0 : pgs->flatness);
687dd7cddfSDavid du Colombier     return (*dev_proc(dev, stroke_path))
697dd7cddfSDavid du Colombier 	(dev, (const gs_imager_state *)pgs, ppath, &params,
707dd7cddfSDavid du Colombier 	 pgs->dev_color, pcpath);
717dd7cddfSDavid du Colombier }
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier int
gx_stroke_add(gx_path * ppath,gx_path * to_path,const gs_state * pgs)747dd7cddfSDavid du Colombier gx_stroke_add(gx_path * ppath, gx_path * to_path,
757dd7cddfSDavid du Colombier 	      const gs_state * pgs)
767dd7cddfSDavid du Colombier {
777dd7cddfSDavid du Colombier     gx_stroke_params params;
787dd7cddfSDavid du Colombier 
79*593dc095SDavid du Colombier     params.flatness = (caching_an_outline_font(pgs) ? 0.0 : pgs->flatness);
807dd7cddfSDavid du Colombier     return gx_stroke_path_only(ppath, to_path, pgs->device,
817dd7cddfSDavid du Colombier 			       (const gs_imager_state *)pgs,
827dd7cddfSDavid du Colombier 			       &params, NULL, NULL);
837dd7cddfSDavid du Colombier }
847dd7cddfSDavid du Colombier 
857dd7cddfSDavid du Colombier int
gx_imager_stroke_add(gx_path * ppath,gx_path * to_path,gx_device * dev,const gs_imager_state * pis)867dd7cddfSDavid du Colombier gx_imager_stroke_add(gx_path *ppath, gx_path *to_path,
877dd7cddfSDavid du Colombier 		     gx_device *dev, const gs_imager_state *pis)
887dd7cddfSDavid du Colombier {
897dd7cddfSDavid du Colombier     gx_stroke_params params;
907dd7cddfSDavid du Colombier 
917dd7cddfSDavid du Colombier     params.flatness = pis->flatness;
927dd7cddfSDavid du Colombier     return gx_stroke_path_only(ppath, to_path, dev, pis,
937dd7cddfSDavid du Colombier 			       &params, NULL, NULL);
947dd7cddfSDavid du Colombier }
95