Some tidying up
[opengl.git] / image.cpp
index 6c09fa31caaca7335e18f302fb687d6393a85dc5..fb534be70302ef92ca80ab2ba3a8255a10d6326c 100644 (file)
--- a/image.cpp
+++ b/image.cpp
@@ -10,9 +10,15 @@ Image::Image(const std::string &path) {
        CGImageRelease(ref);
 }
 
-Image::Image(const unsigned char *data, size_t length) {
+Image::Image(const unsigned char *data, size_t length, const char *formatHint) {
        CGDataProviderRef dpRef = CGDataProviderCreateWithData(NULL, data, length, NULL);
-       CGImageRef ref = CGImageCreateWithJPEGDataProvider(dpRef, NULL, false, kCGRenderingIntentDefault);
+       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);
 }
@@ -45,17 +51,27 @@ GLenum Image::format() const {
        return GL_RGBA;
 }
 
+inline bool Image::usesFloat() const { return info & kCGBitmapFloatComponents; }
+
 GLint Image::internalFormat() const {
        switch (format()) {
                case GL_DEPTH_COMPONENT: return GL_DEPTH_COMPONENT;
-               case GL_RGB: return GL_RGB;
+        case GL_RGB:
+            if (bitsPerComponent == 16)
+                               return usesFloat() ? GL_RGB16F : GL_RGB16;
+            else if (bitsPerComponent == 8)
+                               return GL_RGB;
+            else abort();
                default: return GL_RGBA;
        }
 }
 
 GLenum Image::type() const {
-       bool isFloat = info & kCGBitmapFloatComponents;
-       if (isFloat) return GL_FLOAT;
+       if (usesFloat()) {
+               if (bitsPerComponent == 16) return GL_HALF_FLOAT;
+               else if (bitsPerComponent == 32) return GL_FLOAT;
+               abort();
+       }
        return GL_UNSIGNED_BYTE;
        
        //TODO: