xref: /plan9/sys/src/cmd/gs/src/gdevvec.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 1997, 1998, 1999, 2000 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: gdevvec.h,v 1.16 2005/01/28 19:11:07 igor Exp $ */
187dd7cddfSDavid du Colombier /* Common definitions for "vector" devices */
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier #ifndef gdevvec_INCLUDED
217dd7cddfSDavid du Colombier #  define gdevvec_INCLUDED
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier #include "gp.h"			/* for gp_file_name_sizeof */
247dd7cddfSDavid du Colombier #include "gsropt.h"
257dd7cddfSDavid du Colombier #include "gxdevice.h"
267dd7cddfSDavid du Colombier #include "gdevbbox.h"
277dd7cddfSDavid du Colombier #include "gxiparam.h"
287dd7cddfSDavid du Colombier #include "gxistate.h"
29*593dc095SDavid du Colombier #include "gxhldevc.h"
307dd7cddfSDavid du Colombier #include "stream.h"
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier /*
337dd7cddfSDavid du Colombier  * "Vector" devices produce a stream of higher-level drawing commands rather
347dd7cddfSDavid du Colombier  * than a raster image.  (We don't like the term "vector", since the command
357dd7cddfSDavid du Colombier  * vocabulary typically includes text and raster images as well as actual
367dd7cddfSDavid du Colombier  * vectors, but it's widely used in the industry, and we weren't able to
377dd7cddfSDavid du Colombier  * find one that read better.)  Some examples of "vector" formats are PDF,
387dd7cddfSDavid du Colombier  * PostScript, PCL XL, HP-GL/2 + RTL, CGM, Windows Metafile, and Macintosh
397dd7cddfSDavid du Colombier  * PICT.
407dd7cddfSDavid du Colombier  *
417dd7cddfSDavid du Colombier  * This file extends the basic driver structure with elements likely to be
427dd7cddfSDavid du Colombier  * useful to vector devices.  These include:
437dd7cddfSDavid du Colombier  *
447dd7cddfSDavid du Colombier  *      - Tracking whether any marks have been made on the page;
457dd7cddfSDavid du Colombier  *
467dd7cddfSDavid du Colombier  *      - Keeping track of the page bounding box;
477dd7cddfSDavid du Colombier  *
487dd7cddfSDavid du Colombier  *      - A copy of the most recently written current graphics state
497dd7cddfSDavid du Colombier  *      parameters;
507dd7cddfSDavid du Colombier  *
517dd7cddfSDavid du Colombier  *      - An output stream (for drivers that compress or otherwise filter
527dd7cddfSDavid du Colombier  *      their output);
537dd7cddfSDavid du Colombier  *
547dd7cddfSDavid du Colombier  *      - A vector of procedures for writing changes to the graphics state.
557dd7cddfSDavid du Colombier  *
567dd7cddfSDavid du Colombier  *      - The ability to work with scaled output coordinate systems.
577dd7cddfSDavid du Colombier  *
587dd7cddfSDavid du Colombier  * We expect to add more elements and procedures as we gain more experience
597dd7cddfSDavid du Colombier  * with this kind of driver.
607dd7cddfSDavid du Colombier  */
617dd7cddfSDavid du Colombier 
627dd7cddfSDavid du Colombier /* ================ Types and structures ================ */
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier /* Define the abstract type for a vector device. */
657dd7cddfSDavid du Colombier typedef struct gx_device_vector_s gx_device_vector;
667dd7cddfSDavid du Colombier 
677dd7cddfSDavid du Colombier /* Define the maximum size of the output file name. */
687dd7cddfSDavid du Colombier #define fname_size (gp_file_name_sizeof - 1)
697dd7cddfSDavid du Colombier 
707dd7cddfSDavid du Colombier /* Define the longest dash pattern we can remember. */
717dd7cddfSDavid du Colombier #define max_dash 11
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier /*
747dd7cddfSDavid du Colombier  * Define procedures for writing common output elements.  Not all devices
757dd7cddfSDavid du Colombier  * will support all of these elements.  Note that these procedures normally
767dd7cddfSDavid du Colombier  * only write out commands, and don't update the driver state itself.  All
777dd7cddfSDavid du Colombier  * of them are optional, called only as indicated under the utility
787dd7cddfSDavid du Colombier  * procedures below.
797dd7cddfSDavid du Colombier  */
807dd7cddfSDavid du Colombier typedef enum {
817dd7cddfSDavid du Colombier     gx_path_type_none = 0,
827dd7cddfSDavid du Colombier     /*
837dd7cddfSDavid du Colombier      * All combinations of flags are legal.  Multiple commands are
847dd7cddfSDavid du Colombier      * executed in the order fill, stroke, clip.
857dd7cddfSDavid du Colombier      */
867dd7cddfSDavid du Colombier     gx_path_type_fill = 1,
877dd7cddfSDavid du Colombier     gx_path_type_stroke = 2,
887dd7cddfSDavid du Colombier     gx_path_type_clip = 4,
897dd7cddfSDavid du Colombier     gx_path_type_winding_number = 0,
907dd7cddfSDavid du Colombier     gx_path_type_even_odd = 8,
913ff48bf5SDavid du Colombier     gx_path_type_optimize = 16,	/* OK to optimize paths by merging seg.s */
923ff48bf5SDavid du Colombier     gx_path_type_always_close = 32, /* include final closepath even if not stroke */
937dd7cddfSDavid du Colombier     gx_path_type_rule = gx_path_type_winding_number | gx_path_type_even_odd
947dd7cddfSDavid du Colombier } gx_path_type_t;
957dd7cddfSDavid du Colombier typedef enum {
967dd7cddfSDavid du Colombier     gx_rect_x_first,
977dd7cddfSDavid du Colombier     gx_rect_y_first
987dd7cddfSDavid du Colombier } gx_rect_direction_t;
997dd7cddfSDavid du Colombier typedef struct gx_device_vector_procs_s {
1007dd7cddfSDavid du Colombier     /* Page management */
101*593dc095SDavid du Colombier     int (*beginpage) (gx_device_vector * vdev);
1027dd7cddfSDavid du Colombier     /* Imager state */
103*593dc095SDavid du Colombier     int (*setlinewidth) (gx_device_vector * vdev, floatp width);
104*593dc095SDavid du Colombier     int (*setlinecap) (gx_device_vector * vdev, gs_line_cap cap);
105*593dc095SDavid du Colombier     int (*setlinejoin) (gx_device_vector * vdev, gs_line_join join);
106*593dc095SDavid du Colombier     int (*setmiterlimit) (gx_device_vector * vdev, floatp limit);
107*593dc095SDavid du Colombier     int (*setdash) (gx_device_vector * vdev, const float *pattern,
108*593dc095SDavid du Colombier 		    uint count, floatp offset);
109*593dc095SDavid du Colombier     int (*setflat) (gx_device_vector * vdev, floatp flatness);
110*593dc095SDavid du Colombier     int (*setlogop) (gx_device_vector * vdev, gs_logical_operation_t lop,
111*593dc095SDavid du Colombier 		     gs_logical_operation_t diff);
1127dd7cddfSDavid du Colombier     /* Other state */
113*593dc095SDavid du Colombier     bool (*can_handle_hl_color) (gx_device_vector * vdev, const gs_imager_state * pis,
114*593dc095SDavid du Colombier                          const gx_drawing_color * pdc);
115*593dc095SDavid du Colombier     int (*setfillcolor) (gx_device_vector * vdev, const gs_imager_state * pis,
116*593dc095SDavid du Colombier                          const gx_drawing_color * pdc);
117*593dc095SDavid du Colombier     int (*setstrokecolor) (gx_device_vector * vdev, const gs_imager_state * pis,
118*593dc095SDavid du Colombier                            const gx_drawing_color * pdc);
1197dd7cddfSDavid du Colombier     /* Paths */
1207dd7cddfSDavid du Colombier     /* dopath and dorect are normally defaulted */
121*593dc095SDavid du Colombier     int (*dopath) (gx_device_vector * vdev, const gx_path * ppath,
122*593dc095SDavid du Colombier 		   gx_path_type_t type, const gs_matrix *pmat);
123*593dc095SDavid du Colombier     int (*dorect) (gx_device_vector * vdev, fixed x0, fixed y0, fixed x1,
124*593dc095SDavid du Colombier 		   fixed y1, gx_path_type_t type);
125*593dc095SDavid du Colombier     int (*beginpath) (gx_device_vector * vdev, gx_path_type_t type);
126*593dc095SDavid du Colombier     int (*moveto) (gx_device_vector * vdev, floatp x0, floatp y0,
127*593dc095SDavid du Colombier 		   floatp x, floatp y, gx_path_type_t type);
128*593dc095SDavid du Colombier     int (*lineto) (gx_device_vector * vdev, floatp x0, floatp y0,
129*593dc095SDavid du Colombier 		   floatp x, floatp y, gx_path_type_t type);
130*593dc095SDavid du Colombier     int (*curveto) (gx_device_vector * vdev, floatp x0, floatp y0,
1317dd7cddfSDavid du Colombier 		    floatp x1, floatp y1, floatp x2, floatp y2,
132*593dc095SDavid du Colombier 		    floatp x3, floatp y3, gx_path_type_t type);
133*593dc095SDavid du Colombier     int (*closepath) (gx_device_vector * vdev, floatp x0, floatp y0,
134*593dc095SDavid du Colombier 		      floatp x_start, floatp y_start, gx_path_type_t type);
135*593dc095SDavid du Colombier     int (*endpath) (gx_device_vector * vdev, gx_path_type_t type);
1367dd7cddfSDavid du Colombier } gx_device_vector_procs;
1377dd7cddfSDavid du Colombier 
1387dd7cddfSDavid du Colombier /* Default implementations of procedures */
1397dd7cddfSDavid du Colombier /* setflat does nothing */
140*593dc095SDavid du Colombier int gdev_vector_setflat(gx_device_vector * vdev, floatp flatness);
1417dd7cddfSDavid du Colombier 
1427dd7cddfSDavid du Colombier /* dopath may call dorect, beginpath, moveto/lineto/curveto/closepath, */
1437dd7cddfSDavid du Colombier /* endpath */
144*593dc095SDavid du Colombier int gdev_vector_dopath(gx_device_vector * vdev, const gx_path * ppath,
145*593dc095SDavid du Colombier 		       gx_path_type_t type, const gs_matrix *pmat);
1467dd7cddfSDavid du Colombier 
1477dd7cddfSDavid du Colombier /* dorect may call beginpath, moveto, lineto, closepath */
148*593dc095SDavid du Colombier int gdev_vector_dorect(gx_device_vector * vdev, fixed x0, fixed y0,
149*593dc095SDavid du Colombier 		       fixed x1, fixed y1, gx_path_type_t type);
1507dd7cddfSDavid du Colombier 
1517dd7cddfSDavid du Colombier /* Finally, define the extended device structure. */
1527dd7cddfSDavid du Colombier #define gx_device_vector_common\
1537dd7cddfSDavid du Colombier 	gx_device_common;\
1547dd7cddfSDavid du Colombier 	gs_memory_t *v_memory;\
1557dd7cddfSDavid du Colombier 		/* Output element writing procedures */\
1567dd7cddfSDavid du Colombier 	const gx_device_vector_procs *vec_procs;\
1577dd7cddfSDavid du Colombier 		/* Output file */\
1587dd7cddfSDavid du Colombier 	char fname[fname_size + 1];\
1597dd7cddfSDavid du Colombier 	FILE *file;\
1607dd7cddfSDavid du Colombier 	stream *strm;\
1617dd7cddfSDavid du Colombier 	byte *strmbuf;\
1627dd7cddfSDavid du Colombier 	uint strmbuf_size;\
1633ff48bf5SDavid du Colombier 	int open_options;	/* see below */\
1647dd7cddfSDavid du Colombier 		/* Graphics state */\
1657dd7cddfSDavid du Colombier 	gs_imager_state state;\
1667dd7cddfSDavid du Colombier 	float dash_pattern[max_dash];\
167*593dc095SDavid du Colombier 	bool fill_used_process_color;\
168*593dc095SDavid du Colombier 	bool stroke_used_process_color;\
169*593dc095SDavid du Colombier 	gx_hl_saved_color saved_fill_color;\
170*593dc095SDavid du Colombier 	gx_hl_saved_color saved_stroke_color;\
1717dd7cddfSDavid du Colombier 	gs_id no_clip_path_id;	/* indicates no clipping */\
1727dd7cddfSDavid du Colombier 	gs_id clip_path_id;\
1737dd7cddfSDavid du Colombier 		/* Other state */\
1743ff48bf5SDavid du Colombier 	gx_path_type_t fill_options, stroke_options;  /* optimize */\
1757dd7cddfSDavid du Colombier 	gs_point scale;		/* device coords / scale => output coords */\
1767dd7cddfSDavid du Colombier 	bool in_page;		/* true if any marks on this page */\
1777dd7cddfSDavid du Colombier 	gx_device_bbox *bbox_device;	/* for tracking bounding box */\
1787dd7cddfSDavid du Colombier 		/* Cached values */\
1797dd7cddfSDavid du Colombier 	gx_color_index black, white
1807dd7cddfSDavid du Colombier #define vdev_proc(vdev, p) ((vdev)->vec_procs->p)
1817dd7cddfSDavid du Colombier 
1827dd7cddfSDavid du Colombier #define vector_initial_values\
1837dd7cddfSDavid du Colombier 	0,		/* v_memory */\
1847dd7cddfSDavid du Colombier 	0,		/* vec_procs */\
1857dd7cddfSDavid du Colombier 	 { 0 },		/* fname */\
1867dd7cddfSDavid du Colombier 	0,		/* file */\
1877dd7cddfSDavid du Colombier 	0,		/* strm */\
1887dd7cddfSDavid du Colombier 	0,		/* strmbuf */\
1897dd7cddfSDavid du Colombier 	0,		/* strmbuf_size */\
1903ff48bf5SDavid du Colombier 	0,		/* open_options */\
1917dd7cddfSDavid du Colombier 	 { 0 },		/* state */\
1927dd7cddfSDavid du Colombier 	 { 0 },		/* dash_pattern */\
193*593dc095SDavid du Colombier 	true,		/* fill_used_process_color */\
194*593dc095SDavid du Colombier 	true,		/* stroke_used_process_color */\
1957dd7cddfSDavid du Colombier 	 { 0 },		/* fill_color ****** WRONG ****** */\
1967dd7cddfSDavid du Colombier 	 { 0 },		/* stroke_color ****** WRONG ****** */\
1977dd7cddfSDavid du Colombier 	gs_no_id,	/* clip_path_id */\
1987dd7cddfSDavid du Colombier 	gs_no_id,	/* no_clip_path_id */\
1993ff48bf5SDavid du Colombier 	0, 0,		/* fill/stroke_options */\
2007dd7cddfSDavid du Colombier 	 { X_DPI/72.0, Y_DPI/72.0 },	/* scale */\
2017dd7cddfSDavid du Colombier 	0/*false*/,	/* in_page */\
2027dd7cddfSDavid du Colombier 	0,		/* bbox_device */\
2037dd7cddfSDavid du Colombier 	gx_no_color_index,	/* black */\
2047dd7cddfSDavid du Colombier 	gx_no_color_index	/* white */
2057dd7cddfSDavid du Colombier 
2067dd7cddfSDavid du Colombier struct gx_device_vector_s {
2077dd7cddfSDavid du Colombier     gx_device_vector_common;
2087dd7cddfSDavid du Colombier };
2097dd7cddfSDavid du Colombier 
2107dd7cddfSDavid du Colombier /* st_device_vector is never instantiated per se, but we still need to */
2117dd7cddfSDavid du Colombier /* extern its descriptor for the sake of subclasses. */
2127dd7cddfSDavid du Colombier extern_st(st_device_vector);
2137dd7cddfSDavid du Colombier #define public_st_device_vector()	/* in gdevvec.c */\
2147dd7cddfSDavid du Colombier   gs_public_st_suffix_add3_final(st_device_vector, gx_device_vector,\
2157dd7cddfSDavid du Colombier     "gx_device_vector", device_vector_enum_ptrs,\
2167dd7cddfSDavid du Colombier     device_vector_reloc_ptrs, gx_device_finalize, st_device, strm, strmbuf,\
2177dd7cddfSDavid du Colombier     bbox_device)
2187dd7cddfSDavid du Colombier #define st_device_vector_max_ptrs (st_device_max_ptrs + 3)
2197dd7cddfSDavid du Colombier 
2207dd7cddfSDavid du Colombier /* ================ Utility procedures ================ */
2217dd7cddfSDavid du Colombier 
2227dd7cddfSDavid du Colombier /* Initialize the state. */
223*593dc095SDavid du Colombier void gdev_vector_init(gx_device_vector * vdev);
2247dd7cddfSDavid du Colombier 
2257dd7cddfSDavid du Colombier /* Reset the remembered graphics state. */
226*593dc095SDavid du Colombier void gdev_vector_reset(gx_device_vector * vdev);
2277dd7cddfSDavid du Colombier 
2283ff48bf5SDavid du Colombier /*
2293ff48bf5SDavid du Colombier  * Open the output file and stream, with optional bbox tracking.
2303ff48bf5SDavid du Colombier  * The options must be defined so that 0 is always the default.
2313ff48bf5SDavid du Colombier  */
2323ff48bf5SDavid du Colombier #define VECTOR_OPEN_FILE_ASCII 1	/* open file as text, not binary */
2333ff48bf5SDavid du Colombier #define VECTOR_OPEN_FILE_SEQUENTIAL 2	/* open as non-seekable */
2343ff48bf5SDavid du Colombier #define VECTOR_OPEN_FILE_SEQUENTIAL_OK 4  /* open as non-seekable if */
2353ff48bf5SDavid du Colombier 					/* open as seekable fails */
2363ff48bf5SDavid du Colombier #define VECTOR_OPEN_FILE_BBOX 8		/* also open bbox device */
237*593dc095SDavid du Colombier int gdev_vector_open_file_options(gx_device_vector * vdev,
238*593dc095SDavid du Colombier 				  uint strmbuf_size, int open_options);
2393ff48bf5SDavid du Colombier #define gdev_vector_open_file_bbox(vdev, bufsize, bbox)\
2403ff48bf5SDavid du Colombier   gdev_vector_open_file_options(vdev, bufsize,\
2413ff48bf5SDavid du Colombier 				(bbox ? VECTOR_OPEN_FILE_BBOX : 0))
2427dd7cddfSDavid du Colombier #define gdev_vector_open_file(vdev, strmbuf_size)\
2437dd7cddfSDavid du Colombier   gdev_vector_open_file_bbox(vdev, strmbuf_size, false)
2447dd7cddfSDavid du Colombier 
2457dd7cddfSDavid du Colombier /* Get the current stream, calling beginpage if in_page is false. */
246*593dc095SDavid du Colombier stream *gdev_vector_stream(gx_device_vector * vdev);
2477dd7cddfSDavid du Colombier 
2487dd7cddfSDavid du Colombier /* Bring the logical operation up to date. */
2497dd7cddfSDavid du Colombier /* May call setlogop. */
250*593dc095SDavid du Colombier int gdev_vector_update_log_op(gx_device_vector * vdev,
251*593dc095SDavid du Colombier 			      gs_logical_operation_t lop);
2527dd7cddfSDavid du Colombier 
2537dd7cddfSDavid du Colombier /* Bring the fill color up to date. */
2547dd7cddfSDavid du Colombier /* May call setfillcolor. */
255*593dc095SDavid du Colombier int gdev_vector_update_fill_color(gx_device_vector * vdev,
256*593dc095SDavid du Colombier 				  const gs_imager_state * pis,
257*593dc095SDavid du Colombier 				  const gx_drawing_color * pdcolor);
2587dd7cddfSDavid du Colombier 
2597dd7cddfSDavid du Colombier /* Bring state up to date for filling. */
2607dd7cddfSDavid du Colombier /* May call setflat, setfillcolor, setlogop. */
261*593dc095SDavid du Colombier int gdev_vector_prepare_fill(gx_device_vector * vdev,
2627dd7cddfSDavid du Colombier 			     const gs_imager_state * pis,
2637dd7cddfSDavid du Colombier 			     const gx_fill_params * params,
264*593dc095SDavid du Colombier 			     const gx_drawing_color * pdcolor);
2657dd7cddfSDavid du Colombier 
2667dd7cddfSDavid du Colombier /* Bring state up to date for stroking.  Note that we pass the scale */
2677dd7cddfSDavid du Colombier /* for the line width and dash offset explicitly. */
2687dd7cddfSDavid du Colombier /* May call setlinewidth, setlinecap, setlinejoin, setmiterlimit, */
2697dd7cddfSDavid du Colombier /* setdash, setflat, setstrokecolor, setlogop. */
2703ff48bf5SDavid du Colombier /* Any of pis, params, and pdcolor may be NULL. */
271*593dc095SDavid du Colombier int gdev_vector_prepare_stroke(gx_device_vector * vdev,
2727dd7cddfSDavid du Colombier 			       const gs_imager_state * pis,
2737dd7cddfSDavid du Colombier 			       const gx_stroke_params * params,
2747dd7cddfSDavid du Colombier 			       const gx_drawing_color * pdcolor,
275*593dc095SDavid du Colombier 			       floatp scale);
2767dd7cddfSDavid du Colombier 
2777dd7cddfSDavid du Colombier /*
2783ff48bf5SDavid du Colombier  * Compute the scale for transforming the line width and dash pattern for a
2793ff48bf5SDavid du Colombier  * stroke operation, and, if necessary to handle anisotropic scaling, a full
2803ff48bf5SDavid du Colombier  * transformation matrix to be inverse-applied to the path elements as well.
2813ff48bf5SDavid du Colombier  * Return 0 if only scaling, 1 if a full matrix is needed.
2827dd7cddfSDavid du Colombier  */
283*593dc095SDavid du Colombier int gdev_vector_stroke_scaling(const gx_device_vector *vdev,
2847dd7cddfSDavid du Colombier 			       const gs_imager_state *pis,
285*593dc095SDavid du Colombier 			       double *pscale, gs_matrix *pmat);
2867dd7cddfSDavid du Colombier 
2877dd7cddfSDavid du Colombier /* Prepare to write a path using the default implementation. */
2887dd7cddfSDavid du Colombier typedef struct gdev_vector_dopath_state_s {
2897dd7cddfSDavid du Colombier     /* Initialized by _init */
2907dd7cddfSDavid du Colombier     gx_device_vector *vdev;
2917dd7cddfSDavid du Colombier     gx_path_type_t type;
2927dd7cddfSDavid du Colombier     bool first;
2937dd7cddfSDavid du Colombier     gs_matrix scale_mat;
2947dd7cddfSDavid du Colombier     /* Change dynamically */
2957dd7cddfSDavid du Colombier     gs_point start;
2967dd7cddfSDavid du Colombier     gs_point prev;
2977dd7cddfSDavid du Colombier } gdev_vector_dopath_state_t;
298*593dc095SDavid du Colombier void gdev_vector_dopath_init(gdev_vector_dopath_state_t *state,
2997dd7cddfSDavid du Colombier 			     gx_device_vector *vdev,
300*593dc095SDavid du Colombier 			     gx_path_type_t type, const gs_matrix *pmat);
3017dd7cddfSDavid du Colombier 
3027dd7cddfSDavid du Colombier /* Write a segment of a path using the default implementation. */
303*593dc095SDavid du Colombier int gdev_vector_dopath_segment(gdev_vector_dopath_state_t *state, int pe_op,
304*593dc095SDavid du Colombier 			       gs_fixed_point vs[3]);
3057dd7cddfSDavid du Colombier 
3067dd7cddfSDavid du Colombier /* Write a polygon as part of a path (type = gx_path_type_none) */
3077dd7cddfSDavid du Colombier /* or as a path. */
3087dd7cddfSDavid du Colombier /* May call moveto, lineto, closepath (if close); */
3097dd7cddfSDavid du Colombier /* may call beginpath & endpath if type != none. */
310*593dc095SDavid du Colombier int gdev_vector_write_polygon(gx_device_vector * vdev,
3117dd7cddfSDavid du Colombier 			      const gs_fixed_point * points, uint count,
312*593dc095SDavid du Colombier 			      bool close, gx_path_type_t type);
3137dd7cddfSDavid du Colombier 
3147dd7cddfSDavid du Colombier /* Write a rectangle.  This is just a special case of write_polygon. */
315*593dc095SDavid du Colombier int gdev_vector_write_rectangle(gx_device_vector * vdev,
3167dd7cddfSDavid du Colombier 				fixed x0, fixed y0, fixed x1, fixed y1,
317*593dc095SDavid du Colombier 				bool close, gx_rect_direction_t dir);
3187dd7cddfSDavid du Colombier 
3197dd7cddfSDavid du Colombier /* Write a clipping path by calling the path procedures. */
3207dd7cddfSDavid du Colombier /* May call the same procedures as writepath. */
321*593dc095SDavid du Colombier int gdev_vector_write_clip_path(gx_device_vector * vdev,
322*593dc095SDavid du Colombier 				const gx_clip_path * pcpath);
3237dd7cddfSDavid du Colombier 
3247dd7cddfSDavid du Colombier /* Bring the clipping state up to date. */
3257dd7cddfSDavid du Colombier /* May call write_rectangle (q.v.), write_clip_path (q.v.). */
326*593dc095SDavid du Colombier int gdev_vector_update_clip_path(gx_device_vector * vdev,
327*593dc095SDavid du Colombier 				 const gx_clip_path * pcpath);
3287dd7cddfSDavid du Colombier 
3297dd7cddfSDavid du Colombier /* Close the output file and stream. */
330*593dc095SDavid du Colombier int gdev_vector_close_file(gx_device_vector * vdev);
3317dd7cddfSDavid du Colombier 
3327dd7cddfSDavid du Colombier /* ---------------- Image enumeration ---------------- */
3337dd7cddfSDavid du Colombier 
3347dd7cddfSDavid du Colombier /* Define a common set of state parameters for enumerating images. */
3357dd7cddfSDavid du Colombier #define gdev_vector_image_enum_common\
3367dd7cddfSDavid du Colombier 	gx_image_enum_common;\
3377dd7cddfSDavid du Colombier 		/* Set by begin_image */\
3387dd7cddfSDavid du Colombier 	gs_memory_t *memory;	/* from begin_image */\
3397dd7cddfSDavid du Colombier 	gx_image_enum_common_t *default_info;	/* non-0 iff using default implementation */\
3407dd7cddfSDavid du Colombier 	gx_image_enum_common_t *bbox_info;	/* non-0 iff passing image data to bbox dev */\
3417dd7cddfSDavid du Colombier 	int width, height;\
3427dd7cddfSDavid du Colombier 	int bits_per_pixel;	/* (per plane) */\
3437dd7cddfSDavid du Colombier 	uint bits_per_row;	/* (per plane) */\
3447dd7cddfSDavid du Colombier 		/* Updated dynamically by image_data */\
3457dd7cddfSDavid du Colombier 	int y			/* 0 <= y < height */
3467dd7cddfSDavid du Colombier typedef struct gdev_vector_image_enum_s {
3477dd7cddfSDavid du Colombier     gdev_vector_image_enum_common;
3487dd7cddfSDavid du Colombier } gdev_vector_image_enum_t;
3497dd7cddfSDavid du Colombier 
3507dd7cddfSDavid du Colombier extern_st(st_vector_image_enum);
3517dd7cddfSDavid du Colombier #define public_st_vector_image_enum()	/* in gdevvec.c */\
3527dd7cddfSDavid du Colombier   gs_public_st_ptrs2(st_vector_image_enum, gdev_vector_image_enum_t,\
3537dd7cddfSDavid du Colombier     "gdev_vector_image_enum_t", vector_image_enum_enum_ptrs,\
3547dd7cddfSDavid du Colombier     vector_image_enum_reloc_ptrs, default_info, bbox_info)
3557dd7cddfSDavid du Colombier 
3567dd7cddfSDavid du Colombier /*
3577dd7cddfSDavid du Colombier  * Initialize for enumerating an image.  Note that the last argument is an
3587dd7cddfSDavid du Colombier  * already-allocated enumerator, not a pointer to the place to store the
3597dd7cddfSDavid du Colombier  * enumerator.
3607dd7cddfSDavid du Colombier  */
361*593dc095SDavid du Colombier int gdev_vector_begin_image(gx_device_vector * vdev,
3627dd7cddfSDavid du Colombier 			const gs_imager_state * pis, const gs_image_t * pim,
3637dd7cddfSDavid du Colombier 			gs_image_format_t format, const gs_int_rect * prect,
3647dd7cddfSDavid du Colombier 	      const gx_drawing_color * pdcolor, const gx_clip_path * pcpath,
3657dd7cddfSDavid du Colombier 		    gs_memory_t * mem, const gx_image_enum_procs_t * pprocs,
366*593dc095SDavid du Colombier 			    gdev_vector_image_enum_t * pie);
3677dd7cddfSDavid du Colombier 
3687dd7cddfSDavid du Colombier /* End an image, optionally supplying any necessary blank padding rows. */
3697dd7cddfSDavid du Colombier /* Return 0 if we used the default implementation, 1 if not. */
370*593dc095SDavid du Colombier int gdev_vector_end_image(gx_device_vector * vdev,
371*593dc095SDavid du Colombier        gdev_vector_image_enum_t * pie, bool draw_last, gx_color_index pad);
3727dd7cddfSDavid du Colombier 
3737dd7cddfSDavid du Colombier /* ================ Device procedures ================ */
3747dd7cddfSDavid du Colombier 
3757dd7cddfSDavid du Colombier /* Redefine get/put_params to handle OutputFile. */
3767dd7cddfSDavid du Colombier dev_proc_put_params(gdev_vector_put_params);
3777dd7cddfSDavid du Colombier dev_proc_get_params(gdev_vector_get_params);
3787dd7cddfSDavid du Colombier 
3797dd7cddfSDavid du Colombier /* ---------------- Defaults ---------------- */
3807dd7cddfSDavid du Colombier 
3817dd7cddfSDavid du Colombier /* fill_rectangle may call setfillcolor, dorect. */
3827dd7cddfSDavid du Colombier dev_proc_fill_rectangle(gdev_vector_fill_rectangle);
3837dd7cddfSDavid du Colombier /* fill_path may call prepare_fill, writepath, write_clip_path. */
3847dd7cddfSDavid du Colombier dev_proc_fill_path(gdev_vector_fill_path);
3857dd7cddfSDavid du Colombier /* stroke_path may call prepare_stroke, write_path, write_clip_path. */
3867dd7cddfSDavid du Colombier dev_proc_stroke_path(gdev_vector_stroke_path);
3877dd7cddfSDavid du Colombier /* fill_trapezoid, fill_parallelogram, and fill_triangle may call */
3887dd7cddfSDavid du Colombier /* setfillcolor, setlogop, beginpath, moveto, lineto, endpath. */
3897dd7cddfSDavid du Colombier dev_proc_fill_trapezoid(gdev_vector_fill_trapezoid);
3907dd7cddfSDavid du Colombier dev_proc_fill_parallelogram(gdev_vector_fill_parallelogram);
3917dd7cddfSDavid du Colombier dev_proc_fill_triangle(gdev_vector_fill_triangle);
3927dd7cddfSDavid du Colombier 
3937dd7cddfSDavid du Colombier #endif /* gdevvec_INCLUDED */
394