/* true.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" extern void redraw(); main( argc, argv ) int argc; char *argv[]; { Display *dpy; Window window; XEvent event; XVisualInfo *vis_info, vis_templ; XColor bkgd_color; XStandardColormap cmap_info; PEXColorApproxEntry capx_info; PEXRenderer renderer; PEXRendererAttributes rattrs; PEXExtensionInfo *pexinfo; int done = 0, num_vis; /* Open a display and initialize PEX. */ dpy = ora_init_pex( argv, &pexinfo ); if ( !dpy ) exit(1); /* Get a TrueColor visual. */ vis_templ.screen = DefaultScreen( dpy ); vis_templ.class = TrueColor; vis_info = XGetVisualInfo( dpy, VisualScreenMask | VisualClassMask , &vis_templ, &num_vis ); if ( num_vis == 0 ) { fprintf ( stderr, "No TrueColor visual.\n" ); exit(1); } /* Create a colormap for the visual. */ if ( !ora_create_colormap( dpy, vis_info, &cmap_info, &capx_info ) ) { fprintf ( stderr, "Cannot create a colormap\n" ); exit(1); } /* 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 ); /* 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); } /* 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; } static PEXCoord2D border[2][4] = { /* outer contour */ {{0,0},{1,0},{1,1},{0,1}}, /* inner contour */ {{.05,.05},{.95,.05},{.95,.95},{.05,.95}} }; static char *title = "World Population"; static PEXCoord2D title_spot = {.5, .82}; static char *subtitle = "in billions"; static PEXCoord2D subtitle_spot = {.5, .75}; static char *label_1900 = "1900"; static PEXCoord2D label_1900_spot = {.20, .15}; static char *amount_1900 = "1.6"; static PEXCoord2D amount_1900_spot = {.33, .24}; static PEXCoord2D bar_1900[] = {{.28,.05},{.38,.05},{.38,.19},{.28,.19}}; static char *label_2000 = "2000"; static PEXCoord2D label_2000_spot = {.53, .15}; static char *amount_2000 = "6.1 (projected)"; static PEXCoord2D amount_2000_spot = {.66, .65}; static PEXCoord2D bar_2000[] = {{.61,.05},{.71,.05},{.71,.6},{.61,.6}}; void redraw( dpy, window, renderer ) Display *dpy; Window window; PEXRenderer renderer; { PEXColor red, yellow, white, blue; PEXListOfCoord2D contours[2]; /* Define the colors we'll use. */ SET_COLOR( 1.0, 0.0, 0.0, red ) SET_COLOR( 1.0, 1.0, 0.0, yellow ) SET_COLOR( 1.0, 1.0, 1.0, white ) SET_COLOR( 0.0, 0.0, 1.0, blue ) /* Redraw the window, after first erasing (clearing) it. */ XClearWindow( dpy, window ); PEXBeginRendering( dpy, window, renderer ); { /* Set the text alignment for the title and all labels. */ PEXSetTextAlignment( dpy, renderer, PEXOCRender, PEXHAlignCenter, PEXVAlignBase ); /* The border. */ PEXSetSurfaceEdgeFlag( dpy, renderer, PEXOCRender, PEXOn ); PEXSetSurfaceEdgeColor( dpy, renderer, PEXOCRender, PEXColorTypeRGB, &white ); PEXSetSurfaceColor( dpy, renderer, PEXOCRender, PEXColorTypeRGB, &blue ); PEXSetInteriorStyle( dpy, renderer, PEXOCRender, PEXInteriorStyleSolid ); contours[0].points = border[0]; contours[0].count = 4; contours[1].points = border[1]; contours[1].count = 4; PEXFillAreaSet2D( dpy, renderer, PEXOCRender, PEXShapeConvex, False, PEXContourNested, 2, contours ); /* The title. */ PEXSetTextColor( dpy, renderer, PEXOCRender, PEXColorTypeRGB, &white ); PEXSetCharHeight( dpy, renderer, PEXOCRender, 0.04 ); PEXText2D( dpy, renderer, PEXOCRender, &title_spot, strlen(title), title ); PEXSetCharHeight( dpy, renderer, PEXOCRender, 0.02 ); PEXText2D( dpy, renderer, PEXOCRender, &subtitle_spot, strlen(subtitle), subtitle ); /* The 1900 bar. */ PEXSetSurfaceColor( dpy, renderer, PEXOCRender, PEXColorTypeRGB, &red ); PEXFillArea2D( dpy, renderer, PEXOCRender, PEXShapeConvex, True, 4, bar_1900 ); /* The 1900 bar label. */ PEXSetTextColor( dpy, renderer, PEXOCRender, PEXColorTypeRGB, &yellow ); PEXSetCharHeight( dpy, renderer, PEXOCRender, 0.015 ); PEXText2D( dpy, renderer, PEXOCRender, &label_1900_spot, strlen(label_1900), label_1900 ); PEXText2D( dpy, renderer, PEXOCRender, &amount_1900_spot, strlen(amount_1900), amount_1900 ); /* The 2000 bar. */ PEXSetSurfaceEdgeType( dpy, renderer, PEXOCRender, PEXSurfaceEdgeDashed ); PEXFillArea2D( dpy, renderer, PEXOCRender, PEXShapeConvex, False, 4, bar_2000 ); /* The 2000 bar label. */ PEXText2D( dpy, renderer, PEXOCRender, &label_2000_spot, strlen(label_2000), label_2000 ); PEXText2D( dpy, renderer, PEXOCRender, &amount_2000_spot, strlen(amount_2000) , amount_2000 ); } PEXEndRendering( dpy, renderer, True ); XFlush( dpy ); }