deprecatedquartz-2dosx-leopardquickdraw

conversion from quickdraw to quartz 2D


I have an old code that uses,

Rect r;    
GetPortBounds(some_bitmap,&r);    
PixMapHandle somehandle = GetGWorldPixMap(some_bitmap);
if(LockPixels(somehandle)){
  TPixel *data = (TPixel *) GetPixBaseAddr(somehandle);  
  long row_bytes = GetPixRowBytes(somehandle);  
  // doing something  
  UnlockPixels(somehandle);  
}  

Can anyone help me with the replacement code in quartz 2d


Solution

  • To modify a bitmap with Quartz you can initialize a CGContextRef with the image and draw to that context with CGContextDraw... routines.
    (I wrote the following sample code for a NSView subclass. It's a bit inefficient. If you use the code, separate the stuff you can keep around in iVars.)

    - (void)drawRect:(NSRect)dirtyRect
    {
        //Load an image ...
        NSImage* image = [[NSImage alloc] initWithContentsOfFile:@"/Library/Desktop Pictures/Grass Blades.jpg"];
        CGImageRef testImage = [[[image representations] objectAtIndex:0] CGImage];
        [image release];
        CGDataProviderRef dataProvider = CGImageGetDataProvider(testImage);
        //... and retrieve its pixel data
        CFDataRef imageData = CGDataProviderCopyData(dataProvider);
        void* pixels = (void*)CFDataGetBytePtr(imageData);
        CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
        //Init a quartz context that uses the pixel data memory as buffer
        CGContextRef drawContext = CGBitmapContextCreate(pixels, CGImageGetWidth(testImage), CGImageGetHeight(testImage), CGImageGetBitsPerComponent(testImage), CGImageGetBytesPerRow(testImage), colorspace, CGImageGetBitmapInfo(testImage));
        CGContextSetRGBFillColor(drawContext, 0.8, 0.8, 0.8, 1.0);
        //Do something with the newly created context
        CGContextFillRect(drawContext, CGRectMake(20.0, 20.0, 200.0, 200.0));    
        CGColorSpaceRelease(colorspace);
        CGImageRef finalImage = CGBitmapContextCreateImage(drawContext);
        //Draw the modified image to the screen
        CGContextDrawImage([[NSGraphicsContext currentContext] graphicsPort], dirtyRect, finalImage);
        CFRelease(imageData);
        CGImageRelease(finalImage);
        CGContextRelease(drawContext);
    }