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