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

Reply via email to