// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright 1994-1998 Microsoft Corporation. All Rights Reserved. // // PROGRAM: CSSAMP // // PURPOSE: Demonstrate and test Uniscribe APIs // // PLATFORMS: Windows 95, 98, NT 4, NT 5. // #include "precomp.hxx" #define GLOBALS_HERE 1 #include "global.h" #include "..\gpinit.inc" //#define ICECAP 1 // Since this isn't defined for some reason automatically #ifdef ICECAP #include "icecap.h" #endif // ICECAP /* Testing Font* ConstructFontWithCellHeight( const WCHAR *familyName, INT style, REAL cellHeight, // From positive LOGFONT.lfHeight Unit unit ) { // Get the family details so we can do height arithmetic const FontFamily family(familyName); if (!family.IsStyleAvailable(style)) { return NULL; } // Convert cell height to em height REAL emSize = cellHeight * family.GetEmHeight(style) / ( family.GetCellAscent(style) + family.GetCellDescent(style)); return new Font(&family, emSize, style, unit); } */ // Check to see if a given pathname contains a path or not... BOOL HasPath(char *szPathName) { BOOL fResult = false; ASSERT(szPathName); if (!szPathName) return fResult; char *p = szPathName; while(*p) { if (*p == '\\') { // We found a backslash - we have a path fResult = true; break; } p++; } return fResult; } // Strip any filename (and final backslash) from a pathname void StripFilename(char *szPathName) { ASSERT(szPathName); if (szPathName) { char *p = szPathName + (strlen(szPathName)-1); while(p > szPathName) { if (*p == '\\') { // Terminate the string at the first backslash. *p = 0; break; } p--; } } } //// Initialise // void Initialise() { INITCOMMONCONTROLSEX icce; icce.dwSize = sizeof(icce); icce.dwICC = ICC_BAR_CLASSES; InitCommonControlsEx(&icce); InitStyles(); InitText(ID_INITIAL_TEXT); g_familyCount = g_InstalledFontCollection.GetFamilyCount(); g_families = new FontFamily[g_familyCount]; g_InstalledFontCollection.GetFamilies(g_familyCount, g_families, &g_familyCount); // Default values... g_szSourceTextFile[0] = 0; g_szProfileName[0] = 0; // Generate the application base directory... GetModuleFileNameA(g_hInstance, g_szAppDir, sizeof(g_szAppDir)); StripFilename(g_szAppDir); } // Parse the command line... void ParseCommandLine(char *szCmdLine) { char *p = szCmdLine; // Look for a -p... while(*p) { switch (*p) { case '-' : case '/' : { // we have a command, so figure out what it is... p++; // next char indicate which command... switch(*p) { case 'p' : case 'P' : { char szProfileName[MAX_PATH]; int i = 0; // Profile filename follows immediately (no spaces) p++; // skip the 'p' while(*p && *p != '\b') { szProfileName[i] = *p; i++; p++; } // Terminate the string... szProfileName[i] = 0; if (strlen(szProfileName) > 0) { if (!HasPath(szProfileName)) { // Look for the profile file in the application directory wsprintfA(g_szProfileName, "%s\\%s", g_szAppDir, szProfileName); } else { // Otherwise it already contains a path strcpy(g_szProfileName, szProfileName); } } } break; } } break; default : break; } p++; } } //// WinMain - Application entry point and dispatch loop // // int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, char *pCmdLine, int nCmdShow) { MSG msg; HACCEL hAccelTable; RECT rc; RECT rcMain; int iNumRenders = 1; if (!gGdiplusInitHelper.IsValid()) { return 0; } g_hInstance = hInst; // Global hInstance #ifdef ICECAP // Mark the profile... StopProfile(PROFILE_GLOBALLEVEL, PROFILE_CURRENTID); #endif // ICECAP Initialise(); // Parse the command line... ParseCommandLine(pCmdLine); // Read the global settings from the profile... ReadProfileInfo(g_szProfileName); // Over-ride number of renders on initial display... iNumRenders = g_iNumRenders; g_iNumRenders = 1; // It is possible that we want to use a file for the default text, so try to load it if (lstrlenA(g_szSourceTextFile) > 0) { char szFullPathText[MAX_PATH]; if (!HasPath(g_szSourceTextFile)) { // Look for the source text file in the application directory wsprintfA(szFullPathText, "%s\\%s", g_szAppDir, g_szSourceTextFile); } else { // Otherwise it contains a path already strcpy(szFullPathText, g_szSourceTextFile); } // This will replace the initial text with the text from the file InsertText(NULL, szFullPathText); } // Create main text window g_hTextWnd = CreateTextWindow(); // Add dialog boxes on leading side g_hSettingsDlg = CreateDialogA( g_hInstance, "Settings", g_hTextWnd, SettingsDlgProc); g_hGlyphSettingsDlg = CreateDialogA( g_hInstance, "GlyphSettings", g_hTextWnd, GlyphSettingsDlgProc); g_hDriverSettingsDlg = CreateDialogA( g_hInstance, "DriverSettings", g_hTextWnd, DriverSettingsDlgProc); // Establish positon of text surface relative to the dialog GetWindowRect(g_hSettingsDlg, &rc); g_iSettingsWidth = rc.right - rc.left; g_iSettingsHeight = rc.bottom - rc.top; // Establish offset from main window to settings dialog GetWindowRect(g_hTextWnd, &rcMain); g_iMinWidth = rc.right - rcMain.left; g_iMinHeight = rc.bottom - rcMain.top; // Size main window to include dialog and text surface SetWindowPos( g_hTextWnd, NULL, 0,0, g_iMinWidth * 29 / 10, g_iMinHeight, SWP_NOZORDER | SWP_NOMOVE); // Position the sub dialogs below the main dialog SetWindowPos( g_hGlyphSettingsDlg, NULL, 0, rc.bottom-rc.top, 0,0, SWP_NOZORDER | SWP_NOSIZE); SetWindowPos( g_hDriverSettingsDlg, NULL, 0, rc.bottom-rc.top, 0,0, SWP_NOZORDER | SWP_NOSIZE); if (g_FontOverride) { // Update the styles with the values read from the profile... for(int iStyle=0;iStyle<5;iStyle++) { SetStyle( iStyle, g_iFontHeight, g_Bold ? 700 : 300, g_Italic ? 1 : 0, g_Underline ? 1 : 0, g_Strikeout ? 1 : 0, g_szFaceName); } } if (g_AutoDrive) { int iFont = 0; int iHeight = 0; int cFonts = 1; int cHeights = 1; int iIteration = 0; int iRepeatPaint = 0; int iStyle = 0; g_fPresentation = true; // Move the settings window out of the way... ShowWindow(g_hTextWnd, SW_SHOWNORMAL); SetWindowPos(g_hSettingsDlg, HWND_BOTTOM, -g_iSettingsWidth, 0, g_iSettingsWidth, g_iSettingsHeight, SWP_NOREDRAW); UpdateWindow(g_hSettingsDlg); // Initial Paint to setup font cache... InvalidateText(); UpdateWindow(g_hTextWnd); // Reset the render multiplier... g_iNumRenders = iNumRenders; #ifdef ICECAP // Start the profiling... StartProfile(PROFILE_GLOBALLEVEL, PROFILE_CURRENTID); #endif // ICECAP if (g_AutoFont) cFonts = g_iAutoFonts; if (g_AutoHeight) cHeights = g_iAutoHeights; for(iIteration = 0;iIteration < g_iNumIterations; iIteration++) { for(iFont=0;iFont 0) { if ( !IsDialogMessageW(g_hSettingsDlg, &msg) && !IsDialogMessageW(g_hGlyphSettingsDlg, &msg) && !TranslateAcceleratorW(g_hTextWnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessageW(&msg); } } } else { hAccelTable = LoadAcceleratorsA(g_hInstance, APPNAMEA); while (GetMessageA(&msg, (HWND) NULL, 0, 0) > 0) { if ( !IsDialogMessageA(g_hSettingsDlg, &msg) && !IsDialogMessageA(g_hGlyphSettingsDlg, &msg) && !TranslateAcceleratorA(g_hTextWnd, hAccelTable, &msg) ) { TranslateMessage(&msg); DispatchMessageA(&msg); } } } FreeStyles(); delete [] g_families; return (int)msg.wParam; UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(pCmdLine); UNREFERENCED_PARAMETER(nCmdShow); }