/*
 *  Image.cpp
 *  iphone-gl-app
 *
 *  Created by John Ryland on 15/06/09.
 *  Copyright 2009 InvertedLogic. All rights reserved.
 *
 */

#include "Debug.h"
#include <QuartzCore/QuartzCore.h>
#include "Image.h"
#include "FileSystem.h"


struct ImagePrivate
{
	unsigned int w;
	unsigned int h;
	unsigned char *b;
};


Image::Image(const char *file)
{
	ImagePrivate *d = new ImagePrivate();
	dptr = (void *)d;
	d->w = 0;
	d->h = 0;
	d->b = 0;
	File f(file);
	CGDataProviderRef provider = CGDataProviderCreateWithURL(f.toMacURL_rel());
	CGImageRef image = NULL;
	if ( !strcmp(f.extension(), ".png") )
		image = CGImageCreateWithPNGDataProvider(provider, NULL, false, kCGRenderingIntentDefault);
	else if ( !strcmp(f.extension(), ".jpg") )
		image = CGImageCreateWithJPEGDataProvider(provider, NULL, false, kCGRenderingIntentDefault);
	else {
		// ### Error, unsupported file type
	}
	if (image) {
		d->w = CGImageGetWidth(image);
		d->h = CGImageGetHeight(image);	
		d->b = (unsigned char *)malloc(d->w * d->h * 4);
		CGContextRef context = CGBitmapContextCreate(d->b, d->w, d->h, 8, d->w * 4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedLast);
		CGContextDrawImage(context, CGRectMake(0.0, 0.0, (CGFloat)d->w-0.0, (CGFloat)d->h-0.0), image);
		CGContextRelease(context);
		CGImageRelease(image);
	}
	if (provider)
		CGDataProviderRelease(provider);
}


Image::~Image()
{
	free(((ImagePrivate *)(dptr))->b);
	delete (ImagePrivate *)dptr;
}


unsigned int Image::width()
{
	return ((ImagePrivate *)(dptr))->w;
}


unsigned int Image::height()
{
	return ((ImagePrivate *)(dptr))->h;
}


unsigned char *Image::data()
{
	return ((ImagePrivate *)(dptr))->b;
}
