You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
514 lines
15 KiB
514 lines
15 KiB
//// GLOBAL.H - Global variables for CSSAMP
|
|
//
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
//// Constants
|
|
//
|
|
//
|
|
|
|
|
|
#define APPNAMEA "TextTest"
|
|
#define APPTITLEA "TextTest - GdipPlus Text support (Text+) Tests"
|
|
#define APPNAMEW L"TextTest"
|
|
#define APPTITLEW L"TextTest - GdipPlus Text support (Text+) Tests"
|
|
|
|
const int MAX_STYLES = 5; // Better implementation would use dynamic memory
|
|
const int MAX_TEXT = 10000; // Fixed buffer size in Unicode characters
|
|
const int MAX_AUTO_FONTS = 20; // Maximum number of fonts to sequence through
|
|
const int MAX_AUTO_HEIGHTS = 20; // Maximum number of heights to sequence through
|
|
const int MAX_RANGE_COUNT = 10; // Maximum number of ranges
|
|
|
|
const int CARET_SECTION_LOGICAL = 0;
|
|
const int CARET_SECTION_PLAINTEXT = 1;
|
|
const int CARET_SECTION_FORMATTED = 2;
|
|
|
|
|
|
//// RUN - A run of characters with similar attributes
|
|
//
|
|
//
|
|
|
|
|
|
struct RUN {
|
|
struct RUN *pNext;
|
|
int iLen;
|
|
int iStyle; // Index to style sheet (global 'g_style').
|
|
SCRIPT_ANALYSIS analysis; // Uniscribe analysis
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//// STYLE - Text attribute
|
|
//
|
|
|
|
|
|
struct STYLE {
|
|
WCHAR faceName[LF_FACESIZE];
|
|
REAL emSize;
|
|
INT style;
|
|
//HFONT hf; // Handle to font described by lf
|
|
//SCRIPT_CACHE sc; // Uniscribe cache associated with this style
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//// Global variables
|
|
//
|
|
//
|
|
|
|
|
|
#ifdef GLOBALS_HERE
|
|
#define GLOBAL
|
|
#define GLOBALINIT(a) = a
|
|
#else
|
|
#define GLOBAL extern
|
|
#define GLOBALINIT(a)
|
|
#endif
|
|
|
|
// Read these from the settings file (command line) - auto-drive for profiling
|
|
GLOBAL char g_szProfileName[MAX_PATH]; // Profile File name
|
|
GLOBAL BOOL g_AutoDrive GLOBALINIT(FALSE); // Automatically run suite and exit
|
|
GLOBAL int g_iNumIterations GLOBALINIT(1); // Number of test iterations to execute
|
|
GLOBAL int g_iNumRepaints GLOBALINIT(1); // Number of re-paints to execute
|
|
GLOBAL int g_iNumRenders GLOBALINIT(1); // Number of API Render calls to execute
|
|
GLOBAL char g_szSourceTextFile[MAX_PATH]; // Source Text Filename
|
|
GLOBAL BOOL g_Offscreen GLOBALINIT(FALSE); // Use offscreen surface
|
|
GLOBAL ARGB g_TextColor GLOBALINIT(0xFF000000); // Text color
|
|
GLOBAL ARGB g_BackColor GLOBALINIT(0xFFFFFFFF); // Background color
|
|
|
|
// Automatic cycling data for font height/face
|
|
GLOBAL BOOL g_AutoFont GLOBALINIT(FALSE); // Sequence through fonts
|
|
GLOBAL BOOL g_AutoHeight GLOBALINIT(FALSE); // Sequence through all font heights
|
|
GLOBAL int g_iAutoFonts GLOBALINIT(0); // Number of fonts to sequence through
|
|
GLOBAL int g_iAutoHeights GLOBALINIT(0); // Number of heights to sequence through
|
|
GLOBAL TCHAR g_rgszAutoFontFacenames[MAX_AUTO_FONTS][MAX_PATH]; // Array of auto-font facenames
|
|
GLOBAL int g_rgiAutoHeights[MAX_AUTO_HEIGHTS]; // Array of auto-height sizes
|
|
|
|
// These correspond to bits in g_DriverOptions (enumeration)
|
|
GLOBAL BOOL g_CMapLookup GLOBALINIT(TRUE);
|
|
GLOBAL BOOL g_Vertical GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_RealizedAdvance GLOBALINIT(TRUE);
|
|
GLOBAL BOOL g_CompensateRes GLOBALINIT(FALSE);
|
|
|
|
// These correspond to bits in g_formatFlags
|
|
GLOBAL BOOL g_NoFitBB GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_NoWrap GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_NoClip GLOBALINIT(FALSE);
|
|
|
|
// Initial Font controls
|
|
GLOBAL BOOL g_FontOverride GLOBALINIT(FALSE); // Over-ride default font settings
|
|
GLOBAL TCHAR g_szFaceName[MAX_PATH]; // Font Face name
|
|
GLOBAL int g_iFontHeight GLOBALINIT(8); // Font Height
|
|
GLOBAL BOOL g_Bold GLOBALINIT(FALSE); // Bold flag
|
|
GLOBAL BOOL g_Italic GLOBALINIT(FALSE); // Italic flag
|
|
GLOBAL BOOL g_Underline GLOBALINIT(FALSE); // Underline
|
|
GLOBAL BOOL g_Strikeout GLOBALINIT(FALSE); // Strikeout
|
|
|
|
GLOBAL HINSTANCE g_hInstance GLOBALINIT(NULL); // The one and only instance
|
|
GLOBAL char g_szAppDir[MAX_PATH]; // Application directory
|
|
GLOBAL HWND g_hSettingsDlg GLOBALINIT(NULL); // Settings panel
|
|
GLOBAL HWND g_hGlyphSettingsDlg GLOBALINIT(NULL); // Settings panel
|
|
GLOBAL HWND g_hDriverSettingsDlg GLOBALINIT(NULL); // Settings panel
|
|
GLOBAL HWND g_hTextWnd GLOBALINIT(NULL); // Text display/editing panel
|
|
GLOBAL BOOL g_bUnicodeWnd GLOBALINIT(FALSE); // If text window is Unicode
|
|
GLOBAL int g_iSettingsWidth;
|
|
GLOBAL int g_iSettingsHeight;
|
|
GLOBAL BOOL g_fShowLevels GLOBALINIT(FALSE); // Show bidi levels for each codepoint
|
|
GLOBAL int g_iMinWidth; // Main window minimum size
|
|
GLOBAL int g_iMinHeight;
|
|
GLOBAL BOOL g_fPresentation GLOBALINIT(FALSE); // Hide settings, show text very large
|
|
GLOBAL BOOL g_ShowLogical GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_ShowGDI GLOBALINIT(FALSE); // Render text using GDI
|
|
GLOBAL BOOL g_UseDrawText GLOBALINIT(TRUE); // Render using DrawText
|
|
|
|
GLOBAL BOOL g_fOverrideDx GLOBALINIT(FALSE); // Provide UI for changing logical widths
|
|
|
|
GLOBAL SCRIPT_CONTROL g_ScriptControl GLOBALINIT({0});
|
|
GLOBAL SCRIPT_STATE g_ScriptState GLOBALINIT({0});
|
|
GLOBAL BOOL g_fNullState GLOBALINIT(FALSE);
|
|
|
|
GLOBAL DWORD g_dwSSAflags GLOBALINIT(SSA_FALLBACK);
|
|
|
|
GLOBAL STYLE g_style[MAX_STYLES]; // 0 for plaintext, 1-4 for formatted text
|
|
|
|
GLOBAL WCHAR g_wcBuf[MAX_TEXT];
|
|
GLOBAL int g_iWidthBuf[MAX_TEXT];
|
|
|
|
GLOBAL RUN *g_pFirstFormatRun GLOBALINIT(NULL); // Formatting info
|
|
|
|
GLOBAL int g_iTextLen GLOBALINIT(0);
|
|
|
|
GLOBAL int g_iCaretX GLOBALINIT(0); // Caret position in text window
|
|
GLOBAL int g_iCaretY GLOBALINIT(0); // Caret position in text window
|
|
GLOBAL int g_iCaretHeight GLOBALINIT(0); // Caret height in pixels
|
|
GLOBAL int g_fUpdateCaret GLOBALINIT(TRUE); // Caret requires updating
|
|
|
|
GLOBAL int g_iCaretSection GLOBALINIT(CARET_SECTION_LOGICAL); // Whether caret is in logical, plain or formatted text
|
|
GLOBAL int g_iCurChar GLOBALINIT(0); // Caret sits on leading edge of buffer[iCurChar]
|
|
|
|
GLOBAL int g_iMouseDownX GLOBALINIT(0);
|
|
GLOBAL int g_iMouseDownY GLOBALINIT(0);
|
|
GLOBAL BOOL g_fMouseDown GLOBALINIT(FALSE);
|
|
GLOBAL int g_iMouseUpX GLOBALINIT(0);
|
|
GLOBAL int g_iMouseUpY GLOBALINIT(0);
|
|
GLOBAL BOOL g_fMouseUp GLOBALINIT(FALSE);
|
|
|
|
GLOBAL int g_iFrom GLOBALINIT(0); // Highlight start
|
|
GLOBAL int g_iTo GLOBALINIT(0); // Highlight end
|
|
|
|
|
|
GLOBAL HFONT g_hfCaption GLOBALINIT(NULL); // Caption font
|
|
GLOBAL int g_iLogPixelsY GLOBALINIT(0);
|
|
|
|
GLOBAL Matrix g_WorldTransform;
|
|
GLOBAL Matrix g_FontTransform;
|
|
GLOBAL Matrix g_DriverTransform;
|
|
|
|
GLOBAL SmoothingMode g_SmoothingMode GLOBALINIT(SmoothingModeDefault);
|
|
|
|
// Font families
|
|
|
|
|
|
|
|
// Enumerate available families
|
|
|
|
GLOBAL InstalledFontCollection g_InstalledFontCollection;
|
|
GLOBAL FontFamily *g_families;
|
|
GLOBAL INT g_familyCount;
|
|
|
|
|
|
GLOBAL BOOL g_ShowFamilies GLOBALINIT(FALSE);
|
|
|
|
|
|
// Glyphs
|
|
|
|
GLOBAL BOOL g_ShowGlyphs GLOBALINIT(FALSE);
|
|
GLOBAL int g_GlyphRows GLOBALINIT(16);
|
|
GLOBAL int g_GlyphColumns GLOBALINIT(16);
|
|
GLOBAL int g_GlyphFirst GLOBALINIT(0);
|
|
GLOBAL BOOL g_CmapLookup GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_HorizontalChart GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_ShowCell GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_VerticalForms GLOBALINIT(FALSE);
|
|
|
|
|
|
// Driver string
|
|
|
|
GLOBAL BOOL g_ShowDriver GLOBALINIT(FALSE);
|
|
GLOBAL INT g_DriverOptions GLOBALINIT( DriverStringOptionsCmapLookup
|
|
| DriverStringOptionsRealizedAdvance);
|
|
GLOBAL REAL g_DriverDx GLOBALINIT(15.0);
|
|
GLOBAL REAL g_DriverDy GLOBALINIT(0.0);
|
|
GLOBAL REAL g_DriverPixels GLOBALINIT(13.0);
|
|
|
|
|
|
// DrawString
|
|
|
|
GLOBAL BOOL g_ShowDrawString GLOBALINIT(FALSE);
|
|
GLOBAL TextRenderingHint g_TextMode GLOBALINIT(TextRenderingHintSystemDefault);
|
|
GLOBAL UINT g_GammaValue GLOBALINIT(4);
|
|
GLOBAL INT g_formatFlags GLOBALINIT(0);
|
|
GLOBAL BOOL g_typographic GLOBALINIT(FALSE);
|
|
GLOBAL StringAlignment g_align GLOBALINIT(StringAlignmentNear);
|
|
GLOBAL HotkeyPrefix g_hotkey GLOBALINIT(HotkeyPrefixNone);
|
|
GLOBAL StringAlignment g_lineAlign GLOBALINIT(StringAlignmentNear);
|
|
GLOBAL StringTrimming g_lineTrim GLOBALINIT(StringTrimmingNone);
|
|
GLOBAL Unit g_fontUnit GLOBALINIT(UnitPoint);
|
|
GLOBAL Brush * g_textBrush GLOBALINIT(NULL);
|
|
GLOBAL Brush * g_textBackBrush GLOBALINIT(NULL);
|
|
GLOBAL BOOL g_testMetafile GLOBALINIT(FALSE);
|
|
|
|
|
|
// Path
|
|
|
|
GLOBAL BOOL g_ShowPath GLOBALINIT(FALSE);
|
|
|
|
// Metrics
|
|
|
|
GLOBAL BOOL g_ShowMetric GLOBALINIT(FALSE);
|
|
|
|
// Performance
|
|
|
|
GLOBAL BOOL g_ShowPerformance GLOBALINIT(FALSE);
|
|
GLOBAL INT g_PerfRepeat GLOBALINIT(2000);
|
|
|
|
// Scaling
|
|
|
|
GLOBAL BOOL g_ShowScaling GLOBALINIT(FALSE);
|
|
|
|
// String format digit substitution
|
|
GLOBAL StringDigitSubstitute g_DigitSubstituteMode GLOBALINIT(StringDigitSubstituteUser);
|
|
GLOBAL LANGID g_Language GLOBALINIT(LANG_NEUTRAL);
|
|
|
|
GLOBAL INT g_RangeCount GLOBALINIT(0);
|
|
GLOBAL CharacterRange g_Ranges[MAX_RANGE_COUNT];
|
|
|
|
/* obsolete
|
|
|
|
GLOBAL BOOL g_fFillLines GLOBALINIT(TRUE);
|
|
GLOBAL BOOL g_fLogicalOrder GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_fNoGlyphIndex GLOBALINIT(FALSE);
|
|
|
|
GLOBAL BOOL g_fShowWidths GLOBALINIT(FALSE);
|
|
GLOBAL BOOL g_fShowStyles GLOBALINIT(FALSE);
|
|
|
|
GLOBAL BOOL g_fShowPlainText GLOBALINIT(TRUE);
|
|
GLOBAL BOOL g_fShowFancyText GLOBALINIT(FALSE);
|
|
|
|
*/
|
|
|
|
//// Function prototypes
|
|
//
|
|
//
|
|
|
|
// DspGDI.cpp
|
|
void PaintGDI(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// DspFamly.cpp
|
|
|
|
void PaintFamilies(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
void InitializeLegacyFamilies();
|
|
|
|
|
|
// DspLogcl.cpp
|
|
|
|
void PaintLogical(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// DspDraws.cpp
|
|
|
|
void PaintDrawString(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// DspDriver.cpp
|
|
|
|
void PaintDrawDriverString(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// DspPerf.cpp
|
|
|
|
void PaintPerformance(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// DspPath.cpp
|
|
|
|
void PaintPath(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// DspGlyph.cpp
|
|
|
|
void PaintGlyphs(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// DspMetric.cpp
|
|
|
|
void PaintMetrics(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// DspScaling.cpp
|
|
|
|
void PaintScaling(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight);
|
|
|
|
|
|
// Settings.cpp
|
|
INT_PTR CALLBACK SettingsDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
INT_PTR CALLBACK GlyphSettingsDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
INT_PTR CALLBACK DriverSettingsDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
void InsertText(HWND hDlg, char *textId);
|
|
|
|
// ReadSettings.cpp
|
|
void ReadProfileInfo(char *szProfileName);
|
|
|
|
// Text.cpp
|
|
|
|
void InitText(INT id);
|
|
|
|
BOOL TextInsert(
|
|
int iPos,
|
|
PWCH pwc,
|
|
int iLen);
|
|
|
|
BOOL TextDelete(
|
|
int iPos,
|
|
int iLen);
|
|
|
|
|
|
|
|
// TextWnd.cpp
|
|
|
|
HWND CreateTextWindow();
|
|
|
|
void ResetCaret(int iX, int iY, int iHeight);
|
|
|
|
LRESULT CALLBACK TextWndProc(
|
|
HWND hWnd,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
void InvalidateText();
|
|
|
|
void PrintPage();
|
|
|
|
// Edit.cpp
|
|
|
|
BOOL EditChar(WCHAR wc);
|
|
BOOL EditKeyDown(WCHAR wc);
|
|
void EditFreeCaches();
|
|
void EditInsertUnicode();
|
|
|
|
|
|
// Style.cpp
|
|
|
|
void SetStyle(
|
|
int iStyle,
|
|
int iHeight,
|
|
int iWeight,
|
|
int iItalic,
|
|
int iUnderline,
|
|
int iStrikeout,
|
|
TCHAR *pcFaceName);
|
|
|
|
void InitStyles();
|
|
|
|
void FreeStyles();
|
|
|
|
void SetLogFont(
|
|
PLOGFONTA plf,
|
|
int iHeight,
|
|
int iWeight,
|
|
int iItalic,
|
|
int iUnderline,
|
|
char *pcFaceName);
|
|
|
|
void StyleDeleteRange(
|
|
int iDelPos,
|
|
int iDelLen);
|
|
|
|
void StyleExtendRange(
|
|
int iExtPos,
|
|
int iExtLen);
|
|
|
|
void StyleSetRange(
|
|
int iSetStyle,
|
|
int iSetPos,
|
|
int iSetLen);
|
|
|
|
BOOL StyleCheckRange();
|
|
|
|
|
|
|
|
// Debugging support
|
|
|
|
|
|
#define TRACEMSG(a) {DG.psFile=__FILE__; DG.iLine=__LINE__; DebugMsg a;}
|
|
#define ASSERT(a) {if (!(a)) TRACEMSG(("Assertion failure: "#a));}
|
|
#define ASSERTS(a,b) {if (!(a)) TRACEMSG(("Assertion failure: "#a" - "#b));}
|
|
#define ASSERTHR(a,b) {if (!SUCCEEDED(a)) {DG.psFile=__FILE__; \
|
|
DG.iLine=__LINE__; DG.hrLastError=a; DebugHr b;}}
|
|
|
|
|
|
|
|
/// Debug variables
|
|
//
|
|
|
|
|
|
struct DebugGlobals {
|
|
char *psFile;
|
|
int iLine;
|
|
HRESULT hrLastError; // Last hresult from GDI
|
|
CHAR sLastError[100]; // Last error string
|
|
};
|
|
|
|
|
|
|
|
|
|
/// Debug function prototypes
|
|
//
|
|
|
|
|
|
extern "C" void WINAPIV DebugMsg(char *fmt, ...);
|
|
extern "C" void WINAPIV DebugHr(char *fmt, ...);
|
|
|
|
GLOBAL DebugGlobals DG GLOBALINIT({0});
|
|
GLOBAL UINT debug GLOBALINIT(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|