X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fquartz%2Fquartzloader.cpp;h=472e066f49665a64356cf1c50d93fba878589487;hb=2ebdf45974a0a7649b3488f9da4b8cf90a1db584;hp=aa11daaedff1fe6def85092da71a16501f55b272;hpb=dc16f33663ae51be2966aba81848c4d139149f60;p=libs%2Fgui.git diff --git a/source/graphics/quartz/quartzloader.cpp b/source/graphics/quartz/quartzloader.cpp index aa11daa..472e066 100644 --- a/source/graphics/quartz/quartzloader.cpp +++ b/source/graphics/quartz/quartzloader.cpp @@ -1,7 +1,5 @@ #include -#include -#include -#include +#include // Avoid messing up sigc++ headers #undef nil #include "quartzloader.h" @@ -57,8 +55,6 @@ struct QuartzLoader::Private }; -ImageLoader::Register QuartzLoader::reg; - QuartzLoader::QuartzLoader(IO::Seekable &io): priv(new Private) { @@ -82,12 +78,14 @@ bool QuartzLoader::detect(const string &sig) CFRelease(data); CFRelease(source); - return status==kCGImageStatusIncomplete; + return status==kCGImageStatusIncomplete || status==kCGImageStatusReadingHeader; } -void QuartzLoader::load(Image::Data &data) +void QuartzLoader::load_(Image::Data &data) { CGImageRef image = CGImageSourceCreateImageAtIndex(priv->source, 0, 0); + if(!image) + throw bad_image_data("null image"); try { @@ -102,9 +100,9 @@ void QuartzLoader::load(Image::Data &data) { if(alpha==kCGImageAlphaLast) data.fmt = RGBA; - else if(alpha==kCGImageAlphaNoneSkipLast) + else if(alpha==kCGImageAlphaNoneSkipLast || alpha==kCGImageAlphaNoneSkipFirst) data.fmt = RGBX; - else if(alpha==kCGImageAlphaNone || alpha==kCGImageAlphaNoneSkipFirst) + else if(alpha==kCGImageAlphaNone) data.fmt = RGB; else throw unsupported_image_format("unknown alpha mode"); @@ -114,27 +112,13 @@ void QuartzLoader::load(Image::Data &data) CGDataProviderRef dp = CGImageGetDataProvider(image); CFDataRef image_data = CGDataProviderCopyData(dp); - data.data = new char[data.height*data.stride]; - CFDataGetBytes(image_data, CFRangeMake(0, CFDataGetLength(image_data)), reinterpret_cast(data.data)); + data.pixels = new char[data.height*data.stride]; + unsigned offset = (alpha==kCGImageAlphaNoneSkipFirst); + CFRange range = CFRangeMake(offset, CFDataGetLength(image_data)-offset); + CFDataGetBytes(image_data, range, reinterpret_cast(data.pixels)); CFRelease(image_data); CFRelease(image); - - if(alpha==kCGImageAlphaNoneSkipFirst) - { - const char *src = data.data; - if(alpha==kCGImageAlphaNoneSkipFirst) - ++src; - char *dest = data.data; - for(unsigned y=0; y