diff --git a/aegisub/factory.h b/aegisub/factory.h index 8654f5243..ec96232ad 100644 --- a/aegisub/factory.h +++ b/aegisub/factory.h @@ -47,22 +47,51 @@ template class AegisubFactory { protected: + // Static map of all factories static std::map *factories; - void RegisterFactory(wxString name) { + + // Register one factory type (with possible subtypes) + void RegisterFactory(wxString name, wxArrayString subTypes=wxArrayString()) { + // Create factories if it doesn't exist if (factories == NULL) factories = new std::map; - factories->insert(std::make_pair(name.Lower(),(T*)this)); + + // Prepare subtypes + if (subTypes.GetCount() == 0) subTypes.Add(_T("")); + else { + for (unsigned int i=0;iinsert(std::make_pair(name.Lower() + subTypes[i],(T*)this)); + } } + + // Get a factory with name static T *GetFactory(wxString name) { + // No factories if (factories == NULL) { factories = new std::map; return NULL; } - typename std::map::iterator res = factories->find(name.Lower()); - if (res != factories->end()) return res->second; + + // Search for factory that matches + typename std::map::iterator cur; + for (cur = factories->begin();cur != factories->end();cur++) { + if (cur->first.StartsWith(name)) return cur->second; + } + + // None found return NULL; } public: + // Virtual destructor + virtual ~AegisubFactory() {} + + // Get list of all factories, with favourite as first static wxArrayString GetFactoryList(wxString favourite=_T("")) { if (factories == NULL) factories = new std::map; wxArrayString list; @@ -73,5 +102,4 @@ public: } return list; } - virtual ~AegisubFactory() {} }; diff --git a/aegisub/subtitles_provider.cpp b/aegisub/subtitles_provider.cpp index 0cf73171b..9c52d00e0 100644 --- a/aegisub/subtitles_provider.cpp +++ b/aegisub/subtitles_provider.cpp @@ -59,7 +59,10 @@ SubtitlesProvider* SubtitlesProviderFactory::GetProvider() { wxString error; for (unsigned int i=0;iCreateProvider(); + size_t pos = list[i].Find(_T('/')); + wxString name = list[i].Left(pos); + wxString subType = list[i].Mid(pos+1); + SubtitlesProvider *provider = GetFactory(list[i])->CreateProvider(subType); if (provider) return provider; } catch (wxString err) { error += list[i] + _T(" factory: ") + err + _T("\n"); } diff --git a/aegisub/subtitles_provider.h b/aegisub/subtitles_provider.h index 409e2c5ac..50657d936 100644 --- a/aegisub/subtitles_provider.h +++ b/aegisub/subtitles_provider.h @@ -66,8 +66,10 @@ public: // Factory class SubtitlesProviderFactory : public AegisubFactory { protected: - virtual SubtitlesProvider *CreateProvider()=0; - SubtitlesProviderFactory(wxString name) { RegisterFactory(name); } + virtual SubtitlesProvider *CreateProvider(wxString subType=_T(""))=0; + SubtitlesProviderFactory(wxString name,wxArrayString subTypes=wxArrayString()) { + RegisterFactory(name,subTypes); + } public: virtual ~SubtitlesProviderFactory() {} diff --git a/aegisub/subtitles_provider_csri.cpp b/aegisub/subtitles_provider_csri.cpp index 12e302594..955c0d839 100644 --- a/aegisub/subtitles_provider_csri.cpp +++ b/aegisub/subtitles_provider_csri.cpp @@ -36,6 +36,7 @@ /////////// // Headers +#include #include "subtitles_provider.h" #include "ass_file.h" #include "video_context.h" @@ -56,10 +57,11 @@ // Common Subtitles Rendering Interface provider class CSRISubtitlesProvider : public SubtitlesProvider { private: + wxString subType; csri_inst *instance; public: - CSRISubtitlesProvider(); + CSRISubtitlesProvider(wxString subType); ~CSRISubtitlesProvider(); bool CanRaster() { return true; } @@ -73,14 +75,34 @@ public: // Factory class CSRISubtitlesProviderFactory : public SubtitlesProviderFactory { public: - SubtitlesProvider *CreateProvider() { return new CSRISubtitlesProvider(); } - CSRISubtitlesProviderFactory() : SubtitlesProviderFactory(_T("csri")) {} + SubtitlesProvider *CreateProvider(wxString subType=_T("")) { return new CSRISubtitlesProvider(subType); } + wxArrayString GetSubTypes() { + csri_info *info; + wxArrayString final; + for (csri_rend *cur = csri_renderer_default();cur;cur = csri_renderer_next(cur)) { + // Get renderer name + info = csri_renderer_info(cur); + const char* buffer = info->name; + + // wxWidgets isn't initialized, so h4x into a wxString + int len = strlen(buffer); + wxString str; + str.Alloc(len+1); + for (int i=0;iGetTempWorkFile(); - //subs->Save(subsfilename,false,false,_T("UTF-8")); std::vector data; subs->SaveMemory(data,_T("UTF-8")); delete subs; + // CSRI variables + csri_rend *cur,*renderer=NULL; + csri_info *info; + + // Select renderer + for (cur = csri_renderer_default();cur;cur=csri_renderer_next(cur)) { + info = csri_renderer_info(cur); + wxString name(info->name,wxConvUTF8); + if (name == subType) { + renderer = cur; + break; + } + } + + // Matching renderer not found, fallback to default + if (!renderer) { + renderer = csri_renderer_default(); + if (!renderer) throw _T("No CSRI renderer available. Try installing one or switch to another subtitle provider."); + } + // Open - //instance = csri_open_file(csri_renderer_default(),subsfilename.mb_str(wxConvUTF8),NULL); - renderer = csri_renderer_default(); - if (renderer) - instance = csri_open_mem(renderer,&data[0],data.size(),NULL); - else - throw _T("No CSRI renderer available. Try installing one or switch to another subtitle provider."); + instance = csri_open_mem(renderer,&data[0],data.size(),NULL); } diff --git a/aegisub/subtitles_provider_libass.cpp b/aegisub/subtitles_provider_libass.cpp index 0601e89fa..6cfb98d73 100644 --- a/aegisub/subtitles_provider_libass.cpp +++ b/aegisub/subtitles_provider_libass.cpp @@ -76,7 +76,7 @@ ass_library_t* LibassSubtitlesProvider::ass_library; // Factory class LibassSubtitlesProviderFactory : public SubtitlesProviderFactory { public: - SubtitlesProvider *CreateProvider() { return new LibassSubtitlesProvider(); } + SubtitlesProvider *CreateProvider(wxString subType=_T("")) { return new LibassSubtitlesProvider(); } LibassSubtitlesProviderFactory() : SubtitlesProviderFactory(_T("libass")) {} } registerLibass;