1*3ff48bf5SDavid du Colombier /* Copyright (C) 1997, 1998, 1999, 2000 Aladdin Enterprises. All rights reserved. 27dd7cddfSDavid du Colombier 3*3ff48bf5SDavid du Colombier This file is part of AFPL Ghostscript. 47dd7cddfSDavid du Colombier 5*3ff48bf5SDavid du Colombier AFPL Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author or 6*3ff48bf5SDavid du Colombier distributor accepts any responsibility for the consequences of using it, or 7*3ff48bf5SDavid du Colombier for whether it serves any particular purpose or works at all, unless he or 8*3ff48bf5SDavid du Colombier she says so in writing. Refer to the Aladdin Free Public License (the 9*3ff48bf5SDavid du Colombier "License") for full details. 107dd7cddfSDavid du Colombier 11*3ff48bf5SDavid du Colombier Every copy of AFPL Ghostscript must include a copy of the License, normally 12*3ff48bf5SDavid du Colombier in a plain ASCII text file named PUBLIC. The License grants you the right 13*3ff48bf5SDavid du Colombier to copy, modify and redistribute AFPL Ghostscript, but only under certain 14*3ff48bf5SDavid du Colombier conditions described in the License. Among other things, the License 15*3ff48bf5SDavid du Colombier requires that the copyright notice and this notice be preserved on all 16*3ff48bf5SDavid du Colombier copies. 177dd7cddfSDavid du Colombier */ 187dd7cddfSDavid du Colombier 19*3ff48bf5SDavid du Colombier /*$Id: gdevvec.h,v 1.7 2001/07/12 03:28:02 lpd Exp $ */ 207dd7cddfSDavid du Colombier /* Common definitions for "vector" devices */ 217dd7cddfSDavid du Colombier 227dd7cddfSDavid du Colombier #ifndef gdevvec_INCLUDED 237dd7cddfSDavid du Colombier # define gdevvec_INCLUDED 247dd7cddfSDavid du Colombier 257dd7cddfSDavid du Colombier #include "gp.h" /* for gp_file_name_sizeof */ 267dd7cddfSDavid du Colombier #include "gsropt.h" 277dd7cddfSDavid du Colombier #include "gxdevice.h" 287dd7cddfSDavid du Colombier #include "gdevbbox.h" 297dd7cddfSDavid du Colombier #include "gxiparam.h" 307dd7cddfSDavid du Colombier #include "gxistate.h" 317dd7cddfSDavid du Colombier #include "stream.h" 327dd7cddfSDavid du Colombier 337dd7cddfSDavid du Colombier /* 347dd7cddfSDavid du Colombier * "Vector" devices produce a stream of higher-level drawing commands rather 357dd7cddfSDavid du Colombier * than a raster image. (We don't like the term "vector", since the command 367dd7cddfSDavid du Colombier * vocabulary typically includes text and raster images as well as actual 377dd7cddfSDavid du Colombier * vectors, but it's widely used in the industry, and we weren't able to 387dd7cddfSDavid du Colombier * find one that read better.) Some examples of "vector" formats are PDF, 397dd7cddfSDavid du Colombier * PostScript, PCL XL, HP-GL/2 + RTL, CGM, Windows Metafile, and Macintosh 407dd7cddfSDavid du Colombier * PICT. 417dd7cddfSDavid du Colombier * 427dd7cddfSDavid du Colombier * This file extends the basic driver structure with elements likely to be 437dd7cddfSDavid du Colombier * useful to vector devices. These include: 447dd7cddfSDavid du Colombier * 457dd7cddfSDavid du Colombier * - Tracking whether any marks have been made on the page; 467dd7cddfSDavid du Colombier * 477dd7cddfSDavid du Colombier * - Keeping track of the page bounding box; 487dd7cddfSDavid du Colombier * 497dd7cddfSDavid du Colombier * - A copy of the most recently written current graphics state 507dd7cddfSDavid du Colombier * parameters; 517dd7cddfSDavid du Colombier * 527dd7cddfSDavid du Colombier * - An output stream (for drivers that compress or otherwise filter 537dd7cddfSDavid du Colombier * their output); 547dd7cddfSDavid du Colombier * 557dd7cddfSDavid du Colombier * - A vector of procedures for writing changes to the graphics state. 567dd7cddfSDavid du Colombier * 577dd7cddfSDavid du Colombier * - The ability to work with scaled output coordinate systems. 587dd7cddfSDavid du Colombier * 597dd7cddfSDavid du Colombier * We expect to add more elements and procedures as we gain more experience 607dd7cddfSDavid du Colombier * with this kind of driver. 617dd7cddfSDavid du Colombier */ 627dd7cddfSDavid du Colombier 637dd7cddfSDavid du Colombier /* ================ Types and structures ================ */ 647dd7cddfSDavid du Colombier 657dd7cddfSDavid du Colombier /* Define the abstract type for a vector device. */ 667dd7cddfSDavid du Colombier typedef struct gx_device_vector_s gx_device_vector; 677dd7cddfSDavid du Colombier 687dd7cddfSDavid du Colombier /* Define the maximum size of the output file name. */ 697dd7cddfSDavid du Colombier #define fname_size (gp_file_name_sizeof - 1) 707dd7cddfSDavid du Colombier 717dd7cddfSDavid du Colombier /* Define the longest dash pattern we can remember. */ 727dd7cddfSDavid du Colombier #define max_dash 11 737dd7cddfSDavid du Colombier 747dd7cddfSDavid du Colombier /* 757dd7cddfSDavid du Colombier * Define procedures for writing common output elements. Not all devices 767dd7cddfSDavid du Colombier * will support all of these elements. Note that these procedures normally 777dd7cddfSDavid du Colombier * only write out commands, and don't update the driver state itself. All 787dd7cddfSDavid du Colombier * of them are optional, called only as indicated under the utility 797dd7cddfSDavid du Colombier * procedures below. 807dd7cddfSDavid du Colombier */ 817dd7cddfSDavid du Colombier typedef enum { 827dd7cddfSDavid du Colombier gx_path_type_none = 0, 837dd7cddfSDavid du Colombier /* 847dd7cddfSDavid du Colombier * All combinations of flags are legal. Multiple commands are 857dd7cddfSDavid du Colombier * executed in the order fill, stroke, clip. 867dd7cddfSDavid du Colombier */ 877dd7cddfSDavid du Colombier gx_path_type_fill = 1, 887dd7cddfSDavid du Colombier gx_path_type_stroke = 2, 897dd7cddfSDavid du Colombier gx_path_type_clip = 4, 907dd7cddfSDavid du Colombier gx_path_type_winding_number = 0, 917dd7cddfSDavid du Colombier gx_path_type_even_odd = 8, 92*3ff48bf5SDavid du Colombier gx_path_type_optimize = 16, /* OK to optimize paths by merging seg.s */ 93*3ff48bf5SDavid du Colombier gx_path_type_always_close = 32, /* include final closepath even if not stroke */ 947dd7cddfSDavid du Colombier gx_path_type_rule = gx_path_type_winding_number | gx_path_type_even_odd 957dd7cddfSDavid du Colombier } gx_path_type_t; 967dd7cddfSDavid du Colombier typedef enum { 977dd7cddfSDavid du Colombier gx_rect_x_first, 987dd7cddfSDavid du Colombier gx_rect_y_first 997dd7cddfSDavid du Colombier } gx_rect_direction_t; 1007dd7cddfSDavid du Colombier typedef struct gx_device_vector_procs_s { 1017dd7cddfSDavid du Colombier /* Page management */ 1027dd7cddfSDavid du Colombier int (*beginpage) (P1(gx_device_vector * vdev)); 1037dd7cddfSDavid du Colombier /* Imager state */ 1047dd7cddfSDavid du Colombier int (*setlinewidth) (P2(gx_device_vector * vdev, floatp width)); 1057dd7cddfSDavid du Colombier int (*setlinecap) (P2(gx_device_vector * vdev, gs_line_cap cap)); 1067dd7cddfSDavid du Colombier int (*setlinejoin) (P2(gx_device_vector * vdev, gs_line_join join)); 1077dd7cddfSDavid du Colombier int (*setmiterlimit) (P2(gx_device_vector * vdev, floatp limit)); 1087dd7cddfSDavid du Colombier int (*setdash) (P4(gx_device_vector * vdev, const float *pattern, 1097dd7cddfSDavid du Colombier uint count, floatp offset)); 1107dd7cddfSDavid du Colombier int (*setflat) (P2(gx_device_vector * vdev, floatp flatness)); 1117dd7cddfSDavid du Colombier int (*setlogop) (P3(gx_device_vector * vdev, gs_logical_operation_t lop, 1127dd7cddfSDavid du Colombier gs_logical_operation_t diff)); 1137dd7cddfSDavid du Colombier /* Other state */ 1147dd7cddfSDavid du Colombier int (*setfillcolor) (P2(gx_device_vector * vdev, const gx_drawing_color * pdc)); 1157dd7cddfSDavid du Colombier int (*setstrokecolor) (P2(gx_device_vector * vdev, const gx_drawing_color * pdc)); 1167dd7cddfSDavid du Colombier /* Paths */ 1177dd7cddfSDavid du Colombier /* dopath and dorect are normally defaulted */ 1187dd7cddfSDavid du Colombier int (*dopath) (P4(gx_device_vector * vdev, const gx_path * ppath, 1197dd7cddfSDavid du Colombier gx_path_type_t type, const gs_matrix *pmat)); 1207dd7cddfSDavid du Colombier int (*dorect) (P6(gx_device_vector * vdev, fixed x0, fixed y0, fixed x1, 1217dd7cddfSDavid du Colombier fixed y1, gx_path_type_t type)); 1227dd7cddfSDavid du Colombier int (*beginpath) (P2(gx_device_vector * vdev, gx_path_type_t type)); 1237dd7cddfSDavid du Colombier int (*moveto) (P6(gx_device_vector * vdev, floatp x0, floatp y0, 1247dd7cddfSDavid du Colombier floatp x, floatp y, gx_path_type_t type)); 1257dd7cddfSDavid du Colombier int (*lineto) (P6(gx_device_vector * vdev, floatp x0, floatp y0, 1267dd7cddfSDavid du Colombier floatp x, floatp y, gx_path_type_t type)); 1277dd7cddfSDavid du Colombier int (*curveto) (P10(gx_device_vector * vdev, floatp x0, floatp y0, 1287dd7cddfSDavid du Colombier floatp x1, floatp y1, floatp x2, floatp y2, 1297dd7cddfSDavid du Colombier floatp x3, floatp y3, gx_path_type_t type)); 1307dd7cddfSDavid du Colombier int (*closepath) (P6(gx_device_vector * vdev, floatp x0, floatp y0, 1317dd7cddfSDavid du Colombier floatp x_start, floatp y_start, gx_path_type_t type)); 1327dd7cddfSDavid du Colombier int (*endpath) (P2(gx_device_vector * vdev, gx_path_type_t type)); 1337dd7cddfSDavid du Colombier } gx_device_vector_procs; 1347dd7cddfSDavid du Colombier 1357dd7cddfSDavid du Colombier /* Default implementations of procedures */ 1367dd7cddfSDavid du Colombier /* setflat does nothing */ 1377dd7cddfSDavid du Colombier int gdev_vector_setflat(P2(gx_device_vector * vdev, floatp flatness)); 1387dd7cddfSDavid du Colombier 1397dd7cddfSDavid du Colombier /* dopath may call dorect, beginpath, moveto/lineto/curveto/closepath, */ 1407dd7cddfSDavid du Colombier /* endpath */ 1417dd7cddfSDavid du Colombier int gdev_vector_dopath(P4(gx_device_vector * vdev, const gx_path * ppath, 1427dd7cddfSDavid du Colombier gx_path_type_t type, const gs_matrix *pmat)); 1437dd7cddfSDavid du Colombier 1447dd7cddfSDavid du Colombier /* dorect may call beginpath, moveto, lineto, closepath */ 1457dd7cddfSDavid du Colombier int gdev_vector_dorect(P6(gx_device_vector * vdev, fixed x0, fixed y0, 1467dd7cddfSDavid du Colombier fixed x1, fixed y1, gx_path_type_t type)); 1477dd7cddfSDavid du Colombier 1487dd7cddfSDavid du Colombier /* Finally, define the extended device structure. */ 1497dd7cddfSDavid du Colombier #define gx_device_vector_common\ 1507dd7cddfSDavid du Colombier gx_device_common;\ 1517dd7cddfSDavid du Colombier gs_memory_t *v_memory;\ 1527dd7cddfSDavid du Colombier /* Output element writing procedures */\ 1537dd7cddfSDavid du Colombier const gx_device_vector_procs *vec_procs;\ 1547dd7cddfSDavid du Colombier /* Output file */\ 1557dd7cddfSDavid du Colombier char fname[fname_size + 1];\ 1567dd7cddfSDavid du Colombier FILE *file;\ 1577dd7cddfSDavid du Colombier stream *strm;\ 1587dd7cddfSDavid du Colombier byte *strmbuf;\ 1597dd7cddfSDavid du Colombier uint strmbuf_size;\ 160*3ff48bf5SDavid du Colombier int open_options; /* see below */\ 1617dd7cddfSDavid du Colombier /* Graphics state */\ 1627dd7cddfSDavid du Colombier gs_imager_state state;\ 1637dd7cddfSDavid du Colombier float dash_pattern[max_dash];\ 1647dd7cddfSDavid du Colombier gx_drawing_color fill_color, stroke_color;\ 1657dd7cddfSDavid du Colombier gs_id no_clip_path_id; /* indicates no clipping */\ 1667dd7cddfSDavid du Colombier gs_id clip_path_id;\ 1677dd7cddfSDavid du Colombier /* Other state */\ 168*3ff48bf5SDavid du Colombier gx_path_type_t fill_options, stroke_options; /* optimize */\ 1697dd7cddfSDavid du Colombier gs_point scale; /* device coords / scale => output coords */\ 1707dd7cddfSDavid du Colombier bool in_page; /* true if any marks on this page */\ 1717dd7cddfSDavid du Colombier gx_device_bbox *bbox_device; /* for tracking bounding box */\ 1727dd7cddfSDavid du Colombier /* Cached values */\ 1737dd7cddfSDavid du Colombier gx_color_index black, white 1747dd7cddfSDavid du Colombier #define vdev_proc(vdev, p) ((vdev)->vec_procs->p) 1757dd7cddfSDavid du Colombier 1767dd7cddfSDavid du Colombier #define vector_initial_values\ 1777dd7cddfSDavid du Colombier 0, /* v_memory */\ 1787dd7cddfSDavid du Colombier 0, /* vec_procs */\ 1797dd7cddfSDavid du Colombier { 0 }, /* fname */\ 1807dd7cddfSDavid du Colombier 0, /* file */\ 1817dd7cddfSDavid du Colombier 0, /* strm */\ 1827dd7cddfSDavid du Colombier 0, /* strmbuf */\ 1837dd7cddfSDavid du Colombier 0, /* strmbuf_size */\ 184*3ff48bf5SDavid du Colombier 0, /* open_options */\ 1857dd7cddfSDavid du Colombier { 0 }, /* state */\ 1867dd7cddfSDavid du Colombier { 0 }, /* dash_pattern */\ 1877dd7cddfSDavid du Colombier { 0 }, /* fill_color ****** WRONG ****** */\ 1887dd7cddfSDavid du Colombier { 0 }, /* stroke_color ****** WRONG ****** */\ 1897dd7cddfSDavid du Colombier gs_no_id, /* clip_path_id */\ 1907dd7cddfSDavid du Colombier gs_no_id, /* no_clip_path_id */\ 191*3ff48bf5SDavid du Colombier 0, 0, /* fill/stroke_options */\ 1927dd7cddfSDavid du Colombier { X_DPI/72.0, Y_DPI/72.0 }, /* scale */\ 1937dd7cddfSDavid du Colombier 0/*false*/, /* in_page */\ 1947dd7cddfSDavid du Colombier 0, /* bbox_device */\ 1957dd7cddfSDavid du Colombier gx_no_color_index, /* black */\ 1967dd7cddfSDavid du Colombier gx_no_color_index /* white */ 1977dd7cddfSDavid du Colombier 1987dd7cddfSDavid du Colombier struct gx_device_vector_s { 1997dd7cddfSDavid du Colombier gx_device_vector_common; 2007dd7cddfSDavid du Colombier }; 2017dd7cddfSDavid du Colombier 2027dd7cddfSDavid du Colombier /* st_device_vector is never instantiated per se, but we still need to */ 2037dd7cddfSDavid du Colombier /* extern its descriptor for the sake of subclasses. */ 2047dd7cddfSDavid du Colombier extern_st(st_device_vector); 2057dd7cddfSDavid du Colombier #define public_st_device_vector() /* in gdevvec.c */\ 2067dd7cddfSDavid du Colombier gs_public_st_suffix_add3_final(st_device_vector, gx_device_vector,\ 2077dd7cddfSDavid du Colombier "gx_device_vector", device_vector_enum_ptrs,\ 2087dd7cddfSDavid du Colombier device_vector_reloc_ptrs, gx_device_finalize, st_device, strm, strmbuf,\ 2097dd7cddfSDavid du Colombier bbox_device) 2107dd7cddfSDavid du Colombier #define st_device_vector_max_ptrs (st_device_max_ptrs + 3) 2117dd7cddfSDavid du Colombier 2127dd7cddfSDavid du Colombier /* ================ Utility procedures ================ */ 2137dd7cddfSDavid du Colombier 2147dd7cddfSDavid du Colombier /* Initialize the state. */ 2157dd7cddfSDavid du Colombier void gdev_vector_init(P1(gx_device_vector * vdev)); 2167dd7cddfSDavid du Colombier 2177dd7cddfSDavid du Colombier /* Reset the remembered graphics state. */ 2187dd7cddfSDavid du Colombier void gdev_vector_reset(P1(gx_device_vector * vdev)); 2197dd7cddfSDavid du Colombier 220*3ff48bf5SDavid du Colombier /* 221*3ff48bf5SDavid du Colombier * Open the output file and stream, with optional bbox tracking. 222*3ff48bf5SDavid du Colombier * The options must be defined so that 0 is always the default. 223*3ff48bf5SDavid du Colombier */ 224*3ff48bf5SDavid du Colombier #define VECTOR_OPEN_FILE_ASCII 1 /* open file as text, not binary */ 225*3ff48bf5SDavid du Colombier #define VECTOR_OPEN_FILE_SEQUENTIAL 2 /* open as non-seekable */ 226*3ff48bf5SDavid du Colombier #define VECTOR_OPEN_FILE_SEQUENTIAL_OK 4 /* open as non-seekable if */ 227*3ff48bf5SDavid du Colombier /* open as seekable fails */ 228*3ff48bf5SDavid du Colombier #define VECTOR_OPEN_FILE_BBOX 8 /* also open bbox device */ 229*3ff48bf5SDavid du Colombier int gdev_vector_open_file_options(P3(gx_device_vector * vdev, 230*3ff48bf5SDavid du Colombier uint strmbuf_size, int open_options)); 231*3ff48bf5SDavid du Colombier #define gdev_vector_open_file_bbox(vdev, bufsize, bbox)\ 232*3ff48bf5SDavid du Colombier gdev_vector_open_file_options(vdev, bufsize,\ 233*3ff48bf5SDavid du Colombier (bbox ? VECTOR_OPEN_FILE_BBOX : 0)) 2347dd7cddfSDavid du Colombier #define gdev_vector_open_file(vdev, strmbuf_size)\ 2357dd7cddfSDavid du Colombier gdev_vector_open_file_bbox(vdev, strmbuf_size, false) 2367dd7cddfSDavid du Colombier 2377dd7cddfSDavid du Colombier /* Get the current stream, calling beginpage if in_page is false. */ 2387dd7cddfSDavid du Colombier stream *gdev_vector_stream(P1(gx_device_vector * vdev)); 2397dd7cddfSDavid du Colombier 2407dd7cddfSDavid du Colombier /* Bring the logical operation up to date. */ 2417dd7cddfSDavid du Colombier /* May call setlogop. */ 2427dd7cddfSDavid du Colombier int gdev_vector_update_log_op(P2(gx_device_vector * vdev, 2437dd7cddfSDavid du Colombier gs_logical_operation_t lop)); 2447dd7cddfSDavid du Colombier 2457dd7cddfSDavid du Colombier /* Bring the fill color up to date. */ 2467dd7cddfSDavid du Colombier /* May call setfillcolor. */ 2477dd7cddfSDavid du Colombier int gdev_vector_update_fill_color(P2(gx_device_vector * vdev, 2487dd7cddfSDavid du Colombier const gx_drawing_color * pdcolor)); 2497dd7cddfSDavid du Colombier 2507dd7cddfSDavid du Colombier /* Bring state up to date for filling. */ 2517dd7cddfSDavid du Colombier /* May call setflat, setfillcolor, setlogop. */ 2527dd7cddfSDavid du Colombier int gdev_vector_prepare_fill(P4(gx_device_vector * vdev, 2537dd7cddfSDavid du Colombier const gs_imager_state * pis, 2547dd7cddfSDavid du Colombier const gx_fill_params * params, 2557dd7cddfSDavid du Colombier const gx_drawing_color * pdcolor)); 2567dd7cddfSDavid du Colombier 2577dd7cddfSDavid du Colombier /* Bring state up to date for stroking. Note that we pass the scale */ 2587dd7cddfSDavid du Colombier /* for the line width and dash offset explicitly. */ 2597dd7cddfSDavid du Colombier /* May call setlinewidth, setlinecap, setlinejoin, setmiterlimit, */ 2607dd7cddfSDavid du Colombier /* setdash, setflat, setstrokecolor, setlogop. */ 261*3ff48bf5SDavid du Colombier /* Any of pis, params, and pdcolor may be NULL. */ 2627dd7cddfSDavid du Colombier int gdev_vector_prepare_stroke(P5(gx_device_vector * vdev, 2637dd7cddfSDavid du Colombier const gs_imager_state * pis, 2647dd7cddfSDavid du Colombier const gx_stroke_params * params, 2657dd7cddfSDavid du Colombier const gx_drawing_color * pdcolor, 2667dd7cddfSDavid du Colombier floatp scale)); 2677dd7cddfSDavid du Colombier 2687dd7cddfSDavid du Colombier /* 269*3ff48bf5SDavid du Colombier * Compute the scale for transforming the line width and dash pattern for a 270*3ff48bf5SDavid du Colombier * stroke operation, and, if necessary to handle anisotropic scaling, a full 271*3ff48bf5SDavid du Colombier * transformation matrix to be inverse-applied to the path elements as well. 272*3ff48bf5SDavid du Colombier * Return 0 if only scaling, 1 if a full matrix is needed. 2737dd7cddfSDavid du Colombier */ 2747dd7cddfSDavid du Colombier int gdev_vector_stroke_scaling(P4(const gx_device_vector *vdev, 2757dd7cddfSDavid du Colombier const gs_imager_state *pis, 2767dd7cddfSDavid du Colombier double *pscale, gs_matrix *pmat)); 2777dd7cddfSDavid du Colombier 2787dd7cddfSDavid du Colombier /* Prepare to write a path using the default implementation. */ 2797dd7cddfSDavid du Colombier typedef struct gdev_vector_dopath_state_s { 2807dd7cddfSDavid du Colombier /* Initialized by _init */ 2817dd7cddfSDavid du Colombier gx_device_vector *vdev; 2827dd7cddfSDavid du Colombier gx_path_type_t type; 2837dd7cddfSDavid du Colombier bool first; 2847dd7cddfSDavid du Colombier gs_matrix scale_mat; 2857dd7cddfSDavid du Colombier /* Change dynamically */ 2867dd7cddfSDavid du Colombier gs_point start; 2877dd7cddfSDavid du Colombier gs_point prev; 2887dd7cddfSDavid du Colombier } gdev_vector_dopath_state_t; 2897dd7cddfSDavid du Colombier void gdev_vector_dopath_init(P4(gdev_vector_dopath_state_t *state, 2907dd7cddfSDavid du Colombier gx_device_vector *vdev, 2917dd7cddfSDavid du Colombier gx_path_type_t type, const gs_matrix *pmat)); 2927dd7cddfSDavid du Colombier 2937dd7cddfSDavid du Colombier /* Write a segment of a path using the default implementation. */ 2947dd7cddfSDavid du Colombier int gdev_vector_dopath_segment(P3(gdev_vector_dopath_state_t *state, int pe_op, 2957dd7cddfSDavid du Colombier gs_fixed_point vs[3])); 2967dd7cddfSDavid du Colombier 2977dd7cddfSDavid du Colombier /* Write a polygon as part of a path (type = gx_path_type_none) */ 2987dd7cddfSDavid du Colombier /* or as a path. */ 2997dd7cddfSDavid du Colombier /* May call moveto, lineto, closepath (if close); */ 3007dd7cddfSDavid du Colombier /* may call beginpath & endpath if type != none. */ 3017dd7cddfSDavid du Colombier int gdev_vector_write_polygon(P5(gx_device_vector * vdev, 3027dd7cddfSDavid du Colombier const gs_fixed_point * points, uint count, 3037dd7cddfSDavid du Colombier bool close, gx_path_type_t type)); 3047dd7cddfSDavid du Colombier 3057dd7cddfSDavid du Colombier /* Write a rectangle. This is just a special case of write_polygon. */ 3067dd7cddfSDavid du Colombier int gdev_vector_write_rectangle(P7(gx_device_vector * vdev, 3077dd7cddfSDavid du Colombier fixed x0, fixed y0, fixed x1, fixed y1, 3087dd7cddfSDavid du Colombier bool close, gx_rect_direction_t dir)); 3097dd7cddfSDavid du Colombier 3107dd7cddfSDavid du Colombier /* Write a clipping path by calling the path procedures. */ 3117dd7cddfSDavid du Colombier /* May call the same procedures as writepath. */ 3127dd7cddfSDavid du Colombier int gdev_vector_write_clip_path(P2(gx_device_vector * vdev, 3137dd7cddfSDavid du Colombier const gx_clip_path * pcpath)); 3147dd7cddfSDavid du Colombier 3157dd7cddfSDavid du Colombier /* Bring the clipping state up to date. */ 3167dd7cddfSDavid du Colombier /* May call write_rectangle (q.v.), write_clip_path (q.v.). */ 3177dd7cddfSDavid du Colombier int gdev_vector_update_clip_path(P2(gx_device_vector * vdev, 3187dd7cddfSDavid du Colombier const gx_clip_path * pcpath)); 3197dd7cddfSDavid du Colombier 3207dd7cddfSDavid du Colombier /* Close the output file and stream. */ 3217dd7cddfSDavid du Colombier int gdev_vector_close_file(P1(gx_device_vector * vdev)); 3227dd7cddfSDavid du Colombier 3237dd7cddfSDavid du Colombier /* ---------------- Image enumeration ---------------- */ 3247dd7cddfSDavid du Colombier 3257dd7cddfSDavid du Colombier /* Define a common set of state parameters for enumerating images. */ 3267dd7cddfSDavid du Colombier #define gdev_vector_image_enum_common\ 3277dd7cddfSDavid du Colombier gx_image_enum_common;\ 3287dd7cddfSDavid du Colombier /* Set by begin_image */\ 3297dd7cddfSDavid du Colombier gs_memory_t *memory; /* from begin_image */\ 3307dd7cddfSDavid du Colombier gx_image_enum_common_t *default_info; /* non-0 iff using default implementation */\ 3317dd7cddfSDavid du Colombier gx_image_enum_common_t *bbox_info; /* non-0 iff passing image data to bbox dev */\ 3327dd7cddfSDavid du Colombier int width, height;\ 3337dd7cddfSDavid du Colombier int bits_per_pixel; /* (per plane) */\ 3347dd7cddfSDavid du Colombier uint bits_per_row; /* (per plane) */\ 3357dd7cddfSDavid du Colombier /* Updated dynamically by image_data */\ 3367dd7cddfSDavid du Colombier int y /* 0 <= y < height */ 3377dd7cddfSDavid du Colombier typedef struct gdev_vector_image_enum_s { 3387dd7cddfSDavid du Colombier gdev_vector_image_enum_common; 3397dd7cddfSDavid du Colombier } gdev_vector_image_enum_t; 3407dd7cddfSDavid du Colombier 3417dd7cddfSDavid du Colombier extern_st(st_vector_image_enum); 3427dd7cddfSDavid du Colombier #define public_st_vector_image_enum() /* in gdevvec.c */\ 3437dd7cddfSDavid du Colombier gs_public_st_ptrs2(st_vector_image_enum, gdev_vector_image_enum_t,\ 3447dd7cddfSDavid du Colombier "gdev_vector_image_enum_t", vector_image_enum_enum_ptrs,\ 3457dd7cddfSDavid du Colombier vector_image_enum_reloc_ptrs, default_info, bbox_info) 3467dd7cddfSDavid du Colombier 3477dd7cddfSDavid du Colombier /* 3487dd7cddfSDavid du Colombier * Initialize for enumerating an image. Note that the last argument is an 3497dd7cddfSDavid du Colombier * already-allocated enumerator, not a pointer to the place to store the 3507dd7cddfSDavid du Colombier * enumerator. 3517dd7cddfSDavid du Colombier */ 3527dd7cddfSDavid du Colombier int gdev_vector_begin_image(P10(gx_device_vector * vdev, 3537dd7cddfSDavid du Colombier const gs_imager_state * pis, const gs_image_t * pim, 3547dd7cddfSDavid du Colombier gs_image_format_t format, const gs_int_rect * prect, 3557dd7cddfSDavid du Colombier const gx_drawing_color * pdcolor, const gx_clip_path * pcpath, 3567dd7cddfSDavid du Colombier gs_memory_t * mem, const gx_image_enum_procs_t * pprocs, 3577dd7cddfSDavid du Colombier gdev_vector_image_enum_t * pie)); 3587dd7cddfSDavid du Colombier 3597dd7cddfSDavid du Colombier /* End an image, optionally supplying any necessary blank padding rows. */ 3607dd7cddfSDavid du Colombier /* Return 0 if we used the default implementation, 1 if not. */ 3617dd7cddfSDavid du Colombier int gdev_vector_end_image(P4(gx_device_vector * vdev, 3627dd7cddfSDavid du Colombier gdev_vector_image_enum_t * pie, bool draw_last, gx_color_index pad)); 3637dd7cddfSDavid du Colombier 3647dd7cddfSDavid du Colombier /* ================ Device procedures ================ */ 3657dd7cddfSDavid du Colombier 3667dd7cddfSDavid du Colombier /* Redefine get/put_params to handle OutputFile. */ 3677dd7cddfSDavid du Colombier dev_proc_put_params(gdev_vector_put_params); 3687dd7cddfSDavid du Colombier dev_proc_get_params(gdev_vector_get_params); 3697dd7cddfSDavid du Colombier 3707dd7cddfSDavid du Colombier /* ---------------- Defaults ---------------- */ 3717dd7cddfSDavid du Colombier 3727dd7cddfSDavid du Colombier /* fill_rectangle may call setfillcolor, dorect. */ 3737dd7cddfSDavid du Colombier dev_proc_fill_rectangle(gdev_vector_fill_rectangle); 3747dd7cddfSDavid du Colombier /* fill_path may call prepare_fill, writepath, write_clip_path. */ 3757dd7cddfSDavid du Colombier dev_proc_fill_path(gdev_vector_fill_path); 3767dd7cddfSDavid du Colombier /* stroke_path may call prepare_stroke, write_path, write_clip_path. */ 3777dd7cddfSDavid du Colombier dev_proc_stroke_path(gdev_vector_stroke_path); 3787dd7cddfSDavid du Colombier /* fill_trapezoid, fill_parallelogram, and fill_triangle may call */ 3797dd7cddfSDavid du Colombier /* setfillcolor, setlogop, beginpath, moveto, lineto, endpath. */ 3807dd7cddfSDavid du Colombier dev_proc_fill_trapezoid(gdev_vector_fill_trapezoid); 3817dd7cddfSDavid du Colombier dev_proc_fill_parallelogram(gdev_vector_fill_parallelogram); 3827dd7cddfSDavid du Colombier dev_proc_fill_triangle(gdev_vector_fill_triangle); 3837dd7cddfSDavid du Colombier 3847dd7cddfSDavid du Colombier #endif /* gdevvec_INCLUDED */ 385