blob: 06e8ea9ead1429988123cb1a450422469b4b4cf0 [file] [log] [blame]
/*
* 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_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)
{
}