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