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