]> 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/*
f7faf1f5 2 * "$Id: hpgl-attr.c 4494 2005-02-18 02:18:11Z mike $"
ef416fc2 3 *
4 * HP-GL/2 attribute processing for the Common UNIX Printing System (CUPS).
5 *
6 * Copyright 1993-2005 by Easy Software Products.
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
85 fprintf(stderr, "WARNING: HP-GL/2 \'CR\' command with invalid number of parameters (%d)!\n",
86 num_params);
87}
88
89
90/*
91 * 'AC_anchor_corner()' - Set the anchor corner.
92 */
93
94void
95AC_anchor_corner(int num_params, /* I - Number of parameters */
96 param_t *params) /* I - Parameters */
97{
98 (void)num_params;
99 (void)params;
100}
101
102
103/*
104 * 'FT_fill_type()' - Set the fill type or pattern.
105 *
106 * Note:
107 *
108 * This needs to be updated to support non-solid fill.
109 */
110
111void
112FT_fill_type(int num_params, /* I - Number of parameters */
113 param_t *params) /* I - Parameters */
114{
115 if (num_params == 0 ||
116 params[0].value.number == 1 ||
117 params[0].value.number == 2)
118 {
119 /**** SOLID PATTERN ****/
120 }
121}
122
123
124/*
125 * 'LA_line_attributes()' - Set the line drawing attributes.
126 */
127
128void
129LA_line_attributes(int num_params, /* I - Number of parameters */
130 param_t *params) /* I - Parameters */
131{
132 int i; /* Looping var */
133
134
135 if (num_params == 0)
136 {
137 MiterLimit = 3.0f;
138 LineCap = 0;
139 LineJoin = 0;
140 }
141 else for (i = 0; i < (num_params - 1); i += 2)
142 switch ((int)params[i].value.number)
143 {
144 case 1 :
145 LineCap = params[i + 1].value.number == 1 ? 0 :
146 params[i + 1].value.number == 4 ? 1 : 2;
147 break;
148 case 2 :
149 switch ((int)params[i + 1].value.number)
150 {
151 case 1 :
152 case 2 :
153 case 3 :
154 LineJoin = 0;
155 break;
156 case 5 :
157 LineJoin = 2;
158 break;
159 default :
160 LineJoin = 1;
161 break;
162 }
163 break;
164 case 3 :
165 MiterLimit = 1.0 + 0.5 * (params[i + 1].value.number - 1.0);
166 break;
167 }
168
169 if (PageDirty)
170 {
171 printf("%.1f setmiterlimit\n", MiterLimit);
172 printf("%d setlinecap\n", LineCap);
173 printf("%d setlinejoin\n", LineJoin);
174 }
175}
176
177
178/*
179 * 'LT_line_type()' - Set the line type (style)...
180 *
181 * Note:
182 *
183 * This needs to be updated to support line types.
184 */
185
186void
187LT_line_type(int num_params, /* I - Number of parameters */
188 param_t *params) /* I - Parameters */
189{
190 (void)num_params;
191 (void)params;
192}
193
194
195/*
196 * 'NP_number_pens()' - Set the number of pens to be used.
197 */
198
199void
200NP_number_pens(int num_params, /* I - Number of parameters */
201 param_t *params) /* I - Parameters */
202{
203 int i; /* Looping var */
204
205
206 if (num_params == 0)
207 PenCount = 8;
208 else if (num_params == 1 && params[0].value.number <= 1024)
209 PenCount = (int)params[0].value.number;
210 else
211 fprintf(stderr, "WARNING: HP-GL/2 \'NP\' command with invalid number of parameters (%d)!\n",
212 num_params);
213
214 for (i = 0; i <= PenCount; i ++)
215 Pens[i].width = PenWidth;
216
217 PC_pen_color(0, NULL);
218}
219
220
221/*
222 * 'PC_pen_color()' - Set the pen color...
223 */
224
225void
226PC_pen_color(int num_params, /* I - Number of parameters */
227 param_t *params) /* I - Parameters */
228{
229 int i; /* Looping var */
230 static float standard_colors[8][3] = /* Standard colors for first 8 pens */
231 {
232 { 1.0, 1.0, 1.0 }, /* White */
233 { 0.0, 0.0, 0.0 }, /* Black */
234 { 1.0, 0.0, 0.0 }, /* Red */
235 { 0.0, 1.0, 0.0 }, /* Green */
236 { 1.0, 1.0, 0.0 }, /* Yellow */
237 { 0.0, 0.0, 1.0 }, /* Blue */
238 { 1.0, 0.0, 1.0 }, /* Magenta */
239 { 0.0, 1.0, 1.0 } /* Cyan */
240 };
241
242
243 if (num_params == 0)
244 {
245 for (i = 0; i <= PenCount; i ++)
246 if (i < 8)
247 {
248 Pens[i].rgb[0] = standard_colors[i][0];
249 Pens[i].rgb[1] = standard_colors[i][1];
250 Pens[i].rgb[2] = standard_colors[i][2];
251 }
252 else
253 {
254 Pens[i].rgb[0] = 0.0f;
255 Pens[i].rgb[1] = 0.0f;
256 Pens[i].rgb[2] = 0.0f;
257 }
258
259 if (PageDirty)
260 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
261 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
262 Pens[PenNumber].width * PenScaling);
263 }
264 else if (num_params == 1 || num_params == 4)
265 {
266 i = (int)params[0].value.number;
267
268 if (num_params == 1)
269 {
270 Pens[i].rgb[0] = standard_colors[i & 7][0];
271 Pens[i].rgb[1] = standard_colors[i & 7][1];
272 Pens[i].rgb[2] = standard_colors[i & 7][2];
273 }
274 else
275 {
276 Pens[i].rgb[0] = (params[1].value.number - ColorRange[0][0]) /
277 (ColorRange[0][1] - ColorRange[0][0]);
278 Pens[i].rgb[1] = (params[2].value.number - ColorRange[1][0]) /
279 (ColorRange[1][1] - ColorRange[1][0]);
280 Pens[i].rgb[2] = (params[3].value.number - ColorRange[2][0]) /
281 (ColorRange[2][1] - ColorRange[2][0]);
282
283 fprintf(stderr, "DEBUG: Pen %d %.0f %.0f %.0f = %.3f %.3f %.3f\n",
284 i, params[1].value.number, params[2].value.number,
285 params[3].value.number, Pens[i].rgb[0], Pens[i].rgb[1],
286 Pens[i].rgb[2]);
287 }
288
289 if (PageDirty && i == PenNumber)
290 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
291 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
292 Pens[PenNumber].width * PenScaling);
293 }
294 else
295 fprintf(stderr, "WARNING: HP-GL/2 \'PC\' command with invalid number of parameters (%d)!\n",
296 num_params);
297}
298
299
300/*
301 * 'PW_pen_width()' - Set the pen width.
302 */
303
304void
305PW_pen_width(int num_params, /* I - Number of parameters */
306 param_t *params) /* I - Parameters */
307{
308 int pen; /* Pen number */
309 float w; /* Width value */
310
311
312 if (WidthUnits == 0)
313 {
314 /*
315 * Metric...
316 */
317
318 if (num_params == 0)
319 w = 0.35f / 25.4f * 72.0f;
320 else
321 w = params[0].value.number / 25.4f * 72.0f;
322 }
323 else
324 {
325 /*
326 * Relative...
327 */
328
329 w = (float)hypot(PlotSize[0], PlotSize[1]) / 1016.0f * 72.0f;
330
331 if (num_params == 0)
332 w *= 0.01f;
333 else
334 w *= params[0].value.number;
335 }
336
337 if (num_params == 2)
338 {
339 pen = (int)params[1].value.number;
340
341 Pens[pen].width = w;
342
343 if (PageDirty && pen == PenNumber)
344 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
345 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
346 Pens[PenNumber].width * PenScaling);
347 }
348 else if (num_params < 2)
349 {
350 /*
351 * Set width for all pens...
352 */
353
354 for (pen = 0; pen <= PenCount; pen ++)
355 Pens[pen].width = w;
356
357 if (PageDirty)
358 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
359 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
360 Pens[PenNumber].width * PenScaling);
361 }
362 else
363 fprintf(stderr, "WARNING: HP-GL/2 \'PW\' command with invalid number of parameters (%d)!\n",
364 num_params);
365}
366
367
368/*
369 * 'RF_raster_fill()' - Set the raster fill pattern.
370 *
371 * Note:
372 *
373 * This needs to be implemented.
374 */
375
376void
377RF_raster_fill(int num_params, /* I - Number of parameters */
378 param_t *params) /* I - Parameters */
379{
380 (void)num_params;
381 (void)params;
382}
383
384
385/*
386 * 'SM_symbol_mode()' - Set where symbols are drawn.
387 */
388
389void
390SM_symbol_mode(int num_params, /* I - Number of parameters */
391 param_t *params) /* I - Parameters */
392{
393 (void)num_params;
394 (void)params;
395}
396
397
398/*
399 * 'SP_select_pen()' - Select a pen for drawing.
400 */
401
402void
403SP_select_pen(int num_params, /* I - Number of parameters */
404 param_t *params) /* I - Parameters */
405{
406 if (num_params == 0)
407 PenNumber = 1;
408 else if (params[0].value.number <= PenCount)
409 PenNumber = (int)params[0].value.number;
410 else
411 fprintf(stderr, "WARNING: HP-GL/2 \'SP\' command with invalid number or value of parameters (%d, %d)!\n",
412 num_params, (int)params[0].value.number);
413
414 if (PageDirty)
415 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
416 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
417 Pens[PenNumber].width * PenScaling);
418}
419
420
421/*
422 * 'UL_user_line_type()' - Set a user-defined line type.
423 */
424
425void
426UL_user_line_type(int num_params, /* I - Number of parameters */
427 param_t *params) /* I - Parameters */
428{
429 (void)num_params;
430 (void)params;
431}
432
433
434/*
435 * 'WU_width_units()' - Set the units used for pen widths.
436 */
437
438void
439WU_width_units(int num_params, /* I - Number of parameters */
440 param_t *params) /* I - Parameters */
441{
442 if (num_params == 0)
443 WidthUnits = 0;
444 else if (num_params == 1)
445 WidthUnits = (int)params[0].value.number;
446 else
447 fprintf(stderr, "WARNING: HP-GL/2 \'WU\' command with invalid number of parameters (%d)!\n",
448 num_params);
449}
450
451
452/*
f7faf1f5 453 * End of "$Id: hpgl-attr.c 4494 2005-02-18 02:18:11Z mike $".
ef416fc2 454 */