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
|
#include "main.h"
#include "api.h"
#include <multimon.h>
#undef GetSystemMetrics
void getViewport(RECT *r, HWND wnd, int full, RECT *sr)
{
POINT *p = NULL;
if (p || sr || wnd)
{
static int initted = 0;
static HMONITOR (WINAPI *Mfp)(POINT pt, DWORD dwFlags);
static HMONITOR (WINAPI *Mfr)(LPCRECT lpcr, DWORD dwFlags);
static HMONITOR (WINAPI *Mfw)(HWND wnd, DWORD dwFlags);
static BOOL (WINAPI *Gmi)(HMONITOR mon, LPMONITORINFOEX lpmi);
if (!initted)
{
HINSTANCE h = LoadLibraryW(L"user32.dll");
if (h)
{
Mfp = (HMONITOR (WINAPI *)(POINT, DWORD)) GetProcAddress(h, "MonitorFromPoint");
Mfr = (HMONITOR (WINAPI *)(LPCRECT, DWORD)) GetProcAddress(h, "MonitorFromRect");
Mfw = (HMONITOR (WINAPI *)(HWND, DWORD)) GetProcAddress(h, "MonitorFromWindow");
Gmi = (BOOL (WINAPI *)(HMONITOR, LPMONITORINFOEX)) GetProcAddress(h, "GetMonitorInfoW");
}
initted = 1;
}
if (Mfp && Mfr && Mfw && Gmi)
{
HMONITOR hm = NULL;
if (sr)
hm = Mfr(sr, MONITOR_DEFAULTTONEAREST);
else if (wnd)
hm = Mfw(wnd, MONITOR_DEFAULTTONEAREST);
else if (p)
hm = Mfp(*p, MONITOR_DEFAULTTONEAREST);
if (hm)
{
MONITORINFOEXW mi;
memset(&mi, 0, sizeof(mi));
mi.cbSize = sizeof(mi);
if (Gmi(hm, &mi))
{
if (!full)
*r = mi.rcWork;
else
*r = mi.rcMonitor;
return ;
}
}
}
}
if (full)
{ // this might be borked =)
r->top = r->left = 0;
r->right = GetSystemMetrics(SM_CXSCREEN);
r->bottom = GetSystemMetrics(SM_CYSCREEN);
}
else
{
SystemParametersInfoW(SPI_GETWORKAREA, 0, r, 0);
}
}
VideoConfig::VideoConfig() : group(0),
itemYV12(0), itemOverlay(0), itemVsync(0), itemDDraw(0)
{}
bool VideoConfig::yv12()
{
GetGroup();
if (!itemYV12)
return false;
return itemYV12->GetBool();
}
bool VideoConfig::overlays()
{
GetGroup();
if (!itemOverlay)
return true; // overlay by default
return itemOverlay->GetBool();
}
bool VideoConfig::vsync()
{
GetGroup();
if (!itemVsync)
return false; // no vsync by default
return itemVsync->GetBool();
}
bool VideoConfig::ddraw()
{
GetGroup();
if (!itemDDraw)
return true;
return itemDDraw->GetBool();
}
void VideoConfig::GetGroup()
{
if (group)
return ;
// {2135E318-6919-4bcf-99D2-62BE3FCA8FA6}
static const GUID videoConfigGroupGUID =
{ 0x2135e318, 0x6919, 0x4bcf, { 0x99, 0xd2, 0x62, 0xbe, 0x3f, 0xca, 0x8f, 0xa6 } };
group = AGAVE_API_CONFIG->GetGroup(videoConfigGroupGUID);
if (group)
{
itemYV12 = group->GetItem(L"YV12");
itemOverlay = group->GetItem(L"overlay");
itemVsync = group->GetItem(L"vsync");
itemDDraw = group->GetItem(L"ddraw");
}
}
VideoConfig config_video;
|