Beispiel #1
0
display_mode*
GlutGameMode::_FindMatchingMode()
{
	if (fWidth == -1 && fHeight == -1 && fPixelDepth == -1
		&& fRefreshRate == -1)
		// nothing to match!
		return NULL;

	if (!fModesList) {
		// Lazy retrieval of supported modes...
		BScreen screen;
		if (screen.GetModeList(&fModesList, &fModesCount) == B_OK) {
			// sort modes in decrease order (resolution, depth, frequency)
			qsort(fModesList, fModesCount, sizeof(display_mode), _CompareModes);
		} else {
			// bad luck, no modes can be retrieved!
			fModesList = NULL;
			fModesCount = 0;
		}
	}

	if (!fModesList)
		return NULL;

	float bestRefreshDiff = 999999;
	int bestMode = -1;
	for (uint32 i =0; i < fModesCount; i++) {

		printf("[%" B_PRId32 "]: %d x %d, %d Bpp, %d Hz\n", i,
			fModesList[i].virtual_width, fModesList[i].virtual_height,
			_GetModePixelDepth(&fModesList[i]),
			_GetModeRefreshRate(&fModesList[i]));

		if (fWidth > 0 && fModesList[i].virtual_width != fWidth)
			continue;

		if (fHeight > 0 && fModesList[i].virtual_height != fHeight)
			continue;

		if (fPixelDepth > 0
			&& _GetModePixelDepth(&fModesList[i]) != fPixelDepth)
			continue;

		float refreshDiff = fabs(_GetModeRefreshRate(&fModesList[i])
			- fRefreshRate);
		if (fRefreshRate > 0 && (refreshDiff > 0.006 * fRefreshRate)) {
			// not exactly the same, but maybe the best similar mode so far?
			if (refreshDiff < bestRefreshDiff) {
				bestRefreshDiff = refreshDiff;
				bestMode = i;
			}
			continue;
		}

		// Hey, this one match everything!
		return &fModesList[i];
	}

	if (bestMode == -1)
		return NULL;

	return &fModesList[bestMode];
}