PageRenderTime 56ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/OGLAClient/src/VideoTab.cpp

https://bitbucket.org/face/ovp
C++ | 237 lines | 177 code | 9 blank | 51 comment | 30 complexity | c8c42741a7a8c32430316c7fa67881a7 MD5 | raw file
Possible License(s): GPL-2.0
  1. //############################################################################//
  2. // Class VideoTab (implementation)
  3. // Manages the user selections in the "Video" tab of the Orbiter
  4. // Launchpad dialog.
  5. // Made in 2007-2010 by Artlav
  6. // Based on Martins 2008 code
  7. //############################################################################//
  8. #include "VideoTab.h"
  9. #include "OGLAClient.h"
  10. #include "../rsrc\resource.h"
  11. #include "resource_video.h"
  12. #include <stdio.h>
  13. #include "../src_common/alibc/frbt.h"
  14. //############################################################################//
  15. using namespace oapi;
  16. //############################################################################//
  17. VideoTab::VideoTab(OGLAClient *gc,HINSTANCE _hInst,HINSTANCE _hOrbiterInst,HWND hVideoTab)
  18. {
  19. gclient =gc;
  20. hInst =_hInst;
  21. hOrbiterInst=_hOrbiterInst;
  22. hTab =hVideoTab;
  23. }
  24. //############################################################################//
  25. BOOL VideoTab::WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  26. {
  27. switch(uMsg){
  28. case WM_INITDIALOG:return TRUE;
  29. case WM_COMMAND:
  30. switch(LOWORD(wParam)){
  31. case IDC_VID_MODE:
  32. if(HIWORD(wParam)==CBN_SELCHANGE){
  33. DWORD idx;
  34. idx=SendDlgItemMessage(hWnd,IDC_VID_MODE,CB_GETCURSEL,0,0);
  35. SelectMode(idx);
  36. return TRUE;
  37. }
  38. break;
  39. case IDC_VID_FULL: if(HIWORD(wParam)==BN_CLICKED){SelectDispmode(FALSE);return TRUE;}break;
  40. case IDC_VID_WINDOW:if(HIWORD(wParam)==BN_CLICKED){SelectDispmode(TRUE);return TRUE;}break;
  41. case IDC_VID_WIDTH: if(HIWORD(wParam)==EN_CHANGE) {SelectWidth();return TRUE;}break;
  42. case IDC_VID_HEIGHT:if(HIWORD(wParam)==EN_CHANGE) {SelectHeight();return TRUE;}break;
  43. case IDC_VID_ASPECT:if(HIWORD(wParam)==BN_CLICKED){SelectFixedAspect();SelectWidth();return TRUE;} break;
  44. case IDC_VID_4X3:
  45. case IDC_VID_16X10:
  46. case IDC_VID_16X9: if(HIWORD(wParam)==BN_CLICKED){aspect_idx=LOWORD(wParam)-IDC_VID_4X3;SelectWidth();return TRUE;}break;
  47. case IDC_VID_INFO: DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),hTab,AboutDlgProc);return TRUE;}
  48. break;
  49. }
  50. return FALSE;
  51. }
  52. //############################################################################//
  53. //############################################################################//
  54. void VideoTab::Initialise()
  55. {
  56. char cbuf[255];
  57. DEVMODE dm;
  58. int i,n,x,y;
  59. GraphicsClient::VIDEODATA *data=gclient->GetVideoData();
  60. //Relocation
  61. DestroyWindow(GetDlgItem(hTab,IDC_VID_DEVICE));
  62. DestroyWindow(GetDlgItem(hTab,IDC_VID_ENUM));
  63. DestroyWindow(GetDlgItem(hTab,IDC_VID_STENCIL));
  64. DestroyWindow(GetDlgItem(hTab,IDC_VID_STENCIL+98));
  65. DestroyWindow(GetDlgItem(hTab,IDC_VID_PAGEFLIP));
  66. /*
  67. RECT wrc,prc,rc;
  68. GetWindowRect(hTab,&wrc);
  69. for(i=0;i<2;i++){
  70. GetWindowRect(GetDlgItem(hTab,IDC_VID_STENCIL+99+i),&prc);GetClientRect(GetDlgItem(hTab,IDC_VID_STENCIL+99+i),&rc);
  71. MoveWindow(GetDlgItem(hTab,IDC_VID_STENCIL+99+i),prc.left-wrc.left-2,prc.top-wrc.top-2-98,rc.right,rc.bottom,false);
  72. }
  73. for(i=0;i<2;i++){
  74. GetWindowRect(GetDlgItem(hTab,IDC_VID_FULL+i),&prc);GetClientRect(GetDlgItem(hTab,IDC_VID_FULL+i),&rc);
  75. MoveWindow(GetDlgItem(hTab,IDC_VID_FULL+i),prc.left-wrc.left-2,prc.top-wrc.top-2-98,rc.right,rc.bottom,false);
  76. }
  77. for(i=0;i<5;i++){
  78. GetWindowRect(GetDlgItem(hTab,IDC_VID_STATIC5+i),&prc);GetClientRect(GetDlgItem(hTab,IDC_VID_STATIC5+i),&rc);
  79. MoveWindow(GetDlgItem(hTab,IDC_VID_STATIC5+i),prc.left-wrc.left-2,prc.top-wrc.top-2-98,rc.right,rc.bottom,false);
  80. }
  81. for(i=0;i<9;i++){
  82. GetWindowRect(GetDlgItem(hTab,IDC_VID_STATIC7+i),&prc);GetClientRect(GetDlgItem(hTab,IDC_VID_STATIC7+i),&rc);
  83. MoveWindow(GetDlgItem(hTab,IDC_VID_STATIC7+i),prc.left-wrc.left-2,prc.top-wrc.top-2-98,rc.right,rc.bottom,false);
  84. }
  85. */
  86. ShowWindow(GetDlgItem(hTab,IDC_VID_INFO),SW_SHOW);
  87. //Windowed
  88. //data->winw=800;
  89. //data->winh=600;
  90. SetWindowText(GetDlgItem(hTab,IDC_VID_WIDTH) ,_itoa(data->winw,cbuf,10));
  91. SetWindowText(GetDlgItem(hTab,IDC_VID_HEIGHT),_itoa(data->winh,cbuf,10));
  92. SendDlgItemMessage(hTab,IDC_VID_ASPECT,BM_SETCHECK,data->winw==(4*data->winh)/3 || data->winh == (3*data->winw)/4 ? BST_CHECKED:BST_UNCHECKED, 0);
  93. //Fullscreen
  94. //data->novsync=true;
  95. //data->fullscreen=false;
  96. SendDlgItemMessage(hTab,IDC_VID_VSYNC, BM_SETCHECK,data->novsync?BST_CHECKED:BST_UNCHECKED,0);
  97. SendDlgItemMessage(hTab,IDC_VID_MODE,CB_RESETCONTENT,0,0);
  98. SendDlgItemMessage(hTab,IDC_VID_BPP ,CB_RESETCONTENT,0,0);
  99. n=0;i=0;x=-1;y=-1;
  100. while(EnumDisplaySettings(0,i,&dm)){
  101. if(dm.dmBitsPerPel==32)if((x!=dm.dmPelsWidth)||(y!=dm.dmPelsHeight)){
  102. x=dm.dmPelsWidth;y=dm.dmPelsHeight;
  103. sprintf(cbuf,"%d x %d",x,y);
  104. SendDlgItemMessage(hTab,IDC_VID_MODE,CB_ADDSTRING,0,(LPARAM)cbuf);
  105. SendDlgItemMessage(hTab,IDC_VID_MODE,CB_SETITEMDATA,n,(LPARAM)(y<<16 | x));
  106. n++;
  107. }
  108. i++;
  109. }
  110. if(data->modeidx>=n)SendDlgItemMessage(hTab,IDC_VID_MODE,CB_SETCURSEL,0,0);
  111. else SendDlgItemMessage(hTab,IDC_VID_MODE,CB_SETCURSEL,data->modeidx,0);
  112. //BPP
  113. SendDlgItemMessage(hTab,IDC_VID_BPP,CB_ADDSTRING ,0,(LPARAM)"16");
  114. SendDlgItemMessage(hTab,IDC_VID_BPP,CB_SETITEMDATA,0,(LPARAM)(16));
  115. SendDlgItemMessage(hTab,IDC_VID_BPP,CB_ADDSTRING ,1,(LPARAM)"24");
  116. SendDlgItemMessage(hTab,IDC_VID_BPP,CB_SETITEMDATA,1,(LPARAM)(24));
  117. SendDlgItemMessage(hTab,IDC_VID_BPP,CB_ADDSTRING ,2,(LPARAM)"32");
  118. SendDlgItemMessage(hTab,IDC_VID_BPP,CB_SETITEMDATA,2,(LPARAM)(32));
  119. SendDlgItemMessage(hTab,IDC_VID_BPP,CB_SETCURSEL ,2,0);
  120. if(data->winw==( 4*data->winh)/3 || data->winh==(3 *data->winw)/4 )aspect_idx=1;
  121. else if(data->winw==(16*data->winh)/10 || data->winh==(10*data->winw)/16)aspect_idx=2;
  122. else if(data->winw==(16*data->winh)/9 || data->winh==(9 *data->winw)/16)aspect_idx=3;
  123. else aspect_idx=0;
  124. SendDlgItemMessage(hTab,IDC_VID_ASPECT,BM_SETCHECK,aspect_idx?BST_CHECKED:BST_UNCHECKED,0);
  125. if(aspect_idx)aspect_idx--;
  126. SendDlgItemMessage(hTab,IDC_VID_4X3+aspect_idx,BM_SETCHECK,BST_CHECKED,0);
  127. //Etc
  128. if(data->fullscreen)SendDlgItemMessage(hTab,IDC_VID_FULL,BM_CLICK,0,0);
  129. if(!data->fullscreen)SendDlgItemMessage(hTab,IDC_VID_WINDOW,BM_CLICK,0,0);
  130. SelectDispmode(!data->fullscreen);
  131. if(oglacfg_button_a)SetButtonbeta(0,"OGLAClient features\n Configuration",DWORD(oglacfg_button_a),0,hTab);
  132. }
  133. //############################################################################//
  134. void VideoTab::SelectDispmode(BOOL bWindow)
  135. {
  136. DWORD i;
  137. for(i=0;i<5;i++)EnableWindow(GetDlgItem(hTab,IDC_VID_STATIC5+i),!bWindow);
  138. for(i=0;i<9;i++)EnableWindow(GetDlgItem(hTab,IDC_VID_STATIC7+i), bWindow);
  139. }
  140. //############################################################################//
  141. void VideoTab::SelectMode(DWORD idx)
  142. {
  143. DWORD data,w,h;
  144. data=SendDlgItemMessage(hTab,IDC_VID_MODE,CB_GETITEMDATA,idx,0);
  145. w=data & 0xFFFF;
  146. h=data>>16;
  147. gclient->bFullscreen=true;
  148. gclient->viewW=w;
  149. gclient->viewH=h;
  150. }
  151. //############################################################################//
  152. static int aspect_wfac[4]={4,16,16};
  153. static int aspect_hfac[4]={3,10,9};
  154. void VideoTab::SelectWidth()
  155. {
  156. if(SendDlgItemMessage(hTab,IDC_VID_ASPECT,BM_GETCHECK,0,0)==BST_CHECKED){
  157. char cbuf[128];
  158. int w,h,wfac=aspect_wfac[aspect_idx],hfac=aspect_hfac[aspect_idx];
  159. GetWindowText(GetDlgItem(hTab,IDC_VID_WIDTH), cbuf,127);w=atoi(cbuf);
  160. GetWindowText(GetDlgItem(hTab,IDC_VID_HEIGHT),cbuf,127);h=atoi(cbuf);
  161. if(w!=(wfac*h)/hfac){
  162. h=(hfac*w)/wfac;
  163. SetWindowText(GetDlgItem(hTab,IDC_VID_HEIGHT),_itoa(h,cbuf,10));
  164. }
  165. }
  166. }
  167. //############################################################################//
  168. void VideoTab::SelectHeight()
  169. {
  170. if(SendDlgItemMessage(hTab,IDC_VID_ASPECT,BM_GETCHECK,0,0)==BST_CHECKED){
  171. char cbuf[128];
  172. int w,h,wfac=aspect_wfac[aspect_idx],hfac=aspect_hfac[aspect_idx];
  173. GetWindowText(GetDlgItem(hTab,IDC_VID_WIDTH), cbuf,127);w=atoi(cbuf);
  174. GetWindowText(GetDlgItem(hTab,IDC_VID_HEIGHT),cbuf,127);h=atoi(cbuf);
  175. if(h!=(hfac*w)/wfac){
  176. w=(wfac*h)/hfac;
  177. SetWindowText(GetDlgItem(hTab,IDC_VID_WIDTH),_itoa(w,cbuf,10));
  178. }
  179. }
  180. }
  181. //############################################################################//
  182. void VideoTab::SelectFixedAspect()
  183. {
  184. bool fixed_aspect=(SendDlgItemMessage(hTab,IDC_VID_ASPECT,BM_GETCHECK,0,0)==BST_CHECKED);
  185. for(int i=0;i<3;i++)EnableWindow(GetDlgItem(hTab,IDC_VID_4X3+i),fixed_aspect?TRUE:FALSE);
  186. }
  187. //############################################################################//
  188. //############################################################################//
  189. void VideoTab::UpdateConfigData()
  190. {
  191. char cbuf[128];
  192. DWORD i,dat,bpp;
  193. GraphicsClient::VIDEODATA *data=gclient->GetVideoData();
  194. data->deviceidx=0;
  195. data->modeidx=SendDlgItemMessage(hTab,IDC_VID_MODE,CB_GETCURSEL,0,0);
  196. data->fullscreen=(SendDlgItemMessage(hTab,IDC_VID_FULL, BM_GETCHECK,0,0)==BST_CHECKED);
  197. data->novsync =(SendDlgItemMessage(hTab,IDC_VID_VSYNC, BM_GETCHECK,0,0)==BST_CHECKED);
  198. data->trystencil=(SendDlgItemMessage(hTab,IDC_VID_STENCIL,BM_GETCHECK,0,0)==BST_CHECKED);
  199. data->forceenum =(SendDlgItemMessage(hTab,IDC_VID_ENUM, BM_GETCHECK,0,0)==BST_CHECKED);
  200. if(!data->fullscreen){
  201. GetWindowText(GetDlgItem(hTab,IDC_VID_WIDTH), cbuf,127);data->winw=atoi(cbuf);
  202. GetWindowText(GetDlgItem(hTab,IDC_VID_HEIGHT),cbuf,127);data->winh=atoi(cbuf);
  203. }else{
  204. i =SendDlgItemMessage(hTab,IDC_VID_BPP, CB_GETCURSEL, 0,0);
  205. bpp=SendDlgItemMessage(hTab,IDC_VID_BPP, CB_GETITEMDATA,i,0);
  206. dat=SendDlgItemMessage(hTab,IDC_VID_MODE,CB_GETITEMDATA,data->modeidx,0);
  207. data->winw=dat&0xFFFF;
  208. data->winh=dat>>16;
  209. }
  210. }
  211. //############################################################################//
  212. //############################################################################//
  213. BOOL CALLBACK VideoTab::AboutDlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  214. {
  215. switch(uMsg){
  216. case WM_INITDIALOG:
  217. char cbuf[1024];
  218. LoadString((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),IDS_STRING1,cbuf,1024);
  219. SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),cbuf);
  220. return TRUE;
  221. case WM_COMMAND:switch(LOWORD(wParam)){
  222. case IDOK:
  223. case IDCANCEL:EndDialog(hWnd,0);break;
  224. }
  225. }
  226. return FALSE;
  227. }
  228. //############################################################################//