//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: PS3 support for true type fonts. // //=====================================================================================// #if 0 // clipped for now #include "materialsystem/imaterialsystem.h" #include "vgui_surfacelib/Win32Font.h" #include "vgui_surfacelib/FontManager.h" #include "../materialsystem/ifont.h" #include "FontEffects.h" #include CWin32Font::CWin32Font() : m_ExtendedABCWidthsCache(256, 0, &ExtendedABCWidthsCacheLessFunc) { m_pFont = NULL; } CWin32Font::~CWin32Font() { //FontManager().MaterialSystem()->CloseTrueTypeFont(m_pFont); m_pFont = NULL; } // Create the font bool CWin32Font::Create(const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags) { // setup font properties m_iTall = tall; m_iWeight = weight; m_iFlags = flags; m_bAntiAliased = (flags & FONTFLAG_ANTIALIAS) ? 1 : 0; m_iDropShadowOffset = (flags & FONTFLAG_DROPSHADOW) ? 1 : 0; m_iOutlineSize = (flags & FONTFLAG_OUTLINE) ? 1 : 0; m_iBlur = blur; m_iScanLines = scanlines; m_bRotary = (flags & FONTFLAG_ROTARY) ? 1 : 0; m_bAdditive = (flags & FONTFLAG_ADDITIVE) ? 1 : 0; m_szName = windowsFontName; // if the weight is greater that 400, set the style to bold (cf win32font_x360) // By default use the regular style m_iWeight = 0x10000 ; // ONE16Dot16 1.0f (F16Dot16 format used by font fusion) if ( weight > 400 ) { m_iWeight = 5L << 14; // 1.25 (F16Dot16 format used by font fusion) } // Open the font ExecuteNTimes( 5, Warning( "Fonts dont work on PS3\n" ) ); //m_pFont = FontManager().MaterialSystem()->OpenTrueTypeFont(windowsFontName, tall, m_iWeight); if(m_pFont == NULL) { Warning("Failed to open font %s\n", windowsFontName); return false; } // Store the font parameters m_iHeight = m_pFont->GetMaxHeight(); m_iAscent = m_pFont->GetAscent(); m_iMaxCharWidth = m_pFont->GetMaxWidth(); // Setup ABC cache // get char spacing // a is space before character (can be negative) // b is the width of the character // c is the space after the character memset(m_ABCWidthsCache, 0, sizeof(m_ABCWidthsCache)); for(int i = 0; i < ABCWIDTHS_CACHE_SIZE; i++) { int a,b,c; a = 0; b = 0; c = 0; m_pFont->GetCharABCWidth(i, a, b, c); m_ABCWidthsCache[i].a = a - m_iBlur; m_ABCWidthsCache[i].b = b + m_iBlur*2; m_ABCWidthsCache[i].c = c - m_iBlur; } // many fonts are blindly precached by vgui and never used // save memory and don't hold font open, re-open if glyph actually requested used during draw Assert( 0 ); //FontManager().MaterialSystem()->CloseTrueTypeFont( m_pFont ); m_pFont = NULL; return true; } // Render the font to a buffer void CWin32Font::GetCharRGBA(wchar_t ch, int rgbaWide, int rgbaTall, unsigned char *rgba) { if ( ch == '\t' ) { // tabs don't draw return; } if ( !m_pFont ) { // demand request for font glyph, re-create font Assert( 0 ); //m_pFont = FontManager().MaterialSystem()->OpenTrueTypeFont(GetName(), m_iTall, m_iWeight); } int a, c, wide, tall; GetCharABCWidths( ch, a, wide, c ); tall = m_iHeight; m_pFont->RenderToBuffer(ch, m_iBlur, rgbaWide, rgbaTall, rgba); // apply requested effects in specified order //ApplyDropShadowToTexture( rgbaX, rgbaY, rgbaWide, rgbaTall, wide, tall, rgba, m_iDropShadowOffset ); //ApplyOutlineToTexture( rgbaX, rgbaY, rgbaWide, rgbaTall, wide, tall, rgba, m_iOutlineSize ); ApplyGaussianBlurToTexture( rgbaWide, rgbaTall, rgba, m_iBlur ); ApplyScanlineEffectToTexture( rgbaWide, rgbaTall, rgba, m_iScanLines ); //ApplyRotaryEffectToTexture( rgbaX, rgbaY, rgbaWide, rgbaTall, rgba, m_bRotary ); } bool CWin32Font::IsEqualTo(const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags) { if ( !stricmp(windowsFontName, m_szName.String() ) && m_iTall == tall && m_iWeight == weight && m_iBlur == blur && m_iScanLines == scanlines) { return true; } return false; } bool CWin32Font::IsValid() { return true; } // Font metrics void CWin32Font::GetCharABCWidths(int ch, int &a, int &b, int &c) { Assert( IsValid() ); if (ch < ABCWIDTHS_CACHE_SIZE) { // use the cache entry a = m_ABCWidthsCache[ch].a; b = m_ABCWidthsCache[ch].b; c = m_ABCWidthsCache[ch].c; } else { // look for it in the cache abc_cache_t finder = { (wchar_t)ch }; unsigned short i = m_ExtendedABCWidthsCache.Find(finder); if (m_ExtendedABCWidthsCache.IsValidIndex(i)) { a = m_ExtendedABCWidthsCache[i].abc.a; b = m_ExtendedABCWidthsCache[i].abc.b; c = m_ExtendedABCWidthsCache[i].abc.c; return; } if(!m_pFont) { //BRAD: In some instances (e.g. when you try and create an EAOnline account) it tries // to call GetCharABCWidths before GetCharRGBA so m_pFont is not opened. // demand request for font glyph, re-create font Assert( 0 ); //m_pFont = FontManager().MaterialSystem()->OpenTrueTypeFont(GetName(), m_iTall, m_iWeight); } m_pFont->GetCharABCWidth(ch, a, b, c); // add to the cache finder.abc.a = a; finder.abc.b = b; finder.abc.c = c; m_ExtendedABCWidthsCache.Insert(finder); } } int CWin32Font::GetHeight() { return m_iHeight; } int CWin32Font::GetAscent() { return m_iAscent; } int CWin32Font::GetMaxCharWidth() { return m_iMaxCharWidth; } int CWin32Font::GetFlags() { return m_iFlags; } bool CWin32Font::ExtendedABCWidthsCacheLessFunc(const abc_cache_t &lhs, const abc_cache_t &rhs) { return lhs.wch < rhs.wch; } #endif