Re: drawRect: wrong scale in a programmatically created window
Re: drawRect: wrong scale in a programmatically created window
- Subject: Re: drawRect: wrong scale in a programmatically created window
- From: Andreas Höschler <email@hidden>
- Date: Fri, 15 Jan 2016 12:42:35 +0100
Hi Quincey,
thanks a lot for your response. Please read below ...
>> This should in a view with size {851, 899} get me a purple line starting close to the lower left corner and ending close to the top right corner. But that's not the case. The picture is drawn zoomed in!??
>
> I’m not sure I understand completely. The image is drawn “zoomed in”, or the purple rectangle is drawn “zoomed in”, or both?
>
> Note that the NSBitmapImageRep has dimensions in pixels, The rectangle’s coordinates are in points. You don’t show any code that’s drawing the image back to the screen (if that’s what you’re doing), but NSImage dimensions (the ‘size’ property) is also in points, not pixels, even when the bitmap image rep is in pixels.
It seems I have a lack of understanding of the difference of points and pixels. What you describe is/was exactly the problem. My code
[mapView lockFocus];
NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:[mapView bounds]];
NSData *data = [[[rep representationUsingType:NSPNGFileType properties:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1] forKey:@"NSImageInterlaced"]] retain] autorelease];
[mapView unlockFocus];
with mapView bounds
2016-01-15 12:27:05.173 ESMMapServer[49673:451971] bounds {{0, 0}, {851, 899}}
generates the following an image with Size={851, 899} and Pixels=1702x1798. When I put this into an imageView with
NSImage *image = [[NSImage alloc] initWithData:imageData];
NSLog(@"image %@", image, NSStringFromSize([image size]));
NSLog(@"mapView %@ frame %@", mapView, NSStringFromRect([mapView frame]));
NSLog(@"mapView %@ bounds %@", mapView, NSStringFromRect([mapView bounds]));
[imageData writeToFile:@"/Users/ahoesch/B.png" atomically:YES]; // <--- remove this line
[mapView setImageScaling:NSScaleNone];
[mapView setImage:image];
I of course get the unwanted effect:
"NSBitmapImageRep 0x7c024280 Size={851, 899} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=1702x1798 Alpha=YES Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x7c015c90"
)>
15/01/16 12:27:05,523 SOSmartBrowser[49595]: mapView <FBMapView: 0x81b661c0> frame {{10, 10}, {851, 899}}
15/01/16 12:27:05,523 SOSmartBrowser[49595]: mapView <FBMapView: 0x81b661c0> bounds {{0, 0}, {851, 899}}
This can of course easily be fixed by doing
[mapView setImageScaling:NSScaleProportionally]; // NSScaleNone is no good idea since the image might have Pixels=1702x1798 for Size={851, 899}
instead! :-) I understand the idea of NSBitmapImageRep generating the image with a higher resolution. This is actually pretty cool. But how does NSBitmapImageRep know which pixel resolution to choose? How does it derive Pixels=1702x1798 when I create the imageRep with a {{0, 0}, {851, 899} rect?
Thanks a lot!!
Andreas
_______________________________________________
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