summaryrefslogtreecommitdiff
path: root/utils/xbox/FontMaker/fontmaker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/xbox/FontMaker/fontmaker.cpp')
-rw-r--r--utils/xbox/FontMaker/fontmaker.cpp1119
1 files changed, 1119 insertions, 0 deletions
diff --git a/utils/xbox/FontMaker/fontmaker.cpp b/utils/xbox/FontMaker/fontmaker.cpp
new file mode 100644
index 0000000..a2552af
--- /dev/null
+++ b/utils/xbox/FontMaker/fontmaker.cpp
@@ -0,0 +1,1119 @@
+//-----------------------------------------------------------------------------
+// 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;
+}
+
+
+
+