]> 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/*
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;
200 else if (num_params == 1 && params[0].value.number <= 1024)
201 PenCount = (int)params[0].value.number;
202 else
c0e1af83 203 fprintf(stderr,
204 "DEBUG: HP-GL/2 \'NP\' command with invalid number of "
205 "parameters (%d)!\n", num_params);
ef416fc2 206
207 for (i = 0; i <= PenCount; i ++)
208 Pens[i].width = PenWidth;
209
210 PC_pen_color(0, NULL);
211}
212
213
214/*
215 * 'PC_pen_color()' - Set the pen color...
216 */
217
218void
219PC_pen_color(int num_params, /* I - Number of parameters */
220 param_t *params) /* I - Parameters */
221{
222 int i; /* Looping var */
223 static float standard_colors[8][3] = /* Standard colors for first 8 pens */
224 {
225 { 1.0, 1.0, 1.0 }, /* White */
226 { 0.0, 0.0, 0.0 }, /* Black */
227 { 1.0, 0.0, 0.0 }, /* Red */
228 { 0.0, 1.0, 0.0 }, /* Green */
229 { 1.0, 1.0, 0.0 }, /* Yellow */
230 { 0.0, 0.0, 1.0 }, /* Blue */
231 { 1.0, 0.0, 1.0 }, /* Magenta */
232 { 0.0, 1.0, 1.0 } /* Cyan */
233 };
234
235
236 if (num_params == 0)
237 {
238 for (i = 0; i <= PenCount; i ++)
239 if (i < 8)
240 {
241 Pens[i].rgb[0] = standard_colors[i][0];
242 Pens[i].rgb[1] = standard_colors[i][1];
243 Pens[i].rgb[2] = standard_colors[i][2];
244 }
245 else
246 {
247 Pens[i].rgb[0] = 0.0f;
248 Pens[i].rgb[1] = 0.0f;
249 Pens[i].rgb[2] = 0.0f;
250 }
251
252 if (PageDirty)
253 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
254 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
255 Pens[PenNumber].width * PenScaling);
256 }
257 else if (num_params == 1 || num_params == 4)
258 {
259 i = (int)params[0].value.number;
260
261 if (num_params == 1)
262 {
263 Pens[i].rgb[0] = standard_colors[i & 7][0];
264 Pens[i].rgb[1] = standard_colors[i & 7][1];
265 Pens[i].rgb[2] = standard_colors[i & 7][2];
266 }
267 else
268 {
269 Pens[i].rgb[0] = (params[1].value.number - ColorRange[0][0]) /
270 (ColorRange[0][1] - ColorRange[0][0]);
271 Pens[i].rgb[1] = (params[2].value.number - ColorRange[1][0]) /
272 (ColorRange[1][1] - ColorRange[1][0]);
273 Pens[i].rgb[2] = (params[3].value.number - ColorRange[2][0]) /
274 (ColorRange[2][1] - ColorRange[2][0]);
275
276 fprintf(stderr, "DEBUG: Pen %d %.0f %.0f %.0f = %.3f %.3f %.3f\n",
277 i, params[1].value.number, params[2].value.number,
278 params[3].value.number, Pens[i].rgb[0], Pens[i].rgb[1],
279 Pens[i].rgb[2]);
280 }
281
282 if (PageDirty && i == PenNumber)
283 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
284 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
285 Pens[PenNumber].width * PenScaling);
286 }
287 else
c0e1af83 288 fprintf(stderr,
289 "DEBUG: HP-GL/2 \'PC\' command with invalid number of "
290 "parameters (%d)!\n", num_params);
ef416fc2 291}
292
293
294/*
295 * 'PW_pen_width()' - Set the pen width.
296 */
297
298void
299PW_pen_width(int num_params, /* I - Number of parameters */
300 param_t *params) /* I - Parameters */
301{
302 int pen; /* Pen number */
303 float w; /* Width value */
304
305
306 if (WidthUnits == 0)
307 {
308 /*
309 * Metric...
310 */
311
312 if (num_params == 0)
313 w = 0.35f / 25.4f * 72.0f;
314 else
315 w = params[0].value.number / 25.4f * 72.0f;
316 }
317 else
318 {
319 /*
320 * Relative...
321 */
322
323 w = (float)hypot(PlotSize[0], PlotSize[1]) / 1016.0f * 72.0f;
324
325 if (num_params == 0)
326 w *= 0.01f;
327 else
328 w *= params[0].value.number;
329 }
330
331 if (num_params == 2)
332 {
333 pen = (int)params[1].value.number;
334
335 Pens[pen].width = w;
336
337 if (PageDirty && pen == PenNumber)
338 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
339 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
340 Pens[PenNumber].width * PenScaling);
341 }
342 else if (num_params < 2)
343 {
344 /*
345 * Set width for all pens...
346 */
347
348 for (pen = 0; pen <= PenCount; pen ++)
349 Pens[pen].width = w;
350
351 if (PageDirty)
352 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
353 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
354 Pens[PenNumber].width * PenScaling);
355 }
356 else
c0e1af83 357 fprintf(stderr,
358 "DEBUG: HP-GL/2 \'PW\' command with invalid number of "
359 "parameters (%d)!\n", num_params);
ef416fc2 360}
361
362
363/*
364 * 'RF_raster_fill()' - Set the raster fill pattern.
365 *
366 * Note:
367 *
368 * This needs to be implemented.
369 */
370
371void
372RF_raster_fill(int num_params, /* I - Number of parameters */
373 param_t *params) /* I - Parameters */
374{
375 (void)num_params;
376 (void)params;
377}
378
379
380/*
381 * 'SM_symbol_mode()' - Set where symbols are drawn.
382 */
383
384void
385SM_symbol_mode(int num_params, /* I - Number of parameters */
386 param_t *params) /* I - Parameters */
387{
388 (void)num_params;
389 (void)params;
390}
391
392
393/*
394 * 'SP_select_pen()' - Select a pen for drawing.
395 */
396
397void
398SP_select_pen(int num_params, /* I - Number of parameters */
399 param_t *params) /* I - Parameters */
400{
401 if (num_params == 0)
402 PenNumber = 1;
403 else if (params[0].value.number <= PenCount)
404 PenNumber = (int)params[0].value.number;
405 else
c0e1af83 406 fprintf(stderr,
407 "DEBUG: HP-GL/2 \'SP\' command with invalid number or value "
408 "of parameters (%d, %d)!\n", num_params,
409 (int)params[0].value.number);
ef416fc2 410
411 if (PageDirty)
412 printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
413 Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
414 Pens[PenNumber].width * PenScaling);
415}
416
417
418/*
419 * 'UL_user_line_type()' - Set a user-defined line type.
420 */
421
422void
423UL_user_line_type(int num_params, /* I - Number of parameters */
424 param_t *params) /* I - Parameters */
425{
426 (void)num_params;
427 (void)params;
428}
429
430
431/*
432 * 'WU_width_units()' - Set the units used for pen widths.
433 */
434
435void
436WU_width_units(int num_params, /* I - Number of parameters */
437 param_t *params) /* I - Parameters */
438{
439 if (num_params == 0)
440 WidthUnits = 0;
441 else if (num_params == 1)
442 WidthUnits = (int)params[0].value.number;
443 else
c0e1af83 444 fprintf(stderr,
445 "DEBUG: HP-GL/2 \'WU\' command with invalid number of "
446 "parameters (%d)!\n", num_params);
ef416fc2 447}
448
449
450/*
bc44d920 451 * End of "$Id: hpgl-attr.c 6649 2007-07-11 21:46:42Z mike $".
ef416fc2 452 */