diff --git a/aegisub/src/ass_file.cpp b/aegisub/src/ass_file.cpp index 9b0e9995d..d651c892e 100644 --- a/aegisub/src/ass_file.cpp +++ b/aegisub/src/ass_file.cpp @@ -429,8 +429,8 @@ void AssFile::AddLine (wxString data,wxString group,int &version,wxString *outGr /// @brief Clears contents of assfile void AssFile::Clear () { - for (std::list::iterator cur=Line.begin();cur != Line.end();cur++) { - if (*cur) delete *cur; + for (entryIter cur=Line.begin();cur != Line.end();cur++) { + delete *cur; } Line.clear(); diff --git a/aegisub/src/dialog_style_editor.cpp b/aegisub/src/dialog_style_editor.cpp index 4ed7f684b..f25cc634b 100644 --- a/aegisub/src/dialog_style_editor.cpp +++ b/aegisub/src/dialog_style_editor.cpp @@ -368,7 +368,7 @@ DialogStyleEditor::DialogStyleEditor (wxWindow *parent, AssStyle *_style, Subtit SubsPreview = new SubtitlesPreview(this,-1,wxDefaultPosition,wxSize(100,60),wxSUNKEN_BORDER,lagi_wxColour(OPT_GET("Colour/Style Editor/Background/Preview")->GetColour())); SubsPreview->SetToolTip(_("Preview of current style.")); - SubsPreview->SetStyle(style); + SubsPreview->SetStyle(*style); SubsPreview->SetText(PreviewText->GetValue()); PreviewText->SetToolTip(_("Text to be used for the preview.")); previewButton->SetToolTip(_("Colour of preview background.")); @@ -593,7 +593,7 @@ void DialogStyleEditor::Apply (bool apply,bool close) { } // Update preview - else if (SubsPreview) SubsPreview->SetStyle(style); + else if (SubsPreview) SubsPreview->SetStyle(*style); } // Close @@ -672,7 +672,7 @@ void DialogStyleEditor::OnChooseFont (wxCommandEvent &event) { work->italic = (newfont.GetStyle() == wxFONTSTYLE_ITALIC); work->underline = newfont.GetUnderlined(); UpdateWorkStyle(); - if (SubsPreview) SubsPreview->SetStyle(work); + if (SubsPreview) SubsPreview->SetStyle(*work); // Comic sans warning if (newfont.GetFaceName() == _T("Comic Sans MS")) { @@ -694,7 +694,7 @@ void DialogStyleEditor::OnSetColor (int n) { default: throw _T("Internal error in style editor, attempted setting colour id outside range"); } modify->SetWXColor(colorButton[n-1]->GetColour()); - if (SubsPreview) SubsPreview->SetStyle(work); + if (SubsPreview) SubsPreview->SetStyle(*work); } /// @brief Child focus change @@ -702,7 +702,7 @@ void DialogStyleEditor::OnSetColor (int n) { /// void DialogStyleEditor::OnChildFocus (wxChildFocusEvent &event) { UpdateWorkStyle(); - if (SubsPreview) SubsPreview->SetStyle(work); + if (SubsPreview) SubsPreview->SetStyle(*work); event.Skip(); } @@ -731,7 +731,7 @@ void DialogStyleEditor::OnPreviewColourChange (wxCommandEvent &event) { void DialogStyleEditor::OnCommandPreviewUpdate (wxCommandEvent &event) { if (!IsShownOnScreen()) return; UpdateWorkStyle(); - if (SubsPreview) SubsPreview->SetStyle(work); + if (SubsPreview) SubsPreview->SetStyle(*work); event.Skip(); } diff --git a/aegisub/src/subs_preview.cpp b/aegisub/src/subs_preview.cpp index ef1d0d7fa..396917b68 100644 --- a/aegisub/src/subs_preview.cpp +++ b/aegisub/src/subs_preview.cpp @@ -35,8 +35,6 @@ /// -//////////// -// Includes #include "config.h" #ifndef AGI_PRE @@ -45,6 +43,7 @@ #include #endif +#include "ass_dialogue.h" #include "ass_file.h" #include "ass_style.h" #include "subs_preview.h" @@ -62,184 +61,103 @@ /// SubtitlesPreview::SubtitlesPreview(wxWindow *parent,int id,wxPoint pos,wxSize size,int winStyle,wxColour col) : wxWindow(parent,id,pos,size,winStyle) +, backColour(col) +, subFile(new AssFile) +, line(new AssDialogue) +, style(new AssStyle) { - AssStyle temp; - bmp = NULL; - style = NULL; - vid = NULL; - SetStyle(&temp); - SetText(_T("preview")); - SetSizeHints(size.GetWidth(),size.GetHeight(),-1,-1); - backColour = col; -} + line->Text = "{\\q2}preview"; + SetStyle(*style); + subFile->LoadDefault(); + subFile->InsertStyle(style); + subFile->Line.push_back(line); -/// @brief Destructor -/// -SubtitlesPreview::~SubtitlesPreview() { - delete bmp; - bmp = NULL; - delete style; - style = NULL; - delete vid; - vid = NULL; -} - - - -/// @brief Set style -/// @param _style -/// @return -/// -void SubtitlesPreview::SetStyle(AssStyle *_style) { - // Prepare style - AssStyle *tmpStyle = dynamic_cast(_style->Clone()); - tmpStyle->name = _T("Preview"); - tmpStyle->alignment = 5; - for (int i=0;i<4;i++) tmpStyle->Margin[i] = 0; - tmpStyle->UpdateData(); - - // See if it's any different from the current - if (style) { - if (tmpStyle->IsEqualTo(style)) { - delete tmpStyle; - return; - } - - delete style; - } - - // Update - style = tmpStyle; + SetSizeHints(size.GetWidth(), size.GetHeight(), -1, -1); + wxSizeEvent evt(size); + OnSize(evt); UpdateBitmap(); } +SubtitlesPreview::~SubtitlesPreview() { +} +void SubtitlesPreview::SetStyle(AssStyle const& newStyle) { + *style = newStyle; + style->name = "Default"; + style->alignment = 5; + memset(style->Margin, 0, 4 * sizeof(int)); + style->UpdateData(); + UpdateBitmap(); +} -/// @brief Set text -/// @param text -/// void SubtitlesPreview::SetText(wxString text) { - if (text != showText) { - showText = text; + wxString newText = L"{\\q2}" + text; + if (newText != line->Text) { + line->Text = newText; UpdateBitmap(); } } - - -/// @brief Update image -/// @param w -/// @param h -/// @return -/// -void SubtitlesPreview::UpdateBitmap(int w,int h) { - // Visible? +void SubtitlesPreview::UpdateBitmap() { if (!IsShownOnScreen()) return; - // Get size - if (w == -1) { - w = GetClientSize().GetWidth(); - h = GetClientSize().GetHeight(); - } - - // Delete old bmp if needed - if (bmp) { - if (bmp->GetWidth() != w || bmp->GetHeight() != h) { - delete bmp; - bmp = NULL; - } - } - - // Create bitmap - if (!bmp) { - bmp = new wxBitmap(w,h,-1); - } - - // Get AegiVideoFrame - if (!vid) vid = new DummyVideoProvider(0.0,10,w,h,backColour,true); AegiVideoFrame frame; frame.CopyFrom(vid->GetFrame(0)); - // Try to get subtitles provider - SubtitlesProvider *provider = NULL; - try { - provider = SubtitlesProviderFactoryManager::GetProvider(); - } - catch (...) { - wxMessageBox(_T("Could not get any subtitles provider for the preview box. Make sure that you have a provider installed."),_T("No subtitles provider"),wxICON_ERROR|wxOK); - } - - // Provider OK - if (provider) { - // Generate subtitles - AssFile *subs = new AssFile(); - subs->LoadDefault(); - int ver = 1; - wxString outGroup; - subs->InsertStyle((AssStyle *)style->Clone()); - subs->SetScriptInfo(_T("PlayResX"),wxString::Format(_T("%i"),w)); - subs->SetScriptInfo(_T("PlayResY"),wxString::Format(_T("%i"),h)); - subs->AddLine(_T("Dialogue: 0,0:00:00.00,0:00:05.00,Preview,,0000,0000,0000,,{\\q2}") + showText,_T("[Events]"),ver,&outGroup); - - // Apply subtitles + if (provider.get()) { try { - provider->LoadSubtitles(subs); - provider->DrawSubtitles(frame,0.1); + provider->LoadSubtitles(subFile.get()); + provider->DrawSubtitles(frame, 0.1); } - catch (...) {} - delete provider; + catch (...) { } } // Convert frame to bitmap - wxMemoryDC dc(*bmp); - wxBitmap tempBmp(frame.GetImage()); + *bmp = static_cast(frame.GetImage()); frame.Clear(); - dc.DrawBitmap(tempBmp,0,0); Refresh(); } - -/////////////// -// Event table BEGIN_EVENT_TABLE(SubtitlesPreview,wxWindow) EVT_PAINT(SubtitlesPreview::OnPaint) EVT_SIZE(SubtitlesPreview::OnSize) END_EVENT_TABLE() - - -/// @brief Paint event -/// @param event -/// -void SubtitlesPreview::OnPaint(wxPaintEvent &event) { +void SubtitlesPreview::OnPaint(wxPaintEvent &) { wxPaintDC dc(this); - if (!bmp) UpdateBitmap(); - if (bmp) dc.DrawBitmap(*bmp,0,0); + dc.DrawBitmap(*bmp,0,0); } +void SubtitlesPreview::OnSize(wxSizeEvent &evt) { + if (bmp.get() && evt.GetSize() == bmp->GetSize()) return; + int w = evt.GetSize().GetWidth(); + int h = evt.GetSize().GetHeight(); -/// @brief Size event -/// @param event -/// -void SubtitlesPreview::OnSize(wxSizeEvent &event) { - delete vid; - vid = NULL; - UpdateBitmap(event.GetSize().GetWidth(),event.GetSize().GetHeight()); -} + bmp.reset(new wxBitmap(w, h, -1)); + vid.reset(new DummyVideoProvider(0.0, 10, w, h, backColour, true)); + try { + provider.reset(SubtitlesProviderFactoryManager::GetProvider()); + } + catch (...) { + wxMessageBox( + "Could not get any subtitles provider for the preview box. Make " + "sure that you have a provider installed.", + "No subtitles provider", wxICON_ERROR | wxOK); + } + subFile->SetScriptInfo("PlayResX", wxString::Format("%i", w)); + subFile->SetScriptInfo("PlayResY", wxString::Format("%i", h)); - -/// @brief Set colour -/// @param col -/// -void SubtitlesPreview::SetColour(wxColour col) { - backColour = col; - delete vid; - vid = NULL; UpdateBitmap(); } - +void SubtitlesPreview::SetColour(wxColour col) { + if (col != backColour) { + backColour = col; + vid.reset(new DummyVideoProvider(0.0, 10, bmp->GetWidth(), bmp->GetHeight(), backColour, true)); + UpdateBitmap(); + } +} diff --git a/aegisub/src/subs_preview.h b/aegisub/src/subs_preview.h index 2dcbc5763..c73860cc1 100644 --- a/aegisub/src/subs_preview.h +++ b/aegisub/src/subs_preview.h @@ -34,58 +34,52 @@ /// @ingroup custom_control /// - - - -//////////// -// Includes #ifndef AGI_PRE +#include #include #include #endif - -////////////// -// Prototypes +class AssFile; class AssStyle; +class SubtitlesProvider; class VideoProvider; - - /// DOCME /// @class SubtitlesPreview -/// @brief DOCME -/// -/// DOCME +/// @brief Preview window to show a short string with a given ass style class SubtitlesPreview : public wxWindow { private: - - /// DOCME - wxBitmap *bmp; - - /// DOCME - AssStyle *style; - - /// DOCME - wxString showText; - - /// DOCME - VideoProvider *vid; - - /// DOCME + /// The subtitle provider used to render the string + std::auto_ptr provider; + /// Bitmap to render into + std::auto_ptr bmp; + /// The currently display style + AssStyle* style; + /// Video provider to render into + std::auto_ptr vid; + /// Current background color wxColour backColour; + /// Subtitle file containing the style and displayed line + std::auto_ptr subFile; + /// Line used to render the specified text + AssDialogue* line; - void UpdateBitmap(int w=-1,int h=-1); + /// Regenerate the bitmap + void UpdateBitmap(); + /// Resize event handler void OnSize(wxSizeEvent &event); - void OnPaint(wxPaintEvent &event); + /// Paint event handler + void OnPaint(wxPaintEvent &); public: - void SetStyle(AssStyle *style); + /// Set the style to use + void SetStyle(AssStyle const& style); + /// Set the text to display void SetText(wxString text); + /// Set the background color void SetColour(wxColour col); - /// @brief DOCME - /// void Update() { UpdateBitmap(); } SubtitlesPreview(wxWindow *parent,int id,wxPoint pos,wxSize size,int style,wxColour colour); @@ -93,5 +87,3 @@ public: DECLARE_EVENT_TABLE() }; - - diff --git a/aegisub/src/video_frame.cpp b/aegisub/src/video_frame.cpp index 9b956a0de..fe55611c6 100644 --- a/aegisub/src/video_frame.cpp +++ b/aegisub/src/video_frame.cpp @@ -172,7 +172,7 @@ void AegiVideoFrame::SetTo(const unsigned char *const source[], int width, int h } -/// @brief This function is only used on screenshots, so it doesn't have to be fast ------ Get wxImage +/// @brief Get wxImage /// @return wxImage AegiVideoFrame::GetImage() const { if (format == FORMAT_RGB32 || format == FORMAT_RGB24) {