From 55c111f92ea6407cbc3cbdb89590f3eb27f78751 Mon Sep 17 00:00:00 2001 From: Zakk Date: Fri, 10 Apr 2020 03:42:52 -0400 Subject: [PATCH] Use CIImage.CGImage to get bitmap data instead of rendering into a transient CIContext On 10.15 use a CIColorCubeWithColorspace and use generic device RGB space --- .../CSLUTFilter/CSLUTFilter/CSLUTFilter.m | 60 +++++++++++++------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/ImageUnitPlugins/CSLUTFilter/CSLUTFilter/CSLUTFilter.m b/ImageUnitPlugins/CSLUTFilter/CSLUTFilter/CSLUTFilter.m index 03b5ace6..2687a960 100644 --- a/ImageUnitPlugins/CSLUTFilter/CSLUTFilter/CSLUTFilter.m +++ b/ImageUnitPlugins/CSLUTFilter/CSLUTFilter/CSLUTFilter.m @@ -26,7 +26,7 @@ - (NSDictionary *)customAttributes -(void)setValue:(id)value forKey:(NSString *)key { [super setValue:value forKey:key]; - if ([key isEqualToString:@"inputLUTImage"]) + if ([key isEqualToString:@"inputLUTImage"] && value) { [self processLUTImage:value]; } @@ -36,25 +36,33 @@ -(void)setValue:(id)value forKey:(NSString *)key -(void)processLUTImage:(CIImage *)lutImage { - //We have to render to something we can extract data out of :( + CGImageRef baseImage = lutImage.CGImage; + if (!baseImage) + { + return; + } + int useSize = 64; - CGFloat width = lutImage.extent.size.width; - CGFloat height = lutImage.extent.size.height; + CGFloat width = CGImageGetWidth(baseImage); + CGFloat height = CGImageGetHeight(baseImage); int rowCnt = height/useSize; int colCnt = width/useSize; CGColorSpaceRef colorSpace = NULL; - colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); + + colorSpace = CGImageGetColorSpace(baseImage); + uint8_t *bitmapPtr = malloc(width*height*4); - //CGContextRef cgContext = CGBitmapContextCreate(bitmapPtr, width, height, 8, width*4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); + CGContextRef cgContext = CGBitmapContextCreate(bitmapPtr, width, height, 8, width*4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); + + CGColorSpaceRelease(colorSpace); + + CGContextDrawImage(cgContext, CGRectMake(0, 0, width, height), baseImage); //CIContext *ctx = [CIContext contextWithCGContext:cgContext options:@{kCIContextOutputColorSpace: (__bridge id)colorSpace, kCIContextWorkingColorSpace: (__bridge id)colorSpace}]; //[ctx drawImage:lutImage inRect:lutImage.extent fromRect:lutImage.extent]; - CIContext *ctx = [CIContext context]; - - [ctx render:lutImage toBitmap:bitmapPtr rowBytes:width*4 bounds:CGRectMake(0, 0, width, height) format:kCIFormatRGBA8 colorSpace:CGColorSpaceCreateWithName(kCGColorSpaceSRGB)]; float *cubePtr = malloc(useSize*useSize*useSize*4*sizeof(float)); NSData *tmpCubeData = [[NSData alloc] initWithBytesNoCopy:cubePtr length:useSize*useSize*useSize*4*sizeof(float) ]; @@ -91,8 +99,7 @@ -(void)processLUTImage:(CIImage *)lutImage } z += colCnt; } - - //CGContextRelease(cgContext); + CGContextRelease(cgContext); free(bitmapPtr); _cubeData = tmpCubeData; } @@ -100,18 +107,35 @@ -(void)processLUTImage:(CIImage *)lutImage - (CIImage *)outputImage { + CIFilter *cubeFilter = nil; + if (_cubeData) { - CIFilter *cubeFilter = [CIFilter filterWithName:@"CIColorCube" withInputParameters:@{ - kCIInputImageKey: inputImage, - @"inputCubeData": _cubeData, - @"inputCubeDimension": @(64), + + if (@available(macOS 10.15, *)) + { + cubeFilter = [CIFilter filterWithName:@"CIColorCubeWithColorSpace" withInputParameters:@{ + kCIInputImageKey: inputImage, + @"inputCubeData": _cubeData, + @"inputCubeDimension": @(64), + @"inputColorSpace": (__bridge id)CGColorSpaceCreateDeviceRGB(), + } + ]; + } else { + cubeFilter = [CIFilter filterWithName:@"CIColorCube" withInputParameters:@{ + kCIInputImageKey: inputImage, + @"inputCubeData": _cubeData, + @"inputCubeDimension": @(64), + } + ]; } - ]; + } + if (cubeFilter) + { return [cubeFilter outputImage]; - } else { - return inputImage; } + return inputImage; + }