#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); }