xref: /plan9-contrib/sys/src/cmd/gs/src/gslib.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 1995, 2000 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gslib.c,v 1.15 2004/09/16 08:03:56 igor Exp $ */
187dd7cddfSDavid du Colombier /* Test program for Ghostscript library */
197dd7cddfSDavid du Colombier /* Capture stdin/out/err before gsio.h redefines them. */
207dd7cddfSDavid du Colombier #include "stdio_.h"
217dd7cddfSDavid du Colombier static FILE *real_stdin, *real_stdout, *real_stderr;
227dd7cddfSDavid du Colombier static void
get_real(void)237dd7cddfSDavid du Colombier get_real(void)
247dd7cddfSDavid du Colombier {
257dd7cddfSDavid du Colombier     real_stdin = stdin, real_stdout = stdout, real_stderr = stderr;
267dd7cddfSDavid du Colombier }
277dd7cddfSDavid du Colombier #include "math_.h"
283ff48bf5SDavid du Colombier #include "string_.h"
297dd7cddfSDavid du Colombier #include "gx.h"
307dd7cddfSDavid du Colombier #include "gp.h"
317dd7cddfSDavid du Colombier #include "gsalloc.h"
327dd7cddfSDavid du Colombier #include "gscdefs.h"
337dd7cddfSDavid du Colombier #include "gserrors.h"
347dd7cddfSDavid du Colombier #include "gslib.h"
357dd7cddfSDavid du Colombier #include "gsmatrix.h"
367dd7cddfSDavid du Colombier #include "gsstate.h"
377dd7cddfSDavid du Colombier #include "gscspace.h"
387dd7cddfSDavid du Colombier #include "gscolor2.h"
397dd7cddfSDavid du Colombier #include "gscoord.h"
407dd7cddfSDavid du Colombier #include "gscie.h"
417dd7cddfSDavid du Colombier #include "gscrd.h"
427dd7cddfSDavid du Colombier #include "gsiparm3.h"
437dd7cddfSDavid du Colombier #include "gsiparm4.h"
447dd7cddfSDavid du Colombier #include "gsparam.h"
457dd7cddfSDavid du Colombier #include "gspaint.h"
467dd7cddfSDavid du Colombier #include "gspath.h"
477dd7cddfSDavid du Colombier #include "gspath2.h"
487dd7cddfSDavid du Colombier #include "gsrop.h"
497dd7cddfSDavid du Colombier #include "gsstruct.h"
507dd7cddfSDavid du Colombier #include "gsutil.h"
517dd7cddfSDavid du Colombier #include "gxalloc.h"
527dd7cddfSDavid du Colombier #include "gxdcolor.h"		/* for gx_device_white/black */
537dd7cddfSDavid du Colombier #include "gxdevice.h"
547dd7cddfSDavid du Colombier #include "gxht.h"		/* for gs_halftone */
557dd7cddfSDavid du Colombier #include "gdevbbox.h"
567dd7cddfSDavid du Colombier #include "gdevcmap.h"
577dd7cddfSDavid du Colombier #include "gshtx.h"
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier /* Define whether we are processing captured data. */
607dd7cddfSDavid du Colombier /*#define CAPTURE */
617dd7cddfSDavid du Colombier 
627dd7cddfSDavid du Colombier /* Test programs */
63*593dc095SDavid du Colombier private int test1(gs_state *, gs_memory_t *);	/* kaleidoscope */
64*593dc095SDavid du Colombier private int test2(gs_state *, gs_memory_t *);	/* pattern fill */
65*593dc095SDavid du Colombier private int test3(gs_state *, gs_memory_t *);	/* RasterOp */
66*593dc095SDavid du Colombier private int test4(gs_state *, gs_memory_t *);	/* set resolution */
67*593dc095SDavid du Colombier private int test5(gs_state *, gs_memory_t *);	/* images */
68*593dc095SDavid du Colombier private int test6(gs_state *, gs_memory_t *);	/* CIE API, snapping */
69*593dc095SDavid du Colombier private int test7(gs_state *, gs_memory_t *);	/* non-monot HT */
70*593dc095SDavid du Colombier private int test8(gs_state *, gs_memory_t *);	/* transp patterns */
717dd7cddfSDavid du Colombier 
727dd7cddfSDavid du Colombier #ifdef CAPTURE
737dd7cddfSDavid du Colombier #include "k/capture.c"
74*593dc095SDavid du Colombier private int test10(gs_state *, gs_memory_t *);	/* captured data */
757dd7cddfSDavid du Colombier 
767dd7cddfSDavid du Colombier #endif
77*593dc095SDavid du Colombier private int (*tests[]) (gs_state *, gs_memory_t *) =
787dd7cddfSDavid du Colombier {
797dd7cddfSDavid du Colombier     test1, test2, test3, test4, test5,
807dd7cddfSDavid du Colombier 	test6, test7, test8, 0
817dd7cddfSDavid du Colombier #ifdef CAPTURE
827dd7cddfSDavid du Colombier 	test10
837dd7cddfSDavid du Colombier #endif
847dd7cddfSDavid du Colombier };
857dd7cddfSDavid du Colombier 
867dd7cddfSDavid du Colombier /* Include the extern for the device list. */
877dd7cddfSDavid du Colombier extern_gs_lib_device_list();
887dd7cddfSDavid du Colombier 
897dd7cddfSDavid du Colombier /* Forward references */
90*593dc095SDavid du Colombier private float odsf(floatp, floatp);
913ff48bf5SDavid du Colombier 
923ff48bf5SDavid du Colombier 
937dd7cddfSDavid du Colombier int
main(int argc,const char * argv[])947dd7cddfSDavid du Colombier main(int argc, const char *argv[])
957dd7cddfSDavid du Colombier {
967dd7cddfSDavid du Colombier     char achar;
977dd7cddfSDavid du Colombier     gs_ref_memory_t *imem;
987dd7cddfSDavid du Colombier 
997dd7cddfSDavid du Colombier #define mem ((gs_memory_t *)imem)
1007dd7cddfSDavid du Colombier     gs_state *pgs;
1017dd7cddfSDavid du Colombier     const gx_device *const *list;
1027dd7cddfSDavid du Colombier     gx_device *dev;
1037dd7cddfSDavid du Colombier     gx_device_bbox *bbdev;
1047dd7cddfSDavid du Colombier     int code;
1057dd7cddfSDavid du Colombier 
1067dd7cddfSDavid du Colombier     gp_init();
1077dd7cddfSDavid du Colombier     get_real();
1087dd7cddfSDavid du Colombier     gs_stdin = real_stdin;
1097dd7cddfSDavid du Colombier     gs_stdout = real_stdout;
1107dd7cddfSDavid du Colombier     gs_stderr = real_stderr;
1117dd7cddfSDavid du Colombier     gs_lib_init(stdout);
1127dd7cddfSDavid du Colombier     if (argc < 2 || (achar = argv[1][0]) < '1' ||
1137dd7cddfSDavid du Colombier 	achar > '0' + countof(tests)
1147dd7cddfSDavid du Colombier 	) {
1157dd7cddfSDavid du Colombier 	lprintf1("Usage: gslib 1..%c\n", '0' + countof(tests));
1167dd7cddfSDavid du Colombier 	exit(1);
1177dd7cddfSDavid du Colombier     }
1187dd7cddfSDavid du Colombier     gs_debug['@'] = 1;
1197dd7cddfSDavid du Colombier     gs_debug['?'] = 1;
1207dd7cddfSDavid du Colombier /*gs_debug['B'] = 1; *//****** PATCH ******/
1217dd7cddfSDavid du Colombier /*gs_debug['L'] = 1; *//****** PATCH ******/
1227dd7cddfSDavid du Colombier     imem = ialloc_alloc_state(&gs_memory_default, 20000);
1237dd7cddfSDavid du Colombier     imem->space = 0;
1243ff48bf5SDavid du Colombier     /*
1253ff48bf5SDavid du Colombier      * gs_iodev_init must be called after the rest of the inits, for
1263ff48bf5SDavid du Colombier      * obscure reasons that really should be documented!
1273ff48bf5SDavid du Colombier      */
1283ff48bf5SDavid du Colombier     gs_iodev_init(mem);
1297dd7cddfSDavid du Colombier /****** WRONG ******/
1307dd7cddfSDavid du Colombier     gs_lib_device_list(&list, NULL);
1317dd7cddfSDavid du Colombier     gs_copydevice(&dev, list[0], mem);
132*593dc095SDavid du Colombier     check_device_separable(dev);
1337dd7cddfSDavid du Colombier     gx_device_fill_in_procs(dev);
1347dd7cddfSDavid du Colombier     bbdev =
1357dd7cddfSDavid du Colombier 	gs_alloc_struct_immovable(mem, gx_device_bbox, &st_device_bbox,
1367dd7cddfSDavid du Colombier 				  "bbox");
137*593dc095SDavid du Colombier     gx_device_bbox_init(bbdev, dev, mem);
1387dd7cddfSDavid du Colombier     /* Print out the device name just to test the gsparam.c API. */
1397dd7cddfSDavid du Colombier     {
1407dd7cddfSDavid du Colombier 	gs_c_param_list list;
1417dd7cddfSDavid du Colombier 	gs_param_string nstr;
1427dd7cddfSDavid du Colombier 
1437dd7cddfSDavid du Colombier 	gs_c_param_list_write(&list, mem);
1447dd7cddfSDavid du Colombier 	code = gs_getdeviceparams(dev, (gs_param_list *) & list);
1457dd7cddfSDavid du Colombier 	if (code < 0) {
1467dd7cddfSDavid du Colombier 	    lprintf1("getdeviceparams failed! code = %d\n", code);
1477dd7cddfSDavid du Colombier 	    exit(1);
1487dd7cddfSDavid du Colombier 	}
1497dd7cddfSDavid du Colombier 	gs_c_param_list_read(&list);
1507dd7cddfSDavid du Colombier 	code = param_read_string((gs_param_list *) & list, "Name", &nstr);
1517dd7cddfSDavid du Colombier 	if (code < 0) {
1527dd7cddfSDavid du Colombier 	    lprintf1("reading Name failed! code = %d\n", code);
1537dd7cddfSDavid du Colombier 	    exit(1);
1547dd7cddfSDavid du Colombier 	}
1557dd7cddfSDavid du Colombier 	dputs("Device name = ");
1567dd7cddfSDavid du Colombier 	debug_print_string(nstr.data, nstr.size);
1577dd7cddfSDavid du Colombier 	dputs("\n");
1587dd7cddfSDavid du Colombier 	gs_c_param_list_release(&list);
1597dd7cddfSDavid du Colombier     }
1603ff48bf5SDavid du Colombier     /*
1613ff48bf5SDavid du Colombier      * If this is a device that takes an OutputFile, set the OutputFile
1623ff48bf5SDavid du Colombier      * to "-" in the copy.
1633ff48bf5SDavid du Colombier      */
1643ff48bf5SDavid du Colombier     {
1653ff48bf5SDavid du Colombier 	gs_c_param_list list;
1663ff48bf5SDavid du Colombier 	gs_param_string nstr;
1673ff48bf5SDavid du Colombier 
1683ff48bf5SDavid du Colombier 	gs_c_param_list_write(&list, mem);
1693ff48bf5SDavid du Colombier 	param_string_from_string(nstr, "-");
1703ff48bf5SDavid du Colombier 	code = param_write_string((gs_param_list *)&list, "OutputFile", &nstr);
1713ff48bf5SDavid du Colombier 	if (code < 0) {
1723ff48bf5SDavid du Colombier 	    lprintf1("writing OutputFile failed! code = %d\n", code);
1733ff48bf5SDavid du Colombier 	    exit(1);
1743ff48bf5SDavid du Colombier 	}
1753ff48bf5SDavid du Colombier 	gs_c_param_list_read(&list);
1763ff48bf5SDavid du Colombier 	code = gs_putdeviceparams(dev, (gs_param_list *)&list);
1773ff48bf5SDavid du Colombier 	gs_c_param_list_release(&list);
1783ff48bf5SDavid du Colombier 	if (code < 0 && code != gs_error_undefined) {
1793ff48bf5SDavid du Colombier 	    lprintf1("putdeviceparams failed! code = %d\n", code);
1803ff48bf5SDavid du Colombier 	    exit(1);
1813ff48bf5SDavid du Colombier 	}
1823ff48bf5SDavid du Colombier     }
1837dd7cddfSDavid du Colombier     dev = (gx_device *) bbdev;
1847dd7cddfSDavid du Colombier     pgs = gs_state_alloc(mem);
1857dd7cddfSDavid du Colombier     gs_setdevice_no_erase(pgs, dev);	/* can't erase yet */
1867dd7cddfSDavid du Colombier     {
1877dd7cddfSDavid du Colombier 	gs_point dpi;
1887dd7cddfSDavid du Colombier 	gs_screen_halftone ht;
1897dd7cddfSDavid du Colombier 
1907dd7cddfSDavid du Colombier 	gs_dtransform(pgs, 72.0, 72.0, &dpi);
1917dd7cddfSDavid du Colombier 	ht.frequency = min(fabs(dpi.x), fabs(dpi.y)) / 16.001;
1927dd7cddfSDavid du Colombier 	ht.angle = 0;
1937dd7cddfSDavid du Colombier 	ht.spot_function = odsf;
1947dd7cddfSDavid du Colombier 	gs_setscreen(pgs, &ht);
1957dd7cddfSDavid du Colombier     }
1967dd7cddfSDavid du Colombier     /* gsave and grestore (among other places) assume that */
1977dd7cddfSDavid du Colombier     /* there are at least 2 gstates on the graphics stack. */
1987dd7cddfSDavid du Colombier     /* Ensure that now. */
1997dd7cddfSDavid du Colombier     gs_gsave(pgs);
2007dd7cddfSDavid du Colombier     gs_erasepage(pgs);
2017dd7cddfSDavid du Colombier 
2027dd7cddfSDavid du Colombier     code = (*tests[achar - '1']) (pgs, mem);
2037dd7cddfSDavid du Colombier     gs_output_page(pgs, 1, 1);
2047dd7cddfSDavid du Colombier     {
2057dd7cddfSDavid du Colombier 	gs_rect bbox;
2067dd7cddfSDavid du Colombier 
2077dd7cddfSDavid du Colombier 	gx_device_bbox_bbox(bbdev, &bbox);
2087dd7cddfSDavid du Colombier 	dprintf4("Bounding box: [%g %g %g %g]\n",
2097dd7cddfSDavid du Colombier 		 bbox.p.x, bbox.p.y, bbox.q.x, bbox.q.y);
2107dd7cddfSDavid du Colombier     }
2117dd7cddfSDavid du Colombier     if (code)
2127dd7cddfSDavid du Colombier 	dprintf1("**** Test returned code = %d.\n", code);
2137dd7cddfSDavid du Colombier     dputs("Done.  Press <enter> to exit.");
2143ff48bf5SDavid du Colombier     fgetc(gs_stdin);
2157dd7cddfSDavid du Colombier     gs_lib_finit(0, 0);
2167dd7cddfSDavid du Colombier     return 0;
2177dd7cddfSDavid du Colombier #undef mem
2187dd7cddfSDavid du Colombier }
2197dd7cddfSDavid du Colombier /* Ordered dither spot function */
2207dd7cddfSDavid du Colombier private float
odsf(floatp x,floatp y)2217dd7cddfSDavid du Colombier odsf(floatp x, floatp y)
2227dd7cddfSDavid du Colombier {
2237dd7cddfSDavid du Colombier     static const byte dither[256] =
2247dd7cddfSDavid du Colombier     {
2257dd7cddfSDavid du Colombier 	0x0E, 0x8E, 0x2E, 0xAE, 0x06, 0x86, 0x26, 0xA6, 0x0C, 0x8C, 0x2C, 0xAC, 0x04, 0x84, 0x24, 0xA4,
2267dd7cddfSDavid du Colombier 	0xCE, 0x4E, 0xEE, 0x6E, 0xC6, 0x46, 0xE6, 0x66, 0xCC, 0x4C, 0xEC, 0x6C, 0xC4, 0x44, 0xE4, 0x64,
2277dd7cddfSDavid du Colombier 	0x3E, 0xBE, 0x1E, 0x9E, 0x36, 0xB6, 0x16, 0x96, 0x3C, 0xBC, 0x1C, 0x9C, 0x34, 0xB4, 0x14, 0x94,
2287dd7cddfSDavid du Colombier 	0xFE, 0x7E, 0xDE, 0x5E, 0xF6, 0x76, 0xD6, 0x56, 0xFC, 0x7C, 0xDC, 0x5C, 0xF4, 0x74, 0xD4, 0x54,
2297dd7cddfSDavid du Colombier 	0x01, 0x81, 0x21, 0xA1, 0x09, 0x89, 0x29, 0xA9, 0x03, 0x83, 0x23, 0xA3, 0x0B, 0x8B, 0x2B, 0xAB,
2307dd7cddfSDavid du Colombier 	0xC1, 0x41, 0xE1, 0x61, 0xC9, 0x49, 0xE9, 0x69, 0xC3, 0x43, 0xE3, 0x63, 0xCB, 0x4B, 0xEB, 0x6B,
2317dd7cddfSDavid du Colombier 	0x31, 0xB1, 0x11, 0x91, 0x39, 0xB9, 0x19, 0x99, 0x33, 0xB3, 0x13, 0x93, 0x3B, 0xBB, 0x1B, 0x9B,
2327dd7cddfSDavid du Colombier 	0xF1, 0x71, 0xD1, 0x51, 0xF9, 0x79, 0xD9, 0x59, 0xF3, 0x73, 0xD3, 0x53, 0xFB, 0x7B, 0xDB, 0x5B,
2337dd7cddfSDavid du Colombier 	0x0D, 0x8D, 0x2D, 0xAD, 0x05, 0x85, 0x25, 0xA5, 0x0F, 0x8F, 0x2F, 0xAF, 0x07, 0x87, 0x27, 0xA7,
2347dd7cddfSDavid du Colombier 	0xCD, 0x4D, 0xED, 0x6D, 0xC5, 0x45, 0xE5, 0x65, 0xCF, 0x4F, 0xEF, 0x6F, 0xC7, 0x47, 0xE7, 0x67,
2357dd7cddfSDavid du Colombier 	0x3D, 0xBD, 0x1D, 0x9D, 0x35, 0xB5, 0x15, 0x95, 0x3F, 0xBF, 0x1F, 0x9F, 0x37, 0xB7, 0x17, 0x97,
2367dd7cddfSDavid du Colombier 	0xFD, 0x7D, 0xDD, 0x5D, 0xF5, 0x75, 0xD5, 0x55, 0xFF, 0x7F, 0xDF, 0x5F, 0xF7, 0x77, 0xD7, 0x57,
2377dd7cddfSDavid du Colombier 	0x02, 0x82, 0x22, 0xA2, 0x0A, 0x8A, 0x2A, 0xAA, 0x00, 0x80, 0x20, 0xA0, 0x08, 0x88, 0x28, 0xA8,
2387dd7cddfSDavid du Colombier 	0xC2, 0x42, 0xE2, 0x62, 0xCA, 0x4A, 0xEA, 0x6A, 0xC0, 0x40, 0xE0, 0x60, 0xC8, 0x48, 0xE8, 0x68,
2397dd7cddfSDavid du Colombier 	0x32, 0xB2, 0x12, 0x92, 0x3A, 0xBA, 0x1A, 0x9A, 0x30, 0xB0, 0x10, 0x90, 0x38, 0xB8, 0x18, 0x98,
2407dd7cddfSDavid du Colombier 	0xF2, 0x72, 0xD2, 0x52, 0xFA, 0x7A, 0xDA, 0x5A, 0xF0, 0x70, 0xD0, 0x50, 0xF8, 0x78, 0xD8, 0x58
2417dd7cddfSDavid du Colombier     };
2427dd7cddfSDavid du Colombier     int i = (int)((x + 1) * 7.9999);
2437dd7cddfSDavid du Colombier     int j = (int)((y + 1) * 7.9999);
2447dd7cddfSDavid du Colombier 
2457dd7cddfSDavid du Colombier     return dither[16 * i + j] / 256.0;
2467dd7cddfSDavid du Colombier }
2477dd7cddfSDavid du Colombier 
2487dd7cddfSDavid du Colombier /* Fill a rectangle. */
2497dd7cddfSDavid du Colombier private int
fill_rect1(gs_state * pgs,floatp x,floatp y,floatp w,floatp h)2507dd7cddfSDavid du Colombier fill_rect1(gs_state * pgs, floatp x, floatp y, floatp w, floatp h)
2517dd7cddfSDavid du Colombier {
2527dd7cddfSDavid du Colombier     gs_rect r;
2537dd7cddfSDavid du Colombier 
2547dd7cddfSDavid du Colombier     r.q.x = (r.p.x = x) + w;
2557dd7cddfSDavid du Colombier     r.q.y = (r.p.y = y) + h;
2567dd7cddfSDavid du Colombier     return gs_rectfill(pgs, &r, 1);
2577dd7cddfSDavid du Colombier }
2587dd7cddfSDavid du Colombier 
2597dd7cddfSDavid du Colombier /* Stubs for GC */
2607dd7cddfSDavid du Colombier const gs_ptr_procs_t ptr_struct_procs =
2617dd7cddfSDavid du Colombier {NULL, NULL, NULL};
2627dd7cddfSDavid du Colombier const gs_ptr_procs_t ptr_string_procs =
2637dd7cddfSDavid du Colombier {NULL, NULL, NULL};
2647dd7cddfSDavid du Colombier const gs_ptr_procs_t ptr_const_string_procs =
2657dd7cddfSDavid du Colombier {NULL, NULL, NULL};
2667dd7cddfSDavid du Colombier void *				/* obj_header_t * */
gs_reloc_struct_ptr(const void * obj,gc_state_t * gcst)2677dd7cddfSDavid du Colombier gs_reloc_struct_ptr(const void * /* obj_header_t * */ obj, gc_state_t * gcst)
2687dd7cddfSDavid du Colombier {
2697dd7cddfSDavid du Colombier     return (void *)obj;
2707dd7cddfSDavid du Colombier }
2717dd7cddfSDavid du Colombier void
gs_reloc_string(gs_string * sptr,gc_state_t * gcst)2727dd7cddfSDavid du Colombier gs_reloc_string(gs_string * sptr, gc_state_t * gcst)
2737dd7cddfSDavid du Colombier {
2747dd7cddfSDavid du Colombier }
2757dd7cddfSDavid du Colombier void
gs_reloc_const_string(gs_const_string * sptr,gc_state_t * gcst)2767dd7cddfSDavid du Colombier gs_reloc_const_string(gs_const_string * sptr, gc_state_t * gcst)
2777dd7cddfSDavid du Colombier {
2787dd7cddfSDavid du Colombier }
2797dd7cddfSDavid du Colombier 
2807dd7cddfSDavid du Colombier /* Other stubs */
2817dd7cddfSDavid du Colombier void
gs_to_exit(const gs_memory_t * mem,int exit_status)282*593dc095SDavid du Colombier gs_to_exit(const gs_memory_t *mem, int exit_status)
2837dd7cddfSDavid du Colombier {
284*593dc095SDavid du Colombier     gs_lib_finit(mem, exit_status, 0);
285*593dc095SDavid du Colombier }
286*593dc095SDavid du Colombier 
287*593dc095SDavid du Colombier void
gs_abort(const gs_memory_t * mem)288*593dc095SDavid du Colombier gs_abort(const gs_memory_t *mem)
289*593dc095SDavid du Colombier {
290*593dc095SDavid du Colombier     gs_to_exit(mem, 1); /* cleanup */
291*593dc095SDavid du Colombier     gp_do_exit(1); /* system independent exit() */
2927dd7cddfSDavid du Colombier }
2937dd7cddfSDavid du Colombier 
2947dd7cddfSDavid du Colombier 
2957dd7cddfSDavid du Colombier /* Return the number with the magnitude of x and the sign of y. */
2967dd7cddfSDavid du Colombier /* This is a BSD addition to libm; not all compilers have it. */
2977dd7cddfSDavid du Colombier private double
gs_copysign(floatp x,floatp y)2987dd7cddfSDavid du Colombier gs_copysign(floatp x, floatp y)
2997dd7cddfSDavid du Colombier {
3007dd7cddfSDavid du Colombier    return ( y >= 0  ? fabs(x) : -fabs(x) );
3017dd7cddfSDavid du Colombier }
3027dd7cddfSDavid du Colombier 
3037dd7cddfSDavid du Colombier 
3047dd7cddfSDavid du Colombier /* ---------------- Test program 1 ---------------- */
3057dd7cddfSDavid du Colombier /* Draw a colored kaleidoscope. */
3067dd7cddfSDavid du Colombier 
3077dd7cddfSDavid du Colombier /* Random number generator */
3087dd7cddfSDavid du Colombier private long rand_state = 1;
3097dd7cddfSDavid du Colombier private long
rand(void)3107dd7cddfSDavid du Colombier rand(void)
3117dd7cddfSDavid du Colombier {
3127dd7cddfSDavid du Colombier #define A 16807
3137dd7cddfSDavid du Colombier #define M 0x7fffffff
3147dd7cddfSDavid du Colombier #define Q 127773		/* M / A */
3157dd7cddfSDavid du Colombier #define R 2836			/* M % A */
3167dd7cddfSDavid du Colombier     rand_state = A * (rand_state % Q) - R * (rand_state / Q);
3177dd7cddfSDavid du Colombier     /* Note that rand_state cannot be 0 here. */
3187dd7cddfSDavid du Colombier     if (rand_state <= 0)
3197dd7cddfSDavid du Colombier 	rand_state += M;
3207dd7cddfSDavid du Colombier #undef A
3217dd7cddfSDavid du Colombier #undef M
3227dd7cddfSDavid du Colombier #undef Q
3237dd7cddfSDavid du Colombier #undef R
3247dd7cddfSDavid du Colombier     return rand_state;
3257dd7cddfSDavid du Colombier }
3267dd7cddfSDavid du Colombier private int
test1(gs_state * pgs,gs_memory_t * mem)3277dd7cddfSDavid du Colombier test1(gs_state * pgs, gs_memory_t * mem)
3287dd7cddfSDavid du Colombier {
3297dd7cddfSDavid du Colombier     int n;
3307dd7cddfSDavid du Colombier 
3317dd7cddfSDavid du Colombier     gs_scale(pgs, 72.0, 72.0);
3327dd7cddfSDavid du Colombier     gs_translate(pgs, 4.25, 5.5);
3337dd7cddfSDavid du Colombier     gs_scale(pgs, 4.0, 4.0);
3347dd7cddfSDavid du Colombier     gs_newpath(pgs);
3357dd7cddfSDavid du Colombier     for (n = 200; --n >= 0;) {
3367dd7cddfSDavid du Colombier 	int j;
3377dd7cddfSDavid du Colombier 
3387dd7cddfSDavid du Colombier #define rf() (rand() / (1.0 * 0x10000 * 0x8000))
3397dd7cddfSDavid du Colombier 	double r = rf(), g = rf(), b = rf();
3407dd7cddfSDavid du Colombier 	double x0 = rf(), y0 = rf(), x1 = rf(), y1 = rf(), x2 = rf(), y2 = rf();
3417dd7cddfSDavid du Colombier 
3427dd7cddfSDavid du Colombier 	gs_setrgbcolor(pgs, r, g, b);
3437dd7cddfSDavid du Colombier 	for (j = 0; j < 6; j++) {
3447dd7cddfSDavid du Colombier 	    gs_gsave(pgs);
3457dd7cddfSDavid du Colombier 	    gs_rotate(pgs, 60.0 * j);
3467dd7cddfSDavid du Colombier 	    gs_moveto(pgs, x0, y0);
3477dd7cddfSDavid du Colombier 	    gs_lineto(pgs, x1, y1);
3487dd7cddfSDavid du Colombier 	    gs_lineto(pgs, x2, y2);
3497dd7cddfSDavid du Colombier 	    gs_fill(pgs);
3507dd7cddfSDavid du Colombier 	    gs_grestore(pgs);
3517dd7cddfSDavid du Colombier 	}
3527dd7cddfSDavid du Colombier     }
3537dd7cddfSDavid du Colombier #undef mem
3547dd7cddfSDavid du Colombier     return 0;
3557dd7cddfSDavid du Colombier }
3567dd7cddfSDavid du Colombier 
3577dd7cddfSDavid du Colombier /* ---------------- Test program 2 ---------------- */
3587dd7cddfSDavid du Colombier /* Fill an area with a pattern. */
3597dd7cddfSDavid du Colombier 
3607dd7cddfSDavid du Colombier private int
test2(gs_state * pgs,gs_memory_t * mem)3617dd7cddfSDavid du Colombier test2(gs_state * pgs, gs_memory_t * mem)
3627dd7cddfSDavid du Colombier {
3637dd7cddfSDavid du Colombier     gs_client_color cc;
3647dd7cddfSDavid du Colombier     gx_tile_bitmap tile;
3657dd7cddfSDavid du Colombier     /*const */ byte tpdata[] =
3667dd7cddfSDavid du Colombier     {
3677dd7cddfSDavid du Colombier     /* Define a pattern that looks like this:
3687dd7cddfSDavid du Colombier        ..xxxx
3697dd7cddfSDavid du Colombier        .....x
3707dd7cddfSDavid du Colombier        .....x
3717dd7cddfSDavid du Colombier        ..xxxx
3727dd7cddfSDavid du Colombier        .x....
3737dd7cddfSDavid du Colombier        x.....
3747dd7cddfSDavid du Colombier      */
3757dd7cddfSDavid du Colombier 	0x3c, 0, 0, 0, 0x04, 0, 0, 0, 0x04, 0, 0, 0, 0x3c, 0, 0, 0,
3767dd7cddfSDavid du Colombier 	0x40, 0, 0, 0, 0x80, 0, 0, 0
3777dd7cddfSDavid du Colombier     };
3787dd7cddfSDavid du Colombier 
3797dd7cddfSDavid du Colombier     gs_newpath(pgs);
3807dd7cddfSDavid du Colombier     gs_moveto(pgs, 100.0, 300.0);
3817dd7cddfSDavid du Colombier     gs_lineto(pgs, 500.0, 500.0);
3827dd7cddfSDavid du Colombier     gs_lineto(pgs, 200.0, 100.0);
3837dd7cddfSDavid du Colombier     gs_lineto(pgs, 300.0, 500.0);
3847dd7cddfSDavid du Colombier     gs_lineto(pgs, 500.0, 200.0);
3857dd7cddfSDavid du Colombier     gs_closepath(pgs);
3867dd7cddfSDavid du Colombier     gs_setrgbcolor(pgs, 0.0, 0.0, 0.0);
3877dd7cddfSDavid du Colombier     gs_gsave(pgs);
3887dd7cddfSDavid du Colombier     gs_fill(pgs);
3897dd7cddfSDavid du Colombier     gs_grestore(pgs);
3907dd7cddfSDavid du Colombier     tile.data = tpdata;
3917dd7cddfSDavid du Colombier     tile.raster = 4;
3927dd7cddfSDavid du Colombier     tile.size.x = tile.rep_width = 6;
3937dd7cddfSDavid du Colombier     tile.size.y = tile.rep_height = 6;
3947dd7cddfSDavid du Colombier     tile.id = gx_no_bitmap_id;
3957dd7cddfSDavid du Colombier     gs_makebitmappattern(&cc, &tile, true, pgs, NULL);
3967dd7cddfSDavid du Colombier     /* Note: color space is DeviceRGB */
3977dd7cddfSDavid du Colombier     cc.paint.values[0] = 0.0;
3987dd7cddfSDavid du Colombier     cc.paint.values[1] = 1.0;
3997dd7cddfSDavid du Colombier     cc.paint.values[2] = 1.0;
4007dd7cddfSDavid du Colombier     gs_setpattern(pgs, &cc);
4017dd7cddfSDavid du Colombier     gs_eofill(pgs);
4027dd7cddfSDavid du Colombier     gs_makebitmappattern(&cc, &tile, false, pgs, NULL);
4037dd7cddfSDavid du Colombier     gs_setcolor(pgs, &cc);
4047dd7cddfSDavid du Colombier     gs_moveto(pgs, 50.0, 50.0);
4057dd7cddfSDavid du Colombier     gs_lineto(pgs, 300.0, 50.0);
4067dd7cddfSDavid du Colombier     gs_lineto(pgs, 50.0, 300.0);
4077dd7cddfSDavid du Colombier     gs_closepath(pgs);
4087dd7cddfSDavid du Colombier     gs_setrgbcolor(pgs, 1.0, 0.0, 0.0);
4097dd7cddfSDavid du Colombier     gs_gsave(pgs);
4107dd7cddfSDavid du Colombier     gs_fill(pgs);
4117dd7cddfSDavid du Colombier     gs_grestore(pgs);
4127dd7cddfSDavid du Colombier     gs_setpattern(pgs, &cc);
4137dd7cddfSDavid du Colombier     gs_eofill(pgs);
4147dd7cddfSDavid du Colombier     return 0;
4157dd7cddfSDavid du Colombier }
4167dd7cddfSDavid du Colombier 
4177dd7cddfSDavid du Colombier /* ---------------- Test program 3 ---------------- */
4187dd7cddfSDavid du Colombier /* Exercise RasterOp a little. */
4197dd7cddfSDavid du Colombier /* Currently, this only works with monobit devices. */
4207dd7cddfSDavid du Colombier 
4217dd7cddfSDavid du Colombier private int
test3(gs_state * pgs,gs_memory_t * mem)4227dd7cddfSDavid du Colombier test3(gs_state * pgs, gs_memory_t * mem)
4237dd7cddfSDavid du Colombier {
4247dd7cddfSDavid du Colombier     gx_device *dev = gs_currentdevice(pgs);
4257dd7cddfSDavid du Colombier     gx_color_index black = gx_device_black(dev);
4267dd7cddfSDavid du Colombier     gx_color_index white = gx_device_white(dev);
4277dd7cddfSDavid du Colombier     gx_color_index black2[2];
4287dd7cddfSDavid du Colombier     gx_color_index black_white[2];
4297dd7cddfSDavid du Colombier     gx_color_index white_black[2];
4307dd7cddfSDavid du Colombier     long pattern[max(align_bitmap_mod / sizeof(long), 1) * 4];
4317dd7cddfSDavid du Colombier 
4327dd7cddfSDavid du Colombier #define pbytes ((byte *)pattern)
4337dd7cddfSDavid du Colombier     gx_tile_bitmap tile;
4347dd7cddfSDavid du Colombier 
4357dd7cddfSDavid du Colombier     black2[0] = black2[1] = black;
4367dd7cddfSDavid du Colombier     black_white[0] = white_black[1] = black;
4377dd7cddfSDavid du Colombier     black_white[1] = white_black[0] = white;
4387dd7cddfSDavid du Colombier     pbytes[0] = 0xf0;
4397dd7cddfSDavid du Colombier     pbytes[align_bitmap_mod] = 0x90;
4407dd7cddfSDavid du Colombier     pbytes[align_bitmap_mod * 2] = 0x90;
4417dd7cddfSDavid du Colombier     pbytes[align_bitmap_mod * 3] = 0xf0;
4427dd7cddfSDavid du Colombier     tile.data = pbytes;
4437dd7cddfSDavid du Colombier     tile.raster = align_bitmap_mod;
4447dd7cddfSDavid du Colombier     tile.size.x = tile.size.y = 4;
4457dd7cddfSDavid du Colombier     tile.id = gs_next_ids(1);
4467dd7cddfSDavid du Colombier     tile.rep_width = tile.rep_height = 4;
4477dd7cddfSDavid du Colombier     (*dev_proc(dev, copy_rop))
4487dd7cddfSDavid du Colombier 	(dev, NULL, 0, 0, gx_no_bitmap_id, black2,
4497dd7cddfSDavid du Colombier 	 &tile, white_black, 100, 100, 150, 150, 0, 0, rop3_T);
4507dd7cddfSDavid du Colombier     (*dev_proc(dev, copy_rop))
4517dd7cddfSDavid du Colombier 	(dev, NULL, 0, 0, gx_no_bitmap_id, black2,
4527dd7cddfSDavid du Colombier 	 NULL, NULL, 120, 120, 110, 110, 0, 0, ~rop3_S & rop3_1);
4537dd7cddfSDavid du Colombier     (*dev_proc(dev, copy_rop))
4547dd7cddfSDavid du Colombier 	(dev, NULL, 0, 0, gx_no_bitmap_id, black2,
4557dd7cddfSDavid du Colombier 	 &tile, white_black, 110, 110, 130, 130, 0, 0, rop3_T ^ rop3_D);
4567dd7cddfSDavid du Colombier #undef pbytes
4577dd7cddfSDavid du Colombier     return 0;
4587dd7cddfSDavid du Colombier }
4597dd7cddfSDavid du Colombier 
4607dd7cddfSDavid du Colombier /* ---------------- Test program 4 ---------------- */
4617dd7cddfSDavid du Colombier /* Set the resolution dynamically. */
4627dd7cddfSDavid du Colombier 
4637dd7cddfSDavid du Colombier private int
test4(gs_state * pgs,gs_memory_t * mem)4647dd7cddfSDavid du Colombier test4(gs_state * pgs, gs_memory_t * mem)
4657dd7cddfSDavid du Colombier {
4667dd7cddfSDavid du Colombier     gs_c_param_list list;
4677dd7cddfSDavid du Colombier     float resv[2];
4687dd7cddfSDavid du Colombier     gs_param_float_array ares;
4697dd7cddfSDavid du Colombier     int code;
4707dd7cddfSDavid du Colombier     gx_device *dev = gs_currentdevice(pgs);
4717dd7cddfSDavid du Colombier 
4727dd7cddfSDavid du Colombier     gs_c_param_list_write(&list, mem);
4737dd7cddfSDavid du Colombier     resv[0] = resv[1] = 100;
4747dd7cddfSDavid du Colombier     ares.data = resv;
4757dd7cddfSDavid du Colombier     ares.size = 2;
4767dd7cddfSDavid du Colombier     ares.persistent = true;
4777dd7cddfSDavid du Colombier     code = param_write_float_array((gs_param_list *) & list,
4787dd7cddfSDavid du Colombier 				   "HWResolution", &ares);
4797dd7cddfSDavid du Colombier     if (code < 0) {
4807dd7cddfSDavid du Colombier 	lprintf1("Writing HWResolution failed: %d\n", code);
4817dd7cddfSDavid du Colombier 	exit(1);
4827dd7cddfSDavid du Colombier     }
4837dd7cddfSDavid du Colombier     gs_c_param_list_read(&list);
4847dd7cddfSDavid du Colombier     code = gs_putdeviceparams(dev, (gs_param_list *) & list);
4857dd7cddfSDavid du Colombier     gs_c_param_list_release(&list);
4867dd7cddfSDavid du Colombier     if (code < 0) {
4877dd7cddfSDavid du Colombier 	lprintf1("Setting HWResolution failed: %d\n", code);
4887dd7cddfSDavid du Colombier 	exit(1);
4897dd7cddfSDavid du Colombier     }
4907dd7cddfSDavid du Colombier     gs_initmatrix(pgs);
4917dd7cddfSDavid du Colombier     gs_initclip(pgs);
4927dd7cddfSDavid du Colombier     if (code == 1) {
4937dd7cddfSDavid du Colombier 	code = (*dev_proc(dev, open_device)) (dev);
4947dd7cddfSDavid du Colombier 	if (code < 0) {
4957dd7cddfSDavid du Colombier 	    lprintf1("Reopening device failed: %d\n", code);
4967dd7cddfSDavid du Colombier 	    exit(1);
4977dd7cddfSDavid du Colombier 	}
4987dd7cddfSDavid du Colombier     }
4997dd7cddfSDavid du Colombier     gs_moveto(pgs, 0.0, 72.0);
5007dd7cddfSDavid du Colombier     gs_rlineto(pgs, 72.0, 0.0);
5017dd7cddfSDavid du Colombier     gs_rlineto(pgs, 0.0, 72.0);
5027dd7cddfSDavid du Colombier     gs_closepath(pgs);
5037dd7cddfSDavid du Colombier     gs_stroke(pgs);
5047dd7cddfSDavid du Colombier     return 0;
5057dd7cddfSDavid du Colombier }
5067dd7cddfSDavid du Colombier 
5077dd7cddfSDavid du Colombier /* ---------------- Test program 5 ---------------- */
5087dd7cddfSDavid du Colombier /* Test masked (and non-masked) images. */
5097dd7cddfSDavid du Colombier 
5107dd7cddfSDavid du Colombier private int
test5(gs_state * pgs,gs_memory_t * mem)5117dd7cddfSDavid du Colombier test5(gs_state * pgs, gs_memory_t * mem)
5127dd7cddfSDavid du Colombier {
5137dd7cddfSDavid du Colombier     gx_device *dev = gs_currentdevice(pgs);
5147dd7cddfSDavid du Colombier     gx_image_enum_common_t *info;
5157dd7cddfSDavid du Colombier     gx_image_plane_t planes[5];
5167dd7cddfSDavid du Colombier     gx_drawing_color dcolor;
5177dd7cddfSDavid du Colombier     int code;
5187dd7cddfSDavid du Colombier     static const byte data3[] =
5197dd7cddfSDavid du Colombier     {
5207dd7cddfSDavid du Colombier 	0x00, 0x44, 0x88, 0xcc,
5217dd7cddfSDavid du Colombier 	0x44, 0x88, 0xcc, 0x00,
5227dd7cddfSDavid du Colombier 	0x88, 0xcc, 0x00, 0x44,
5237dd7cddfSDavid du Colombier 	0xcc, 0x00, 0x44, 0x88
5247dd7cddfSDavid du Colombier     };
525*593dc095SDavid du Colombier     gs_color_space gray_cs;
526*593dc095SDavid du Colombier 
527*593dc095SDavid du Colombier     gs_cspace_init_DeviceGray(&gray_cs);
5287dd7cddfSDavid du Colombier 
5297dd7cddfSDavid du Colombier     /*
5307dd7cddfSDavid du Colombier      * Neither ImageType 3 nor 4 needs a current color,
5317dd7cddfSDavid du Colombier      * but some intermediate code assumes it's valid.
5327dd7cddfSDavid du Colombier      */
533*593dc095SDavid du Colombier     set_nonclient_dev_color(&dcolor, 0);
5347dd7cddfSDavid du Colombier 
5357dd7cddfSDavid du Colombier     /* Scale everything up, and fill the background. */
5367dd7cddfSDavid du Colombier     {
5377dd7cddfSDavid du Colombier 	gs_matrix mat;
5387dd7cddfSDavid du Colombier 
5397dd7cddfSDavid du Colombier 	gs_currentmatrix(pgs, &mat);
5407dd7cddfSDavid du Colombier 	mat.xx = gs_copysign(98.6, mat.xx);
5417dd7cddfSDavid du Colombier 	mat.yy = gs_copysign(98.6, mat.yy);
5427dd7cddfSDavid du Colombier 	mat.tx = floor(mat.tx) + 0.499;
5437dd7cddfSDavid du Colombier 	mat.ty = floor(mat.ty) + 0.499;
5447dd7cddfSDavid du Colombier 	gs_setmatrix(pgs, &mat);
5457dd7cddfSDavid du Colombier     }
5467dd7cddfSDavid du Colombier     gs_setrgbcolor(pgs, 1.0, 0.9, 0.9);
5477dd7cddfSDavid du Colombier     fill_rect1(pgs, 0.25, 0.25, 4.0, 6.0);
5487dd7cddfSDavid du Colombier     gs_setrgbcolor(pgs, 0.5, 1.0, 0.5);
5497dd7cddfSDavid du Colombier 
5507dd7cddfSDavid du Colombier #if 0
5517dd7cddfSDavid du Colombier     /* Make things a little more interesting.... */
5527dd7cddfSDavid du Colombier     gs_translate(pgs, 1.0, 1.0);
5537dd7cddfSDavid du Colombier     gs_rotate(pgs, 10.0);
5547dd7cddfSDavid du Colombier     gs_scale(pgs, 1.3, 0.9);
5557dd7cddfSDavid du Colombier #endif
5567dd7cddfSDavid du Colombier 
5577dd7cddfSDavid du Colombier #define do_image(image, idata)\
5587dd7cddfSDavid du Colombier   BEGIN\
5597dd7cddfSDavid du Colombier   code = gx_device_begin_typed_image(dev, (gs_imager_state *)pgs, NULL,\
5607dd7cddfSDavid du Colombier      (gs_image_common_t *)&image, NULL, &dcolor, NULL, mem, &info);\
5617dd7cddfSDavid du Colombier   /****** TEST code >= 0 ******/\
5627dd7cddfSDavid du Colombier   planes[0].data = idata;\
5637dd7cddfSDavid du Colombier   planes[0].data_x = 0;\
5647dd7cddfSDavid du Colombier   planes[0].raster = (image.Height * image.BitsPerComponent + 7) >> 3;\
5657dd7cddfSDavid du Colombier   code = gx_image_plane_data(info, planes, image.Height);\
5667dd7cddfSDavid du Colombier   /****** TEST code == 1 ******/\
5677dd7cddfSDavid du Colombier   code = gx_image_end(info, true);\
5687dd7cddfSDavid du Colombier   /****** TEST code >= 0 ******/\
5697dd7cddfSDavid du Colombier   END
5707dd7cddfSDavid du Colombier 
5717dd7cddfSDavid du Colombier #define W 4
5727dd7cddfSDavid du Colombier #define H 4
5737dd7cddfSDavid du Colombier 
5747dd7cddfSDavid du Colombier     /* Test an unmasked image. */
5757dd7cddfSDavid du Colombier     gs_gsave(pgs);
5767dd7cddfSDavid du Colombier     {
5777dd7cddfSDavid du Colombier 	gs_image1_t image1;
5787dd7cddfSDavid du Colombier 	void *info1;
579*593dc095SDavid du Colombier         gs_color_space cs;
5807dd7cddfSDavid du Colombier 
581*593dc095SDavid du Colombier         gs_cspace_init_DeviceGray(&cs);
582*593dc095SDavid du Colombier 	gs_image_t_init(&image1, &cs);
5837dd7cddfSDavid du Colombier 	/* image */
5847dd7cddfSDavid du Colombier 	image1.ImageMatrix.xx = W;
5857dd7cddfSDavid du Colombier 	image1.ImageMatrix.yy = -H;
5867dd7cddfSDavid du Colombier 	image1.ImageMatrix.ty = H;
5877dd7cddfSDavid du Colombier 	/* data_image */
5887dd7cddfSDavid du Colombier 	image1.Width = W;
5897dd7cddfSDavid du Colombier 	image1.Height = H;
5907dd7cddfSDavid du Colombier 	image1.BitsPerComponent = 8;
5917dd7cddfSDavid du Colombier 
5927dd7cddfSDavid du Colombier 	gs_translate(pgs, 0.5, 4.0);
5937dd7cddfSDavid du Colombier 	code = gx_device_begin_image(dev, (gs_imager_state *) pgs,
5947dd7cddfSDavid du Colombier 				     &image1, gs_image_format_chunky,
5957dd7cddfSDavid du Colombier 				     NULL, &dcolor, NULL, mem, &info1);
5967dd7cddfSDavid du Colombier /****** TEST code >= 0 ******/
5977dd7cddfSDavid du Colombier 	planes[0].data = data3;
5987dd7cddfSDavid du Colombier 	planes[0].data_x = 0;
5997dd7cddfSDavid du Colombier 	planes[0].raster =
6007dd7cddfSDavid du Colombier 	    (image1.Height * image1.BitsPerComponent + 7) >> 3;
6017dd7cddfSDavid du Colombier 	/* Use the old image_data API. */
6027dd7cddfSDavid du Colombier 	code = gx_image_data(info1, &planes[0].data, 0,
6037dd7cddfSDavid du Colombier 			     planes[0].raster, image1.Height);
6047dd7cddfSDavid du Colombier /****** TEST code == 1 ******/
6057dd7cddfSDavid du Colombier 	code = gx_image_end(info1, true);
6067dd7cddfSDavid du Colombier /****** TEST code >= 0 ******/
6077dd7cddfSDavid du Colombier     }
6087dd7cddfSDavid du Colombier     gs_grestore(pgs);
6097dd7cddfSDavid du Colombier 
6107dd7cddfSDavid du Colombier     /* Test an explicitly masked image. */
6117dd7cddfSDavid du Colombier     gs_gsave(pgs);
6127dd7cddfSDavid du Colombier     {
6137dd7cddfSDavid du Colombier 	gs_image3_t image3;
6147dd7cddfSDavid du Colombier 	static const byte data3mask[] =
6157dd7cddfSDavid du Colombier 	{
6167dd7cddfSDavid du Colombier 	    0x60,
6177dd7cddfSDavid du Colombier 	    0x90,
6187dd7cddfSDavid du Colombier 	    0x90,
6197dd7cddfSDavid du Colombier 	    0x60
6207dd7cddfSDavid du Colombier 	};
6217dd7cddfSDavid du Colombier 	static const byte data3x2mask[] =
6227dd7cddfSDavid du Colombier 	{
6237dd7cddfSDavid du Colombier 	    0x66,
6247dd7cddfSDavid du Colombier 	    0x99,
6257dd7cddfSDavid du Colombier 	    0x99,
6267dd7cddfSDavid du Colombier 	    0x66,
6277dd7cddfSDavid du Colombier 	    0x66,
6287dd7cddfSDavid du Colombier 	    0x99,
6297dd7cddfSDavid du Colombier 	    0x99,
6307dd7cddfSDavid du Colombier 	    0x66
6317dd7cddfSDavid du Colombier 	};
6327dd7cddfSDavid du Colombier 
633*593dc095SDavid du Colombier 	gs_image3_t_init(&image3, &gray_cs, interleave_scan_lines);
6347dd7cddfSDavid du Colombier 	/* image */
6357dd7cddfSDavid du Colombier 	image3.ImageMatrix.xx = W;
6367dd7cddfSDavid du Colombier 	image3.ImageMatrix.yy = -H;
6377dd7cddfSDavid du Colombier 	image3.ImageMatrix.ty = H;
6387dd7cddfSDavid du Colombier 	/* data_image */
6397dd7cddfSDavid du Colombier 	image3.Width = W;
6407dd7cddfSDavid du Colombier 	image3.Height = H;
6417dd7cddfSDavid du Colombier 	image3.BitsPerComponent = 8;
6427dd7cddfSDavid du Colombier 	/* MaskDict */
6437dd7cddfSDavid du Colombier 	image3.MaskDict.ImageMatrix = image3.ImageMatrix;
6447dd7cddfSDavid du Colombier 	image3.MaskDict.Width = image3.Width;
6457dd7cddfSDavid du Colombier 	image3.MaskDict.Height = image3.Height;
6467dd7cddfSDavid du Colombier 
6477dd7cddfSDavid du Colombier 	/* Display with 1-for-1 mask and image. */
6487dd7cddfSDavid du Colombier 	gs_translate(pgs, 0.5, 2.0);
6497dd7cddfSDavid du Colombier 	code = gx_device_begin_typed_image(dev, (gs_imager_state *) pgs,
6507dd7cddfSDavid du Colombier 				       NULL, (gs_image_common_t *) & image3,
6517dd7cddfSDavid du Colombier 					   NULL, &dcolor, NULL, mem, &info);
6527dd7cddfSDavid du Colombier /****** TEST code >= 0 ******/
6537dd7cddfSDavid du Colombier 	planes[0].data = data3mask;
6547dd7cddfSDavid du Colombier 	planes[0].data_x = 0;
6557dd7cddfSDavid du Colombier 	planes[0].raster = (image3.MaskDict.Height + 7) >> 3;
6567dd7cddfSDavid du Colombier 	planes[1].data = data3;
6577dd7cddfSDavid du Colombier 	planes[1].data_x = 0;
6587dd7cddfSDavid du Colombier 	planes[1].raster =
6597dd7cddfSDavid du Colombier 	    (image3.Height * image3.BitsPerComponent + 7) >> 3;
6607dd7cddfSDavid du Colombier 	code = gx_image_plane_data(info, planes, image3.Height);
6617dd7cddfSDavid du Colombier /****** TEST code == 1 ******/
6627dd7cddfSDavid du Colombier 	code = gx_image_end(info, true);
6637dd7cddfSDavid du Colombier /****** TEST code >= 0 ******/
6647dd7cddfSDavid du Colombier 
6657dd7cddfSDavid du Colombier 	/* Display with 2-for-1 mask and image. */
6667dd7cddfSDavid du Colombier 	image3.MaskDict.ImageMatrix.xx *= 2;
6677dd7cddfSDavid du Colombier 	image3.MaskDict.ImageMatrix.yy *= 2;
6687dd7cddfSDavid du Colombier 	image3.MaskDict.ImageMatrix.ty *= 2;
6697dd7cddfSDavid du Colombier 	image3.MaskDict.Width *= 2;
6707dd7cddfSDavid du Colombier 	image3.MaskDict.Height *= 2;
6717dd7cddfSDavid du Colombier 	gs_translate(pgs, 1.5, 0.0);
6727dd7cddfSDavid du Colombier 	code = gx_device_begin_typed_image(dev, (gs_imager_state *) pgs,
6737dd7cddfSDavid du Colombier 				       NULL, (gs_image_common_t *) & image3,
6747dd7cddfSDavid du Colombier 					   NULL, &dcolor, NULL, mem, &info);
6757dd7cddfSDavid du Colombier /****** TEST code >= 0 ******/
6767dd7cddfSDavid du Colombier 	planes[0].data = data3x2mask;
6777dd7cddfSDavid du Colombier 	planes[0].raster = (image3.MaskDict.Width + 7) >> 3;
6787dd7cddfSDavid du Colombier 	{
6797dd7cddfSDavid du Colombier 	    int i;
6807dd7cddfSDavid du Colombier 
6817dd7cddfSDavid du Colombier 	    for (i = 0; i < H; ++i) {
6827dd7cddfSDavid du Colombier 		planes[1].data = 0;
6837dd7cddfSDavid du Colombier 		code = gx_image_plane_data(info, planes, 1);
6847dd7cddfSDavid du Colombier 		planes[0].data += planes[0].raster;
6857dd7cddfSDavid du Colombier /****** TEST code == 0 ******/
6867dd7cddfSDavid du Colombier 		planes[1].data = data3 + i * planes[1].raster;
6877dd7cddfSDavid du Colombier 		code = gx_image_plane_data(info, planes, 1);
6887dd7cddfSDavid du Colombier 		planes[0].data += planes[0].raster;
6897dd7cddfSDavid du Colombier /****** TEST code >= 0 ******/
6907dd7cddfSDavid du Colombier 	    }
6917dd7cddfSDavid du Colombier 	}
6927dd7cddfSDavid du Colombier /****** TEST code == 1 ******/
6937dd7cddfSDavid du Colombier 	code = gx_image_end(info, true);
6947dd7cddfSDavid du Colombier /****** TEST code >= 0 ******/
6957dd7cddfSDavid du Colombier     }
6967dd7cddfSDavid du Colombier     gs_grestore(pgs);
6977dd7cddfSDavid du Colombier 
6987dd7cddfSDavid du Colombier     /* Test a chroma-keyed masked image. */
6997dd7cddfSDavid du Colombier     gs_gsave(pgs);
7007dd7cddfSDavid du Colombier     {
7017dd7cddfSDavid du Colombier 	gs_image4_t image4;
7027dd7cddfSDavid du Colombier 	const byte *data4 = data3;
7037dd7cddfSDavid du Colombier 
704*593dc095SDavid du Colombier 	gs_image4_t_init(&image4, &gray_cs);
7057dd7cddfSDavid du Colombier 	/* image */
7067dd7cddfSDavid du Colombier 	image4.ImageMatrix.xx = W;
7077dd7cddfSDavid du Colombier 	image4.ImageMatrix.yy = -H;
7087dd7cddfSDavid du Colombier 	image4.ImageMatrix.ty = H;
7097dd7cddfSDavid du Colombier 	/* data_image */
7107dd7cddfSDavid du Colombier 	image4.Width = W;
7117dd7cddfSDavid du Colombier 	image4.Height = H;
7127dd7cddfSDavid du Colombier 	image4.BitsPerComponent = 8;
7137dd7cddfSDavid du Colombier 
7147dd7cddfSDavid du Colombier 	/* Display with a single mask color. */
7157dd7cddfSDavid du Colombier 	gs_translate(pgs, 0.5, 0.5);
7167dd7cddfSDavid du Colombier 	image4.MaskColor_is_range = false;
7177dd7cddfSDavid du Colombier 	image4.MaskColor[0] = 0xcc;
7187dd7cddfSDavid du Colombier 	do_image(image4, data4);
7197dd7cddfSDavid du Colombier 
7207dd7cddfSDavid du Colombier 	/* Display a second time with a color range. */
7217dd7cddfSDavid du Colombier 	gs_translate(pgs, 1.5, 0.0);
7227dd7cddfSDavid du Colombier 	image4.MaskColor_is_range = true;
7237dd7cddfSDavid du Colombier 	image4.MaskColor[0] = 0x40;
7247dd7cddfSDavid du Colombier 	image4.MaskColor[1] = 0x90;
7257dd7cddfSDavid du Colombier 	do_image(image4, data4);
7267dd7cddfSDavid du Colombier     }
7277dd7cddfSDavid du Colombier     gs_grestore(pgs);
7287dd7cddfSDavid du Colombier 
7297dd7cddfSDavid du Colombier #undef W
7307dd7cddfSDavid du Colombier #undef H
7317dd7cddfSDavid du Colombier #undef do_image
7327dd7cddfSDavid du Colombier     return 0;
7337dd7cddfSDavid du Colombier }
7347dd7cddfSDavid du Colombier 
7357dd7cddfSDavid du Colombier /* ---------------- Test program 6 ---------------- */
7367dd7cddfSDavid du Colombier /* Test the C API for CIE CRDs, and color snapping. */
7377dd7cddfSDavid du Colombier 
7387dd7cddfSDavid du Colombier private void
spectrum(gs_state * pgs,int n)7397dd7cddfSDavid du Colombier spectrum(gs_state * pgs, int n)
7407dd7cddfSDavid du Colombier {
7417dd7cddfSDavid du Colombier     float den = n;
7427dd7cddfSDavid du Colombier     float den1 = n - 1;
7437dd7cddfSDavid du Colombier     float den2 = (n * 2 - 1) * n;
7447dd7cddfSDavid du Colombier     int a, b, c;
7457dd7cddfSDavid du Colombier 
7467dd7cddfSDavid du Colombier     for (a = 0; a < n; ++a)
7477dd7cddfSDavid du Colombier 	for (b = 0; b < n; ++b)
7487dd7cddfSDavid du Colombier 	    for (c = 0; c < n; ++c) {
7497dd7cddfSDavid du Colombier 		double size = (n * 2 - c * 2 - 1) / den2;
7507dd7cddfSDavid du Colombier 		gs_client_color cc;
7517dd7cddfSDavid du Colombier 
7527dd7cddfSDavid du Colombier 		cc.paint.values[0] = a / den1;
7537dd7cddfSDavid du Colombier 		cc.paint.values[1] = b / den1;
7547dd7cddfSDavid du Colombier 		cc.paint.values[2] = c / den1;
7557dd7cddfSDavid du Colombier 		gs_setcolor(pgs, &cc);
7567dd7cddfSDavid du Colombier 		fill_rect1(pgs,
7577dd7cddfSDavid du Colombier 			   a / den + c / den2, b / den + c / den2,
7587dd7cddfSDavid du Colombier 			   size, size);
7597dd7cddfSDavid du Colombier 	    }
7607dd7cddfSDavid du Colombier }
7617dd7cddfSDavid du Colombier private float
render_abc(floatp v,const gs_cie_render * ignore_crd)7627dd7cddfSDavid du Colombier render_abc(floatp v, const gs_cie_render * ignore_crd)
7637dd7cddfSDavid du Colombier {
7647dd7cddfSDavid du Colombier     return v / 2;
7657dd7cddfSDavid du Colombier }
7667dd7cddfSDavid du Colombier private int
set_cmap_method(gx_device_cmap * cmdev,gx_device_color_mapping_method_t method,gs_state * pgs,gs_memory_t * mem)7677dd7cddfSDavid du Colombier set_cmap_method(gx_device_cmap *cmdev, gx_device_color_mapping_method_t method,
7687dd7cddfSDavid du Colombier 		gs_state *pgs, gs_memory_t *mem)
7697dd7cddfSDavid du Colombier {
7707dd7cddfSDavid du Colombier     gs_c_param_list list;
7717dd7cddfSDavid du Colombier     int cmm = method;
7727dd7cddfSDavid du Colombier 
7737dd7cddfSDavid du Colombier     gs_c_param_list_write(&list, mem);
7747dd7cddfSDavid du Colombier     param_write_int((gs_param_list *)&list, "ColorMappingMethod", &cmm);
7757dd7cddfSDavid du Colombier     gs_c_param_list_read(&list);
7767dd7cddfSDavid du Colombier     gs_putdeviceparams((gx_device *)cmdev, (gs_param_list *)&list);
7777dd7cddfSDavid du Colombier     gs_c_param_list_release(&list);
7787dd7cddfSDavid du Colombier     gs_setdevice_no_init(pgs, (gx_device *)cmdev);
7797dd7cddfSDavid du Colombier     return 0;
7807dd7cddfSDavid du Colombier }
7817dd7cddfSDavid du Colombier private int
test6(gs_state * pgs,gs_memory_t * mem)7827dd7cddfSDavid du Colombier test6(gs_state * pgs, gs_memory_t * mem)
7837dd7cddfSDavid du Colombier {
7847dd7cddfSDavid du Colombier     gs_color_space *pcs;
7857dd7cddfSDavid du Colombier     gs_cie_abc *pabc;
7867dd7cddfSDavid du Colombier     gs_cie_render *pcrd;
7877dd7cddfSDavid du Colombier     static const gs_vector3 white_point =
7887dd7cddfSDavid du Colombier     {1, 1, 1};
7897dd7cddfSDavid du Colombier     static const gs_cie_render_proc3 encode_abc =
7907dd7cddfSDavid du Colombier     {
7917dd7cddfSDavid du Colombier 	{render_abc, render_abc, render_abc}
7927dd7cddfSDavid du Colombier     };
7937dd7cddfSDavid du Colombier     gx_device_cmap *cmdev;
7947dd7cddfSDavid du Colombier     int code;
795*593dc095SDavid du Colombier     gs_color_space rgb_cs;
796*593dc095SDavid du Colombier 
797*593dc095SDavid du Colombier     gs_cspace_init_DeviceRGB(&rgb_cs);
7987dd7cddfSDavid du Colombier 
7997dd7cddfSDavid du Colombier     gs_scale(pgs, 150.0, 150.0);
8007dd7cddfSDavid du Colombier     gs_translate(pgs, 0.5, 0.5);
801*593dc095SDavid du Colombier     gs_setcolorspace(pgs, &rgb_cs);
8027dd7cddfSDavid du Colombier     spectrum(pgs, 5);
8037dd7cddfSDavid du Colombier     gs_translate(pgs, 1.2, 0.0);
8047dd7cddfSDavid du Colombier     /* We must set the CRD before the color space. */
8057dd7cddfSDavid du Colombier     code = gs_cie_render1_build(&pcrd, mem, "test6");
8067dd7cddfSDavid du Colombier     if (code < 0)
8077dd7cddfSDavid du Colombier 	return code;
8087dd7cddfSDavid du Colombier     gs_cie_render1_initialize(pcrd, NULL, &white_point, NULL,
8097dd7cddfSDavid du Colombier 			      NULL, NULL, NULL,
8107dd7cddfSDavid du Colombier 			      NULL, NULL, NULL,
8117dd7cddfSDavid du Colombier 			      NULL, &encode_abc, NULL,
8127dd7cddfSDavid du Colombier 			      NULL);
8137dd7cddfSDavid du Colombier     gs_setcolorrendering(pgs, pcrd);
8147dd7cddfSDavid du Colombier     gs_cspace_build_CIEABC(&pcs, NULL, mem);
8157dd7cddfSDavid du Colombier     /* There should be an API for initializing CIE color spaces too.... */
8167dd7cddfSDavid du Colombier     pabc = pcs->params.abc;
8177dd7cddfSDavid du Colombier     pabc->common.points.WhitePoint = white_point;
8187dd7cddfSDavid du Colombier     gs_cie_abc_complete(pabc);
8197dd7cddfSDavid du Colombier     /* End of initializing the color space. */
8207dd7cddfSDavid du Colombier     gs_setcolorspace(pgs, pcs);
8217dd7cddfSDavid du Colombier     spectrum(pgs, 5);
8227dd7cddfSDavid du Colombier     /* Now test color snapping. */
8237dd7cddfSDavid du Colombier     cmdev =
8247dd7cddfSDavid du Colombier 	gs_alloc_struct_immovable(mem, gx_device_cmap, &st_device_cmap,
8257dd7cddfSDavid du Colombier 				  "cmap device");
8267dd7cddfSDavid du Colombier     gdev_cmap_init(cmdev, gs_currentdevice(pgs),
8277dd7cddfSDavid du Colombier 		   device_cmap_snap_to_primaries);
8287dd7cddfSDavid du Colombier     gs_setdevice_no_init(pgs, (gx_device *) cmdev);
8297dd7cddfSDavid du Colombier     gs_setrgbcolor(pgs, 0.0, 0.0, 0.0);		/* back to DeviceRGB space */
8307dd7cddfSDavid du Colombier     gs_translate(pgs, -1.2, 1.2);
8317dd7cddfSDavid du Colombier     spectrum(pgs, 5);
8327dd7cddfSDavid du Colombier     gs_translate(pgs, 1.2, 0.0);
8337dd7cddfSDavid du Colombier     set_cmap_method(cmdev, device_cmap_monochrome, pgs, mem);
8347dd7cddfSDavid du Colombier     spectrum(pgs, 5);
8357dd7cddfSDavid du Colombier     gs_translate(pgs, -1.2, 1.2);
8367dd7cddfSDavid du Colombier     set_cmap_method(cmdev, device_cmap_color_to_black_over_white, pgs, mem);
8377dd7cddfSDavid du Colombier     spectrum(pgs, 5);
8387dd7cddfSDavid du Colombier     return 0;
8397dd7cddfSDavid du Colombier }
8407dd7cddfSDavid du Colombier 
8417dd7cddfSDavid du Colombier /* ---------------- Test program 7 ---------------- */
8427dd7cddfSDavid du Colombier /* Test the C API for non-monotonic halftones. */
8437dd7cddfSDavid du Colombier 
8447dd7cddfSDavid du Colombier private int
test7(gs_state * pgs,gs_memory_t * mem)8457dd7cddfSDavid du Colombier test7(gs_state * pgs, gs_memory_t * mem)
8467dd7cddfSDavid du Colombier {
8477dd7cddfSDavid du Colombier     /* Define a non-monotonic 4 x 4 halftone with 4 gray levels. */
8487dd7cddfSDavid du Colombier     static const byte masks[1 * 4 * 4] =
8497dd7cddfSDavid du Colombier     {
8507dd7cddfSDavid du Colombier     /* 0% */
8517dd7cddfSDavid du Colombier 	0x00, 0x00, 0x00, 0x00,
8527dd7cddfSDavid du Colombier     /* 25% */
8537dd7cddfSDavid du Colombier 	0x80, 0x40, 0x20, 0x10,
8547dd7cddfSDavid du Colombier     /* 50% */
8557dd7cddfSDavid du Colombier 	0xa0, 0xa0, 0x50, 0x50,
8567dd7cddfSDavid du Colombier     /* 75% */
8577dd7cddfSDavid du Colombier 	0xd0, 0xe0, 0x70, 0xb0
8587dd7cddfSDavid du Colombier     };
8597dd7cddfSDavid du Colombier     gs_ht *pht;
8607dd7cddfSDavid du Colombier     int code;
8617dd7cddfSDavid du Colombier     int i;
8627dd7cddfSDavid du Colombier 
8637dd7cddfSDavid du Colombier     /* Fabricate a Type 5 halftone. */
8647dd7cddfSDavid du Colombier     code = gs_ht_build(&pht, 1, mem);
8657dd7cddfSDavid du Colombier     dprintf1("ht build code = %d\n", code);
866*593dc095SDavid du Colombier     code = gs_ht_set_mask_comp(pht, 0,
8677dd7cddfSDavid du Colombier 			       4, 4, 4, masks, NULL, NULL);
8687dd7cddfSDavid du Colombier     dprintf1("set mask code = %d\n", code);
8697dd7cddfSDavid du Colombier     code = gs_sethalftone(pgs, pht);
8707dd7cddfSDavid du Colombier     dprintf1("sethalftone code = %d\n", code);
8717dd7cddfSDavid du Colombier     for (i = 0; i <= 4; ++i) {
8727dd7cddfSDavid du Colombier 	gs_setgray(pgs, i / 4.0);
8737dd7cddfSDavid du Colombier 	fill_rect1(pgs, 100 + i * 100, 100, 50, 50);
8747dd7cddfSDavid du Colombier     }
8757dd7cddfSDavid du Colombier     return 0;
8767dd7cddfSDavid du Colombier }
8777dd7cddfSDavid du Colombier 
8787dd7cddfSDavid du Colombier /* ---------------- Test program 8 ---------------- */
8797dd7cddfSDavid du Colombier /* Test partially transparent patterns */
8807dd7cddfSDavid du Colombier 
8817dd7cddfSDavid du Colombier private int
test8(gs_state * pgs,gs_memory_t * mem)8827dd7cddfSDavid du Colombier test8(gs_state * pgs, gs_memory_t * mem)
8837dd7cddfSDavid du Colombier {
8847dd7cddfSDavid du Colombier     /*
8857dd7cddfSDavid du Colombier      * Define a 16 x 16 pattern using a 4-entry palette
8867dd7cddfSDavid du Colombier      * (white, red, green, black).
8877dd7cddfSDavid du Colombier      */
8887dd7cddfSDavid du Colombier     static const byte pdata[] =
8897dd7cddfSDavid du Colombier     {
8907dd7cddfSDavid du Colombier 	0x7f, 0xff, 0x00, 0x03,
8917dd7cddfSDavid du Colombier 	0x7f, 0xff, 0x00, 0x0c,
8927dd7cddfSDavid du Colombier 	0x50, 0x00, 0x00, 0x30,
8937dd7cddfSDavid du Colombier 	0x50, 0x00, 0x00, 0xc0,
8947dd7cddfSDavid du Colombier 	0x50, 0x00, 0x03, 0x00,
8957dd7cddfSDavid du Colombier 	0x50, 0x00, 0x0c, 0x00,
8967dd7cddfSDavid du Colombier 	0x50, 0x00, 0x30, 0x00,
8977dd7cddfSDavid du Colombier 	0x50, 0x00, 0xc0, 0x00,
8987dd7cddfSDavid du Colombier 	0xf0, 0x00, 0xc0, 0x00,
8997dd7cddfSDavid du Colombier 	0xf0, 0x00, 0x30, 0x00,
9007dd7cddfSDavid du Colombier 	0xf0, 0x00, 0x0c, 0x00,
9017dd7cddfSDavid du Colombier 	0xf0, 0x00, 0x03, 0x00,
9027dd7cddfSDavid du Colombier 	0xf0, 0x00, 0x00, 0xc0,
9037dd7cddfSDavid du Colombier 	0xf0, 0x00, 0x00, 0x30,
9047dd7cddfSDavid du Colombier 	0xea, 0x55, 0xaa, 0x5c,
9057dd7cddfSDavid du Colombier 	0xea, 0x55, 0xaa, 0x57,
9067dd7cddfSDavid du Colombier     };
9077dd7cddfSDavid du Colombier     gs_depth_bitmap ptile;
9087dd7cddfSDavid du Colombier     gs_const_string table;
9097dd7cddfSDavid du Colombier     gs_color_space *pcs;
9107dd7cddfSDavid du Colombier     gs_client_color ccolor;
911*593dc095SDavid du Colombier     gs_color_space rgb_cs;
912*593dc095SDavid du Colombier 
913*593dc095SDavid du Colombier     gs_cspace_init_DeviceRGB(&rgb_cs);
9147dd7cddfSDavid du Colombier 
9157dd7cddfSDavid du Colombier     table.data =
9167dd7cddfSDavid du Colombier 	(const byte *)"\377\377\377\377\000\000\000\377\000\000\000\000";
9177dd7cddfSDavid du Colombier     table.size = 12;
918*593dc095SDavid du Colombier     gs_cspace_build_Indexed(&pcs, &rgb_cs, 4, &table, mem);
9197dd7cddfSDavid du Colombier     ptile.data = pdata;
9207dd7cddfSDavid du Colombier     ptile.raster = 4;
9217dd7cddfSDavid du Colombier     ptile.size.x = ptile.size.y = 16;
9227dd7cddfSDavid du Colombier     ptile.id = gs_no_bitmap_id;
9237dd7cddfSDavid du Colombier     ptile.pix_depth = 2;
9247dd7cddfSDavid du Colombier     ptile.num_comps = 1;
9257dd7cddfSDavid du Colombier     gs_makepixmappattern(&ccolor, &ptile, false /*mask */ , NULL /*pmat */ ,
9267dd7cddfSDavid du Colombier 			 gs_no_id, pcs, 0 /*white_index */ , pgs, mem);
9277dd7cddfSDavid du Colombier     {
9287dd7cddfSDavid du Colombier 	gs_rect r;
9297dd7cddfSDavid du Colombier 
9307dd7cddfSDavid du Colombier 	r.p.x = 100;
9317dd7cddfSDavid du Colombier 	r.p.y = 100;
9327dd7cddfSDavid du Colombier 	r.q.x = 200;
9337dd7cddfSDavid du Colombier 	r.q.y = 200;
9347dd7cddfSDavid du Colombier 	gs_setrgbcolor(pgs, 1.0, 1.0, 0.0);
9357dd7cddfSDavid du Colombier 	gs_rectfill(pgs, &r, 1);
9367dd7cddfSDavid du Colombier 	gs_setpattern(pgs, &ccolor);
9377dd7cddfSDavid du Colombier 	gs_settexturetransparent(pgs, true);
9387dd7cddfSDavid du Colombier 	gs_rectfill(pgs, &r, 1);
9397dd7cddfSDavid du Colombier 	r.p.x += 150;
9407dd7cddfSDavid du Colombier 	r.q.x += 150;
9417dd7cddfSDavid du Colombier 	gs_setrgbcolor(pgs, 1.0, 1.0, 0.0);
9427dd7cddfSDavid du Colombier 	gs_rectfill(pgs, &r, 1);
9437dd7cddfSDavid du Colombier 	gs_setpattern(pgs, &ccolor);
9447dd7cddfSDavid du Colombier 	gs_settexturetransparent(pgs, false);
9457dd7cddfSDavid du Colombier 	gs_rectfill(pgs, &r, 1);
9467dd7cddfSDavid du Colombier     }
9477dd7cddfSDavid du Colombier     return 0;
9487dd7cddfSDavid du Colombier }
9497dd7cddfSDavid du Colombier 
9507dd7cddfSDavid du Colombier 
9517dd7cddfSDavid du Colombier #ifdef CAPTURE
9527dd7cddfSDavid du Colombier 
9537dd7cddfSDavid du Colombier /* ---------------- Test program 10 ---------------- */
9547dd7cddfSDavid du Colombier /* Replay captured data for printer output. */
9557dd7cddfSDavid du Colombier 
9567dd7cddfSDavid du Colombier private const char outfile[] = "t.pbm";
9577dd7cddfSDavid du Colombier private const float ypage_wid = 11.0;
9587dd7cddfSDavid du Colombier private const float xpage_len = 17.0;
9597dd7cddfSDavid du Colombier private const int rotate_value = 0;
9607dd7cddfSDavid du Colombier private const float scale_x = 0.45;
9617dd7cddfSDavid du Colombier private const float scale_y = 0.45;
9627dd7cddfSDavid du Colombier private const float xmove_origin = 0.0;
9637dd7cddfSDavid du Colombier private const float ymove_origin = 0.0;
9647dd7cddfSDavid du Colombier 
9657dd7cddfSDavid du Colombier private int
test10(gs_state * pgs,gs_memory_t * mem)9667dd7cddfSDavid du Colombier test10(gs_state * pgs, gs_memory_t * mem)
9677dd7cddfSDavid du Colombier {
9687dd7cddfSDavid du Colombier     gs_c_param_list list;
9697dd7cddfSDavid du Colombier     gs_param_string nstr, OFstr;
9707dd7cddfSDavid du Colombier     gs_param_float_array PSa;
9717dd7cddfSDavid du Colombier     gs_param_float_array HWRa;
9727dd7cddfSDavid du Colombier     gs_param_int_array HWSa;
9737dd7cddfSDavid du Colombier     int HWSize[2];
9747dd7cddfSDavid du Colombier     float HWResolution[2], PageSize[2];
9757dd7cddfSDavid du Colombier     long MaxBitmap;
9767dd7cddfSDavid du Colombier     int code;
9777dd7cddfSDavid du Colombier     gx_device *dev = gs_currentdevice(pgs);
9787dd7cddfSDavid du Colombier     float xlate_x, xlate_y;
9797dd7cddfSDavid du Colombier     gs_rect cliprect;
9807dd7cddfSDavid du Colombier 
9817dd7cddfSDavid du Colombier     gs_c_param_list_write(&list, mem);
9827dd7cddfSDavid du Colombier     code = gs_getdeviceparams(dev, (gs_param_list *) & list);
9837dd7cddfSDavid du Colombier     if (code < 0) {
9847dd7cddfSDavid du Colombier 	lprintf1("getdeviceparams failed! code = %d\n", code);
9857dd7cddfSDavid du Colombier 	exit(1);
9867dd7cddfSDavid du Colombier     }
9877dd7cddfSDavid du Colombier     gs_c_param_list_read(&list);
9887dd7cddfSDavid du Colombier     code = param_read_string((gs_param_list *) & list, "Name", &nstr);
9897dd7cddfSDavid du Colombier     if (code < 0) {
9907dd7cddfSDavid du Colombier 	lprintf1("reading Name failed! code = %d\n", code);
9917dd7cddfSDavid du Colombier 	exit(1);
9927dd7cddfSDavid du Colombier     }
9937dd7cddfSDavid du Colombier     code = param_read_int_array((gs_param_list *) & list,
9947dd7cddfSDavid du Colombier 				"HWSize", &HWSa);
9957dd7cddfSDavid du Colombier     if (code < 0) {
9967dd7cddfSDavid du Colombier 	lprintf1("reading HWSize failed! code = %d\n", code);
9977dd7cddfSDavid du Colombier 	exit(1);
9987dd7cddfSDavid du Colombier     }
9997dd7cddfSDavid du Colombier     eprintf3("HWSize[%d] = [ %d, %d ]\n", HWSa.size,
10007dd7cddfSDavid du Colombier 	     HWSa.data[0], HWSa.data[1]);
10017dd7cddfSDavid du Colombier     code = param_read_float_array((gs_param_list *) & list,
10027dd7cddfSDavid du Colombier 				  "HWResolution", &HWRa);
10037dd7cddfSDavid du Colombier     if (code < 0) {
10047dd7cddfSDavid du Colombier 	lprintf1("reading Resolution failed! code = %d\n", code);
10057dd7cddfSDavid du Colombier 	exit(1);
10067dd7cddfSDavid du Colombier     }
10077dd7cddfSDavid du Colombier     eprintf3("HWResolution[%d] = [ %f, %f ]\n", HWRa.size,
10087dd7cddfSDavid du Colombier 	     HWRa.data[0], HWRa.data[1]);
10097dd7cddfSDavid du Colombier     code = param_read_float_array((gs_param_list *) & list,
10107dd7cddfSDavid du Colombier 				  "PageSize", &PSa);
10117dd7cddfSDavid du Colombier     if (code < 0) {
10127dd7cddfSDavid du Colombier 	lprintf1("reading PageSize failed! code = %d\n", code);
10137dd7cddfSDavid du Colombier 	exit(1);
10147dd7cddfSDavid du Colombier     }
10157dd7cddfSDavid du Colombier     eprintf3("PageSize[%d] = [ %f, %f ]\n", PSa.size,
10167dd7cddfSDavid du Colombier 	     PSa.data[0], PSa.data[1]);
10177dd7cddfSDavid du Colombier     code = param_read_long((gs_param_list *) & list,
10187dd7cddfSDavid du Colombier 			   "MaxBitmap", &MaxBitmap);
10197dd7cddfSDavid du Colombier     if (code < 0) {
10207dd7cddfSDavid du Colombier 	lprintf1("reading MaxBitmap failed! code = %d\n", code);
10217dd7cddfSDavid du Colombier 	exit(1);
10227dd7cddfSDavid du Colombier     }
10237dd7cddfSDavid du Colombier     eprintf1("MaxBitmap = %ld\n", MaxBitmap);
10247dd7cddfSDavid du Colombier     /* Switch to param list functions to "write" */
10257dd7cddfSDavid du Colombier     gs_c_param_list_write(&list, mem);
10267dd7cddfSDavid du Colombier     /* Always set the PageSize. */
10277dd7cddfSDavid du Colombier     PageSize[0] = 72.0 * ypage_wid;
10287dd7cddfSDavid du Colombier     PageSize[1] = 72.0 * xpage_len;
10297dd7cddfSDavid du Colombier     PSa.data = PageSize;
10307dd7cddfSDavid du Colombier     code = param_write_float_array((gs_param_list *) & list,
10317dd7cddfSDavid du Colombier 				   "PageSize", &PSa);
10327dd7cddfSDavid du Colombier     if (nstr.data[0] != 'v') {
10337dd7cddfSDavid du Colombier 	/* Set the OutputFile string file name */
10347dd7cddfSDavid du Colombier 	OFstr.persistent = false;
10357dd7cddfSDavid du Colombier 	OFstr.data = outfile;
10367dd7cddfSDavid du Colombier 	OFstr.size = strlen(outfile);
10377dd7cddfSDavid du Colombier 	code = param_write_string((gs_param_list *) & list,
10387dd7cddfSDavid du Colombier 				  "OutputFile", &OFstr);
10397dd7cddfSDavid du Colombier 	if (code < 0) {
10407dd7cddfSDavid du Colombier 	    lprintf1("setting OutputFile name failed, code=%d\n",
10417dd7cddfSDavid du Colombier 		     code);
10427dd7cddfSDavid du Colombier 	    exit(1);
10437dd7cddfSDavid du Colombier 	}
10447dd7cddfSDavid du Colombier 	if (nstr.data[0] == 'x') {
10457dd7cddfSDavid du Colombier 	    HWResolution[0] = HWResolution[1] = 72.0;
10467dd7cddfSDavid du Colombier 	} else {
10477dd7cddfSDavid du Colombier 	    HWResolution[0] = HWResolution[1] = 360.0;
10487dd7cddfSDavid du Colombier 	}
10497dd7cddfSDavid du Colombier 	HWRa.data = HWResolution;
10507dd7cddfSDavid du Colombier 	HWSize[0] = (int)(HWResolution[0] * ypage_wid);
10517dd7cddfSDavid du Colombier 	HWSize[1] = (int)(HWResolution[1] * xpage_len);
10527dd7cddfSDavid du Colombier 	eprintf3("	HWSize = [%d,%d], HWResolution = %f dpi\n",
10537dd7cddfSDavid du Colombier 		 HWSize[0], HWSize[1], HWResolution[0]);
10547dd7cddfSDavid du Colombier 	HWSa.data = HWSize;
10557dd7cddfSDavid du Colombier 	code = param_write_float_array((gs_param_list *) & list,
10567dd7cddfSDavid du Colombier 				       "HWResolution", &HWRa);
10577dd7cddfSDavid du Colombier 	code = param_write_int_array((gs_param_list *) & list,
10587dd7cddfSDavid du Colombier 				     "HWSize", &HWSa);
10597dd7cddfSDavid du Colombier 	MaxBitmap = 1000000L;
10607dd7cddfSDavid du Colombier 	code = param_write_long((gs_param_list *) & list,
10617dd7cddfSDavid du Colombier 				"MaxBitmap", &MaxBitmap);
10627dd7cddfSDavid du Colombier     }
10637dd7cddfSDavid du Colombier     gs_c_param_list_read(&list);
10647dd7cddfSDavid du Colombier     code = gs_putdeviceparams(dev, (gs_param_list *) & list);
10657dd7cddfSDavid du Colombier     eprintf1("putdeviceparams: code=%d\n", code);
10667dd7cddfSDavid du Colombier     gs_c_param_list_release(&list);
10677dd7cddfSDavid du Colombier 
1068*593dc095SDavid du Colombier     /* note: initgraphics no longer resets the color or color space */
10697dd7cddfSDavid du Colombier     gs_erasepage(pgs);
10707dd7cddfSDavid du Colombier     gs_initgraphics(pgs);
1071*593dc095SDavid du Colombier     {
1072*593dc095SDavid du Colombier         gs_color_space cs;
1073*593dc095SDavid du Colombier 
1074*593dc095SDavid du Colombier         gs_cspace_init_DeviceGray(&cs);
1075*593dc095SDavid du Colombier         gs_setcolorspace(pgs, &cs);
1076*593dc095SDavid du Colombier     }
1077*593dc095SDavid du Colombier 
10787dd7cddfSDavid du Colombier     gs_clippath(pgs);
10797dd7cddfSDavid du Colombier     gs_pathbbox(pgs, &cliprect);
10807dd7cddfSDavid du Colombier     eprintf4("	cliprect = [[%g,%g],[%g,%g]]\n",
10817dd7cddfSDavid du Colombier 	     cliprect.p.x, cliprect.p.y, cliprect.q.x, cliprect.q.y);
10827dd7cddfSDavid du Colombier     gs_newpath(pgs);
10837dd7cddfSDavid du Colombier 
10847dd7cddfSDavid du Colombier     switch (((rotate_value + 270) / 90) & 3) {
10857dd7cddfSDavid du Colombier 	default:
10867dd7cddfSDavid du Colombier 	case 0:		/* 0 = 360 degrees in PS == 90 degrees in printer */
10877dd7cddfSDavid du Colombier 	    xlate_x = cliprect.p.x;
10887dd7cddfSDavid du Colombier 	    xlate_y = cliprect.p.y;
10897dd7cddfSDavid du Colombier 	    break;
10907dd7cddfSDavid du Colombier 	case 1:		/* 90 degrees in PS = 180 degrees printer */
10917dd7cddfSDavid du Colombier 	    xlate_x = cliprect.q.x;
10927dd7cddfSDavid du Colombier 	    xlate_y = cliprect.p.y;
10937dd7cddfSDavid du Colombier 	    break;
10947dd7cddfSDavid du Colombier 	case 2:		/* 180 degrees in PS == 270 degrees in printer */
10957dd7cddfSDavid du Colombier 	    xlate_x = cliprect.q.x;
10967dd7cddfSDavid du Colombier 	    xlate_y = cliprect.q.y;
10977dd7cddfSDavid du Colombier 	    break;
10987dd7cddfSDavid du Colombier 	case 3:		/* 270 degrees in PS == 0 degrees in printer */
10997dd7cddfSDavid du Colombier 	    xlate_x = cliprect.p.x;
11007dd7cddfSDavid du Colombier 	    xlate_y = cliprect.q.y;
11017dd7cddfSDavid du Colombier 	    break;
11027dd7cddfSDavid du Colombier     }
11037dd7cddfSDavid du Colombier     eprintf2("translate origin to [ %f, %f ]\n", xlate_x, xlate_y);
11047dd7cddfSDavid du Colombier     gs_translate(pgs, xlate_x, xlate_y);
11057dd7cddfSDavid du Colombier 
11067dd7cddfSDavid du Colombier     /* further move (before rotate) by user requested amount */
11077dd7cddfSDavid du Colombier     gs_translate(pgs, 72.0 * (float)xmove_origin, 72.0 * (float)ymove_origin);
11087dd7cddfSDavid du Colombier 
11097dd7cddfSDavid du Colombier     gs_rotate(pgs, (float)rotate_value + 270.0);
11107dd7cddfSDavid du Colombier     gs_scale(pgs, scale_x * 72.0 / 2032.0,
11117dd7cddfSDavid du Colombier 	     scale_y * 72.0 / 2032.0);
11127dd7cddfSDavid du Colombier     gs_setlinecap(pgs, gs_cap_butt);
11137dd7cddfSDavid du Colombier     gs_setlinejoin(pgs, gs_join_bevel);
11147dd7cddfSDavid du Colombier     gs_setfilladjust(pgs, 0.0, 0.0);
11157dd7cddfSDavid du Colombier 
11167dd7cddfSDavid du Colombier     capture_exec(pgs);
11177dd7cddfSDavid du Colombier     return 0;
11187dd7cddfSDavid du Colombier }
11197dd7cddfSDavid du Colombier 
11207dd7cddfSDavid du Colombier #endif /* CAPTURE */
1121