]> git.ipfire.org Git - thirdparty/cups.git/blame - filter/hpgl-attr.c
Merge CUPS 1.4svn-r8052 (tentative 1.4b1)
[thirdparty/cups.git] / filter / hpgl-attr.c
CommitLineData
ef416fc2 1/*
bc44d920 2 * "$Id: hpgl-attr.c 6649 2007-07-11 21:46:42Z mike $"
ef416fc2 3 *
4 * HP-GL/2 attribute processing for the Common UNIX Printing System (CUPS).
5 *
bc44d920 6 * Copyright 2007 by Apple Inc.
c0e1af83 7 * Copyright 1993-2007 by Easy Software Products.
ef416fc2 8 *
9 * These coded instructions, statements, and computer programs are the
bc44d920 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/".
ef416fc2 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
45void
46CR_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
c0e1af83 76 fprintf(stderr,
77 "DEBUG: HP-GL/2 \'CR\' command with invalid number of "
78 "parameters (%d)!\n", num_params);
ef416fc2 79}
80
81
82/*
83 * 'AC_anchor_corner()' - Set the anchor corner.
84 */
85
86void
87AC_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
103void
104FT_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
120void
121LA_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
178void
179LT_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
191void
192NP_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;
61cf44e2
MS
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 }
ef416fc2 212 else
c0e1af83 213 fprintf(stderr,
214 "DEBUG: HP-GL/2 \'NP\' command with invalid number of "
215 "parameters (%d)!\n", num_params);
ef416fc2 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
228void
229PC_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 { 1.0, 1.0, 1.0 }, /* White */
236 { 0.0, 0.0, 0.0 }, /* Black */
237 { 1.0, 0.0, 0.0 }, /* Red */
238 { 0.0, 1.0, 0.0 }, /* Green */
239 { 1.0, 1.0, 0.0 }, /* Yellow */
240 { 0.0, 0.0, 1.0 }, /* Blue */
241 { 1.0, 0.0, 1.0 }, /* Magenta */
242 { 0.0, 1.0, 1.0 } /* Cyan */
243 };
244
245
246 if (num_params == 0)
247 {
61cf44e2 248 for (i = 0; i < PenCount; i ++)
ef416fc2 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 {
61cf44e2
MS
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 }
ef416fc2 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
c0e1af83 305 fprintf(stderr,
306 "DEBUG: HP-GL/2 \'PC\' command with invalid number of "
307 "parameters (%d)!\n", num_params);
ef416fc2 308}
309
310
311/*
312 * 'PW_pen_width()' - Set the pen width.
313 */
314
315void
316PW_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 {
61cf44e2
MS
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 }
ef416fc2 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
61cf44e2 373 for (pen = 0; pen < PenCount; pen ++)
ef416fc2 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
c0e1af83 382 fprintf(stderr,
383 "DEBUG: HP-GL/2 \'PW\' command with invalid number of "
384 "parameters (%d)!\n", num_params);
ef416fc2 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
396void
397RF_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
409void
410SM_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
422void
423SP_select_pen(int num_params, /* I - Number of parameters */
424 param_t *params) /* I - Parameters */
425{
426 if (num_params == 0)
61cf44e2
MS
427 PenNumber = 0;
428 else if (num_params > 1)
c0e1af83 429 fprintf(stderr,
61cf44e2
MS
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",
c0e1af83 434 (int)params[0].value.number);
61cf44e2
MS
435 else
436 PenNumber = (int)params[0].value.number - 1;
ef416fc2 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
449void
450UL_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
462void
463WU_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
c0e1af83 471 fprintf(stderr,
472 "DEBUG: HP-GL/2 \'WU\' command with invalid number of "
473 "parameters (%d)!\n", num_params);
ef416fc2 474}
475
476
477/*
bc44d920 478 * End of "$Id: hpgl-attr.c 6649 2007-07-11 21:46:42Z mike $".
ef416fc2 479 */