summaryrefslogtreecommitdiff
path: root/vgui2/vgui_surfacelib/FontAmalgam.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vgui2/vgui_surfacelib/FontAmalgam.cpp')
-rw-r--r--vgui2/vgui_surfacelib/FontAmalgam.cpp227
1 files changed, 227 insertions, 0 deletions
diff --git a/vgui2/vgui_surfacelib/FontAmalgam.cpp b/vgui2/vgui_surfacelib/FontAmalgam.cpp
new file mode 100644
index 0000000..3401014
--- /dev/null
+++ b/vgui2/vgui_surfacelib/FontAmalgam.cpp
@@ -0,0 +1,227 @@
+//========= 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