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