Revision: 2525 http://skim-app.svn.sourceforge.net/skim-app/?rev=2525&view=rev Author: hofman Date: 2007-07-18 04:43:08 -0700 (Wed, 18 Jul 2007)
Log Message: ----------- Load transition filter names dynamically. This allows adding custom transition filters in the standard locations (Library/Graphics/Image Units). Add an extra option for the extent of the transition. Modified Paths: -------------- trunk/Dutch.lproj/MainWindow.nib/classes.nib trunk/Dutch.lproj/MainWindow.nib/data.dependency trunk/Dutch.lproj/MainWindow.nib/info.nib trunk/Dutch.lproj/MainWindow.nib/keyedobjects.nib trunk/English.lproj/MainWindow.nib/classes.nib trunk/English.lproj/MainWindow.nib/info.nib trunk/English.lproj/MainWindow.nib/keyedobjects.nib trunk/Italian.lproj/MainWindow.nib/classes.nib trunk/Italian.lproj/MainWindow.nib/info.nib trunk/Italian.lproj/MainWindow.nib/keyedobjects.nib trunk/SKMainWindowController.h trunk/SKMainWindowController.m trunk/SKPDFView.h trunk/SKPDFView.m trunk/SKTransitionController.h trunk/SKTransitionController.m Modified: trunk/Dutch.lproj/MainWindow.nib/classes.nib =================================================================== --- trunk/Dutch.lproj/MainWindow.nib/classes.nib 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/Dutch.lproj/MainWindow.nib/classes.nib 2007-07-18 11:43:08 UTC (rev 2525) @@ -160,6 +160,7 @@ toolModeButton = NSSegmentedControl; transitionDurationField = NSTextField; transitionDurationSlider = NSSlider; + transitionExtentMatrix = NSMatrix; transitionSheet = NSWindow; transitionStylePopUpButton = NSPopUpButton; }; Modified: trunk/Dutch.lproj/MainWindow.nib/data.dependency =================================================================== --- trunk/Dutch.lproj/MainWindow.nib/data.dependency 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/Dutch.lproj/MainWindow.nib/data.dependency 2007-07-18 11:43:08 UTC (rev 2525) @@ -5,7 +5,6 @@ <key>IBPaletteDependency</key> <array> <string>PDFKit</string> - <string>Controllers</string> </array> </dict> </plist> Modified: trunk/Dutch.lproj/MainWindow.nib/info.nib =================================================================== --- trunk/Dutch.lproj/MainWindow.nib/info.nib 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/Dutch.lproj/MainWindow.nib/info.nib 2007-07-18 11:43:08 UTC (rev 2525) @@ -25,6 +25,10 @@ <array> <integer>208</integer> </array> + <key>IBOpenObjects</key> + <array> + <integer>633</integer> + </array> <key>IBSystem Version</key> <string>8R218</string> </dict> Modified: trunk/Dutch.lproj/MainWindow.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/English.lproj/MainWindow.nib/classes.nib =================================================================== --- trunk/English.lproj/MainWindow.nib/classes.nib 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/English.lproj/MainWindow.nib/classes.nib 2007-07-18 11:43:08 UTC (rev 2525) @@ -160,6 +160,7 @@ toolModeButton = NSSegmentedControl; transitionDurationField = NSTextField; transitionDurationSlider = NSSlider; + transitionExtentMatrix = NSMatrix; transitionSheet = NSWindow; transitionStylePopUpButton = NSPopUpButton; }; Modified: trunk/English.lproj/MainWindow.nib/info.nib =================================================================== --- trunk/English.lproj/MainWindow.nib/info.nib 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/English.lproj/MainWindow.nib/info.nib 2007-07-18 11:43:08 UTC (rev 2525) @@ -27,18 +27,18 @@ </array> <key>IBOpenObjects</key> <array> - <integer>168</integer> - <integer>256</integer> - <integer>5</integer> - <integer>208</integer> - <integer>502</integer> <integer>633</integer> + <integer>553</integer> <integer>539</integer> - <integer>511</integer> + <integer>314</integer> + <integer>5</integer> + <integer>168</integer> <integer>224</integer> - <integer>553</integer> - <integer>314</integer> + <integer>256</integer> <integer>585</integer> + <integer>511</integer> + <integer>502</integer> + <integer>208</integer> </array> <key>IBSystem Version</key> <string>8R218</string> Modified: trunk/English.lproj/MainWindow.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/Italian.lproj/MainWindow.nib/classes.nib =================================================================== --- trunk/Italian.lproj/MainWindow.nib/classes.nib 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/Italian.lproj/MainWindow.nib/classes.nib 2007-07-18 11:43:08 UTC (rev 2525) @@ -160,6 +160,7 @@ toolModeButton = NSSegmentedControl; transitionDurationField = NSTextField; transitionDurationSlider = NSSlider; + transitionExtentMatrix = NSMatrix; transitionSheet = NSWindow; transitionStylePopUpButton = NSPopUpButton; }; Modified: trunk/Italian.lproj/MainWindow.nib/info.nib =================================================================== --- trunk/Italian.lproj/MainWindow.nib/info.nib 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/Italian.lproj/MainWindow.nib/info.nib 2007-07-18 11:43:08 UTC (rev 2525) @@ -27,12 +27,12 @@ </array> <key>IBOpenObjects</key> <array> + <integer>208</integer> + <integer>539</integer> + <integer>511</integer> + <integer>5</integer> <integer>628</integer> - <integer>5</integer> - <integer>511</integer> <integer>553</integer> - <integer>539</integer> - <integer>208</integer> <integer>168</integer> </array> <key>IBSystem Version</key> Modified: trunk/Italian.lproj/MainWindow.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/SKMainWindowController.h =================================================================== --- trunk/SKMainWindowController.h 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/SKMainWindowController.h 2007-07-18 11:43:08 UTC (rev 2525) @@ -167,6 +167,7 @@ IBOutlet NSPopUpButton *transitionStylePopUpButton; IBOutlet NSTextField *transitionDurationField; IBOutlet NSSlider *transitionDurationSlider; + IBOutlet NSMatrix *transitionExtentMatrix; NSButton *colorAccessoryView; BOOL updatingColor; Modified: trunk/SKMainWindowController.m =================================================================== --- trunk/SKMainWindowController.m 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/SKMainWindowController.m 2007-07-18 11:43:08 UTC (rev 2525) @@ -74,6 +74,7 @@ #import "SKLineInspector.h" #import "SKColorSwatch.h" #import "SKStatusBar.h" +#import "SKTransitionController.h" #define SEGMENTED_CONTROL_HEIGHT 25.0 #define WINDOW_X_DELTA 0.0 @@ -1693,13 +1694,25 @@ if (returnCode == NSOKButton) { [pdfView setTransitionStyle:[[transitionStylePopUpButton selectedItem] tag]]; [pdfView setTransitionDuration:fmax([transitionDurationField floatValue], 0.0)]; + [pdfView setTransitionShouldRestrict:(BOOL)[[transitionExtentMatrix selectedCell] tag]]; } } - (IBAction)chooseTransition:(id)sender { + if ([transitionStylePopUpButton numberOfItems] == SKCoreImageTransition) { + NSArray *filterNames = [SKTransitionController transitionFilterNames]; + int i, count = [filterNames count]; + for (i = 0; i < count; i++) { + NSString *name = [filterNames objectAtIndex:i]; + [transitionStylePopUpButton addItemWithTitle:[CIFilter localizedNameForFilterName:name]]; + NSMenuItem *item = [transitionStylePopUpButton lastItem]; + [item setTag:SKCoreImageTransition + i]; + } + } [transitionStylePopUpButton selectItemWithTag:[pdfView transitionStyle]]; [transitionDurationField setFloatValue:[pdfView transitionDuration]]; [transitionDurationSlider setFloatValue:[pdfView transitionDuration]]; + [transitionExtentMatrix selectCellWithTag:(int)[pdfView transitionShouldRestrict]]; [NSApp beginSheet:transitionSheet modalForWindow:[self window] modalDelegate:self Modified: trunk/SKPDFView.h =================================================================== --- trunk/SKPDFView.h 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/SKPDFView.h 2007-07-18 11:43:08 UTC (rev 2525) @@ -93,6 +93,7 @@ SKAnimationTransitionStyle transitionStyle; float transitionDuration; + BOOL transitionShouldRestrict; PDFAnnotation *activeAnnotation; PDFAnnotation *highlightAnnotation; @@ -149,6 +150,9 @@ - (float)transitionDuration; - (void)setTransitionDuration:(float)duration; +- (BOOL)transitionShouldRestrict; +- (void)setTransitionShouldRestrict:(BOOL)flag; + - (IBAction)delete:(id)sender; - (IBAction)autoSelectContent:(id)sender; Modified: trunk/SKPDFView.m =================================================================== --- trunk/SKPDFView.m 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/SKPDFView.m 2007-07-18 11:43:08 UTC (rev 2525) @@ -153,6 +153,7 @@ transitionController = nil; transitionStyle = SKNoTransition; transitionDuration = 1.0; + transitionShouldRestrict = NO; spellingTag = [NSSpellChecker uniqueSpellDocumentTag]; @@ -548,6 +549,14 @@ transitionDuration = duration; } +- (BOOL)transitionShouldRestrict { + return transitionShouldRestrict; +} + +- (void)setTransitionShouldRestrict:(BOOL)flag { + transitionShouldRestrict = flag; +} + #pragma mark Reading bar - (BOOL)hasReadingBar { @@ -587,7 +596,7 @@ else [super goToPreviousPage:self]; rect = [self convertRect:[[self currentPage] boundsForBox:[self displayBox]] fromPage:[self currentPage]]; - [transitionController animateWithTransitionStyle:[self transitionStyle] direction:next ? CGSLeft : CGSRight duration:[self transitionDuration] fromRect:rect]; + [transitionController animateWithTransitionStyle:[self transitionStyle] direction:next ? CGSLeft : CGSRight duration:[self transitionDuration] fromRect:rect shouldRestrict:transitionShouldRestrict]; } - (void)goToNextPage:(id)sender { Modified: trunk/SKTransitionController.h =================================================================== --- trunk/SKTransitionController.h 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/SKTransitionController.h 2007-07-18 11:43:08 UTC (rev 2525) @@ -107,6 +107,8 @@ SKWarpSwitchTransition = CGSWarpSwitch, SKWarpFlipTransition = CGSFlip, // Core Image transitions + SKCoreImageTransition + /* SKCopyMachineTransition, SKDisintegrateTransition, SKDissolveTransition, @@ -114,7 +116,7 @@ SKModTransition, SKPageCurlTransition, SKRippleTransition, - SKSwipeTransition + SKSwipeTransition*/ } SKAnimationTransitionStyle; @class SKTransitionView; @@ -127,12 +129,14 @@ NSRect imageRect; } ++ (NSArray *)transitionFilterNames; + - (id)initWithView:(NSView *)aView; - (NSView *)view; - (void)setView:(NSView *)newView; - (void)prepareForAnimationWithTransitionStyle:(SKAnimationTransitionStyle)transitionStyle fromRect:(NSRect)rect; -- (void)animateWithTransitionStyle:(SKAnimationTransitionStyle)transitionStyle direction:(CGSTransitionOption)direction duration:(float)duration fromRect:(NSRect)rect; +- (void)animateWithTransitionStyle:(SKAnimationTransitionStyle)transitionStyle direction:(CGSTransitionOption)direction duration:(float)duration fromRect:(NSRect)rect shouldRestrict:(BOOL)shouldRestrict; @end Modified: trunk/SKTransitionController.m =================================================================== --- trunk/SKTransitionController.m 2007-07-18 08:44:28 UTC (rev 2524) +++ trunk/SKTransitionController.m 2007-07-18 11:43:08 UTC (rev 2525) @@ -74,6 +74,18 @@ @implementation SKTransitionController ++ (NSArray *)transitionFilterNames { + static NSMutableArray *transitionFilterNames = nil; + + if(transitionFilterNames == nil) { + // get all the transition filters + [CIPlugIn loadAllPlugIns]; + transitionFilterNames = [[CIFilter filterNamesInCategories:[NSArray arrayWithObject:kCICategoryTransition]] copy]; + } + + return transitionFilterNames; +} + - (id)initWithView:(NSView *)aView { if (self = [super init]) { view = aView; @@ -126,71 +138,48 @@ return inputMaskImage; } -- (CIFilter *)transitionFilter:(SKAnimationTransitionStyle)transitionStyle forRect:(NSRect)rect inBounds:(NSRect)bounds initialCIImage:(CIImage *)initialCIImage finalCIImage:(CIImage *)finalCIImage { - CIFilter *transitionFilter = nil; +- (CIFilter *)transitionFilter:(SKAnimationTransitionStyle)transitionStyle forRect:(NSRect)rect inBounds:(NSRect)bounds shouldRestrict:(BOOL)shouldRestrict initialCIImage:(CIImage *)initialCIImage finalCIImage:(CIImage *)finalCIImage { + NSString *filterName = [[[self class] transitionFilterNames] objectAtIndex:transitionStyle - SKCoreImageTransition]; + CIFilter *transitionFilter = [self filterWithName:filterName]; - switch (transitionStyle) { - case SKCopyMachineTransition: - transitionFilter = [self filterWithName:@"CICopyMachineTransition"]; - [transitionFilter setValue:[CIVector vectorWithX:NSMinX(rect) Y:NSMinY(rect) Z:NSWidth(rect) W:NSHeight(rect)] forKey:@"inputExtent"]; - break; - - case SKDisintegrateTransition: - { - transitionFilter = [self filterWithName:@"CIDisintegrateWithMaskTransition"]; - - // Scale and translate our mask image to match the transition area size. - CIFilter *maskScalingFilter = [self filterWithName:@"CILanczosScaleTransform"]; - CGRect maskExtent = [[self inputMaskImage] extent]; - float xScale = NSWidth(rect) / CGRectGetWidth(maskExtent); - float yScale = NSHeight(rect) / CGRectGetHeight(maskExtent); - [maskScalingFilter setValue:[NSNumber numberWithFloat:yScale] forKey:@"inputScale"]; - [maskScalingFilter setValue:[NSNumber numberWithFloat:xScale / yScale] forKey:@"inputAspectRatio"]; - [maskScalingFilter setValue:[self inputMaskImage] forKey:@"inputImage"]; - CIFilter *maskTranslationFilter = [self filterWithName:@"CIAffineTransform"]; - NSAffineTransform *affineTransform = [NSAffineTransform transform]; - [affineTransform translateXBy:NSMinX(rect) - NSMinX(bounds) yBy:NSMinY(rect) - NSMinY(bounds)]; - [maskTranslationFilter setValue:affineTransform forKey:@"inputTransform"]; - [maskTranslationFilter setValue:[maskScalingFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; - - [transitionFilter setValue:[maskTranslationFilter valueForKey:@"outputImage"] forKey:@"inputMaskImage"]; - break; - } - case SKDissolveTransition: - transitionFilter = [self filterWithName:@"CIDissolveTransition"]; - break; - - case SKFlashTransition: - transitionFilter = [self filterWithName:@"CIFlashTransition"]; - [transitionFilter setValue:[CIVector vectorWithX:NSMidX(rect) Y:NSMidY(rect)] forKey:@"inputCenter"]; - [transitionFilter setValue:[CIVector vectorWithX:NSMinX(bounds) Y:NSMinY(bounds) Z:NSWidth(bounds) W:NSHeight(bounds)] forKey:@"inputExtent"]; - break; - - case SKModTransition: - transitionFilter = [self filterWithName:@"CIModTransition"]; - [transitionFilter setValue:[CIVector vectorWithX:NSMidX(rect) Y:NSMidY(rect)] forKey:@"inputCenter"]; - break; - - case SKPageCurlTransition: - transitionFilter = [self filterWithName:@"CIPageCurlTransition"]; + NSEnumerator *keyEnum = [[transitionFilter inputKeys] objectEnumerator]; + NSString *key; + + while (key = [keyEnum nextObject]) { + if([key isEqualToString:@"inputExtent"]) { + NSRect extent = shouldRestrict ? rect : bounds; + [transitionFilter setValue:[CIVector vectorWithX:NSMinX(extent) Y:NSMinY(extent) Z:NSWidth(extent) W:NSHeight(extent)] forKey:key]; + } else if([key isEqualToString:@"inputAngle"] && [filterName isEqualToString:@"CIPageCurlTransition"]) { [transitionFilter setValue:[NSNumber numberWithFloat:-M_PI_4] forKey:@"inputAngle"]; - [transitionFilter setValue:initialCIImage forKey:@"inputBacksideImage"]; - [transitionFilter setValue:[self inputShadingImage] forKey:@"inputShadingImage"]; - [transitionFilter setValue:[CIVector vectorWithX:NSMinX(rect) Y:NSMinY(rect) Z:NSWidth(rect) W:NSHeight(rect)] forKey:@"inputExtent"]; - break; + } else if([key isEqualToString:@"inputCenter"]) { + [transitionFilter setValue:[CIVector vectorWithX:NSMidX(rect) Y:NSMidY(rect)] forKey:key]; + } else { + NSString *classType = [[[transitionFilter attributes] objectForKey:key] objectForKey:kCIAttributeClass]; - case SKSwipeTransition: - transitionFilter = [self filterWithName:@"CISwipeTransition"]; - [transitionFilter setValue:[CIVector vectorWithX:NSMinX(rect) Y:NSMinY(rect) Z:NSWidth(rect) W:NSHeight(rect)] forKey:@"inputExtent"]; - break; - - case SKRippleTransition: - default: - transitionFilter = [self filterWithName:@"CIRippleTransition"]; - [transitionFilter setValue:[CIVector vectorWithX:NSMidX(rect) Y:NSMidY(rect)] forKey:@"inputCenter"]; - [transitionFilter setValue:[CIVector vectorWithX:NSMinX(bounds) Y:NSMinY(bounds) Z:NSWidth(bounds) W:NSHeight(bounds)] forKey:@"inputExtent"]; - [transitionFilter setValue:[self inputShadingImage] forKey:@"inputShadingImage"]; - break; + if([classType isEqualToString:@"CIImage"]) { + if([key isEqualToString:@"inputShadingImage"]) { + [transitionFilter setValue:[self inputShadingImage] forKey:key]; + } else if ([key isEqualToString:@"inputBacksideImage"]) { + [transitionFilter setValue:initialCIImage forKey:key]; + } else { + // Scale and translate our mask image to match the transition area size. + CIFilter *maskScalingFilter = [self filterWithName:@"CILanczosScaleTransform"]; + CGRect maskExtent = [[self inputMaskImage] extent]; + float xScale = NSWidth(rect) / CGRectGetWidth(maskExtent); + float yScale = NSHeight(rect) / CGRectGetHeight(maskExtent); + [maskScalingFilter setValue:[NSNumber numberWithFloat:yScale] forKey:@"inputScale"]; + [maskScalingFilter setValue:[NSNumber numberWithFloat:xScale / yScale] forKey:@"inputAspectRatio"]; + [maskScalingFilter setValue:[self inputMaskImage] forKey:@"inputImage"]; + CIFilter *maskTranslationFilter = [self filterWithName:@"CIAffineTransform"]; + NSAffineTransform *affineTransform = [NSAffineTransform transform]; + [affineTransform translateXBy:NSMinX(rect) - NSMinX(bounds) yBy:NSMinY(rect) - NSMinY(bounds)]; + [maskTranslationFilter setValue:affineTransform forKey:@"inputTransform"]; + [maskTranslationFilter setValue:[maskScalingFilter valueForKey:@"outputImage"] forKey:@"inputImage"]; + + [transitionFilter setValue:[maskTranslationFilter valueForKey:@"outputImage"] forKey:key]; + } + } + } } if (NSEqualRects(rect, bounds) == NO) { @@ -211,7 +200,7 @@ - (void)prepareForAnimationWithTransitionStyle:(SKAnimationTransitionStyle)transitionStyle fromRect:(NSRect)rect { if (transitionStyle == SKNoTransition) { - } else if (transitionStyle < SKCopyMachineTransition) { + } else if (transitionStyle < SKCoreImageTransition) { // We don't want the window to draw the next state before the animation is run [[view window] disableFlushWindow]; } else { @@ -228,10 +217,10 @@ } } -- (void)animateWithTransitionStyle:(SKAnimationTransitionStyle)transitionStyle direction:(CGSTransitionOption)direction duration:(float)duration fromRect:(NSRect)rect { +- (void)animateWithTransitionStyle:(SKAnimationTransitionStyle)transitionStyle direction:(CGSTransitionOption)direction duration:(float)duration fromRect:(NSRect)rect shouldRestrict:(BOOL)shouldRestrict { if (transitionStyle == SKNoTransition) { - } else if (transitionStyle < SKCopyMachineTransition) { + } else if (transitionStyle < SKCoreImageTransition) { // declare our variables int handle = -1; @@ -257,7 +246,7 @@ [[view window] flushWindow]; CGSInvokeTransition(cgs, handle, duration); - // We need to wait for the transition to finish before we get rid of it, otherwise we’ll get all sorts of nasty errors... or maybe not. + // We need to wait for the transition to finish before we get rid of it, otherwise we'll get all sorts of nasty errors... or maybe not. usleep((useconds_t)(duration * 1000000)); CGSReleaseTransition(cgs, handle); @@ -275,7 +264,7 @@ [view cacheDisplayInRect:bounds toBitmapImageRep:finalContentBitmap]; CIImage *finalImage = [[CIImage alloc] initWithBitmapImageRep:finalContentBitmap]; - CIFilter *transitionFilter = [self transitionFilter:transitionStyle forRect:imageRect inBounds:[view bounds] initialCIImage:initialImage finalCIImage:finalImage]; + CIFilter *transitionFilter = [self transitionFilter:transitionStyle forRect:imageRect inBounds:[view bounds] shouldRestrict:shouldRestrict initialCIImage:initialImage finalCIImage:finalImage]; [finalImage release]; [initialImage release]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Skim-app-commit mailing list Skim-app-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/skim-app-commit