diff options
Diffstat (limited to 'progs/xdemos')
| -rw-r--r-- | progs/xdemos/xfont.c | 279 | 
1 files changed, 170 insertions, 109 deletions
diff --git a/progs/xdemos/xfont.c b/progs/xdemos/xfont.c index 31bfb4bf94..e38265b41b 100644 --- a/progs/xdemos/xfont.c +++ b/progs/xdemos/xfont.c @@ -1,148 +1,209 @@ +/* $Id: xfont.c,v 1.2 1999/11/05 08:00:49 brianp Exp $ */ +  /* - * (c) Copyright 1993, Silicon Graphics, Inc. - * ALL RIGHTS RESERVED  - * Permission to use, copy, modify, and distribute this software for  - * any purpose and without fee is hereby granted, provided that the above - * copyright notice appear in all copies and that both the copyright notice - * and this permission notice appear in supporting documentation, and that  - * the name of Silicon Graphics, Inc. not be used in advertising - * or publicity pertaining to distribution of the software without specific, - * written prior permission.  - * - * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" - * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR - * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON - * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, - * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY - * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, - * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF - * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN - * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE - * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. + * Mesa 3-D graphics library + *  + * Copyright (C) 1999  Brian Paul   All Rights Reserved. + *  + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + *  + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software.   *  - * US Government Users Restricted Rights  - * Use, duplication, or disclosure by the Government is subject to - * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph - * (c)(1)(ii) of the Rights in Technical Data and Computer Software - * clause at DFARS 252.227-7013 and/or in similar or successor - * clauses in the FAR or the DOD or NASA FAR Supplement. - * Unpublished-- rights reserved under the copyright laws of the - * United States.  Contractor/manufacturer is Silicon Graphics, - * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311. - * - * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.   */ + +  /* - *  xfont.c - *  Draws some text in a bitmapped font.  Uses glBitmap()  - *  and other pixel routines.  Also demonstrates use of  - *  display lists. + * Example of using glXUseXFont(). + * 5 November 1999 + * Brian Paul   */ + +  #include <GL/gl.h> -#include <GL/glu.h>  #include <GL/glx.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <stdlib.h>  #include <stdio.h> +#include <stdlib.h>  #include <string.h> -#include "glaux.h" -GLuint base; -void makeRasterFont(void) +static const char *ProgramName = "xfont"; + +static const char *FontName = "fixed"; + +static GLuint FontBase = 0; + + + +static void redraw( Display *dpy, Window w ) +{ +   static const char *text = "This is glXUseXFont()"; +   printf("Redraw event\n"); + +   glClear( GL_COLOR_BUFFER_BIT ); + +   /* triangle */ +   glColor3f( 0.2, 0.2, 1.0 ); +   glBegin(GL_TRIANGLES); +   glVertex2f( 0, 0.8 ); +   glVertex2f( -0.8, -0.7 ); +   glVertex2f( 0.8, -0.7 ); +   glEnd(); + +   /* text */ +   glColor3f( 1, 1, 1 ); +   glRasterPos2f(-0.8, 0);  +   glListBase(FontBase); +   glCallLists(strlen(text), GL_UNSIGNED_BYTE, (GLubyte *) text); + +   glXSwapBuffers( dpy, w ); +} + + + +static void resize( unsigned int width, unsigned int height ) +{ +   printf("Resize event\n"); +   glViewport( 0, 0, width, height ); +   glMatrixMode( GL_PROJECTION ); +   glLoadIdentity(); +   glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ); +} + + + +static void setup_font( Display *dpy )  {      XFontStruct *fontInfo;      Font id;      unsigned int first, last; -    Display *xdisplay; -    xdisplay = auxXDisplay (); -    fontInfo = XLoadQueryFont(xdisplay,  -	"-adobe-helvetica-medium-r-normal--17-120-100-100-p-88-iso8859-1"); -    if (fontInfo == NULL) { -        printf ("no font found\n"); -	exit (0); +    fontInfo = XLoadQueryFont(dpy, FontName); +    if (!fontInfo) { +        printf("Error: font %s not found\n", FontName); +	exit(0);      }      id = fontInfo->fid;      first = fontInfo->min_char_or_byte2;      last = fontInfo->max_char_or_byte2; -    base = glGenLists((GLuint) last+1); -    if (base == 0) { -        printf ("out of display lists\n"); -	exit (0); +    FontBase = glGenLists((GLuint) last + 1); +    if (!FontBase) { +        printf("Error: unable to allocate display lists\n"); +	exit(0);      } -    glXUseXFont(id, first, last-first+1, base+first); -/*    *height = fontInfo->ascent + fontInfo->descent; -    *width = fontInfo->max_bounds.width;  */ +    glXUseXFont(id, first, last - first + 1, FontBase + first);  } -void printString(char *s) +static Window make_rgb_db_window( Display *dpy, int xpos, int ypos, +				  unsigned int width, unsigned int height )  { -    glPushAttrib (GL_LIST_BIT); -    glListBase(base); -    glCallLists(strlen(s), GL_UNSIGNED_BYTE, (GLubyte *)s); -    glPopAttrib (); -} +   int attrib[] = { GLX_RGBA, +		    GLX_RED_SIZE, 1, +		    GLX_GREEN_SIZE, 1, +		    GLX_BLUE_SIZE, 1, +		    GLX_DOUBLEBUFFER, +		    None }; +   int scrnum; +   XSetWindowAttributes attr; +   unsigned long mask; +   Window root; +   Window win; +   GLXContext ctx; +   XVisualInfo *visinfo; -void myinit (void)  -{ -    makeRasterFont (); -    glShadeModel (GL_FLAT);     -} +   scrnum = DefaultScreen( dpy ); +   root = RootWindow( dpy, scrnum ); -void display(void) -{ -    GLfloat white[3] = { 1.0, 1.0, 1.0 }; -    int i, j; -    char teststring[33]; +   visinfo = glXChooseVisual( dpy, scrnum, attrib ); +   if (!visinfo) { +      printf("Error: couldn't get an RGB, Double-buffered visual\n"); +      exit(1); +   } -    glClear(GL_COLOR_BUFFER_BIT); -    glColor3fv(white); -    for (i = 32; i < 127; i += 32) { -	glRasterPos2i(20, 200 - 18*(GLint) i/32); -	for (j = 0; j < 32; j++) -	    teststring[j] = (char) (i+j); -	teststring[32] = 0; -	printString(teststring); -    } -    glRasterPos2i(20, 100); -    printString("The quick brown fox jumps"); -    glRasterPos2i(20, 82); -    printString("over a lazy dog."); -    glFlush (); +   /* window attributes */ +   attr.background_pixel = 0; +   attr.border_pixel = 0; +   attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); +   attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; +   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; + +   win = XCreateWindow( dpy, root, 0, 0, width, height, +		        0, visinfo->depth, InputOutput, +		        visinfo->visual, mask, &attr ); + +   { +      XSizeHints sizehints; +      sizehints.x = xpos; +      sizehints.y = ypos; +      sizehints.width  = width; +      sizehints.height = height; +      sizehints.flags = USSize | USPosition; +      XSetNormalHints(dpy, win, &sizehints); +      XSetStandardProperties(dpy, win, ProgramName, ProgramName, +                              None, (char **)NULL, 0, &sizehints); +   } + + +   ctx = glXCreateContext( dpy, visinfo, NULL, True ); + +   glXMakeCurrent( dpy, win, ctx ); + +   return win;  } -void myReshape(int w, int h) + +static void event_loop( Display *dpy )  { -    glViewport(0, 0, w, h); -    glMatrixMode(GL_PROJECTION); -    glLoadIdentity(); -    glOrtho (0.0, (GLfloat) w, 0.0, (GLfloat) h, -1.0, 1.0); -    glMatrixMode(GL_MODELVIEW); -    glLoadIdentity(); +   XEvent event; + +   while (1) { +      XNextEvent( dpy, &event ); + +      switch (event.type) { +	 case Expose: +	    redraw( dpy, event.xany.window ); +	    break; +	 case ConfigureNotify: +	    resize( event.xconfigure.width, event.xconfigure.height ); +	    break; +         case KeyPress: +            exit(0); +         default: +            ;  /* no-op */ +      } +   }  } -/*  Main Loop - *  Open window with initial window size, title bar,  - *  RGBA display mode, and handle input events. - */ -int main(int argc, char** argv) + + +int main( int argc, char *argv[] )  { -    auxInitDisplayMode (AUX_SINGLE | AUX_RGB); -    auxInitPosition (0, 0, 500, 500); -    if (!auxInitWindow (argv[0])) -       auxQuit(); -    auxReshapeFunc (myReshape); -    myinit (); -    auxMainLoop(display); -    return 0; -} +   Display *dpy; +   Window win; + +   dpy = XOpenDisplay(NULL); +   win = make_rgb_db_window( dpy, 0, 0, 300, 300 ); +   setup_font( dpy ); +   glShadeModel( GL_FLAT ); +   glClearColor( 0.5, 0.5, 1.0, 1.0 ); +   XMapWindow( dpy, win ); +   event_loop( dpy ); +   return 0; +}  | 
