Revision: 15218
http://sourceforge.net/p/skim-app/code/15218
Author: hofman
Date: 2025-05-16 16:34:35 +0000 (Fri, 16 May 2025)
Log Message:
-----------
Handle nil page separately in setter. Rename a method to avoid confusion.
Modify layout calculation of drawn page.
Modified Paths:
--------------
trunk/SKPresentationView.m
Modified: trunk/SKPresentationView.m
===================================================================
--- trunk/SKPresentationView.m 2025-05-16 14:40:23 UTC (rev 15217)
+++ trunk/SKPresentationView.m 2025-05-16 16:34:35 UTC (rev 15218)
@@ -80,7 +80,7 @@
static NSInteger navigationMode = SKNavigationBottom;
@interface SKPDFPageView ()
-- (void)displayPage:(void (^)(void))completionHandler;
+- (void)displayCurrentPage:(void (^)(void))completionHandler;
@end
@implementation SKPDFPageView
@@ -147,7 +147,7 @@
if (fabs([pageLayer contentsScale] - scale) > 0.0) {
[pageLayer setContentsScale:scale];
[self removePredrawnImageAtIndex:NSNotFound];
- [self displayPage:nil];
+ [self displayCurrentPage:nil];
}
}
@@ -172,14 +172,7 @@
- (void)displayPage:(PDFPage *)newPage completionHandler:(void
(^)(void))completionHandler {
page = newPage;
- if (page) {
- [self displayPage:completionHandler];
- } else {
- [self removePredrawnImageAtIndex:NSNotFound];
- [pageLayer setContents:nil];
- if (completionHandler)
- completionHandler();
- }
+ [self displayCurrentPage:completionHandler];
[[NSNotificationCenter defaultCenter]
postNotificationName:SKPresentationViewPageChangedNotification object:self];
}
@@ -230,8 +223,16 @@
#pragma mark Accessors
- (void)setPage:(PDFPage *)newPage {
- if (newPage != page)
- [self displayPage:newPage completionHandler:nil];
+ if (newPage != page) {
+ if (newPage) {
+ [self displayPage:newPage completionHandler:nil];
+ } else {
+ page = nil;
+ [self removePredrawnImageAtIndex:NSNotFound];
+ [pageLayer setContents:nil];
+ // nothing needs the notification when set to nil
+ }
+ }
}
- (BOOL)autoScales { return YES; }
@@ -295,12 +296,19 @@
- (void)removePredrawnImageAtIndex:(NSUInteger)pageIndex {}
- (NSImage *)imageWithImageRep:(NSBitmapImageRep *)imageRep page:(PDFPage
*)aPage autoScales:(BOOL)autoScales {
- NSRect bounds = {NSZeroPoint, [imageRep size]};
+ NSSize size = [imageRep size];
NSRect pageRect = [aPage boundsForBox:kPDFDisplayBoxCropBox];
if (([page rotation] % 180) != 0)
pageRect = NSMakeRect(0.0, 0.0, NSHeight(pageRect), NSWidth(pageRect));
- CGFloat scale = autoScales ? fmin(NSHeight(bounds) / NSHeight(pageRect),
NSWidth(bounds) / NSWidth(pageRect)) : 1.0;
- pageRect = NSInsetRect(bounds, 0.5 * (NSWidth(bounds) - scale *
NSWidth(pageRect)), 0.5 * (NSHeight(bounds) - scale * NSHeight(pageRect)));
+ CGFloat scale = 1.0;
+ if (autoScales) {
+ scale = fmin(size.height / NSHeight(pageRect), size.width /
NSWidth(pageRect));
+ pageRect.size.width *= scale;
+ pageRect.size.height *= scale;
+ }
+ pageRect.origin.x = 0.5 * (size.width - NSWidth(pageRect));
+ pageRect.origin.y = 0.5 * (size.height - NSHeight(pageRect));
+
CGContextRef context = [[NSGraphicsContext
graphicsContextWithBitmapImageRep:imageRep] CGContext];
CGContextSaveGState(context);
@@ -314,15 +322,18 @@
[aPage drawWithBox:kPDFDisplayBoxCropBox toContext:context];
CGContextRestoreGState(context);
- NSImage *image = [[NSImage alloc] initWithSize:bounds.size];
+ NSImage *image = [[NSImage alloc] initWithSize:size];
[image addRepresentation:imageRep];
return image;
}
-- (void)displayPage:(void (^)(void))completionHandler {
- if (page == nil)
+- (void)displayCurrentPage:(void (^)(void))completionHandler {
+ if (page == nil) {
+ if (completionHandler)
+ completionHandler();
return;
+ }
NSUInteger pageIndex = [page pageIndex];
NSImage *predrawnImage = [self predrawnImageAtIndex:pageIndex];
@@ -430,14 +441,14 @@
- (void)viewDidEndLiveResize {
[super viewDidEndLiveResize];
[self removePredrawnImageAtIndex:NSNotFound];
- [self displayPage:nil];
+ [self displayCurrentPage:nil];
}
- (void)updatedAnnotationOnPage:(PDFPage *)aPage {
if (page == aPage) {
[self removePredrawnImageAtIndex:[aPage pageIndex]];
- [[self class] cancelPreviousPerformRequestsWithTarget:self
selector:@selector(displayPage:) object:nil];
- [self performSelector:@selector(displayPage:) withObject:nil
afterDelay:0.0];
+ [[self class] cancelPreviousPerformRequestsWithTarget:self
selector:@selector(displayCurrentPage:) object:nil];
+ [self performSelector:@selector(displayCurrentPage:) withObject:nil
afterDelay:0.0];
}
}
@@ -457,12 +468,12 @@
NSMapRemove(predrawnImages, (void *)pageIndex);
}
-- (void)displayPage:(void (^)(void))completionHandler {
+- (void)displayCurrentPage:(void (^)(void))completionHandler {
+ [super displayCurrentPage:completionHandler];
+
if (page == nil)
return;
- [super displayPage:completionHandler];
-
// generate an image for the next page in the background, which is usually
needed next for a presentation
NSUInteger pageIndex = [page pageIndex] + 1;
@@ -526,7 +537,7 @@
pvFlags.autoScales = flag;
[pageLayer setContentsGravity:flag ? kCAGravityResizeAspectFill :
kCAGravityCenter];
[self removePredrawnImageAtIndex:NSNotFound];
- [self displayPage:nil];
+ [self displayCurrentPage:nil];
[[NSNotificationCenter defaultCenter]
postNotificationName:SKPresentationViewAutoScalesChangedNotification
object:self];
}
}
@@ -933,8 +944,8 @@
[annotation setColor:tmpColor];
[[page document] addAnnotation:annotation toPage:page];
- [[self class] cancelPreviousPerformRequestsWithTarget:self
selector:@selector(displayPage:) object:nil];
- [self displayPage:^{
+ [[self class] cancelPreviousPerformRequestsWithTarget:self
selector:@selector(displayCurrentPage:) object:nil];
+ [self displayCurrentPage:^{
[layer removeFromSuperlayer];
}];
} else {
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit