X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=image.cpp;h=e3c5cbdb81fe2355c63c9452b25f8a92adec68f9;hp=13174c08ae88dec5c6e5a44552dc681389e3a959;hb=0291188124d08368ce28b308482604218bd75393;hpb=a03f2bc751bbd7f91cbc2f52d2f0f6e753d6f776 diff --git a/image.cpp b/image.cpp index 13174c0..e3c5cbd 100644 --- a/image.cpp +++ b/image.cpp @@ -6,23 +6,12 @@ Image::Image(const std::string &path) { 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); + bitsPerComponent = CGImageGetBitsPerComponent(ref); dataRef = CGDataProviderCopyData(CGImageGetDataProvider(ref)); CGImageRelease(ref); @@ -36,7 +25,8 @@ unsigned char *Image::data() const { GLfloat Image::width() const { return _width; } GLfloat Image::height() const { return _height; } -GLuint Image::format() const { +// TODO: Properly implement this for both internal format + format +GLenum Image::format() const { if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelMonochrome) { return GL_DEPTH_COMPONENT; } @@ -46,4 +36,24 @@ GLuint Image::format() const { return GL_RGBA; } +GLint Image::internalFormat() const { + switch (format()) { + case GL_DEPTH_COMPONENT: return GL_DEPTH_COMPONENT; + case GL_RGB: return GL_RGB; + default: return GL_RGBA; + } +} + +GLenum Image::type() const { + bool isFloat = info & kCGBitmapFloatComponents; + if (isFloat) return GL_FLOAT; + return GL_UNSIGNED_BYTE; + + //TODO: + /* switch (bitsPerComponent) { */ + /* case 1: return GL_UNSIGNED_BYTE; */ + /* case 16: return GL_UNSIGNED_SHORT; */ + /* case 24: */ +} + Image::~Image() { CFRelease(dataRef); }