diff --git a/aegisub/video_context.cpp b/aegisub/video_context.cpp index 7d85a63f0..e708c55c6 100644 --- a/aegisub/video_context.cpp +++ b/aegisub/video_context.cpp @@ -405,7 +405,7 @@ wxGLContext *VideoContext::GetGLContext(wxGLCanvas *canvas) { //////////////////////// // Requests a new frame -AegiVideoFrame VideoContext::GetFrame(int n) { +AegiVideoFrame VideoContext::GetFrame(int n,bool raw) { // Current frame if -1 if (n == -1) n = frame_n; @@ -426,7 +426,7 @@ AegiVideoFrame VideoContext::GetFrame(int n) { } // Raster subtitles if available/necessary - if (subsProvider && subsProvider->CanRaster()) { + if (!raw && subsProvider && subsProvider->CanRaster()) { tempFrame.CopyFrom(*srcFrame); subsProvider->DrawSubtitles(tempFrame,VFR_Input.GetTimeAtFrame(n,true,true)/1000.0); return tempFrame; @@ -547,7 +547,7 @@ GLuint VideoContext::GetFrameAsTexture(int n) { ///////////////// // Save snapshot -void VideoContext::SaveSnapshot() { +void VideoContext::SaveSnapshot(bool raw) { // Get folder wxString option = Options.AsText(_("Video Screenshot Path")); wxFileName videoFile(videoName); @@ -576,7 +576,7 @@ void VideoContext::SaveSnapshot() { } // Save - GetFrame(frame_n).GetImage().SaveFile(path,wxBITMAP_TYPE_PNG); + GetFrame(frame_n,raw).GetImage().SaveFile(path,wxBITMAP_TYPE_PNG); } @@ -797,3 +797,10 @@ void VideoContext::SetAspectRatio(int _type, double value) { void VideoContext::SetShader(bool enabled) { OpenGLWrapper::SetShader(enabled ? yv12shader : 0); } + + +//////////////////////////////////////////////// +// Can draw subtitles independently from video? +bool VideoContext::HasIndependentSubs() { + return subsProvider && subsProvider->CanRaster(); +} diff --git a/aegisub/video_context.h b/aegisub/video_context.h index ab99b44e7..7ac336d56 100644 --- a/aegisub/video_context.h +++ b/aegisub/video_context.h @@ -124,8 +124,10 @@ public: void RemoveDisplay(VideoDisplay *display); VideoProvider *GetProvider() { return provider; } - AegiVideoFrame GetFrame(int n); - void SaveSnapshot(); + AegiVideoFrame GetFrame(int n,bool raw=false); + + bool HasIndependentSubs(); + void SaveSnapshot(bool raw); wxGLContext *GetGLContext(wxGLCanvas *canvas); GLuint GetFrameAsTexture(int n); diff --git a/aegisub/video_display.cpp b/aegisub/video_display.cpp index 6b3b6763f..ce85dc5fe 100644 --- a/aegisub/video_display.cpp +++ b/aegisub/video_display.cpp @@ -68,9 +68,11 @@ /////// // IDs enum { - VIDEO_MENU_COPY_TO_CLIPBOARD = 1230, - VIDEO_MENU_COPY_COORDS, + VIDEO_MENU_COPY_COORDS = 1230, + VIDEO_MENU_COPY_TO_CLIPBOARD, + VIDEO_MENU_COPY_TO_CLIPBOARD_RAW, VIDEO_MENU_SAVE_SNAPSHOT, + VIDEO_MENU_SAVE_SNAPSHOT_RAW }; @@ -84,9 +86,11 @@ BEGIN_EVENT_TABLE(VideoDisplay, wxGLCanvas) EVT_SIZE(VideoDisplay::OnSizeEvent) EVT_ERASE_BACKGROUND(VideoDisplay::OnEraseBackground) + EVT_MENU(VIDEO_MENU_COPY_COORDS,VideoDisplay::OnCopyCoords) EVT_MENU(VIDEO_MENU_COPY_TO_CLIPBOARD,VideoDisplay::OnCopyToClipboard) EVT_MENU(VIDEO_MENU_SAVE_SNAPSHOT,VideoDisplay::OnSaveSnapshot) - EVT_MENU(VIDEO_MENU_COPY_COORDS,VideoDisplay::OnCopyCoords) + EVT_MENU(VIDEO_MENU_COPY_TO_CLIPBOARD_RAW,VideoDisplay::OnCopyToClipboardRaw) + EVT_MENU(VIDEO_MENU_SAVE_SNAPSHOT_RAW,VideoDisplay::OnSaveSnapshotRaw) END_EVENT_TABLE() @@ -353,6 +357,11 @@ void VideoDisplay::OnMouseEvent(wxMouseEvent& event) { wxMenu menu; menu.Append(VIDEO_MENU_SAVE_SNAPSHOT,_("Save PNG snapshot")); menu.Append(VIDEO_MENU_COPY_TO_CLIPBOARD,_("Copy image to Clipboard")); + menu.AppendSeparator(); + bool canDoRaw = VideoContext::Get()->HasIndependentSubs(); + menu.Append(VIDEO_MENU_SAVE_SNAPSHOT_RAW,_("Save PNG snapshot (no subtitles)"))->Enable(canDoRaw); + menu.Append(VIDEO_MENU_COPY_TO_CLIPBOARD_RAW,_("Copy image to Clipboard (no subtitles)"))->Enable(canDoRaw); + menu.AppendSeparator(); menu.Append(VIDEO_MENU_COPY_COORDS,_("Copy coordinates to Clipboard")); PopupMenu(&menu); return; @@ -491,10 +500,27 @@ void VideoDisplay::OnCopyToClipboard(wxCommandEvent &event) { } +////////////////////////// +// Copy to clipboard (raw) +void VideoDisplay::OnCopyToClipboardRaw(wxCommandEvent &event) { + if (wxTheClipboard->Open()) { + wxTheClipboard->SetData(new wxBitmapDataObject(wxBitmap(VideoContext::Get()->GetFrame(-1,true).GetImage(),24))); + wxTheClipboard->Close(); + } +} + + ///////////////// // Save snapshot void VideoDisplay::OnSaveSnapshot(wxCommandEvent &event) { - VideoContext::Get()->SaveSnapshot(); + VideoContext::Get()->SaveSnapshot(false); +} + + +////////////////////// +// Save snapshot (raw) +void VideoDisplay::OnSaveSnapshotRaw(wxCommandEvent &event) { + VideoContext::Get()->SaveSnapshot(true); } diff --git a/aegisub/video_display.h b/aegisub/video_display.h index 9bf7fdf85..ab1cb365c 100644 --- a/aegisub/video_display.h +++ b/aegisub/video_display.h @@ -76,12 +76,15 @@ private: void OnKey(wxKeyEvent &event); void OnMouseEvent(wxMouseEvent& event); void OnMouseLeave(wxMouseEvent& event); - void OnCopyToClipboard(wxCommandEvent &event); - void OnSaveSnapshot(wxCommandEvent &event); - void OnCopyCoords(wxCommandEvent &event); void OnEraseBackground(wxEraseEvent &event) {} void OnSizeEvent(wxSizeEvent &event); + void OnCopyCoords(wxCommandEvent &event); + void OnCopyToClipboard(wxCommandEvent &event); + void OnSaveSnapshot(wxCommandEvent &event); + void OnCopyToClipboardRaw(wxCommandEvent &event); + void OnSaveSnapshotRaw(wxCommandEvent &event); + public: VideoDisplayVisual *visual; VideoDisplayFexTracker *tracker;