Fix metal roughness texture on streaked metal material
[opengl.git] / image.cpp
index e3c5cbdb81fe2355c63c9452b25f8a92adec68f9..02fd60b878ee1122bd9a027e38df10304d681ef8 100644 (file)
--- a/image.cpp
+++ b/image.cpp
@@ -6,7 +6,24 @@ Image::Image(const std::string &path) {
        CFURLRef url = CFURLCreateWithFileSystemPath(NULL, str, kCFURLPOSIXPathStyle, false);
        CGImageSourceRef source = CGImageSourceCreateWithURL(url, NULL);
        CGImageRef ref = CGImageSourceCreateImageAtIndex(source, 0, NULL);
+       initWithImageRef(ref);
+       CGImageRelease(ref);
+}
 
+Image::Image(const unsigned char *data, size_t length, const char *formatHint) {
+       CGDataProviderRef dpRef = CGDataProviderCreateWithData(NULL, data, length, NULL);
+       CGImageRef ref;
+       if (strcmp("png", formatHint) == 0)
+               ref = CGImageCreateWithPNGDataProvider(dpRef, NULL, false, kCGRenderingIntentDefault);
+       else if (strcmp("jpg", formatHint) == 0)
+               ref = CGImageCreateWithJPEGDataProvider(dpRef, NULL, false, kCGRenderingIntentDefault);
+       else
+               abort();
+       initWithImageRef(ref);
+       CGImageRelease(ref);
+}
+
+void Image::initWithImageRef(CGImageRef ref) {
        _width = CGImageGetWidth(ref), _height = CGImageGetHeight(ref);
        info = CGImageGetBitmapInfo(ref);
        alphaInfo = CGImageGetAlphaInfo(ref);
@@ -14,8 +31,6 @@ Image::Image(const std::string &path) {
        bitsPerComponent = CGImageGetBitsPerComponent(ref);
 
        dataRef = CGDataProviderCopyData(CGImageGetDataProvider(ref));
-       CGImageRelease(ref);
-
 }
 
 unsigned char *Image::data() const {