/***************************************************************************** * VideoWindow::FrameResized *****************************************************************************/ void VideoWindow::FrameResized( float width, float height ) { int32_t useWidth = CorrectAspectRatio() ? i_width : fTrueWidth; int32_t useHeight = CorrectAspectRatio() ? i_height : fTrueHeight; float out_width, out_height; float out_left, out_top; float width_scale = width / useWidth; float height_scale = height / useHeight; if (width_scale <= height_scale) { out_width = (useWidth * width_scale); out_height = (useHeight * width_scale); out_left = 0; out_top = (height - out_height) / 2; } else /* if the height is proportionally smaller */ { out_width = (useWidth * height_scale); out_height = (useHeight * height_scale); out_top = 0; out_left = (width - out_width) / 2; } view->MoveTo(out_left,out_top); view->ResizeTo(out_width, out_height); if (!IsFullScreen()) winSize = Frame(); }
void DrawDevice::UpdateDestinationRect() { RECT rcClient; RECT rcSrc = { 0, 0, m_width, m_height }; GetClientRect(m_hwnd, &rcClient); rcSrc = CorrectAspectRatio(rcSrc, m_PixelAR); m_rcDest = LetterBoxRect(rcSrc, rcClient); }
/***************************************************************************** * VideoWindow::SetCorrectAspectRatio *****************************************************************************/ void VideoWindow::SetCorrectAspectRatio(bool doIt) { if (CorrectAspectRatio() != doIt) { if (doIt) fSettings->AddFlags(VideoSettings::FLAG_CORRECT_RATIO); else fSettings->ClearFlags(VideoSettings::FLAG_CORRECT_RATIO); FrameResized(Bounds().Width(), Bounds().Height()); } }
/***************************************************************************** * VideoWindow::_SetVideoSize *****************************************************************************/ void VideoWindow::_SetVideoSize(uint32_t mode) { // let size depend on aspect correction int32_t width = CorrectAspectRatio() ? i_width : fTrueWidth; int32_t height = CorrectAspectRatio() ? i_height : fTrueHeight; switch (mode) { case RESIZE_50: width /= 2; height /= 2; break; case RESIZE_200: width *= 2; height *= 2; break; case RESIZE_100: default: break; } fSettings->ClearFlags(VideoSettings::FLAG_FULL_SCREEN); ResizeTo(width, height); }
/***************************************************************************** * VideoWindow::MessageReceived *****************************************************************************/ void VideoWindow::MessageReceived( BMessage *p_message ) { switch( p_message->what ) { case SHOW_INTERFACE: SetInterfaceShowing( true ); break; case TOGGLE_FULL_SCREEN: BWindow::Zoom(); break; case RESIZE_50: case RESIZE_100: case RESIZE_200: if (IsFullScreen()) BWindow::Zoom(); _SetVideoSize(p_message->what); break; case VERT_SYNC: SetSyncToRetrace(!IsSyncedToRetrace()); break; case WINDOW_FEEL: { window_feel winFeel; if (p_message->FindInt32("WinFeel", (int32*)&winFeel) == B_OK) { SetFeel(winFeel); fCachedFeel = winFeel; if (winFeel == B_FLOATING_ALL_WINDOW_FEEL) fSettings->AddFlags(VideoSettings::FLAG_ON_TOP_ALL); else fSettings->ClearFlags(VideoSettings::FLAG_ON_TOP_ALL); } } break; case ASPECT_CORRECT: SetCorrectAspectRatio(!CorrectAspectRatio()); break; case B_KEY_DOWN: case B_UNMAPPED_KEY_DOWN: case B_KEY_UP: case B_UNMAPPED_KEY_UP: { key_map * keys; char * chars; int32 key, modifiers; if( p_message->FindInt32( "key", &key ) != B_OK || p_message->FindInt32( "modifiers", &modifiers ) != B_OK ) { /* Shouldn't happen */ break; } if( ( p_message->what == B_KEY_UP || p_message->what == B_UNMAPPED_KEY_UP ) && !( modifiers & B_COMMAND_KEY ) ) { /* We only use the KEY_UP messages to detect Alt+X shortcuts (because the KEY_DOWN messages aren't sent when Alt is pressed) */ break; } /* Special case for Alt+1, Alt+2 and Alt+3 shortcuts: since the character depends on the keymap, we use the key codes directly (18, 19, 20) */ if( ( modifiers & B_COMMAND_KEY ) && key >= 18 && key <= 20 ) { if( key == 18 ) PostMessage( RESIZE_50 ); else if( key == 19 ) PostMessage( RESIZE_100 ); else PostMessage( RESIZE_200 ); break; } /* Get the current keymap */ get_key_map( &keys, &chars ); if( key >= 128 || chars[keys->normal_map[key]] != 1 ) { /* Weird key or Unicode character */ free( keys ); free( chars ); break; } vlc_value_t val; val.i_int = ConvertKeyToVLC( chars[keys->normal_map[key]+1] ); if( modifiers & B_COMMAND_KEY ) { val.i_int |= KEY_MODIFIER_ALT; } if( modifiers & B_SHIFT_KEY ) { val.i_int |= KEY_MODIFIER_SHIFT; } if( modifiers & B_CONTROL_KEY ) { val.i_int |= KEY_MODIFIER_CTRL; } var_Set( p_vout->p_libvlc, "key-pressed", val ); free( keys ); free( chars ); break; } default: BWindow::MessageReceived( p_message ); break; } }