/* bundles.c 1.1 */ /* Copyright 1992, 1993 O'Reilly and Associates, Inc. Permission to use, copy, and modify this program is hereby granted, as long as this copyright notice appears in each copy of the program source code. */ #include "book_utils.h" #define WIN_GEOM "500x500+50+50" #define HIGHWAY 1 #define STREET 2 #define TRAIL 3 static void set_bundles( dpy, renderer, table ) Display *dpy; PEXRenderer renderer; PEXLookupTable table; { PEXLineBundleEntry bundle; /* Initialize the common bundle values. */ bundle.color.type = PEXColorTypeRGB; bundle.interp_method = PEXSurfaceInterpNone; bundle.curve_approx.method = PEXApproxConstantBetweenKnots; bundle.curve_approx.tolerance = 1.0; /* Set the line bundles. */ bundle.type = PEXLineTypeSolid; bundle.width = 3.0; bundle.color.value.rgb.red = 1; bundle.color.value.rgb.green = 0; bundle.color.value.rgb.blue = 0; PEXSetTableEntries( dpy, table, HIGHWAY, 1, PEXLUTLineBundle, &bundle ); bundle.type = PEXLineTypeDashed; bundle.width = 2.0; bundle.color.value.rgb.red = 0; bundle.color.value.rgb.green = 0; bundle.color.value.rgb.blue = 1; PEXSetTableEntries( dpy, table, STREET, 1, PEXLUTLineBundle, &bundle ); bundle.type = PEXLineTypeDotted; bundle.width = 1.0; bundle.color.value.rgb.red = 0; bundle.color.value.rgb.green = 1; bundle.color.value.rgb.blue = 0; PEXSetTableEntries( dpy, table, TRAIL, 1, PEXLUTLineBundle, &bundle ); } void redraw( dpy, window, renderer ) Display *dpy; Window window; PEXRenderer renderer; { static PEXCoord2D points[] = {{.2,.8},{.8,.8}}; XClearWindow( dpy, window ); PEXBeginRendering( dpy, window, renderer ); /* Set the asfs for line type, width and color to bundled. */ PEXSetIndividualASF( dpy, renderer, PEXOCRender, PEXASFLineType, PEXBundled ); PEXSetIndividualASF( dpy, renderer, PEXOCRender, PEXASFLineWidth, PEXBundled ); PEXSetIndividualASF( dpy, renderer, PEXOCRender, PEXASFLineColor, PEXBundled ); /* Create the polylines, setting the line index before each. */ PEXSetLineBundleIndex( dpy, renderer, PEXOCRender, HIGHWAY ); PEXPolyline2D( dpy, renderer, PEXOCRender, 2, points ); PEXSetLineBundleIndex( dpy, renderer, PEXOCRender, STREET ); points[0].y = points[1].y = 0.5; PEXPolyline2D( dpy, renderer, PEXOCRender, 2, points ); PEXSetLineBundleIndex( dpy, renderer, PEXOCRender, TRAIL ); points[0].y = points[1].y = 0.2; PEXPolyline2D( dpy, renderer, PEXOCRender, 2, points ); PEXEndRendering( dpy, renderer, True ); XFlush( dpy ); } main( argc, argv ) int argc; char *argv[]; { Display *dpy; Window window; XEvent event; XVisualInfo vis_info; XColor bkgd_color; XStandardColormap cmap_info; PEXColorApproxEntry capx_info; PEXRenderer renderer; PEXRendererAttributes rattrs; PEXExtensionInfo *pexinfo; int done = 0; /* Open a display and initialize PEX. */ dpy = ora_init_pex( argv, &pexinfo ); if ( !dpy ) exit(1); /* Determine the best visual to use. */ ora_find_best_visual( dpy, &vis_info ); /* Get a standard colormap for the visual. */ if ( !ora_get_standard_colormap( dpy, &vis_info, &cmap_info ) ) { fprintf ( stderr, "Cannot find a standard colormap\n" ); exit(1); } ora_set_stdcmap_approx( &vis_info, &cmap_info, &capx_info ); /* Create the window, giving it a gray background. */ bkgd_color.red = bkgd_color.green = bkgd_color.blue = 0x5555; bkgd_color.flags = DoRed | DoGreen | DoBlue; window = ora_create_window( dpy, &vis_info, &cmap_info, WIN_GEOM, &bkgd_color ); if ( IMMED_MODE_SPT( pexinfo ) ) { renderer = ora_setup_renderer( dpy, window, &capx_info, &rattrs ); } else { fprintf( stderr, "No immediate mode.\n" ); exit(1); } /* Set the attribute bundles. */ set_bundles( dpy, renderer, rattrs.line_bundle ); /* Read and respond to X events. */ XSelectInput( dpy, window, ExposureMask | ButtonPressMask ); while ( !done ) { XNextEvent( dpy, &event ); switch ( event.type ) { case Expose: /* Flush remaining Expose events, then redraw. */ while ( XCheckTypedWindowEvent( dpy, window, Expose, &event ) ) ; /* empty statement */ redraw( dpy, window, renderer ); break; case ButtonPress: done = 1; break; } } XCloseDisplay( dpy ); return 0; }