]> git.sesse.net Git - vlc/blobdiff - plugins/beos/vout_beos.cpp
* Fixed the BeOS compile typo.
[vlc] / plugins / beos / vout_beos.cpp
index 4ebecdaf1cc562904e5e8328e7258d260af771e0..44fe4b304f9972ea7c2d6395baf6d87a2da577c7 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.26 2001/05/30 17:03:11 sam Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -120,21 +121,45 @@ BWindow *beos_GetAppWindow(char *name)
 
 int32 DrawingThread(void *data)
 {
-    VideoWindow *w;
-    w = (VideoWindow*) data;
+  VideoWindow *w;
+  w = (VideoWindow*) data;
     
-    while(!w->teardownwindow)
+  while(!w->teardownwindow)
+  {
+    if (w->Lock())
     {
-    w->Lock();
-       if( w->fDirty )
-            {
-               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);
-    }
-    return B_OK;
+      if( w->fDirty )
+      {
+        if(w->fUsingOverlay)
+        {
+          rgb_color key;
+           w->view->SetViewOverlay( w->bitmap[w->i_buffer_index],
+                                    w->bitmap[w->i_buffer_index]->Bounds(),
+                                    w->Bounds(),
+                                    &key,
+                                    B_FOLLOW_ALL,
+                                                   B_OVERLAY_FILTER_HORIZONTAL | B_OVERLAY_FILTER_VERTICAL
+                                                   | B_OVERLAY_TRANSFER_CHANNEL );
+           w->view->SetViewColor(key);
+         }
+         else
+         {
+           w->view->DrawBitmap( w->bitmap[w->i_buffer_index],
+                                w->bitmap[w->i_buffer_index]->Bounds(),
+                                w->Bounds());
+         }
+         
+         w->fDirty = false;
+       }
+     w->Unlock();
+   }
+   else  // we couldn't lock the window, it probably closed.
+     return B_ERROR;
+     
+   snooze (20000);
+ } // while
+
+  return B_OK;
 }
 
 /*****************************************************************************
@@ -150,18 +175,22 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
     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);
+       bitmap[1] = new BBitmap(Bounds(), B_BITMAP_WILL_OVERLAY, B_YCbCr422);
        fUsingOverlay = true;
-       i_screen_depth = 32;
+       i_screen_depth = 16;
        p_vout->b_YCbr = true;
        
-       if (bitmap[0]->InitCheck() != B_OK)
+       if ((bitmap[0]->InitCheck() != B_OK) || (bitmap[1]->InitCheck() != B_OK))
        {
                delete bitmap[0];
+               delete bitmap[1];
                p_vout->b_YCbr = false;
                fUsingOverlay = false;
                BScreen *screen;
@@ -187,14 +216,11 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
                        bitmap[1] = new BBitmap(Bounds(), B_RGB32);
                        i_screen_depth = 32;
                        }
-               memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength());
-               memset(bitmap[1]->Bits(), 0, bitmap[1]->BitsLength());
                SetTitle(VOUT_TITLE " (BBitmap output)");
         }
 
        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);
@@ -203,13 +229,15 @@ VideoWindow::VideoWindow(BRect frame, const char *name, vout_thread_t *p_video_o
                GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight); 
                SetSizeLimits((float) Bounds().IntegerWidth(), maxWidth, (float) Bounds().IntegerHeight(), maxHeight);
                }
-       else
+//     else
                {
        fDrawThreadID = spawn_thread(DrawingThread, "drawing_thread",
                     B_DISPLAY_PRIORITY, (void*) this);
        resume_thread(fDrawThreadID);
        }
 
+       memset(bitmap[0]->Bits(), 0, bitmap[0]->BitsLength());
+       memset(bitmap[1]->Bits(), 0, bitmap[1]->BitsLength());
        i_bytes_per_pixel = bitmap[0]->BytesPerRow()/bitmap[0]->Bounds().IntegerWidth();
     fRowBytes = bitmap[0]->BytesPerRow();
     fDirty = false;
@@ -222,13 +250,13 @@ VideoWindow::~VideoWindow()
 
     Hide();
     Sync();
-    if(!fUsingOverlay)
-       {
+//    if(!fUsingOverlay)
+//     {
            teardownwindow = true;
            wait_for_thread(fDrawThreadID, &result);
        delete bitmap[0];
        delete bitmap[1];
-       }
+//     }
  }
 
 
@@ -427,17 +455,33 @@ int vout_Init( vout_thread_t *p_vout )
     p_vout->p_sys->i_width =         p_vout->i_width;
     p_vout->p_sys->i_height =        p_vout->i_height;    
 
-    if(p_win->fUsingOverlay)
+/*    if(p_win->fUsingOverlay)
        {
-           vout_SetBuffers( p_vout, (byte_t *)p_win->bitmap[0]->Bits(),
+           if(p_win->bitmap[0] != NULL)
+               {
+                   p_vout->pf_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))
+               {
+               p_vout->pf_setbuffers( p_vout,
+                         (byte_t *)p_win->bitmap[0]->Bits(),
                         (byte_t *)p_win->bitmap[1]->Bits());
-       }
+               }
+       }*/
+           if((p_win->bitmap[0] != NULL) && (p_win->bitmap[1] != NULL))
+               {
+               p_vout->pf_setbuffers( p_vout,
+                         (byte_t *)p_win->bitmap[0]->Bits(),
+                        (byte_t *)p_win->bitmap[1]->Bits());
+               }
+    
     return( 0 );
 }
 
@@ -468,7 +512,44 @@ 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();
+               delete p_win->bitmap[0];
+               delete p_win->bitmap[1];
+               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);
+               p_win->bitmap[0] = new BBitmap(p_win->Bounds(),
+                                               B_BITMAP_WILL_OVERLAY, B_YCbCr422);
+                       memset(p_win->bitmap[0]->Bits(), 0, p_win->bitmap[0]->BitsLength());
+                       memset(p_win->bitmap[1]->Bits(), 0, p_win->bitmap[1]->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|B_OVERLAY_TRANSFER_CHANNEL);
+                       p_win->view->SetViewColor(key);
+                       p_win->Unlock();
+                   p_vout->pf_setbuffers( p_vout,
+                                 (byte_t *)p_win->bitmap[0]->Bits(),
+                                (byte_t *)p_win->bitmap[0]->Bits());
+                   delete p_win->bitmap[0];
+                   }
+           }
+return( 0 );
 }
 
 /*****************************************************************************
@@ -482,7 +563,10 @@ void vout_Display( vout_thread_t *p_vout )
     VideoWindow * p_win = p_vout->p_sys->p_window;
     
        p_win->i_buffer_index = p_vout->i_buffer_index;
-       p_vout->i_buffer_index = ++p_vout->i_buffer_index & 1;
+       if(p_win->fUsingOverlay)
+               p_vout->i_buffer_index = p_vout->i_buffer_index & 1;
+       else
+               p_vout->i_buffer_index = ++p_vout->i_buffer_index & 1;
     p_win->fDirty = true;
 }