aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/irrlicht-1.8/source/Irrlicht/CVideoModeList.cpp
blob: 268aaf3c4c287cccef82d15d547d66f6ffa7cc35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h

#include "CVideoModeList.h"
#include "irrMath.h"

namespace irr
{
namespace video
{

//! constructor
CVideoModeList::CVideoModeList()
{
	#ifdef _DEBUG
	setDebugName("CVideoModeList");
	#endif

	Desktop.depth = 0;
	Desktop.size = core::dimension2d<u32>(0,0);
}


void CVideoModeList::setDesktop(s32 desktopDepth, const core::dimension2d<u32>& desktopSize)
{
	Desktop.depth = desktopDepth;
	Desktop.size = desktopSize;
}


//! Gets amount of video modes in the list.
s32 CVideoModeList::getVideoModeCount() const
{
	return (s32)VideoModes.size();
}


//! Returns the screen size of a video mode in pixels.
core::dimension2d<u32> CVideoModeList::getVideoModeResolution(s32 modeNumber) const
{
	if (modeNumber < 0 || modeNumber > (s32)VideoModes.size())
		return core::dimension2d<u32>(0,0);

	return VideoModes[modeNumber].size;
}


core::dimension2d<u32> CVideoModeList::getVideoModeResolution(
		const core::dimension2d<u32>& minSize,
		const core::dimension2d<u32>& maxSize) const
{
	u32 best=VideoModes.size();
	// if only one or no mode
	if (best<2)
		return getVideoModeResolution(0);

	u32 i;
	for (i=0; i<VideoModes.size(); ++i)
	{
		if (VideoModes[i].size.Width>=minSize.Width &&
			VideoModes[i].size.Height>=minSize.Height &&
			VideoModes[i].size.Width<=maxSize.Width &&
			VideoModes[i].size.Height<=maxSize.Height)
			best=i;
	}
	// we take the last one found, the largest one fitting
	if (best<VideoModes.size())
		return VideoModes[best].size;
	const u32 minArea = minSize.getArea();
	const u32 maxArea = maxSize.getArea();
	u32 minDist = 0xffffffff;
	best=0;
	for (i=0; i<VideoModes.size(); ++i)
	{
		const u32 area = VideoModes[i].size.getArea();
		const u32 dist = core::min_(abs(int(minArea-area)), abs(int(maxArea-area)));
		if (dist<minDist)
		{
			minDist=dist;
			best=i;
		}
	}
	return VideoModes[best].size;
}


//! Returns the pixel depth of a video mode in bits.
s32 CVideoModeList::getVideoModeDepth(s32 modeNumber) const
{
	if (modeNumber < 0 || modeNumber > (s32)VideoModes.size())
		return 0;

	return VideoModes[modeNumber].depth;
}


//! Returns current desktop screen resolution.
const core::dimension2d<u32>& CVideoModeList::getDesktopResolution() const
{
	return Desktop.size;
}


//! Returns the pixel depth of a video mode in bits.
s32 CVideoModeList::getDesktopDepth() const
{
	return Desktop.depth;
}


//! adds a new mode to the list
void CVideoModeList::addMode(const core::dimension2d<u32>& size, s32 depth)
{
	SVideoMode m;
	m.depth = depth;
	m.size = size;

	for (u32 i=0; i<VideoModes.size(); ++i)
	{
		if (VideoModes[i] == m)
			return;
	}

	VideoModes.push_back(m);
	VideoModes.sort(); // TODO: could be replaced by inserting into right place
}


} // end namespace video
} // end namespace irr