PBR checkpoint
[opengl.git] / image.cpp
index 71114b0d85c8f239800602b3e0e1fcfe0431493b..13174c08ae88dec5c6e5a44552dc681389e3a959 100644 (file)
--- a/image.cpp
+++ b/image.cpp
@@ -1,31 +1,49 @@
 #include "image.hpp"
+#include <ImageIO/ImageIO.h>
 
 Image::Image(const std::string &path) {
-       auto provider = CGDataProviderCreateWithFilename(path.c_str());
-       std::ifstream file(path);
-       long magic;
-       file.read((char*)&magic, 8);
-       file.close();
-
-       CGImageRef ref;
-
-       if (magic == 0x0a1a0a0d474e5089) // png magic number
-               ref = CGImageCreateWithPNGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault);
-       else
-               ref = CGImageCreateWithJPEGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault);
+       CFStringRef str = CFStringCreateWithCString(NULL, path.c_str(), kCFStringEncodingUTF8);
+       CFURLRef url = CFURLCreateWithFileSystemPath(NULL, str, kCFURLPOSIXPathStyle, false);
+       CGImageSourceRef source = CGImageSourceCreateWithURL(url, NULL);
+       CGImageRef ref = CGImageSourceCreateImageAtIndex(source, 0, NULL);
+       /* auto provider = CGDataProviderCreateWithFilename(path.c_str()); */
+       /* std::ifstream file(path); */
+       /* long magic; */
+       /* file.read((char*)&magic, 8); */
+       /* file.close(); */
+
+       /* CGImageRef ref; */
+
+       /* if (magic == 0x0a1a0a0d474e5089) // png magic number */
+       /*      ref = CGImageCreateWithPNGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault); */
+       /* else */
+       /*      ref = CGImageCreateWithJPEGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault); */
 
        _width = CGImageGetWidth(ref), _height = CGImageGetHeight(ref);
+       info = CGImageGetBitmapInfo(ref);
+       alphaInfo = CGImageGetAlphaInfo(ref);
+       colorSpace = CGImageGetColorSpace(ref);
 
        dataRef = CGDataProviderCopyData(CGImageGetDataProvider(ref));
        CGImageRelease(ref);
 
 }
 
-unsigned char *Image::data() {
+unsigned char *Image::data() const {
        return (unsigned char*) CFDataGetBytePtr(dataRef);
 }
 
 GLfloat Image::width() const { return _width; }
 GLfloat Image::height() const { return _height; }
 
+GLuint Image::format() const {
+       if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelMonochrome) {
+               return GL_DEPTH_COMPONENT;
+       }
+       if (alphaInfo == kCGImageAlphaNone) {
+               return GL_RGB;
+       }
+       return GL_RGBA;
+}
+
 Image::~Image() { CFRelease(dataRef); }