1 #include <xf86drm.h>
2 #include <stdexcept>
4 #include "modedb.h"
5 #include "videomode.h"
7 using namespace std;
9 namespace kms
10 {
12 static const Videomode& find_from_table(const Videomode* modes, uint32_t width, uint32_t height, uint32_t refresh, bool ilace)
13 {
14 for (unsigned i = 0; modes[i].clock; ++i) {
15 const Videomode& m = modes[i];
17 if (m.hdisplay != width || m.vdisplay != height)
18 continue;
20 if (refresh && m.vrefresh != refresh)
21 continue;
23 if (ilace != !!(m.flags & DRM_MODE_FLAG_INTERLACE))
24 continue;
26 return m;
27 }
29 throw invalid_argument("mode not found");
30 }
32 const Videomode& find_dmt(uint32_t width, uint32_t height, uint32_t refresh, bool ilace)
33 {
34 return find_from_table(dmt_modes, width, height, refresh, ilace);
35 }
37 const Videomode& find_cea(uint32_t width, uint32_t height, uint32_t refresh, bool ilace)
38 {
39 return find_from_table(cea_modes, width, height, refresh, ilace);
40 }
42 }