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.
This commit is contained in:
Rodrigo Braz Monteiro 2007-07-29 01:21:28 +00:00
parent 4cee0dd054
commit fec497a047
8 changed files with 322 additions and 86 deletions

View file

@ -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 \

View file

@ -315,7 +315,7 @@ void DialogFontsCollector::Update(int value) {
///////////////////////
// Collect font files
void FontsCollectorThread::CollectFontData () {
FontFileLister::GatherData();
FontFileLister::Initialize();
}

View file

@ -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 <wx/dir.h>
#include <wx/tokenzr.h>
#ifdef WIN32
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_SFNT_NAMES_H
#include <shlobj.h>
#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;i<fontfiles.Count(); i++) {
// Check if it's cached
if (IsFilenameCached(fontfiles[i])) continue;
// Loop through each face in the file
for (int facenum=0;true;facenum++) {
// Get font face
FT_Face face;
fterr = FT_New_Face(ft2lib, fontfiles[i].mb_str(*wxConvFileName), facenum, &face);
if (fterr) break;
// Add font
AddFont(fontfiles[i],wxString(face->family_name, wxConvLocal));
FT_Done_Face(face);
}
}
// Save cache
SaveCache();
#else
// TODO: implement fconfig
return;
#endif
}
////////////
// Add font
void FontFileLister::AddFont(wxString filename,wxString facename) {

View file

@ -55,28 +55,28 @@ typedef std::map<wxString,wxArrayString> 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();
};

View file

@ -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 <wx/wxprec.h>
#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

View file

@ -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();
};

View file

@ -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 <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_SFNT_NAMES_H
#include <shlobj.h>
#include <wx/dir.h>
///////////////
// 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;i<fontfiles.Count(); i++) {
// Check if it's cached
if (IsFilenameCached(fontfiles[i])) continue;
// Loop through each face in the file
for (int facenum=0;true;facenum++) {
// Get font face
FT_Face face;
fterr = FT_New_Face(ft2lib, fontfiles[i].mb_str(*wxConvFileName), facenum, &face);
if (fterr) break;
// Add font
AddFont(fontfiles[i],wxString(face->family_name, wxConvLocal));
FT_Done_Face(face);
}
}
// Save cache
SaveCache();
}

View file

@ -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();
};