]> git.sesse.net Git - vlc/blobdiff - plugins/beos/vout_beos.cpp
Language & Inteface support for BeOS interface
[vlc] / plugins / beos / vout_beos.cpp
index 1106b36cb721616e5b9c20ba512bb2ec4ab60dea..f9fbfd0c4cd7a1c0995111114761c6dab4cd3635 100644 (file)
@@ -2,6 +2,7 @@
  * vout_beos.cpp: beos video output display method
  *****************************************************************************
  * Copyright (C) 2000, 2001 VideoLAN
+ * $Id: vout_beos.cpp,v 1.23 2001/03/25 17:09:14 richards Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -128,9 +129,8 @@ int32 DrawingThread(void *data)
     w->Lock();
        if( w->fDirty )
             {
-              if(!w->fUsingOverlay)
-               w->view->DrawBitmap(w->bitmap[w->i_buffer_index], w->bitmap[w->i_buffer_index]->Bounds(), w->Bounds());
-              w->fDirty = false;
+               w->view->DrawBitmap(w->bitmap[w->i_buffer_index], w->bitmap[w->i_buffer_index]->Bounds(), w->Bounds());
+            w->fDirty = false;
             }
     w->Unlock();
        snooze(20000);
@@ -150,13 +150,16 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
     teardownwindow = false;
     is_zoomed = false;
     p_vout = p_video_output;
-
+       fDrawThreadID = NULL;
+       bitmap[0] = NULL;
+       bitmap[1] = NULL;
+       
     rect = Frame();
     view = new VLCView(Bounds());
     AddChild(view);
        bitmap[0] = new BBitmap(Bounds(), B_BITMAP_WILL_OVERLAY|B_BITMAP_RESERVE_OVERLAY_CHANNEL, B_YCbCr422);
        fUsingOverlay = true;
-       i_screen_depth = 32;
+       i_screen_depth = 16;
        p_vout->b_YCbr = true;
        
        if (bitmap[0]->InitCheck() != B_OK)
@@ -194,7 +197,6 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
 
        if(fUsingOverlay)
                {
-               memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength());
                rgb_color key;
                view->SetViewOverlay(bitmap[0], bitmap[0]->Bounds(), Bounds(), &key, B_FOLLOW_ALL,
                                B_OVERLAY_FILTER_HORIZONTAL|B_OVERLAY_FILTER_VERTICAL);
@@ -202,14 +204,18 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
                SetTitle(VOUT_TITLE " (Overlay output)");
                GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight); 
                SetSizeLimits((float) Bounds().IntegerWidth(), maxWidth, (float) Bounds().IntegerHeight(), maxHeight);
+               memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength());
                }
+       else
+               {
+       fDrawThreadID = spawn_thread(DrawingThread, "drawing_thread",
+                    B_DISPLAY_PRIORITY, (void*) this);
+       resume_thread(fDrawThreadID);
+       }
 
        i_bytes_per_pixel = bitmap[0]->BytesPerRow()/bitmap[0]->Bounds().IntegerWidth();
     fRowBytes = bitmap[0]->BytesPerRow();
     fDirty = false;
-    fDrawThreadID = spawn_thread(DrawingThread, "drawing_thread",
-                    B_DISPLAY_PRIORITY, (void*) this);
-    resume_thread(fDrawThreadID);
     Show();
 }
 
@@ -219,9 +225,10 @@ VideoWindow::~VideoWindow()
 
     Hide();
     Sync();
-    wait_for_thread(fDrawThreadID, &result);
     if(!fUsingOverlay)
        {
+           teardownwindow = true;
+           wait_for_thread(fDrawThreadID, &result);
        delete bitmap[0];
        delete bitmap[1];
        }
@@ -425,14 +432,21 @@ int vout_Init( vout_thread_t *p_vout )
 
     if(p_win->fUsingOverlay)
        {
-           vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+           if(p_win->bitmap[0] != NULL)
+               {
+                   vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
                         (byte_t *)p_win->bitmap[0]->Bits());
-       delete p_win->bitmap[0];
+               delete p_win->bitmap[0];
+               p_win->bitmap[0] = NULL;
+               }
        }
     else
                {
-           vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+           if((p_win->bitmap[0] != NULL) && (p_win->bitmap[1] != NULL))
+               {
+               vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
                         (byte_t *)p_win->bitmap[1]->Bits());
+               }
        }
     return( 0 );
 }
@@ -464,7 +478,38 @@ void vout_Destroy( vout_thread_t *p_vout )
  *****************************************************************************/
 int vout_Manage( vout_thread_t *p_vout )
 {
-   return( 0 );
+VideoWindow * p_win = p_vout->p_sys->p_window;
+rgb_color key;
+float minWidth, minHeight, maxWidth, maxHeight; 
+
+if( (p_vout->i_width  != p_vout->p_sys->i_width) ||
+             (p_vout->i_height != p_vout->p_sys->i_height) )
+    {
+        /* If video output size has changed, change interface window size */
+        intf_DbgMsg( "resizing output window" );
+        if(p_win->fUsingOverlay)
+               {
+               p_win->Lock();
+               p_win->view->ClearViewOverlay();
+               p_vout->p_sys->i_width =    p_vout->i_width;
+               p_vout->p_sys->i_height =   p_vout->i_height;;
+                       p_win->GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight); 
+                       p_win->SetSizeLimits((float) p_vout->p_sys->i_width, maxWidth, (float) p_vout->p_sys->i_height, maxHeight);       
+               p_win->ResizeTo(p_vout->p_sys->i_width, p_vout->p_sys->i_height);
+               p_win->bitmap[0] = new BBitmap(p_win->Bounds(),
+                                               B_BITMAP_WILL_OVERLAY|B_BITMAP_RESERVE_OVERLAY_CHANNEL,
+                                               B_YCbCr422);
+                       memset(p_win->bitmap[0]->Bits(), 0, p_win->bitmap[0]->BitsLength());
+                       p_win->view->SetViewOverlay(p_win->bitmap[0], p_win->bitmap[0]->Bounds(), p_win->Bounds(), &key, B_FOLLOW_ALL,
+                                       B_OVERLAY_FILTER_HORIZONTAL|B_OVERLAY_FILTER_VERTICAL);
+                       p_win->view->SetViewColor(key);
+                       p_win->Unlock();
+                   vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+                                (byte_t *)p_win->bitmap[0]->Bits());
+                   delete p_win->bitmap[0];
+                   }
+           }
+return( 0 );
 }
 
 /*****************************************************************************
@@ -496,7 +541,7 @@ void vout_Display( vout_thread_t *p_vout )
 static int BeosOpenDisplay( vout_thread_t *p_vout )
 { 
     p_vout->p_sys->p_window =
-        new VideoWindow(  BRect( 50, 150, 50+p_vout->i_width-1, 150+p_vout->i_height-1 ), NULL, p_vout );
+        new VideoWindow(  BRect( 80, 50, 80+p_vout->i_width-1, 50+p_vout->i_height-1 ), NULL, p_vout );
     if( p_vout->p_sys->p_window == 0 )
     {
         free( p_vout->p_sys );