216 lines
6.8 KiB
C
216 lines
6.8 KiB
C
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
|
|
#ifndef __uspp__
|
|
#define __uspp__
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
//// USP10P.H
|
|
//
|
|
// Private additions to USP header for use within USP and by the
|
|
// NT5 complex script language pack only.
|
|
|
|
|
|
|
|
#if DBG
|
|
#define USPALLOC(a,b) (DG.psFile=__FILE__, DG.iLine=__LINE__, UspAllocCache(a, b))
|
|
#define USPALLOCTEMP(a, b) (DG.psFile=__FILE__, DG.iLine=__LINE__, UspAllocTemp(a, b))
|
|
#define USPFREE(a) (DG.psFile=__FILE__, DG.iLine=__LINE__, UspFreeMem(a))
|
|
#else
|
|
#define USPALLOC(a,b) UspAllocCache(a, b)
|
|
#define USPALLOCTEMP(a, b) UspAllocTemp(a, b)
|
|
#define USPFREE(a) UspFreeMem (a)
|
|
#endif
|
|
|
|
|
|
|
|
///// LPK entry point serialisation
|
|
//
|
|
// Since it is not possible to guarantee that Uniscribe and the
|
|
// LPK receive process deatachment after all their clients, we
|
|
// need to track Uniscribe shutdown.
|
|
//
|
|
// At each LPK entrypoint, the LPK calls EnterLpk, and after each exit
|
|
// it calls ExitLpk.
|
|
//
|
|
// If Uniscribe is detached, or being detatched, EnterLpk fails. In this
|
|
// case, the LPK entrypoint must do something safe and return directly.
|
|
//
|
|
// Uniscribe maintains an LPK nesting level. If a process detach occurs
|
|
// during LPK execution, a detachPending flag is set and will be processed
|
|
// at the ExitLpk that pops all the nesting.
|
|
|
|
|
|
void LpkPresent(); // Used by LPK to disable cleanup at PROCESS_DETACH time
|
|
|
|
|
|
|
|
|
|
///// UspAllocCache
|
|
//
|
|
// Allocate long term memory for use caching font tables
|
|
|
|
|
|
HRESULT WINAPI UspAllocCache(
|
|
int iSize, // In required size in bytes
|
|
void **ppv); // Out Allocated address
|
|
|
|
|
|
|
|
|
|
///// UspAllocTemp
|
|
//
|
|
// Allocate short term memory with lifetime no more than an API call
|
|
|
|
|
|
HRESULT WINAPI UspAllocTemp(
|
|
int iSize, // In required size in bytes
|
|
void **ppv); // Out Allocated address
|
|
|
|
|
|
|
|
|
|
///// UspFreeMem
|
|
//
|
|
//
|
|
|
|
|
|
HRESULT WINAPI UspFreeMem(
|
|
void *pv); // In memory to be freed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///// SCRIPT_STRING_ANALYSIS
|
|
//
|
|
// This structure provides all parameters required for script analysis.
|
|
//
|
|
//
|
|
|
|
#define MAX_PLANE_0_FONT 13 // max number of non-surrogate fallback fonts
|
|
#define MAX_SURROGATE_FONT 16 // max number of the surrogate fallback fonts
|
|
|
|
// Max fallback fonts including user font (Cannot exceed 31 because usage is recorded in a bitset)
|
|
// and Microsoft Sans Serif and surrogate fallback fonts.
|
|
#define MAX_FONT MAX_PLANE_0_FONT + MAX_SURROGATE_FONT // 29 fonts
|
|
|
|
#define DUMMY_MAX_FONT 7 // dummy one for dummy entries
|
|
|
|
typedef struct tag_STRING_ANALYSIS {
|
|
|
|
// Input variables - Initialised by the caller
|
|
|
|
HDC hdc; // Only required for shaping (GCP_Ligate && lpOrder or lpGlyphs arrays specified)
|
|
|
|
DWORD dwFlags; // See ScriptStringAnalyse
|
|
CHARSETINFO csi; // As returned by TranslateCharsetInfo
|
|
|
|
// Input buffers
|
|
|
|
WCHAR *pwInChars; // Unicode input string
|
|
int cInChars; // String length
|
|
int iHotkeyPos; // Derived from '&' positions if SSA_HOTKEY set
|
|
|
|
int iMaxExtent; // Required maximum pixel width (used if clipping or fitting)
|
|
const int *piDx; // Logical advance width array
|
|
|
|
SCRIPT_CONTROL sControl;
|
|
SCRIPT_STATE sState;
|
|
|
|
SCRIPT_TABDEF *pTabdef; // Tabstop definition
|
|
|
|
int cMaxItems; // Number of entries in pItems
|
|
SCRIPT_ITEM *pItems;
|
|
|
|
// Low cost analysis output buffers
|
|
// No shaping required when fLigate=FALSE
|
|
// Must be at least as long as the input string
|
|
|
|
BYTE *pbLevel; // Array of item level
|
|
int *piVisToLog; // Visual to Logical mapping
|
|
WORD *pwLeftGlyph; // Leftmost glyph of each logical item
|
|
WORD *pwcGlyphs; // Count of glyphs in each logical item
|
|
|
|
SCRIPT_LOGATTR *pLogAttr; // Cursor points, word and line breaking (indexed in logical order)
|
|
|
|
// High cost analysis output buffers
|
|
// Require hDC to be set
|
|
// Must be at least nGlyphs long.
|
|
|
|
int cMaxGlyphs; // Max glyphs to create
|
|
WORD *pwGlyphs; // Output glyph array
|
|
WORD *pwLogClust; // logical to visual mapping
|
|
SCRIPT_VISATTR *pVisAttr; // Justification insertion points (visual order) and other flags
|
|
int *piAdvance; // Advance widths
|
|
int *piJustify; // Justified advance widths
|
|
GOFFSET *pGoffset; // x,y combining character offsets
|
|
|
|
|
|
// Font fallback
|
|
|
|
DWORD dwFallbacksUsed;// Bitmap of fallback fonts used
|
|
BYTE *pbFont; // Font index per item, 0 means original user font
|
|
|
|
|
|
// Obsolete - have to leave them here so the subsequent layout
|
|
// remains unchanged for old LPK to use (wchao, 12/14/2000).
|
|
// we used the first two slots in hf_dummy array for some needed flags
|
|
// take a look to isAssociated and isPrinting
|
|
|
|
SCRIPT_CACHE sc_dummy[DUMMY_MAX_FONT];
|
|
HFONT isAssociated; // used as flag to indicate if the user selected font is associated
|
|
HFONT hf_dummy[DUMMY_MAX_FONT-1];
|
|
|
|
int iCurFont; // 0 For users font
|
|
LOGFONTA lfA; // Logfont from the original DC - only set if font fallback happens
|
|
|
|
// Output variables
|
|
|
|
|
|
// Item analysis
|
|
|
|
int cItems; // Number of items analysed == Index of terminal (sentinel) item in pItem
|
|
|
|
|
|
// Generated glyphs and character measurements
|
|
// Note that
|
|
// 1) nOutGlyphs may be more or less than nInChars.
|
|
// 2) nOutChars may be less than nInChars if fClip was requested.
|
|
|
|
int cOutGlyphs; // Number of glyphs generated
|
|
int cOutChars; // Number of characters generated
|
|
ABC abc;
|
|
SIZE size; // Size of whole line (pixel width and height)
|
|
|
|
// For client use
|
|
|
|
void *pvClient;
|
|
|
|
|
|
// fallback font store
|
|
|
|
// we store in the items sc[MAX_PLANE_0_FONT-1] and hf[MAX_PLANE_0_FONT-1] the data for Microsoft Sans Serif
|
|
// font which has hight same as the selected user font height.
|
|
// note that hf[1] will have the font data for Microsoft Sans Serif font too but
|
|
// with adjusted height.
|
|
// the items in sc and hf arrays which have index greater than or equal MAX_PLANE_0_FONT will be used
|
|
// for surrogate fallback fonts.
|
|
|
|
SCRIPT_CACHE sc[MAX_FONT]; // Script cache for each fallback, [0] is users font
|
|
HFONT hf[MAX_FONT]; // Handles to fallback fonts, [0] is users font
|
|
|
|
} STRING_ANALYSIS;
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|
|
|