I too am working in a cross platform environment and use bitmaps in an NSView.  
I use the code below and it is fast enough to pan , scroll etc with no sense of 
sluggishness.
My code looks a little different than what you have submitted. You might 
re-factor to my model.


CGColorSpaceRef colorSpace;
colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
provider;
CGImageRef bitmap;
        
provider = CGDataProviderCreateWithData (NULL,m_main.m_bitmap.m_array, 4*x*y, 
NULL);
bitmap = CGImageCreate(x, y, 8, 32, 4*x, colorSpace,  
kCGImageAlphaNoneSkipFirst|kCGBitmapByteOrder32Host,provider, NULL,true, 
kCGRenderingIntentDefault);
        
CGRect r;
if(bitmap)
{               
NSGraphicsContext *graphicsContext = [NSGraphicsContext currentContext];
CGContextRef context = (CGContextRef)[graphicsContext graphicsPort];
r = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, 
rect.size.height);        
CGContextDrawImage(context, r, bitmap);
}
        
CGColorSpaceRelease(colorSpace);
CGDataProviderRelease(provider);
CGImageRelease(bitmap);

On Sep 24, 2011, at 12:30 PM, Vojtěch Meluzín wrote:

> Hi folks,
> 
> I'm implementing a crossplatform (not-only GUI) library, where everything is
> drawn internally to an RGBA bitmap and then just copied to screen. On
> Windows it works like charm especially since there is a support for
> "in-memory" bitmaps. But I don't see such a feature on Mac. I ended up with
> this code:
> 
> CGColorSpaceRef colorSpace =
> CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
>        CGContextRef bmpcontext =
> CGBitmapContextCreate((void*)desc.Bitmap.GetData(),
>                                                        sz.X, sz.Y, 8, sz.X
> * 4, colorSpace, kCGImageAlphaNoneSkipLast);
>        CGColorSpaceRelease(colorSpace);
> 
>        CGContextSaveGState(context);
>        CGRect cliprect = { r.X1, sz.Y - r.Y2, r.GetWidth(), r.GetHeight()
> };
>        CGContextClipToRect (context, cliprect);
>        CGContextSetShouldAntialias (context, false);
> 
>        HIRect bounds;
>        bounds.origin.x = 0;
>        bounds.origin.y = 0;
>        bounds.size.width = sz.X;
>        bounds.size.height = sz.Y;
> 
>        CGImageRef temp = CGBitmapContextCreateImage (bmpcontext);
>        CGContextDrawImage(context, bounds, temp);
> 
>        CGImageRelease(temp);
>        CGContextRelease (bmpcontext);
> 
>        CGContextRestoreGState (context);
> 
> 
> It basically converts the whole bitmap into CGImageRef and then copies a
> part of it into the NSView's context. But it's quite slow. Is there a better
> way to do this? And is there a way to create the in-memory images like they
> are on Windows?
> 
> One more thing - I do the same thing in Carbon (I just need Cocoa because of
> x64...) and I noticed that the coordinates for the CGContext is inverted
> vertically, is that correct?? I mean the same context object type, but
> different Y handling...
> 
> Thanks in advance.
> Vojtech
> _______________________________________________
> 
> 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:
> http://lists.apple.com/mailman/options/cocoa-dev/koko%40highrolls.net
> 
> This email sent to k...@highrolls.net
> 

_______________________________________________

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

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

Reply via email to