94 lines
2.4 KiB
C++
94 lines
2.4 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "font/font_cache.h"
|
|
#include "font/font_extended.h"
|
|
#include "filesystem/filesystem.h"
|
|
#include "platform.h"
|
|
#include "log/log.h"
|
|
|
|
using namespace GS;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
FontEx *FontCache::GetFont(const char *name) const
|
|
{
|
|
ListForeachPtr(FontAlias *, alias, font_aliases)
|
|
if (alias->font->GetName() == name)
|
|
return alias->font;
|
|
|
|
return NULL;
|
|
}
|
|
FontAlias *FontCache::GetAlias(const char *alias) const
|
|
{
|
|
ListForeachPtr(FontAlias *, font, font_aliases)
|
|
if (font->alias == alias)
|
|
return font;
|
|
return NULL;
|
|
}
|
|
FontEx *FontCache::GetAliasedFont(const char *alias) const
|
|
{
|
|
FontAlias *fa = GetAlias(alias);
|
|
return fa ? fa->font.c_ptr() : NULL;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
FontEx *FontCache::LoadFont(const char *path, const char *alias)
|
|
{
|
|
// Look for an already loaded instance of the font.
|
|
FontEx *font = GetFont(path);
|
|
|
|
// If font is not available, load it.
|
|
if (font == NULL)
|
|
{
|
|
IFont *base_font = font_factory->LoadFont(path);
|
|
if (base_font == NULL)
|
|
return NULL;
|
|
|
|
// Wrap with an extended font.
|
|
font = new FontEx(base_font);
|
|
}
|
|
|
|
// Format default alias if none provided.
|
|
String _alias(path);
|
|
_alias.FileCutPathAndExtension();
|
|
if (!alias)
|
|
alias = _alias;
|
|
|
|
// Drop current alias if existing.
|
|
FontAlias *font_alias = GetAlias(alias);
|
|
if (font_alias)
|
|
font_aliases.Remove(font_alias);
|
|
|
|
// Create the alias.
|
|
font_alias = new FontAlias;
|
|
font_alias->alias = alias;
|
|
font_alias->font = font;
|
|
|
|
font_aliases.Add(font_alias);
|
|
|
|
__LOG__ << "Created a new font alias from '" << path << "' to '" << alias << "'.\n";
|
|
return font;
|
|
}
|
|
void FontCache::DeleteAlias(const char *alias)
|
|
{
|
|
ListForeachPtr(FontAlias *, a, font_aliases)
|
|
if (a->alias == alias)
|
|
font_aliases.Remove(a);
|
|
}
|
|
void FontCache::DeleteAllFont()
|
|
{
|
|
font_aliases.Clear();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
FontCache::~FontCache()
|
|
{
|
|
// [EJ] Get rid of the fonts before the factory.
|
|
DeleteAllFont();
|
|
}
|