diff --git a/core/Makefile.am b/core/Makefile.am index 7ecc0e383..80ee772be 100644 --- a/core/Makefile.am +++ b/core/Makefile.am @@ -75,6 +75,7 @@ aegisub_SOURCES = about.cpp \ subtitle_format_prs.cpp \ subtitle_format_srt.cpp \ subtitle_format_txt.cpp \ + subtitle_provider.cpp \ text_file_reader.cpp \ text_file_writer.cpp \ timeedit_ctrl.cpp \ diff --git a/core/subtitles_rasterizer.h b/core/subtitle_provider.cpp similarity index 79% rename from core/subtitles_rasterizer.h rename to core/subtitle_provider.cpp index a2fcbced9..fdcedd466 100644 --- a/core/subtitles_rasterizer.h +++ b/core/subtitle_provider.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2006, Rodrigo Braz Monteiro, Fredrik Mellbin +// Copyright (c) 2006, David Lamparter // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -34,24 +34,20 @@ // -#pragma once +/////////// +// Headers +#include "subtitle_provider.h" -////////////// -// Prototypes -class AegisubVideoFrame; -class AssFile; +std::map SubtitleProvider::Class::classes; +SubtitleProvider::Class::Class(wxString name) +{ + classes.insert(std::make_pair(name, this)); +} -//////////////////////////// -// Video Provider interface -class SubtitleRasterizer { -public: - virtual ~SubtitleRasterizer() {} +SubtitleProvider *SubtitleProvider::Class::GetProvider(wxString provider_name, AssFile *subs) +{ + return classes[provider_name]->Get(subs); +} - wxString GetFromDisk(AssFile *subs); - - virtual void Load(AssFile *subs)=0; - virtual void Close() {} - virtual void RenderFrame(AegisubVideoFrame *frame,int ms)=0; -}; diff --git a/core/subtitle_provider.h b/core/subtitle_provider.h new file mode 100644 index 000000000..714f7e776 --- /dev/null +++ b/core/subtitle_provider.h @@ -0,0 +1,86 @@ +// Copyright (c) 2006, David Lamparter +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +#pragma once + + +#include + + +class VideoProvider; +class AssFile; + +///////////////////////////////////////// +// Subtitle provider (renderer) interface +class SubtitleProvider { +public: + // Video overlay interface. Renderers MAY implement it, + // but do not need to. VideoProvider::SetOverlay takes it. + class Overlay { + public: + virtual void SetParams(int width, int height) = 0; + virtual void Render(wxImage &frame, int ms) = 0; + virtual void Unbind() = 0; // Called when VideoProvider is destroyed + virtual ~Overlay() { }; + }; + + // Renderer Class. Manages the different types of renderers. + // Derivate a class off it, override its Get method and its constructor, + // and create one single instance of it for your renderer, + // as a static element in your SubtitleProvider derivated class. Example: + // class MyFancyRenderer : public SubtitleProvider { + // class MyClass : public Class { public: + // MyClass() : Class("FancyRenderer") { }; + // virtual SubtitleProvider *Get(AssFile *subs) { return new MyFancyRenderer(subs); }; + // }; + // static MyClass me; + // }; + class Class { + private: + static std::map classes; + + public: + Class(wxString name); + virtual SubtitleProvider *Get(AssFile *subs) = 0; + virtual ~Class() {}; + + static SubtitleProvider *GetProvider(wxString provider_name, AssFile *subs); + }; + + + virtual ~SubtitleProvider() { }; + virtual void Bind(VideoProvider *vpro) = 0; +}; diff --git a/core/video_provider.h b/core/video_provider.h index 3e72637fb..4f99dcb12 100644 --- a/core/video_provider.h +++ b/core/video_provider.h @@ -37,9 +37,7 @@ #pragma once -////////////// -// Prototypes -class SubtitleRasterizer; +#include "subtitle_provider.h" //////////////////////////// @@ -49,6 +47,7 @@ public: virtual ~VideoProvider() {} virtual void RefreshSubtitles()=0; // Refresh subtitles display + virtual void AttachOverlay(SubtitleProvider::Overlay *overlay) = 0; virtual wxBitmap GetFrame(int n)=0; // Get frame as bitmap virtual void GetFloatFrame(float* Buffer, int n)=0; // Get frame as float (for FexTracker) @@ -66,7 +65,5 @@ public: virtual int GetSourceWidth()=0; // Returns the original source width in pixels virtual int GetSourceHeight()=0; // Returns the original source height in pixels - SubtitleRasterizer *subsRaster; - static VideoProvider *GetProvider(wxString video,wxString subtitles); };