diff dynamin/c/uniscribe.d @ 0:aa4efef0f0b1

Initial commit of code.
author Jordan Miner <jminer7@gmail.com>
date Mon, 15 Jun 2009 22:10:48 -0500
parents
children f149c868a34f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dynamin/c/uniscribe.d	Mon Jun 15 22:10:48 2009 -0500
@@ -0,0 +1,505 @@
+module dynamin.c.uniscribe;
+
+/*
+ * A complete binding to Uniscribe.
+ */
+
+import dynamin.c.windows;
+
+version(build) { pragma(link, usp10); }
+
+// TODO: move to a general place?
+// http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=1507
+template BitField(uint start, uint count, alias data, type = uint) {
+	static assert((1L << (start + count)) - 1 <= data.max);
+
+	const typeof(data) mask = (1UL << count) - 1;
+
+	type get() {
+		return cast(type) ((data >> start) & mask);
+	}
+
+	type set(type value) {
+		data = (data & ~(mask << start)) |
+			((cast(typeof(data)) value & mask) << start);
+		return value;
+	}
+}
+
+extern(C):
+
+const int USPBUILD = 0400;
+
+enum {
+	SCRIPT_UNDEFINED = 0
+}
+
+//#define USP_E_SCRIPT_NOT_IN_FONT  MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x200)
+
+alias void* SCRIPT_CACHE;
+
+HRESULT ScriptFreeCache(SCRIPT_CACHE* psc);
+
+struct SCRIPT_CONTROL { // 32 bits
+	DWORD fields;
+	mixin BitField!( 0, 16, fields) uDefaultLanguage;
+	mixin BitField!(16,  1, fields) fContextDigits;
+	mixin BitField!(17,  1, fields) fInvertPreBoundDir;
+	mixin BitField!(18,  1, fields) fInvertPostBoundDir;
+	mixin BitField!(19,  1, fields) fLinkStringBefore;
+	mixin BitField!(20,  1, fields) fLinkStringAfter;
+	mixin BitField!(21,  1, fields) fNeutralOverride;
+	mixin BitField!(22,  1, fields) fNumericOverride;
+	mixin BitField!(23,  1, fields) fLegacyBidiClass;
+	mixin BitField!(24,  8, fields) fReserved;
+
+	/*
+	DWORD uDefaultLanguage    :16;
+	DWORD fContextDigits      :1;
+
+	DWORD fInvertPreBoundDir  :1;
+	DWORD fInvertPostBoundDir :1;
+	DWORD fLinkStringBefore   :1;
+	DWORD fLinkStringAfter    :1;
+	DWORD fNeutralOverride    :1;
+	DWORD fNumericOverride    :1;
+	DWORD fLegacyBidiClass    :1;
+	DWORD fReserved           :8;
+	*/
+}
+
+struct SCRIPT_STATE { // 16 bits
+	WORD fields;
+	mixin BitField!( 0, 5, fields, WORD) uBidiLevel;
+	mixin BitField!( 5, 1, fields, WORD) fOverrideDirection;
+	mixin BitField!( 6, 1, fields, WORD) fInhibitSymSwap;
+	mixin BitField!( 7, 1, fields, WORD) fCharShape;
+	mixin BitField!( 8, 1, fields, WORD) fDigitSubstitute;
+	mixin BitField!( 9, 1, fields, WORD) fInhibitLigate;
+	mixin BitField!(10, 1, fields, WORD) fDisplayZWG;
+	mixin BitField!(11, 1, fields, WORD) fArabicNumContext;
+	mixin BitField!(12, 1, fields, WORD) fGcpClusters;
+	mixin BitField!(13, 1, fields, WORD) fReserved;
+	mixin BitField!(14, 2, fields, WORD) fEngineReserved;
+
+	/*
+	WORD uBidiLevel         :5;
+	WORD fOverrideDirection :1;
+	WORD fInhibitSymSwap    :1;
+	WORD fCharShape         :1;
+	WORD fDigitSubstitute   :1;
+	WORD fInhibitLigate     :1;
+	WORD fDisplayZWG        :1;
+	WORD fArabicNumContext  :1;
+	WORD fGcpClusters       :1;
+	WORD fReserved          :1;
+	WORD fEngineReserved    :2;
+	*/
+}
+
+struct SCRIPT_ANALYSIS { // 16 bits +
+	WORD fields;
+	mixin BitField!( 0, 10, fields, WORD) eScript;
+	mixin BitField!(10,  1, fields, WORD) fRTL;
+	mixin BitField!(11,  1, fields, WORD) fLayoutRTL;
+	mixin BitField!(12,  1, fields, WORD) fLinkBefore;
+	mixin BitField!(13,  1, fields, WORD) fLinkAfter;
+	mixin BitField!(14,  1, fields, WORD) fLogicalOrder;
+	mixin BitField!(15,  1, fields, WORD) fNoGlyphIndex;
+
+	/*
+	WORD eScript         :10;
+	WORD fRTL            :1;
+	WORD fLayoutRTL      :1;
+	WORD fLinkBefore     :1;
+	WORD fLinkAfter      :1;
+	WORD fLogicalOrder   :1;
+	WORD fNoGlyphIndex   :1;
+	*/
+	SCRIPT_STATE s;
+}
+
+struct SCRIPT_ITEM {
+	int iCharPos;
+	SCRIPT_ANALYSIS a;
+}
+
+HRESULT ScriptItemize(
+	/*const*/ WCHAR* pwcInChars,
+	int cInChars,
+	int cMaxItems,
+	/*const*/ SCRIPT_CONTROL* psControl,
+	/*const*/ SCRIPT_STATE* psState,
+	SCRIPT_ITEM* pItems,
+	int* pcItems);
+
+HRESULT ScriptLayout(
+	int cRuns,
+	/*const*/ BYTE* pbLevel,
+	int* piVisualToLogical,
+	int* piLogicalToVisual);
+
+enum SCRIPT_JUSTIFY {
+	SCRIPT_JUSTIFY_NONE           = 0,
+	SCRIPT_JUSTIFY_ARABIC_BLANK   = 1,
+	SCRIPT_JUSTIFY_CHARACTER      = 2,
+	SCRIPT_JUSTIFY_RESERVED1      = 3,
+	SCRIPT_JUSTIFY_BLANK          = 4,
+	SCRIPT_JUSTIFY_RESERVED2      = 5,
+	SCRIPT_JUSTIFY_RESERVED3      = 6,
+	SCRIPT_JUSTIFY_ARABIC_NORMAL  = 7,
+	SCRIPT_JUSTIFY_ARABIC_KASHIDA = 8,
+	SCRIPT_JUSTIFY_ARABIC_ALEF    = 9,
+	SCRIPT_JUSTIFY_ARABIC_HA      = 10,
+	SCRIPT_JUSTIFY_ARABIC_RA      = 11,
+	SCRIPT_JUSTIFY_ARABIC_BA      = 12,
+	SCRIPT_JUSTIFY_ARABIC_BARA    = 13,
+	SCRIPT_JUSTIFY_ARABIC_SEEN    = 14,
+	SCRIPT_JUSTIFY_RESERVED4      = 15,
+}
+
+struct SCRIPT_VISATTR { // 16 bits
+	WORD fields;
+	mixin BitField!(0, 4, fields, WORD) uJustification;
+	mixin BitField!(4, 1, fields, WORD) fClusterStart;
+	mixin BitField!(5, 1, fields, WORD) fDiacritic;
+	mixin BitField!(6, 1, fields, WORD) fZeroWidth;
+	mixin BitField!(7, 1, fields, WORD) fReserved;
+	mixin BitField!(8, 8, fields, WORD) fShapeReserved;
+
+	/*
+	WORD uJustification :4;
+	WORD fClusterStart  :1;
+	WORD fDiacritic     :1;
+	WORD fZeroWidth     :1;
+	WORD fReserved      :1;
+	WORD fShapeReserved :8;
+	*/
+}
+
+HRESULT ScriptShape(
+	HDC hdc,
+	SCRIPT_CACHE* psc,
+	/*const*/ WCHAR* pwcChars,
+	int cChars,
+	int cMaxGlyphs,
+	SCRIPT_ANALYSIS* psa,
+	WORD* pwOutGlyphs,
+	WORD* pwLogClust,
+	SCRIPT_VISATTR* psva,
+	int* pcGlyphs);
+
+struct GOFFSET {
+	LONG du;
+	LONG dv;
+}
+
+HRESULT ScriptPlace(
+	HDC hdc,
+	SCRIPT_CACHE* psc,
+	/*const*/ WORD* pwGlyphs,
+	int cGlyphs,
+	/*const*/ SCRIPT_VISATTR* psva,
+	SCRIPT_ANALYSIS* psa,
+	int* piAdvance,
+	GOFFSET* pGoffset,
+	ABC* pABC);
+
+HRESULT ScriptTextOut(
+	/*const*/ HDC hdc,
+	SCRIPT_CACHE* psc,
+	int x,
+	int y,
+	UINT fuOptions,
+	/*const*/ RECT* lprc,
+	/*const*/ SCRIPT_ANALYSIS* psa,
+	/*const*/ WCHAR* pwcReserved,
+	int iReserved,
+	/*const*/ WORD* pwGlyphs,
+	int cGlyphs,
+	/*const*/ int* piAdvance,
+	/*const*/ int* piJustify,
+	/*const*/ GOFFSET* pGoffset);
+
+HRESULT ScriptJustify(
+	/*const*/ SCRIPT_VISATTR* psva,
+	/*const*/ int* piAdvance,
+	int cGlyphs,
+	int iDx,
+	int iMinKashida,
+	int* piJustify);
+
+struct SCRIPT_LOGATTR { // 8 bits
+	BYTE fields;
+	mixin BitField!(0, 1, fields, BYTE) fSoftBreak;
+	mixin BitField!(1, 1, fields, BYTE) fWhiteSpace;
+	mixin BitField!(2, 1, fields, BYTE) fCharStop;
+	mixin BitField!(3, 1, fields, BYTE) fWordStop;
+	mixin BitField!(4, 1, fields, BYTE) fInvalid;
+	mixin BitField!(5, 3, fields, BYTE) fReserved;
+
+	/*
+	BYTE fSoftBreak  :1;
+	BYTE fWhiteSpace :1;
+	BYTE fCharStop   :1;
+	BYTE fWordStop   :1;
+	BYTE fInvalid    :1;
+	BYTE fReserved   :3;
+	*/
+}
+
+HRESULT ScriptBreak(
+	/*const*/ WCHAR* pwcChars,
+	int cChars,
+	/*const*/ SCRIPT_ANALYSIS* psa,
+	SCRIPT_LOGATTR* psla);
+
+HRESULT ScriptCPtoX(
+	int iCP,
+	BOOL fTrailing,
+	int cChars,
+	int cGlyphs,
+	/*const*/ WORD* pwLogClust,
+	/*const*/ SCRIPT_VISATTR* psva,
+	/*const*/ int* piAdvance,
+	/*const*/ SCRIPT_ANALYSIS* psa,
+	int* piX);
+
+HRESULT ScriptXtoCP(
+	int iX,
+	int cChars,
+	int cGlyphs,
+	/*const*/ WORD* pwLogClust,
+	/*const*/ SCRIPT_VISATTR* psva,
+	/*const*/ int* piAdvance,
+	/*const*/ SCRIPT_ANALYSIS* psa,
+	int* piCP,
+	int* piTrailing);
+
+HRESULT ScriptGetLogicalWidths(
+	/*const*/ SCRIPT_ANALYSIS* psa,
+	int cChars,
+	int cGlyphs,
+	/*const*/ int* piGlyphWidth,
+	/*const*/ WORD* pwLogClust,
+	/*const*/ SCRIPT_VISATTR* psva,
+	int* piDx);
+
+HRESULT ScriptApplyLogicalWidth(
+	/*const*/ int* piDx,
+	int cChars,
+	int cGlyphs,
+	/*const*/ WORD* pwLogClust,
+	/*const*/ SCRIPT_VISATTR* psva,
+	/*const*/ int* piAdvance,
+	/*const*/ SCRIPT_ANALYSIS* psa,
+	ABC* pABC,
+	int* piJustify);
+
+enum {
+	SGCM_RTL = 0x00000001
+}
+
+HRESULT ScriptGetCMap(
+	HDC hdc,
+	SCRIPT_CACHE* psc,
+	/*const*/ WCHAR* pwcInChars,
+	int cChars,
+	DWORD dwFlags,
+	WORD* pwOutGlyphs);
+
+HRESULT ScriptGetGlyphABCWidth(
+	HDC hdc,
+	SCRIPT_CACHE* psc,
+	WORD wGlyph,
+	ABC* pABC);
+
+struct SCRIPT_PROPERTIES { // 37 bits
+	DWORD fields1;
+	DWORD fields2;
+	mixin BitField!( 0, 16, fields1) langid;
+	mixin BitField!(16,  1, fields1) fNumeric;
+	mixin BitField!(17,  1, fields1) fComplex;
+	mixin BitField!(18,  1, fields1) fNeedsWordBreaking;
+	mixin BitField!(19,  1, fields1) fNeedsCaretInfo;
+	mixin BitField!(20,  8, fields1) bCharSet;
+	mixin BitField!(28,  1, fields1) fControl;
+	mixin BitField!(29,  1, fields1) fPrivateUseArea;
+	mixin BitField!(30,  1, fields1) fNeedsCharacterJustify;
+	mixin BitField!(31,  1, fields1) fInvalidGlyph;
+	mixin BitField!( 0,  1, fields2) fInvalidLogAttr;
+	mixin BitField!( 1,  1, fields2) fCDM;
+	mixin BitField!( 2,  1, fields2) fAmbiguousCharSet;
+	mixin BitField!( 3,  1, fields2) fClusterSizeVaries;
+	mixin BitField!( 4,  1, fields2) fRejectInvalid;
+
+	/*
+	DWORD langid                 :16;
+	DWORD fNumeric               :1;
+	DWORD fComplex               :1;
+	DWORD fNeedsWordBreaking     :1;
+	DWORD fNeedsCaretInfo        :1;
+	DWORD bCharSet               :8;
+	DWORD fControl               :1;
+	DWORD fPrivateUseArea        :1;
+	DWORD fNeedsCharacterJustify :1;
+	DWORD fInvalidGlyph          :1;
+	DWORD fInvalidLogAttr        :1;
+	DWORD fCDM                   :1;
+	DWORD fAmbiguousCharSet      :1;
+	DWORD fClusterSizeVaries     :1;
+	DWORD fRejectInvalid         :1;
+	*/
+}
+
+HRESULT ScriptGetProperties(
+	/*const*/ SCRIPT_PROPERTIES*** ppSp,
+	int* piNumScripts);
+
+struct SCRIPT_FONTPROPERTIES {
+	int  cBytes;
+	WORD wgBlank;
+	WORD wgDefault;
+	WORD wgInvalid;
+	WORD wgKashida;
+	int  iKashidaWidth;
+}
+
+HRESULT ScriptGetFontProperties(
+	HDC hdc,
+	SCRIPT_CACHE* psc,
+	SCRIPT_FONTPROPERTIES* sfp);
+
+HRESULT ScriptCacheGetHeight(
+	HDC hdc,
+	SCRIPT_CACHE* psc,
+	int* tmHeight);
+
+enum {
+	SSA_PASSWORD        = 0x00000001,
+	SSA_TAB             = 0x00000002,
+	SSA_CLIP            = 0x00000004,
+	SSA_FIT             = 0x00000008,
+	SSA_DZWG            = 0x00000010,
+	SSA_FALLBACK        = 0x00000020,
+	SSA_BREAK           = 0x00000040,
+	SSA_GLYPHS          = 0x00000080,
+	SSA_RTL             = 0x00000100,
+	SSA_GCP             = 0x00000200,
+	SSA_HOTKEY          = 0x00000400,
+	SSA_METAFILE        = 0x00000800,
+	SSA_LINK            = 0x00001000,
+	SSA_HIDEHOTKEY      = 0x00002000,
+	SSA_HOTKEYONLY      = 0x00002400,
+
+	SSA_FULLMEASURE     = 0x04000000,
+	SSA_LPKANSIFALLBACK = 0x08000000,
+	SSA_PIDX            = 0x10000000,
+	SSA_LAYOUTRTL       = 0x20000000,
+	SSA_DONTGLYPH       = 0x40000000,
+	SSA_NOKASHIDA       = 0x80000000,
+}
+
+struct SCRIPT_TABDEF {
+	int cTabStops;
+	int iScale;
+	int* pTabStops;
+	int iTabOrigin;
+}
+
+alias void* SCRIPT_STRING_ANALYSIS;
+
+HRESULT ScriptStringAnalyse(
+	HDC hdc,
+	/*const*/ void* pString,
+	int cString,
+	int cGlyphs,
+	int iCharset,
+	DWORD dwFlags,
+	int iReqWidth,
+	SCRIPT_CONTROL* psControl,
+	SCRIPT_STATE* psState,
+	/*const*/ int* piDx,
+	SCRIPT_TABDEF* pTabdef,
+	/*const*/ BYTE* pbInClass,
+	SCRIPT_STRING_ANALYSIS* pssa);
+
+HRESULT ScriptStringFree(SCRIPT_STRING_ANALYSIS* pssa);
+
+/*const*/ SIZE* ScriptString_pSize(SCRIPT_STRING_ANALYSIS ssa);
+
+/*const*/ int* ScriptString_pcOutChars(SCRIPT_STRING_ANALYSIS ssa);
+
+/*const*/ SCRIPT_LOGATTR* ScriptString_pLogAttr(SCRIPT_STRING_ANALYSIS ssa);
+
+HRESULT ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT* puOrder);
+
+HRESULT ScriptStringCPtoX(
+	SCRIPT_STRING_ANALYSIS ssa,
+	int icp,
+	BOOL fTrailing,
+	int* pX);
+
+HRESULT ScriptStringXtoCP(
+	SCRIPT_STRING_ANALYSIS ssa,
+	int iX,
+	int* piCh,
+	int* piTrailing);
+
+HRESULT ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS ssa, int* piDx);
+
+HRESULT ScriptStringValidate(SCRIPT_STRING_ANALYSIS ssa);
+
+HRESULT ScriptStringOut(
+	SCRIPT_STRING_ANALYSIS ssa,
+	int iX,
+	int iY,
+	UINT uOptions,
+	/*const*/ RECT* prc,
+	int iMinSel,
+	int iMaxSel,
+	BOOL fDisabled);
+
+enum {
+	SIC_COMPLEX    = 1,
+	SIC_ASCIIDIGIT = 2,
+	SIC_NEUTRAL    = 4,
+}
+
+HRESULT ScriptIsComplex(
+    /*const*/ WCHAR* pwcInChars,
+    int cInChars,
+    DWORD dwFlags);
+
+struct SCRIPT_DIGITSUBSTITUTE {
+	DWORD fields1;
+	DWORD fields2;
+	mixin BitField!( 0, 16, fields1) NationalDigitLanguage;
+	mixin BitField!(16, 16, fields1) TraditionalDigitLanguage;
+	mixin BitField!( 0,  8, fields2) DigitSubstitute;
+
+	/*
+	DWORD NationalDigitLanguage    :16;
+	DWORD TraditionalDigitLanguage :16;
+	DWORD DigitSubstitute          :8;
+	*/
+	DWORD dwReserved;
+}
+
+HRESULT ScriptRecordDigitSubstitution(
+	LCID Locale,
+	SCRIPT_DIGITSUBSTITUTE* psds);
+
+enum {
+	SCRIPT_DIGITSUBSTITUTE_CONTEXT     = 0,
+	SCRIPT_DIGITSUBSTITUTE_NONE        = 1,
+	SCRIPT_DIGITSUBSTITUTE_NATIONAL    = 2,
+	SCRIPT_DIGITSUBSTITUTE_TRADITIONAL = 3,
+}
+
+HRESULT ScriptApplyDigitSubstitution(
+	/*const*/ SCRIPT_DIGITSUBSTITUTE* psds,
+	SCRIPT_CONTROL* psc,
+	SCRIPT_STATE* pss);
+
+