use tnl_emit_func, it's safer
[mesa.git] / src / glut / dos / window.c
index a7a7d9ca59b5d46646558b18fc28e1ded564af83..ed95451e8d14513cd89a3618712eaa609eeb50ac 100644 (file)
-/*\r
- * Mesa 3-D graphics library\r
- * Version:  4.1\r
- * Copyright (C) 1995-1998  Brian Paul\r
- *\r
- * This library is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU Library General Public\r
- * License as published by the Free Software Foundation; either\r
- * version 2 of the License, or (at your option) any later version.\r
- *\r
- * This library is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
- * Library General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU Library General Public\r
- * License along with this library; if not, write to the Free\r
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
- */\r
-\r
-/*\r
- * DOS/DJGPP glut driver v1.3 for Mesa 5.0\r
- *\r
- *  Copyright (C) 2002 - Borca Daniel\r
- *  Email : dborca@yahoo.com\r
- *  Web   : http://www.geocities.com/dborca\r
- */\r
-\r
-\r
-#include "glutint.h"\r
-#include "GL/dmesa.h"\r
-\r
-\r
-\r
-GLUTwindow *g_curwin;\r
-\r
-static DMesaVisual  visual  = NULL;\r
-static DMesaContext context = NULL;\r
-static GLUTwindow *windows[MAX_WINDOWS];\r
-\r
-\r
-\r
-static void clean (void)\r
-{\r
- int i;\r
-\r
- for (i=1; i<=MAX_WINDOWS; i++) {\r
-     glutDestroyWindow(i);\r
- }\r
- if (context) DMesaDestroyContext(context);\r
- if (visual)  DMesaDestroyVisual(visual);\r
-\r
- pc_close_stdout();\r
- pc_close_stderr();\r
-}\r
-\r
-\r
-\r
-int APIENTRY glutCreateWindow (const char *title)\r
-{\r
- int i;\r
- GLint screen_size[2];\r
- int m8width = (g_init_w + 7) & ~7;\r
-\r
- if (!visual) {\r
-    if ((visual=DMesaCreateVisual(g_init_x + m8width, g_init_y + g_init_h, g_bpp, g_refresh,\r
-                                  g_display_mode & GLUT_DOUBLE,\r
-                                  !(g_display_mode & GLUT_INDEX),\r
-                                  g_display_mode & GLUT_ALPHA,\r
-                                  g_display_mode & GLUT_DEPTH  ?DEPTH_SIZE  :0,\r
-                                  g_display_mode & GLUT_STENCIL?STENCIL_SIZE:0,\r
-                                  g_display_mode & GLUT_ACCUM  ?ACCUM_SIZE  :0))==NULL) {\r
-       return 0;\r
-    }\r
-\r
-    if ((context=DMesaCreateContext(visual, NULL))==NULL) {\r
-       DMesaDestroyVisual(visual);\r
-       return 0;\r
-    }\r
-\r
-    pc_open_stdout();\r
-    pc_open_stderr();\r
-    pc_atexit(clean);\r
- }\r
-\r
- for (i=0; i<MAX_WINDOWS; i++) {\r
-     if (windows[i] == NULL) {\r
-        DMesaBuffer b;\r
-        GLUTwindow *w;\r
-\r
-        if ((w=(GLUTwindow *)calloc(1, sizeof(GLUTwindow))) == NULL) {\r
-           return 0;\r
-        }\r
-\r
-        if ((b=DMesaCreateBuffer(visual, g_init_x, g_init_y, m8width, g_init_h))==NULL) {\r
-           free(w);\r
-           return 0;\r
-        }\r
-        if (!DMesaMakeCurrent(context, b)) {\r
-           DMesaDestroyBuffer(b);\r
-           free(w);\r
-           return 0;\r
-        }\r
-\r
-        g_curwin = windows[i] = w;\r
-\r
-        w->num = ++i;\r
-        w->xpos = g_init_x;\r
-        w->ypos = g_init_y;\r
-        w->width = m8width;\r
-        w->height = g_init_h;\r
-        w->buffer = b;\r
-\r
-        return i;\r
-     }\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-\r
-\r
-int APIENTRY glutCreateSubWindow (int win, int x, int y, int width, int height)\r
-{\r
- return GL_FALSE;\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutDestroyWindow (int win)\r
-{\r
- if (windows[--win]) {\r
-    DMesaDestroyBuffer(windows[win]->buffer);\r
-    free(windows[win]);\r
-    windows[win] = NULL;\r
- }\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutPostRedisplay (void)\r
-{\r
- g_redisplay = GL_TRUE;\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutSwapBuffers (void)\r
-{\r
- if (g_curwin->show_mouse) {\r
-    /* XXX scare mouse */\r
-    DMesaSwapBuffers(g_curwin->buffer);\r
-    /* XXX unscare mouse */\r
- } else {\r
-    DMesaSwapBuffers(g_curwin->buffer);\r
- }\r
-}\r
-\r
-\r
-\r
-int APIENTRY glutGetWindow (void)\r
-{\r
- return g_curwin->num;\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutSetWindow (int win)\r
-{\r
- g_curwin = windows[win - 1];\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutSetWindowTitle (const char *title)\r
-{\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutSetIconTitle (const char *title)\r
-{\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutPositionWindow (int x, int y)\r
-{\r
- if (DMesaMoveBuffer(x, y)) {\r
-    g_curwin->xpos = x;\r
-    g_curwin->ypos = y;\r
- }\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutReshapeWindow (int width, int height)\r
-{ \r
- if (DMesaResizeBuffer(width, height)) {\r
-    g_curwin->width = width;\r
-    g_curwin->height = height;\r
-    if (g_curwin->reshape) {\r
-       g_curwin->reshape(width, height);\r
-    } else {\r
-       glViewport(0, 0, width, height);\r
-    }\r
- }\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutFullScreen (void)\r
-{\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutPopWindow (void)\r
-{\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutPushWindow (void)\r
-{\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutIconifyWindow (void)\r
-{\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutShowWindow (void)\r
-{\r
-}\r
-\r
-\r
-\r
-void APIENTRY glutHideWindow (void)\r
-{\r
-}\r
+/*
+ * Mesa 3-D graphics library
+ * Version:  4.1
+ * Copyright (C) 1995-1998  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * DOS/DJGPP glut driver v1.4 for Mesa
+ *
+ *  Copyright (C) 2002 - Borca Daniel
+ *  Email : dborca@users.sourceforge.net
+ *  Web   : http://www.geocities.com/dborca
+ */
+
+
+#include <stdio.h>
+
+#include "glutint.h"
+#include "GL/dmesa.h"
+
+
+
+GLUTwindow *g_curwin;
+static GLuint swaptime, swapcount;
+
+static DMesaVisual visual = NULL;
+GLUTwindow *g_windows[MAX_WINDOWS];
+
+
+
+static void clean (void)
+{
+ int i;
+
+ for (i=1; i<=MAX_WINDOWS; i++) {
+     glutDestroyWindow(i);
+ }
+ if (visual) DMesaDestroyVisual(visual);
+
+ pc_close_stdout();
+ pc_close_stderr();
+}
+
+
+
+int APIENTRY glutCreateWindow (const char *title)
+{
+ int i;
+ int m8width = (g_init_w + 7) & ~7;
+
+ /* We set the Visual once. This will be our desktop (graphic mode).
+  * We should do this in the `glutInit' code, but we don't have any idea
+  * about its geometry. Supposedly, when we are about to create one
+  * window, we have a slight idea about resolution.
+  */
+ if (!visual) {
+    if ((visual=DMesaCreateVisual(g_init_x + m8width, g_init_y + g_init_h, g_bpp, g_refresh,
+                                  g_display_mode & GLUT_DOUBLE,
+                                  !(g_display_mode & GLUT_INDEX),
+                                  (g_display_mode & GLUT_ALPHA  ) ? g_alpha   : 0,
+                                  (g_display_mode & GLUT_DEPTH  ) ? g_depth   : 0,
+                                  (g_display_mode & GLUT_STENCIL) ? g_stencil : 0,
+                                  (g_display_mode & GLUT_ACCUM  ) ? g_accum   : 0))==NULL) {
+       return 0;
+    }
+
+    /* Also hook stdio/stderr once */
+    pc_open_stdout();
+    pc_open_stderr();
+    pc_atexit(clean);
+ }
+
+ /* Search for an empty slot.
+  * Each window has its own rendering Context and its own Buffer.
+  */
+ for (i=0; i<MAX_WINDOWS; i++) {
+     if (g_windows[i] == NULL) {
+        DMesaContext c;
+        DMesaBuffer b;
+        GLUTwindow *w;
+
+        if ((w = (GLUTwindow *)calloc(1, sizeof(GLUTwindow))) == NULL) {
+           return 0;
+        }
+
+        /* Allocate the rendering Context. */
+        if ((c = DMesaCreateContext(visual, NULL)) == NULL) {
+           free(w);
+           return 0;
+        }
+
+        /* Allocate the Buffer (displayable area).
+         * We have to specify buffer size and position (inside the desktop).
+         */
+        if ((b = DMesaCreateBuffer(visual, g_init_x, g_init_y, m8width, g_init_h)) == NULL) {
+           DMesaDestroyContext(c);
+           free(w);
+           return 0;
+        }
+
+        /* Bind Buffer to Context and make the Context the current one. */
+        if (!DMesaMakeCurrent(c, b)) {
+           DMesaDestroyBuffer(b);
+           DMesaDestroyContext(c);
+           free(w);
+           return 0;
+        }
+
+        g_curwin = g_windows[i] = w;
+
+        w->num = ++i;
+        w->xpos = g_init_x;
+        w->ypos = g_init_y;
+        w->width = m8width;
+        w->height = g_init_h;
+        w->context = c;
+        w->buffer = b;
+
+        return i;
+     }
+ }
+
+ return 0;
+}
+
+
+
+int APIENTRY glutCreateSubWindow (int win, int x, int y, int width, int height)
+{
+ return GL_FALSE;
+}
+
+
+
+void APIENTRY glutDestroyWindow (int win)
+{
+ if (g_windows[--win]) {
+    GLUTwindow *w = g_windows[win];
+    DMesaMakeCurrent(NULL, NULL);
+    DMesaDestroyBuffer(w->buffer);
+    DMesaDestroyContext(w->context);
+    free(w);
+    g_windows[win] = NULL;
+ }
+}
+
+
+
+void APIENTRY glutPostRedisplay (void)
+{
+ g_curwin->redisplay = GL_TRUE;
+}
+
+
+
+void APIENTRY glutSwapBuffers (void)
+{
+ if (g_curwin->show_mouse) {
+    /* XXX scare mouse */
+    DMesaSwapBuffers(g_curwin->buffer);
+    /* XXX unscare mouse */
+ } else {
+    DMesaSwapBuffers(g_curwin->buffer);
+ }
+
+ if (g_fps) {
+    GLint t = glutGet(GLUT_ELAPSED_TIME);
+    swapcount++;
+    if (swaptime == 0)
+       swaptime = t;
+    else if (t - swaptime > g_fps) {
+       double time = 0.001 * (t - swaptime);
+       double fps = (double)swapcount / time;
+       fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n", swapcount, time, fps);
+       swaptime = t;
+       swapcount = 0;
+    }
+ }
+}
+
+
+
+int APIENTRY glutGetWindow (void)
+{
+ return g_curwin->num;
+}
+
+
+
+void APIENTRY glutSetWindow (int win)
+{
+ g_curwin = g_windows[win - 1];
+ DMesaMakeCurrent(g_curwin->context, g_curwin->buffer);
+}
+
+
+
+void APIENTRY glutSetWindowTitle (const char *title)
+{
+}
+
+
+
+void APIENTRY glutSetIconTitle (const char *title)
+{
+}
+
+
+
+void APIENTRY glutPositionWindow (int x, int y)
+{
+ if (DMesaMoveBuffer(x, y)) {
+    g_curwin->xpos = x;
+    g_curwin->ypos = y;
+ }
+}
+
+
+
+void APIENTRY glutReshapeWindow (int width, int height)
+{ 
+ if (DMesaResizeBuffer(width, height)) {
+    g_curwin->width = width;
+    g_curwin->height = height;
+    if (g_curwin->reshape) {
+       g_curwin->reshape(width, height);
+    } else {
+       glViewport(0, 0, width, height);
+    }
+ }
+}
+
+
+
+void APIENTRY glutFullScreen (void)
+{
+}
+
+
+
+void APIENTRY glutPopWindow (void)
+{
+}
+
+
+
+void APIENTRY glutPushWindow (void)
+{
+}
+
+
+
+void APIENTRY glutIconifyWindow (void)
+{
+}
+
+
+
+void APIENTRY glutShowWindow (void)
+{
+}
+
+
+
+void APIENTRY glutHideWindow (void)
+{
+}