/* redraw.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" static PEXCoord points[] = {{0.2, 0.2, 0.0}, {0.4, 0.7, 0.0}, {0.6, 0.3, 0.0}, {0.8, 0.8, 0.0}}; void redraw( dpy, window, renderer ) Display *dpy; Window window; PEXRenderer renderer; { PEXColor color; PEXBeginRendering( dpy, window, renderer ); { SET_COLOR( 1, 0, 0, color ); PEXSetLineColor( dpy, renderer, PEXOCRender, PEXColorTypeRGB, &color ); PEXSetLineWidth( dpy, renderer, PEXOCRender, 2.0 ); PEXSetLineType( dpy, renderer, PEXOCRender, PEXLineTypeDashed ); PEXPolyline( dpy, renderer, PEXOCRender, 4, points ); } PEXEndRendering( dpy, renderer, True ); XFlush( dpy ); } #define MAX_RECTS 10 void expose_5_1( dpy, window, renderer, event ) Display *dpy; Window window; PEXRenderer renderer; XEvent *event; { XExposeEvent *expose = &event->xexpose; PEXDeviceRect rects[MAX_RECTS]; XWindowAttributes wattrs; PEXRendererAttributes rattrs; unsigned long mask; unsigned short num_rects = 0; /* Get the current window size. */ XGetWindowAttributes( dpy, window, &wattrs ); /* Form the clip list for the exposure, converting the event */ /* rectangle to device coordinates in the process. */ do { rects[num_rects].xmin = expose->x; rects[num_rects].xmax = rects[num_rects].xmin + expose->width; rects[num_rects].ymax = wattrs.height - expose->y; rects[num_rects].ymin = rects[num_rects].ymax - expose->height; ++num_rects; } while ( num_rects < MAX_RECTS && expose->count != 0 && XCheckTypedWindowEvent( dpy, window, Expose, event ) ); /* Set the renderer's clip list. */ mask = PEXRAClipList; rattrs.clip_list.count = num_rects; rattrs.clip_list.rectangles = rects; PEXChangeRenderer( dpy, renderer, mask, &rattrs ); /* Redraw the picture in the exposed regions. */ redraw( dpy, window, renderer ); /* Reset the clip list to the full window. */ rattrs.clip_list.count = 0; PEXChangeRenderer( dpy, renderer, mask, &rattrs ); } void expose_5_0( dpy, window, renderer, event ) Display *dpy; Window window; PEXRenderer renderer; XEvent *event; { /* Flush all Expose events. */ while ( XCheckTypedWindowEvent( dpy, window, Expose, event ) ) ; /* empty statement */ /* Clear the window and redraw. */ XClearWindow( dpy, window ); redraw( dpy, window, renderer ); } #define WIN_GEOM "500x500+50+50" main( argc, argv ) int argc; char *argv[]; { Display *dpy; Window window; XEvent event; XVisualInfo vis_info; XColor bkgd_colr; PEXExtensionInfo *pexinfo; PEXRenderer renderer; XStandardColormap cmap_info; PEXColorApproxEntry capx_info; PEXRendererAttributes rattrs; 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, specifying a gray background. */ bkgd_colr.red = bkgd_colr.green = bkgd_colr.blue = 0x5555; bkgd_colr.flags = DoRed | DoGreen | DoBlue; window = ora_create_window( dpy, &vis_info, &cmap_info, WIN_GEOM, &bkgd_colr ); /* Set up the PEX renderer. */ if ( IMMED_MODE_SPT( pexinfo ) ) { renderer = ora_setup_renderer( dpy, window, &capx_info, &rattrs ); } else { fprintf( stderr, "No immediate mode.\n" ); exit(1); } if ( VERSION_5_1( pexinfo ) ) { /* Set the renderer's background and clear-image attributes. */ unsigned long mask = PEXRAClearImage | PEXRABackgroundColor; rattrs.clear_image = True; rattrs.background_color.type = PEXColorTypeRGB; rattrs.background_color.value.rgb.red = 0.666; rattrs.background_color.value.rgb.green = 0.666; rattrs.background_color.value.rgb.blue = 0.666; PEXChangeRenderer( dpy, renderer, mask, &rattrs ); } /* Read and respond to X events. */ XSelectInput( dpy, window, ExposureMask | ButtonPressMask ); while ( !done ) { XNextEvent( dpy, &event ); switch ( event.type ) { case Expose: if ( VERSION_5_1( pexinfo ) ) expose_5_1( dpy, window, renderer, &event ); else expose_5_0( dpy, window, renderer, &event ); break; case ButtonPress: done = 1; break; } } XCloseDisplay( dpy ); return 0; }