experimental doubleres texture saving. Generates bitmaps using 2x the specified font size and adds doubleres texture hint to the file names. The UI previews don't reflect the doubleres texture (worth the effort?)

This commit is contained in:
Chris Danford
2008-05-27 10:07:24 +00:00
parent 3793272aaa
commit 94c489bae0
4 changed files with 91 additions and 63 deletions
@@ -106,7 +106,7 @@ static const wchar_t map_numbers[] = {
}; };
/* Regenerate the font, pulling in settings from widgets. */ /* Regenerate the font, pulling in settings from widgets. */
void CTextureFontGeneratorDlg::UpdateFont() void CTextureFontGeneratorDlg::UpdateFont( bool bSavingDoubleRes )
{ {
m_bUpdateFontNeeded = false; m_bUpdateFontNeeded = false;
@@ -126,16 +126,18 @@ void CTextureFontGeneratorDlg::UpdateFont()
m_FontSize.GetWindowText(sText); m_FontSize.GetWindowText(sText);
g_pTextureFont->m_fFontSizePixels = (float) atof(sText); g_pTextureFont->m_fFontSizePixels = (float) atof(sText);
if( bSavingDoubleRes )
g_pTextureFont->m_fFontSizePixels *= 2;
m_Padding.GetWindowText(sText); m_Padding.GetWindowText(sText);
g_pTextureFont->m_iPadding = atoi(sText); g_pTextureFont->m_iPadding = atoi(sText);
if( bSavingDoubleRes )
g_pTextureFont->m_iPadding *= 2;
CMenu *pMenu = GetMenu(); CMenu *pMenu = GetMenu();
g_pTextureFont->m_bBold = !!( pMenu->GetMenuState(ID_STYLE_BOLD, 0) & MF_CHECKED ); g_pTextureFont->m_bBold = !!( pMenu->GetMenuState(ID_STYLE_BOLD, 0) & MF_CHECKED );
g_pTextureFont->m_bItalic = !!( pMenu->GetMenuState(ID_STYLE_ITALIC, 0) & MF_CHECKED ); g_pTextureFont->m_bItalic = !!( pMenu->GetMenuState(ID_STYLE_ITALIC, 0) & MF_CHECKED );
g_pTextureFont->m_bAntiAlias = !!( pMenu->GetMenuState(ID_STYLE_ANTIALIASED, 0) & MF_CHECKED ); g_pTextureFont->m_bAntiAlias = !!( pMenu->GetMenuState(ID_STYLE_ANTIALIASED, 0) & MF_CHECKED );
if( !!( pMenu->GetMenuState(ID_OPTIONS_DOUBLERES, 0) & MF_CHECKED ) )
g_pTextureFont->m_fFontSizePixels *= 2;
g_pTextureFont->m_PagesToGenerate.clear(); g_pTextureFont->m_PagesToGenerate.clear();
FontPageDescription desc; FontPageDescription desc;
@@ -378,7 +380,7 @@ void CTextureFontGeneratorDlg::OnPaint()
if( m_bUpdateFontNeeded ) if( m_bUpdateFontNeeded )
{ {
m_bUpdateFontViewAndCloseUpNeeded = true; m_bUpdateFontViewAndCloseUpNeeded = true;
UpdateFont(); UpdateFont( false );
} }
if( m_bUpdateFontViewAndCloseUpNeeded ) if( m_bUpdateFontViewAndCloseUpNeeded )
@@ -581,7 +583,22 @@ void CTextureFontGeneratorDlg::OnFileSave()
} }
} }
*/ */
g_pTextureFont->Save( szFile );
CMenu *pMenu = GetMenu();
if( !!( pMenu->GetMenuState(ID_OPTIONS_DOUBLERES, 0) & MF_CHECKED ) ) // DoubleRes checked?
{
g_pTextureFont->Save( szFile, "", true, false ); // save metrics
UpdateFont( true ); // generate DoubleRes bitmaps
g_pTextureFont->Save( szFile, " (doubleres)", false, true ); // save bitmaps
// reset to normal, non-DoubleRes font
m_bUpdateFontNeeded = true;
Invalidate( FALSE );
UpdateWindow();
}
else // normal res
{
g_pTextureFont->Save( szFile, "", true, true ); // save metrics and bitmaps
}
} }
void CTextureFontGeneratorDlg::OnFileExit() void CTextureFontGeneratorDlg::OnFileExit()
@@ -38,7 +38,7 @@ protected:
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
void UpdateFontViewAndCloseUp(); void UpdateFontViewAndCloseUp();
void UpdateFont(); void UpdateFont( bool bSavingDoubleRes );
void UpdateCloseUp(); void UpdateCloseUp();
public: public:
@@ -286,10 +286,9 @@ void TextureFont::FormatFontPage( int iPage, HDC hDC )
FontPage *pPage = m_apPages[iPage]; FontPage *pPage = m_apPages[iPage];
pPage->m_iFrameWidth = (m_BoundingRect.right - m_BoundingRect.left) + m_iPadding; pPage->m_iFrameWidth = (m_BoundingRect.right - m_BoundingRect.left) + m_iPadding;
pPage->m_iFrameHeight = (m_BoundingRect.bottom - m_BoundingRect.top) + m_iPadding; pPage->m_iFrameHeight = (m_BoundingRect.bottom - m_BoundingRect.top) + m_iPadding;
if( pPage->m_iFrameWidth % 2 ) int iDimensionMultiple = 4; // TODO: This only needs to be 4 for doubleres textures. It could be 2 otherwise and use less space
++pPage->m_iFrameWidth; pPage->m_iFrameWidth = (int)ceil( pPage->m_iFrameWidth /(double)iDimensionMultiple ) * iDimensionMultiple;
if( pPage->m_iFrameHeight % 2 ) pPage->m_iFrameHeight = (int)ceil( pPage->m_iFrameHeight /(double)iDimensionMultiple ) * iDimensionMultiple;
++pPage->m_iFrameHeight;
pPage->m_iNumFramesX = (int) ceil( powf( (float) Desc.chars.size(), 0.5f ) ); pPage->m_iNumFramesX = (int) ceil( powf( (float) Desc.chars.size(), 0.5f ) );
pPage->m_iNumFramesY = (int) ceil( (float) Desc.chars.size() / pPage->m_iNumFramesX ); pPage->m_iNumFramesY = (int) ceil( (float) Desc.chars.size() / pPage->m_iNumFramesX );
@@ -372,14 +371,18 @@ void wchar_to_utf8( wchar_t ch, string &out )
#include <iomanip> #include <iomanip>
void TextureFont::Save( CString sBasePath ) void TextureFont::Save( CString sBasePath, CString sBitmapAppendBeforeExtension, bool bSaveMetrics, bool bSaveBitmaps )
{ {
if( m_sError != "" ) if( m_sError != "" )
return; return;
const CString inipath = sBasePath + ".ini"; const CString inipath = sBasePath + ".ini";
ofstream f(inipath.GetString()); ofstream f;
if( bSaveMetrics )
{
f.open(inipath.GetString());
/* Write global properties: */ /* Write global properties: */
f << "[common]\n"; f << "[common]\n";
@@ -390,6 +393,7 @@ void TextureFont::Save( CString sBasePath )
f << "DrawExtraPixelsLeft=" << m_iCharLeftOverlap << "\n"; f << "DrawExtraPixelsLeft=" << m_iCharLeftOverlap << "\n";
f << "DrawExtraPixelsRight=" << m_iCharRightOverlap << "\n"; f << "DrawExtraPixelsRight=" << m_iCharRightOverlap << "\n";
f << "AdvanceExtraPixels=0\n"; f << "AdvanceExtraPixels=0\n";
}
for( unsigned i = 0; i < m_apPages.size(); ++i ) for( unsigned i = 0; i < m_apPages.size(); ++i )
{ {
@@ -397,6 +401,8 @@ void TextureFont::Save( CString sBasePath )
ASSERT( m_apPages[i]->m_hPage ); ASSERT( m_apPages[i]->m_hPage );
FontPage &page = *m_apPages[i]; FontPage &page = *m_apPages[i];
if( bSaveMetrics )
{
f << "\n" << "[" << desc.name.GetString() << "]\n"; f << "\n" << "[" << desc.name.GetString() << "]\n";
{ {
@@ -432,18 +438,22 @@ void TextureFont::Save( CString sBasePath )
int iCharWidth = abc.abcA + int(abc.abcB) + int(abc.abcC); int iCharWidth = abc.abcA + int(abc.abcB) + int(abc.abcC);
f << j << "=" << iCharWidth << "\n"; f << j << "=" << iCharWidth << "\n";
} }
}
if( bSaveBitmaps )
{
Surface surf; Surface surf;
BitmapToSurface( m_apPages[i]->m_hPage, &surf ); BitmapToSurface( m_apPages[i]->m_hPage, &surf );
GrayScaleToAlpha( &surf ); GrayScaleToAlpha( &surf );
CString sFile; CString sFile;
sFile.Format( "%s [%s] %ix%i.png", sFile.Format( "%s [%s] %ix%i%s.png",
sBasePath.GetString(), sBasePath.GetString(),
m_PagesToGenerate[i].name.GetString(), m_PagesToGenerate[i].name.GetString(),
m_apPages[i]->m_iNumFramesX, m_apPages[i]->m_iNumFramesX,
m_apPages[i]->m_iNumFramesY ); m_apPages[i]->m_iNumFramesY,
sBitmapAppendBeforeExtension.GetString() );
FILE *f = fopen( sFile, "w+b" ); FILE *f = fopen( sFile, "w+b" );
char szErrorbuf[1024]; char szErrorbuf[1024];
@@ -451,6 +461,7 @@ void TextureFont::Save( CString sBasePath )
fclose( f ); fclose( f );
} }
} }
}
FontPage::FontPage() FontPage::FontPage()
@@ -37,7 +37,7 @@ public:
vector<FontPageDescription> m_PagesToGenerate; vector<FontPageDescription> m_PagesToGenerate;
void FormatFontPage( int iPage, HDC hDC ); void FormatFontPage( int iPage, HDC hDC );
void FormatFontPages(); void FormatFontPages();
void Save( CString sPath ); void Save( CString sPath, CString sBitmapAppendBeforeExtension, bool bSaveMetrics, bool bSaveBitmaps );
map<wchar_t, HBITMAP> m_Characters; map<wchar_t, HBITMAP> m_Characters;