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