347 lines
7.7 KiB
C
347 lines
7.7 KiB
C
|
/*
|
||
|
* 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 NOCOMPLEXSCRIPTS
|
||
|
|
||
|
#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_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 GetComplexCharRep(const SCRIPT_PROPERTIES* psp, BYTE iCharRepDefault, BYTE& iCharRepOut);
|
||
|
BYTE GetRtlCharRep(CTxtEdit* ped, CRchTxtPtr* prtp);
|
||
|
|
||
|
// 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 (PLSRUN plsrun, CMeasurer* pme, HRESULT hrReq, HFONT& hOrgFont);
|
||
|
BYTE GetCDMCharRep(BYTE iCharRepDefault);
|
||
|
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); }
|
||
|
GOFFSET* GetGoffsetBuffer(int cel) { return _rgGoffset.Get(cel); }
|
||
|
|
||
|
// LS callback (static) buffers
|
||
|
//
|
||
|
CBuffer<WORD> _rgglyph;
|
||
|
CBuffer<int> _rgwidth;
|
||
|
CBuffer<GOFFSET> _rgGoffset;
|
||
|
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 _iCharRepRtl; // Right to left char rep to use
|
||
|
BYTE _iCharRepCDM; // CDM char repertoire 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
|
||
|
|
||
|
#endif // NOCOMPLEXSCRIPTS
|
||
|
|
||
|
|