Windows2003-3790/windows/advcore/gdiplus/test/texttest/texttest.cpp
2020-09-30 16:53:55 +02:00

492 lines
12 KiB
C++

// 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<cFonts;iFont++)
{
for(iHeight=0;iHeight<cHeights;iHeight++)
{
TCHAR szFaceName[MAX_PATH];
int iFontHeight = g_iFontHeight;
if (g_AutoFont)
{
lstrcpy(szFaceName, g_rgszAutoFontFacenames[iFont]);
}
else
{
lstrcpy(szFaceName, g_szFaceName);
}
if (g_AutoHeight)
iFontHeight = g_rgiAutoHeights[iHeight];
// Update the styles with the values read from the profile...
for(int iStyle=0;iStyle<5;iStyle++)
{
SetStyle(
iStyle,
iFontHeight,
g_Bold ? 700 : 300,
g_Italic ? 1 : 0,
g_Underline ? 1 : 0,
g_Strikeout ? 1 : 0,
szFaceName);
}
for(int iPaint=0;iPaint<g_iNumRepaints;iPaint++)
{
// Force a re-display of the entire text window...
InvalidateText();
UpdateWindow(g_hTextWnd);
}
}
}
}
#ifdef ICECAP
// Stop the profiling...
StopProfile(PROFILE_GLOBALLEVEL, PROFILE_CURRENTID);
#endif // ICECAP
// Trigger application exit
PostMessage(g_hTextWnd, WM_DESTROY, (WPARAM)0, (LPARAM)0);
}
else
{
ShowWindow(g_hTextWnd, SW_SHOWNORMAL);
InvalidateText();
UpdateWindow(g_hTextWnd);
}
// Main message loop
if (g_bUnicodeWnd) {
hAccelTable = LoadAcceleratorsW(g_hInstance, APPNAMEW);
while (GetMessageW(&msg, (HWND) NULL, 0, 0) > 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);
}