Revision: 15233
http://sourceforge.net/p/skim-app/code/15233
Author: hofman
Date: 2025-05-19 09:35:00 +0000 (Mon, 19 May 2025)
Log Message:
-----------
convenience method to create block drawing the image and scheduling main queue
handler
Modified Paths:
--------------
trunk/SKPresentationView.m
Modified: trunk/SKPresentationView.m
===================================================================
--- trunk/SKPresentationView.m 2025-05-19 08:48:22 UTC (rev 15232)
+++ trunk/SKPresentationView.m 2025-05-19 09:35:00 UTC (rev 15233)
@@ -297,37 +297,47 @@
- (void)removePredrawnImageAtIndex:(NSUInteger)pageIndex {}
-static NSImage *imageByDrawingPageToBitmapImageRep(NSBitmapImageRep *imageRep,
PDFPage *aPage, BOOL autoScales) {
- NSSize size = [imageRep size];
- NSRect pageRect = [aPage boundsForBox:kPDFDisplayBoxCropBox];
- if (([aPage rotation] % 180) != 0)
- pageRect = NSMakeRect(0.0, 0.0, NSHeight(pageRect), NSWidth(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));
+- (dispatch_block_t)imageGeneratorForPage:(PDFPage *)aPage handler:(void
(^)(NSImage *))handler {
+ NSBitmapImageRep *imageRep = [self
bitmapImageRepForCachingDisplayInRect:[self bounds]];
- CGContextRef context = [[NSGraphicsContext
graphicsContextWithBitmapImageRep:imageRep] CGContext];
+ if (imageRep == nil)
+ return nil;
- CGContextSaveGState(context);
- CGContextSetFillColorWithColor(context,
CGColorGetConstantColor(kCGColorWhite));
- CGContextFillRect(context, SKPixelAlignedRect(NSRectToCGRect(pageRect),
context));
- CGContextRestoreGState(context);
- CGContextSaveGState(context);
- CGContextSetInterpolationQuality(context, [[NSUserDefaults
standardUserDefaults] integerForKey:SKInterpolationQualityKey] + 1);
- CGContextTranslateCTM(context, NSMinX(pageRect), NSMinY(pageRect));
- CGContextScaleCTM(context, scale, scale);
- [aPage drawWithBox:kPDFDisplayBoxCropBox toContext:context];
- CGContextRestoreGState(context);
+ BOOL autoScales = [self autoScales];
- NSImage *image = [[NSImage alloc] initWithSize:size];
- [image addRepresentation:imageRep];
-
- return image;
+ return dispatch_block_create(0, ^{
+
+ NSSize size = [imageRep size];
+ NSRect pageRect = [aPage boundsForBox:kPDFDisplayBoxCropBox];
+ if (([aPage rotation] % 180) != 0)
+ pageRect = NSMakeRect(0.0, 0.0, NSHeight(pageRect),
NSWidth(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);
+ CGContextSetFillColorWithColor(context,
CGColorGetConstantColor(kCGColorWhite));
+ CGContextFillRect(context,
SKPixelAlignedRect(NSRectToCGRect(pageRect), context));
+ CGContextRestoreGState(context);
+ CGContextSaveGState(context);
+ CGContextSetInterpolationQuality(context, [[NSUserDefaults
standardUserDefaults] integerForKey:SKInterpolationQualityKey] + 1);
+ CGContextTranslateCTM(context, NSMinX(pageRect), NSMinY(pageRect));
+ CGContextScaleCTM(context, scale, scale);
+ [aPage drawWithBox:kPDFDisplayBoxCropBox toContext:context];
+ CGContextRestoreGState(context);
+
+ NSImage *image = [[NSImage alloc] initWithSize:size];
+ [image addRepresentation:imageRep];
+
+ dispatch_async(dispatch_get_main_queue(), ^{ handler(image); });
+ });
}
- (void)displayCurrentPage:(void (^)(void))completionHandler {
@@ -348,9 +358,15 @@
return;
}
- NSBitmapImageRep *imageRep = [self
bitmapImageRepForCachingDisplayInRect:[self bounds]];
+ PDFPage *thePage = page;
+ dispatch_block_t imageGenerator = [self imageGeneratorForPage:page
handler:^(NSImage *image){
+ if (thePage == page)
+ [pageLayer setContents:image];
+ if (completionHandler)
+ completionHandler();
+ }];
- if (imageRep == nil) {
+ if (imageGenerator == nil) {
if (completionHandler)
completionHandler();
return;
@@ -362,24 +378,8 @@
drawingQueue =
dispatch_queue_create("net.sourceforge.skim-app.skim.pageview.drawing",
queuePriority);
}
- PDFPage *thePage = page;
- BOOL autoScales = [self autoScales];
+ dispatch_async(drawingQueue, imageGenerator);
- dispatch_async(drawingQueue, ^{
-
- NSImage *image = imageByDrawingPageToBitmapImageRep(imageRep, thePage,
autoScales);
-
- dispatch_async(dispatch_get_main_queue(), ^{
-
- if (thePage == page)
- [pageLayer setContents:image];
- if (completionHandler)
- completionHandler();
-
- });
-
- });
-
}
- (void)redisplayAtCurrentScaleFactorIfNeeded {
@@ -522,34 +522,24 @@
if (imageRep == nil)
return;
- PDFPage *thePage = [[page document] pageAtIndex:pageIndex];
- BOOL autoScales = [self autoScales];
+ __block void *block = NULL;
+ dispatch_block_t imageGenerator = [self imageGeneratorForPage:[[page
document] pageAtIndex:pageIndex] handler:^(NSImage *image){
+ if (predrawnImages && block == NSMapGet(predrawnImages, (void
*)pageIndex)) {
+ NSMapRemove(predrawnImages, (void *)pageIndex);
+ NSUInteger currentIndex = [page pageIndex];
+ if (pageIndex > currentIndex)
+ NSMapInsert(predrawnImages, (void *)pageIndex, (__bridge void
*)image);
+ else if (pageIndex == currentIndex)
+ [pageLayer setContents:image];
+ }
+ }];
- __block void *myBlock = NULL;
- dispatch_block_t block = dispatch_block_create(0, ^{
-
- NSImage *image = imageByDrawingPageToBitmapImageRep(imageRep, thePage,
autoScales);
-
- dispatch_async(dispatch_get_main_queue(), ^{
-
- if (predrawnImages && myBlock == NSMapGet(predrawnImages, (void
*)pageIndex)) {
- NSMapRemove(predrawnImages, (void *)pageIndex);
- if (image) {
- NSUInteger currentIndex = [page pageIndex];
- if (pageIndex > currentIndex)
- NSMapInsert(predrawnImages, (void *)pageIndex,
(__bridge void *)image);
- else if (pageIndex == currentIndex)
- [pageLayer setContents:image];
- }
- }
-
- });
-
- });
+ if (imageGenerator == nil)
+ return;
// set this block so we can cancel it
- myBlock = (__bridge void *)block;
- NSMapInsert(predrawnImages, (void *)pageIndex, myBlock);
+ block = (__bridge void *)imageGenerator;
+ NSMapInsert(predrawnImages, (void *)pageIndex, block);
static dispatch_queue_t predrawingQueue = nil;
if (predrawingQueue == nil) {
@@ -557,7 +547,7 @@
predrawingQueue =
dispatch_queue_create("net.sourceforge.skim-app.skim.pageview.predrawing",
queuePriority);
}
- dispatch_async(predrawingQueue, block);
+ dispatch_async(predrawingQueue, imageGenerator);
}
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