]> git.sesse.net Git - vlc/commitdiff
- direct3d: fix for cropping, closes #1185
authorDamien Fouilleul <damienf@videolan.org>
Wed, 2 May 2007 17:30:25 +0000 (17:30 +0000)
committerDamien Fouilleul <damienf@videolan.org>
Wed, 2 May 2007 17:30:25 +0000 (17:30 +0000)
modules/video_output/directx/direct3d.c
modules/video_output/directx/events.c

index 797c90bdb0408d274f3865694752a08abe7dae83..dfb56bec6bf8db7e7b3a0ceedc31f736ef58bc7c 100644 (file)
@@ -404,7 +404,8 @@ static int Manage( vout_thread_t *p_vout )
 
             SetWindowPos( p_vout->p_sys->hwnd, 0, 0, 0,
                           rect_parent.right - rect_parent.left,
-                          rect_parent.bottom - rect_parent.top, 0 );
+                          rect_parent.bottom - rect_parent.top,
+                          SWP_NOZORDER );
         }
     }
     else
@@ -624,7 +625,9 @@ static void Display( vout_thread_t *p_vout, picture_t *p_pic )
     LPDIRECT3DDEVICE9       p_d3ddev = p_vout->p_sys->p_d3ddev;
     // Present the back buffer contents to the display
     // stretching and filtering happens here
-    HRESULT hr = IDirect3DDevice9_Present(p_d3ddev, NULL, NULL, NULL, NULL);
+    HRESULT hr = IDirect3DDevice9_Present(p_d3ddev,
+                    &(p_vout->p_sys->rect_src_clipped),
+                    NULL, NULL, NULL);
     if( FAILED(hr) )
         msg_Dbg( p_vout, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
 }
@@ -643,7 +646,7 @@ static void FirstDisplay( vout_thread_t *p_vout, picture_t *p_pic )
     ** Video window is initially hidden, show it now since we got a 
     ** picture to show.
     */
-    SetWindowPos( p_vout->p_sys->hvideownd, NULL, 0, 0, 0, 0, 
+    SetWindowPos( p_vout->p_sys->hvideownd, 0, 0, 0, 0, 0, 
         SWP_ASYNCWINDOWPOS|
         SWP_FRAMECHANGED|
         SWP_SHOWWINDOW|
@@ -754,7 +757,7 @@ static int Direct3DFillPresentationParameters(vout_thread_t *p_vout, D3DPRESENT_
     d3dpp->hDeviceWindow          = p_vout->p_sys->hvideownd;
     d3dpp->BackBufferWidth        = p_vout->output.i_width;
     d3dpp->BackBufferHeight       = p_vout->output.i_height;
-    d3dpp->SwapEffect             = D3DSWAPEFFECT_DISCARD;
+    d3dpp->SwapEffect             = D3DSWAPEFFECT_COPY;
     d3dpp->MultiSampleType        = D3DMULTISAMPLE_NONE;
     d3dpp->PresentationInterval   = D3DPRESENT_INTERVAL_DEFAULT;
     d3dpp->BackBufferFormat       = d3ddm.Format;
@@ -911,7 +914,7 @@ static D3DFORMAT Direct3DVoutSelectFormat( vout_thread_t *p_vout, D3DFORMAT targ
     return D3DFMT_UNKNOWN;
 }
 
-D3DFORMAT Direct3DVoutFindFormat(vout_thread_t *p_vout, int i_chroma, D3DFORMAT target)
+static D3DFORMAT Direct3DVoutFindFormat(vout_thread_t *p_vout, int i_chroma, D3DFORMAT target)
 {
     if( p_vout->p_sys->b_hw_yuv && ! _got_vista_or_above )
     {
index 6fd7a689b6171999505508334ab64a67bf286aa1..7879cbf0ea002a87521e4474e8814fcead66759b 100644 (file)
@@ -630,8 +630,9 @@ void E_(DirectXUpdateRects)( vout_thread_t *p_vout, vlc_bool_t b_force )
                        &i_x, &i_y, &i_width, &i_height );
 
     if( p_vout->p_sys->hvideownd )
-        SetWindowPos( p_vout->p_sys->hvideownd, HWND_TOP,
-                      i_x, i_y, i_width, i_height, 0 );
+        SetWindowPos( p_vout->p_sys->hvideownd, 0,
+                      i_x, i_y, i_width, i_height,
+                      SWP_NOCOPYBITS|SWP_NOZORDER|SWP_ASYNCWINDOWPOS );
 
     /* Destination image position and dimensions */
     rect_dest.left = point.x + i_x;
@@ -653,7 +654,6 @@ void E_(DirectXUpdateRects)( vout_thread_t *p_vout, vlc_bool_t b_force )
                 p_vout->p_sys->i_align_dest_size / 2 ) & 
                 ~p_vout->p_sys->i_align_dest_size) + rect_dest.left;
     }
-#endif
 
     /* UpdateOverlay directdraw function doesn't automatically clip to the
      * display size so we need to do it otherwise it will fail */
@@ -680,6 +680,12 @@ void E_(DirectXUpdateRects)( vout_thread_t *p_vout, vlc_bool_t b_force )
         SetRectEmpty( &rect_src_clipped );
         return;
     }
+#else /* MODULE_NAME_IS_vout_directx */
+
+    /* AFAIK, there are no clipping constraints in Direct3D or OpenGL */
+    rect_dest_clipped = rect_dest;
+
+#endif
 
     /* src image dimensions */
     rect_src.left = 0;
@@ -727,6 +733,7 @@ void E_(DirectXUpdateRects)( vout_thread_t *p_vout, vlc_bool_t b_force )
                      rect_src_clipped.right, rect_src_clipped.bottom );
 #endif
 
+#ifdef MODULE_NAME_IS_vout_directx
     /* The destination coordinates need to be relative to the current
      * directdraw primary surface (display) */
     rect_dest_clipped.left -= p_vout->p_sys->rect_display.left;
@@ -734,7 +741,6 @@ void E_(DirectXUpdateRects)( vout_thread_t *p_vout, vlc_bool_t b_force )
     rect_dest_clipped.top -= p_vout->p_sys->rect_display.top;
     rect_dest_clipped.bottom -= p_vout->p_sys->rect_display.top;
 
-#ifdef MODULE_NAME_IS_vout_directx
     if( p_vout->p_sys->b_using_overlay )
         E_(DirectXUpdateOverlay)( p_vout );
 #endif
@@ -796,7 +802,7 @@ static long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message,
         {
 #ifdef MODULE_NAME_IS_vout_directx
         case WM_ERASEBKGND:
-            /* For overlay, we need to erase background */
+        /* For overlay, we need to erase background */
             return !p_vout->p_sys->b_using_overlay ?
                 1 : DefWindowProc(hwnd, message, wParam, lParam);
         case WM_PAINT: