]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/quartz/quartzloader.cpp
Tweak QuartzLoader a bit
[libs/gui.git] / source / graphics / quartz / quartzloader.cpp
index 23f7abbed319031ff0e3b23f99b096bf9159174d..3447f5f0672100e3318214f0392c4db2d4ca5c03 100644 (file)
@@ -82,17 +82,20 @@ bool QuartzLoader::detect(const string &sig)
        CFRelease(data);
        CFRelease(source);
 
-       return status==kCGImageStatusIncomplete;
+       return status==kCGImageStatusIncomplete || status==kCGImageStatusReadingHeader;
 }
 
 void QuartzLoader::load(Image::Data &data)
 {
        CGImageRef image = CGImageSourceCreateImageAtIndex(priv->source, 0, 0);
+       if(!image)
+               throw bad_image_data("null image");
 
        try
        {
                data.width = CGImageGetWidth(image);
                data.height = CGImageGetHeight(image);
+               data.stride = CGImageGetBytesPerRow(image);
 
                CGColorSpaceRef color = CGImageGetColorSpace(image);
                CGColorSpaceModel model = CGColorSpaceGetModel(color);
@@ -101,7 +104,9 @@ void QuartzLoader::load(Image::Data &data)
                {
                        if(alpha==kCGImageAlphaLast)
                                data.fmt = RGBA;
-                       else if(alpha==kCGImageAlphaNone || alpha==kCGImageAlphaNoneSkipFirst || alpha==kCGImageAlphaNoneSkipLast)
+                       else if(alpha==kCGImageAlphaNoneSkipLast)
+                               data.fmt = RGBX;
+                       else if(alpha==kCGImageAlphaNone || alpha==kCGImageAlphaNoneSkipFirst)
                                data.fmt = RGB;
                        else
                                throw unsupported_image_format("unknown alpha mode");
@@ -109,17 +114,15 @@ void QuartzLoader::load(Image::Data &data)
                else
                        throw unsupported_image_format("unknown colorspace");
 
-               unsigned bytes_per_pixel = (CGImageGetBitsPerPixel(image)+7)/8;
-
                CGDataProviderRef dp = CGImageGetDataProvider(image);
                CFDataRef image_data = CGDataProviderCopyData(dp);
-               data.data = new char[data.width*data.height*bytes_per_pixel];
+               data.data = new char[data.height*data.stride];
                CFDataGetBytes(image_data, CFRangeMake(0, CFDataGetLength(image_data)), reinterpret_cast<UInt8 *>(data.data));
                CFRelease(image_data);
 
                CFRelease(image);
 
-               if(alpha==kCGImageAlphaNoneSkipFirst || alpha==kCGImageAlphaNoneSkipLast)
+               if(alpha==kCGImageAlphaNoneSkipFirst)
                {
                        const char *src = data.data;
                        if(alpha==kCGImageAlphaNoneSkipFirst)