]> git.ipfire.org Git - thirdparty/cups.git/blob - filter/hpgl-attr.c
Merge changes from CUPS 1.4svn-r8443.
[thirdparty/cups.git] / filter / hpgl-attr.c
1 /*
2 * "$Id: hpgl-attr.c 6649 2007-07-11 21:46:42Z mike $"
3 *
4 * HP-GL/2 attribute processing for the Common UNIX Printing System (CUPS).
5 *
6 * Copyright 2007-2008 by Apple Inc.
7 * Copyright 1993-2007 by Easy Software Products.
8 *
9 * These coded instructions, statements, and computer programs are the
10 * property of Apple Inc. and are protected by Federal copyright
11 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
12 * which should have been included with this file. If this file is
13 * file is missing or damaged, see the license at "http://www.cups.org/".
14 *
15 * This file is subject to the Apple OS-Developed Software exception.
16 *
17 * Contents:
18 *
19 * CR_color_range() - Set the range for color values.
20 * AC_anchor_corner() - Set the anchor corner.
21 * FT_fill_type() - Set the fill type or pattern.
22 * LA_line_attributes() - Set the line drawing attributes.
23 * LT_line_type() - Set the line type (style)...
24 * NP_number_pens() - Set the number of pens to be used.
25 * PC_pen_color() - Set the pen color...
26 * PW_pen_width() - Set the pen width.
27 * RF_raster_fill() - Set the raster fill pattern.
28 * SM_symbol_mode() - Set where symbols are drawn.
29 * SP_select_pen() - Select a pen for drawing.
30 * UL_user_line_type() - Set a user-defined line type.
31 * WU_width_units() - Set the units used for pen widths.
32 */
33
34 /*
35 * Include necessary headers...
36 */
37
38 #include "hpgltops.h"
39
40
41 /*
42 * 'CR_color_range()' - Set the range for color values.
43 */
44
45 void
46 CR_color_range(int num_params, /* I - Number of parameters */
47 param_t *params) /* I - Parameters */
48 {
49 if (num_params == 0)
50 {
51 /*
52 * Default to 0 to 255 for all color values.
53 */
54
55 ColorRange[0][0] = 0.0;
56 ColorRange[0][1] = 255.0;
57 ColorRange[1][0] = 0.0;
58 ColorRange[1][1] = 255.0;
59 ColorRange[2][0] = 0.0;
60 ColorRange[2][1] = 255.0;
61 }
62 else if (num_params == 6)
63 {
64 /*
65 * Set the range based on the parameters...
66 */
67
68 ColorRange[0][0] = params[0].value.number;
69 ColorRange[0][1] = params[1].value.number - params[0].value.number;
70 ColorRange[1][0] = params[2].value.number;
71 ColorRange[1][1] = params[3].value.number - params[2].value.number;
72 ColorRange[2][0] = params[4].value.number;
73 ColorRange[2][1] = params[5].value.number - params[4].value.number;
74 }
75 else
76 fprintf(stderr,
77 "DEBUG: HP-GL/2 \'CR\' command with invalid number of "
78 "parameters (%d)!\n", num_params);
79 }
80
81
82 /*
83 * 'AC_anchor_corner()' - Set the anchor corner.
84 */
85
86 void
87 AC_anchor_corner(int num_params, /* I - Number of parameters */
88 param_t *params) /* I - Parameters */
89 {
90 (void)num_params;
91 (void)params;
92 }
93
94
95 /*
96 * 'FT_fill_type()' - Set the fill type or pattern.
97 *
98 * Note:
99 *
100 * This needs to be updated to support non-solid fill.
101 */
102
103 void
104 FT_fill_type(int num_params, /* I - Number of parameters */
105 param_t *params) /* I - Parameters */
106 {
107 if (num_params == 0 ||
108 params[0].value.number == 1 ||
109 params[0].value.number == 2)
110 {
111 /**** SOLID PATTERN ****/
112 }
113 }
114
115
116 /*
117 * 'LA_line_attributes()' - Set the line drawing attributes.
118 */
119
120 void
121 LA_line_attributes(int num_params, /* I - Number of parameters */
122 param_t *params) /* I - Parameters */
123 {
124 int i; /* Looping var */
125
126
127 if (num_params == 0)
128 {
129 MiterLimit = 3.0f;
130 LineCap = 0;
131 LineJoin = 0;
132 }
133 else for (i = 0; i < (num_params - 1); i += 2)
134 switch ((int)params[i].value.number)
135 {
136 case 1 :
137 LineCap = params[i + 1].value.number == 1 ? 0 :
138 params[i + 1].value.number == 4 ? 1 : 2;
139 break;
140 case 2 :
141 switch ((int)params[i + 1].value.number)
142 {
143 case 1 :
144 case 2 :
145 case 3 :
146 LineJoin = 0;
147 break;
148 case 5 :
149 LineJoin = 2;
150 break;
151 default :
152 LineJoin = 1;
153 break;
154 }
155 break;
156 case 3 :
157 MiterLimit = 1.0 + 0.5 * (params[i + 1].value.number - 1.0);
158 break;
159 }
160
161 if (PageDirty)
162 {
163 printf("%.1f setmiterlimit\n", MiterLimit);
164 printf("%d setlinecap\n", LineCap);
165 printf("%d setlinejoin\n", LineJoin);
166 }
167 }
168
169
170 /*
171 * 'LT_line_type()' - Set the line type (style)...
172 *
173 * Note:
174 *
175 * This needs to be updated to support line types.
176 */
177
178 void
179 LT_line_type(int num_params, /* I - Number of parameters */
180 param_t *params) /* I - Parameters */
181 {
182 (void)num_params;
183 (void)params;
184 }
185
186
187 /*
188 * 'NP_number_pens()' - Set the number of pens to be used.
189 */
190
191 void
192 NP_number_pens(int num_params, /* I - Number of parameters */
193 param_t *params) /* I - Parameters */
194 {
195 int i; /* Looping var */
196
197
198 if (num_params == 0)
199 PenCount = 8;
200 else if (num_params == 1)
201 {
202 if (params[0].value.number < 1 || params[0].value.number > MAX_PENS)
203 {
204 fprintf(stderr,
205 "DEBUG: HP-GL/2 \'NP\' command with invalid number of "
206 "pens (%d)!\n", (int)params[0].value.number);
207 PenCount = 8;
208 }
209 else
210 PenCount = (int)params[0].value.number;
211 }
212 else
213 fprintf(stderr,
214 "DEBUG: HP-GL/2 \'NP\' command with invalid number of "
215 "parameters (%d)!\n", num_params);
216
217 for (i = 0; i < PenCount; i ++)
218 Pens[i].width = PenWidth;
219
220 PC_pen_color(0, NULL);
221 }
222
223
224 /*
225 * 'PC_pen_color()' - Set the pen color...
226 */
227
228 void
229 PC_pen_color(int num_params, /* I - Number of parameters */
230 param_t *params) /* I - Parameters */
231 {
232 int i; /* Looping var */
233 static float standard_colors[8][3] = /* Standard colors for first 8 pens */
234 {
235 { 0.0, 0.0, 0.0 }, /* Black */
236 { 1.0, 0.0, 0.0 }, /* Red */
237 { 0.0, 1.0, 0.0 }, /* Green */
238 { 1.0, 1.0, 0.0 }, /* Yellow */
239 { 0.0, 0.0, 1.0 }, /* Blue */
240 { 1.0, 0.0, 1.0 }, /* Magenta */
241 { 0.0, 1.0, 1.0 }, /* Cyan */
242 { 1.0, 1.0, 1.0 } /* White */
243 };
244
245
246 if (num_params == 0)
247 {
248 for (i = 0; i < PenCount; i ++)
249 if (i < 8)
250 {
251 Pens[i].rgb[0] = standard_colors[i][0];
252 Pens[i].rgb[1] = standard_colors[i][1];
253 Pens[i].rgb[2] = standard_colors[i][2];
254 }
255 else
256 {
257 Pens[i].rgb[0] = 0.0f;
258 Pens[i].rgb[1] = 0.0f;
259 Pens[i].rgb[2] = 0.0f;
260 }
261
262 if (PageDirty)
263 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
264 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
265 Pens[PenNumber].width * PenScaling);
266 }
267 else if (num_params == 1 || num_params == 4)
268 {
269 i = (int)params[0].value.number - 1;
270
271 if (i < 0 || i >= PenCount)
272 {
273 fprintf(stderr,
274 "DEBUG: HP-GL/2 \'PC\' command with invalid pen (%d)!\n", i + 1);
275 return;
276 }
277
278 if (num_params == 1)
279 {
280 Pens[i].rgb[0] = standard_colors[i & 7][0];
281 Pens[i].rgb[1] = standard_colors[i & 7][1];
282 Pens[i].rgb[2] = standard_colors[i & 7][2];
283 }
284 else
285 {
286 Pens[i].rgb[0] = (params[1].value.number - ColorRange[0][0]) /
287 (ColorRange[0][1] - ColorRange[0][0]);
288 Pens[i].rgb[1] = (params[2].value.number - ColorRange[1][0]) /
289 (ColorRange[1][1] - ColorRange[1][0]);
290 Pens[i].rgb[2] = (params[3].value.number - ColorRange[2][0]) /
291 (ColorRange[2][1] - ColorRange[2][0]);
292
293 fprintf(stderr, "DEBUG: Pen %d %.0f %.0f %.0f = %.3f %.3f %.3f\n",
294 i, params[1].value.number, params[2].value.number,
295 params[3].value.number, Pens[i].rgb[0], Pens[i].rgb[1],
296 Pens[i].rgb[2]);
297 }
298
299 if (PageDirty && i == PenNumber)
300 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
301 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
302 Pens[PenNumber].width * PenScaling);
303 }
304 else
305 fprintf(stderr,
306 "DEBUG: HP-GL/2 \'PC\' command with invalid number of "
307 "parameters (%d)!\n", num_params);
308 }
309
310
311 /*
312 * 'PW_pen_width()' - Set the pen width.
313 */
314
315 void
316 PW_pen_width(int num_params, /* I - Number of parameters */
317 param_t *params) /* I - Parameters */
318 {
319 int pen; /* Pen number */
320 float w; /* Width value */
321
322
323 if (WidthUnits == 0)
324 {
325 /*
326 * Metric...
327 */
328
329 if (num_params == 0)
330 w = 0.35f / 25.4f * 72.0f;
331 else
332 w = params[0].value.number / 25.4f * 72.0f;
333 }
334 else
335 {
336 /*
337 * Relative...
338 */
339
340 w = (float)hypot(PlotSize[0], PlotSize[1]) / 1016.0f * 72.0f;
341
342 if (num_params == 0)
343 w *= 0.01f;
344 else
345 w *= params[0].value.number;
346 }
347
348 if (num_params == 2)
349 {
350 pen = (int)params[1].value.number - 1;
351
352 if (pen < 0 || pen >= PenCount)
353 {
354 fprintf(stderr,
355 "DEBUG: HP-GL/2 \'PW\' command with invalid pen (%d)!\n",
356 pen + 1);
357 return;
358 }
359
360 Pens[pen].width = w;
361
362 if (PageDirty && pen == PenNumber)
363 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
364 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
365 Pens[PenNumber].width * PenScaling);
366 }
367 else if (num_params < 2)
368 {
369 /*
370 * Set width for all pens...
371 */
372
373 for (pen = 0; pen < PenCount; pen ++)
374 Pens[pen].width = w;
375
376 if (PageDirty)
377 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
378 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
379 Pens[PenNumber].width * PenScaling);
380 }
381 else
382 fprintf(stderr,
383 "DEBUG: HP-GL/2 \'PW\' command with invalid number of "
384 "parameters (%d)!\n", num_params);
385 }
386
387
388 /*
389 * 'RF_raster_fill()' - Set the raster fill pattern.
390 *
391 * Note:
392 *
393 * This needs to be implemented.
394 */
395
396 void
397 RF_raster_fill(int num_params, /* I - Number of parameters */
398 param_t *params) /* I - Parameters */
399 {
400 (void)num_params;
401 (void)params;
402 }
403
404
405 /*
406 * 'SM_symbol_mode()' - Set where symbols are drawn.
407 */
408
409 void
410 SM_symbol_mode(int num_params, /* I - Number of parameters */
411 param_t *params) /* I - Parameters */
412 {
413 (void)num_params;
414 (void)params;
415 }
416
417
418 /*
419 * 'SP_select_pen()' - Select a pen for drawing.
420 */
421
422 void
423 SP_select_pen(int num_params, /* I - Number of parameters */
424 param_t *params) /* I - Parameters */
425 {
426 if (num_params == 0)
427 PenNumber = 0;
428 else if (num_params > 1)
429 fprintf(stderr,
430 "DEBUG: HP-GL/2 \'SP\' command with invalid number of parameters "
431 "(%d)!\n", num_params);
432 else if (params[0].value.number <= 0 || params[0].value.number >= PenCount)
433 fprintf(stderr, "DEBUG: HP-GL/2 \'SP\' command with invalid pen (%d)!\n",
434 (int)params[0].value.number);
435 else
436 PenNumber = (int)params[0].value.number - 1;
437
438 if (PageDirty)
439 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
440 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
441 Pens[PenNumber].width * PenScaling);
442 }
443
444
445 /*
446 * 'UL_user_line_type()' - Set a user-defined line type.
447 */
448
449 void
450 UL_user_line_type(int num_params, /* I - Number of parameters */
451 param_t *params) /* I - Parameters */
452 {
453 (void)num_params;
454 (void)params;
455 }
456
457
458 /*
459 * 'WU_width_units()' - Set the units used for pen widths.
460 */
461
462 void
463 WU_width_units(int num_params, /* I - Number of parameters */
464 param_t *params) /* I - Parameters */
465 {
466 if (num_params == 0)
467 WidthUnits = 0;
468 else if (num_params == 1)
469 WidthUnits = (int)params[0].value.number;
470 else
471 fprintf(stderr,
472 "DEBUG: HP-GL/2 \'WU\' command with invalid number of "
473 "parameters (%d)!\n", num_params);
474 }
475
476
477 /*
478 * End of "$Id: hpgl-attr.c 6649 2007-07-11 21:46:42Z mike $".
479 */