From fec497a047dc44938294616d45e0f7e30fa3c8e4 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sun, 29 Jul 2007 01:21:28 +0000 Subject: [PATCH] Split the font file lister in a base class and two subclasses, freetype for win32 (implemented) and fontconfig for everything else (todo) Originally committed to SVN as r1452. --- aegisub/Makefile.am | 1 + aegisub/dialog_fonts_collector.cpp | 2 +- aegisub/font_file_lister.cpp | 105 +++++++----------------- aegisub/font_file_lister.h | 16 ++-- aegisub/font_file_lister_fontconfig.cpp | 68 +++++++++++++++ aegisub/font_file_lister_fontconfig.h | 53 ++++++++++++ aegisub/font_file_lister_freetype.cpp | 102 +++++++++++++++++++++++ aegisub/font_file_lister_freetype.h | 61 ++++++++++++++ 8 files changed, 322 insertions(+), 86 deletions(-) create mode 100644 aegisub/font_file_lister_fontconfig.cpp create mode 100644 aegisub/font_file_lister_fontconfig.h create mode 100644 aegisub/font_file_lister_freetype.cpp create mode 100644 aegisub/font_file_lister_freetype.h diff --git a/aegisub/Makefile.am b/aegisub/Makefile.am index 06175927d..3c39625bf 100644 --- a/aegisub/Makefile.am +++ b/aegisub/Makefile.am @@ -163,6 +163,7 @@ aegisub_SOURCES = \ export_visible_lines.cpp \ fft.cpp \ font_file_lister.cpp \ + font_file_lister_fontconfig.cpp \ frame_main.cpp \ frame_main_events.cpp \ gl_text.cpp \ diff --git a/aegisub/dialog_fonts_collector.cpp b/aegisub/dialog_fonts_collector.cpp index ac418d47e..1aafe6558 100644 --- a/aegisub/dialog_fonts_collector.cpp +++ b/aegisub/dialog_fonts_collector.cpp @@ -315,7 +315,7 @@ void DialogFontsCollector::Update(int value) { /////////////////////// // Collect font files void FontsCollectorThread::CollectFontData () { - FontFileLister::GatherData(); + FontFileLister::Initialize(); } diff --git a/aegisub/font_file_lister.cpp b/aegisub/font_file_lister.cpp index a9364441b..e8b46efa7 100644 --- a/aegisub/font_file_lister.cpp +++ b/aegisub/font_file_lister.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2007, Niels Martin Hansen, Rodrigo Braz Monteiro +// Copyright (c) 2007, Rodrigo Braz Monteiro // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -34,24 +34,18 @@ // -#pragma once - - //////////// // Includes -#include #include -#ifdef WIN32 -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_SFNT_NAMES_H -#include -#endif #include "font_file_lister.h" #include "text_file_writer.h" #include "text_file_reader.h" #include "standard_paths.h" +#ifdef WIN32 +#include "font_file_lister_freetype.h" +#else +#include "font_file_lister_fontconfig.h" +#endif //////////////////// @@ -62,10 +56,6 @@ FontFileLister *FontFileLister::instance = NULL; /////////////// // Constructor FontFileLister::FontFileLister() { -#ifdef WIN32 - // Initialize freetype2 - FT_Init_FreeType(&ft2lib); -#endif } @@ -75,25 +65,38 @@ FontFileLister::~FontFileLister() { } -//////////////////////////////////////// -// Get instance and call function there +//////////////// +// Get instance +void FontFileLister::GetInstance() { + if (!instance) { +#ifdef WIN32 + instance = new FreetypeFontFileLister(); +#else + instance = new FontConfigFontFileLister(); +#endif + } +} + + +//////////////////////////////////// +// Redirect statics to the instance wxArrayString FontFileLister::GetFilesWithFace(wxString facename) { - if (!instance) instance = new FontFileLister(); + GetInstance(); return instance->DoGetFilesWithFace(facename); } -void FontFileLister::GatherData() { - if (!instance) instance = new FontFileLister(); - instance->DoGatherData(); +void FontFileLister::Initialize() { + GetInstance(); + instance->DoInitialize(); } void FontFileLister::ClearData() { - if (!instance) instance = new FontFileLister(); + GetInstance(); instance->DoClearData(); } //////////////////////////////////////////////// // Get list of files that match a specific face -wxArrayString FontFileLister::DoGetFilesWithFace(wxString facename) { +wxArrayString FontFileLister::CacheGetFilesWithFace(wxString facename) { FontMap::iterator iter = fontTable.find(facename); if (iter != fontTable.end()) return iter->second; else return wxArrayString(); @@ -102,64 +105,12 @@ wxArrayString FontFileLister::DoGetFilesWithFace(wxString facename) { ////////////// // Clear data -void FontFileLister::DoClearData() { +void FontFileLister::ClearCache() { fontFiles.clear(); fontTable.clear(); } -/////////////////////////// -// Gather data from system -void FontFileLister::DoGatherData() { -#ifdef WIN32 - - // Load cache - LoadCache(); - - // Get fonts folder - wxString source; - TCHAR szPath[MAX_PATH]; - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_FONTS,NULL,0,szPath))) { - source = wxString(szPath); - } - else source = wxGetOSDirectory() + _T("\\fonts"); - source += _T("\\"); - - // Get the list of fonts in the fonts folder - wxArrayString fontfiles; - wxDir::GetAllFiles(source, &fontfiles, wxEmptyString, wxDIR_FILES); - - // Loop through each file - int fterr; - for (unsigned int i=0;ifamily_name, wxConvLocal)); - FT_Done_Face(face); - } - } - - // Save cache - SaveCache(); - -#else - - // TODO: implement fconfig - return; - -#endif -} - - //////////// // Add font void FontFileLister::AddFont(wxString filename,wxString facename) { diff --git a/aegisub/font_file_lister.h b/aegisub/font_file_lister.h index 600bfa628..65ee31394 100644 --- a/aegisub/font_file_lister.h +++ b/aegisub/font_file_lister.h @@ -55,28 +55,28 @@ typedef std::map FontMap; // Font file lister class FontFileLister { private: -#ifdef WIN32 - FT_Library ft2lib; -#endif - static FontFileLister *instance; + static void GetInstance(); FontMap fontTable; wxArrayString fontFiles; - virtual void DoGatherData(); +protected: + virtual wxArrayString DoGetFilesWithFace(wxString facename) { return CacheGetFilesWithFace(facename); } + virtual void DoInitialize()=0; + virtual void DoClearData() { ClearCache(); } FontFileLister(); virtual ~FontFileLister(); - wxArrayString DoGetFilesWithFace(wxString facename); - void DoClearData(); + wxArrayString CacheGetFilesWithFace(wxString facename); bool IsFilenameCached(wxString filename); void AddFont(wxString filename,wxString facename); void SaveCache(); void LoadCache(); + void ClearCache(); public: static wxArrayString GetFilesWithFace(wxString facename); - static void GatherData(); + static void Initialize(); static void ClearData(); }; diff --git a/aegisub/font_file_lister_fontconfig.cpp b/aegisub/font_file_lister_fontconfig.cpp new file mode 100644 index 000000000..097cf0195 --- /dev/null +++ b/aegisub/font_file_lister_fontconfig.cpp @@ -0,0 +1,68 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro +// 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 +// + + +//////////// +// Includes +#include +#ifndef WIN32 +#include "font_file_lister_fontconfig.h" + + +/////////////////////////////////// +// Get files that contain the face +wxArrayString FontConfigFontFileLister::DoGetFilesWithFace(wxString facename) { + wxArrayString results; + + // TODO: implement this + + return results; +} + + +////////////// +// Initialize +void FontConfigFontFileLister::DoInitialize() { + // TODO: implement this +} + + +//////////// +// Clean up +void FontConfigFontFileLister::DoClearData() { + // TODO: implement this +} + +#endif diff --git a/aegisub/font_file_lister_fontconfig.h b/aegisub/font_file_lister_fontconfig.h new file mode 100644 index 000000000..40be0da65 --- /dev/null +++ b/aegisub/font_file_lister_fontconfig.h @@ -0,0 +1,53 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro +// 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 + + +//////////// +// Includes +#include "font_file_lister.h" + + +///////////////////////////// +// Freetype Font file lister +class FontConfigFontFileLister : public FontFileLister { + friend class FontFileLister; +private: + wxArrayString DoGetFilesWithFace(wxString facename); + void DoInitialize(); + void DoClearData(); +}; diff --git a/aegisub/font_file_lister_freetype.cpp b/aegisub/font_file_lister_freetype.cpp new file mode 100644 index 000000000..bcfc29beb --- /dev/null +++ b/aegisub/font_file_lister_freetype.cpp @@ -0,0 +1,102 @@ +// Copyright (c) 2007, Niels Martin Hansen, Rodrigo Braz Monteiro +// 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 +// + + +//////////// +// Includes +#include "font_file_lister_freetype.h" +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_SFNT_NAMES_H +#include +#include + + +/////////////// +// Constructor +FreetypeFontFileLister::FreetypeFontFileLister() { + // Initialize freetype2 + FT_Init_FreeType(&ft2lib); +} + + +////////////// +// Destructor +FreetypeFontFileLister::~FreetypeFontFileLister() { +} + + +/////////////////////////// +// Gather data from system +void FreetypeFontFileLister::DoInitialize() { + // Load cache + LoadCache(); + + // Get fonts folder + wxString source; + TCHAR szPath[MAX_PATH]; + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_FONTS,NULL,0,szPath))) { + source = wxString(szPath); + } + else source = wxGetOSDirectory() + _T("\\fonts"); + source += _T("\\"); + + // Get the list of fonts in the fonts folder + wxArrayString fontfiles; + wxDir::GetAllFiles(source, &fontfiles, wxEmptyString, wxDIR_FILES); + + // Loop through each file + int fterr; + for (unsigned int i=0;ifamily_name, wxConvLocal)); + FT_Done_Face(face); + } + } + + // Save cache + SaveCache(); +} diff --git a/aegisub/font_file_lister_freetype.h b/aegisub/font_file_lister_freetype.h new file mode 100644 index 000000000..24d6e7f5f --- /dev/null +++ b/aegisub/font_file_lister_freetype.h @@ -0,0 +1,61 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro +// 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 + + +//////////// +// Includes +#include "font_file_lister.h" + + +//////////// +// Typedefs +typedef struct FT_LibraryRec_ *FT_Library; + + +///////////////////////////// +// Freetype Font file lister +class FreetypeFontFileLister : public FontFileLister { + friend class FontFileLister; +private: + FT_Library ft2lib; + + void DoInitialize(); + + FreetypeFontFileLister(); + ~FreetypeFontFileLister(); +};