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