#include <X11/Xlib.h>
#include <GL/glx.h>

#include <glut.h>
#include "glutint.h"

extern Display *__glutDisplay;
extern int __glutScreen;
extern GLUTwindow *__glutCurrentWindow;

static XImage *ximage=0;
static GLXDrawable xdraw=0;	/* wordt maar 1 keer gedaan, voor mainwin */
static GC curGC, blackGC, grayGC, whiteGC, darkGC, lightGC;

void glutDrawInit(void)
{
	XGCValues gcvals;
	int dep;

	gcvals.font= 0;
	xdraw= glXGetCurrentDrawable();
	
	dep= glutGet(GLUT_WINDOW_BUFFER_SIZE);
	if(dep<12) printf("Error: screen depth (%d) should be at least 15.\n", dep);
	
	gcvals.foreground = 0;
	blackGC = XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
	
#ifdef __sgi
	if(dep==15 || dep==16) {
#else
	if(dep==15) {
#endif
		gcvals.foreground=  (10 + (10<<5) + (10<<10) ) ;
		darkGC= XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
	
		gcvals.foreground= (15 + (15<<5) + (15<<10) );
		grayGC= XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
	
		gcvals.foreground= (23 + (23<<5) + (23<<10) );
		lightGC= XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
	
		gcvals.foreground= (31 + (31<<5) + (31<<10) );
		whiteGC= XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
	}
	else {
		gcvals.foreground= (dep==16? (10 + (10<<6) + (10<<11)) : 0x555555 );
		darkGC= XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
	
		gcvals.foreground= (dep==16? (15 + (15<<6) + (15<<11)) : 0x999999 );
		grayGC= XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
		
		gcvals.foreground= (dep==16? (23 + (23<<6) + (23<<11)) : 0xcccccc );
		lightGC= XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
	
		gcvals.foreground= (dep==16? (31 + (31<<6) + (31<<11)) : 0xffffff );
		whiteGC= XCreateGC(__glutDisplay, xdraw, GCForeground, &gcvals);
	}
	curGC= blackGC;	
}

void glutDrawLine(int x1, int y1, int x2, int y2)
{
	/* ander coordinatensysteem! */
	y1= (__glutCurrentWindow->height-y1);
	y2= (__glutCurrentWindow->height-y2);

	XDrawLine(__glutDisplay, xdraw, curGC, x1, y1, x2, y2);
}

void glutDrawRect(int x1, int y1, int x2, int y2)
{
	int sy;
	
	/* ander coordinatensysteem! */
	sy= y2-y1;
	y1= (__glutCurrentWindow->height-y1-sy);

	XDrawRectangle(__glutDisplay, xdraw, curGC, x1, y1 , x2-x1, sy);
}

void glutDrawRectFilled(int x1, int y1, int x2, int y2)
{
	int sy;
	
	/* ander coordinatensysteem! */
	sy= y2-y1;
	y1= (__glutCurrentWindow->height-y1-sy);

	XFillRectangle(__glutDisplay, xdraw, curGC, x1, y1 , x2-x1, sy);		
}

void glutDrawSetColor(int col)
{
	if(col==GLUTCOLWHITE) curGC= whiteGC;
	else if(col==GLUTCOLDGREY) curGC= darkGC;
	else if(col==GLUTCOLLGREY) curGC= lightGC;
	else if(col==GLUTCOLGREY) curGC= grayGC;
	else if(col==GLUTCOLBLACK) curGC= blackGC;	
	else printf ("ERROR: Bad color code passed to DrawSetColor\n");
}

void glutDrawUpdate(void)
{
	XFlush(__glutDisplay);
	XSync(__glutDisplay, 0);
}

void glutCustomCursor(char *data1, char *data2, int size)
{
	Pixmap source, mask;
	Cursor cursor;
	XColor fg, bg;
	
	if(XAllocNamedColor(__glutDisplay, DefaultColormap(__glutDisplay, __glutScreen),
		"White", &fg, &fg) == 0) return;
	if(XAllocNamedColor(__glutDisplay, DefaultColormap(__glutDisplay, __glutScreen),
		"Red", &bg, &bg) == 0) return;


	source= XCreateBitmapFromData(__glutDisplay,  xdraw, data2, size, size);
	mask= XCreateBitmapFromData(__glutDisplay, xdraw, data1, size, size);
		
	cursor= XCreatePixmapCursor(__glutDisplay, source, mask, &fg, &bg, 7, 7);
		
	XFreePixmap(__glutDisplay, source);
	XFreePixmap(__glutDisplay, mask);
		
	XDefineCursor(__glutDisplay, xdraw, cursor);
}