xref: /plan9-contrib/sys/src/cmd/gs/src/gdevtrac.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 2000 Aladdin Enterprises.  All rights reserved.
23ff48bf5SDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
53ff48bf5SDavid 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.
93ff48bf5SDavid 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.
153ff48bf5SDavid du Colombier */
163ff48bf5SDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gdevtrac.c,v 1.5 2003/06/06 17:50:27 igor Exp $ */
183ff48bf5SDavid du Colombier /* Tracing device (including sample high-level implementation) */
193ff48bf5SDavid du Colombier #include "gx.h"
203ff48bf5SDavid du Colombier #include "gserrors.h"
213ff48bf5SDavid du Colombier #include "gscspace.h"
223ff48bf5SDavid du Colombier #include "gxdevice.h"
233ff48bf5SDavid du Colombier #include "gxtmap.h"		/* for gxdht.h */
243ff48bf5SDavid du Colombier #include "gxdht.h"
253ff48bf5SDavid du Colombier #include "gxfont.h"
263ff48bf5SDavid du Colombier #include "gxiparam.h"
273ff48bf5SDavid du Colombier #include "gxistate.h"
283ff48bf5SDavid du Colombier #include "gxpaint.h"
293ff48bf5SDavid du Colombier #include "gzpath.h"
303ff48bf5SDavid du Colombier #include "gzcpath.h"
313ff48bf5SDavid du Colombier 
323ff48bf5SDavid du Colombier /* Define the default resolution. */
333ff48bf5SDavid du Colombier #ifndef X_DPI
343ff48bf5SDavid du Colombier #  define X_DPI 720
353ff48bf5SDavid du Colombier #endif
363ff48bf5SDavid du Colombier #ifndef Y_DPI
373ff48bf5SDavid du Colombier #  define Y_DPI 720
383ff48bf5SDavid du Colombier #endif
393ff48bf5SDavid du Colombier 
403ff48bf5SDavid du Colombier extern_st(st_gs_text_enum);
413ff48bf5SDavid du Colombier extern_st(st_gx_image_enum_common);
423ff48bf5SDavid du Colombier 
433ff48bf5SDavid du Colombier /* ---------------- Internal utilities ---------------- */
443ff48bf5SDavid du Colombier 
453ff48bf5SDavid du Colombier private void
trace_drawing_color(const char * prefix,const gx_drawing_color * pdcolor)463ff48bf5SDavid du Colombier trace_drawing_color(const char *prefix, const gx_drawing_color *pdcolor)
473ff48bf5SDavid du Colombier {
483ff48bf5SDavid du Colombier     dprintf1("%scolor=", prefix);
493ff48bf5SDavid du Colombier     if (pdcolor->type == gx_dc_type_none)
503ff48bf5SDavid du Colombier 	dputs("none");
513ff48bf5SDavid du Colombier     else if (pdcolor->type == gx_dc_type_null)
523ff48bf5SDavid du Colombier 	dputs("null");
533ff48bf5SDavid du Colombier     else if (pdcolor->type == gx_dc_type_pure)
543ff48bf5SDavid du Colombier 	dprintf1("0x%lx", (ulong)pdcolor->colors.pure);
553ff48bf5SDavid du Colombier     else if (pdcolor->type == gx_dc_type_ht_binary) {
563ff48bf5SDavid du Colombier 	int ci = pdcolor->colors.binary.b_index;
573ff48bf5SDavid du Colombier 
583ff48bf5SDavid du Colombier 	dprintf5("binary(0x%lx, 0x%lx, %d/%d, index=%d)",
593ff48bf5SDavid du Colombier 		 (ulong)pdcolor->colors.binary.color[0],
603ff48bf5SDavid du Colombier 		 (ulong)pdcolor->colors.binary.color[1],
613ff48bf5SDavid du Colombier 		 pdcolor->colors.binary.b_level,
623ff48bf5SDavid du Colombier 		 (ci < 0 ? pdcolor->colors.binary.b_ht->order.num_bits :
633ff48bf5SDavid du Colombier 		  pdcolor->colors.binary.b_ht->components[ci].corder.num_bits),
643ff48bf5SDavid du Colombier 		 ci);
653ff48bf5SDavid du Colombier     } else if (pdcolor->type == gx_dc_type_ht_colored) {
663ff48bf5SDavid du Colombier 	ulong plane_mask = pdcolor->colors.colored.plane_mask;
673ff48bf5SDavid du Colombier 	int ci;
683ff48bf5SDavid du Colombier 
693ff48bf5SDavid du Colombier 	dprintf1("colored(mask=%lu", plane_mask);
703ff48bf5SDavid du Colombier 	for (ci = 0; plane_mask != 0; ++ci, plane_mask >>= 1)
713ff48bf5SDavid du Colombier 	    if (plane_mask & 1) {
723ff48bf5SDavid du Colombier 		dprintf2(", (base=%u, level=%u)",
733ff48bf5SDavid du Colombier 			 pdcolor->colors.colored.c_base[ci],
743ff48bf5SDavid du Colombier 			 pdcolor->colors.colored.c_level[ci]);
753ff48bf5SDavid du Colombier 	    } else
763ff48bf5SDavid du Colombier 		dputs(", -");
773ff48bf5SDavid du Colombier     } else {
783ff48bf5SDavid du Colombier 	dputs("**unknown**");
793ff48bf5SDavid du Colombier     }
803ff48bf5SDavid du Colombier }
813ff48bf5SDavid du Colombier 
823ff48bf5SDavid du Colombier private void
trace_lop(gs_logical_operation_t lop)833ff48bf5SDavid du Colombier trace_lop(gs_logical_operation_t lop)
843ff48bf5SDavid du Colombier {
853ff48bf5SDavid du Colombier     dprintf1(", lop=0x%x", (uint)lop);
863ff48bf5SDavid du Colombier }
873ff48bf5SDavid du Colombier 
883ff48bf5SDavid du Colombier private void
trace_path(const gx_path * path)893ff48bf5SDavid du Colombier trace_path(const gx_path *path)
903ff48bf5SDavid du Colombier {
913ff48bf5SDavid du Colombier     gs_path_enum penum;
923ff48bf5SDavid du Colombier 
933ff48bf5SDavid du Colombier     gx_path_enum_init(&penum, path);
943ff48bf5SDavid du Colombier     for (;;) {
953ff48bf5SDavid du Colombier 	gs_fixed_point pts[3];
963ff48bf5SDavid du Colombier 
973ff48bf5SDavid du Colombier 	switch (gx_path_enum_next(&penum, pts)) {
983ff48bf5SDavid du Colombier 	case gs_pe_moveto:
993ff48bf5SDavid du Colombier 	    dprintf2("    %g %g moveto\n", fixed2float(pts[0].x),
1003ff48bf5SDavid du Colombier 		     fixed2float(pts[0].y));
1013ff48bf5SDavid du Colombier 	    continue;
1023ff48bf5SDavid du Colombier 	case gs_pe_lineto:
1033ff48bf5SDavid du Colombier 	    dprintf2("    %g %g lineto\n", fixed2float(pts[0].x),
1043ff48bf5SDavid du Colombier 		     fixed2float(pts[0].y));
1053ff48bf5SDavid du Colombier 	    continue;
1063ff48bf5SDavid du Colombier 	case gs_pe_curveto:
1073ff48bf5SDavid du Colombier 	    dprintf6("    %g %g %g %g %g %g curveto\n", fixed2float(pts[0].x),
1083ff48bf5SDavid du Colombier 		     fixed2float(pts[0].y), fixed2float(pts[1].x),
1093ff48bf5SDavid du Colombier 		     fixed2float(pts[1].y), fixed2float(pts[2].x),
1103ff48bf5SDavid du Colombier 		     fixed2float(pts[2].y));
1113ff48bf5SDavid du Colombier 	    continue;
1123ff48bf5SDavid du Colombier 	case gs_pe_closepath:
1133ff48bf5SDavid du Colombier 	    dputs("    closepath\n");
1143ff48bf5SDavid du Colombier 	    continue;
1153ff48bf5SDavid du Colombier 	default:
1163ff48bf5SDavid du Colombier 	    break;
1173ff48bf5SDavid du Colombier 	}
1183ff48bf5SDavid du Colombier 	break;
1193ff48bf5SDavid du Colombier     }
1203ff48bf5SDavid du Colombier }
1213ff48bf5SDavid du Colombier 
1223ff48bf5SDavid du Colombier private void
trace_clip(gx_device * dev,const gx_clip_path * pcpath)1233ff48bf5SDavid du Colombier trace_clip(gx_device *dev, const gx_clip_path *pcpath)
1243ff48bf5SDavid du Colombier {
1253ff48bf5SDavid du Colombier     if (pcpath == 0)
1263ff48bf5SDavid du Colombier 	return;
1273ff48bf5SDavid du Colombier     if (gx_cpath_includes_rectangle(pcpath, fixed_0, fixed_0,
1283ff48bf5SDavid du Colombier 				    int2fixed(dev->width),
1293ff48bf5SDavid du Colombier 				    int2fixed(dev->height))
1303ff48bf5SDavid du Colombier 	)
1313ff48bf5SDavid du Colombier 	return;
1323ff48bf5SDavid du Colombier     dputs(", clip={");
1333ff48bf5SDavid du Colombier     if (pcpath->path_valid)
1343ff48bf5SDavid du Colombier 	trace_path(&pcpath->path);
1353ff48bf5SDavid du Colombier     else
1363ff48bf5SDavid du Colombier 	dputs("NO PATH");
1373ff48bf5SDavid du Colombier     dputs("}");
1383ff48bf5SDavid du Colombier }
1393ff48bf5SDavid du Colombier 
1403ff48bf5SDavid du Colombier /* ---------------- Low-level driver procedures ---------------- */
1413ff48bf5SDavid du Colombier 
1423ff48bf5SDavid du Colombier private int
trace_fill_rectangle(gx_device * dev,int x,int y,int w,int h,gx_color_index color)1433ff48bf5SDavid du Colombier trace_fill_rectangle(gx_device * dev, int x, int y, int w, int h,
1443ff48bf5SDavid du Colombier 		     gx_color_index color)
1453ff48bf5SDavid du Colombier {
1463ff48bf5SDavid du Colombier     dprintf5("fill_rectangle(%d, %d, %d, %d, 0x%lx)\n",
1473ff48bf5SDavid du Colombier 	     x, y, w, h, (ulong)color);
1483ff48bf5SDavid du Colombier     return 0;
1493ff48bf5SDavid du Colombier }
1503ff48bf5SDavid du Colombier 
1513ff48bf5SDavid du Colombier private int
trace_copy_mono(gx_device * dev,const byte * data,int dx,int raster,gx_bitmap_id id,int x,int y,int w,int h,gx_color_index zero,gx_color_index one)1523ff48bf5SDavid du Colombier trace_copy_mono(gx_device * dev, const byte * data,
1533ff48bf5SDavid du Colombier 		int dx, int raster, gx_bitmap_id id,
1543ff48bf5SDavid du Colombier 		int x, int y, int w, int h,
1553ff48bf5SDavid du Colombier 		gx_color_index zero, gx_color_index one)
1563ff48bf5SDavid du Colombier {
1573ff48bf5SDavid du Colombier     dprintf7("copy_mono(x=%d, y=%d, w=%d, h=%d, dx=%d, raster=%d, id=0x%lx,\n",
1583ff48bf5SDavid du Colombier 	     x, y, w, h, dx, raster, (ulong)id);
1593ff48bf5SDavid du Colombier     dprintf2("    colors=(0x%lx,0x%lx))\n", (ulong)zero, (ulong)one);
1603ff48bf5SDavid du Colombier     return 0;
1613ff48bf5SDavid du Colombier }
1623ff48bf5SDavid du Colombier 
1633ff48bf5SDavid du Colombier private int
trace_copy_color(gx_device * dev,const byte * data,int dx,int raster,gx_bitmap_id id,int x,int y,int w,int h)1643ff48bf5SDavid du Colombier trace_copy_color(gx_device * dev, const byte * data,
1653ff48bf5SDavid du Colombier 		 int dx, int raster, gx_bitmap_id id,
1663ff48bf5SDavid du Colombier 		 int x, int y, int w, int h)
1673ff48bf5SDavid du Colombier {
1683ff48bf5SDavid du Colombier     dprintf7("copy_color(x=%d, y=%d, w=%d, h=%d, dx=%d, raster=%d, id=0x%lx)\n",
1693ff48bf5SDavid du Colombier 	     x, y, w, h, dx, raster, (ulong)id);
1703ff48bf5SDavid du Colombier     return 0;
1713ff48bf5SDavid du Colombier }
1723ff48bf5SDavid du Colombier 
1733ff48bf5SDavid du Colombier private int
trace_copy_alpha(gx_device * dev,const byte * data,int dx,int raster,gx_bitmap_id id,int x,int y,int w,int h,gx_color_index color,int depth)1743ff48bf5SDavid du Colombier trace_copy_alpha(gx_device * dev, const byte * data, int dx, int raster,
1753ff48bf5SDavid du Colombier 		 gx_bitmap_id id, int x, int y, int w, int h,
1763ff48bf5SDavid du Colombier 		 gx_color_index color, int depth)
1773ff48bf5SDavid du Colombier {
1783ff48bf5SDavid du Colombier     dprintf7("copy_alpha(x=%d, y=%d, w=%d, h=%d, dx=%d, raster=%d, id=0x%lx,\n",
1793ff48bf5SDavid du Colombier 	     x, y, w, h, dx, raster, (ulong)id);
1803ff48bf5SDavid du Colombier     dprintf2("    color=0x%lx, depth=%d)\n", (ulong)color, depth);
1813ff48bf5SDavid du Colombier     return 0;
1823ff48bf5SDavid du Colombier }
1833ff48bf5SDavid du Colombier 
1843ff48bf5SDavid du Colombier private int
trace_fill_mask(gx_device * dev,const byte * data,int dx,int raster,gx_bitmap_id id,int x,int y,int w,int h,const gx_drawing_color * pdcolor,int depth,gs_logical_operation_t lop,const gx_clip_path * pcpath)1853ff48bf5SDavid du Colombier trace_fill_mask(gx_device * dev,
1863ff48bf5SDavid du Colombier 		const byte * data, int dx, int raster, gx_bitmap_id id,
1873ff48bf5SDavid du Colombier 		int x, int y, int w, int h,
1883ff48bf5SDavid du Colombier 		const gx_drawing_color * pdcolor, int depth,
1893ff48bf5SDavid du Colombier 		gs_logical_operation_t lop, const gx_clip_path * pcpath)
1903ff48bf5SDavid du Colombier {
1913ff48bf5SDavid du Colombier     dprintf7("fill_mask(x=%d, y=%d, w=%d, h=%d, dx=%d, raster=%d, id=0x%lx,\n",
1923ff48bf5SDavid du Colombier 	     x, y, w, h, dx, raster, (ulong)id);
1933ff48bf5SDavid du Colombier     trace_drawing_color("    ", pdcolor);
1943ff48bf5SDavid du Colombier     dprintf1(", depth=%d", depth);
1953ff48bf5SDavid du Colombier     trace_lop(lop);
1963ff48bf5SDavid du Colombier     trace_clip(dev, pcpath);
1973ff48bf5SDavid du Colombier     dputs(")\n");
1983ff48bf5SDavid du Colombier     return 0;
1993ff48bf5SDavid du Colombier }
2003ff48bf5SDavid du Colombier 
2013ff48bf5SDavid du Colombier private int
trace_fill_trapezoid(gx_device * dev,const gs_fixed_edge * left,const gs_fixed_edge * right,fixed ybot,fixed ytop,bool swap_axes,const gx_drawing_color * pdcolor,gs_logical_operation_t lop)2023ff48bf5SDavid du Colombier trace_fill_trapezoid(gx_device * dev,
2033ff48bf5SDavid du Colombier 		     const gs_fixed_edge * left,
2043ff48bf5SDavid du Colombier 		     const gs_fixed_edge * right,
2053ff48bf5SDavid du Colombier 		     fixed ybot, fixed ytop, bool swap_axes,
2063ff48bf5SDavid du Colombier 		     const gx_drawing_color * pdcolor,
2073ff48bf5SDavid du Colombier 		     gs_logical_operation_t lop)
2083ff48bf5SDavid du Colombier {
2093ff48bf5SDavid du Colombier     dputs("**fill_trapezoid**\n");
2103ff48bf5SDavid du Colombier     return 0;
2113ff48bf5SDavid du Colombier }
2123ff48bf5SDavid du Colombier 
2133ff48bf5SDavid du Colombier private int
trace_fill_parallelogram(gx_device * dev,fixed px,fixed py,fixed ax,fixed ay,fixed bx,fixed by,const gx_drawing_color * pdcolor,gs_logical_operation_t lop)2143ff48bf5SDavid du Colombier trace_fill_parallelogram(gx_device * dev,
2153ff48bf5SDavid du Colombier 			 fixed px, fixed py, fixed ax, fixed ay,
2163ff48bf5SDavid du Colombier 			 fixed bx, fixed by, const gx_drawing_color * pdcolor,
2173ff48bf5SDavid du Colombier 			 gs_logical_operation_t lop)
2183ff48bf5SDavid du Colombier {
2193ff48bf5SDavid du Colombier     dprintf6("fill_parallelogram((%g,%g), (%g,%g), (%g,%g)",
2203ff48bf5SDavid du Colombier 	     fixed2float(px), fixed2float(py), fixed2float(ax),
2213ff48bf5SDavid du Colombier 	     fixed2float(ay), fixed2float(bx), fixed2float(by));
2223ff48bf5SDavid du Colombier     trace_drawing_color(", ", pdcolor);
2233ff48bf5SDavid du Colombier     trace_lop(lop);
2243ff48bf5SDavid du Colombier     dputs(")\n");
2253ff48bf5SDavid du Colombier     return 0;
2263ff48bf5SDavid du Colombier }
2273ff48bf5SDavid du Colombier 
2283ff48bf5SDavid du Colombier private int
trace_fill_triangle(gx_device * dev,fixed px,fixed py,fixed ax,fixed ay,fixed bx,fixed by,const gx_drawing_color * pdcolor,gs_logical_operation_t lop)2293ff48bf5SDavid du Colombier trace_fill_triangle(gx_device * dev,
2303ff48bf5SDavid du Colombier 		    fixed px, fixed py, fixed ax, fixed ay, fixed bx, fixed by,
2313ff48bf5SDavid du Colombier 		    const gx_drawing_color * pdcolor,
2323ff48bf5SDavid du Colombier 		    gs_logical_operation_t lop)
2333ff48bf5SDavid du Colombier {
2343ff48bf5SDavid du Colombier     dprintf6("fill_triangle((%g,%g), (%g,%g), (%g,%g)",
2353ff48bf5SDavid du Colombier 	     fixed2float(px), fixed2float(py), fixed2float(ax),
2363ff48bf5SDavid du Colombier 	     fixed2float(ay), fixed2float(bx), fixed2float(by));
2373ff48bf5SDavid du Colombier     trace_drawing_color(", ", pdcolor);
2383ff48bf5SDavid du Colombier     trace_lop(lop);
2393ff48bf5SDavid du Colombier     dputs(")\n");
2403ff48bf5SDavid du Colombier     return 0;
2413ff48bf5SDavid du Colombier }
2423ff48bf5SDavid du Colombier 
2433ff48bf5SDavid du Colombier private int
trace_draw_thin_line(gx_device * dev,fixed fx0,fixed fy0,fixed fx1,fixed fy1,const gx_drawing_color * pdcolor,gs_logical_operation_t lop)2443ff48bf5SDavid du Colombier trace_draw_thin_line(gx_device * dev,
2453ff48bf5SDavid du Colombier 		     fixed fx0, fixed fy0, fixed fx1, fixed fy1,
2463ff48bf5SDavid du Colombier 		     const gx_drawing_color * pdcolor,
2473ff48bf5SDavid du Colombier 		     gs_logical_operation_t lop)
2483ff48bf5SDavid du Colombier {
2493ff48bf5SDavid du Colombier     dprintf4("draw_thin_line((%g,%g), (%g,%g)",
2503ff48bf5SDavid du Colombier 	     fixed2float(fx0), fixed2float(fy0), fixed2float(fx1),
2513ff48bf5SDavid du Colombier 	     fixed2float(fy1));
2523ff48bf5SDavid du Colombier     trace_drawing_color(", ", pdcolor);
2533ff48bf5SDavid du Colombier     trace_lop(lop);
2543ff48bf5SDavid du Colombier     dputs(")\n");
2553ff48bf5SDavid du Colombier     return 0;
2563ff48bf5SDavid du Colombier }
2573ff48bf5SDavid du Colombier 
2583ff48bf5SDavid du Colombier private int
trace_strip_tile_rectangle(gx_device * dev,const gx_strip_bitmap * tiles,int x,int y,int w,int h,gx_color_index color0,gx_color_index color1,int px,int py)2593ff48bf5SDavid du Colombier trace_strip_tile_rectangle(gx_device * dev, const gx_strip_bitmap * tiles,
2603ff48bf5SDavid du Colombier 			   int x, int y, int w, int h,
2613ff48bf5SDavid du Colombier 			   gx_color_index color0, gx_color_index color1,
2623ff48bf5SDavid du Colombier 			   int px, int py)
2633ff48bf5SDavid du Colombier {
2643ff48bf5SDavid du Colombier     dprintf6("strip_tile_rectangle(x=%d, y=%d, w=%d, h=%d, colors=(0x%lx,0x%lx),\n",
2653ff48bf5SDavid du Colombier 	     x, y, w, h, (ulong)color0, (ulong)color1);
2663ff48bf5SDavid du Colombier     dprintf8("    size=(%d,%d) shift %u, rep=(%u,%u) shift %u, phase=(%d,%d))\n",
2673ff48bf5SDavid du Colombier 	     tiles->size.x, tiles->size.y, tiles->shift,
2683ff48bf5SDavid du Colombier 	     tiles->rep_width, tiles->rep_height, tiles->rep_shift, px, py);
2693ff48bf5SDavid du Colombier     return 0;
2703ff48bf5SDavid du Colombier }
2713ff48bf5SDavid du Colombier 
2723ff48bf5SDavid du Colombier private int
trace_strip_copy_rop(gx_device * dev,const byte * sdata,int sourcex,uint sraster,gx_bitmap_id id,const gx_color_index * scolors,const gx_strip_bitmap * textures,const gx_color_index * tcolors,int x,int y,int width,int height,int phase_x,int phase_y,gs_logical_operation_t lop)2733ff48bf5SDavid du Colombier trace_strip_copy_rop(gx_device * dev, const byte * sdata, int sourcex,
2743ff48bf5SDavid du Colombier 		     uint sraster, gx_bitmap_id id,
2753ff48bf5SDavid du Colombier 		     const gx_color_index * scolors,
2763ff48bf5SDavid du Colombier 		     const gx_strip_bitmap * textures,
2773ff48bf5SDavid du Colombier 		     const gx_color_index * tcolors,
2783ff48bf5SDavid du Colombier 		     int x, int y, int width, int height,
2793ff48bf5SDavid du Colombier 		     int phase_x, int phase_y, gs_logical_operation_t lop)
2803ff48bf5SDavid du Colombier {
2813ff48bf5SDavid du Colombier     dputs("**strip_copy_rop**\n");
2823ff48bf5SDavid du Colombier     return 0;
2833ff48bf5SDavid du Colombier }
2843ff48bf5SDavid du Colombier 
2853ff48bf5SDavid du Colombier /* ---------------- High-level driver procedures ---------------- */
2863ff48bf5SDavid du Colombier 
2873ff48bf5SDavid du Colombier private int
trace_fill_path(gx_device * dev,const gs_imager_state * pis,gx_path * ppath,const gx_fill_params * params,const gx_drawing_color * pdcolor,const gx_clip_path * pcpath)2883ff48bf5SDavid du Colombier trace_fill_path(gx_device * dev, const gs_imager_state * pis,
2893ff48bf5SDavid du Colombier 		gx_path * ppath, const gx_fill_params * params,
2903ff48bf5SDavid du Colombier 		const gx_drawing_color * pdcolor,
2913ff48bf5SDavid du Colombier 		const gx_clip_path * pcpath)
2923ff48bf5SDavid du Colombier {
2933ff48bf5SDavid du Colombier     dputs("fill_path({\n");
2943ff48bf5SDavid du Colombier     trace_path(ppath);
2953ff48bf5SDavid du Colombier     trace_drawing_color("}, ", pdcolor);
2963ff48bf5SDavid du Colombier     dprintf5(", rule=%d, adjust=(%g,%g), flatness=%g, fill_zero_width=%s",
2973ff48bf5SDavid du Colombier 	     params->rule, fixed2float(params->adjust.x),
2983ff48bf5SDavid du Colombier 	     fixed2float(params->adjust.y), params->flatness,
2993ff48bf5SDavid du Colombier 	     (params->fill_zero_width ? "true" : "false"));
3003ff48bf5SDavid du Colombier     trace_clip(dev, pcpath);
3013ff48bf5SDavid du Colombier     /****** pis ******/
3023ff48bf5SDavid du Colombier     dputs(")\n");
3033ff48bf5SDavid du Colombier     return 0;
3043ff48bf5SDavid du Colombier }
3053ff48bf5SDavid du Colombier 
3063ff48bf5SDavid du Colombier private int
trace_stroke_path(gx_device * dev,const gs_imager_state * pis,gx_path * ppath,const gx_stroke_params * params,const gx_drawing_color * pdcolor,const gx_clip_path * pcpath)3073ff48bf5SDavid du Colombier trace_stroke_path(gx_device * dev, const gs_imager_state * pis,
3083ff48bf5SDavid du Colombier 		  gx_path * ppath, const gx_stroke_params * params,
3093ff48bf5SDavid du Colombier 		  const gx_drawing_color * pdcolor,
3103ff48bf5SDavid du Colombier 		  const gx_clip_path * pcpath)
3113ff48bf5SDavid du Colombier {
3123ff48bf5SDavid du Colombier     dputs("stroke_path({\n");
3133ff48bf5SDavid du Colombier     trace_path(ppath);
3143ff48bf5SDavid du Colombier     trace_drawing_color("}, ", pdcolor);
3153ff48bf5SDavid du Colombier     dprintf1(", flatness=%g", params->flatness);
3163ff48bf5SDavid du Colombier     trace_clip(dev, pcpath);
3173ff48bf5SDavid du Colombier     /****** pis ******/
3183ff48bf5SDavid du Colombier     dputs(")\n");
3193ff48bf5SDavid du Colombier     return 0;
3203ff48bf5SDavid du Colombier }
3213ff48bf5SDavid du Colombier 
3223ff48bf5SDavid du Colombier typedef struct trace_image_enum_s {
3233ff48bf5SDavid du Colombier     gx_image_enum_common;
3243ff48bf5SDavid du Colombier     gs_memory_t *memory;
3253ff48bf5SDavid du Colombier     int rows_left;
3263ff48bf5SDavid du Colombier } trace_image_enum_t;
3273ff48bf5SDavid du Colombier gs_private_st_suffix_add0(st_trace_image_enum, trace_image_enum_t,
3283ff48bf5SDavid du Colombier 			  "trace_image_enum_t", trace_image_enum_enum_ptrs,
3293ff48bf5SDavid du Colombier 			  trace_image_enum_reloc_ptrs,
3303ff48bf5SDavid du Colombier 			  st_gx_image_enum_common);
3313ff48bf5SDavid du Colombier private int
trace_plane_data(gx_image_enum_common_t * info,const gx_image_plane_t * planes,int height,int * rows_used)3323ff48bf5SDavid du Colombier trace_plane_data(gx_image_enum_common_t * info,
3333ff48bf5SDavid du Colombier 		 const gx_image_plane_t * planes, int height,
3343ff48bf5SDavid du Colombier 		 int *rows_used)
3353ff48bf5SDavid du Colombier {
3363ff48bf5SDavid du Colombier     trace_image_enum_t *pie = (trace_image_enum_t *)info;
3373ff48bf5SDavid du Colombier     int i;
3383ff48bf5SDavid du Colombier 
3393ff48bf5SDavid du Colombier     dprintf1("image_plane_data(height=%d", height);
3403ff48bf5SDavid du Colombier     for (i = 0; i < pie->num_planes; ++i) {
3413ff48bf5SDavid du Colombier 	if (planes[i].data)
3423ff48bf5SDavid du Colombier 	    dprintf4(", {depth=%d, width=%d, dx=%d, raster=%u}",
3433ff48bf5SDavid du Colombier 		     pie->plane_depths[i], pie->plane_widths[i],
3443ff48bf5SDavid du Colombier 		     planes[i].data_x, planes[i].raster);
3453ff48bf5SDavid du Colombier 	else
3463ff48bf5SDavid du Colombier 	    dputs(", -");
3473ff48bf5SDavid du Colombier     }
3483ff48bf5SDavid du Colombier     dputs(")\n");
3493ff48bf5SDavid du Colombier     *rows_used = height;
3503ff48bf5SDavid du Colombier     return (pie->rows_left -= height) <= 0;
3513ff48bf5SDavid du Colombier }
3523ff48bf5SDavid du Colombier private int
trace_end_image(gx_image_enum_common_t * info,bool draw_last)3533ff48bf5SDavid du Colombier trace_end_image(gx_image_enum_common_t * info, bool draw_last)
3543ff48bf5SDavid du Colombier {
3553ff48bf5SDavid du Colombier     trace_image_enum_t *pie = (trace_image_enum_t *)info;
3563ff48bf5SDavid du Colombier 
3573ff48bf5SDavid du Colombier     gs_free_object(pie->memory, pie, "trace_end_image");
3583ff48bf5SDavid du Colombier     return 0;
3593ff48bf5SDavid du Colombier }
3603ff48bf5SDavid du Colombier private const gx_image_enum_procs_t trace_image_enum_procs = {
3613ff48bf5SDavid du Colombier     trace_plane_data, trace_end_image
3623ff48bf5SDavid du Colombier };
3633ff48bf5SDavid du Colombier private int
trace_begin_typed_image(gx_device * dev,const gs_imager_state * pis,const gs_matrix * pmat,const gs_image_common_t * pim,const gs_int_rect * prect,const gx_drawing_color * pdcolor,const gx_clip_path * pcpath,gs_memory_t * memory,gx_image_enum_common_t ** pinfo)3643ff48bf5SDavid du Colombier trace_begin_typed_image(gx_device * dev, const gs_imager_state * pis,
3653ff48bf5SDavid du Colombier 			const gs_matrix * pmat,
3663ff48bf5SDavid du Colombier 			const gs_image_common_t * pim,
3673ff48bf5SDavid du Colombier 			const gs_int_rect * prect,
3683ff48bf5SDavid du Colombier 			const gx_drawing_color * pdcolor,
3693ff48bf5SDavid du Colombier 			const gx_clip_path * pcpath,
3703ff48bf5SDavid du Colombier 			gs_memory_t * memory,
3713ff48bf5SDavid du Colombier 			gx_image_enum_common_t ** pinfo)
3723ff48bf5SDavid du Colombier {
3733ff48bf5SDavid du Colombier     trace_image_enum_t *pie;
3743ff48bf5SDavid du Colombier     const gs_pixel_image_t *ppi = (const gs_pixel_image_t *)pim;
3753ff48bf5SDavid du Colombier     int ncomp;
3763ff48bf5SDavid du Colombier 
3773ff48bf5SDavid du Colombier     dprintf7("begin_typed_image(type=%d, ImageMatrix=[%g %g %g %g %g %g]",
3783ff48bf5SDavid du Colombier 	     pim->type->index, pim->ImageMatrix.xx, pim->ImageMatrix.xy,
3793ff48bf5SDavid du Colombier 	     pim->ImageMatrix.yx, pim->ImageMatrix.yy,
3803ff48bf5SDavid du Colombier 	     pim->ImageMatrix.tx, pim->ImageMatrix.ty);
3813ff48bf5SDavid du Colombier     switch (pim->type->index) {
3823ff48bf5SDavid du Colombier     case 1:
3833ff48bf5SDavid du Colombier 	if (((const gs_image1_t *)ppi)->ImageMask) {
3843ff48bf5SDavid du Colombier 	    ncomp = 1;
3853ff48bf5SDavid du Colombier 	    break;
3863ff48bf5SDavid du Colombier 	}
3873ff48bf5SDavid du Colombier 	/* falls through */
3883ff48bf5SDavid du Colombier     case 4:
3893ff48bf5SDavid du Colombier 	ncomp = gs_color_space_num_components(ppi->ColorSpace);
3903ff48bf5SDavid du Colombier 	break;
3913ff48bf5SDavid du Colombier     case 3:
3923ff48bf5SDavid du Colombier 	ncomp = gs_color_space_num_components(ppi->ColorSpace) + 1;
3933ff48bf5SDavid du Colombier 	break;
3943ff48bf5SDavid du Colombier     case 2:			/* no data */
3953ff48bf5SDavid du Colombier 	dputs(")\n");
3963ff48bf5SDavid du Colombier 	return 1;
3973ff48bf5SDavid du Colombier     default:
3983ff48bf5SDavid du Colombier 	goto dflt;
3993ff48bf5SDavid du Colombier     }
4003ff48bf5SDavid du Colombier     pie = gs_alloc_struct(memory, trace_image_enum_t, &st_trace_image_enum,
4013ff48bf5SDavid du Colombier 			  "trace_begin_typed_image");
4023ff48bf5SDavid du Colombier     if (pie == 0)
4033ff48bf5SDavid du Colombier 	goto dflt;
4043ff48bf5SDavid du Colombier     if (gx_image_enum_common_init((gx_image_enum_common_t *)pie,
4053ff48bf5SDavid du Colombier 				  (const gs_data_image_t *)pim,
4063ff48bf5SDavid du Colombier 				  &trace_image_enum_procs, dev, ncomp,
4073ff48bf5SDavid du Colombier 				  ppi->format) < 0
4083ff48bf5SDavid du Colombier 	)
4093ff48bf5SDavid du Colombier 	goto dflt;
4103ff48bf5SDavid du Colombier     dprintf4("\n    Width=%d, Height=%d, BPC=%d, num_components=%d)\n",
4113ff48bf5SDavid du Colombier 	     ppi->Width, ppi->Height, ppi->BitsPerComponent, ncomp);
4123ff48bf5SDavid du Colombier     pie->memory = memory;
4133ff48bf5SDavid du Colombier     pie->rows_left = ppi->Height;
4143ff48bf5SDavid du Colombier     *pinfo = (gx_image_enum_common_t *)pie;
4153ff48bf5SDavid du Colombier     return 0;
4163ff48bf5SDavid du Colombier  dflt:
4173ff48bf5SDavid du Colombier     dputs(") DEFAULTED\n");
4183ff48bf5SDavid du Colombier     return gx_default_begin_typed_image(dev, pis, pmat, pim, prect, pdcolor,
4193ff48bf5SDavid du Colombier 					pcpath, memory, pinfo);
4203ff48bf5SDavid du Colombier }
4213ff48bf5SDavid du Colombier 
4223ff48bf5SDavid du Colombier private int
trace_text_process(gs_text_enum_t * pte)4233ff48bf5SDavid du Colombier trace_text_process(gs_text_enum_t *pte)
4243ff48bf5SDavid du Colombier {
4253ff48bf5SDavid du Colombier     return 0;
4263ff48bf5SDavid du Colombier }
4273ff48bf5SDavid du Colombier private const gs_text_enum_procs_t trace_text_procs = {
4283ff48bf5SDavid du Colombier     NULL, trace_text_process, NULL, NULL, NULL, NULL,
4293ff48bf5SDavid du Colombier     gx_default_text_release
4303ff48bf5SDavid du Colombier };
4313ff48bf5SDavid du Colombier private int
trace_text_begin(gx_device * dev,gs_imager_state * pis,const gs_text_params_t * text,gs_font * font,gx_path * path,const gx_device_color * pdcolor,const gx_clip_path * pcpath,gs_memory_t * memory,gs_text_enum_t ** ppenum)4323ff48bf5SDavid du Colombier trace_text_begin(gx_device * dev, gs_imager_state * pis,
4333ff48bf5SDavid du Colombier 		 const gs_text_params_t * text, gs_font * font,
4343ff48bf5SDavid du Colombier 		 gx_path * path, const gx_device_color * pdcolor,
4353ff48bf5SDavid du Colombier 		 const gx_clip_path * pcpath, gs_memory_t * memory,
4363ff48bf5SDavid du Colombier 		 gs_text_enum_t ** ppenum)
4373ff48bf5SDavid du Colombier {
4383ff48bf5SDavid du Colombier     static const char *const tags[sizeof(text->operation) * 8] = {
4393ff48bf5SDavid du Colombier 	"FROM_STRING", "FROM_BYTES", "FROM_CHARS", "FROM_GLYPHS",
4403ff48bf5SDavid du Colombier 	"FROM_SINGLE_CHAR", "FROM_SINGLE_GLYPH",
4413ff48bf5SDavid du Colombier 	"ADD_TO_ALL_WIDTHS", "ADD_TO_SPACE_WIDTH",
4423ff48bf5SDavid du Colombier 	"REPLACE_WIDTHS", "DO_NONE", "DO_DRAW", "DO_CHARWIDTH",
4433ff48bf5SDavid du Colombier 	"DO_FALSE_CHARPATH", "DO_TRUE_CHARPATH",
4443ff48bf5SDavid du Colombier 	"DO_FALSE_CHARBOXPATH", "DO_TRUE_CHARBOXPATH",
4453ff48bf5SDavid du Colombier 	"INTERVENE", "RETURN_WIDTH"
4463ff48bf5SDavid du Colombier     };
4473ff48bf5SDavid du Colombier     int i;
4483ff48bf5SDavid du Colombier     gs_text_enum_t *pte;
4493ff48bf5SDavid du Colombier     int code;
4503ff48bf5SDavid du Colombier 
4513ff48bf5SDavid du Colombier     dputs("text_begin(");
4523ff48bf5SDavid du Colombier     for (i = 0; i < countof(tags); ++i)
4533ff48bf5SDavid du Colombier 	if (text->operation & (1 << i)) {
4543ff48bf5SDavid du Colombier 	    if (tags[i])
4553ff48bf5SDavid du Colombier 		dprintf1("%s ", tags[i]);
4563ff48bf5SDavid du Colombier 	    else
4573ff48bf5SDavid du Colombier 		dprintf1("%d? ", i);
4583ff48bf5SDavid du Colombier 	}
4593ff48bf5SDavid du Colombier     dprintf1("font=%s\n           text=(", font->font_name.chars);
4603ff48bf5SDavid du Colombier     if (text->operation & TEXT_FROM_SINGLE_CHAR)
4613ff48bf5SDavid du Colombier 	dprintf1("0x%lx", (ulong)text->data.d_char);
4623ff48bf5SDavid du Colombier     else if (text->operation & TEXT_FROM_SINGLE_GLYPH)
4633ff48bf5SDavid du Colombier 	dprintf1("0x%lx", (ulong)text->data.d_glyph);
4643ff48bf5SDavid du Colombier     else
4653ff48bf5SDavid du Colombier 	for (i = 0; i < text->size; ++i) {
4663ff48bf5SDavid du Colombier 	    if (text->operation & TEXT_FROM_STRING)
4673ff48bf5SDavid du Colombier 		dputc(text->data.bytes[i]);
4683ff48bf5SDavid du Colombier 	    else
4693ff48bf5SDavid du Colombier 		dprintf1("0x%lx ",
4703ff48bf5SDavid du Colombier 			 (text->operation & TEXT_FROM_GLYPHS ?
4713ff48bf5SDavid du Colombier 			  (ulong)text->data.glyphs[i] :
4723ff48bf5SDavid du Colombier 			  (ulong)text->data.chars[i]));
4733ff48bf5SDavid du Colombier     }
4743ff48bf5SDavid du Colombier     dprintf1(")\n           size=%u", text->size);
4753ff48bf5SDavid du Colombier     if (text->operation & TEXT_ADD_TO_ALL_WIDTHS)
4763ff48bf5SDavid du Colombier 	dprintf2(", delta_all=(%g,%g)", text->delta_all.x, text->delta_all.y);
4773ff48bf5SDavid du Colombier     if (text->operation & TEXT_ADD_TO_SPACE_WIDTH) {
4783ff48bf5SDavid du Colombier 	dprintf3(", space=0x%lx, delta_space=(%g,%g)",
4793ff48bf5SDavid du Colombier 		 (text->operation & TEXT_FROM_GLYPHS ?
4803ff48bf5SDavid du Colombier 		  (ulong)text->space.s_glyph : (ulong)text->space.s_char),
4813ff48bf5SDavid du Colombier 		 text->delta_space.x, text->delta_space.y);
4823ff48bf5SDavid du Colombier     }
4833ff48bf5SDavid du Colombier     if (text->operation & TEXT_REPLACE_WIDTHS) {
4843ff48bf5SDavid du Colombier 	dputs("\n           widths=");
4853ff48bf5SDavid du Colombier 	for (i = 0; i < text->widths_size; ++i) {
4863ff48bf5SDavid du Colombier 	    if (text->x_widths)
4873ff48bf5SDavid du Colombier 		dprintf1("(%g,", text->x_widths[i]);
4883ff48bf5SDavid du Colombier 	    else
4893ff48bf5SDavid du Colombier 		dputs("(,");
4903ff48bf5SDavid du Colombier 	    if (text->y_widths)
4913ff48bf5SDavid du Colombier 		dprintf1("%g)",
4923ff48bf5SDavid du Colombier 			 (text->y_widths == text->x_widths ?
4933ff48bf5SDavid du Colombier 			  text->y_widths[++i] : text->y_widths[i]));
4943ff48bf5SDavid du Colombier 	    else
4953ff48bf5SDavid du Colombier 		dputs(")");
4963ff48bf5SDavid du Colombier 	}
4973ff48bf5SDavid du Colombier     }
4983ff48bf5SDavid du Colombier     if (text->operation & TEXT_DO_DRAW)
4993ff48bf5SDavid du Colombier 	trace_drawing_color(", ", pdcolor);
5003ff48bf5SDavid du Colombier     /*
5013ff48bf5SDavid du Colombier      * We can't do it if CHAR*PATH or INTERVENE, or if (RETURN_WIDTH and not
5023ff48bf5SDavid du Colombier      * REPLACE_WIDTHS and we can't get the widths from the font).
5033ff48bf5SDavid du Colombier      */
5043ff48bf5SDavid du Colombier     if (text->operation &
5053ff48bf5SDavid du Colombier 	(TEXT_DO_FALSE_CHARPATH | TEXT_DO_TRUE_CHARPATH |
5063ff48bf5SDavid du Colombier 	 TEXT_DO_FALSE_CHARBOXPATH | TEXT_DO_TRUE_CHARBOXPATH |
5073ff48bf5SDavid du Colombier 	 TEXT_INTERVENE)
5083ff48bf5SDavid du Colombier 	)
5093ff48bf5SDavid du Colombier 	goto dflt;
5103ff48bf5SDavid du Colombier     rc_alloc_struct_1(pte, gs_text_enum_t, &st_gs_text_enum, memory,
5113ff48bf5SDavid du Colombier 		      goto dflt, "trace_text_begin");
5123ff48bf5SDavid du Colombier     code = gs_text_enum_init(pte, &trace_text_procs, dev, pis, text, font,
5133ff48bf5SDavid du Colombier 			     path, pdcolor, pcpath, memory);
5143ff48bf5SDavid du Colombier     if (code < 0)
5153ff48bf5SDavid du Colombier 	goto dfree;
5163ff48bf5SDavid du Colombier     if ((text->operation & (TEXT_DO_CHARWIDTH | TEXT_RETURN_WIDTH)) &&
5173ff48bf5SDavid du Colombier 	!(text->operation & TEXT_REPLACE_WIDTHS)
5183ff48bf5SDavid du Colombier 	) {
5193ff48bf5SDavid du Colombier 	/*
5203ff48bf5SDavid du Colombier 	 * Get the widths from the font.  This code is mostly copied from
5213ff48bf5SDavid du Colombier 	 * the pdfwrite driver, and should probably be shared with it.
5223ff48bf5SDavid du Colombier 	 * ****** WRONG IF Type 0 FONT ******
5233ff48bf5SDavid du Colombier 	 */
5243ff48bf5SDavid du Colombier 	int i;
5253ff48bf5SDavid du Colombier 	gs_point w;
5263ff48bf5SDavid du Colombier 	double scale = (font->FontType == ft_TrueType ? 0.001 : 1.0);
5273ff48bf5SDavid du Colombier 	gs_fixed_point origin;
5283ff48bf5SDavid du Colombier 	gs_point dpt;
5293ff48bf5SDavid du Colombier 	int num_spaces = 0;
5303ff48bf5SDavid du Colombier 
5313ff48bf5SDavid du Colombier 	if (!(text->operation & TEXT_FROM_STRING))
5323ff48bf5SDavid du Colombier 	    goto dfree;		/* can't handle yet */
5333ff48bf5SDavid du Colombier 	if (gx_path_current_point(path, &origin) < 0)
5343ff48bf5SDavid du Colombier 	    goto dfree;
5353ff48bf5SDavid du Colombier 	w.x = 0, w.y = 0;
5363ff48bf5SDavid du Colombier 	for (i = 0; i < text->size; ++i) {
5373ff48bf5SDavid du Colombier 	    gs_char ch = text->data.bytes[i];
5383ff48bf5SDavid du Colombier 	    int wmode = font->WMode;
5393ff48bf5SDavid du Colombier 	    gs_glyph glyph =
5403ff48bf5SDavid du Colombier 		((gs_font_base *)font)->procs.encode_char(font, ch,
541*593dc095SDavid du Colombier 							  GLYPH_SPACE_NAME);
5423ff48bf5SDavid du Colombier 	    gs_glyph_info_t info;
5433ff48bf5SDavid du Colombier 
5443ff48bf5SDavid du Colombier 	    if (glyph != gs_no_glyph &&
5453ff48bf5SDavid du Colombier 		(code = font->procs.glyph_info(font, glyph, NULL,
5463ff48bf5SDavid du Colombier 					       GLYPH_INFO_WIDTH0 << wmode,
5473ff48bf5SDavid du Colombier 					       &info)) >= 0
5483ff48bf5SDavid du Colombier 	    ) {
5493ff48bf5SDavid du Colombier 		w.x += info.width[wmode].x;
5503ff48bf5SDavid du Colombier 		w.y += info.width[wmode].y;
5513ff48bf5SDavid du Colombier 	    } else
5523ff48bf5SDavid du Colombier 		goto dfree;
5533ff48bf5SDavid du Colombier 	    if (ch == text->space.s_char)
5543ff48bf5SDavid du Colombier 		++num_spaces;
5553ff48bf5SDavid du Colombier 	}
5563ff48bf5SDavid du Colombier 	gs_distance_transform(w.x * scale, w.y * scale,
5573ff48bf5SDavid du Colombier 			      &font->FontMatrix, &dpt);
5583ff48bf5SDavid du Colombier 	if (text->operation & TEXT_ADD_TO_ALL_WIDTHS) {
5593ff48bf5SDavid du Colombier 	    int num_chars = text->size;
5603ff48bf5SDavid du Colombier 
5613ff48bf5SDavid du Colombier 	    dpt.x += text->delta_all.x * num_chars;
5623ff48bf5SDavid du Colombier 	    dpt.y += text->delta_all.y * num_chars;
5633ff48bf5SDavid du Colombier 	}
5643ff48bf5SDavid du Colombier 	if (text->operation & TEXT_ADD_TO_SPACE_WIDTH) {
5653ff48bf5SDavid du Colombier 	    dpt.x += text->delta_space.x * num_spaces;
5663ff48bf5SDavid du Colombier 	    dpt.y += text->delta_space.y * num_spaces;
5673ff48bf5SDavid du Colombier 	}
5683ff48bf5SDavid du Colombier 	pte->returned.total_width = dpt;
5693ff48bf5SDavid du Colombier 	gs_distance_transform(dpt.x, dpt.y, &ctm_only(pis), &dpt);
5703ff48bf5SDavid du Colombier 	code = gx_path_add_point(path,
5713ff48bf5SDavid du Colombier 				 origin.x + float2fixed(dpt.x),
5723ff48bf5SDavid du Colombier 				 origin.y + float2fixed(dpt.y));
5733ff48bf5SDavid du Colombier 	if (code < 0)
5743ff48bf5SDavid du Colombier 	    goto dfree;
5753ff48bf5SDavid du Colombier     }
5763ff48bf5SDavid du Colombier     dputs(")\n");
5773ff48bf5SDavid du Colombier     *ppenum = pte;
5783ff48bf5SDavid du Colombier     return 0;
5793ff48bf5SDavid du Colombier  dfree:
5803ff48bf5SDavid du Colombier     gs_free_object(memory, pte, "trace_text_begin");
5813ff48bf5SDavid du Colombier  dflt:
5823ff48bf5SDavid du Colombier     dputs(") DEFAULTED\n");
5833ff48bf5SDavid du Colombier     return gx_default_text_begin(dev, pis, text, font, path, pdcolor,
5843ff48bf5SDavid du Colombier 				 pcpath, memory, ppenum);
5853ff48bf5SDavid du Colombier }
5863ff48bf5SDavid du Colombier 
5873ff48bf5SDavid du Colombier /* ---------------- The device definition ---------------- */
5883ff48bf5SDavid du Colombier 
5893ff48bf5SDavid du Colombier #define TRACE_DEVICE_BODY(dname, ncomp, depth, map_rgb_color, map_color_rgb, map_cmyk_color, map_rgb_alpha_color)\
5903ff48bf5SDavid du Colombier     std_device_dci_body(gx_device, 0, dname,\
5913ff48bf5SDavid du Colombier 			DEFAULT_WIDTH_10THS * X_DPI / 10,\
5923ff48bf5SDavid du Colombier 			DEFAULT_HEIGHT_10THS * Y_DPI / 10,\
5933ff48bf5SDavid du Colombier 			X_DPI, Y_DPI, ncomp, depth,\
5943ff48bf5SDavid du Colombier 			(1 << (depth / ncomp)) - 1,\
5953ff48bf5SDavid du Colombier 			(ncomp > 1 ? (1 << (depth / ncomp)) - 1 : 0),\
5963ff48bf5SDavid du Colombier 			1 << (depth / ncomp),\
5973ff48bf5SDavid du Colombier 			(ncomp > 1 ? 1 << (depth / ncomp) : 1)),\
5983ff48bf5SDavid du Colombier {\
5993ff48bf5SDavid du Colombier      NULL,			/* open_device */\
6003ff48bf5SDavid du Colombier      NULL,			/* get_initial_matrix */\
6013ff48bf5SDavid du Colombier      NULL,			/* sync_output */\
6023ff48bf5SDavid du Colombier      NULL,			/* output_page */\
6033ff48bf5SDavid du Colombier      NULL,			/* close_device */\
6043ff48bf5SDavid du Colombier      map_rgb_color,		/* differs */\
6053ff48bf5SDavid du Colombier      map_color_rgb,		/* differs */\
6063ff48bf5SDavid du Colombier      trace_fill_rectangle,\
6073ff48bf5SDavid du Colombier      NULL,			/* tile_rectangle */\
6083ff48bf5SDavid du Colombier      trace_copy_mono,\
6093ff48bf5SDavid du Colombier      trace_copy_color,\
6103ff48bf5SDavid du Colombier      NULL,			/* draw_line */\
6113ff48bf5SDavid du Colombier      NULL,			/* get_bits */\
6123ff48bf5SDavid du Colombier      NULL,			/* get_params */\
6133ff48bf5SDavid du Colombier      NULL,			/* put_params */\
6143ff48bf5SDavid du Colombier      map_cmyk_color,		/* differs */\
6153ff48bf5SDavid du Colombier      NULL,			/* get_xfont_procs */\
6163ff48bf5SDavid du Colombier      NULL,			/* get_xfont_device */\
6173ff48bf5SDavid du Colombier      map_rgb_alpha_color,	/* differs */\
6183ff48bf5SDavid du Colombier      gx_page_device_get_page_device,\
6193ff48bf5SDavid du Colombier      NULL,			/* get_alpha_bits */\
6203ff48bf5SDavid du Colombier      trace_copy_alpha,\
6213ff48bf5SDavid du Colombier      NULL,			/* get_band */\
6223ff48bf5SDavid du Colombier      NULL,			/* copy_rop */\
6233ff48bf5SDavid du Colombier      trace_fill_path,\
6243ff48bf5SDavid du Colombier      trace_stroke_path,\
6253ff48bf5SDavid du Colombier      trace_fill_mask,\
6263ff48bf5SDavid du Colombier      trace_fill_trapezoid,\
6273ff48bf5SDavid du Colombier      trace_fill_parallelogram,\
6283ff48bf5SDavid du Colombier      trace_fill_triangle,\
6293ff48bf5SDavid du Colombier      trace_draw_thin_line,\
6303ff48bf5SDavid du Colombier      NULL,			/* begin_image */\
6313ff48bf5SDavid du Colombier      NULL,			/* image_data */\
6323ff48bf5SDavid du Colombier      NULL,			/* end_image */\
6333ff48bf5SDavid du Colombier      trace_strip_tile_rectangle,\
6343ff48bf5SDavid du Colombier      trace_strip_copy_rop,\
6353ff48bf5SDavid du Colombier      NULL,			/* get_clipping_box */\
6363ff48bf5SDavid du Colombier      trace_begin_typed_image,\
6373ff48bf5SDavid du Colombier      NULL,			/* get_bits_rectangle */\
6383ff48bf5SDavid du Colombier      NULL,			/* map_color_rgb_alpha */\
6393ff48bf5SDavid du Colombier      NULL,			/* create_compositor */\
6403ff48bf5SDavid du Colombier      NULL,			/* get_hardware_params */\
6413ff48bf5SDavid du Colombier      trace_text_begin,\
6423ff48bf5SDavid du Colombier      NULL			/* finish_copydevice */\
6433ff48bf5SDavid du Colombier }
6443ff48bf5SDavid du Colombier 
6453ff48bf5SDavid du Colombier const gx_device gs_tr_mono_device = {
6463ff48bf5SDavid du Colombier     TRACE_DEVICE_BODY("tr_mono", 1, 1,
6473ff48bf5SDavid du Colombier 		      gx_default_b_w_map_rgb_color,
6483ff48bf5SDavid du Colombier 		      gx_default_b_w_map_color_rgb, NULL, NULL)
6493ff48bf5SDavid du Colombier };
6503ff48bf5SDavid du Colombier 
6513ff48bf5SDavid du Colombier const gx_device gs_tr_rgb_device = {
6523ff48bf5SDavid du Colombier     TRACE_DEVICE_BODY("tr_rgb", 3, 24,
6533ff48bf5SDavid du Colombier 		      gx_default_rgb_map_rgb_color,
6543ff48bf5SDavid du Colombier 		      gx_default_rgb_map_color_rgb, NULL, NULL)
6553ff48bf5SDavid du Colombier };
6563ff48bf5SDavid du Colombier 
6573ff48bf5SDavid du Colombier const gx_device gs_tr_cmyk_device = {
6583ff48bf5SDavid du Colombier     TRACE_DEVICE_BODY("tr_cmyk", 4, 4,
6593ff48bf5SDavid du Colombier 		      NULL, cmyk_1bit_map_color_rgb,
6603ff48bf5SDavid du Colombier 		      cmyk_1bit_map_cmyk_color, NULL)
6613ff48bf5SDavid du Colombier };
662