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.
355 lines
7.9 KiB
355 lines
7.9 KiB
/*
|
|
* Uniscribe interface (& related classes) class definition
|
|
*
|
|
* File: _uspi.h
|
|
* Create: Jan 10, 1998
|
|
* Author: Worachai Chaoweeraprasit (wchao)
|
|
*
|
|
* Copyright (c) 1998, Microsoft Corporation. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _USPI_H
|
|
#define _USPI_H
|
|
|
|
#include "_ls.h"
|
|
#include "usp10.h" // Uniscribe SDK protocol
|
|
|
|
|
|
// classes
|
|
//
|
|
class CFormatRunPtr;
|
|
class CMeasurer;
|
|
class CTxtEdit;
|
|
class CUniscribe;
|
|
class CBiDiFSM;
|
|
class CTxtBreaker;
|
|
|
|
|
|
#define ALIGN(x) (int)(((x)+3) & ~3) // dword aligning
|
|
#define GLYPH_COUNT(c) ((((c)*3)/2)+16)
|
|
#define MAX_CLIENT_BUF 512 // size (in byte) of internal buffer
|
|
|
|
// USP client parameters block
|
|
//
|
|
#define cli_string 0x00000001
|
|
#define cli_psi 0x00000002
|
|
#define cli_psla 0x00000004
|
|
#define cli_pwgi 0x00000008
|
|
#define cli_psva 0x00000010
|
|
#define cli_pcluster 0x00000020
|
|
#define cli_pidx 0x00000040
|
|
#define cli_pgoffset 0x00000080
|
|
|
|
#define cli_Itemize (cli_string | cli_psi)
|
|
#define cli_Break (cli_psla)
|
|
#define cli_Shape (cli_pwgi | cli_psva | cli_pcluster)
|
|
#define cli_Place (cli_pidx | cli_pgoffset)
|
|
#define cli_ShapePlace (cli_Shape | cli_Place)
|
|
|
|
|
|
|
|
#ifndef LOCALE_SNATIVEDIGITS
|
|
#define LOCALE_SNATIVEDIGITS 0x00000013
|
|
#endif
|
|
|
|
|
|
|
|
///// LANG
|
|
//
|
|
// The following defines are temporary - they will be removed once they
|
|
// have been added to the standard NLS header files.
|
|
|
|
|
|
#ifndef LANG_BURMESE
|
|
#define LANG_BURMESE 0x55 // Myanmar
|
|
#endif
|
|
#ifndef LANG_KHMER
|
|
#define LANG_KHMER 0x53 // Cambodia
|
|
#endif
|
|
#ifndef LANG_LAO
|
|
#define LANG_LAO 0x54 // Lao
|
|
#endif
|
|
#ifndef LANG_MONGOLIAN
|
|
#define LANG_MONGOLIAN 0x50 // Mongolia
|
|
#endif
|
|
#ifndef LANG_TIBETAN
|
|
#define LANG_TIBETAN 0x51 // Tibet
|
|
#endif
|
|
#ifndef LANG_URDU
|
|
#define LANG_URDU 0x20 // India / Pakistan
|
|
#endif
|
|
|
|
|
|
|
|
//
|
|
// Memory block will contain USPCLIENT -the table of ptrs, as a memory block's header
|
|
// followed by subtables then requested data blocks. All things tie together as a
|
|
// contiguous data area so client can free the whole thing in one shot.
|
|
//
|
|
|
|
|
|
// SI subtable
|
|
//
|
|
typedef struct tagUSP_CLIENT_SI
|
|
{
|
|
//
|
|
// ScriptItemize's
|
|
//
|
|
WCHAR* pwchString;
|
|
int cchString;
|
|
SCRIPT_ITEM* psi;
|
|
} USP_CLIENT_SI, *PUSP_CLIENT_SI;
|
|
|
|
// SB subtable
|
|
//
|
|
typedef struct tagUSP_CLIENT_SB
|
|
{
|
|
//
|
|
// ScriptBreak's
|
|
//
|
|
SCRIPT_LOGATTR* psla;
|
|
} USP_CLIENT_SB, *PUSP_CLIENT_SB;
|
|
|
|
// SS & SP subtable
|
|
typedef struct tagUSP_CLIENT_SSP
|
|
{
|
|
//
|
|
// ScriptShape's
|
|
//
|
|
WORD* pwgi;
|
|
WORD* pcluster;
|
|
SCRIPT_VISATTR* psva;
|
|
|
|
//
|
|
// ScriptPlace's
|
|
//
|
|
int* pidx;
|
|
GOFFSET* pgoffset;
|
|
} USP_CLIENT_SSP, *PUSP_CLIENT_SSP;
|
|
|
|
|
|
// header (root) table
|
|
//
|
|
typedef struct tagUSP_CLIENT
|
|
{
|
|
PUSP_CLIENT_SI si;
|
|
PUSP_CLIENT_SB sb;
|
|
PUSP_CLIENT_SSP ssp;
|
|
} USP_CLIENT, *PUSP_CLIENT;
|
|
|
|
|
|
|
|
// buffer request structure
|
|
//
|
|
typedef struct tagBUF_REQ
|
|
{
|
|
int size; // size of requested element
|
|
int c; // count of requested element
|
|
PVOID* ppv; // ref to ptr of requested buffer
|
|
} BUF_REQ;
|
|
|
|
|
|
typedef enum
|
|
{
|
|
DIGITS_NOTIMPL = 0,
|
|
DIGITS_CTX,
|
|
DIGITS_NONE,
|
|
DIGITS_NATIONAL
|
|
} DIGITSHAPE;
|
|
|
|
|
|
#define IsCS(x) (BOOL)((x)==U_COMMA || (x)==U_PERIOD || (x)==U_COLON)
|
|
|
|
|
|
// CUniscribe's internal buffer request flag
|
|
//
|
|
#define igb_Glyph 1
|
|
#define igb_VisAttr 2
|
|
#define igb_Pidx 4
|
|
|
|
|
|
|
|
// LS Callback's static return buffer
|
|
#define celAdvance 32
|
|
|
|
class CBufferBase
|
|
{
|
|
public:
|
|
CBufferBase(int cbElem) { _cbElem = cbElem; }
|
|
void* GetPtr(int cel);
|
|
void Release();
|
|
protected:
|
|
void* _p;
|
|
int _cElem;
|
|
int _cbElem;
|
|
};
|
|
|
|
template <class ELEM>
|
|
class CBuffer : public CBufferBase
|
|
{
|
|
public:
|
|
CBuffer() : CBufferBase(sizeof(ELEM)) {}
|
|
~CBuffer() { Release(); }
|
|
ELEM* Get(int cel) { return (ELEM*)GetPtr(cel); }
|
|
};
|
|
|
|
|
|
/////// Uniscribe interface object class
|
|
//
|
|
//
|
|
|
|
BOOL IsSupportedOS();
|
|
|
|
class CUniscribe
|
|
{
|
|
public:
|
|
CUniscribe();
|
|
~CUniscribe();
|
|
|
|
WORD ApplyDigitSubstitution (BYTE bDigitSubstMode);
|
|
|
|
// public helper functions
|
|
//
|
|
|
|
const SCRIPT_PROPERTIES* GeteProp (WORD eScript);
|
|
const CBiDiFSM* GetFSM ();
|
|
|
|
|
|
BOOL CreateClientStruc (BYTE* pbBufIn, LONG cbBufIn, PUSP_CLIENT* ppc, LONG cchString, DWORD dwMask);
|
|
void SubstituteDigitShaper (PLSRUN plsrun, CMeasurer* pme);
|
|
|
|
|
|
inline BOOL CacheAllocGlyphBuffers(int cch, int& cGlyphs, WORD*& pwgi, SCRIPT_VISATTR*& psva)
|
|
{
|
|
cGlyphs = GLYPH_COUNT(cch);
|
|
return (pwgi = GetGlyphBuffer(cGlyphs)) && (psva = GetVABuffer(cGlyphs));
|
|
}
|
|
|
|
|
|
inline BOOL IsValid()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL GetComplexCharSet(const SCRIPT_PROPERTIES* psp, BYTE bCharSetDefault, BYTE& bCharSetOut);
|
|
BYTE GetRtlCharSet(CTxtEdit* ped);
|
|
|
|
|
|
// higher level services
|
|
//
|
|
int ItemizeString (USP_CLIENT* pc, WORD uInitLevel, int* pcItems, WCHAR* pwchString, int cch,
|
|
BOOL fUnicodeBidi, WORD wLangId = LANG_NEUTRAL);
|
|
int ShapeString (PLSRUN plsrun, SCRIPT_ANALYSIS* psa, CMeasurer* pme, const WCHAR* pwch, int cch,
|
|
WORD*& pwgi, WORD* pwlc, SCRIPT_VISATTR*& psva);
|
|
int PlaceString (PLSRUN plsrun, SCRIPT_ANALYSIS* psa, CMeasurer* pme, const WORD* pcwgi, int cgi,
|
|
const SCRIPT_VISATTR* psva, int* pgdx, GOFFSET* pgduv, ABC* pABC);
|
|
int PlaceMetafileString (PLSRUN plsrun, CMeasurer* pme, const WCHAR* pwch, int cch, PINT* ppiDx);
|
|
|
|
private:
|
|
|
|
|
|
// private helper functions
|
|
//
|
|
HDC PrepareShapeDC (CMeasurer* pme, HRESULT hrReq, HFONT& hOrgFont);
|
|
BYTE GetCDMCharSet(BYTE bCharSetDefault);
|
|
DWORD GetNationalDigitLanguage(LCID lcid);
|
|
|
|
// get callback static buffers
|
|
//
|
|
SCRIPT_VISATTR* GetVABuffer(int cel) { return _rgva.Get(cel); }
|
|
WORD* GetGlyphBuffer(int cel) { return _rgglyph.Get(cel); }
|
|
int* GetWidthBuffer(int cel) { return _rgwidth.Get(cel); }
|
|
|
|
|
|
|
|
// LS callback (static) buffers
|
|
//
|
|
CBuffer<WORD> _rgglyph;
|
|
CBuffer<int> _rgwidth;
|
|
CBuffer<SCRIPT_VISATTR> _rgva;
|
|
|
|
// pointer to BidiLevel Finite State Machine
|
|
CBiDiFSM* _pFSM;
|
|
|
|
// pointer to script properties resource table
|
|
const SCRIPT_PROPERTIES** _ppProp;
|
|
|
|
WORD _wesNationalDigit; // National digit script ID
|
|
BYTE _bCharSetRtl; // Right to left charset to use
|
|
BYTE _bCharSetCDM; // CDM charset to use
|
|
};
|
|
|
|
extern CUniscribe* g_pusp;
|
|
extern int g_cMaxScript; // Maximum number of script produced by Uniscribe
|
|
|
|
// Virtual script ID
|
|
#define SCRIPT_MAX_COUNT ((WORD)g_cMaxScript)
|
|
#define SCRIPT_WHITE SCRIPT_MAX_COUNT + 1
|
|
|
|
|
|
|
|
/////// Bidi Finite State Machine class
|
|
//
|
|
// (detail: bidifsm2.html)
|
|
//
|
|
// Revise: 12-28-98 (wchao)
|
|
//
|
|
|
|
// inputs class:
|
|
#define NUM_FSM_INPUTS 5
|
|
typedef enum
|
|
{
|
|
chLTR = 0,
|
|
chRTL,
|
|
digitLTR,
|
|
digitRTL,
|
|
chGround // Neutralize current level down to initial level
|
|
} INPUT_CLASS;
|
|
|
|
// states:
|
|
#define NUM_FSM_STATES 6
|
|
typedef enum
|
|
{
|
|
S_A = 0,
|
|
S_B,
|
|
S_C,
|
|
S_X,
|
|
S_Y,
|
|
S_Z
|
|
} STATES;
|
|
|
|
|
|
class CBiDiFSMCell
|
|
{
|
|
public:
|
|
CBiDiLevel _level; // BiDi level
|
|
USHORT _uNext; // Offset to the next state relative to FSM start
|
|
};
|
|
|
|
|
|
class CBiDiFSM
|
|
{
|
|
public:
|
|
CBiDiFSM (CUniscribe* pusp) { _pusp = pusp; }
|
|
~CBiDiFSM ();
|
|
|
|
BOOL Init (void);
|
|
INPUT_CLASS InputClass (const CCharFormat* pcCF, CTxtPtr* ptp, LONG cchRun) const;
|
|
HRESULT RunFSM (CRchTxtPtr* prtp, LONG cRuns, LONG cRunsStart, BYTE bBaseLevel) const;
|
|
|
|
inline void SetFSMCell (CBiDiFSMCell* pCell, CBiDiLevel* pLevel, USHORT uNext)
|
|
{
|
|
pCell->_level = *pLevel;
|
|
pCell->_uNext = uNext;
|
|
}
|
|
|
|
|
|
private:
|
|
short _nState; // number of state
|
|
short _nInput; // number of input class
|
|
CUniscribe* _pusp; // Uniscribe obj associated with
|
|
CBiDiFSMCell* _pStart; // start FSM
|
|
};
|
|
|
|
#endif // _USPI_H
|