Filter out invalid resolutions

FossilOrigin-Name: 11acc939c48a80c696dca18a61b7a4501ab45ba9775ed002e17b708756298cfb
This commit is contained in:
Jonathan Schleifer 2022-12-25 16:46:39 +00:00
parent 3902165c96
commit ccef3f6323

View file

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