Revision: 12782 http://sourceforge.net/p/skim-app/code/12782 Author: hofman Date: 2022-02-12 10:36:29 +0000 (Sat, 12 Feb 2022) Log Message: ----------- Implement cover, reveal, and slide transitions using built-in filters
Modified Paths: -------------- trunk/SkimTransitions/CoverTransition/SKTCoverTransition.m trunk/SkimTransitions/RevealTransition/SKTRevealTransition.m trunk/SkimTransitions/SKTTransitions.cikernel trunk/SkimTransitions/SlideTransition/SKTSlideTransition.m Modified: trunk/SkimTransitions/CoverTransition/SKTCoverTransition.m =================================================================== --- trunk/SkimTransitions/CoverTransition/SKTCoverTransition.m 2022-02-11 15:33:36 UTC (rev 12781) +++ trunk/SkimTransitions/CoverTransition/SKTCoverTransition.m 2022-02-12 10:36:29 UTC (rev 12782) @@ -9,23 +9,11 @@ #import "SKTCoverTransition.h" #import <Foundation/Foundation.h> #import <ApplicationServices/ApplicationServices.h> -#import "SKTPluginLoader.h" -#define kCIInputRectangleKey @"inputRectangle" - @implementation SKTCoverTransition @synthesize inputImage, inputTargetImage, inputExtent, inputAngle, inputTime; -static CIKernel *_SKTCoverTransitionKernel = nil; - -- (id)init -{ - if (_SKTCoverTransitionKernel == nil) - _SKTCoverTransitionKernel = [SKTPlugInLoader kernelWithName:@"offsetComposition"]; - return [super init]; -} - + (NSDictionary *)customAttributes { return [NSDictionary dictionaryWithObjectsAndKeys: @@ -73,23 +61,18 @@ // called when setting up for fragment program and also calls fragment program - (CIImage *)outputImage { - CISampler *src = [CISampler samplerWithImage:inputImage]; - CISampler *trgt = [CISampler samplerWithImage:inputTargetImage]; CGFloat t = [inputTime doubleValue]; CGFloat angle = [inputAngle doubleValue]; CGFloat c = cos(angle); CGFloat s = sin(angle); CGFloat d = [inputExtent Z] * (t - 1.0) / fmax(fabs(c), fabs(s)); - NSNumber *darken = [NSNumber numberWithDouble:1.0 - 0.2 * t]; - CIVector *offset1 = [CIVector vectorWithX:d * c Y:d * s]; - CIVector *offset2 = [CIVector vectorWithX:0.0 Y:0.0]; - NSArray *extent = [NSArray arrayWithObjects:[NSNumber numberWithDouble:[inputExtent X]], [NSNumber numberWithDouble:[inputExtent Y]], [NSNumber numberWithDouble:[inputExtent Z]], [NSNumber numberWithDouble:[inputExtent W]], nil]; - NSArray *arguments = [NSArray arrayWithObjects:trgt, src, inputExtent, offset1, offset2, darken, nil]; - NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:extent, kCIApplyOptionDefinition, extent, kCIApplyOptionExtent, offset1, kCIApplyOptionUserInfo, nil]; + CGAffineTransform transform = CGAffineTransformTranslate(CGAffineTransformIdentity, -d*c, -d*s); + CIImage *image = [inputTargetImage imageByApplyingTransform:transform]; + CIFilter *darkenFilter = [CIFilter filterWithName:@"CIExposureAdjust"]; + [darkenFilter setValue:[NSNumber numberWithDouble:-0.4 * t] forKey:@"inputEV"]; + [darkenFilter setValue:inputImage forKey:kCIInputImageKey]; - [_SKTCoverTransitionKernel setROISelector:@selector(regionOf:destRect:userInfo:)]; - - return [self apply:_SKTCoverTransitionKernel arguments:arguments options:options]; + return [[image imageByCompositingOverImage:[darkenFilter valueForKey:kCIOutputImageKey]] imageByCroppingToRect:[inputExtent CGRectValue]]; } @end Modified: trunk/SkimTransitions/RevealTransition/SKTRevealTransition.m =================================================================== --- trunk/SkimTransitions/RevealTransition/SKTRevealTransition.m 2022-02-11 15:33:36 UTC (rev 12781) +++ trunk/SkimTransitions/RevealTransition/SKTRevealTransition.m 2022-02-12 10:36:29 UTC (rev 12782) @@ -9,23 +9,11 @@ #import "SKTRevealTransition.h" #import <Foundation/Foundation.h> #import <ApplicationServices/ApplicationServices.h> -#import "SKTPluginLoader.h" -#define kCIInputRectangleKey @"inputRectangle" - @implementation SKTRevealTransition @synthesize inputImage, inputTargetImage, inputExtent, inputAngle, inputTime; -static CIKernel *_SKTRevealTransitionKernel = nil; - -- (id)init -{ - if (_SKTRevealTransitionKernel == nil) - _SKTRevealTransitionKernel = [SKTPlugInLoader kernelWithName:@"offsetComposition"]; - return [super init]; -} - + (NSDictionary *)customAttributes { return [NSDictionary dictionaryWithObjectsAndKeys: @@ -73,23 +61,18 @@ // called when setting up for fragment program and also calls fragment program - (CIImage *)outputImage { - CISampler *src = [CISampler samplerWithImage:inputImage]; - CISampler *trgt = [CISampler samplerWithImage:inputTargetImage]; CGFloat t = [inputTime doubleValue]; CGFloat angle = [inputAngle doubleValue]; CGFloat c = cos(angle); CGFloat s = sin(angle); CGFloat d = [inputExtent Z] * t / fmax(fabs(c), fabs(s)); - NSNumber *shade = [NSNumber numberWithDouble:0.8 + 0.2 * t]; - CIVector *offset1 = [CIVector vectorWithX:d * c Y:d * s]; - CIVector *offset2 = [CIVector vectorWithX:0.0 Y:0.0]; - NSArray *extent = [NSArray arrayWithObjects:[NSNumber numberWithFloat:[inputExtent X]], [NSNumber numberWithFloat:[inputExtent Y]], [NSNumber numberWithFloat:[inputExtent Z]], [NSNumber numberWithFloat:[inputExtent W]], nil]; - NSArray *arguments = [NSArray arrayWithObjects:src, trgt, inputExtent, offset1, offset2, shade, nil]; - NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:extent, kCIApplyOptionDefinition, extent, kCIApplyOptionExtent, offset1, kCIApplyOptionUserInfo, nil]; + CGAffineTransform transform = CGAffineTransformTranslate(CGAffineTransformIdentity, -d*c, -d*s); + CIImage *image = [inputImage imageByApplyingTransform:transform]; + CIFilter *darkenFilter = [CIFilter filterWithName:@"CIExposureAdjust"]; + [darkenFilter setValue:[NSNumber numberWithDouble:-0.4 * (1.0 - t)] forKey:@"inputEV"]; + [darkenFilter setValue:inputTargetImage forKey:kCIInputImageKey]; - [_SKTRevealTransitionKernel setROISelector:@selector(regionOf:destRect:userInfo:)]; - - return [self apply:_SKTRevealTransitionKernel arguments:arguments options:options]; + return [[image imageByCompositingOverImage:[darkenFilter valueForKey:kCIOutputImageKey]] imageByCroppingToRect:[inputExtent CGRectValue]]; } @end Modified: trunk/SkimTransitions/SKTTransitions.cikernel =================================================================== --- trunk/SkimTransitions/SKTTransitions.cikernel 2022-02-11 15:33:36 UTC (rev 12781) +++ trunk/SkimTransitions/SKTTransitions.cikernel 2022-02-12 10:36:29 UTC (rev 12782) @@ -18,21 +18,6 @@ return any(lessThan(t1, rect.xy)) || any(greaterThanEqual(t1, rect.xy + rect.zw)) ? sample(back, samplerCoord(back)) : sample(front, samplerCoord(front)); } -kernel vec4 offsetComposition(sampler front, sampler back, vec4 extent, vec2 offset1, vec2 offset2, float darken) -{ - vec2 t0, t1, t2; - vec4 p1, p2; - - t0 = destCoord(); - t1 = t0 + offset1; - t2 = t0 + offset2; - p1 = any(lessThan(t1, extent.xy)) || any(greaterThanEqual(t1, extent.xy + extent.zw)) ? vec4(0.0) : sample(front, samplerTransform(front, t1)); - p2 = any(lessThan(t2, extent.xy)) || any(greaterThanEqual(t2, extent.xy + extent.zw)) ? vec4(0.0) : sample(back, samplerTransform(back, t2)); - p2.rgb *= darken; - - return p1 + (1.0 - p1.a) * p2; -} - kernel vec4 holeDistortion(sampler src, sampler trgt, vec2 center, float radius) { vec2 t1; float distsquare, rsquare; Modified: trunk/SkimTransitions/SlideTransition/SKTSlideTransition.m =================================================================== --- trunk/SkimTransitions/SlideTransition/SKTSlideTransition.m 2022-02-11 15:33:36 UTC (rev 12781) +++ trunk/SkimTransitions/SlideTransition/SKTSlideTransition.m 2022-02-12 10:36:29 UTC (rev 12782) @@ -9,7 +9,6 @@ #import "SKTSlideTransition.h" #import <Foundation/Foundation.h> #import <ApplicationServices/ApplicationServices.h> -#import "SKTPluginLoader.h" #define kCIInputRectangleKey @"inputRectangle" @@ -17,15 +16,6 @@ @synthesize inputImage, inputTargetImage, inputExtent, inputAngle, inputTime; -static CIKernel *_SKTSlideTransitionKernel = nil; - -- (id)init -{ - if (_SKTSlideTransitionKernel == nil) - _SKTSlideTransitionKernel = [SKTPlugInLoader kernelWithName:@"offsetComposition"]; - return [super init]; -} - + (NSDictionary *)customAttributes { return [NSDictionary dictionaryWithObjectsAndKeys: @@ -63,16 +53,9 @@ return [[self class] customAttributes]; } -- (CGRect)regionOf:(int)sampler destRect:(CGRect)R userInfo:(NSArray *)userInfo { - CIVector *offset = [userInfo objectAtIndex:sampler]; - return CGRectOffset(R, [offset X], [offset Y]); -} - // called when setting up for fragment program and also calls fragment program - (CIImage *)outputImage { - CISampler *src = [CISampler samplerWithImage:inputImage]; - CISampler *trgt = [CISampler samplerWithImage:inputTargetImage]; CGFloat t = [inputTime doubleValue]; CGFloat angle = [inputAngle doubleValue]; CGFloat c = cos(angle); @@ -79,17 +62,12 @@ CGFloat s = sin(angle); CGFloat d1 = [inputExtent Z] * t / fmax(fabs(c), fabs(s)); CGFloat d2 = [inputExtent Z] * (t - 1.0) / fmax(fabs(c), fabs(s)); - CIVector *offset1 = [CIVector vectorWithX:d1 * c Y:d1 * s]; - CIVector *offset2 = [CIVector vectorWithX:d2 * c Y:d2 * s]; - NSNumber *one = [NSNumber numberWithDouble:1.0]; - NSArray *extent = [NSArray arrayWithObjects:[NSNumber numberWithDouble:[inputExtent X]], [NSNumber numberWithDouble:[inputExtent Y]], [NSNumber numberWithDouble:[inputExtent Z]], [NSNumber numberWithDouble:[inputExtent W]], nil]; - NSArray *arguments = [NSArray arrayWithObjects:src, trgt, inputExtent, offset1, offset2, one, nil]; - NSArray *userInfo = [NSArray arrayWithObjects:offset1, offset2, nil]; - NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:extent, kCIApplyOptionDefinition, extent, kCIApplyOptionExtent, userInfo, kCIApplyOptionUserInfo, nil]; + CGAffineTransform transform1 = CGAffineTransformTranslate(CGAffineTransformIdentity, -d1*c, -d1*s); + CGAffineTransform transform2 = CGAffineTransformTranslate(CGAffineTransformIdentity, -d2*c, -d2*s); + CIImage *image1 = [inputImage imageByApplyingTransform:transform1]; + CIImage *image2 = [inputTargetImage imageByApplyingTransform:transform2]; - [_SKTSlideTransitionKernel setROISelector:@selector(regionOf:destRect:userInfo:)]; - - return [self apply:_SKTSlideTransitionKernel arguments:arguments options:options]; + return [[image1 imageByCompositingOverImage:image2] imageByCroppingToRect:[inputExtent CGRectValue]]; } @end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ Skim-app-commit mailing list Skim-app-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/skim-app-commit