From 757d00c3c84581469312233e758cac115cc78b98 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 12 Sep 2011 16:24:08 +0000 Subject: [PATCH] From Ulrich Hertlein, Added some error checks and memory cleanup. --- src/osgViewer/DarwinUtils.mm | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/osgViewer/DarwinUtils.mm b/src/osgViewer/DarwinUtils.mm index fd5d8cb63..9a6f99c5e 100644 --- a/src/osgViewer/DarwinUtils.mm +++ b/src/osgViewer/DarwinUtils.mm @@ -56,15 +56,40 @@ size_t displayBitsPerPixel( CGDirectDisplayID displayId ) return CGDisplayBitsPerPixel(displayId); #else CGDisplayModeRef mode = CGDisplayCopyDisplayMode(displayId); - size_t depth = 0; + if (!mode) + { + OSG_WARN << "CGDisplayCopyDisplayMode returned NULL" << std::endl; + return 0; + } CFStringRef pixEnc = CGDisplayModeCopyPixelEncoding(mode); - if(CFStringCompare(pixEnc, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + if (!pixEnc) + { + OSG_WARN << "CGDisplayModeCopyPixelEncoding returned NULL" << std::endl; + CGDisplayModeRelease(mode); + return 0; + } + + size_t depth = 0; + if (CFStringCompare(pixEnc, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { depth = 32; - else if(CFStringCompare(pixEnc, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + } + else if (CFStringCompare(pixEnc, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { depth = 16; - else if(CFStringCompare(pixEnc, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + } + else if (CFStringCompare(pixEnc, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { depth = 8; + } + else + { + OSG_WARN << "Unable to match pixel encoding '" << CFStringGetCStringPtr(pixEnc, kCFStringEncodingUTF8) << "'" << std::endl; + } + + CGDisplayModeRelease(mode); + CFRelease(pixEnc); return depth; #endif