#import "cocoaGL.h"

NSWindow *cocoaGLCreateWindow(int w,int h)
{

	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    	NSWindow *window;
    	window = [[NSWindow alloc] initWithContentRect:NSMakeRect(50,50,w,h)
        				styleMask:NSTitledWindowMask | NSResizableWindowMask
        				backing:NSBackingStoreBuffered
        				defer:FALSE];

	[window setTitle:@"Dolphin on OSX"];
	//[window makeKeyAndOrderFront: nil];

	[pool release];

	return window;
}

void cocoaGLSetTitle(NSWindow *win, const char *title)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
    [win setTitle: [[[NSString alloc] initWithCString: title encoding: NSASCIIStringEncoding] autorelease]];

    [pool release];
}

void cocoaGLMakeCurrent(NSOpenGLContext *ctx, NSWindow *win)
{
    	NSAutoreleasePool *pool;

  	pool = [[NSAutoreleasePool alloc] init];

	int value = 0;
        [ctx setValues:&value forParameter:NSOpenGLCPSwapInterval];

    	if (ctx) {

            	[ctx setView:[win contentView]];
            	[ctx update];
        	[ctx makeCurrentContext];
	} else {
        	[NSOpenGLContext clearCurrentContext];
    	}

    	[pool release];

}



NSOpenGLContext* cocoaGLInit(int mode)
{
   	NSAutoreleasePool *pool;
    	NSOpenGLPixelFormatAttribute attr[32];
    	NSOpenGLPixelFormat *fmt;
    	NSOpenGLContext *context;
    	int i = 0;

	pool = [[NSAutoreleasePool alloc] init];
	
	attr[i++] = NSOpenGLPFADepthSize;
	attr[i++] = 24;
	attr[i++] = NSOpenGLPFADoubleBuffer;
	
        attr[i++] = NSOpenGLPFASampleBuffers;
        attr[i++] = mode;
        attr[i++] = NSOpenGLPFASamples;
        attr[i++] = 1;
	attr[i++] = NSOpenGLPFANoRecovery;
#ifdef GL_VERSION_1_3

#else
#ifdef GL_VERSION_1_2
#warning "your card only supports ogl 1.2, dolphin will use software renderer"
	//if opengl < 1.3 uncomment this twoo lines to use software renderer
	attr[i++] = NSOpenGLPFARendererID;
	attr[i++] = kCGLRendererGenericFloatID;
#endif
#endif
    	attr[i++] = NSOpenGLPFAScreenMask;
    	attr[i++] = CGDisplayIDToOpenGLDisplayMask(CGMainDisplayID());

    	attr[i] = 0;

    	fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr];
   	if (fmt == nil) {
        	printf("failed to create pixel format\n");
        	[pool release];
        	return NULL;
    	}

    	context = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil];

    	[fmt release];

    	if (context == nil) {
        	printf("failed to create context\n");
        	[pool release];
       	 	return NULL;
    	}

    	[pool release];

    	return context;

}

void cocoaGLDelete(NSOpenGLContext *ctx)
{
    	NSAutoreleasePool *pool;

    	pool = [[NSAutoreleasePool alloc] init];

    	[ctx clearDrawable];
    	[ctx release];

    	[pool release];

}

void cocoaGLSwap(NSOpenGLContext *ctx,NSWindow *window)
{
    	NSAutoreleasePool *pool;

    	pool = [[NSAutoreleasePool alloc] init];
	[window makeKeyAndOrderFront: nil];

    	ctx = [NSOpenGLContext currentContext];
   	if (ctx != nil) {
        	[ctx flushBuffer];
    	}
	else
	{
		printf("bad cocoa gl ctx\n");
	}
    	[pool release];

}
