source-engine/utils/xbox/FontMaker/fontmaker.cpp

1120 lines
41 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//-----------------------------------------------------------------------------
// Name: FontMaker.cpp
//
// Desc: Defines the class behaviors for the application.
//
// Hist: 09.06.02 - Revised Fontmaker sample
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "FontMaker.h"
#include "Glyphs.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CTextureFont g_Font;
extern BOOL g_bIsGlyphSelected;
extern int g_iSelectedGlyphNum;
extern GLYPH_ATTR* g_pSelectedGylph;
extern WCHAR g_cSelectedGlyph;
//-----------------------------------------------------------------------------
// CFontMakerApp
//-----------------------------------------------------------------------------
BEGIN_MESSAGE_MAP(CFontMakerApp, CWinApp)
//{{AFX_MSG_MAP(CFontMakerApp)
ON_COMMAND(IDM_FILE_NEWFONT, OnNewFontButton)
ON_BN_CLICKED(IDC_EFFECTSOUTLINED_CHECK, OnEffectsCheck)
ON_BN_CLICKED(IDC_EFFECTSSHADOWED_CHECK, OnEffectsCheck)
ON_BN_CLICKED(IDC_EFFECTSBLURRED_CHECK, OnEffectsCheck)
ON_BN_CLICKED(IDC_EFFECTSSCANLINES_CHECK, OnEffectsCheck)
ON_BN_CLICKED(IDC_EFFECTSANTIALIAS_CHECK, OnEffectsCheck)
ON_BN_CLICKED(IDC_GLYPHSFROMRANGE_RADIO, OnGlyphsFromRangeRadio)
ON_EN_CHANGE(IDC_GLYPHSRANGEFROM_EDIT, OnChangeGlpyhsRangeEdit)
ON_BN_CLICKED(IDC_GLYPHSFROMFILE_RADIO, OnGlyphsFromFileRadio)
ON_EN_KILLFOCUS(IDC_GLYPHSFILE_EDIT, OnChangeGlyphsFileEdit)
ON_BN_CLICKED(IDC_GLYPHSFILESELECTOR_BUTTON, OnGlyphsFileSelectorButton)
ON_BN_CLICKED(IDC_GLYPHSCUSTOM_RADIO, OnGlyphsCustom)
ON_BN_CLICKED(IDC_TEXTURESIZE_BUTTON, OnTextureSizeButton)
ON_BN_CLICKED(IDC_MAGNIFY_BUTTON, OnMagnifyButton)
ON_BN_CLICKED(IDC_GLYPH_SPECIAL, OnGlyphSpecial)
ON_UPDATE_COMMAND_UI(IDC_MAGNIFY_BUTTON, OnUpdateButton)
ON_COMMAND(IDM_FILE_LOADFONTFILE, OnLoadButton)
ON_COMMAND(IDM_FILE_SAVEFONTFILES, OnSaveButton)
ON_COMMAND(IDM_FILE_LOADFONTLAYOUT, OnLoadCustomFontButton)
ON_COMMAND(IDM_FILE_EXIT, OnExit)
ON_COMMAND(ID_APP_ABOUT, OnAbout)
ON_COMMAND(ID_HELP, OnHelp)
ON_EN_CHANGE(IDC_GLYPHSRANGETO_EDIT, OnChangeGlpyhsRangeEdit)
ON_UPDATE_COMMAND_UI(IDC_TEXTURESIZE_BUTTON, OnUpdateButton)
ON_UPDATE_COMMAND_UI(IDC_GLYPHSFILESELECTOR_BUTTON, OnUpdateButton)
ON_UPDATE_COMMAND_UI(IDM_FILE_NEWFONT, OnUpdateButton)
ON_UPDATE_COMMAND_UI(IDM_FILE_LOADFONTFILE, OnUpdateButton)
ON_UPDATE_COMMAND_UI(IDM_FILE_LOADFONTLAYOUT, OnUpdateButton)
ON_UPDATE_COMMAND_UI(IDM_FILE_SAVEFONTFILES, OnUpdateButton)
ON_UPDATE_COMMAND_UI(IDM_FILE_EXIT, OnUpdateButton)
ON_UPDATE_COMMAND_UI(ID_APP_ABOUT, OnUpdateButton)
ON_UPDATE_COMMAND_UI(ID_HELP, OnUpdateButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//-----------------------------------------------------------------------------
// The one and only CFontMakerApp object
//-----------------------------------------------------------------------------
CFontMakerApp theApp;
//-----------------------------------------------------------------------------
// Name: InitInstance()
// Desc: App initialization
//-----------------------------------------------------------------------------
BOOL CFontMakerApp::InitInstance()
{
// Create the main frame window for the app
CFontMakerFrameWnd* pFrameWnd = new CFontMakerFrameWnd;
m_pMainWnd = pFrameWnd;
// Associate the view with the frame
CCreateContext context;
context.m_pCurrentFrame = NULL;
context.m_pCurrentDoc = NULL;
context.m_pNewViewClass = RUNTIME_CLASS(CFontMakerView);
context.m_pNewDocTemplate = NULL;
// Create the frame and load resources (menu, accelerator, etc.)
pFrameWnd->LoadFrame( IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
NULL, &context );
// Call OnInitialUpdate() to be called for the view
pFrameWnd->InitialUpdateFrame( NULL, TRUE );
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow( SW_SHOW );
m_pMainWnd->UpdateWindow();
// Load the hourglass cursor
m_hWaitCursor = LoadCursor( IDC_WAIT );
// Get access the the dialog controls and the view
m_pDialogBar = pFrameWnd->GetDialogBar();
m_pView = (CFontMakerView*)pFrameWnd->GetActiveView();
// Initially, no font is selected
m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->SetWindowText( _T("<Choose font>") );
m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->SetWindowText( _T("") );
m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->SetWindowText( _T("") );
return TRUE;
}
//-----------------------------------------------------------------------------
// Name: OnUpdateButton()
// Desc: This function is needed to override some internal mucking with button
// states. Without it, button and menu enabling will make you crazy.
//-----------------------------------------------------------------------------
void CFontMakerApp::OnUpdateButton( CCmdUI* pCmdUI )
{
BOOL bEnable;
switch( pCmdUI->m_nID )
{
// Controls which are active all the time
case IDM_FILE_NEWFONT:
case IDM_FILE_LOADFONTLAYOUT:
case IDM_FILE_LOADFONTFILE:
case IDM_FILE_EXIT:
case ID_APP_ABOUT:
case ID_HELP:
bEnable = TRUE;
break;
case IDC_TEXTURESIZE_BUTTON:
case IDM_FILE_SAVEFONTFILES:
case IDC_MAGNIFY_BUTTON:
bEnable = g_Font.m_hFont ? TRUE : FALSE;
if ( !bEnable )
bEnable = g_Font.m_pCustomFilename ? TRUE : FALSE;
break;
// Controls which are active only when a font is available
default:
bEnable = g_Font.m_hFont ? TRUE : FALSE;
break;
}
pCmdUI->Enable( bEnable );
}
BOOL g_bFirstTime = TRUE;
//-----------------------------------------------------------------------------
// Name: OnNewFontButton()
// Desc: Called when the user hits the "New Font" button, this loads the font
// and enables all the other windows controls.
//-----------------------------------------------------------------------------
void CFontMakerApp::OnNewFontButton()
{
// Initialize the LOGFONT structure. It's static so it's state is remembered
if ( g_Font.m_LogFont.lfHeight == 0 )
{
// first time init
strcpy( g_Font.m_LogFont.lfFaceName, "Arial" ); // Arial font for a default
g_Font.m_LogFont.lfHeight = 16; // 16 height font for a default
g_Font.m_LogFont.lfWeight = 400; // 400 = normal, 700 = bold, etc.
g_Font.m_LogFont.lfItalic = 0; // 0 = normal, 255 = italic
g_Font.m_LogFont.lfQuality = ANTIALIASED_QUALITY;
}
// convert to point size for dialog purposes
HDC hDC = GetDC( m_pMainWnd->m_hWnd );
// Current point size unit=1/10 pts
INT iPointSize = g_Font.m_LogFont.lfHeight * 10;
g_Font.m_LogFont.lfHeight= -MulDiv( iPointSize, GetDeviceCaps( hDC, LOGPIXELSY ), 720 );
ReleaseDC( m_pMainWnd->m_hWnd, hDC );
// Create the CHOOSEFONT structure
static CHOOSEFONT cf = {0};
cf.lStructSize = sizeof(CHOOSEFONT);
cf.lpLogFont = &g_Font.m_LogFont;
cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
cf.nFontType = SCREEN_FONTTYPE;
if ( 0 == ChooseFont( &cf ) )
return;
g_Font.m_pCustomFilename = NULL;
// NOT using point sizes, but cell heights
g_Font.m_LogFont.lfHeight = cf.iPointSize/10;
// Reset the selected glpyh
UpdateSelectedGlyph( FALSE );
if( FAILED( CalculateAndRenderGlyphs() ) )
{
// Could not create new font
MessageBox( m_pMainWnd->m_hWnd, "Could not create the requested font!", "Error", MB_ICONERROR|MB_OK );
return;
}
char tempName[256];
sprintf( tempName, "%s_%d", g_Font.m_LogFont.lfFaceName, cf.iPointSize/10 );
// remove any spaces in the font name
for (unsigned int i=0,j=0; i<strlen( tempName )+1; i++)
{
if ( tempName[i] != ' ' )
{
g_Font.m_strFontName[j++] = tempName[i];
}
}
if ( g_bFirstTime )
{
CString str;
// Set font properties
m_pDialogBar->GetDlgItem( IDC_FONT_GROUPBOX )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTNAME_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTSIZE_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSOUTLINED_CHECK )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSSHADOWED_CHECK )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_BLUR_EDIT )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_SCANLINES_EDIT )->EnableWindow( TRUE );
if ( g_Font.m_bAntialiasEffect )
{
((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK ))->SetCheck( TRUE );
}
else
{
((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK ))->SetCheck( FALSE );
}
str.Format( "%d", g_Font.m_nBlur );
m_pDialogBar->GetDlgItem( IDC_BLUR_EDIT )->SetWindowText( str );
str.Format( "%d", g_Font.m_nScanlines );
m_pDialogBar->GetDlgItem( IDC_SCANLINES_EDIT )->SetWindowText( str );
str.Format( "%s", g_Font.m_LogFont.lfFaceName );
m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->SetWindowText( str );
if( g_Font.m_LogFont.lfItalic )
str.Format( "Italic", g_Font.m_LogFont.lfWeight < 550 ? "" : "Bold " );
else
str.Format( "%s", g_Font.m_LogFont.lfWeight < 550 ? "Regular" : "Bold" );
m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->SetWindowText( str );
str.Format( "%ld", cf.iPointSize/10 );
m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->SetWindowText( str );
// Set texture properties
m_pDialogBar->GetDlgItem( IDC_TEXTURE_GROUPBOX )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTURESIZE_BUTTON )->EnableWindow( TRUE );
SetTextureSize( g_Font.m_dwTextureWidth, g_Font.m_dwTextureHeight );
// Set glyph range properties
m_pDialogBar->GetDlgItem( IDC_GLYPHS_GROUPBOX )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILESELECTOR_BUTTON )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO )->EnableWindow( TRUE );
// Set a default range of glyphs to use
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->SetWindowText( "32" );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->SetWindowText( "127" );
g_Font.ExtractValidGlyphsFromRange( 32, 127 );
m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_EDIT )->EnableWindow( TRUE );
}
else
{
CString str;
str.Format( "%s", g_Font.m_LogFont.lfFaceName );
m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->SetWindowText( str );
if ( g_Font.m_LogFont.lfItalic )
str.Format( "Italic", g_Font.m_LogFont.lfWeight < 550 ? "" : "Bold " );
else
str.Format( "%s", g_Font.m_LogFont.lfWeight < 550 ? "Regular" : "Bold" );
m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->SetWindowText( str );
str.Format( "%ld", cf.iPointSize/10 );
m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->SetWindowText( str );
}
g_bFirstTime = FALSE;
}
//-----------------------------------------------------------------------------
// Name: OnGlyphsFromRangeRadio()
// Desc: User will be specifying a glyph range manually
//-----------------------------------------------------------------------------
void CFontMakerApp::OnGlyphsFromRangeRadio()
{
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILESELECTOR_BUTTON )->EnableWindow( FALSE );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO ))->SetCheck( false );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( true );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO ))->SetCheck( false );
OnChangeGlpyhsRangeEdit();
}
//-----------------------------------------------------------------------------
// Name: OnChangeGlpyhsRangeEdit()
// Desc: User changed the range of glpyhs
//-----------------------------------------------------------------------------
void CFontMakerApp::OnChangeGlpyhsRangeEdit()
{
if( NULL == g_Font.m_hFont )
return;
CEdit* pGlyphRangeFromEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT );
CEdit* pGlyphRangeToEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT );
CString strFrom;
CString strTo;
pGlyphRangeFromEdit->GetWindowText( strFrom );
pGlyphRangeToEdit->GetWindowText( strTo );
WORD wFrom = (WORD)max( 0, atoi( strFrom ) );
WORD wTo = (WORD)min( 65535, atoi( strTo ) );
g_Font.ExtractValidGlyphsFromRange( wFrom, wTo );
// Draw the new font glyphs
CalculateAndRenderGlyphs();
}
void CFontMakerApp::OnGlyphsCustom()
{
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO ))->SetCheck( false );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( false );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO ))->SetCheck( true );
}
//-----------------------------------------------------------------------------
// Name: OnGlyphsFromFileRadio()
// Desc: User want to extract glyphs that are used in a text file
//-----------------------------------------------------------------------------
void CFontMakerApp::OnGlyphsFromFileRadio()
{
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_LABEL )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_LABEL )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILESELECTOR_BUTTON )->EnableWindow( TRUE );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO ))->SetCheck( true );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( false );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO ))->SetCheck( false );
OnChangeGlyphsFileEdit();
}
//-----------------------------------------------------------------------------
// Name: OnChangeGlyphsFileEdit()
// Desc: Handle change in name of file to extract glyphs from
//-----------------------------------------------------------------------------
void CFontMakerApp::OnChangeGlyphsFileEdit()
{
CEdit* pGlyphFileNameEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT );
CString strFileName;
pGlyphFileNameEdit->GetWindowText( strFileName );
if( strFileName.IsEmpty() )
return;
g_Font.ExtractValidGlyphsFromFile( (const TCHAR*)strFileName );
// Draw the new font glyphs
CalculateAndRenderGlyphs();
}
//-----------------------------------------------------------------------------
// Name: OnGlyphsFileSelectorButton()
// Desc: Handle change in name of file to extract glyphs from
//-----------------------------------------------------------------------------
void CFontMakerApp::OnGlyphsFileSelectorButton()
{
static TCHAR strFileName[MAX_PATH] = _T("");
static TCHAR strFileName2[MAX_PATH] = _T("");
static TCHAR strInitialDir[MAX_PATH] = _T("c:\\");
// Display the OpenFileName dialog. Then, try to load the specified file
OPENFILENAME ofn = { sizeof(OPENFILENAME), NULL, NULL,
_T("Text files (.txt)\0*.txt\0\0"),
NULL, 0, 1, strFileName, MAX_PATH, strFileName2, MAX_PATH,
strInitialDir, _T("Open Text File"),
OFN_FILEMUSTEXIST, 0, 1, NULL, 0, NULL, NULL };
if( TRUE == GetOpenFileName( &ofn ) )
{
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->SetWindowText( ofn.lpstrFile);
OnChangeGlyphsFileEdit();
}
}
//-----------------------------------------------------------------------------
// Name: OnEffectsCheck()
// Desc: User changed font rendering options
//-----------------------------------------------------------------------------
void CFontMakerApp::OnEffectsCheck()
{
g_Font.m_bOutlineEffect = ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSOUTLINED_CHECK ))->GetCheck();
g_Font.m_bShadowEffect = ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSSHADOWED_CHECK ))->GetCheck();
g_Font.m_bAntialiasEffect = ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK ))->GetCheck();
bool bValveEffects = false;
if ( g_Font.m_bOutlineEffect || g_Font.m_bShadowEffect )
{
m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK )->EnableWindow( false );
m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK )->EnableWindow( false );
((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK ))->SetCheck( false );
((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK ))->SetCheck( false );
}
else
{
m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK )->EnableWindow( true );
m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK )->EnableWindow( true );
bValveEffects = true;
}
if ( bValveEffects && ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK ))->GetCheck() )
{
CEdit* pBlurEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_BLUR_EDIT );
CString strBlur;
pBlurEdit->GetWindowText( strBlur );
g_Font.m_nBlur = max( 2, atoi( strBlur ) );
strBlur.Format( "%d", g_Font.m_nBlur );
pBlurEdit->SetWindowText( strBlur );
}
else
{
g_Font.m_nBlur = 0;
}
if ( bValveEffects && ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK ))->GetCheck() )
{
CEdit* pScanlineEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_SCANLINES_EDIT );
CString strScanlines;
pScanlineEdit->GetWindowText( strScanlines );
g_Font.m_nScanlines = max( 2, atoi( strScanlines ) );
strScanlines.Format( "%d", g_Font.m_nScanlines );
pScanlineEdit->SetWindowText( strScanlines );
}
else
{
g_Font.m_nScanlines = 0;
}
// Draw the new font glyphs
CalculateAndRenderGlyphs();
}
//-----------------------------------------------------------------------------
// Name: OnMagnifyButton()
// Desc: User wants to run the Windows "magnify" tool
//-----------------------------------------------------------------------------
void CFontMakerApp::OnMagnifyButton()
{
// Run the Windows "magnify" tool
WinExec( "magnify.exe", TRUE );
}
//-----------------------------------------------------------------------------
// Name: class CTextureSizeDlg
// Desc: Simple dialog to change the font texture size
//-----------------------------------------------------------------------------
class CTextureSizeDlg : public CDialog
{
public:
CTextureSizeDlg();
// Dialog Data
//{{AFX_DATA(CTextureSizeDlg)
enum { IDD = IDD_TEXTURESIZE };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTextureSizeDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CTextureSizeDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CTextureSizeDlg::CTextureSizeDlg() : CDialog(CTextureSizeDlg::IDD)
{
//{{AFX_DATA_INIT(CTextureSizeDlg)
//}}AFX_DATA_INIT
}
void CTextureSizeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTextureSizeDlg)
DDX_Text( pDX, IDC_WIDTH, g_Font.m_dwTextureWidth );
DDV_MinMaxInt( pDX, g_Font.m_dwTextureWidth, 16, 2048 );
DDX_Text( pDX, IDC_HEIGHT, g_Font.m_dwTextureHeight );
DDV_MinMaxInt( pDX, g_Font.m_dwTextureHeight, 16, 2048 );
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTextureSizeDlg, CDialog)
//{{AFX_MSG_MAP(CTextureSizeDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CFontMakerApp::SetTextureSize( int width, int height )
{
g_Font.m_dwTextureWidth = width;
g_Font.m_dwTextureHeight = height;
CString str;
str.Format( "%ld", g_Font.m_dwTextureWidth );
m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_STATIC )->SetWindowText( str );
str.Format( "%ld", g_Font.m_dwTextureHeight );
m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_STATIC )->SetWindowText( str );
}
//-----------------------------------------------------------------------------
// Name: OnTextureSizeButton()
// Desc: User wants to change the font texture size
//-----------------------------------------------------------------------------
void CFontMakerApp::OnTextureSizeButton()
{
if ( !g_Font.m_hFont && !g_Font.m_pCustomFilename )
return;
CTextureSizeDlg dlgTextureSize;
dlgTextureSize.DoModal();
SetTextureSize( g_Font.m_dwTextureWidth, g_Font.m_dwTextureHeight );
// Draw the new font glyphs
CalculateAndRenderGlyphs();
}
void CFontMakerApp::InsertGlyph()
{
CEdit* pGlyphInsert = (CEdit*)m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_EDIT );
CString strInsert;
pGlyphInsert->GetWindowText( strInsert );
WORD wGlyph = atoi( strInsert );
if ( wGlyph < 0 )
wGlyph = 0;
else if ( wGlyph > 65535 )
wGlyph = 65535;
g_Font.InsertGlyph( wGlyph );
}
//-----------------------------------------------------------------------------
// Name: UpdateSelectedGlyph()
// Desc: User changed (via mouse or keyboard) which glyph is selected
//-----------------------------------------------------------------------------
void CFontMakerApp::UpdateSelectedGlyph( BOOL bGlyphSelected, int iSelectedGlyph )
{
// Handle case where no glyph is selected
g_bIsGlyphSelected = FALSE;
g_iSelectedGlyphNum = 0;
g_pSelectedGylph = NULL;
g_cSelectedGlyph = L'\0';
if ( bGlyphSelected )
{
for ( DWORD i=0; i<=g_Font.m_cMaxGlyph; i++ )
{
if ( g_Font.m_TranslatorTable[i] == iSelectedGlyph )
{
g_bIsGlyphSelected = TRUE;
g_iSelectedGlyphNum = iSelectedGlyph;
g_pSelectedGylph = &g_Font.m_pGlyphs[iSelectedGlyph];
g_cSelectedGlyph = (WCHAR)i;
break;
}
}
}
// Enable/disable/set-text-of the appropriate controls
if ( g_bIsGlyphSelected )
{
CString str;
str.Format( "%d", g_cSelectedGlyph ); m_pDialogBar->GetDlgItem( IDC_GLYPH_VALUE_STATIC )->SetWindowText( str );
str.Format( "%d", g_pSelectedGylph->x ); m_pDialogBar->GetDlgItem( IDC_GLYPH_X_STATIC )->SetWindowText( str );
str.Format( "%d", g_pSelectedGylph->y ); m_pDialogBar->GetDlgItem( IDC_GLYPH_Y_STATIC )->SetWindowText( str );
str.Format( "%d", g_pSelectedGylph->w ); m_pDialogBar->GetDlgItem( IDC_GLYPH_W_STATIC )->SetWindowText( str );
str.Format( "%d", g_pSelectedGylph->h ); m_pDialogBar->GetDlgItem( IDC_GLYPH_H_STATIC )->SetWindowText( str );
str.Format( "%d", g_pSelectedGylph->a ); m_pDialogBar->GetDlgItem( IDC_GLYPH_A_STATIC )->SetWindowText( str );
str.Format( "%d", g_pSelectedGylph->b ); m_pDialogBar->GetDlgItem( IDC_GLYPH_B_STATIC )->SetWindowText( str );
str.Format( "%d", g_pSelectedGylph->c ); m_pDialogBar->GetDlgItem( IDC_GLYPH_C_STATIC )->SetWindowText( str );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPH_SPECIAL ))->SetCheck( g_Font.m_ValidGlyphs[g_cSelectedGlyph] == 2 );
}
else
{
CString str("");
m_pDialogBar->GetDlgItem( IDC_GLYPH_VALUE_STATIC )->SetWindowText( str );
m_pDialogBar->GetDlgItem( IDC_GLYPH_X_STATIC )->SetWindowText( str );
m_pDialogBar->GetDlgItem( IDC_GLYPH_Y_STATIC )->SetWindowText( str );
m_pDialogBar->GetDlgItem( IDC_GLYPH_W_STATIC )->SetWindowText( str );
m_pDialogBar->GetDlgItem( IDC_GLYPH_H_STATIC )->SetWindowText( str );
m_pDialogBar->GetDlgItem( IDC_GLYPH_A_STATIC )->SetWindowText( str );
m_pDialogBar->GetDlgItem( IDC_GLYPH_B_STATIC )->SetWindowText( str );
m_pDialogBar->GetDlgItem( IDC_GLYPH_C_STATIC )->SetWindowText( str );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPH_SPECIAL ))->SetCheck( FALSE );
}
m_pDialogBar->GetDlgItem( IDC_SELECTEDGLYPH_GROUPBOX )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_VALUE_LABEL )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_X_LABEL )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_Y_LABEL )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_W_LABEL )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_H_LABEL )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_A_LABEL )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_B_LABEL )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_C_LABEL )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_VALUE_STATIC )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_X_STATIC )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_Y_STATIC )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_W_STATIC )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_H_STATIC )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_A_STATIC )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_B_STATIC )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_C_STATIC )->EnableWindow( g_bIsGlyphSelected );
m_pDialogBar->GetDlgItem( IDC_GLYPH_SPECIAL )->EnableWindow( g_bIsGlyphSelected );
}
//-----------------------------------------------------------------------------
// Name: OnGlyphSpecial()
// Desc: User changed the status of the selected glyph
//-----------------------------------------------------------------------------
void CFontMakerApp::OnGlyphSpecial()
{
if( g_bIsGlyphSelected )
{
if( ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPH_SPECIAL ))->GetCheck() )
g_Font.m_ValidGlyphs[g_cSelectedGlyph] = 2;
else
g_Font.m_ValidGlyphs[g_cSelectedGlyph] = 1;
// Draw the font glyphs, which may have changed layout
CalculateAndRenderGlyphs();
}
}
//-----------------------------------------------------------------------------
// Name: OnLoadButton()
// Desc: User wants to load a font file
//-----------------------------------------------------------------------------
void CFontMakerApp::OnLoadButton()
{
CHAR strVBFFileName[MAX_PATH];
sprintf( strVBFFileName, "%s.vbf", g_Font.m_strFontName );
OPENFILENAME ofnVBF; // common dialog box structure
ZeroMemory( &ofnVBF, sizeof(OPENFILENAME) );
ofnVBF.lStructSize = sizeof(OPENFILENAME);
ofnVBF.hwndOwner = m_pMainWnd->m_hWnd;
ofnVBF.lpstrFilter = "Font files (*.vbf)\0*.vbf\0\0";
ofnVBF.nFilterIndex = 1;
ofnVBF.lpstrFile = strVBFFileName;
ofnVBF.nMaxFile = sizeof(strVBFFileName);
ofnVBF.lpstrFileTitle = NULL;
ofnVBF.nMaxFileTitle = 0;
ofnVBF.lpstrInitialDir = NULL;
ofnVBF.lpstrTitle = "Load Font (VBF) File...";
ofnVBF.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_READONLY;
// Display the Load dialog box for the VBF file
if ( FALSE == GetOpenFileName( &ofnVBF ) )
return;
if ( FAILED( g_Font.ReadFontInfoFile( strVBFFileName ) ) )
{
m_pMainWnd->MessageBox( "Could not load the Valve bitmap font info file.",
"Error", MB_ICONERROR|MB_OK );
return;
}
}
//-----------------------------------------------------------------------------
// OnLoadCustomFontButton
//-----------------------------------------------------------------------------
void CFontMakerApp::OnLoadCustomFontButton()
{
CHAR strVCFFileName[MAX_PATH];
strVCFFileName[0] = '\0';
OPENFILENAME ofnVCF; // common dialog box structure
ZeroMemory( &ofnVCF, sizeof(OPENFILENAME) );
ofnVCF.lStructSize = sizeof(OPENFILENAME);
ofnVCF.hwndOwner = m_pMainWnd->m_hWnd;
ofnVCF.lpstrFilter = "Custom Font files (*.vcf)\0*.vcf\0\0";
ofnVCF.nFilterIndex = 1;
ofnVCF.lpstrFile = strVCFFileName;
ofnVCF.nMaxFile = sizeof(strVCFFileName);
ofnVCF.lpstrFileTitle = NULL;
ofnVCF.nMaxFileTitle = 0;
ofnVCF.lpstrInitialDir = NULL;
ofnVCF.lpstrTitle = "Load Custom Font (VCF) File...";
ofnVCF.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_READONLY;
// Display the Load dialog box for the VBF file
if ( FALSE == GetOpenFileName( &ofnVCF ) )
return;
if ( FAILED( g_Font.ReadCustomFontFile( strVCFFileName ) ) )
{
m_pMainWnd->MessageBox( "Could not load the Valve bitmap custom font file.",
"Error", MB_ICONERROR|MB_OK );
return;
}
// Reset the selected glpyh
UpdateSelectedGlyph( FALSE );
if ( FAILED( CalculateAndRenderGlyphs() ) )
{
// Could not create new font
MessageBox( m_pMainWnd->m_hWnd, "Could not create the requested font!", "Error", MB_ICONERROR|MB_OK );
return;
}
m_pDialogBar->GetDlgItem( IDC_FONT_GROUPBOX )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_FONTNAME_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTSIZE_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSOUTLINED_CHECK )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSSHADOWED_CHECK )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_BLUR_EDIT )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_SCANLINES_EDIT )->EnableWindow( FALSE );
CString str;
str.Format( "%s", g_Font.m_strFontName );
m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->SetWindowText( str );
str.Format( "%d", g_Font.m_maxCustomCharHeight );
m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->SetWindowText( str );
// Set texture properties
m_pDialogBar->GetDlgItem( IDC_TEXTURE_GROUPBOX )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_LABEL )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_STATIC )->EnableWindow( TRUE );
m_pDialogBar->GetDlgItem( IDC_TEXTURESIZE_BUTTON )->EnableWindow( TRUE );
SetTextureSize( g_Font.m_dwTextureWidth, g_Font.m_dwTextureHeight );
// Set glyph range properties
m_pDialogBar->GetDlgItem( IDC_GLYPHS_GROUPBOX )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_LABEL )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_LABEL )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSFILESELECTOR_BUTTON )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO )->EnableWindow( TRUE );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( FALSE );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO ))->SetCheck( FALSE );
((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO ))->SetCheck( TRUE );
m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_LABEL )->EnableWindow( FALSE );
m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_EDIT )->EnableWindow( FALSE );
}
//-----------------------------------------------------------------------------
// Name: OnSaveButton()
// Desc: User wants to save the font files
//-----------------------------------------------------------------------------
void CFontMakerApp::OnSaveButton()
{
CHAR strTGAFileName[MAX_PATH];
CHAR strVBFFileName[MAX_PATH];
if ( !g_Font.m_hFont && !g_Font.m_pCustomFilename )
return;
sprintf( strTGAFileName, "%s.tga", g_Font.m_strFontName );
OPENFILENAME ofnTGA; // common dialog box structure
ZeroMemory( &ofnTGA, sizeof(OPENFILENAME) );
ofnTGA.lStructSize = sizeof(OPENFILENAME);
ofnTGA.hwndOwner = m_pMainWnd->m_hWnd;
ofnTGA.lpstrFilter = "Targa files (*.tga)\0*.tga\0\0";
ofnTGA.nFilterIndex = 1;
ofnTGA.lpstrFile = strTGAFileName;
ofnTGA.nMaxFile = sizeof(strTGAFileName);
ofnTGA.lpstrFileTitle = NULL;
ofnTGA.nMaxFileTitle = 0;
ofnTGA.lpstrInitialDir = NULL;
ofnTGA.lpstrTitle = "Save Font Texture Image (TGA) File...";
ofnTGA.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_EXPLORER;
// Display the Save As dialog box for the TGA file
if ( FALSE == GetSaveFileName( &ofnTGA ) )
return;
// use the tga name, but replace the extension
CHAR *ptr;
CHAR temp[MAX_PATH];
int len;
strcpy( temp, strTGAFileName );
len = strlen( temp );
if ( len > 4 && temp[len-4] == '.' )
{
temp[len-3] = 'v';
temp[len-2] = 'b';
temp[len-1] = 'f';
// strip the path
ptr = strrchr( temp, '\\' );
if ( ptr )
{
strcpy( strVBFFileName, ptr+1 );
}
else
{
strcpy( strVBFFileName, temp );
}
}
else
{
sprintf( strVBFFileName, "%s.vbf", g_Font.m_strFontName );
}
// place the VBF files in the materials directory
CHAR materialsDir[MAX_PATH];
strcpy( materialsDir, strTGAFileName );
strlwr( materialsDir );
ptr = strstr( materialsDir, "\\content\\hl2x\\materialsrc\\" );
if ( ptr )
{
// need the final dirs, skip past
CHAR *ptr2 = ptr + strlen( "\\content\\hl2x\\materialsrc\\" );
strcpy( temp, ptr2 );
*ptr = '\0';
strcat( materialsDir, "\\game\\hl2x\\materials\\" );
strcat( materialsDir, temp );
// strip terminal filename
ptr = materialsDir + strlen( materialsDir ) - 1;
while ( ptr > materialsDir )
{
if ( *ptr == '\\' )
{
*ptr = '\0';
break;
}
ptr--;
}
}
else
{
materialsDir[0] = '\0';
}
// Initialize OPENFILENAME
OPENFILENAME ofnVBF; // common dialog box structure
ZeroMemory( &ofnVBF, sizeof(OPENFILENAME) );
ofnVBF.lStructSize = sizeof(OPENFILENAME);
ofnVBF.hwndOwner = m_pMainWnd->m_hWnd;
ofnVBF.lpstrFilter = "Font files (*.vbf)\0*.vbf\0\0";
ofnVBF.nFilterIndex = 1;
ofnVBF.lpstrFile = strVBFFileName;
ofnVBF.nMaxFile = sizeof(strVBFFileName);
ofnVBF.lpstrFileTitle = NULL;
ofnVBF.nMaxFileTitle = 0;
ofnVBF.lpstrInitialDir = materialsDir[0] ? materialsDir : NULL;
ofnVBF.lpstrTitle = "Save Valve Bitmap Font (VBF) File...";
ofnVBF.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_EXPLORER;
// Display the Save As dialog box for the ABC file
if ( FALSE == GetSaveFileName( &ofnVBF ) )
return;
// Make sure the names are valid
if ( !lstrcmp( strVBFFileName, strTGAFileName ) )
{
m_pMainWnd->MessageBox( "Cannot have VBF and TGA filenames be the same!\nFiles not saved.",
"Error", MB_ICONERROR|MB_OK );
return;
}
// Add an extension, if there was not one
if ( 0 == ofnVBF.nFileExtension )
lstrcat( strVBFFileName, ".vbf" );
if ( 0 == ofnTGA.nFileExtension )
lstrcat( strTGAFileName, ".tga" );
// Save the valve bitmap font info file (.vbf)
if ( FAILED( g_Font.WriteFontInfoFile( strVBFFileName ) ) )
{
m_pMainWnd->MessageBox( "Could not write the Valve bitmap font info file.",
"Error", MB_ICONERROR|MB_OK );
return;
}
// blur or scanline effects require special processing to ensure
// they can be used in additive mode
bool bAdditiveMode = ( g_Font.m_nBlur || g_Font.m_nScanlines );
// a custom font requires special processing
bool bCustomFont = g_Font.m_pCustomFilename != NULL;
// Save the font image file (.tga)
if ( FAILED( g_Font.WriteFontImageFile( strTGAFileName, bAdditiveMode, bCustomFont ) ) )
{
m_pMainWnd->MessageBox( "Could not write the font texture image file.",
"Error", MB_ICONERROR|MB_OK );
}
}
//-----------------------------------------------------------------------------
// Name: OnAbout()
// Desc: Display about box
//-----------------------------------------------------------------------------
void CFontMakerApp::OnAbout()
{
CDialog dlg(IDD_ABOUT);
dlg.DoModal();
}
//-----------------------------------------------------------------------------
// Name: OnHelp()
// Desc: Display app help
//-----------------------------------------------------------------------------
void CFontMakerApp::OnHelp()
{
HKEY hRegKey;
if( ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\XboxSDK"),
0, KEY_QUERY_VALUE, &hRegKey ) )
{
DWORD dwSize = MAX_PATH;
CHAR InstallPath[MAX_PATH];
if( ERROR_SUCCESS == RegQueryValueEx( hRegKey, _T("InstallPath"), NULL,
NULL, (unsigned char *)InstallPath, &dwSize ) )
{
CString path = InstallPath;
path += _T("\\doc\\xboxsdk.chm::/xbox_jbh_tool_fontmaker.htm");
::HtmlHelp( m_pMainWnd->GetSafeHwnd(), path, HH_DISPLAY_TOPIC, NULL );
RegCloseKey( hRegKey );
return;
}
RegCloseKey( hRegKey );
}
MessageBox( m_pMainWnd->GetSafeHwnd(),
"Unable to find the Xbox SDK Help file xboxsdk.chm.",
"Help file error", MB_ICONEXCLAMATION | MB_OK | MB_TASKMODAL );
}
//-----------------------------------------------------------------------------
// Name: OnExit()
// Desc: User chose to exit the app
//-----------------------------------------------------------------------------
void CFontMakerApp::OnExit()
{
// Send a close message to the main window
m_pMainWnd->SendMessage( WM_CLOSE );
}
//-----------------------------------------------------------------------------
// Name: ExitInstance()
// Desc: Do some cleanup before exitting the app
//-----------------------------------------------------------------------------
int CFontMakerApp::ExitInstance()
{
DestroyCursor( m_hWaitCursor );
return CWinApp::ExitInstance();
}
//-----------------------------------------------------------------------------
// Name: CalculateAndRenderGlyphs()
// Desc: User changed the status of the selected glyph
//-----------------------------------------------------------------------------
HRESULT CFontMakerApp::CalculateAndRenderGlyphs()
{
HRESULT hr;
// This may take some time, so display a wait cursor
HCURSOR hOldCursor = GetCursor();
SetCursor( m_hWaitCursor );
// Draw the font glyphs, which may have changed layout
if( FAILED( hr = g_Font.CalculateAndRenderGlyphs() ) )
return hr;
// Re-select the current glyph since the font data may have changed
theApp.UpdateSelectedGlyph( g_bIsGlyphSelected, g_iSelectedGlyphNum );
// Inform the view of the new font glyphs
m_pView->OnNewFontGlyphs();
// Restore the cursor
SetCursor( hOldCursor );
return S_OK;
}