Revision: 15198
          http://sourceforge.net/p/skim-app/code/15198
Author:   hofman
Date:     2025-05-12 15:52:49 +0000 (Mon, 12 May 2025)
Log Message:
-----------
Move some methods to functions. Calculate some variables outside block, and 
avoid strongly referencing self from block.

Modified Paths:
--------------
    trunk/SKTransitionController.m

Modified: trunk/SKTransitionController.m
===================================================================
--- trunk/SKTransitionController.m      2025-05-12 15:22:49 UTC (rev 15197)
+++ trunk/SKTransitionController.m      2025-05-12 15:52:49 UTC (rev 15198)
@@ -68,9 +68,13 @@
 
 #pragma mark -
 
+@interface SKTransitionController ()
+@property (nonatomic) BOOL animating;
+@end
+
 @implementation SKTransitionController
 
-@synthesize transition, pageTransitions, shouldScale;
+@synthesize transition, pageTransitions, shouldScale, animating;
 
 static inline CGRect scaleRect(NSRect rect, CGFloat scale) {
     return CGRectMake(scale * NSMinX(rect), scale * NSMinY(rect), scale * 
NSWidth(rect), scale * NSHeight(rect));
@@ -77,7 +81,7 @@
 }
 
 // rect and extent are in pixels
-- (CIFilter *)transitionFilterWithName:(NSString *)name rect:(CGRect)rect 
extent:(CGRect)extent scale:(CGFloat)scale forward:(BOOL)forward 
initialImage:(CIImage *)initialImage finalImage:(CIImage *)finalImage {
+static CIFilter *makeTransitionFilter(NSString *name, CGRect rect, CGRect 
extent, CGFloat scale, BOOL forward, CIImage *initialImage, CIImage 
*finalImage) {
     CIFilter *transitionFilter = [CIFilter filterWithName:name];
     BOOL scaled = fabs(scale - 1.0) > 0.0;
     
@@ -154,7 +158,7 @@
     return transitionFilter;
 }
 
-- (CIImage *)currentImageForView:(NSView *)view {
+static CIImage *currentImageForView(NSView *view) {
     NSBitmapImageRep *contentBitmap = [view bitmapImageRepCachingDisplay];
     CIImage *image = [[CIImage alloc] initWithBitmapImageRep:contentBitmap];
     NSArray *colorFilters = SKColorEffectFilters();
@@ -180,41 +184,40 @@
     
     animating = YES;
     
-    CIImage *initialImage = [self currentImageForView:view];
+    CIImage *initialImage = currentImageForView(view);
     
+    NSRect bounds = [view bounds];
+    CGFloat imageScale = CGRectGetWidth([initialImage extent]) / 
NSWidth(bounds);
+    CGFloat scale = shouldScale ? imageScale * NSHeight(bounds) / 
NSHeight([[[view window] screen] frame]) : imageScale;
+    
+    if (transitionView == nil)
+        transitionView = [[SKTransitionView alloc] initWithFrame:bounds];
+    else
+        [transitionView setFrame:bounds];
+    SKTransitionView *transView = transitionView;
+    
+    __weak SKTransitionController *weakSelf = self;
+    
     return ^(NSRect rect, BOOL forward, void (^completionHandler)(void)){
         
-        NSRect bounds = [view bounds];
-        CIImage *finalImage = [self currentImageForView:view];
-        CGFloat imageScale = CGRectGetWidth([initialImage extent]) / 
NSWidth(bounds);
+        CIImage *finalImage = currentImageForView(view);
         CGRect cgRect = CGRectIntegral(scaleRect(rect, imageScale));
         CGRect cgBounds = scaleRect(bounds, imageScale);
         CGRect extent = [currentTransition shouldRestrict] ? cgRect : cgBounds;
         NSString *filterName = [currentTransition styleName];
-        CGFloat scale = shouldScale ? imageScale * NSHeight(bounds) / 
NSHeight([[[view window] screen] frame]) : imageScale;
-        CIFilter *transitionFilter = [self transitionFilterWithName:filterName
-                                                               rect:cgRect
-                                                             extent:extent
-                                                              scale:scale
-                                                            forward:forward
-                                                       
initialImage:initialImage
-                                                         
finalImage:finalImage];
+        CIFilter *transitionFilter = makeTransitionFilter(filterName, cgRect, 
extent, scale, forward, initialImage, finalImage);
         
-        if (transitionView == nil)
-            transitionView = [[SKTransitionView alloc] initWithFrame:bounds];
-        else
-            [transitionView setFrame:bounds];
-        [transitionView setExtent:cgBounds];
-        [transitionView setFilter:transitionFilter];
-        [view addSubview:transitionView positioned:NSWindowAbove 
relativeTo:nil];
+        [transView setExtent:cgBounds];
+        [transView setFilter:transitionFilter];
+        [view addSubview:transView positioned:NSWindowAbove relativeTo:nil];
 
         [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
                 [context setDuration:[currentTransition duration]];
-                [[transitionView animator] setProgress:1.0];
+                [[transView animator] setProgress:1.0];
             } completionHandler:^{
-                [transitionView removeFromSuperview];
-                [transitionView setFilter:nil];
-                animating = NO;
+                [transView removeFromSuperview];
+                [transView setFilter:nil];
+                [weakSelf setAnimating:NO];
                 if (completionHandler)
                     completionHandler();
             }];

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