diff options
Diffstat (limited to 'src/glut/dos/window.c')
-rw-r--r-- | src/glut/dos/window.c | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/src/glut/dos/window.c b/src/glut/dos/window.c new file mode 100644 index 000000000..b922746a9 --- /dev/null +++ b/src/glut/dos/window.c @@ -0,0 +1,325 @@ +/* + * DOS/DJGPP Mesa Utility Toolkit + * Version: 1.0 + * + * Copyright (C) 2005 Daniel Borca 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. + * + * 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 + * DANIEL BORCA 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. + */ + + +#include <stdio.h> + +#include "internal.h" + + +static GLuint swaptime, swapcount; + +static DMesaVisual visual = NULL; + +GLUTwindow *_glut_current, *_glut_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(); +} + + +static GLUTwindow * +_glut_window (int win) +{ + if (win > 0 && --win < MAX_WINDOWS) { + return _glut_windows[win]; + } + return NULL; +} + + +int APIENTRY +glutCreateWindow (const char *title) +{ + int i; + int m8width = (_glut_default.width + 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(_glut_default.x + m8width, _glut_default.y + _glut_default.height, _glut_visual.bpp, _glut_visual.refresh, + _glut_default.mode & GLUT_DOUBLE, + !(_glut_default.mode & GLUT_INDEX), + (_glut_default.mode & GLUT_ALPHA ) ? _glut_visual.alpha : 0, + (_glut_default.mode & GLUT_DEPTH ) ? _glut_visual.depth : 0, + (_glut_default.mode & GLUT_STENCIL) ? _glut_visual.stencil : 0, + (_glut_default.mode & GLUT_ACCUM ) ? _glut_visual.accum : 0))==NULL) { + return 0; + } + + DMesaGetIntegerv(DMESA_GET_SCREEN_SIZE, _glut_visual.geometry); + DMesaGetIntegerv(DMESA_GET_DRIVER_CAPS, &_glut_visual.flags); + + /* 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 (_glut_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, _glut_default.x, _glut_default.y, m8width, _glut_default.height)) == 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; + } + + _glut_current = _glut_windows[i] = w; + + w->num = ++i; + w->xpos = _glut_default.x; + w->ypos = _glut_default.y; + w->width = m8width; + w->height = _glut_default.height; + 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) +{ + GLUTwindow *w = _glut_window(win); + if (w != NULL) { + if (w->destroy) { + w->destroy(); + } + DMesaMakeCurrent(NULL, NULL); + DMesaDestroyBuffer(w->buffer); + DMesaDestroyContext(w->context); + free(w); + _glut_windows[win - 1] = NULL; + } +} + + +void APIENTRY +glutPostRedisplay (void) +{ + _glut_current->redisplay = GL_TRUE; +} + + +void APIENTRY +glutSwapBuffers (void) +{ + if (_glut_current->show_mouse) { + /* XXX scare mouse */ + DMesaSwapBuffers(_glut_current->buffer); + /* XXX unscare mouse */ + } else { + DMesaSwapBuffers(_glut_current->buffer); + } + + if (_glut_fps) { + GLint t = glutGet(GLUT_ELAPSED_TIME); + swapcount++; + if (swaptime == 0) + swaptime = t; + else if (t - swaptime > _glut_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 _glut_current->num; +} + + +void APIENTRY +glutSetWindow (int win) +{ + GLUTwindow *w = _glut_window(win); + if (w != NULL) { + _glut_current = w; + DMesaMakeCurrent(_glut_current->context, _glut_current->buffer); + } +} + + +void APIENTRY +glutSetWindowTitle (const char *title) +{ +} + + +void APIENTRY +glutSetIconTitle (const char *title) +{ +} + + +void APIENTRY +glutPositionWindow (int x, int y) +{ + if (DMesaMoveBuffer(x, y)) { + _glut_current->xpos = x; + _glut_current->ypos = y; + } +} + + +void APIENTRY +glutReshapeWindow (int width, int height) +{ + if (DMesaResizeBuffer(width, height)) { + _glut_current->width = width; + _glut_current->height = height; + if (_glut_current->reshape) { + _glut_current->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) +{ +} + + +void APIENTRY +glutCloseFunc (GLUTdestroyCB destroy) +{ + _glut_current->destroy = destroy; +} + + +void APIENTRY +glutPostWindowRedisplay (int win) +{ + GLUTwindow *w = _glut_window(win); + if (w != NULL) { + w->redisplay = GL_TRUE; + } +} + + +void * APIENTRY +glutGetWindowData (void) +{ + return _glut_current->data; +} + + +void APIENTRY +glutSetWindowData (void *data) +{ + _glut_current->data = data; +} |