• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
PDFKit on 10.12
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

PDFKit on 10.12


  • Subject: PDFKit on 10.12
  • From: Jonathan Mitchell <email@hidden>
  • Date: Tue, 04 Oct 2016 14:26:15 +0100

PDFKit seems a bit disturbed on Sierra.
The 10.12 beta 3 seems to improve things but there are still some rendering stutters etc.

Has PDFKit been reworked - there doesn’t seem to be any mention of it in the release notes?
If so it might be a question of waiting for the internal gremlins to be hunted down rather than me wasting too much time on this.

Before 10.12 PDFPage -(void)drawWithBox:(PDFDisplayBox)box was called.

In 10.12 PDFPage -(void)drawWithBox:(PDFDisplayBox)box toContext:(CGContextRef)context was defined.

However, on 10.12.0 when printing NSPrintThumbnailView calls drawWithBox:(PDFDisplayBox)box inContext:(CGContextRef)context not toContext:.
My only solution here has been to override the private  PDFPage -(void)drawWithBox:(PDFDisplayBox)box inContext:(CGContextRef)context

In addition screen rendering seems to be suffering.
Rendering now has to target the CGContextRef given in PDFPage drawWithBox:toContext:

I render additional text onto the PDF using NSLayoutManager using a flipped NSGraphicsContext.

Pre 10.12 this worked fine. Now it is flakey - often I just get a PDFPage rect filled with red (printing seems okay).
Perhaps I am not handling the context correctly.

It would seem that the actual generation is now called on a background thread and that [NSGraphicsContext currentContext] can be nil.
I try to deal with this but all is still not quite what it was.

- (void)drawWithBox:(PDFDisplayBox)box inContext:(CGContextRef)context
{
    [super drawWithBox:box inContext:context];

  BOOL hasInitialNSGraphicsContext = NO;

    if ([NSGraphicsContext currentContext]) {
        [NSGraphicsContext saveGraphicsState];
        hasInitialNSGraphicsContext = YES;
    }
    else {
        CGContextSaveGState(context);
    }

    // life is much easier if we use a flipped co-ordinate system.
    // NSLayoutManager expects a flipped NSGraphicsContext to be present.
    NSGraphicsContext *flippedGC = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:YES];
    [NSGraphicsContext setCurrentContext:flippedGC];

    // define the flip transform
    NSAffineTransform* xform = [NSAffineTransform transform];
    [xform translateXBy:0.0 yBy:self.mediaBoxRect.size.height];
    [xform scaleXBy:1.0 yBy:-1.0];
    [xform concat];

    // draw all map items
    … do my drawing here

    if (hasInitialNSGraphicsContext) {
        [NSGraphicsContext restoreGraphicsState];
    }
    else {
        CGContextRestoreGState(context);
    }

}

Jonathan
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


  • Follow-Ups:
    • Re: PDFKit on 10.12
      • From: Antonio Nunes <email@hidden>
  • Prev by Date: Re: MLMediaLibrary sometimes does not call my KVO
  • Next by Date: Re: PopUp menus in tables
  • Previous by thread: Re: MLMediaLibrary sometimes does not call my KVO
  • Next by thread: Re: PDFKit on 10.12
  • Index(es):
    • Date
    • Thread