1 /* Copyright (C) 2001-2019 Artifex Software, Inc. 2 All Rights Reserved. 3 4 This software is provided AS-IS with no warranty, either express or 5 implied. 6 7 This software is distributed under license and may not be copied, 8 modified or distributed except as expressly authorized under the terms 9 of the license contained in the file LICENSE in this distribution. 10 11 Refer to licensing information at http://www.artifex.com or contact 12 Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato, 13 CA 94945, U.S.A., +1(415)492-9861, for further information. 14 */ 15 16 17 /* Definitions and support procedures for higher-level band list commands */ 18 /* Extends (requires) gxcldev.h */ 19 20 #ifndef gxclpath_INCLUDED 21 # define gxclpath_INCLUDED 22 23 #include "gxdevcli.h" 24 #include "gxcldev.h" 25 26 /* 27 * Define the flags indicating whether a band knows the current values of 28 * various miscellaneous parameters (pcls->known). The first N flags match 29 * the mask parameter for cmd_set_misc2 below. 30 */ 31 #define cap_join_known (1<<0) 32 #define cj_ac_sa_known (1<<1) 33 #define flatness_known (1<<2) 34 #define line_width_known (1<<3) 35 #define miter_limit_known (1<<4) 36 #define op_bm_tk_known (1<<5) 37 /* segment_notes must fit in the first byte (i.e. be less than 1<<7). */ 38 #define segment_notes_known (1<<6) /* not used in pcls->known */ 39 /* (flags beyond this point require an extra byte) */ 40 #define opacity_alpha_known (1<<7) 41 #define shape_alpha_known (1<<8) 42 #define alpha_known (1<<9) 43 #define misc2_all_known ((1<<10)-1) 44 /* End of misc2 flags. */ 45 /* The following bits don't get passed in misc2, so are only limited by sizeof uint */ 46 #define fill_adjust_known (1<<10) 47 #define ctm_known (1<<11) 48 #define dash_known (1<<12) 49 #define clip_path_known (1<<13) 50 #define STROKE_ALL_KNOWN ((1<<14)-1) 51 #define color_space_known (1<<14) 52 /*#define all_known ((1<<15)-1) */ 53 54 /* Define the drawing color types for distinguishing different */ 55 /* fill/stroke command variations. */ 56 typedef enum { 57 cmd_dc_type_pure = 0, 58 cmd_dc_type_ht = 1, 59 cmd_dc_type_color = 2 60 } cmd_dc_type; 61 62 /* Extend the command set. See gxcldev.h for more information. */ 63 typedef enum { 64 cmd_op_misc2 = 0xd0, /* (see below) */ 65 cmd_op_fill_rect_hl = 0xd1, /* rect fill with devn color */ 66 cmd_opv_set_fill_adjust = 0xd2, /* adjust_x/y(fixed) */ 67 cmd_opv_set_ctm = 0xd3, /* [per sput/sget_matrix] */ 68 cmd_opv_set_color_space = 0xd4, /* base(4)Indexed?(2)0(2) */ 69 /* [, hival#, table|map] */ 70 /* 71 * cmd_opv_set_misc2_value is followed by a mask (a variable-length 72 * integer), and then by parameter values for the parameters selected 73 * by the mask. See above for the "known" mask values. 74 */ 75 /* cap_join: 0(2)cap(3)join(3) */ 76 /* cj_ac_sa: 0(3)curve_join+1(3)acc.curves(1)stroke_adj(1) */ 77 /* flatness: (float) */ 78 /* line width: (float) */ 79 /* miter limit: (float) */ 80 /* op_bm_tk: blend mode(5)text knockout(1)o.p.mode(1)o.p.(1) */ 81 /* segment notes: (byte) */ 82 /* opacity/shape: alpha(float)mask(TBD) */ 83 /* alpha: <<verbatim copy from gs_gstate>> */ 84 cmd_opv_set_misc2 = 0xd5, /* mask#, selected parameters */ 85 cmd_opv_set_dash = 0xd6, /* adapt(1)abs.dot(1)n(6), dot */ 86 /* length(float), offset(float), */ 87 /* n x (float) */ 88 cmd_opv_enable_clip = 0xd7, /* (nothing) */ 89 cmd_opv_disable_clip = 0xd8, /* (nothing) */ 90 cmd_opv_begin_clip = 0xd9, /* (nothing) */ 91 cmd_opv_end_clip = 0xda, /* (nothing) */ 92 cmd_opv_begin_image_rect = 0xdb, /* same as begin_image, followed by */ 93 /* x0#, w-x1#, y0#, h-y1# */ 94 cmd_opv_begin_image = 0xdc, /* image_type_table index, */ 95 /* [per image type] */ 96 cmd_opv_image_data = 0xdd, /* height# (premature EOD if 0), */ 97 /* raster#, <data> */ 98 cmd_opv_image_plane_data = 0xde, /* height# (premature EOD if 0), */ 99 /* flags# (0 = same raster & data_x, */ 100 /* 1 = new raster & data_x, lsb first), */ 101 /* [raster#, [data_x#,]]* <data> */ 102 cmd_opv_extend = 0xdf, /* command, varies (see gx_cmd_ext_op below) */ 103 104 105 #define cmd_misc2_op_name_strings\ 106 "?d0?", "fill_hl_color", \ 107 "set_fill_adjust", "set_ctm",\ 108 "set_color_space", "set_misc2", "set_dash", "enable_clip",\ 109 "disable_clip", "begin_clip", "end_clip", "begin_image_rect",\ 110 "begin_image", "image_data", "image_plane_data", "extended" 111 112 cmd_op_segment = 0xe0, /* (see below) */ 113 cmd_opv_rmoveto = 0xe0, /* dx%, dy% */ 114 cmd_opv_rlineto = 0xe1, /* dx%, dy% */ 115 cmd_opv_hlineto = 0xe2, /* dx% */ 116 cmd_opv_vlineto = 0xe3, /* dy% */ 117 cmd_opv_rmlineto = 0xe4, /* dx1%,dy1%, dx2%,dy2% */ 118 cmd_opv_rm2lineto = 0xe5, /* dx1%,dy1%, dx2%,dy2%, dx3%,dy3% */ 119 cmd_opv_rm3lineto = 0xe6, /* dx1%,dy1%, dx2%,dy2%, dx3%,dy3%, */ 120 /* [-dx2,-dy2 implicit] */ 121 cmd_opv_rrcurveto = 0xe7, /* dx1%,dy1%, dx2%,dy2%, dx3%,dy3% */ 122 cmd_opv_min_curveto = cmd_opv_rrcurveto, 123 cmd_opv_hvcurveto = 0xe8, /* dx1%, dx2%,dy2%, dy3% */ 124 cmd_opv_vhcurveto = 0xe9, /* dy1%, dx2%,dy2%, dx3% */ 125 cmd_opv_nrcurveto = 0xea, /* dx2%,dy2%, dx3%,dy3% */ 126 cmd_opv_rncurveto = 0xeb, /* dx1%,dy1%, dx2%,dy2% */ 127 cmd_opv_vqcurveto = 0xec, /* dy1%, dx2%[,dy2=dx2 with sign */ 128 /* of dy1, dx3=dy1 with sign of dx2] */ 129 cmd_opv_hqcurveto = 0xed, /* dx1%, [dx2=dy2 with sign */ 130 /* of dx1,]%dy2, [dy3=dx1 with sign */ 131 /* of dy2] */ 132 cmd_opv_scurveto = 0xee, /* all implicit: previous op must have been */ 133 /* *curveto with one or more of dx/y1/3 = 0. */ 134 /* If h*: -dx3,dy3, -dx2,dy2, -dx1,dy1. */ 135 /* If v*: dx3,-dy3, dx2,-dy2, dx1,-dy1. */ 136 cmd_opv_max_curveto = cmd_opv_scurveto, 137 cmd_opv_closepath = 0xef, /* (nothing) */ 138 139 #define cmd_segment_op_name_strings\ 140 "rmoveto", "rlineto", "hlineto", "vlineto",\ 141 "rmlineto", "rm2lineto", "rm3lineto", "rrcurveto",\ 142 "hvcurveto", "vhcurveto", "nrcurveto", "rncurveto",\ 143 "vqcurveto", "hqcurveto", "scurveto", "closepath" 144 145 cmd_op_path = 0xf0, /* (see below) */ 146 cmd_opv_fill = 0xf0, 147 cmd_opv_rgapto = 0xf1, /* dx%, dy% */ 148 cmd_opv_eofill = 0xf3, 149 cmd_opv_fill_stroke = 0xf4, 150 cmd_opv_eofill_stroke = 0xf5, 151 cmd_opv_stroke = 0xf6, 152 cmd_opv_polyfill = 0xf9, 153 cmd_opv_fill_trapezoid = 0xfc 154 155 #define cmd_path_op_name_strings\ 156 "fill", "rgapto", "?f2?", "eofill",\ 157 "fill_stroke", "eofill_stroke", "stroke", "?f7?",\ 158 "?f8?", "polyfill", "?fa?", "?fb?",\ 159 "fill_trapezoid", "?fd?", "?fe?", "?ff?" 160 161 /* unused cmd_op values: 0xd0, 0xf2, 0xf7, 0xf8, 0xfa, 0xfb, 0xfd, 0xfe, 0xff */ 162 } gx_cmd_xop; 163 164 /* This is usd for cmd_opv_ext_put_drawing_color so that we know if it 165 is assocated with a tile or not and for fill or stroke color */ 166 typedef enum { 167 devn_not_tile_fill = 0x00, 168 devn_not_tile_stroke = 0x01, 169 devn_tile0 = 0x02, 170 devn_tile1 = 0x03 171 } dc_devn_cl_type; 172 /* 173 * Further extended command set. This code always occupies a byte, which 174 * is the second byte of a command whose first byte is cmd_opv_extend. 175 */ 176 typedef enum { 177 cmd_opv_ext_put_params = 0x00, /* serialized parameter list */ 178 cmd_opv_ext_create_compositor = 0x01, /* compositor id, 179 * serialized compositor */ 180 cmd_opv_ext_put_halftone = 0x02, /* length of entire halftone */ 181 cmd_opv_ext_put_ht_seg = 0x03, /* segment length, 182 * halftone segment data */ 183 cmd_opv_ext_put_fill_dcolor = 0x04, /* length, color type id, 184 * serialized color */ 185 cmd_opv_ext_put_stroke_dcolor = 0x05, /* length, color type id, 186 * serialized color */ 187 cmd_opv_ext_tile_rect_hl = 0x06, /* Uses devn colors in tiling fill */ 188 cmd_opv_ext_put_tile_devn_color0 = 0x07, /* Devn color0 for tile filling */ 189 cmd_opv_ext_put_tile_devn_color1 = 0x08, /* Devn color1 for tile filling */ 190 cmd_opv_ext_set_color_is_devn = 0x09, /* Used for overload of copy_color_alpha */ 191 cmd_opv_ext_unset_color_is_devn = 0x0a /* Used for overload of copy_color_alpha */ 192 } gx_cmd_ext_op; 193 194 #define cmd_segment_op_num_operands_values\ 195 2, 2, 1, 1, 4, 6, 6, 6, 4, 4, 4, 4, 2, 2, 0, 0 196 197 /* 198 * We represent path coordinates as 'fixed' values in a variable-length, 199 * relative form (s/t = sign, x/y = integer, f/g = fraction): 200 * 00sxxxxx xfffffff ffffftyy yyyygggg gggggggg 201 * 01sxxxxx xxxxffff ffffffff 202 * 10sxxxxx xxxxxxxx xxxxffff ffffffff 203 * 110sxxxx xxxxxxff 204 * 111----- (a full-size `fixed' value) 205 */ 206 #define is_bits(d, n) !(((d) + ((fixed)1 << ((n) - 1))) & (-(fixed)1 << (n))) 207 208 /* 209 * Maximum size of a halftone segment. This leaves enough headroom to 210 * accommodate any reasonable requirements of the command buffer. 211 */ 212 #define cbuf_ht_seg_max_size (cbuf_size - 32) /* leave some headroom */ 213 214 /* ---------------- Driver procedures ---------------- */ 215 216 /* In gxclpath.c */ 217 dev_proc_fill_path(clist_fill_path); 218 dev_proc_stroke_path(clist_stroke_path); 219 dev_proc_fill_stroke_path(clist_fill_stroke_path); 220 dev_proc_fill_parallelogram(clist_fill_parallelogram); 221 dev_proc_fill_triangle(clist_fill_triangle); 222 223 /* ---------------- Driver procedure support ---------------- */ 224 225 /* The procedures and macros defined here are used when writing */ 226 /* (gxclimag.c, gxclpath.c). */ 227 228 /* Compare and update members of the gs_gstate. */ 229 #define state_neq(member)\ 230 (cdev->gs_gstate.member != pgs->member) 231 #define state_update(member)\ 232 (cdev->gs_gstate.member = pgs->member) 233 234 /* ------ Exported by gxclpath.c ------ */ 235 236 /* Compute the colors used by a drawing color. */ 237 gx_color_usage_bits cmd_drawing_color_usage(gx_device_clist_writer *cldev, 238 const gx_drawing_color *pdcolor); 239 240 /* 241 * Compute whether a drawing operation will require the slow (full-pixel) 242 * RasterOp implementation. If pdcolor is not NULL, it is the texture for 243 * the RasterOp. 244 */ 245 bool cmd_slow_rop(gx_device *dev, gs_logical_operation_t lop, 246 const gx_drawing_color *pdcolor); 247 248 /* Write out the color for filling, stroking, or masking. */ 249 /* Return a cmd_dc_type. */ 250 int cmd_put_drawing_color(gx_device_clist_writer * cldev, 251 gx_clist_state * pcls, 252 const gx_drawing_color * pdcolor, 253 cmd_rects_enum_t *pre, dc_devn_cl_type devn_type); 254 255 /* Clear (a) specific 'known' flag(s) for all bands. */ 256 /* We must do this whenever the value of a 'known' parameter changes. */ 257 void cmd_clear_known(gx_device_clist_writer * cldev, uint known); 258 259 /* Compute the written CTM length. */ 260 int cmd_write_ctm_return_length(gx_device_clist_writer * cldev, const gs_matrix *m); 261 int cmd_write_ctm_return_length_nodevice(const gs_matrix *m); 262 /* Write out CTM. */ 263 int cmd_write_ctm(const gs_matrix *m, byte *dp, int len); 264 265 /* Write out values of any unknown parameters. */ 266 #define cmd_do_write_unknown(cldev, pcls, must_know)\ 267 ( ~(pcls)->known & (must_know) ?\ 268 cmd_write_unknown(cldev, pcls, must_know) : 0 ) 269 int cmd_write_unknown(gx_device_clist_writer * cldev, gx_clist_state * pcls, 270 uint must_know); 271 272 /* Check whether we need to change the clipping path in the device. */ 273 bool cmd_check_clip_path(gx_device_clist_writer * cldev, 274 const gx_clip_path * pcpath); 275 276 #endif /* gxclpath_INCLUDED */ 277