X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=image.cpp;fp=image.cpp;h=13174c08ae88dec5c6e5a44552dc681389e3a959;hp=71114b0d85c8f239800602b3e0e1fcfe0431493b;hb=a03f2bc751bbd7f91cbc2f52d2f0f6e753d6f776;hpb=210d1b08cec40845d849e89baea8a9cc96917f60 diff --git a/image.cpp b/image.cpp index 71114b0..13174c0 100644 --- a/image.cpp +++ b/image.cpp @@ -1,31 +1,49 @@ #include "image.hpp" +#include 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); }