diff options
Diffstat (limited to 'pcl/pgcolor.c')
-rw-r--r-- | pcl/pgcolor.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/pcl/pgcolor.c b/pcl/pgcolor.c new file mode 100644 index 000000000..30f6602c9 --- /dev/null +++ b/pcl/pgcolor.c @@ -0,0 +1,116 @@ +/* Portions Copyright (C) 2001 artofcode LLC. + Portions Copyright (C) 1996, 2001 Artifex Software Inc. + Portions Copyright (C) 1988, 2000 Aladdin Enterprises. + This software is based in part on the work of the Independent JPEG Group. + All Rights Reserved. + + This software is distributed under license and may not be copied, modified + or distributed except as expressly authorized under the terms of that + license. Refer to licensing information at http://www.artifex.com/ or + contact Artifex Software, Inc., 101 Lucas Valley Road #110, + San Rafael, CA 94903, (415)492-9861, for further information. */ +/*$Id$ */ + +/* pgcolor.c - HP-GL/2 color vector graphics commands */ + +#include "std.h" +#include "pcparse.h" +#include "pgmand.h" +#include "pginit.h" +#include "pgmisc.h" +#include "pgdraw.h" +#include "gsstate.h" /* for gs_setfilladjust */ +#include "pcpalet.h" + +/* ------ Commands ------ */ + +/* + * PC [pen[,primary1,primary2,primary3]; + */ + static int +hpgl_PC( + hpgl_args_t * pargs, + hpgl_state_t * pgls +) +{ + int32 pen; + int32 npen = pcl_palette_get_num_entries(pgls->ppalet); + + if ( pgls->personality == pcl5e ) + return 0; + + /* output any current path */ + hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector)); + + if (hpgl_arg_int(pgls->memory, pargs, &pen)) { + hpgl_real_t primary[3]; + + if ((pen < 0) || (pen >= npen)) + return e_Range; + + if (hpgl_arg_c_real(pgls->memory, pargs, &primary[0])) { + float comps[3]; + + if ( !hpgl_arg_c_real(pgls->memory, pargs, &primary[1]) || + !hpgl_arg_c_real(pgls->memory, pargs, &primary[2]) ) + return e_Range; + comps[0] = primary[0]; + comps[1] = primary[1]; + comps[2] = primary[2]; + return pcl_palette_set_color(pgls, pen, comps); + } else + return pcl_palette_set_default_color(pgls, pen); + } else { + int i; + int code; + + for (i = 0; i < npen; ++i) { + if ((code = pcl_palette_set_default_color(pgls, i)) < 0) + return code; + } + } + + return 0; +} + +/* + * NP [n]; + */ + int +hpgl_NP( + hpgl_args_t * pargs, + hpgl_state_t * pgls +) +{ + int32 n = 8; + + if ( pgls->personality == pcl5e ) + return 0; + + /* output any current path */ + hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector)); + + if ( hpgl_arg_int(pgls->memory, pargs, &n) && ((n < 2) || (n > 32768)) ) + return e_Range; + return pcl_palette_NP(pgls, n); +} + +/* + * Initialization. There is no reset or copy command, as those operations are + * carried out by the palette mechanism. + */ + static int +pgcolor_do_registration( + pcl_parser_state_t *pcl_parser_state, + gs_memory_t *mem +) +{ + /* Register commands */ + DEFINE_HPGL_COMMANDS(mem) + HPGL_COMMAND('N', 'P', hpgl_NP, hpgl_cdf_pcl_rtl_both), + HPGL_COMMAND('P', 'C', hpgl_PC, hpgl_cdf_pcl_rtl_both), + END_HPGL_COMMANDS + return 0; +} + +const pcl_init_t pgcolor_init = { pgcolor_do_registration, 0, 0 }; |