From e74727f634837e645ef54225c82801e2c7125469 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Wed, 4 Apr 2007 01:54:37 +0000 Subject: [PATCH] Option for checkerboard pattern in dummy video Originally committed to SVN as r995. --- aegisub/dialog_dummy_video.cpp | 9 +++- aegisub/dialog_dummy_video.h | 1 + aegisub/options.cpp | 1 + aegisub/video_provider_dummy.cpp | 74 +++++++++++++++++++++++++++----- aegisub/video_provider_dummy.h | 6 +-- 5 files changed, 76 insertions(+), 15 deletions(-) diff --git a/aegisub/dialog_dummy_video.cpp b/aegisub/dialog_dummy_video.cpp index 3cdd88bc9..62320ad60 100644 --- a/aegisub/dialog_dummy_video.cpp +++ b/aegisub/dialog_dummy_video.cpp @@ -66,6 +66,7 @@ bool DialogDummyVideo::CreateDummyVideo(wxWindow *parent, wxString &out_filename double fps; long width, height, length; wxColour colour; + bool pattern; // Read back values and check sensibility if (!dlg.fps->GetValue().ToDouble(&fps) || fps <= 0) { @@ -95,6 +96,7 @@ bool DialogDummyVideo::CreateDummyVideo(wxWindow *parent, wxString &out_filename length = 2; } colour = dlg.colour->GetColour(); + pattern = dlg.pattern->GetValue(); // Write to options Options.SetFloat(_T("Video Dummy Last FPS"), fps); @@ -102,8 +104,9 @@ bool DialogDummyVideo::CreateDummyVideo(wxWindow *parent, wxString &out_filename Options.SetInt(_T("Video Dummy Last Height"), height); Options.SetInt(_T("Video Dummy Last Length"), length); Options.SetColour(_T("Video Dummy Last Colour"), colour); + Options.SetBool(_T("Video Dummy Pattern"), pattern); - out_filename = DummyVideoProvider::MakeFilename(fps, length, width, height, colour); + out_filename = DummyVideoProvider::MakeFilename(fps, length, width, height, colour, pattern); return true; } else { return false; @@ -120,6 +123,7 @@ DialogDummyVideo::DialogDummyVideo(wxWindow *parent) width = new wxTextCtrl(this, -1); height = new wxTextCtrl(this, -1); colour = new ColourButton(this, -1, wxSize(30, 17), Options.AsColour(_T("Video Dummy Last Colour"))); + pattern = new wxCheckBox(this, -1, _("Checkerboard pattern")); //fps = new wxComboBox(this, Dummy_Video_FPS, Options.AsText(_T("Video Dummy Last FPS")), wxDefaultPosition, wxDefaultSize, 0, 0, wxCB_DROPDOWN); fps = new wxTextCtrl(this, Dummy_Video_FPS, Options.AsText(_T("Video Dummy Last FPS"))); length = new wxSpinCtrl(this, Dummy_Video_Length); @@ -137,6 +141,8 @@ DialogDummyVideo::DialogDummyVideo(wxWindow *parent) fg->Add(res_sizer, 1, wxEXPAND); fg->Add(new wxStaticText(this, -1, _("Colour:")), 0, wxALIGN_CENTRE_VERTICAL); fg->Add(colour, 1, wxFIXED_MINSIZE|wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL); + fg->AddStretchSpacer(); + fg->Add(pattern, 1, wxALIGN_LEFT|wxALIGN_CENTRE_VERTICAL); fg->Add(new wxStaticText(this, -1, _("Frame rate (fps):")), 0, wxALIGN_CENTRE_VERTICAL); fg->Add(fps, 1, wxEXPAND); fg->Add(new wxStaticText(this, -1, _("Duration (frames):")), 0, wxALIGN_CENTRE_VERTICAL); @@ -166,6 +172,7 @@ DialogDummyVideo::DialogDummyVideo(wxWindow *parent) resolution_shortcuts->SetSelection(lastres); lastres++; } + pattern->SetValue(Options.AsBool(_T("Video Dummy Pattern"))); /*fps->Append(_T("23.976")); fps->Append(_T("29.97")); fps->Append(_T("24")); diff --git a/aegisub/dialog_dummy_video.h b/aegisub/dialog_dummy_video.h index 7de87de0d..e6ec7f85c 100644 --- a/aegisub/dialog_dummy_video.h +++ b/aegisub/dialog_dummy_video.h @@ -53,6 +53,7 @@ private: wxTextCtrl *width; wxTextCtrl *height; ColourButton *colour; + wxCheckBox *pattern; //wxComboBox *fps; wxTextCtrl *fps; wxSpinCtrl *length; diff --git a/aegisub/options.cpp b/aegisub/options.cpp index 47212c2cd..371572f9f 100644 --- a/aegisub/options.cpp +++ b/aegisub/options.cpp @@ -145,6 +145,7 @@ void OptionsManager::LoadDefaults() { SetColour(_T("Video Dummy Last Colour"), wxColour(47, 163, 254)); SetFloat(_T("Video Dummy Last FPS"), 23.976); SetInt(_T("Video Dummy Last Length"), 40000); + SetBool(_T("Video Dummy Pattern"), false); // Video Provider (Advanced) SetModificationType(MOD_RESTART); diff --git a/aegisub/video_provider_dummy.cpp b/aegisub/video_provider_dummy.cpp index 3b9fecf27..3ffa0a922 100644 --- a/aegisub/video_provider_dummy.cpp +++ b/aegisub/video_provider_dummy.cpp @@ -37,6 +37,7 @@ /////////// // Headers #include "video_provider_dummy.h" +#include "colorspace.h" #include @@ -52,7 +53,7 @@ public: /////////////// // Constructor -void DummyVideoProvider::Create(double _fps, int frames, int _width, int _height, const wxColour &colour) { +void DummyVideoProvider::Create(double _fps, int frames, int _width, int _height, const wxColour &colour, bool pattern) { lastFrame = -1; framecount = frames; fps = _fps; @@ -62,11 +63,56 @@ void DummyVideoProvider::Create(double _fps, int frames, int _width, int _height frame = AegiVideoFrame(width,height,FORMAT_RGB32); unsigned char *dst = frame.data[0]; unsigned char r = colour.Red(), g = colour.Green(), b = colour.Blue(); - for (int i=frame.pitch[0]*frame.h/frame.GetBpp();--i>=0;) { - *dst++ = b; - *dst++ = g; - *dst++ = r; - *dst++ = 0; + + unsigned char h, s, l, lr, lg, lb; // light variants + rgb_to_hsl(r, g, b, &h, &s, &l); + l = 255 - (255 - l) / 2; + hsl_to_rgb(h, s, l, &lr, &lg, &lb); + + if (pattern) { + int ppitch = frame.pitch[0] / frame.GetBpp(); + for (int y = 0; y < frame.h; ++y) { + if ((y / 8) & 1) { + for (int x = 0; x < ppitch; ++x) { + if ((x / 8) & 1) { + *dst++ = b; + *dst++ = g; + *dst++ = r; + *dst++ = 0; + } + else { + *dst++ = lb; + *dst++ = lg; + *dst++ = lr; + *dst++ = 0; + } + } + } + else { + for (int x = 0; x < ppitch; ++x) { + if ((x / 8) & 1) { + *dst++ = lb; + *dst++ = lg; + *dst++ = lr; + *dst++ = 0; + } + else { + *dst++ = b; + *dst++ = g; + *dst++ = r; + *dst++ = 0; + } + } + } + } + } + else { + for (int i=frame.pitch[0]*frame.h/frame.GetBpp();--i>=0;) { + *dst++ = b; + *dst++ = g; + *dst++ = r; + *dst++ = 0; + } } } @@ -87,6 +133,7 @@ DummyVideoProvider::DummyVideoProvider(wxString filename, double _fps) double parsedfps; long _frames, _width, _height, red, green, blue; + bool pattern = false; wxString field = t.GetNextToken(); if (!field.ToDouble(&parsedfps)) { @@ -125,14 +172,19 @@ DummyVideoProvider::DummyVideoProvider(wxString filename, double _fps) throw _T("Unable to parse bluecolour field in dummy video parameter list"); } - Create(_fps, _frames, _width, _height, wxColour(red, green, blue)); + field = t.GetNextToken(); + if (field == _T("c")) { + pattern = true; + } + + Create(_fps, _frames, _width, _height, wxColour(red, green, blue), pattern); } ////////////////////// // Direct constructor -DummyVideoProvider::DummyVideoProvider(double _fps, int frames, int _width, int _height, const wxColour &colour) { - Create(_fps, frames, _width, _height, colour); +DummyVideoProvider::DummyVideoProvider(double _fps, int frames, int _width, int _height, const wxColour &colour, bool pattern) { + Create(_fps, frames, _width, _height, colour, pattern); } @@ -144,8 +196,8 @@ DummyVideoProvider::~DummyVideoProvider() { ////////////////////////////////////////////////// // Construct a fake filename describing the video -wxString DummyVideoProvider::MakeFilename(double fps, int frames, int _width, int _height, const wxColour &colour) { - return wxString::Format(_T("?dummy:%f:%d:%d:%d:%d:%d:%d"), fps, frames, _width, _height, colour.Red(), colour.Green(), colour.Blue()); +wxString DummyVideoProvider::MakeFilename(double fps, int frames, int _width, int _height, const wxColour &colour, bool pattern) { + return wxString::Format(_T("?dummy:%f:%d:%d:%d:%d:%d:%d:%s"), fps, frames, _width, _height, colour.Red(), colour.Green(), colour.Blue(), pattern?_T("c"):_T("")); } diff --git a/aegisub/video_provider_dummy.h b/aegisub/video_provider_dummy.h index 7e7e4c041..6ac136898 100644 --- a/aegisub/video_provider_dummy.h +++ b/aegisub/video_provider_dummy.h @@ -56,17 +56,17 @@ private: int height; AegiVideoFrame frame; - void Create(double fps, int frames, int _width, int _height, const wxColour &colour); + void Create(double fps, int frames, int _width, int _height, const wxColour &colour, bool pattern); protected: const AegiVideoFrame DoGetFrame(int n); public: DummyVideoProvider(wxString filename, double fps); - DummyVideoProvider(double fps, int frames, int _width, int _height, const wxColour &colour); + DummyVideoProvider(double fps, int frames, int _width, int _height, const wxColour &colour, bool pattern); ~DummyVideoProvider(); - static wxString MakeFilename(double fps, int frames, int _width, int _height, const wxColour &colour); + static wxString MakeFilename(double fps, int frames, int _width, int _height, const wxColour &colour, bool pattern); int GetPosition(); int GetFrameCount();