comparison libvo/vo_directx.c @ 29263:0f1b5b68af32

whitespace cosmetics: Remove all trailing whitespace.
author diego
date Wed, 13 May 2009 02:58:57 +0000
parents eda346733b8c
children a33cf9c69731
comparison
equal deleted inserted replaced
29262:7d545a6b8aff 29263:0f1b5b68af32
68 static HBRUSH colorbrush = NULL; // Handle to colorkey brush 68 static HBRUSH colorbrush = NULL; // Handle to colorkey brush
69 static HBRUSH blackbrush = NULL; // Handle to black brush 69 static HBRUSH blackbrush = NULL; // Handle to black brush
70 static HICON mplayericon = NULL; // Handle to mplayer icon 70 static HICON mplayericon = NULL; // Handle to mplayer icon
71 static HCURSOR mplayercursor = NULL; // Handle to mplayer cursor 71 static HCURSOR mplayercursor = NULL; // Handle to mplayer cursor
72 static uint32_t image_width, image_height; //image width and height 72 static uint32_t image_width, image_height; //image width and height
73 static uint32_t d_image_width, d_image_height; //image width and height zoomed 73 static uint32_t d_image_width, d_image_height; //image width and height zoomed
74 static uint8_t *image=NULL; //image data 74 static uint8_t *image=NULL; //image data
75 static void* tmp_image = NULL; 75 static void* tmp_image = NULL;
76 static uint32_t image_format=0; //image format 76 static uint32_t image_format=0; //image format
77 static uint32_t primary_image_format; 77 static uint32_t primary_image_format;
78 static uint32_t vm_height=0; 78 static uint32_t vm_height=0;
83 static DWORD destcolorkey; //colorkey for our surface 83 static DWORD destcolorkey; //colorkey for our surface
84 static COLORREF windowcolor = RGB(0,0,16); //windowcolor == colorkey 84 static COLORREF windowcolor = RGB(0,0,16); //windowcolor == colorkey
85 static int adapter_count=0; 85 static int adapter_count=0;
86 static GUID selected_guid; 86 static GUID selected_guid;
87 static GUID *selected_guid_ptr = NULL; 87 static GUID *selected_guid_ptr = NULL;
88 static RECT monitor_rect; //monitor coordinates 88 static RECT monitor_rect; //monitor coordinates
89 static float window_aspect; 89 static float window_aspect;
90 static BOOL (WINAPI* myGetMonitorInfo)(HMONITOR, LPMONITORINFO) = NULL; 90 static BOOL (WINAPI* myGetMonitorInfo)(HMONITOR, LPMONITORINFO) = NULL;
91 static RECT last_rect = {0xDEADC0DE, 0xDEADC0DE, 0xDEADC0DE, 0xDEADC0DE}; 91 static RECT last_rect = {0xDEADC0DE, 0xDEADC0DE, 0xDEADC0DE, 0xDEADC0DE};
92 92
93 extern int vidmode; 93 extern int vidmode;
103 }; 103 };
104 104
105 const GUID IID_IDirectDrawColorControl = 105 const GUID IID_IDirectDrawColorControl =
106 { 106 {
107 0x4b9f0ee0,0x0d7e,0x11d0,{0x9b,0x06,0x00,0xa0,0xc9,0x03,0xa3,0xb8} 107 0x4b9f0ee0,0x0d7e,0x11d0,{0x9b,0x06,0x00,0xa0,0xc9,0x03,0xa3,0xb8}
108 }; 108 };
109 109
110 110
111 typedef struct directx_fourcc_caps 111 typedef struct directx_fourcc_caps
112 { 112 {
113 char* img_format_name; //human readable name 113 char* img_format_name; //human readable name
116 DDPIXELFORMAT g_ddpfOverlay; //as Directx Sourface description 116 DDPIXELFORMAT g_ddpfOverlay; //as Directx Sourface description
117 } directx_fourcc_caps; 117 } directx_fourcc_caps;
118 118
119 119
120 static directx_fourcc_caps g_ddpf[] = 120 static directx_fourcc_caps g_ddpf[] =
121 { 121 {
122 {"YV12 ",IMGFMT_YV12 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','V','1','2'),0,0,0,0,0}}, 122 {"YV12 ",IMGFMT_YV12 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','V','1','2'),0,0,0,0,0}},
123 {"I420 ",IMGFMT_I420 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('I','4','2','0'),0,0,0,0,0}}, //yv12 with swapped uv 123 {"I420 ",IMGFMT_I420 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('I','4','2','0'),0,0,0,0,0}}, //yv12 with swapped uv
124 {"IYUV ",IMGFMT_IYUV ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('I','Y','U','V'),0,0,0,0,0}}, //same as i420 124 {"IYUV ",IMGFMT_IYUV ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('I','Y','U','V'),0,0,0,0,0}}, //same as i420
125 {"YVU9 ",IMGFMT_YVU9 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','V','U','9'),0,0,0,0,0}}, 125 {"YVU9 ",IMGFMT_YVU9 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','V','U','9'),0,0,0,0,0}},
126 {"YUY2 ",IMGFMT_YUY2 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','U','Y','2'),0,0,0,0,0}}, 126 {"YUY2 ",IMGFMT_YUY2 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','U','Y','2'),0,0,0,0,0}},
127 {"UYVY ",IMGFMT_UYVY ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('U','Y','V','Y'),0,0,0,0,0}}, 127 {"UYVY ",IMGFMT_UYVY ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('U','Y','V','Y'),0,0,0,0,0}},
128 {"BGR8 ",IMGFMT_BGR8 ,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 8, 0x00000000, 0x00000000, 0x00000000, 0}}, 128 {"BGR8 ",IMGFMT_BGR8 ,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 8, 0x00000000, 0x00000000, 0x00000000, 0}},
129 {"RGB15",IMGFMT_RGB15,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000001F, 0x000003E0, 0x00007C00, 0}}, //RGB 5:5:5 129 {"RGB15",IMGFMT_RGB15,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000001F, 0x000003E0, 0x00007C00, 0}}, //RGB 5:5:5
130 {"BGR15",IMGFMT_BGR15,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x00007C00, 0x000003E0, 0x0000001F, 0}}, 130 {"BGR15",IMGFMT_BGR15,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x00007C00, 0x000003E0, 0x0000001F, 0}},
131 {"RGB16",IMGFMT_RGB16,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000001F, 0x000007E0, 0x0000F800, 0}}, //RGB 5:6:5 131 {"RGB16",IMGFMT_RGB16,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000001F, 0x000007E0, 0x0000F800, 0}}, //RGB 5:6:5
132 {"BGR16",IMGFMT_BGR16,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000F800, 0x000007E0, 0x0000001F, 0}}, 132 {"BGR16",IMGFMT_BGR16,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000F800, 0x000007E0, 0x0000001F, 0}},
133 {"RGB24",IMGFMT_RGB24,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0}}, 133 {"RGB24",IMGFMT_RGB24,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0}},
134 {"BGR24",IMGFMT_BGR24,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 24, 0x00FF0000, 0x0000FF00, 0x000000FF, 0}}, 134 {"BGR24",IMGFMT_BGR24,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 24, 0x00FF0000, 0x0000FF00, 0x000000FF, 0}},
135 {"RGB32",IMGFMT_RGB32,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0}}, 135 {"RGB32",IMGFMT_RGB32,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0}},
136 {"BGR32",IMGFMT_BGR32,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0}} 136 {"BGR32",IMGFMT_BGR32,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0}}
137 }; 137 };
138 #define NUM_FORMATS (sizeof(g_ddpf) / sizeof(g_ddpf[0])) 138 #define NUM_FORMATS (sizeof(g_ddpf) / sizeof(g_ddpf[0]))
139 139
140 static const vo_info_t info = 140 static const vo_info_t info =
141 { 141 {
161 vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) image)+ dstride*y0 + 2*x0 ,dstride); 161 vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) image)+ dstride*y0 + 2*x0 ,dstride);
162 break; 162 break;
163 case IMGFMT_UYVY : 163 case IMGFMT_UYVY :
164 vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) image) + dstride*y0 + 2*x0 + 1,dstride); 164 vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) image) + dstride*y0 + 2*x0 + 1,dstride);
165 break; 165 break;
166 case IMGFMT_RGB15: 166 case IMGFMT_RGB15:
167 case IMGFMT_BGR15: 167 case IMGFMT_BGR15:
168 vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) image)+dstride*y0+2*x0,dstride); 168 vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) image)+dstride*y0+2*x0,dstride);
169 break; 169 break;
170 case IMGFMT_RGB16: 170 case IMGFMT_RGB16:
171 case IMGFMT_BGR16: 171 case IMGFMT_BGR16:
204 { 204 {
205 DDSURFACEDESC2 ddsd; 205 DDSURFACEDESC2 ddsd;
206 //cleanup 206 //cleanup
207 if(g_lpddsPrimary)g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary); 207 if(g_lpddsPrimary)g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary);
208 g_lpddsPrimary=NULL; 208 g_lpddsPrimary=NULL;
209 209
210 if(vidmode)g_lpdd->lpVtbl->SetDisplayMode(g_lpdd,vm_width,vm_height,vm_bpp,vo_refresh_rate,0); 210 if(vidmode)g_lpdd->lpVtbl->SetDisplayMode(g_lpdd,vm_width,vm_height,vm_bpp,vo_refresh_rate,0);
211 ZeroMemory(&ddsd, sizeof(ddsd)); 211 ZeroMemory(&ddsd, sizeof(ddsd));
212 ddsd.dwSize = sizeof(ddsd); 212 ddsd.dwSize = sizeof(ddsd);
213 //set flags and create a primary surface. 213 //set flags and create a primary surface.
214 ddsd.dwFlags = DDSD_CAPS; 214 ddsd.dwFlags = DDSD_CAPS;
245 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY; 245 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY;
246 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_BACKBUFFERCOUNT| DDSD_PIXELFORMAT; 246 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_BACKBUFFERCOUNT| DDSD_PIXELFORMAT;
247 ddsdOverlay.dwWidth=image_width; 247 ddsdOverlay.dwWidth=image_width;
248 ddsdOverlay.dwHeight=image_height; 248 ddsdOverlay.dwHeight=image_height;
249 ddsdOverlay.dwBackBufferCount=2; 249 ddsdOverlay.dwBackBufferCount=2;
250 ddsdOverlay.ddpfPixelFormat=g_ddpf[i].g_ddpfOverlay; 250 ddsdOverlay.ddpfPixelFormat=g_ddpf[i].g_ddpfOverlay;
251 if(vo_doublebuffering) //tribblebuffering 251 if(vo_doublebuffering) //tribblebuffering
252 { 252 {
253 if (g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsdOverlay, &g_lpddsOverlay, NULL)== DD_OK) 253 if (g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsdOverlay, &g_lpddsOverlay, NULL)== DD_OK)
254 { 254 {
255 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>overlay with format %s created\n",g_ddpf[i].img_format_name); 255 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>overlay with format %s created\n",g_ddpf[i].img_format_name);
256 //get the surface directly attached to the primary (the back buffer) 256 //get the surface directly attached to the primary (the back buffer)
257 ddsdOverlay.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; 257 ddsdOverlay.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
258 if(g_lpddsOverlay->lpVtbl->GetAttachedSurface(g_lpddsOverlay,&ddsdOverlay.ddsCaps, &g_lpddsBack) != DD_OK) 258 if(g_lpddsOverlay->lpVtbl->GetAttachedSurface(g_lpddsOverlay,&ddsdOverlay.ddsCaps, &g_lpddsBack) != DD_OK)
259 { 259 {
260 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't get attached surface\n"); 260 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't get attached surface\n");
261 return 1; 261 return 1;
262 } 262 }
263 return 0; 263 return 0;
264 } 264 }
265 vo_doublebuffering=0; //disable tribblebuffering 265 vo_doublebuffering=0; //disable tribblebuffering
266 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><WARN>cannot create tribblebuffer overlay with format %s\n",g_ddpf[i].img_format_name); 266 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><WARN>cannot create tribblebuffer overlay with format %s\n",g_ddpf[i].img_format_name);
267 } 267 }
268 //single buffer 268 //single buffer
269 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>using singlebuffer overlay\n"); 269 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>using singlebuffer overlay\n");
270 ddsdOverlay.dwBackBufferCount=0; 270 ddsdOverlay.dwBackBufferCount=0;
271 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY; 271 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY;
272 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT; 272 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT;
296 case DDERR_NOOVERLAYHW: 296 case DDERR_NOOVERLAYHW:
297 {mp_msg(MSGT_VO, MSGL_ERR,"hardware can't do overlay\n");break;} 297 {mp_msg(MSGT_VO, MSGL_ERR,"hardware can't do overlay\n");break;}
298 case DDERR_OUTOFMEMORY: 298 case DDERR_OUTOFMEMORY:
299 {mp_msg(MSGT_VO, MSGL_ERR,"not enough system memory\n");break;} 299 {mp_msg(MSGT_VO, MSGL_ERR,"not enough system memory\n");break;}
300 case DDERR_UNSUPPORTEDMODE: 300 case DDERR_UNSUPPORTEDMODE:
301 {mp_msg(MSGT_VO, MSGL_ERR,"unsupported mode\n");break;} 301 {mp_msg(MSGT_VO, MSGL_ERR,"unsupported mode\n");break;}
302 case DDERR_OUTOFVIDEOMEMORY: 302 case DDERR_OUTOFVIDEOMEMORY:
303 {mp_msg(MSGT_VO, MSGL_ERR,"not enough video memory\n");break;} 303 {mp_msg(MSGT_VO, MSGL_ERR,"not enough video memory\n");break;}
304 default: 304 default:
305 mp_msg(MSGT_VO, MSGL_ERR,"create surface failed with 0x%x\n",ddrval); 305 mp_msg(MSGT_VO, MSGL_ERR,"create surface failed with 0x%x\n",ddrval);
306 } 306 }
307 return 1; 307 return 1;
308 } 308 }
309 g_lpddsBack = g_lpddsOverlay; 309 g_lpddsBack = g_lpddsOverlay;
310 return 0; 310 return 0;
312 312
313 static uint32_t Directx_CreateBackpuffer(void) 313 static uint32_t Directx_CreateBackpuffer(void)
314 { 314 {
315 DDSURFACEDESC2 ddsd; 315 DDSURFACEDESC2 ddsd;
316 //cleanup 316 //cleanup
317 if (g_lpddsBack)g_lpddsBack->lpVtbl->Release(g_lpddsBack); 317 if (g_lpddsBack)g_lpddsBack->lpVtbl->Release(g_lpddsBack);
318 g_lpddsBack=NULL; 318 g_lpddsBack=NULL;
319 ZeroMemory(&ddsd, sizeof(ddsd)); 319 ZeroMemory(&ddsd, sizeof(ddsd));
320 ddsd.dwSize = sizeof(ddsd); 320 ddsd.dwSize = sizeof(ddsd);
321 ddsd.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; 321 ddsd.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
322 ddsd.dwFlags= DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; 322 ddsd.dwFlags= DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
370 colorbrush = NULL; 370 colorbrush = NULL;
371 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>GDI resources deleted\n"); 371 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>GDI resources deleted\n");
372 if (g_lpdd != NULL){ 372 if (g_lpdd != NULL){
373 if(vidmode)g_lpdd->lpVtbl->RestoreDisplayMode(g_lpdd); 373 if(vidmode)g_lpdd->lpVtbl->RestoreDisplayMode(g_lpdd);
374 g_lpdd->lpVtbl->Release(g_lpdd); 374 g_lpdd->lpVtbl->Release(g_lpdd);
375 } 375 }
376 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>directdrawobject released\n"); 376 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>directdrawobject released\n");
377 FreeLibrary( hddraw_dll); 377 FreeLibrary( hddraw_dll);
378 hddraw_dll= NULL; 378 hddraw_dll= NULL;
379 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>ddraw.dll freed\n"); 379 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>ddraw.dll freed\n");
380 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>uninitialized\n"); 380 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>uninitialized\n");
381 } 381 }
382 382
383 static BOOL WINAPI EnumCallbackEx(GUID FAR *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm) 383 static BOOL WINAPI EnumCallbackEx(GUID FAR *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm)
384 { 384 {
385 mp_msg(MSGT_VO, MSGL_INFO ,"<vo_directx> adapter %d: ", adapter_count); 385 mp_msg(MSGT_VO, MSGL_INFO ,"<vo_directx> adapter %d: ", adapter_count);
386 386
387 if (!lpGUID) 387 if (!lpGUID)
388 { 388 {
389 mp_msg(MSGT_VO, MSGL_INFO ,"%s", "Primary Display Adapter"); 389 mp_msg(MSGT_VO, MSGL_INFO ,"%s", "Primary Display Adapter");
390 } 390 }
391 else 391 else
392 { 392 {
393 mp_msg(MSGT_VO, MSGL_INFO ,"%s", lpDriverDescription); 393 mp_msg(MSGT_VO, MSGL_INFO ,"%s", lpDriverDescription);
394 } 394 }
395 395
396 if(adapter_count == vo_adapter_num){ 396 if(adapter_count == vo_adapter_num){
397 MONITORINFO mi; 397 MONITORINFO mi;
398 if (!lpGUID) 398 if (!lpGUID)
399 selected_guid_ptr = NULL; 399 selected_guid_ptr = NULL;
400 else 400 else
408 monitor_rect = mi.rcMonitor; 408 monitor_rect = mi.rcMonitor;
409 } 409 }
410 mp_msg(MSGT_VO, MSGL_INFO ,"\t\t<--"); 410 mp_msg(MSGT_VO, MSGL_INFO ,"\t\t<--");
411 } 411 }
412 mp_msg(MSGT_VO, MSGL_INFO ,"\n"); 412 mp_msg(MSGT_VO, MSGL_INFO ,"\n");
413 413
414 adapter_count++; 414 adapter_count++;
415 415
416 return 1; // list all adapters 416 return 1; // list all adapters
417 } 417 }
418 418
419 static uint32_t Directx_InitDirectDraw(void) 419 static uint32_t Directx_InitDirectDraw(void)
420 { 420 {
421 HRESULT (WINAPI *OurDirectDrawCreateEx)(GUID *,LPVOID *, REFIID,IUnknown FAR *); 421 HRESULT (WINAPI *OurDirectDrawCreateEx)(GUID *,LPVOID *, REFIID,IUnknown FAR *);
422 DDSURFACEDESC2 ddsd; 422 DDSURFACEDESC2 ddsd;
423 LPDIRECTDRAWENUMERATEEX OurDirectDrawEnumerateEx; 423 LPDIRECTDRAWENUMERATEEX OurDirectDrawEnumerateEx;
424 HINSTANCE user32dll=LoadLibrary("user32.dll"); 424 HINSTANCE user32dll=LoadLibrary("user32.dll");
425 425
426 adapter_count = 0; 426 adapter_count = 0;
427 if(user32dll){ 427 if(user32dll){
428 myGetMonitorInfo=GetProcAddress(user32dll,"GetMonitorInfoA"); 428 myGetMonitorInfo=GetProcAddress(user32dll,"GetMonitorInfoA");
429 if(!myGetMonitorInfo && vo_adapter_num){ 429 if(!myGetMonitorInfo && vo_adapter_num){
430 mp_msg(MSGT_VO, MSGL_ERR, "<vo_directx> -adapter is not supported on Win95\n"); 430 mp_msg(MSGT_VO, MSGL_ERR, "<vo_directx> -adapter is not supported on Win95\n");
431 vo_adapter_num = 0; 431 vo_adapter_num = 0;
432 } 432 }
433 } 433 }
434 434
435 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>Initing DirectDraw\n" ); 435 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>Initing DirectDraw\n" );
436 436
437 //load direct draw DLL: based on videolans code 437 //load direct draw DLL: based on videolans code
438 hddraw_dll = LoadLibrary("DDRAW.DLL"); 438 hddraw_dll = LoadLibrary("DDRAW.DLL");
439 if( hddraw_dll == NULL ) 439 if( hddraw_dll == NULL )
440 { 440 {
441 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>failed loading ddraw.dll\n" ); 441 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>failed loading ddraw.dll\n" );
442 return 1; 442 return 1;
443 } 443 }
444 444
445 last_rect.left = 0xDEADC0DE; // reset window position cache 445 last_rect.left = 0xDEADC0DE; // reset window position cache
446 446
447 if(vo_adapter_num){ //display other than default 447 if(vo_adapter_num){ //display other than default
448 OurDirectDrawEnumerateEx = (LPDIRECTDRAWENUMERATEEX) GetProcAddress(hddraw_dll,"DirectDrawEnumerateExA"); 448 OurDirectDrawEnumerateEx = (LPDIRECTDRAWENUMERATEEX) GetProcAddress(hddraw_dll,"DirectDrawEnumerateExA");
449 if (!OurDirectDrawEnumerateEx){ 449 if (!OurDirectDrawEnumerateEx){
481 } 481 }
482 482
483 //get current screen siz for selected monitor ... 483 //get current screen siz for selected monitor ...
484 ddsd.dwSize=sizeof(ddsd); 484 ddsd.dwSize=sizeof(ddsd);
485 ddsd.dwFlags=DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT; 485 ddsd.dwFlags=DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
486 g_lpdd->lpVtbl->GetDisplayMode(g_lpdd, &ddsd); 486 g_lpdd->lpVtbl->GetDisplayMode(g_lpdd, &ddsd);
487 if(vo_screenwidth && vo_screenheight) 487 if(vo_screenwidth && vo_screenheight)
488 { 488 {
489 vm_height=vo_screenheight; 489 vm_height=vo_screenheight;
490 vm_width=vo_screenwidth; 490 vm_width=vo_screenwidth;
491 } 491 }
492 else 492 else
493 { 493 {
494 vm_height=ddsd.dwHeight; 494 vm_height=ddsd.dwHeight;
495 vm_width=ddsd.dwWidth; 495 vm_width=ddsd.dwWidth;
496 } 496 }
497 497
502 if(vidmode){ 502 if(vidmode){
503 if (g_lpdd->lpVtbl->SetCooperativeLevel(g_lpdd, hWnd, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK) 503 if (g_lpdd->lpVtbl->SetCooperativeLevel(g_lpdd, hWnd, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK)
504 { 504 {
505 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't set cooperativelevel for exclusive mode\n"); 505 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't set cooperativelevel for exclusive mode\n");
506 return 1; 506 return 1;
507 } 507 }
508 /*SetDisplayMode(ddobject,width,height,bpp,refreshrate,aditionalflags)*/ 508 /*SetDisplayMode(ddobject,width,height,bpp,refreshrate,aditionalflags)*/
509 if(g_lpdd->lpVtbl->SetDisplayMode(g_lpdd,vm_width, vm_height, vm_bpp,0,0) != DD_OK) 509 if(g_lpdd->lpVtbl->SetDisplayMode(g_lpdd,vm_width, vm_height, vm_bpp,0,0) != DD_OK)
510 { 510 {
511 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't set displaymode\n"); 511 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't set displaymode\n");
512 return 1; 512 return 1;
513 } 513 }
514 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>Initialized adapter %i for %i x %i @ %i \n",vo_adapter_num,vm_width,vm_height,vm_bpp); 514 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>Initialized adapter %i for %i x %i @ %i \n",vo_adapter_num,vm_width,vm_height,vm_bpp);
515 return 0; 515 return 0;
516 } 516 }
517 if (g_lpdd->lpVtbl->SetCooperativeLevel(g_lpdd, hWnd, DDSCL_NORMAL) != DD_OK) // or DDSCL_SETFOCUSWINDOW 517 if (g_lpdd->lpVtbl->SetCooperativeLevel(g_lpdd, hWnd, DDSCL_NORMAL) != DD_OK) // or DDSCL_SETFOCUSWINDOW
518 { 518 {
519 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>could not set cooperativelevel for hardwarecheck\n"); 519 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>could not set cooperativelevel for hardwarecheck\n");
520 return 1; 520 return 1;
521 } 521 }
522 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>DirectDraw Initialized\n"); 522 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>DirectDraw Initialized\n");
523 return 0; 523 return 0;
524 } 524 }
525 525
526 static void check_events(void) 526 static void check_events(void)
527 { 527 {
528 MSG msg; 528 MSG msg;
529 while (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)) 529 while (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))
532 DispatchMessage(&msg); 532 DispatchMessage(&msg);
533 } 533 }
534 } 534 }
535 535
536 static uint32_t Directx_ManageDisplay(void) 536 static uint32_t Directx_ManageDisplay(void)
537 { 537 {
538 HRESULT ddrval; 538 HRESULT ddrval;
539 DDCAPS capsDrv; 539 DDCAPS capsDrv;
540 DDOVERLAYFX ovfx; 540 DDOVERLAYFX ovfx;
541 DWORD dwUpdateFlags=0; 541 DWORD dwUpdateFlags=0;
542 int width,height; 542 int width,height;
543 543
544 if(!vidmode && !vo_fs && WinID!=-1) { 544 if(!vidmode && !vo_fs && WinID!=-1) {
545 RECT current_rect = {0, 0, 0, 0}; 545 RECT current_rect = {0, 0, 0, 0};
546 GetWindowRect(hWnd, &current_rect); 546 GetWindowRect(hWnd, &current_rect);
547 if ((current_rect.left == last_rect.left) 547 if ((current_rect.left == last_rect.left)
548 && (current_rect.top == last_rect.top) 548 && (current_rect.top == last_rect.top)
561 } 561 }
562 else if (WinID != -1 && vo_geometry) { 562 else if (WinID != -1 && vo_geometry) {
563 POINT pt; 563 POINT pt;
564 pt.x = vo_dx; 564 pt.x = vo_dx;
565 pt.y = vo_dy; 565 pt.y = vo_dy;
566 ClientToScreen(hWnd,&pt); 566 ClientToScreen(hWnd,&pt);
567 width=d_image_width; 567 width=d_image_width;
568 height=d_image_height; 568 height=d_image_height;
569 rd.left = pt.x; 569 rd.left = pt.x;
570 rd.top = pt.y; 570 rd.top = pt.y;
571 while(ShowCursor(TRUE)<=0){} 571 while(ShowCursor(TRUE)<=0){}
572 } 572 }
573 else { 573 else {
574 POINT pt; 574 POINT pt;
575 pt.x = 0; //overlayposition relative to the window 575 pt.x = 0; //overlayposition relative to the window
576 pt.y = 0; 576 pt.y = 0;
577 ClientToScreen(hWnd,&pt); 577 ClientToScreen(hWnd,&pt);
578 GetClientRect(hWnd, &rd); 578 GetClientRect(hWnd, &rd);
579 width=rd.right - rd.left; 579 width=rd.right - rd.left;
580 height=rd.bottom - rd.top; 580 height=rd.bottom - rd.top;
581 pt.x -= monitor_rect.left; /* move coordinates from global to local monitor space */ 581 pt.x -= monitor_rect.left; /* move coordinates from global to local monitor space */
582 pt.y -= monitor_rect.top; 582 pt.y -= monitor_rect.top;
583 rd.right -= monitor_rect.left; 583 rd.right -= monitor_rect.left;
584 rd.bottom -= monitor_rect.top; 584 rd.bottom -= monitor_rect.top;
585 rd.left = pt.x; 585 rd.left = pt.x;
586 rd.top = pt.y; 586 rd.top = pt.y;
587 if(!nooverlay && (!width || !height)){ 587 if(!nooverlay && (!width || !height)){
588 /*window is minimized*/ 588 /*window is minimized*/
589 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,NULL, g_lpddsPrimary, NULL, DDOVER_HIDE, NULL); 589 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,NULL, g_lpddsPrimary, NULL, DDOVER_HIDE, NULL);
590 return 0; 590 return 0;
591 } 591 }
592 if(vo_keepaspect){ 592 if(vo_keepaspect){
593 int tmpheight=((float)width/window_aspect); 593 int tmpheight=((float)width/window_aspect);
594 tmpheight+=tmpheight%2; 594 tmpheight+=tmpheight%2;
595 if(tmpheight > height){ 595 if(tmpheight > height){
596 width=((float)height*window_aspect); 596 width=((float)height*window_aspect);
597 width+=width%2; 597 width+=width%2;
598 } 598 }
599 else height=tmpheight; 599 else height=tmpheight;
600 } 600 }
601 if (WinID == -1) 601 if (WinID == -1)
602 while(ShowCursor(TRUE)<=0){} 602 while(ShowCursor(TRUE)<=0){}
603 } 603 }
604 rd.right=rd.left+width; 604 rd.right=rd.left+width;
605 rd.bottom=rd.top+height; 605 rd.bottom=rd.top+height;
606 606
607 /*ok, let's workaround some overlay limitations*/ 607 /*ok, let's workaround some overlay limitations*/
608 if(!nooverlay) 608 if(!nooverlay)
609 { 609 {
610 uint32_t uStretchFactor1000; //minimum stretch 610 uint32_t uStretchFactor1000; //minimum stretch
611 uint32_t xstretch1000,ystretch1000; 611 uint32_t xstretch1000,ystretch1000;
612 /*get driver capabilities*/ 612 /*get driver capabilities*/
613 ZeroMemory(&capsDrv, sizeof(capsDrv)); 613 ZeroMemory(&capsDrv, sizeof(capsDrv));
614 capsDrv.dwSize = sizeof(capsDrv); 614 capsDrv.dwSize = sizeof(capsDrv);
615 if(g_lpdd->lpVtbl->GetCaps(g_lpdd,&capsDrv, NULL) != DD_OK)return 1; 615 if(g_lpdd->lpVtbl->GetCaps(g_lpdd,&capsDrv, NULL) != DD_OK)return 1;
616 /*get minimum stretch, depends on display adaptor and mode (refresh rate!) */ 616 /*get minimum stretch, depends on display adaptor and mode (refresh rate!) */
635 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't shrink x\n"); 635 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't shrink x\n");
636 rd.right=rd.left+image_width; 636 rd.right=rd.left+image_width;
637 } 637 }
638 else if((width > image_width)&& !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHX)) 638 else if((width > image_width)&& !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHX))
639 { 639 {
640 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHXN)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can only stretchN\n"); 640 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHXN)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can only stretchN\n");
641 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't stretch x\n"); 641 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't stretch x\n");
642 rd.right = rd.left+image_width; 642 rd.right = rd.left+image_width;
643 } 643 }
644 if((height < image_height) && !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSHRINKY)) 644 if((height < image_height) && !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSHRINKY))
645 { 645 {
650 else if((height > image_height ) && !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHY)) 650 else if((height > image_height ) && !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHY))
651 { 651 {
652 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHYN)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can only stretchN\n"); 652 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHYN)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can only stretchN\n");
653 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't stretch y\n"); 653 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't stretch y\n");
654 rd.bottom = rd.top + image_height; 654 rd.bottom = rd.top + image_height;
655 } 655 }
656 /*the last thing to check are alignment restrictions 656 /*the last thing to check are alignment restrictions
657 these expressions (x & -y) just do alignment by dropping low order bits... 657 these expressions (x & -y) just do alignment by dropping low order bits...
658 so to round up, we add first, then truncate*/ 658 so to round up, we add first, then truncate*/
659 if((capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYSRC) && capsDrv.dwAlignBoundarySrc) 659 if((capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYSRC) && capsDrv.dwAlignBoundarySrc)
660 rs.left = (rs.left + capsDrv.dwAlignBoundarySrc / 2) & -(signed)(capsDrv.dwAlignBoundarySrc); 660 rs.left = (rs.left + capsDrv.dwAlignBoundarySrc / 2) & -(signed)(capsDrv.dwAlignBoundarySrc);
667 /*create an overlay FX structure to specify a destination color key*/ 667 /*create an overlay FX structure to specify a destination color key*/
668 ZeroMemory(&ovfx, sizeof(ovfx)); 668 ZeroMemory(&ovfx, sizeof(ovfx));
669 ovfx.dwSize = sizeof(ovfx); 669 ovfx.dwSize = sizeof(ovfx);
670 if(vo_fs||vidmode) 670 if(vo_fs||vidmode)
671 { 671 {
672 ovfx.dckDestColorkey.dwColorSpaceLowValue = 0; 672 ovfx.dckDestColorkey.dwColorSpaceLowValue = 0;
673 ovfx.dckDestColorkey.dwColorSpaceHighValue = 0; 673 ovfx.dckDestColorkey.dwColorSpaceHighValue = 0;
674 } 674 }
675 else 675 else
676 { 676 {
677 ovfx.dckDestColorkey.dwColorSpaceLowValue = destcolorkey; 677 ovfx.dckDestColorkey.dwColorSpaceLowValue = destcolorkey;
678 ovfx.dckDestColorkey.dwColorSpaceHighValue = destcolorkey; 678 ovfx.dckDestColorkey.dwColorSpaceHighValue = destcolorkey;
679 } 679 }
680 // set the flags we'll send to UpdateOverlay //DDOVER_AUTOFLIP|DDOVERFX_MIRRORLEFTRIGHT|DDOVERFX_MIRRORUPDOWN could be useful?; 680 // set the flags we'll send to UpdateOverlay //DDOVER_AUTOFLIP|DDOVERFX_MIRRORLEFTRIGHT|DDOVERFX_MIRRORUPDOWN could be useful?;
681 dwUpdateFlags = DDOVER_SHOW | DDOVER_DDFX; 681 dwUpdateFlags = DDOVER_SHOW | DDOVER_DDFX;
682 /*if hardware can't do colorkeying set the window on top*/ 682 /*if hardware can't do colorkeying set the window on top*/
684 else if (!tmp_image) vo_ontop = 1; 684 else if (!tmp_image) vo_ontop = 1;
685 } 685 }
686 else 686 else
687 { 687 {
688 g_lpddclipper->lpVtbl->SetHWnd(g_lpddclipper, 0,(vo_fs && !vidmode)?hWndFS: hWnd); 688 g_lpddclipper->lpVtbl->SetHWnd(g_lpddclipper, 0,(vo_fs && !vidmode)?hWndFS: hWnd);
689 } 689 }
690 690
691 if(!vidmode && !vo_fs){ 691 if(!vidmode && !vo_fs){
692 if(WinID == -1) { 692 if(WinID == -1) {
693 RECT rdw=rd; 693 RECT rdw=rd;
694 if (vo_border) 694 if (vo_border)
695 AdjustWindowRect(&rdw,WNDSTYLE,FALSE); 695 AdjustWindowRect(&rdw,WNDSTYLE,FALSE);
696 // printf("window: %i %i %ix%i\n",rdw.left,rdw.top,rdw.right - rdw.left,rdw.bottom - rdw.top); 696 // printf("window: %i %i %ix%i\n",rdw.left,rdw.top,rdw.right - rdw.left,rdw.bottom - rdw.top);
697 rdw.left += monitor_rect.left; /* move to global coordinate space */ 697 rdw.left += monitor_rect.left; /* move to global coordinate space */
698 rdw.top += monitor_rect.top; 698 rdw.top += monitor_rect.top;
699 rdw.right += monitor_rect.left; 699 rdw.right += monitor_rect.left;
700 rdw.bottom += monitor_rect.top; 700 rdw.bottom += monitor_rect.top;
701 SetWindowPos(hWnd,(vo_ontop)?HWND_TOPMOST:(vo_rootwin?HWND_BOTTOM:HWND_NOTOPMOST),rdw.left,rdw.top,rdw.right-rdw.left,rdw.bottom-rdw.top,SWP_NOOWNERZORDER); 701 SetWindowPos(hWnd,(vo_ontop)?HWND_TOPMOST:(vo_rootwin?HWND_BOTTOM:HWND_NOTOPMOST),rdw.left,rdw.top,rdw.right-rdw.left,rdw.bottom-rdw.top,SWP_NOOWNERZORDER);
702 } 702 }
703 } 703 }
704 else SetWindowPos(vidmode?hWnd:hWndFS,vo_rootwin?HWND_BOTTOM:HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOOWNERZORDER|SWP_NOCOPYBITS); 704 else SetWindowPos(vidmode?hWnd:hWndFS,vo_rootwin?HWND_BOTTOM:HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOOWNERZORDER|SWP_NOCOPYBITS);
705 705
706 /*make sure the overlay is inside the screen*/ 706 /*make sure the overlay is inside the screen*/
707 if(rd.left<0)rd.left=0; 707 if(rd.left<0)rd.left=0;
708 if(rd.right>vo_screenwidth)rd.right=vo_screenwidth; 708 if(rd.right>vo_screenwidth)rd.right=vo_screenwidth;
709 if(rd.top<0)rd.top=0; 709 if(rd.top<0)rd.top=0;
710 if(rd.bottom>vo_screenheight)rd.bottom=vo_screenheight; 710 if(rd.bottom>vo_screenheight)rd.bottom=vo_screenheight;
711 711
712 /*for nonoverlay mode we are finished, for overlay mode we have to display the overlay first*/ 712 /*for nonoverlay mode we are finished, for overlay mode we have to display the overlay first*/
713 if(nooverlay)return 0; 713 if(nooverlay)return 0;
714 714
715 // printf("overlay: %i %i %ix%i\n",rd.left,rd.top,rd.right - rd.left,rd.bottom - rd.top); 715 // printf("overlay: %i %i %ix%i\n",rd.left,rd.top,rd.right - rd.left,rd.bottom - rd.top);
716 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,&rs, g_lpddsPrimary, &rd, dwUpdateFlags, &ovfx); 716 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,&rs, g_lpddsPrimary, &rd, dwUpdateFlags, &ovfx);
717 if(FAILED(ddrval)) 717 if(FAILED(ddrval))
718 { 718 {
719 // one cause might be the driver lied about minimum stretch 719 // one cause might be the driver lied about minimum stretch
720 // we should try upping the destination size a bit, or 720 // we should try upping the destination size a bit, or
721 // perhaps shrinking the source size 721 // perhaps shrinking the source size
722 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>UpdateOverlay failed\n" ); 722 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>UpdateOverlay failed\n" );
723 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>Overlay:x1:%i,y1:%i,x2:%i,y2:%i,w:%i,h:%i\n",rd.left,rd.top,rd.right,rd.bottom,rd.right - rd.left,rd.bottom - rd.top ); 723 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>Overlay:x1:%i,y1:%i,x2:%i,y2:%i,w:%i,h:%i\n",rd.left,rd.top,rd.right,rd.bottom,rd.right - rd.left,rd.bottom - rd.top );
724 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>"); 724 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>");
743 case DDERR_SURFACELOST: 743 case DDERR_SURFACELOST:
744 { 744 {
745 mp_msg(MSGT_VO, MSGL_ERR ,"surfaces lost\n"); 745 mp_msg(MSGT_VO, MSGL_ERR ,"surfaces lost\n");
746 g_lpddsOverlay->lpVtbl->Restore( g_lpddsOverlay ); //restore and try again 746 g_lpddsOverlay->lpVtbl->Restore( g_lpddsOverlay ); //restore and try again
747 g_lpddsPrimary->lpVtbl->Restore( g_lpddsPrimary ); 747 g_lpddsPrimary->lpVtbl->Restore( g_lpddsPrimary );
748 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,&rs, g_lpddsPrimary, &rd, dwUpdateFlags, &ovfx); 748 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,&rs, g_lpddsPrimary, &rd, dwUpdateFlags, &ovfx);
749 if(ddrval !=DD_OK)mp_msg(MSGT_VO, MSGL_FATAL ,"<vo_directx><FATAL ERROR>UpdateOverlay failed again\n" ); 749 if(ddrval !=DD_OK)mp_msg(MSGT_VO, MSGL_FATAL ,"<vo_directx><FATAL ERROR>UpdateOverlay failed again\n" );
750 break; 750 break;
751 } 751 }
752 default: 752 default:
753 mp_msg(MSGT_VO, MSGL_ERR ," 0x%x\n",ddrval); 753 mp_msg(MSGT_VO, MSGL_ERR ," 0x%x\n",ddrval);
754 } 754 }
755 /*ok we can't do anything about it -> hide overlay*/ 755 /*ok we can't do anything about it -> hide overlay*/
756 if(ddrval != DD_OK) 756 if(ddrval != DD_OK)
757 { 757 {
758 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,NULL, g_lpddsPrimary, NULL, DDOVER_HIDE, NULL); 758 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,NULL, g_lpddsPrimary, NULL, DDOVER_HIDE, NULL);
784 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>Your card doesn't support overlay\n"); 784 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>Your card doesn't support overlay\n");
785 return 1; 785 return 1;
786 } 786 }
787 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>testing supported overlay pixelformats\n"); 787 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>testing supported overlay pixelformats\n");
788 //it is not possible to query for pixel formats supported by the 788 //it is not possible to query for pixel formats supported by the
789 //overlay hardware: try out various formats till one works 789 //overlay hardware: try out various formats till one works
790 ZeroMemory(&ddsdOverlay, sizeof(ddsdOverlay)); 790 ZeroMemory(&ddsdOverlay, sizeof(ddsdOverlay));
791 ddsdOverlay.dwSize = sizeof(ddsdOverlay); 791 ddsdOverlay.dwSize = sizeof(ddsdOverlay);
792 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY; 792 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY;
793 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH| DDSD_PIXELFORMAT; 793 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH| DDSD_PIXELFORMAT;
794 ddsdOverlay.dwWidth=300; 794 ddsdOverlay.dwWidth=300;
795 ddsdOverlay.dwHeight=280; 795 ddsdOverlay.dwHeight=280;
796 ddsdOverlay.dwBackBufferCount=0; 796 ddsdOverlay.dwBackBufferCount=0;
797 //try to create an overlay surface using one of the pixel formats in our global list 797 //try to create an overlay surface using one of the pixel formats in our global list
798 i=0; 798 i=0;
799 do 799 do
800 { 800 {
801 ddsdOverlay.ddpfPixelFormat=g_ddpf[i].g_ddpfOverlay; 801 ddsdOverlay.ddpfPixelFormat=g_ddpf[i].g_ddpfOverlay;
802 ddrval = g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsdOverlay, &g_lpddsOverlay, NULL); 802 ddrval = g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsdOverlay, &g_lpddsOverlay, NULL);
803 if (ddrval == DD_OK) 803 if (ddrval == DD_OK)
804 { 804 {
818 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>- vo_directx doesn't support the cards overlay pixelformat\n"); 818 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>- vo_directx doesn't support the cards overlay pixelformat\n");
819 return 1; 819 return 1;
820 } 820 }
821 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYMIRRORLEFTRIGHT)mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>can mirror left right\n"); //I don't have hardware which 821 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYMIRRORLEFTRIGHT)mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>can mirror left right\n"); //I don't have hardware which
822 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYMIRRORUPDOWN )mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>can mirror up down\n"); //supports those send me one and I'll implement ;) 822 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYMIRRORUPDOWN )mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>can mirror up down\n"); //supports those send me one and I'll implement ;)
823 return 0; 823 return 0;
824 } 824 }
825 825
826 //find out the Pixelformat of the Primary Surface 826 //find out the Pixelformat of the Primary Surface
827 static uint32_t Directx_CheckPrimaryPixelformat(void) 827 static uint32_t Directx_CheckPrimaryPixelformat(void)
828 { 828 {
829 uint32_t i=0; 829 uint32_t i=0;
830 uint32_t formatcount = 0; 830 uint32_t formatcount = 0;
831 DDPIXELFORMAT ddpf; 831 DDPIXELFORMAT ddpf;
832 DDSURFACEDESC2 ddsd; 832 DDSURFACEDESC2 ddsd;
833 HDC hdc; 833 HDC hdc;
850 if (g_ddpf[i].g_ddpfOverlay.dwRBitMask == ddpf.dwRBitMask) 850 if (g_ddpf[i].g_ddpfOverlay.dwRBitMask == ddpf.dwRBitMask)
851 { 851 {
852 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><FORMAT PRIMARY>%i %s supported\n",i,g_ddpf[i].img_format_name); 852 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><FORMAT PRIMARY>%i %s supported\n",i,g_ddpf[i].img_format_name);
853 g_ddpf[i].drv_caps = VFCAP_CSP_SUPPORTED |VFCAP_OSD; 853 g_ddpf[i].drv_caps = VFCAP_CSP_SUPPORTED |VFCAP_OSD;
854 formatcount++; 854 formatcount++;
855 primary_image_format=g_ddpf[i].img_format; 855 primary_image_format=g_ddpf[i].img_format;
856 } 856 }
857 } 857 }
858 i++; 858 i++;
859 } 859 }
860 //get the colorkey for overlay mode 860 //get the colorkey for overlay mode
861 destcolorkey = CLR_INVALID; 861 destcolorkey = CLR_INVALID;
862 if (windowcolor != CLR_INVALID && g_lpddsPrimary->lpVtbl->GetDC(g_lpddsPrimary,&hdc) == DD_OK) 862 if (windowcolor != CLR_INVALID && g_lpddsPrimary->lpVtbl->GetDC(g_lpddsPrimary,&hdc) == DD_OK)
863 { 863 {
864 rgbT = GetPixel(hdc, 0, 0); 864 rgbT = GetPixel(hdc, 0, 0);
865 SetPixel(hdc, 0, 0, windowcolor); 865 SetPixel(hdc, 0, 0, windowcolor);
866 g_lpddsPrimary->lpVtbl->ReleaseDC(g_lpddsPrimary,hdc); 866 g_lpddsPrimary->lpVtbl->ReleaseDC(g_lpddsPrimary,hdc);
867 } 867 }
868 // read back the converted color 868 // read back the converted color
869 ddsd.dwSize = sizeof(ddsd); 869 ddsd.dwSize = sizeof(ddsd);
870 while ((hres = g_lpddsPrimary->lpVtbl->Lock(g_lpddsPrimary,NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING) 870 while ((hres = g_lpddsPrimary->lpVtbl->Lock(g_lpddsPrimary,NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)
871 ; 871 ;
872 if (hres == DD_OK) 872 if (hres == DD_OK)
873 { 873 {
874 destcolorkey = *(DWORD *) ddsd.lpSurface; 874 destcolorkey = *(DWORD *) ddsd.lpSurface;
875 if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32) 875 if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32)
876 destcolorkey &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1; 876 destcolorkey &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1;
877 g_lpddsPrimary->lpVtbl->Unlock(g_lpddsPrimary,NULL); 877 g_lpddsPrimary->lpVtbl->Unlock(g_lpddsPrimary,NULL);
878 } 878 }
879 if (windowcolor != CLR_INVALID && g_lpddsPrimary->lpVtbl->GetDC(g_lpddsPrimary,&hdc) == DD_OK) 879 if (windowcolor != CLR_INVALID && g_lpddsPrimary->lpVtbl->GetDC(g_lpddsPrimary,&hdc) == DD_OK)
880 { 880 {
881 SetPixel(hdc, 0, 0, rgbT); 881 SetPixel(hdc, 0, 0, rgbT);
896 static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 896 static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
897 { 897 {
898 switch (message) 898 switch (message)
899 { 899 {
900 case WM_MOUSEACTIVATE: 900 case WM_MOUSEACTIVATE:
901 return MA_ACTIVATEANDEAT; 901 return MA_ACTIVATEANDEAT;
902 case WM_NCACTIVATE: 902 case WM_NCACTIVATE:
903 { 903 {
904 if(vidmode && adapter_count > 2) //only disable if more than one adapter. 904 if(vidmode && adapter_count > 2) //only disable if more than one adapter.
905 return 0; 905 return 0;
906 break; 906 break;
925 break; 925 break;
926 } 926 }
927 case WM_SYSCOMMAND: 927 case WM_SYSCOMMAND:
928 { 928 {
929 switch (wParam) 929 switch (wParam)
930 { //kill screensaver etc. 930 { //kill screensaver etc.
931 //note: works only when the window is active 931 //note: works only when the window is active
932 //you can workaround this by disabling the allow screensaver option in 932 //you can workaround this by disabling the allow screensaver option in
933 //the link to the app 933 //the link to the app
934 case SC_SCREENSAVE: 934 case SC_SCREENSAVE:
935 case SC_MONITORPOWER: 935 case SC_MONITORPOWER:
936 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>killing screensaver\n" ); 936 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>killing screensaver\n" );
937 return 0; 937 return 0;
938 case SC_MAXIMIZE: 938 case SC_MAXIMIZE:
939 if (!vo_fs) control(VOCTRL_FULLSCREEN, NULL); 939 if (!vo_fs) control(VOCTRL_FULLSCREEN, NULL);
940 return 0; 940 return 0;
941 } 941 }
942 break; 942 break;
943 } 943 }
944 case WM_KEYDOWN: 944 case WM_KEYDOWN:
945 { 945 {
946 switch (wParam) 946 switch (wParam)
947 { 947 {
948 case VK_LEFT: 948 case VK_LEFT:
949 {mplayer_put_key(KEY_LEFT);break;} 949 {mplayer_put_key(KEY_LEFT);break;}
950 case VK_UP: 950 case VK_UP:
951 {mplayer_put_key(KEY_UP);break;} 951 {mplayer_put_key(KEY_UP);break;}
952 case VK_RIGHT: 952 case VK_RIGHT:
953 {mplayer_put_key(KEY_RIGHT);break;} 953 {mplayer_put_key(KEY_RIGHT);break;}
954 case VK_DOWN: 954 case VK_DOWN:
955 {mplayer_put_key(KEY_DOWN);break;} 955 {mplayer_put_key(KEY_DOWN);break;}
956 case VK_TAB: 956 case VK_TAB:
957 {mplayer_put_key(KEY_TAB);break;} 957 {mplayer_put_key(KEY_TAB);break;}
958 case VK_BACK: 958 case VK_BACK:
959 {mplayer_put_key(KEY_BS);break;} 959 {mplayer_put_key(KEY_BS);break;}
960 case VK_DELETE: 960 case VK_DELETE:
1045 mplayer_put_key(MOUSE_BTN5_DBL); 1045 mplayer_put_key(MOUSE_BTN5_DBL);
1046 else 1046 else
1047 mplayer_put_key(MOUSE_BTN6_DBL); 1047 mplayer_put_key(MOUSE_BTN6_DBL);
1048 break; 1048 break;
1049 } 1049 }
1050 1050
1051 } 1051 }
1052 return DefWindowProc(hWnd, message, wParam, lParam); 1052 return DefWindowProc(hWnd, message, wParam, lParam);
1053 } 1053 }
1054 1054
1055 1055
1073 } 1073 }
1074 if(!mplayericon)mplayericon=LoadIcon(NULL,IDI_APPLICATION); 1074 if(!mplayericon)mplayericon=LoadIcon(NULL,IDI_APPLICATION);
1075 mplayercursor = LoadCursor(NULL, IDC_ARROW); 1075 mplayercursor = LoadCursor(NULL, IDC_ARROW);
1076 monitor_rect.right=GetSystemMetrics(SM_CXSCREEN); 1076 monitor_rect.right=GetSystemMetrics(SM_CXSCREEN);
1077 monitor_rect.bottom=GetSystemMetrics(SM_CYSCREEN); 1077 monitor_rect.bottom=GetSystemMetrics(SM_CYSCREEN);
1078 1078
1079 windowcolor = vo_colorkey; 1079 windowcolor = vo_colorkey;
1080 colorbrush = CreateSolidBrush(windowcolor); 1080 colorbrush = CreateSolidBrush(windowcolor);
1081 blackbrush = (HBRUSH)GetStockObject(BLACK_BRUSH); 1081 blackbrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
1082 wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; 1082 wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
1083 wc.lpfnWndProc = WndProc; 1083 wc.lpfnWndProc = WndProc;
1096 WNDCLASSNAME_WINDOWED,"",(vidmode || !vo_border)?WS_POPUP:WNDSTYLE, 1096 WNDCLASSNAME_WINDOWED,"",(vidmode || !vo_border)?WS_POPUP:WNDSTYLE,
1097 CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,NULL,NULL,hInstance,NULL); 1097 CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,NULL,NULL,hInstance,NULL);
1098 wc.hbrBackground = blackbrush; 1098 wc.hbrBackground = blackbrush;
1099 wc.lpszClassName = WNDCLASSNAME_FULLSCREEN; 1099 wc.lpszClassName = WNDCLASSNAME_FULLSCREEN;
1100 RegisterClass(&wc); 1100 RegisterClass(&wc);
1101 1101
1102 if (Directx_InitDirectDraw()!= 0)return 1; //init DirectDraw 1102 if (Directx_InitDirectDraw()!= 0)return 1; //init DirectDraw
1103 1103
1104 if(!vidmode)hWndFS = CreateWindow(WNDCLASSNAME_FULLSCREEN,"MPlayer Fullscreen",WS_POPUP,monitor_rect.left,monitor_rect.top,monitor_rect.right-monitor_rect.left,monitor_rect.bottom-monitor_rect.top,hWnd,NULL,hInstance,NULL); 1104 if(!vidmode)hWndFS = CreateWindow(WNDCLASSNAME_FULLSCREEN,"MPlayer Fullscreen",WS_POPUP,monitor_rect.left,monitor_rect.top,monitor_rect.right-monitor_rect.left,monitor_rect.bottom-monitor_rect.top,hWnd,NULL,hInstance,NULL);
1105 mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>initial mplayer windows created\n"); 1105 mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>initial mplayer windows created\n");
1106 1106
1107 if (Directx_CheckPrimaryPixelformat()!=0)return 1; 1107 if (Directx_CheckPrimaryPixelformat()!=0)return 1;
1108 if (!nooverlay && Directx_CheckOverlayPixelformats() == 0) //check for supported hardware 1108 if (!nooverlay && Directx_CheckOverlayPixelformats() == 0) //check for supported hardware
1109 { 1109 {
1110 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>hardware supports overlay\n"); 1110 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>hardware supports overlay\n");
1111 nooverlay = 0; 1111 nooverlay = 0;
1112 } 1112 }
1113 else //if we can't have overlay we create a backpuffer with the same imageformat as the primary surface 1113 else //if we can't have overlay we create a backpuffer with the same imageformat as the primary surface
1114 { 1114 {
1115 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>using backpuffer\n"); 1115 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>using backpuffer\n");
1116 nooverlay = 1; 1116 nooverlay = 1;
1117 } 1117 }
1123 { 1123 {
1124 uint8_t *s; 1124 uint8_t *s;
1125 uint8_t *d; 1125 uint8_t *d;
1126 uint32_t uvstride=dstride/2; 1126 uint32_t uvstride=dstride/2;
1127 // copy Y 1127 // copy Y
1128 d=image+dstride*y+x; 1128 d=image+dstride*y+x;
1129 s=src[0]; 1129 s=src[0];
1130 mem2agpcpy_pic(d,s,w,h,dstride,stride[0]); 1130 mem2agpcpy_pic(d,s,w,h,dstride,stride[0]);
1131 1131
1132 w/=2;h/=2;x/=2;y/=2; 1132 w/=2;h/=2;x/=2;y/=2;
1133 1133
1134 // copy U 1134 // copy U
1135 d=image+dstride*image_height + uvstride*y+x; 1135 d=image+dstride*image_height + uvstride*y+x;
1136 if(image_format == IMGFMT_YV12)s=src[2]; 1136 if(image_format == IMGFMT_YV12)s=src[2];
1137 else s=src[1]; 1137 else s=src[1];
1138 mem2agpcpy_pic(d,s,w,h,uvstride,stride[1]); 1138 mem2agpcpy_pic(d,s,w,h,uvstride,stride[1]);
1139 1139
1140 // copy V 1140 // copy V
1141 d=image+dstride*image_height +uvstride*(image_height/2) + uvstride*y+x; 1141 d=image+dstride*image_height +uvstride*(image_height/2) + uvstride*y+x;
1142 if(image_format == IMGFMT_YV12)s=src[1]; 1142 if(image_format == IMGFMT_YV12)s=src[1];
1143 else s=src[2]; 1143 else s=src[2];
1144 mem2agpcpy_pic(d,s,w,h,uvstride,stride[2]); 1144 mem2agpcpy_pic(d,s,w,h,uvstride,stride[2]);
1147 1147
1148 static void flip_page(void) 1148 static void flip_page(void)
1149 { 1149 {
1150 HRESULT dxresult; 1150 HRESULT dxresult;
1151 g_lpddsBack->lpVtbl->Unlock (g_lpddsBack,NULL); 1151 g_lpddsBack->lpVtbl->Unlock (g_lpddsBack,NULL);
1152 if (vo_doublebuffering) 1152 if (vo_doublebuffering)
1153 { 1153 {
1154 // flip to the next image in the sequence 1154 // flip to the next image in the sequence
1155 dxresult = g_lpddsOverlay->lpVtbl->Flip( g_lpddsOverlay,NULL, DDFLIP_WAIT); 1155 dxresult = g_lpddsOverlay->lpVtbl->Flip( g_lpddsOverlay,NULL, DDFLIP_WAIT);
1156 if(dxresult == DDERR_SURFACELOST) 1156 if(dxresult == DDERR_SURFACELOST)
1157 { 1157 {
1158 mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR><vo_directx><INFO>Restoring Surface\n"); 1158 mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR><vo_directx><INFO>Restoring Surface\n");
1159 g_lpddsBack->lpVtbl->Restore( g_lpddsBack ); 1159 g_lpddsBack->lpVtbl->Restore( g_lpddsBack );
1165 Directx_ManageDisplay(); 1165 Directx_ManageDisplay();
1166 dxresult = g_lpddsOverlay->lpVtbl->Flip( g_lpddsOverlay,NULL, DDFLIP_WAIT); 1166 dxresult = g_lpddsOverlay->lpVtbl->Flip( g_lpddsOverlay,NULL, DDFLIP_WAIT);
1167 } 1167 }
1168 if(dxresult != DD_OK)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't flip page\n"); 1168 if(dxresult != DD_OK)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't flip page\n");
1169 } 1169 }
1170 if(nooverlay) 1170 if(nooverlay)
1171 { 1171 {
1172 DDBLTFX ddbltfx; 1172 DDBLTFX ddbltfx;
1173 // ask for the "NOTEARING" option 1173 // ask for the "NOTEARING" option
1174 memset( &ddbltfx, 0, sizeof(DDBLTFX) ); 1174 memset( &ddbltfx, 0, sizeof(DDBLTFX) );
1175 ddbltfx.dwSize = sizeof(DDBLTFX); 1175 ddbltfx.dwSize = sizeof(DDBLTFX);
1198 return 0; 1198 return 0;
1199 } 1199 }
1200 1200
1201 static uint32_t get_image(mp_image_t *mpi) 1201 static uint32_t get_image(mp_image_t *mpi)
1202 { 1202 {
1203 if(mpi->flags&MP_IMGFLAG_READABLE) {mp_msg(MSGT_VO, MSGL_V,"<vo_directx><ERROR>slow video ram\n");return VO_FALSE;} 1203 if(mpi->flags&MP_IMGFLAG_READABLE) {mp_msg(MSGT_VO, MSGL_V,"<vo_directx><ERROR>slow video ram\n");return VO_FALSE;}
1204 if(mpi->type==MP_IMGTYPE_STATIC) {mp_msg(MSGT_VO, MSGL_V,"<vo_directx><ERROR>not static\n");return VO_FALSE;} 1204 if(mpi->type==MP_IMGTYPE_STATIC) {mp_msg(MSGT_VO, MSGL_V,"<vo_directx><ERROR>not static\n");return VO_FALSE;}
1205 if((mpi->width==dstride) || (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH))) 1205 if((mpi->width==dstride) || (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH)))
1206 { 1206 {
1207 if(mpi->flags&MP_IMGFLAG_PLANAR) 1207 if(mpi->flags&MP_IMGFLAG_PLANAR)
1208 { 1208 {
1230 mpi->width=image_width; 1230 mpi->width=image_width;
1231 mpi->height=image_height; 1231 mpi->height=image_height;
1232 mpi->flags|=MP_IMGFLAG_DIRECT; 1232 mpi->flags|=MP_IMGFLAG_DIRECT;
1233 mp_msg(MSGT_VO, MSGL_DBG3, "<vo_directx><INFO>Direct Rendering ENABLED\n"); 1233 mp_msg(MSGT_VO, MSGL_DBG3, "<vo_directx><INFO>Direct Rendering ENABLED\n");
1234 return VO_TRUE; 1234 return VO_TRUE;
1235 } 1235 }
1236 return VO_FALSE; 1236 return VO_FALSE;
1237 } 1237 }
1238 1238
1239 static uint32_t put_image(mp_image_t *mpi){ 1239 static uint32_t put_image(mp_image_t *mpi){
1240 1240
1241 uint8_t *d; 1241 uint8_t *d;
1242 uint8_t *s; 1242 uint8_t *s;
1243 uint32_t x = mpi->x; 1243 uint32_t x = mpi->x;
1244 uint32_t y = mpi->y; 1244 uint32_t y = mpi->y;
1245 uint32_t w = mpi->w; 1245 uint32_t w = mpi->w;
1246 uint32_t h = mpi->h; 1246 uint32_t h = mpi->h;
1247 1247
1248 if (WinID != -1) Directx_ManageDisplay(); 1248 if (WinID != -1) Directx_ManageDisplay();
1249 1249
1250 if((mpi->flags&MP_IMGFLAG_DIRECT)||(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)) 1250 if((mpi->flags&MP_IMGFLAG_DIRECT)||(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK))
1251 { 1251 {
1252 mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>put_image: nothing to do: drawslices\n"); 1252 mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>put_image: nothing to do: drawslices\n");
1253 return VO_TRUE; 1253 return VO_TRUE;
1254 } 1254 }
1255 1255
1256 if (mpi->flags&MP_IMGFLAG_PLANAR) 1256 if (mpi->flags&MP_IMGFLAG_PLANAR)
1257 { 1257 {
1258 1258
1259 if(image_format!=IMGFMT_YVU9)draw_slice(mpi->planes,mpi->stride,mpi->w,mpi->h,0,0); 1259 if(image_format!=IMGFMT_YVU9)draw_slice(mpi->planes,mpi->stride,mpi->w,mpi->h,0,0);
1260 else 1260 else
1261 { 1261 {
1262 // copy Y 1262 // copy Y
1263 d=image+dstride*y+x; 1263 d=image+dstride*y+x;
1301 #endif 1301 #endif
1302 /*release all directx objects*/ 1302 /*release all directx objects*/
1303 if (g_cc != NULL)g_cc->lpVtbl->Release(g_cc); 1303 if (g_cc != NULL)g_cc->lpVtbl->Release(g_cc);
1304 g_cc=NULL; 1304 g_cc=NULL;
1305 if(g_lpddclipper)g_lpddclipper->lpVtbl->Release(g_lpddclipper); 1305 if(g_lpddclipper)g_lpddclipper->lpVtbl->Release(g_lpddclipper);
1306 g_lpddclipper=NULL; 1306 g_lpddclipper=NULL;
1307 if (g_lpddsBack != NULL) g_lpddsBack->lpVtbl->Release(g_lpddsBack); 1307 if (g_lpddsBack != NULL) g_lpddsBack->lpVtbl->Release(g_lpddsBack);
1308 g_lpddsBack = NULL; 1308 g_lpddsBack = NULL;
1309 if(vo_doublebuffering) 1309 if(vo_doublebuffering)
1310 if (g_lpddsOverlay != NULL)g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay); 1310 if (g_lpddsOverlay != NULL)g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay);
1311 g_lpddsOverlay = NULL; 1311 g_lpddsOverlay = NULL;
1325 rd.top = vo_dy; 1325 rd.top = vo_dy;
1326 rd.right = rd.left + d_image_width; 1326 rd.right = rd.left + d_image_width;
1327 rd.bottom = rd.top + d_image_height; 1327 rd.bottom = rd.top + d_image_height;
1328 if (WinID == -1) { 1328 if (WinID == -1) {
1329 if (vo_border) 1329 if (vo_border)
1330 AdjustWindowRect(&rd,WNDSTYLE,FALSE); 1330 AdjustWindowRect(&rd,WNDSTYLE,FALSE);
1331 SetWindowPos(hWnd,NULL, vo_dx, vo_dy,rd.right-rd.left,rd.bottom-rd.top,SWP_SHOWWINDOW|SWP_NOOWNERZORDER); 1331 SetWindowPos(hWnd,NULL, vo_dx, vo_dy,rd.right-rd.left,rd.bottom-rd.top,SWP_SHOWWINDOW|SWP_NOOWNERZORDER);
1332 } 1332 }
1333 } 1333 }
1334 else ShowWindow(hWnd,SW_SHOW); 1334 else ShowWindow(hWnd,SW_SHOW);
1335 1335
1336 if(vo_fs && !vidmode)ShowWindow(hWndFS,SW_SHOW); 1336 if(vo_fs && !vidmode)ShowWindow(hWndFS,SW_SHOW);
1337 if (WinID == -1) 1337 if (WinID == -1)
1338 SetWindowText(hWnd,title); 1338 SetWindowText(hWnd,title);
1339 1339
1340 1340
1341 if(vidmode)vo_fs=0; 1341 if(vidmode)vo_fs=0;
1342 1342
1343 1343
1344 /*create the surfaces*/ 1344 /*create the surfaces*/
1345 if(Directx_CreatePrimarySurface())return 1; 1345 if(Directx_CreatePrimarySurface())return 1;
1346 1346
1347 //create palette for 256 color mode 1347 //create palette for 256 color mode
1348 if(image_format==IMGFMT_BGR8){ 1348 if(image_format==IMGFMT_BGR8){
1349 LPDIRECTDRAWPALETTE ddpalette=NULL; 1349 LPDIRECTDRAWPALETTE ddpalette=NULL;
1350 char* palette=malloc(4*256); 1350 char* palette=malloc(4*256);
1351 int i; 1351 int i;
1352 for(i=0; i<256; i++){ 1352 for(i=0; i<256; i++){
1353 palette[4*i+0] = ((i >> 5) & 0x07) * 255 / 7; 1353 palette[4*i+0] = ((i >> 5) & 0x07) * 255 / 7;
1354 palette[4*i+1] = ((i >> 2) & 0x07) * 255 / 7; 1354 palette[4*i+1] = ((i >> 2) & 0x07) * 255 / 7;
1355 palette[4*i+2] = ((i >> 0) & 0x03) * 255 / 3; 1355 palette[4*i+2] = ((i >> 0) & 0x03) * 255 / 3;
1356 palette[4*i+3] = PC_NOCOLLAPSE; 1356 palette[4*i+3] = PC_NOCOLLAPSE;
1357 } 1357 }
1358 g_lpdd->lpVtbl->CreatePalette(g_lpdd,DDPCAPS_8BIT|DDPCAPS_INITIALIZE,palette,&ddpalette,NULL); 1358 g_lpdd->lpVtbl->CreatePalette(g_lpdd,DDPCAPS_8BIT|DDPCAPS_INITIALIZE,palette,&ddpalette,NULL);
1359 g_lpddsPrimary->lpVtbl->SetPalette(g_lpddsPrimary,ddpalette); 1359 g_lpddsPrimary->lpVtbl->SetPalette(g_lpddsPrimary,ddpalette);
1360 free(palette); 1360 free(palette);
1361 ddpalette->lpVtbl->Release(ddpalette); 1361 ddpalette->lpVtbl->Release(ddpalette);
1362 } 1362 }
1363 1363
1364 if (!nooverlay && Directx_CreateOverlay(image_format)) 1364 if (!nooverlay && Directx_CreateOverlay(image_format))
1365 { 1365 {
1366 if(format == primary_image_format)nooverlay=1; /*overlay creation failed*/ 1366 if(format == primary_image_format)nooverlay=1; /*overlay creation failed*/
1367 else { 1367 else {
1368 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't use overlay mode: please use -vo directx:noaccel\n"); 1368 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't use overlay mode: please use -vo directx:noaccel\n");
1369 return 1; 1369 return 1;
1370 } 1370 }
1371 } 1371 }
1372 if(nooverlay) 1372 if(nooverlay)
1373 { 1373 {
1374 if(Directx_CreateBackpuffer()) 1374 if(Directx_CreateBackpuffer())
1375 { 1375 {
1431 } else if (!strcmp(what, "saturation")) { 1431 } else if (!strcmp(what, "saturation")) {
1432 dcc.dwFlags = DDCOLOR_SATURATION; 1432 dcc.dwFlags = DDCOLOR_SATURATION;
1433 dcc.lSaturation = (value + 100) * 20000 / 200; 1433 dcc.lSaturation = (value + 100) * 20000 / 200;
1434 r = VO_TRUE; 1434 r = VO_TRUE;
1435 } 1435 }
1436 1436
1437 if (r == VO_TRUE) { 1437 if (r == VO_TRUE) {
1438 g_cc->lpVtbl->SetColorControls(g_cc, &dcc); 1438 g_cc->lpVtbl->SetColorControls(g_cc, &dcc);
1439 } 1439 }
1440 return r; 1440 return r;
1441 } 1441 }
1468 } else if (!strcmp(what, "saturation") && (dcc.dwFlags & DDCOLOR_SATURATION)) { 1468 } else if (!strcmp(what, "saturation") && (dcc.dwFlags & DDCOLOR_SATURATION)) {
1469 *value = dcc.lSaturation * 200 / 20000 - 100; 1469 *value = dcc.lSaturation * 200 / 20000 - 100;
1470 r = VO_TRUE; 1470 r = VO_TRUE;
1471 } 1471 }
1472 // printf("\n*** %s = %d\n", what, *value); 1472 // printf("\n*** %s = %d\n", what, *value);
1473 1473
1474 return r; 1474 return r;
1475 } 1475 }
1476 1476
1477 static int control(uint32_t request, void *data, ...) 1477 static int control(uint32_t request, void *data, ...)
1478 { 1478 {
1479 switch (request) { 1479 switch (request) {
1480 1480
1481 case VOCTRL_GET_IMAGE: 1481 case VOCTRL_GET_IMAGE:
1482 return get_image(data); 1482 return get_image(data);
1483 case VOCTRL_QUERY_FORMAT: 1483 case VOCTRL_QUERY_FORMAT:
1484 last_rect.left = 0xDEADC0DE; // reset window position cache 1484 last_rect.left = 0xDEADC0DE; // reset window position cache
1485 return query_format(*((uint32_t*)data)); 1485 return query_format(*((uint32_t*)data));
1556 else 1556 else
1557 { 1557 {
1558 vo_fs=0; 1558 vo_fs=0;
1559 ShowWindow(hWndFS,SW_HIDE); 1559 ShowWindow(hWndFS,SW_HIDE);
1560 ShowWindow(hWnd,SW_SHOW); 1560 ShowWindow(hWnd,SW_SHOW);
1561 } 1561 }
1562 last_rect.left = 0xDEADC0DE; // reset window position cache 1562 last_rect.left = 0xDEADC0DE; // reset window position cache
1563 Directx_ManageDisplay(); 1563 Directx_ManageDisplay();
1564 break; 1564 break;
1565 } 1565 }
1566 return VO_TRUE; 1566 return VO_TRUE;
1567 } 1567 }
1568 case VOCTRL_SET_EQUALIZER: { 1568 case VOCTRL_SET_EQUALIZER: {
1569 va_list ap; 1569 va_list ap;
1570 int value; 1570 int value;
1571 1571
1572 va_start(ap, data); 1572 va_start(ap, data);
1573 value = va_arg(ap, int); 1573 value = va_arg(ap, int);
1574 va_end(ap); 1574 va_end(ap);
1575 return color_ctrl_set(data, value); 1575 return color_ctrl_set(data, value);
1576 } 1576 }
1577 case VOCTRL_GET_EQUALIZER: { 1577 case VOCTRL_GET_EQUALIZER: {
1578 va_list ap; 1578 va_list ap;
1579 int *value; 1579 int *value;
1580 1580
1581 va_start(ap, data); 1581 va_start(ap, data);
1582 value = va_arg(ap, int*); 1582 value = va_arg(ap, int*);
1583 va_end(ap); 1583 va_end(ap);
1584 return color_ctrl_get(data, value); 1584 return color_ctrl_get(data, value);
1585 } 1585 }