On 19 Aug 2013, at 14:17, Graham Cox <appt...@me.com> wrote:

> 
> On 19/08/2013, at 9:01 AM, Gerriet M. Denkmann <gerr...@mdenkmann.de> wrote:
> 
>> I seem to need a way to tell NSImage NOT to double the pixels for me, but I 
>> don't see any way to do this.
>> Like: [ image setBackingScaleFactor: 1 ] but no such method seems to exist.
>> 
>> 
>> So hardcoding the retina-ness of my current computer seems to be the only 
>> solution.
> 
> 
> Of course it isn't.
> 
> Marcel's answer looks correct to me - forget NSImage, use NSBitmapImageRep 
> instead (without adding it to an NSImage). Instead of -lockFocus, etc, just 
> create a context using the bitmap rep and set it as the current context. Then 
> you can draw using either high-level stuff that uses "the current context" or 
> lower level CG... functions.
> 
> The problem you're running into is that NSImage is trying to be too darn 
> smart. Don't give it the chance, by not using it AT ALL.

Yes, this really the crux of the matter. Once I eliminated NSImage, everything 
started working.

Here is the final code (if there is anything wrong or not quite right, please 
feel free to critizise it):

#define USE_IMAGEx      //      Off. Works, but has Retina hard-coded. 

#ifdef USE_IMAGE
        finalWidth /= 2;        //      hardcoded Retina Fix 
#endif

CGFloat scaleFactor = finalWidth / bounds.size.width;
NSSize sizE = NSMakeSize( finalWidth, bounds.size.height * scaleFactor );
                
#ifdef          USE_IMAGE
        NSImage *image = [[NSImage alloc] initWithSize: sizE];
        [image setFlipped:YES];
        [image lockFocus];
#else   //      USE_BITMAP              
        NSInteger width = (NSInteger)sizE.width;
        NSInteger height = (NSInteger)sizE.height;
        NSInteger bps = 8;
        NSInteger spp = 4;//    RGBA
        NSBitmapImageRep *imageRep =    [ [ NSBitmapImageRep alloc ]    
initWithBitmapDataPlanes:       NULL
                                                                                
                                                        pixelsWide:             
                        width 
                                                                                
                                                        pixelsHigh:             
                        height 
                                                                                
                                                        bitsPerSample:          
                bps 
                                                                                
                                                        samplesPerPixel:        
                spp 
                                                                                
                                                        hasAlpha:               
                        YES 
                                                                                
                                                        isPlanar:               
                        NO 
                                                                                
                                                        colorSpaceName: 
NSCalibratedRGBColorSpace 
                                                                                
                                                        bytesPerRow:            
                0 
                                                                                
                                                        bitsPerPixel:           
                0
                                                                        ];      
                
        NSGraphicsContext *bitmapContext1 = [ NSGraphicsContext 
graphicsContextWithBitmapImageRep: imageRep ];
        void *graphicsPort = [ bitmapContext1 graphicsPort ];
        NSGraphicsContext *bitmapContext2 =     [ NSGraphicsContext 
graphicsContextWithGraphicsPort:    graphicsPort 
                                                                                
                                        flipped:                                
                        YES 
                                                                                
];
        [NSGraphicsContext setCurrentContext: bitmapContext2 ];
#endif  //      USE_IMAGE or BITMAP
                
NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
NSLog(@"%s currentContext: %@",__FUNCTION__, 
currentContext);//<NSSnapshotBitmapGraphicsContext: 0x1018c1e40>

NSAffineTransform *transform = [NSAffineTransform transform];

#ifdef          USE_IMAGE
        [transform scaleXBy: scaleFactor  yBy: +scaleFactor ];
        [transform translateXBy: -NSMinX(bounds)  yBy: -NSMinY(bounds) ];
#else   //      USE_BITMAP
        //      no idea why these have to be different:
        [transform scaleXBy: scaleFactor  yBy: -scaleFactor ];
        [transform translateXBy: -NSMinX(bounds)  yBy: -NSMaxY(bounds) ];
#endif  //      USE_IMAGE or BITMAP

[transform concat];
          
NSUInteger graphicIndex = [graphics count];
while (graphicIndex-- > 0) 
{
        SKTGraphic *graphic = graphics[graphicIndex];
        [currentContext saveGraphicsState];                     
        [NSBezierPath clipRect:[graphic drawingBounds]];
        [graphic drawContentsInView:nil isBeingCreateOrEdited:NO];
        [currentContext restoreGraphicsState];
};

#ifdef          USE_IMAGE
        [image unlockFocus];

        NSRect recct = NSMakeRect(0, 0, sizE.width, sizE.height );       
        [image lockFocus];
        NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] 
initWithFocusedViewRect: recct ];
        [image unlockFocus];
#endif  //      USE_IMAGE

NSBitmapImageFileType exTyp = isTiff ? NSTIFFFileType : NSPNGFileType;
NSData *data = [ imageRep representationUsingType: exTyp  properties: nil ];

Gerriet.


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to