2 #include <ImageIO/ImageIO.h>
4 Image::Image(const std::string &path) {
5 CFStringRef str = CFStringCreateWithCString(NULL, path.c_str(), kCFStringEncodingUTF8);
6 CFURLRef url = CFURLCreateWithFileSystemPath(NULL, str, kCFURLPOSIXPathStyle, false);
7 CGImageSourceRef source = CGImageSourceCreateWithURL(url, NULL);
8 CGImageRef ref = CGImageSourceCreateImageAtIndex(source, 0, NULL);
10 _width = CGImageGetWidth(ref), _height = CGImageGetHeight(ref);
11 info = CGImageGetBitmapInfo(ref);
12 alphaInfo = CGImageGetAlphaInfo(ref);
13 colorSpace = CGImageGetColorSpace(ref);
14 bitsPerComponent = CGImageGetBitsPerComponent(ref);
16 dataRef = CGDataProviderCopyData(CGImageGetDataProvider(ref));
21 unsigned char *Image::data() const {
22 return (unsigned char*) CFDataGetBytePtr(dataRef);
25 GLfloat Image::width() const { return _width; }
26 GLfloat Image::height() const { return _height; }
28 // TODO: Properly implement this for both internal format + format
29 GLenum Image::format() const {
30 if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelMonochrome) {
31 return GL_DEPTH_COMPONENT;
33 if (alphaInfo == kCGImageAlphaNone) {
39 GLint Image::internalFormat() const {
41 case GL_DEPTH_COMPONENT: return GL_DEPTH_COMPONENT;
42 case GL_RGB: return GL_RGB;
43 default: return GL_RGBA;
47 GLenum Image::type() const {
48 bool isFloat = info & kCGBitmapFloatComponents;
49 if (isFloat) return GL_FLOAT;
50 return GL_UNSIGNED_BYTE;
53 /* switch (bitsPerComponent) { */
54 /* case 1: return GL_UNSIGNED_BYTE; */
55 /* case 16: return GL_UNSIGNED_SHORT; */
59 Image::~Image() { CFRelease(dataRef); }