diff --git a/aegisub/changelog.txt b/aegisub/changelog.txt index 92758ea5a..fc7fef6f4 100644 --- a/aegisub/changelog.txt +++ b/aegisub/changelog.txt @@ -97,6 +97,7 @@ Please visit http://aegisub.net to download latest version - Added an audio clip export by right clicking on a line. (Dansolo) - Added a clear button for shifting history. (Dansolo) - Fixed Custom Aspect Ratio input. (Dansolo) +- Made the video display detachable. (AMZ) = 1.10 beta - 2006.08.07 =========================== diff --git a/aegisub/dialog_detached_video.cpp b/aegisub/dialog_detached_video.cpp index 3b7f43af3..654fea524 100644 --- a/aegisub/dialog_detached_video.cpp +++ b/aegisub/dialog_detached_video.cpp @@ -40,6 +40,7 @@ #include "dialog_detached_video.h" #include "video_box.h" #include "video_context.h" +#include "video_display.h" #include "frame_main.h" @@ -56,11 +57,13 @@ DialogDetachedVideo::DialogDetachedVideo(FrameMain *par) // Video area; videoBox = new VideoBox(panel); + videoBox->videoDisplay->freeSize = true; // Set sizer wxSizer *mainSizer = new wxBoxSizer(wxVERTICAL); mainSizer->Add(videoBox,1,wxEXPAND | wxALL,5); panel->SetSizer(mainSizer); + mainSizer->SetSizeHints(this); // Update parent->SetDisplayMode(0,-1); diff --git a/aegisub/frame_main.cpp b/aegisub/frame_main.cpp index 60ff99525..c4364a822 100644 --- a/aegisub/frame_main.cpp +++ b/aegisub/frame_main.cpp @@ -499,7 +499,7 @@ void FrameMain::DeInitContents() { // Update toolbar void FrameMain::UpdateToolbar() { // Collect flags - bool isVideo = showVideo; + bool isVideo = VideoContext::Get()->IsLoaded(); HasSelection = true; int selRows = SubsBox->GetNumberSelection(); @@ -838,7 +838,7 @@ void FrameMain::SynchronizeProject(bool fromSubs) { if (curSubsVideo != _T("")) { LoadVideo(curSubsVideo); if (VideoContext::Get()->IsLoaded()) { - videoBox->videoDisplay->SetAspectRatio(videoAr,videoArValue); + VideoContext::Get()->SetAspectRatio(videoAr,videoArValue); videoBox->videoDisplay->SetZoomPos(videoZoom-1); VideoContext::Get()->JumpToFrame(videoPos); } @@ -901,8 +901,8 @@ void FrameMain::SynchronizeProject(bool fromSubs) { seekpos = wxString::Format(_T("%i"),videoBox->videoDisplay->ControlSlider->GetValue()); zoom = wxString::Format(_T("%i"),videoBox->videoDisplay->zoomBox->GetSelection()+1); - int arType = videoBox->videoDisplay->GetAspectRatioType(); - if (arType == 4) ar = wxString(_T("c")) + FloatToString(videoBox->videoDisplay->GetAspectRatioValue()); + int arType = VideoContext::Get()->GetAspectRatioType(); + if (arType == 4) ar = wxString(_T("c")) + FloatToString(VideoContext::Get()->GetAspectRatioValue()); else ar = wxString::Format(_T("%i"),arType); } diff --git a/aegisub/frame_main_events.cpp b/aegisub/frame_main_events.cpp index 7991a41f8..b106d0796 100644 --- a/aegisub/frame_main_events.cpp +++ b/aegisub/frame_main_events.cpp @@ -298,7 +298,7 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) { MenuBar->Enable(Menu_Video_Save_Keyframes,VideoContext::Get()->KeyFramesLoaded()); // Set AR radio - int arType = videoBox->videoDisplay->GetAspectRatioType(); + int arType = VideoContext::Get()->GetAspectRatioType(); MenuBar->Check(Menu_Video_AR_Default,false); MenuBar->Check(Menu_Video_AR_Full,false); MenuBar->Check(Menu_Video_AR_Wide,false); @@ -1191,7 +1191,7 @@ void FrameMain::OnReplace(wxCommandEvent &event) { // Change aspect ratio to default void FrameMain::OnSetARDefault (wxCommandEvent &event) { VideoContext::Get()->Stop(); - videoBox->videoDisplay->SetAspectRatio(0); + VideoContext::Get()->SetAspectRatio(0); SetDisplayMode(-1,-1); } @@ -1200,7 +1200,7 @@ void FrameMain::OnSetARDefault (wxCommandEvent &event) { // Change aspect ratio to fullscreen void FrameMain::OnSetARFull (wxCommandEvent &event) { VideoContext::Get()->Stop(); - videoBox->videoDisplay->SetAspectRatio(1); + VideoContext::Get()->SetAspectRatio(1); SetDisplayMode(-1,-1); } @@ -1209,7 +1209,7 @@ void FrameMain::OnSetARFull (wxCommandEvent &event) { // Change aspect ratio to widescreen void FrameMain::OnSetARWide (wxCommandEvent &event) { VideoContext::Get()->Stop(); - videoBox->videoDisplay->SetAspectRatio(2); + VideoContext::Get()->SetAspectRatio(2); SetDisplayMode(-1,-1); } @@ -1218,7 +1218,7 @@ void FrameMain::OnSetARWide (wxCommandEvent &event) { // Change aspect ratio to 2:35 void FrameMain::OnSetAR235 (wxCommandEvent &event) { VideoContext::Get()->Stop(); - videoBox->videoDisplay->SetAspectRatio(3); + VideoContext::Get()->SetAspectRatio(3); SetDisplayMode(-1,-1); } @@ -1229,7 +1229,7 @@ void FrameMain::OnSetARCustom (wxCommandEvent &event) { // Get text VideoContext::Get()->Stop(); - wxString value = wxGetTextFromUser(_("Enter aspect ratio in either decimal (e.g. 2.35) or fractional (e.g. 16:9) form. Enter a value like 853x480 to set a specific resolution."),_("Enter aspect ratio"),FloatToString(videoBox->videoDisplay->GetAspectRatioValue())); + wxString value = wxGetTextFromUser(_("Enter aspect ratio in either decimal (e.g. 2.35) or fractional (e.g. 16:9) form. Enter a value like 853x480 to set a specific resolution."),_("Enter aspect ratio"),FloatToString(VideoContext::Get()->GetAspectRatioValue())); if (value.IsEmpty()) return; value.MakeLower(); @@ -1268,7 +1268,7 @@ void FrameMain::OnSetARCustom (wxCommandEvent &event) { // Set value else { - videoBox->videoDisplay->SetAspectRatio(4,numval); + VideoContext::Get()->SetAspectRatio(4,numval); SetDisplayMode(-1,-1); } } diff --git a/aegisub/video_context.cpp b/aegisub/video_context.cpp index 185fb545b..1dd207a89 100644 --- a/aegisub/video_context.cpp +++ b/aegisub/video_context.cpp @@ -103,6 +103,8 @@ VideoContext::VideoContext() { keyFramesLoaded = false; overKeyFramesLoaded = false; frame_n = 0; + arType = 0; + arValue = 1.0; isPlaying = false; threaded = Options.AsBool(_T("Threaded Video")); nextFrame = -1; @@ -415,7 +417,7 @@ GLuint VideoContext::GetFrameAsTexture(int n) { // Set context GetGLContext(displayList.front())->SetCurrent(*displayList.front()); glEnable(GL_TEXTURE_2D); - if (glGetError() != 0) throw _T("Error enabling texturing."); + if (glGetError() != 0) throw _T("Error enabling texture."); if (lastTex == 0) { // Enable @@ -700,3 +702,29 @@ bool VideoContext::OverKeyFramesLoaded() { bool VideoContext::KeyFramesLoaded() { return overKeyFramesLoaded || keyFramesLoaded; } + + +////////////////////////// +// Calculate aspect ratio +double VideoContext::GetARFromType(int type) { + if (type == 0) return (double)VideoContext::Get()->GetWidth()/(double)VideoContext::Get()->GetHeight(); + if (type == 1) return 4.0/3.0; + if (type == 2) return 16.0/9.0; + if (type == 3) return 2.35; + return 1.0; //error +} + + +///////////////////// +// Sets aspect ratio +void VideoContext::SetAspectRatio(int _type, double value) { + // Get value + if (_type != 4) value = GetARFromType(_type); + if (value < 0.5) value = 0.5; + if (value > 5.0) value = 5.0; + + // Set + arType = _type; + arValue = value; + UpdateDisplays(true); +} diff --git a/aegisub/video_context.h b/aegisub/video_context.h index 7939ee95f..356d4b8ec 100644 --- a/aegisub/video_context.h +++ b/aegisub/video_context.h @@ -102,6 +102,9 @@ private: int length; double fps; + double arValue; + int arType; + void UnloadTexture(); void OnPlayTimer(wxTimerEvent &event); @@ -139,6 +142,11 @@ public: double GetFPS() { return fps; } void SetFPS(double _fps) { fps = _fps; } + double GetARFromType(int type); + void SetAspectRatio(int type,double value=1.0); + int GetAspectRatioType() { return arType; } + double GetAspectRatioValue() { return arValue; } + void SetVideo(const wxString &filename); void Reset(); diff --git a/aegisub/video_display.cpp b/aegisub/video_display.cpp index 38ec4ecc8..0bc3e1dbd 100644 --- a/aegisub/video_display.cpp +++ b/aegisub/video_display.cpp @@ -103,9 +103,8 @@ VideoDisplay::VideoDisplay(wxWindow* parent, wxWindowID id, const wxPoint& pos, ControlSlider = NULL; PositionDisplay = NULL; origSize = size; - arType = 0; - arValue = 1.0; zoomValue = 1.0; + freeSize = false; visual = new VideoDisplayVisual(this); tracker = NULL; #if USE_FEXTRACKER == 1 @@ -143,11 +142,39 @@ void VideoDisplay::Render() { pw = context->GetWidth(); ph = context->GetHeight(); + // Freesized transform + dx1 = 0; + dy1 = 0; + dx2 = w; + dy2 = h; + if (freeSize) { + glClearColor(0,0,0,0); + glClear(GL_COLOR_BUFFER_BIT); + float thisAr = float(w)/float(h); + float vidAr; + if (context->GetAspectRatioType() == 0) vidAr = float(pw)/float(ph); + else vidAr = context->GetAspectRatioValue(); + + // Window is wider than video, blackbox left/right + if (thisAr - vidAr > 0.01f) { + int delta = (w-vidAr*h); + dx1 += delta/2; + dx2 -= delta; + } + + // Video is wider than window, blackbox top/bottom + else if (vidAr - thisAr > 0.01f) { + int delta = (h-w/vidAr); + dy1 += delta/2; + dy2 -= delta; + } + } + // Set viewport glEnable(GL_TEXTURE_2D); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glViewport(0,0,w,h); + glViewport(dx1,dy1,dx2,dy2); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0f,sw,sh,0.0f,-1000.0f,1000.0f); @@ -209,13 +236,17 @@ void VideoDisplay::Render() { /////////////// // Update size void VideoDisplay::UpdateSize() { + // Free size? + if (freeSize) return; + // Loaded? - if (!VideoContext::Get()->IsLoaded()) return; + VideoContext *con = VideoContext::Get(); + if (!con->IsLoaded()) return; // Get size - if (arType == 0) w = VideoContext::Get()->GetWidth() * zoomValue; - else w = VideoContext::Get()->GetHeight() * zoomValue * arValue; - h = VideoContext::Get()->GetHeight() * zoomValue; + if (con->GetAspectRatioType() == 0) w = con->GetWidth() * zoomValue; + else w = con->GetHeight() * zoomValue * con->GetAspectRatioValue(); + h = con->GetHeight() * zoomValue; int _w,_h; // Set the size for this control @@ -330,32 +361,6 @@ void VideoDisplay::SetZoomPos(int value) { } -////////////////////////// -// Calculate aspect ratio -double VideoDisplay::GetARFromType(int type) { - if (type == 0) return (double)VideoContext::Get()->GetWidth()/(double)VideoContext::Get()->GetHeight(); - if (type == 1) return 4.0/3.0; - if (type == 2) return 16.0/9.0; - if (type == 3) return 2.35; - return 1.0; //error -} - - -///////////////////// -// Sets aspect ratio -void VideoDisplay::SetAspectRatio(int _type, double value) { - // Get value - if (_type != 4) value = GetARFromType(_type); - if (value < 0.5) value = 0.5; - if (value > 5.0) value = 5.0; - - // Set - arType = _type; - arValue = value; - UpdateSize(); -} - - //////////////////////////// // Updates position display void VideoDisplay::UpdatePositionDisplay() { @@ -478,3 +483,12 @@ void VideoDisplay::DrawText( wxPoint Pos, wxString text ) { //dc.DrawText(text,Pos.x,Pos.y); } + +///////////////////////////// +// Convert mouse coordinates +void VideoDisplay::ConvertMouseCoords(int &x,int &y) { + int w,h; + GetClientSize(&w,&h); + x = (x-dx1)*w/dx2; + y = (y-dy1)*h/dy2; +} diff --git a/aegisub/video_display.h b/aegisub/video_display.h index 5344bf806..875e9f1d8 100644 --- a/aegisub/video_display.h +++ b/aegisub/video_display.h @@ -69,6 +69,7 @@ class VideoDisplay: public wxGLCanvas { private: wxSize origSize; int w,h; + int dx1,dx2,dy1,dy2; void OnPaint(wxPaintEvent& event); void OnKey(wxKeyEvent &event); @@ -85,9 +86,8 @@ public: VideoDisplayFexTracker *tracker; VideoBox *box; - double arValue; - int arType; double zoomValue; + bool freeSize; VideoSlider *ControlSlider; wxComboBox *zoomBox; @@ -100,6 +100,7 @@ public: void Render(); + void ConvertMouseCoords(int &x,int &y); void DrawText(wxPoint Pos, wxString Text); void UpdatePositionDisplay(); void UpdateSize(); @@ -107,11 +108,6 @@ public: void SetZoomPos(int pos); void UpdateSubsRelativeTime(); - double GetARFromType(int type); - void SetAspectRatio(int type,double value=1.0); - int GetAspectRatioType() { return arType; } - double GetAspectRatioValue() { return arValue; } - DECLARE_EVENT_TABLE() }; diff --git a/aegisub/video_display_visual.cpp b/aegisub/video_display_visual.cpp index 7878fd7ca..28159e23a 100644 --- a/aegisub/video_display_visual.cpp +++ b/aegisub/video_display_visual.cpp @@ -745,14 +745,13 @@ void VideoDisplayVisual::OnMouseEvent (wxMouseEvent &event) { // Coords int x = event.GetX(); int y = event.GetY(); + parent->ConvertMouseCoords(x,y); int w,h; parent->GetClientSize(&w,&h); int orgx = -1; int orgy = -1; int sw,sh; VideoContext::Get()->GetScriptSize(sw,sh); - int mx = x * VideoContext::Get()->GetWidth() / w; - int my = y * VideoContext::Get()->GetHeight() / h; int frame_n = VideoContext::Get()->GetFrameN(); SubtitlesGrid *grid = VideoContext::Get()->grid; bool hasOverlay = false;