fixed image rendering and memory leak in waitKey (thanks to Bart Nabbe and Steve Bushell)

pull/13383/head
Vadim Pisarevsky 15 years ago
parent e1c2e72ed6
commit 7d006e368e
  1. 33
      modules/highgui/src/window_cocoa.mm

@ -491,8 +491,8 @@ CV_IMPL int cvWaitKey (int maxWait)
{ {
//cout << "cvWaitKey" << endl; //cout << "cvWaitKey" << endl;
int returnCode = -1; int returnCode = -1;
double start = [[NSDate date] timeIntervalSince1970];
NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init];
double start = [[NSDate date] timeIntervalSince1970];
while(true) { while(true) {
if(([[NSDate date] timeIntervalSince1970] - start) * 1000 >= maxWait && maxWait>0) if(([[NSDate date] timeIntervalSince1970] - start) * 1000 >= maxWait && maxWait>0)
@ -686,7 +686,7 @@ CV_IMPL int cvWaitKey (int maxWait)
cvimage = cvCreateMat(arrMat->rows, arrMat->cols, CV_8UC3); cvimage = cvCreateMat(arrMat->rows, arrMat->cols, CV_8UC3);
cvConvertImage(arrMat, cvimage, CV_CVTIMG_SWAP_RB); cvConvertImage(arrMat, cvimage, CV_CVTIMG_SWAP_RB);
CGColorSpaceRef colorspace = NULL; /*CGColorSpaceRef colorspace = NULL;
CGDataProviderRef provider = NULL; CGDataProviderRef provider = NULL;
int width = cvimage->width; int width = cvimage->width;
int height = cvimage->height; int height = cvimage->height;
@ -703,15 +703,40 @@ CV_IMPL int cvWaitKey (int maxWait)
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:imageRef]; NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:imageRef];
if(image) { if(image) {
[image release]; [image release];
}*/
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:cvimage->width
pixelsHigh:cvimage->height
bitsPerSample:8
samplesPerPixel:3
hasAlpha:NO
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:(cvimage->width * 4)
bitsPerPixel:32];
int pixelCount = cvimage->width * cvimage->height;
unsigned char *src = cvimage->data.ptr;
unsigned char *dst = [bitmap bitmapData];
for( int i = 0; i < pixelCount; i++ )
{
dst[i * 4 + 0] = src[i * 3 + 0];
dst[i * 4 + 1] = src[i * 3 + 1];
dst[i * 4 + 2] = src[i * 3 + 2];
} }
if( image )
[image release];
image = [[NSImage alloc] init]; image = [[NSImage alloc] init];
[image addRepresentation:bitmap]; [image addRepresentation:bitmap];
[bitmap release]; [bitmap release];
CGColorSpaceRelease(colorspace); /*CGColorSpaceRelease(colorspace);
CGDataProviderRelease(provider); CGDataProviderRelease(provider);
CGImageRelease(imageRef); CGImageRelease(imageRef);*/
cvReleaseMat(&cvimage); cvReleaseMat(&cvimage);
[localpool drain]; [localpool drain];

Loading…
Cancel
Save