X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=image.cpp;h=fb534be70302ef92ca80ab2ba3a8255a10d6326c;hp=e3c5cbdb81fe2355c63c9452b25f8a92adec68f9;hb=671418e7effc7cbbb7e05df216291406d2b82dd7;hpb=0291188124d08368ce28b308482604218bd75393 diff --git a/image.cpp b/image.cpp index e3c5cbd..fb534be 100644 --- 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 { @@ -36,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: