PBR checkpoint
[opengl.git] / image.cpp
1 #include "image.hpp"
2 #include <ImageIO/ImageIO.h>
3
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);
9         /* auto provider = CGDataProviderCreateWithFilename(path.c_str()); */
10         /* std::ifstream file(path); */
11         /* long magic; */
12         /* file.read((char*)&magic, 8); */
13         /* file.close(); */
14
15         /* CGImageRef ref; */
16
17         /* if (magic == 0x0a1a0a0d474e5089) // png magic number */
18         /*      ref = CGImageCreateWithPNGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault); */
19         /* else */
20         /*      ref = CGImageCreateWithJPEGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault); */
21
22         _width = CGImageGetWidth(ref), _height = CGImageGetHeight(ref);
23         info = CGImageGetBitmapInfo(ref);
24         alphaInfo = CGImageGetAlphaInfo(ref);
25         colorSpace = CGImageGetColorSpace(ref);
26
27         dataRef = CGDataProviderCopyData(CGImageGetDataProvider(ref));
28         CGImageRelease(ref);
29
30 }
31
32 unsigned char *Image::data() const {
33         return (unsigned char*) CFDataGetBytePtr(dataRef);
34 }
35
36 GLfloat Image::width() const { return _width; }
37 GLfloat Image::height() const { return _height; }
38
39 GLuint Image::format() const {
40         if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelMonochrome) {
41                 return GL_DEPTH_COMPONENT;
42         }
43         if (alphaInfo == kCGImageAlphaNone) {
44                 return GL_RGB;
45         }
46         return GL_RGBA;
47 }
48
49 Image::~Image() { CFRelease(dataRef); }