X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plugins%2Fbeos%2Fvout_beos.cpp;h=7f646a9ae50a58e82e367708b8f9da8a19f5c584;hb=a53dd0f3eb2d0174ead98ca0e3191daf6ee2a775;hp=3713e8a2b36a163bd544a9115dd69851302ac12d;hpb=9e29e24f598143ff60c26dcc8a51a555d2d3ebe7;p=vlc diff --git a/plugins/beos/vout_beos.cpp b/plugins/beos/vout_beos.cpp index 3713e8a2b3..7f646a9ae5 100644 --- a/plugins/beos/vout_beos.cpp +++ b/plugins/beos/vout_beos.cpp @@ -2,6 +2,7 @@ * vout_beos.cpp: beos video output display method ***************************************************************************** * Copyright (C) 2000, 2001 VideoLAN + * $Id: vout_beos.cpp,v 1.24 2001/04/02 22:40:07 richards Exp $ * * Authors: Jean-Marc Dressler * Samuel Hocevar @@ -128,7 +129,15 @@ int32 DrawingThread(void *data) w->Lock(); if( w->fDirty ) { - w->view->DrawBitmap(w->bitmap[w->i_buffer_index], w->bitmap[w->i_buffer_index]->Bounds(), w->Bounds()); + 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(); @@ -150,18 +159,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 +200,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 +213,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,12 +234,13 @@ VideoWindow::~VideoWindow() Hide(); Sync(); - if(!fUsingOverlay) - { +// if(!fUsingOverlay) +// { + teardownwindow = true; wait_for_thread(fDrawThreadID, &result); delete bitmap[0]; delete bitmap[1]; - } +// } } @@ -426,17 +439,30 @@ 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) + { + 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()); - } + } + }*/ + 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 ); } @@ -467,7 +493,43 @@ 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(); + 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 ); } /***************************************************************************** @@ -481,7 +543,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; } @@ -499,7 +564,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 );