aboutsummaryrefslogtreecommitdiff
path: root/progs/redbook/stroke.c
diff options
context:
space:
mode:
Diffstat (limited to 'progs/redbook/stroke.c')
-rw-r--r--progs/redbook/stroke.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/progs/redbook/stroke.c b/progs/redbook/stroke.c
new file mode 100644
index 000000000..19b0391cb
--- /dev/null
+++ b/progs/redbook/stroke.c
@@ -0,0 +1,195 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/*
+ * (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.
+ *
+ * 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.
+ */
+/*
+ * stroke.c
+ * This program demonstrates some characters of a
+ * stroke (vector) font. The characters are represented
+ * by display lists, which are given numbers which
+ * correspond to the ASCII values of the characters.
+ * Use of glCallLists() is demonstrated.
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#define PT 1
+#define STROKE 2
+#define END 3
+
+typedef struct charpoint {
+ GLfloat x, y;
+ int type;
+} CP;
+
+CP Adata[] = {
+ { 0, 0, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT},
+ {5, 9, PT}, {5, 0, STROKE}, {0, 5, PT}, {5, 5, END}
+};
+
+CP Edata[] = {
+ {5, 0, PT}, {0, 0, PT}, {0, 10, PT}, {5, 10, STROKE},
+ {0, 5, PT}, {4, 5, END}
+};
+
+CP Pdata[] = {
+ {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
+ {4, 5, PT}, {0, 5, END}
+};
+
+CP Rdata[] = {
+ {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
+ {4, 5, PT}, {0, 5, STROKE}, {3, 5, PT}, {5, 0, END}
+};
+
+CP Sdata[] = {
+ {0, 1, PT}, {1, 0, PT}, {4, 0, PT}, {5, 1, PT}, {5, 4, PT},
+ {4, 5, PT}, {1, 5, PT}, {0, 6, PT}, {0, 9, PT}, {1, 10, PT},
+ {4, 10, PT}, {5, 9, END}
+};
+
+/* drawLetter() interprets the instructions from the array
+ * for that letter and renders the letter with line segments.
+ */
+void drawLetter(CP *l)
+{
+ glBegin(GL_LINE_STRIP);
+ for (;;) {
+ switch (l->type) {
+ case PT:
+ glVertex2fv(&l->x);
+ break;
+ case STROKE:
+ glVertex2fv(&l->x);
+ glEnd();
+ glBegin(GL_LINE_STRIP);
+ break;
+ case END:
+ glVertex2fv(&l->x);
+ glEnd();
+ glTranslatef(8.0, 0.0, 0.0);
+ return;
+ }
+ l++;
+ }
+}
+
+/* Create a display list for each of 6 characters */
+void myinit (void)
+{
+ GLuint base;
+
+ glShadeModel (GL_FLAT);
+
+ base = glGenLists (128);
+ glListBase(base);
+ glNewList(base+'A', GL_COMPILE); drawLetter(Adata); glEndList();
+ glNewList(base+'E', GL_COMPILE); drawLetter(Edata); glEndList();
+ glNewList(base+'P', GL_COMPILE); drawLetter(Pdata); glEndList();
+ glNewList(base+'R', GL_COMPILE); drawLetter(Rdata); glEndList();
+ glNewList(base+'S', GL_COMPILE); drawLetter(Sdata); glEndList();
+ glNewList(base+' ', GL_COMPILE); glTranslatef(8.0, 0.0, 0.0); glEndList();
+}
+
+char *test1 = "A SPARE SERAPE APPEARS AS";
+char *test2 = "APES PREPARE RARE PEPPERS";
+
+void printStrokedString(char *s)
+{
+ GLsizei len = (GLsizei) strlen(s);
+ glCallLists(len, GL_BYTE, (GLbyte *)s);
+}
+
+void display(void)
+{
+ glClear(GL_COLOR_BUFFER_BIT);
+ glColor3f(1.0, 1.0, 1.0);
+ glPushMatrix();
+ glScalef(2.0, 2.0, 2.0);
+ glTranslatef(10.0, 30.0, 0.0);
+ printStrokedString(test1);
+ glPopMatrix();
+ glPushMatrix();
+ glScalef(2.0, 2.0, 2.0);
+ glTranslatef(10.0, 13.0, 0.0);
+ printStrokedString(test2);
+ glPopMatrix();
+ glFlush();
+}
+
+static void reshape(GLsizei w, GLsizei h)
+{
+ glViewport(0, 0, w, h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 27: /* Escape */
+ exit(0);
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+/* Main Loop
+ * Open window with initial window size, title bar,
+ * RGBA display mode, and handle input events.
+ */
+int main(int argc, char** argv)
+{
+ glutInit(&argc, argv);
+ glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
+ glutInitWindowSize (440, 120);
+ glutCreateWindow (argv[0]);
+ myinit ();
+ glutDisplayFunc(display);
+ glutReshapeFunc(reshape);
+ glutKeyboardFunc(key);
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}