Skip to content

Commit

Permalink
Use CIImage.CGImage to get bitmap data instead of rendering into a tr…
Browse files Browse the repository at this point in the history
…ansient CIContext

On 10.15 use a CIColorCubeWithColorspace and use generic device RGB space
  • Loading branch information
zakk4223 committed Apr 10, 2020
1 parent d9715fd commit 55c111f
Showing 1 changed file with 42 additions and 18 deletions.
60 changes: 42 additions & 18 deletions ImageUnitPlugins/CSLUTFilter/CSLUTFilter/CSLUTFilter.m
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}
Expand All @@ -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) ];

Expand Down Expand Up @@ -91,27 +99,43 @@ -(void)processLUTImage:(CIImage *)lutImage
}
z += colCnt;
}

//CGContextRelease(cgContext);
CGContextRelease(cgContext);
free(bitmapPtr);
_cubeData = tmpCubeData;
}


- (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;

}


Expand Down

0 comments on commit 55c111f

Please sign in to comment.