/* * 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 #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; inum = ++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) { }