#include <algorithm>
-#include <CoreGraphics/CGColorSpace.h>
-#include <CoreGraphics/CGImage.h>
-#include <ImageIO/CGImageSource.h>
+#include <ApplicationServices/ApplicationServices.h>
// Avoid messing up sigc++ headers
#undef nil
#include "quartzloader.h"
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);
{
if(alpha==kCGImageAlphaLast)
data.fmt = RGBA;
- else if(alpha==kCGImageAlphaNone || alpha==kCGImageAlphaNoneSkipFirst || alpha==kCGImageAlphaNoneSkipLast)
+ else if(alpha==kCGImageAlphaNoneSkipLast || alpha==kCGImageAlphaNoneSkipFirst)
+ data.fmt = RGBX;
+ else if(alpha==kCGImageAlphaNone)
data.fmt = RGB;
else
throw unsupported_image_format("unknown alpha mode");
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];
- CFDataGetBytes(image_data, CFRangeMake(0, CFDataGetLength(image_data)), reinterpret_cast<UInt8 *>(data.data));
+ data.data = new char[data.height*data.stride];
+ unsigned offset = (alpha==kCGImageAlphaNoneSkipFirst);
+ CFRange range = CFRangeMake(offset, CFDataGetLength(image_data)-offset);
+ CFDataGetBytes(image_data, range, reinterpret_cast<UInt8 *>(data.data));
CFRelease(image_data);
CFRelease(image);
-
- if(alpha==kCGImageAlphaNoneSkipFirst || alpha==kCGImageAlphaNoneSkipLast)
- {
- const char *src = data.data;
- if(alpha==kCGImageAlphaNoneSkipFirst)
- ++src;
- char *dest = data.data;
- for(unsigned y=0; y<data.height; ++y)
- for(unsigned x=0; x<data.width; ++x)
- {
- for(unsigned i=0; i<3; ++i)
- dest[i] = src[i];
- dest += 3;
- src += 4;
- }
- }
}
catch(...)
{