mirror of
https://github.com/darlinghq/darling-cocotron.git
synced 2024-10-07 01:23:26 +00:00
-[NSBitmapImageRep initWithData:] fixes
This commit is contained in:
parent
d9dd3bd9ac
commit
9e76b3cb46
@ -24,3 +24,7 @@ CGColorSpaceRef CGColorSpaceCreateDeviceGray() {
|
||||
CGColorSpaceRef CGColorSpaceCreateDeviceCMYK() {
|
||||
return [[KGColorSpace alloc] initWithDeviceCMYK];
|
||||
}
|
||||
|
||||
size_t CGColorSpaceGetNumberOfComponents(CGColorSpaceRef self) {
|
||||
return [self numberOfComponents];
|
||||
}
|
||||
|
@ -24,3 +24,8 @@ CGDataProviderRef CGDataProviderCreateWithCFData(NSData *data) {
|
||||
COREGRAPHICS_EXPORT CGDataProviderRef CGDataProviderCreateWithData(void *info,const void *data,size_t size,CGDataProviderReleaseDataCallback releaseCallback) {
|
||||
return [[KGDataProvider alloc] initWithBytes:data length:size];
|
||||
}
|
||||
|
||||
COREGRAPHICS_EXPORT NSData *CGDataProviderCopyData(CGDataProviderRef self) {
|
||||
return [self copyData];
|
||||
}
|
||||
|
||||
|
@ -117,26 +117,89 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
||||
|
||||
-initWithData:(NSData *)data {
|
||||
CGImageSourceRef imageSource=CGImageSourceCreateWithData(data,nil);
|
||||
CGImageRef cgImage=CGImageSourceCreateImageAtIndex(imageSource,0,nil);
|
||||
|
||||
_image=CGImageSourceCreateImageAtIndex(imageSource,0,nil);
|
||||
if(_image==nil){
|
||||
if(cgImage==nil){
|
||||
[self dealloc];
|
||||
return nil;
|
||||
}
|
||||
|
||||
NSDictionary *properties=CGImageSourceCopyPropertiesAtIndex(imageSource,0,nil);
|
||||
NSNumber *xres=[properties objectForKey:kCGImagePropertyDPIWidth];
|
||||
NSNumber *yres=[properties objectForKey:kCGImagePropertyDPIHeight];
|
||||
|
||||
_size.width=CGImageGetWidth(_image);
|
||||
_size.height=CGImageGetHeight(_image);
|
||||
_size.width=CGImageGetWidth(cgImage);
|
||||
_size.height=CGImageGetHeight(cgImage);
|
||||
|
||||
if(xres!=nil && [xres doubleValue]>0)
|
||||
_size.width*=72.0/[xres doubleValue];
|
||||
|
||||
if(yres!=nil && [yres doubleValue]>0)
|
||||
_size.height*=72.0/[yres doubleValue];
|
||||
|
||||
|
||||
CGColorSpaceRef colorSpace=CGImageGetColorSpace(cgImage);
|
||||
|
||||
// FIXME:
|
||||
_colorSpaceName=NSDeviceRGBColorSpace;
|
||||
_bitsPerSample=CGImageGetBitsPerComponent(cgImage);
|
||||
_pixelsWide=CGImageGetWidth(cgImage);
|
||||
_pixelsHigh=CGImageGetHeight(cgImage);
|
||||
|
||||
switch(CGImageGetAlphaInfo(cgImage)){
|
||||
case kCGImageAlphaPremultipliedLast:
|
||||
case kCGImageAlphaPremultipliedFirst:
|
||||
case kCGImageAlphaLast:
|
||||
case kCGImageAlphaFirst:
|
||||
_hasAlpha=YES;
|
||||
break;
|
||||
default:
|
||||
_hasAlpha=NO;
|
||||
break;
|
||||
}
|
||||
|
||||
_samplesPerPixel=CGColorSpaceGetNumberOfComponents(colorSpace);
|
||||
if(_hasAlpha)
|
||||
_samplesPerPixel++;
|
||||
_isPlanar=NO;
|
||||
_bitmapFormat=0;
|
||||
if(CGImageGetBitmapInfo(cgImage)&kCGBitmapFloatComponents)
|
||||
_bitmapFormat|=NSFloatingPointSamplesBitmapFormat;
|
||||
switch(CGImageGetAlphaInfo(cgImage)){
|
||||
case kCGImageAlphaNone:
|
||||
break;
|
||||
case kCGImageAlphaPremultipliedLast:
|
||||
break;
|
||||
case kCGImageAlphaPremultipliedFirst:
|
||||
_bitmapFormat|=NSAlphaFirstBitmapFormat;
|
||||
break;
|
||||
case kCGImageAlphaLast:
|
||||
_bitmapFormat|=NSAlphaNonpremultipliedBitmapFormat;
|
||||
break;
|
||||
case kCGImageAlphaFirst:
|
||||
_bitmapFormat|=NSAlphaFirstBitmapFormat;
|
||||
_bitmapFormat|=NSAlphaNonpremultipliedBitmapFormat;
|
||||
break;
|
||||
case kCGImageAlphaNoneSkipLast:
|
||||
case kCGImageAlphaNoneSkipFirst:
|
||||
break;
|
||||
}
|
||||
_bitmapFormat|=NSFloatingPointSamplesBitmapFormat;
|
||||
|
||||
_bitsPerPixel=CGImageGetBitsPerPixel(cgImage);
|
||||
_bytesPerRow=CGImageGetBytesPerRow(cgImage);
|
||||
_freeWhenDone=YES;
|
||||
_bitmapPlanes[0]=NSZoneCalloc(NULL,_bytesPerRow*_pixelsHigh,1);
|
||||
|
||||
CGDataProviderRef provider=CGImageGetDataProvider(cgImage);
|
||||
// FIXME: inefficient
|
||||
NSData *bitmapData=(NSData *)CGDataProviderCopyData(provider);
|
||||
const unsigned char *bytes=[bitmapData bytes];
|
||||
int i,length=_bytesPerRow*_pixelsHigh;
|
||||
|
||||
for(i=0;i<length;i++)
|
||||
_bitmapPlanes[0][i]=bytes[i];
|
||||
|
||||
[bitmapData release];
|
||||
|
||||
[properties release];
|
||||
[imageSource release];
|
||||
return self;
|
||||
|
@ -25,8 +25,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
-(void)draw {
|
||||
-(BOOL)draw {
|
||||
[_delegate performSelector:_drawSelector withObject:self];
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -27,3 +27,5 @@ COREGRAPHICS_EXPORT void CGColorSpaceRelease(CGColorSpaceRef colorSpace);
|
||||
COREGRAPHICS_EXPORT CGColorSpaceRef CGColorSpaceCreateDeviceRGB();
|
||||
COREGRAPHICS_EXPORT CGColorSpaceRef CGColorSpaceCreateDeviceGray();
|
||||
COREGRAPHICS_EXPORT CGColorSpaceRef CGColorSpaceCreateDeviceCMYK();
|
||||
|
||||
COREGRAPHICS_EXPORT size_t CGColorSpaceGetNumberOfComponents(CGColorSpaceRef self);
|
||||
|
@ -21,3 +21,5 @@ COREGRAPHICS_EXPORT void CGDataProviderRelease(CGDataProviderRef provider);
|
||||
COREGRAPHICS_EXPORT CGDataProviderRef CGDataProviderCreateWithCFData(NSData *data);
|
||||
|
||||
COREGRAPHICS_EXPORT CGDataProviderRef CGDataProviderCreateWithData(void *info,const void *data,size_t size,CGDataProviderReleaseDataCallback releaseCallback);
|
||||
|
||||
COREGRAPHICS_EXPORT NSData *CGDataProviderCopyData(CGDataProviderRef self);
|
||||
|
Loading…
Reference in New Issue
Block a user