
#include <Spectre/Display/DisplayMode.h>
#include <Platform/PlatformMisc.h>
#include <algorithm>

struct DisplayModeCmp
{
	inline bool operator() (const DisplayMode& a, const DisplayMode& b) 
	{
		if (a.bpp == b.bpp) {
			if (a.width == b.width) {
				return a.height > b.height;
			}
			return a.width > b.width;
		}
		return a.bpp > b.bpp;
	}
};

DisplayMode::DisplayMode() :
width	(0),
height	(0),
bpp	(32)
{
}

DisplayMode::DisplayMode(unsigned int width, unsigned int height, unsigned int bpp) :
width	(width),
height	(height),
bpp	(bpp)
{
}

std::vector<DisplayMode> DisplayMode::getFullscreenModes()
{
	static std::vector<DisplayMode> modes;

	if (modes.size() < 1) {

		PlatformMisc::GetDisplayModes(modes);

		// Sort.
		std::sort(modes.begin(), modes.end(), DisplayModeCmp());

		// remove duplicates
		modes.erase(std::unique(modes.begin(), modes.end()), modes.end());
	}
	return modes;
}

DisplayMode DisplayMode::getDesktopMode()
{
	return PlatformMisc::GetDesktopMode();
}