You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
6.6 KiB
227 lines
6.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "vgui_surfacelib/FontAmalgam.h" |
|
#include <tier0/dbg.h> |
|
#include <vgui/VGUI.h> |
|
#include <vgui/ISurface.h> |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor |
|
//----------------------------------------------------------------------------- |
|
CFontAmalgam::CFontAmalgam() |
|
{ |
|
m_Fonts.EnsureCapacity( 4 ); |
|
m_iMaxHeight = 0; |
|
m_iMaxWidth = 0; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Destructor |
|
//----------------------------------------------------------------------------- |
|
CFontAmalgam::~CFontAmalgam() |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Data accessor |
|
//----------------------------------------------------------------------------- |
|
const char *CFontAmalgam::Name() |
|
{ |
|
return m_szName; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Data accessor |
|
//----------------------------------------------------------------------------- |
|
void CFontAmalgam::SetName(const char *name) |
|
{ |
|
Q_strncpy(m_szName, name, sizeof(m_szName)); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: adds a font to the amalgam |
|
//----------------------------------------------------------------------------- |
|
void CFontAmalgam::AddFont(font_t *font, int lowRange, int highRange) |
|
{ |
|
int i = m_Fonts.AddToTail(); |
|
|
|
m_Fonts[i].font = font; |
|
m_Fonts[i].lowRange = lowRange; |
|
m_Fonts[i].highRange = highRange; |
|
|
|
m_iMaxHeight = max(font->GetHeight(), m_iMaxHeight); |
|
m_iMaxWidth = max(font->GetMaxCharWidth(), m_iMaxWidth); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: clears the fonts |
|
//----------------------------------------------------------------------------- |
|
void CFontAmalgam::RemoveAll() |
|
{ |
|
// clear out |
|
m_Fonts.RemoveAll(); |
|
m_iMaxHeight = 0; |
|
m_iMaxWidth = 0; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns the font for the given character |
|
//----------------------------------------------------------------------------- |
|
font_t *CFontAmalgam::GetFontForChar(int ch) |
|
{ |
|
for (int i = 0; i < m_Fonts.Count(); i++) |
|
{ |
|
#if defined(LINUX) |
|
if ( ch >= m_Fonts[i].lowRange && ch <= m_Fonts[i].highRange && m_Fonts[i].font->HasChar(ch)) |
|
#else |
|
if (ch >= m_Fonts[i].lowRange && ch <= m_Fonts[i].highRange) |
|
#endif |
|
{ |
|
Assert( m_Fonts[i].font->IsValid() ); |
|
return m_Fonts[i].font; |
|
} |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: sets the scale of the font |
|
//----------------------------------------------------------------------------- |
|
void CFontAmalgam::SetFontScale(float sx, float sy) |
|
{ |
|
if (!m_Fonts.Count()) |
|
return; |
|
|
|
// Make sure this is a bitmap font! |
|
if ( GetFlags( 0 ) & vgui::ISurface::FONTFLAG_BITMAP ) |
|
{ |
|
reinterpret_cast< CBitmapFont* >( m_Fonts[0].font )->SetScale( sx, sy ); |
|
} |
|
else |
|
{ |
|
Warning( "%s: Can't set font scale on a non-bitmap font!\n", m_Fonts[0].font->GetName() ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns the max height of the font set |
|
//----------------------------------------------------------------------------- |
|
int CFontAmalgam::GetFontHeight() |
|
{ |
|
if (!m_Fonts.Count()) |
|
{ |
|
return m_iMaxHeight; |
|
} |
|
return m_Fonts[0].font->GetHeight(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns requested height of the font |
|
//----------------------------------------------------------------------------- |
|
int CFontAmalgam::GetFontHeightRequested() |
|
{ |
|
if (!m_Fonts.Count()) |
|
{ |
|
return m_iMaxHeight; |
|
} |
|
return m_Fonts[0].font->GetHeightRequested(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns the maximum width of a character in a font |
|
//----------------------------------------------------------------------------- |
|
int CFontAmalgam::GetFontMaxWidth() |
|
{ |
|
return m_iMaxWidth; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns the name of the font that is loaded |
|
//----------------------------------------------------------------------------- |
|
const char *CFontAmalgam::GetFontName(int i) |
|
{ |
|
if ( m_Fonts.IsValidIndex( i ) && m_Fonts[ i ].font ) |
|
{ |
|
return m_Fonts[ i ].font->GetName(); |
|
} |
|
else |
|
{ |
|
return NULL; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns the family name of the font that is loaded |
|
//----------------------------------------------------------------------------- |
|
const char *CFontAmalgam::GetFontFamilyName( int i ) |
|
{ |
|
if ( m_Fonts.IsValidIndex( i ) && m_Fonts[ i ].font ) |
|
{ |
|
return m_Fonts[ i ].font->GetFamilyName(); |
|
} |
|
|
|
return ""; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns the name of the font that is loaded |
|
//----------------------------------------------------------------------------- |
|
int CFontAmalgam::GetFlags(int i) |
|
{ |
|
if ( m_Fonts.Count() && m_Fonts[i].font ) |
|
{ |
|
return m_Fonts[i].font->GetFlags(); |
|
} |
|
else |
|
{ |
|
return 0; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns the number of fonts this amalgam contains |
|
//----------------------------------------------------------------------------- |
|
int CFontAmalgam::GetCount() |
|
{ |
|
return m_Fonts.Count(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: returns the max height of the font set |
|
//----------------------------------------------------------------------------- |
|
bool CFontAmalgam::GetUnderlined() |
|
{ |
|
if (!m_Fonts.Count()) |
|
{ |
|
return false; |
|
} |
|
return m_Fonts[0].font->GetUnderlined(); |
|
} |
|
|
|
|
|
#ifdef DBGFLAG_VALIDATE |
|
//----------------------------------------------------------------------------- |
|
// Purpose: Ensure that all of our internal structures are consistent, and |
|
// account for all memory that we've allocated. |
|
// Input: validator - Our global validator object |
|
// pchName - Our name (typically a member var in our container) |
|
//----------------------------------------------------------------------------- |
|
void CFontAmalgam::Validate( CValidator &validator, char *pchName ) |
|
{ |
|
validator.Push( "CFontAmalgam", this, pchName ); |
|
|
|
ValidateObj( m_Fonts ); |
|
|
|
validator.Pop(); |
|
} |
|
#endif // DBGFLAG_VALIDATE
|
|
|