X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fquartz%2Fquartzloader.cpp;h=e025b66cf4786b852ed2a176ed0ee49b7e7d977c;hb=054fca09f0bbd64fdbd6406a0643de938a9cd4fb;hp=aa11daaedff1fe6def85092da71a16501f55b272;hpb=dc16f33663ae51be2966aba81848c4d139149f60;p=libs%2Fgui.git diff --git a/source/graphics/quartz/quartzloader.cpp b/source/graphics/quartz/quartzloader.cpp index aa11daa..e025b66 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,39 +100,15 @@ 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"); } else throw unsupported_image_format("unknown colorspace"); - - 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)); - 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(data.pixels)); + CFRelease(image_data); + + CFRelease(image); +} + } // namespace Graphics } // namespace Msp