diff --git a/src/O3DGlide3Renderer.m b/src/O3DGlide3Renderer.m index 3e000a5..e23d3e6 100644 --- a/src/O3DGlide3Renderer.m +++ b/src/O3DGlide3Renderer.m @@ -108,15 +108,14 @@ refreshEnumToFloat(GrScreenRefresh_t refresh) self = [super init]; @try { - long long deviceIndex = [[options objectForKey: - O3DRendererDeviceIndex] longLongValue]; - FxI32 numDevices; - grGlideInit(); + FxI32 numDevices; if (!grGet(GR_NUM_BOARDS, sizeof(numDevices), &numDevices)) @throw [OFInitializationFailedException exception]; + long long deviceIndex = [[options objectForKey: + O3DRendererDeviceIndex] longLongValue]; if (deviceIndex > numDevices) @throw [OFInvalidArgumentException exception]; @@ -140,7 +139,6 @@ refreshEnumToFloat(GrScreenRefresh_t refresh) availableResolutions { OFMutableSet *ret = [OFMutableSet set]; - GrResolution *resolutions; GrResolution query = { .resolution = GR_QUERY_ANY, .refresh = GR_QUERY_ANY, @@ -149,23 +147,30 @@ refreshEnumToFloat(GrScreenRefresh_t refresh) }; size_t size = grQueryResolutions(&query, NULL); - resolutions = OFAllocMemory(1, size); + GrResolution *resolutions = OFAllocMemory(1, size); @try { - void *pool; size = grQueryResolutions(&query, resolutions); - pool = objc_autoreleasePoolPush(); - + void *pool = objc_autoreleasePoolPush(); for (size_t i = 0; i < size / sizeof(*resolutions); i++) { - OFValue *resolution = [OFValue valueWithSize: - resolutionToSize(resolutions[i].resolution)]; - OFNumber *refresh = [OFNumber numberWithFloat: - refreshEnumToFloat(resolutions[i].refresh)]; + OFSize resolutionSize = + resolutionToSize(resolutions[i].resolution); + float refreshFloat = + refreshEnumToFloat(resolutions[i].refresh); + if (resolutionSize.width == 0 || + resolutionSize.height == 0) + continue; + if (refreshFloat == 0) + continue; + + OFValue *resolution = + [OFValue valueWithSize: resolutionSize]; + OFNumber *refresh = + [OFNumber numberWithFloat: refreshFloat]; [ret addObject: [OFPair pairWithFirstObject: resolution secondObject: refresh]]; } - objc_autoreleasePoolPop(pool); } @finally { OFFreeMemory(resolutions);