0
|
1 module dynamin.c.uniscribe;
|
|
2
|
|
3 /*
|
|
4 * A complete binding to Uniscribe.
|
|
5 */
|
|
6
|
|
7 import dynamin.c.windows;
|
|
8
|
|
9 version(build) { pragma(link, usp10); }
|
|
10
|
|
11 // TODO: move to a general place?
|
|
12 // http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=1507
|
|
13 template BitField(uint start, uint count, alias data, type = uint) {
|
|
14 static assert((1L << (start + count)) - 1 <= data.max);
|
|
15
|
|
16 const typeof(data) mask = (1UL << count) - 1;
|
|
17
|
|
18 type get() {
|
|
19 return cast(type) ((data >> start) & mask);
|
|
20 }
|
|
21
|
|
22 type set(type value) {
|
|
23 data = (data & ~(mask << start)) |
|
|
24 ((cast(typeof(data)) value & mask) << start);
|
|
25 return value;
|
|
26 }
|
|
27 }
|
|
28
|
|
29 extern(C):
|
|
30
|
|
31 const int USPBUILD = 0400;
|
|
32
|
|
33 enum {
|
|
34 SCRIPT_UNDEFINED = 0
|
|
35 }
|
|
36
|
|
37 //#define USP_E_SCRIPT_NOT_IN_FONT MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x200)
|
|
38
|
|
39 alias void* SCRIPT_CACHE;
|
|
40
|
|
41 HRESULT ScriptFreeCache(SCRIPT_CACHE* psc);
|
|
42
|
|
43 struct SCRIPT_CONTROL { // 32 bits
|
|
44 DWORD fields;
|
|
45 mixin BitField!( 0, 16, fields) uDefaultLanguage;
|
|
46 mixin BitField!(16, 1, fields) fContextDigits;
|
|
47 mixin BitField!(17, 1, fields) fInvertPreBoundDir;
|
|
48 mixin BitField!(18, 1, fields) fInvertPostBoundDir;
|
|
49 mixin BitField!(19, 1, fields) fLinkStringBefore;
|
|
50 mixin BitField!(20, 1, fields) fLinkStringAfter;
|
|
51 mixin BitField!(21, 1, fields) fNeutralOverride;
|
|
52 mixin BitField!(22, 1, fields) fNumericOverride;
|
|
53 mixin BitField!(23, 1, fields) fLegacyBidiClass;
|
|
54 mixin BitField!(24, 8, fields) fReserved;
|
|
55
|
|
56 /*
|
|
57 DWORD uDefaultLanguage :16;
|
|
58 DWORD fContextDigits :1;
|
|
59
|
|
60 DWORD fInvertPreBoundDir :1;
|
|
61 DWORD fInvertPostBoundDir :1;
|
|
62 DWORD fLinkStringBefore :1;
|
|
63 DWORD fLinkStringAfter :1;
|
|
64 DWORD fNeutralOverride :1;
|
|
65 DWORD fNumericOverride :1;
|
|
66 DWORD fLegacyBidiClass :1;
|
|
67 DWORD fReserved :8;
|
|
68 */
|
|
69 }
|
|
70
|
|
71 struct SCRIPT_STATE { // 16 bits
|
|
72 WORD fields;
|
|
73 mixin BitField!( 0, 5, fields, WORD) uBidiLevel;
|
|
74 mixin BitField!( 5, 1, fields, WORD) fOverrideDirection;
|
|
75 mixin BitField!( 6, 1, fields, WORD) fInhibitSymSwap;
|
|
76 mixin BitField!( 7, 1, fields, WORD) fCharShape;
|
|
77 mixin BitField!( 8, 1, fields, WORD) fDigitSubstitute;
|
|
78 mixin BitField!( 9, 1, fields, WORD) fInhibitLigate;
|
|
79 mixin BitField!(10, 1, fields, WORD) fDisplayZWG;
|
|
80 mixin BitField!(11, 1, fields, WORD) fArabicNumContext;
|
|
81 mixin BitField!(12, 1, fields, WORD) fGcpClusters;
|
|
82 mixin BitField!(13, 1, fields, WORD) fReserved;
|
|
83 mixin BitField!(14, 2, fields, WORD) fEngineReserved;
|
|
84
|
|
85 /*
|
|
86 WORD uBidiLevel :5;
|
|
87 WORD fOverrideDirection :1;
|
|
88 WORD fInhibitSymSwap :1;
|
|
89 WORD fCharShape :1;
|
|
90 WORD fDigitSubstitute :1;
|
|
91 WORD fInhibitLigate :1;
|
|
92 WORD fDisplayZWG :1;
|
|
93 WORD fArabicNumContext :1;
|
|
94 WORD fGcpClusters :1;
|
|
95 WORD fReserved :1;
|
|
96 WORD fEngineReserved :2;
|
|
97 */
|
|
98 }
|
|
99
|
|
100 struct SCRIPT_ANALYSIS { // 16 bits +
|
|
101 WORD fields;
|
|
102 mixin BitField!( 0, 10, fields, WORD) eScript;
|
|
103 mixin BitField!(10, 1, fields, WORD) fRTL;
|
|
104 mixin BitField!(11, 1, fields, WORD) fLayoutRTL;
|
|
105 mixin BitField!(12, 1, fields, WORD) fLinkBefore;
|
|
106 mixin BitField!(13, 1, fields, WORD) fLinkAfter;
|
|
107 mixin BitField!(14, 1, fields, WORD) fLogicalOrder;
|
|
108 mixin BitField!(15, 1, fields, WORD) fNoGlyphIndex;
|
|
109
|
|
110 /*
|
|
111 WORD eScript :10;
|
|
112 WORD fRTL :1;
|
|
113 WORD fLayoutRTL :1;
|
|
114 WORD fLinkBefore :1;
|
|
115 WORD fLinkAfter :1;
|
|
116 WORD fLogicalOrder :1;
|
|
117 WORD fNoGlyphIndex :1;
|
|
118 */
|
|
119 SCRIPT_STATE s;
|
|
120 }
|
|
121
|
|
122 struct SCRIPT_ITEM {
|
|
123 int iCharPos;
|
|
124 SCRIPT_ANALYSIS a;
|
|
125 }
|
|
126
|
|
127 HRESULT ScriptItemize(
|
|
128 /*const*/ WCHAR* pwcInChars,
|
|
129 int cInChars,
|
|
130 int cMaxItems,
|
|
131 /*const*/ SCRIPT_CONTROL* psControl,
|
|
132 /*const*/ SCRIPT_STATE* psState,
|
|
133 SCRIPT_ITEM* pItems,
|
|
134 int* pcItems);
|
|
135
|
|
136 HRESULT ScriptLayout(
|
|
137 int cRuns,
|
|
138 /*const*/ BYTE* pbLevel,
|
|
139 int* piVisualToLogical,
|
|
140 int* piLogicalToVisual);
|
|
141
|
|
142 enum SCRIPT_JUSTIFY {
|
|
143 SCRIPT_JUSTIFY_NONE = 0,
|
|
144 SCRIPT_JUSTIFY_ARABIC_BLANK = 1,
|
|
145 SCRIPT_JUSTIFY_CHARACTER = 2,
|
|
146 SCRIPT_JUSTIFY_RESERVED1 = 3,
|
|
147 SCRIPT_JUSTIFY_BLANK = 4,
|
|
148 SCRIPT_JUSTIFY_RESERVED2 = 5,
|
|
149 SCRIPT_JUSTIFY_RESERVED3 = 6,
|
|
150 SCRIPT_JUSTIFY_ARABIC_NORMAL = 7,
|
|
151 SCRIPT_JUSTIFY_ARABIC_KASHIDA = 8,
|
|
152 SCRIPT_JUSTIFY_ARABIC_ALEF = 9,
|
|
153 SCRIPT_JUSTIFY_ARABIC_HA = 10,
|
|
154 SCRIPT_JUSTIFY_ARABIC_RA = 11,
|
|
155 SCRIPT_JUSTIFY_ARABIC_BA = 12,
|
|
156 SCRIPT_JUSTIFY_ARABIC_BARA = 13,
|
|
157 SCRIPT_JUSTIFY_ARABIC_SEEN = 14,
|
|
158 SCRIPT_JUSTIFY_RESERVED4 = 15,
|
|
159 }
|
|
160
|
|
161 struct SCRIPT_VISATTR { // 16 bits
|
|
162 WORD fields;
|
|
163 mixin BitField!(0, 4, fields, WORD) uJustification;
|
|
164 mixin BitField!(4, 1, fields, WORD) fClusterStart;
|
|
165 mixin BitField!(5, 1, fields, WORD) fDiacritic;
|
|
166 mixin BitField!(6, 1, fields, WORD) fZeroWidth;
|
|
167 mixin BitField!(7, 1, fields, WORD) fReserved;
|
|
168 mixin BitField!(8, 8, fields, WORD) fShapeReserved;
|
|
169
|
|
170 /*
|
|
171 WORD uJustification :4;
|
|
172 WORD fClusterStart :1;
|
|
173 WORD fDiacritic :1;
|
|
174 WORD fZeroWidth :1;
|
|
175 WORD fReserved :1;
|
|
176 WORD fShapeReserved :8;
|
|
177 */
|
|
178 }
|
|
179
|
|
180 HRESULT ScriptShape(
|
|
181 HDC hdc,
|
|
182 SCRIPT_CACHE* psc,
|
|
183 /*const*/ WCHAR* pwcChars,
|
|
184 int cChars,
|
|
185 int cMaxGlyphs,
|
|
186 SCRIPT_ANALYSIS* psa,
|
|
187 WORD* pwOutGlyphs,
|
|
188 WORD* pwLogClust,
|
|
189 SCRIPT_VISATTR* psva,
|
|
190 int* pcGlyphs);
|
|
191
|
|
192 struct GOFFSET {
|
|
193 LONG du;
|
|
194 LONG dv;
|
|
195 }
|
|
196
|
|
197 HRESULT ScriptPlace(
|
|
198 HDC hdc,
|
|
199 SCRIPT_CACHE* psc,
|
|
200 /*const*/ WORD* pwGlyphs,
|
|
201 int cGlyphs,
|
|
202 /*const*/ SCRIPT_VISATTR* psva,
|
|
203 SCRIPT_ANALYSIS* psa,
|
|
204 int* piAdvance,
|
|
205 GOFFSET* pGoffset,
|
|
206 ABC* pABC);
|
|
207
|
|
208 HRESULT ScriptTextOut(
|
|
209 /*const*/ HDC hdc,
|
|
210 SCRIPT_CACHE* psc,
|
|
211 int x,
|
|
212 int y,
|
|
213 UINT fuOptions,
|
|
214 /*const*/ RECT* lprc,
|
|
215 /*const*/ SCRIPT_ANALYSIS* psa,
|
|
216 /*const*/ WCHAR* pwcReserved,
|
|
217 int iReserved,
|
|
218 /*const*/ WORD* pwGlyphs,
|
|
219 int cGlyphs,
|
|
220 /*const*/ int* piAdvance,
|
|
221 /*const*/ int* piJustify,
|
|
222 /*const*/ GOFFSET* pGoffset);
|
|
223
|
|
224 HRESULT ScriptJustify(
|
|
225 /*const*/ SCRIPT_VISATTR* psva,
|
|
226 /*const*/ int* piAdvance,
|
|
227 int cGlyphs,
|
|
228 int iDx,
|
|
229 int iMinKashida,
|
|
230 int* piJustify);
|
|
231
|
|
232 struct SCRIPT_LOGATTR { // 8 bits
|
|
233 BYTE fields;
|
|
234 mixin BitField!(0, 1, fields, BYTE) fSoftBreak;
|
|
235 mixin BitField!(1, 1, fields, BYTE) fWhiteSpace;
|
|
236 mixin BitField!(2, 1, fields, BYTE) fCharStop;
|
|
237 mixin BitField!(3, 1, fields, BYTE) fWordStop;
|
|
238 mixin BitField!(4, 1, fields, BYTE) fInvalid;
|
|
239 mixin BitField!(5, 3, fields, BYTE) fReserved;
|
|
240
|
|
241 /*
|
|
242 BYTE fSoftBreak :1;
|
|
243 BYTE fWhiteSpace :1;
|
|
244 BYTE fCharStop :1;
|
|
245 BYTE fWordStop :1;
|
|
246 BYTE fInvalid :1;
|
|
247 BYTE fReserved :3;
|
|
248 */
|
|
249 }
|
|
250
|
|
251 HRESULT ScriptBreak(
|
|
252 /*const*/ WCHAR* pwcChars,
|
|
253 int cChars,
|
|
254 /*const*/ SCRIPT_ANALYSIS* psa,
|
|
255 SCRIPT_LOGATTR* psla);
|
|
256
|
|
257 HRESULT ScriptCPtoX(
|
|
258 int iCP,
|
|
259 BOOL fTrailing,
|
|
260 int cChars,
|
|
261 int cGlyphs,
|
|
262 /*const*/ WORD* pwLogClust,
|
|
263 /*const*/ SCRIPT_VISATTR* psva,
|
|
264 /*const*/ int* piAdvance,
|
|
265 /*const*/ SCRIPT_ANALYSIS* psa,
|
|
266 int* piX);
|
|
267
|
|
268 HRESULT ScriptXtoCP(
|
|
269 int iX,
|
|
270 int cChars,
|
|
271 int cGlyphs,
|
|
272 /*const*/ WORD* pwLogClust,
|
|
273 /*const*/ SCRIPT_VISATTR* psva,
|
|
274 /*const*/ int* piAdvance,
|
|
275 /*const*/ SCRIPT_ANALYSIS* psa,
|
|
276 int* piCP,
|
|
277 int* piTrailing);
|
|
278
|
|
279 HRESULT ScriptGetLogicalWidths(
|
|
280 /*const*/ SCRIPT_ANALYSIS* psa,
|
|
281 int cChars,
|
|
282 int cGlyphs,
|
|
283 /*const*/ int* piGlyphWidth,
|
|
284 /*const*/ WORD* pwLogClust,
|
|
285 /*const*/ SCRIPT_VISATTR* psva,
|
|
286 int* piDx);
|
|
287
|
|
288 HRESULT ScriptApplyLogicalWidth(
|
|
289 /*const*/ int* piDx,
|
|
290 int cChars,
|
|
291 int cGlyphs,
|
|
292 /*const*/ WORD* pwLogClust,
|
|
293 /*const*/ SCRIPT_VISATTR* psva,
|
|
294 /*const*/ int* piAdvance,
|
|
295 /*const*/ SCRIPT_ANALYSIS* psa,
|
|
296 ABC* pABC,
|
|
297 int* piJustify);
|
|
298
|
|
299 enum {
|
|
300 SGCM_RTL = 0x00000001
|
|
301 }
|
|
302
|
|
303 HRESULT ScriptGetCMap(
|
|
304 HDC hdc,
|
|
305 SCRIPT_CACHE* psc,
|
|
306 /*const*/ WCHAR* pwcInChars,
|
|
307 int cChars,
|
|
308 DWORD dwFlags,
|
|
309 WORD* pwOutGlyphs);
|
|
310
|
|
311 HRESULT ScriptGetGlyphABCWidth(
|
|
312 HDC hdc,
|
|
313 SCRIPT_CACHE* psc,
|
|
314 WORD wGlyph,
|
|
315 ABC* pABC);
|
|
316
|
|
317 struct SCRIPT_PROPERTIES { // 37 bits
|
|
318 DWORD fields1;
|
|
319 DWORD fields2;
|
|
320 mixin BitField!( 0, 16, fields1) langid;
|
|
321 mixin BitField!(16, 1, fields1) fNumeric;
|
|
322 mixin BitField!(17, 1, fields1) fComplex;
|
|
323 mixin BitField!(18, 1, fields1) fNeedsWordBreaking;
|
|
324 mixin BitField!(19, 1, fields1) fNeedsCaretInfo;
|
|
325 mixin BitField!(20, 8, fields1) bCharSet;
|
|
326 mixin BitField!(28, 1, fields1) fControl;
|
|
327 mixin BitField!(29, 1, fields1) fPrivateUseArea;
|
|
328 mixin BitField!(30, 1, fields1) fNeedsCharacterJustify;
|
|
329 mixin BitField!(31, 1, fields1) fInvalidGlyph;
|
|
330 mixin BitField!( 0, 1, fields2) fInvalidLogAttr;
|
|
331 mixin BitField!( 1, 1, fields2) fCDM;
|
|
332 mixin BitField!( 2, 1, fields2) fAmbiguousCharSet;
|
|
333 mixin BitField!( 3, 1, fields2) fClusterSizeVaries;
|
|
334 mixin BitField!( 4, 1, fields2) fRejectInvalid;
|
|
335
|
|
336 /*
|
|
337 DWORD langid :16;
|
|
338 DWORD fNumeric :1;
|
|
339 DWORD fComplex :1;
|
|
340 DWORD fNeedsWordBreaking :1;
|
|
341 DWORD fNeedsCaretInfo :1;
|
|
342 DWORD bCharSet :8;
|
|
343 DWORD fControl :1;
|
|
344 DWORD fPrivateUseArea :1;
|
|
345 DWORD fNeedsCharacterJustify :1;
|
|
346 DWORD fInvalidGlyph :1;
|
|
347 DWORD fInvalidLogAttr :1;
|
|
348 DWORD fCDM :1;
|
|
349 DWORD fAmbiguousCharSet :1;
|
|
350 DWORD fClusterSizeVaries :1;
|
|
351 DWORD fRejectInvalid :1;
|
|
352 */
|
|
353 }
|
|
354
|
|
355 HRESULT ScriptGetProperties(
|
|
356 /*const*/ SCRIPT_PROPERTIES*** ppSp,
|
|
357 int* piNumScripts);
|
|
358
|
|
359 struct SCRIPT_FONTPROPERTIES {
|
|
360 int cBytes;
|
|
361 WORD wgBlank;
|
|
362 WORD wgDefault;
|
|
363 WORD wgInvalid;
|
|
364 WORD wgKashida;
|
|
365 int iKashidaWidth;
|
|
366 }
|
|
367
|
|
368 HRESULT ScriptGetFontProperties(
|
|
369 HDC hdc,
|
|
370 SCRIPT_CACHE* psc,
|
|
371 SCRIPT_FONTPROPERTIES* sfp);
|
|
372
|
|
373 HRESULT ScriptCacheGetHeight(
|
|
374 HDC hdc,
|
|
375 SCRIPT_CACHE* psc,
|
|
376 int* tmHeight);
|
|
377
|
|
378 enum {
|
|
379 SSA_PASSWORD = 0x00000001,
|
|
380 SSA_TAB = 0x00000002,
|
|
381 SSA_CLIP = 0x00000004,
|
|
382 SSA_FIT = 0x00000008,
|
|
383 SSA_DZWG = 0x00000010,
|
|
384 SSA_FALLBACK = 0x00000020,
|
|
385 SSA_BREAK = 0x00000040,
|
|
386 SSA_GLYPHS = 0x00000080,
|
|
387 SSA_RTL = 0x00000100,
|
|
388 SSA_GCP = 0x00000200,
|
|
389 SSA_HOTKEY = 0x00000400,
|
|
390 SSA_METAFILE = 0x00000800,
|
|
391 SSA_LINK = 0x00001000,
|
|
392 SSA_HIDEHOTKEY = 0x00002000,
|
|
393 SSA_HOTKEYONLY = 0x00002400,
|
|
394
|
|
395 SSA_FULLMEASURE = 0x04000000,
|
|
396 SSA_LPKANSIFALLBACK = 0x08000000,
|
|
397 SSA_PIDX = 0x10000000,
|
|
398 SSA_LAYOUTRTL = 0x20000000,
|
|
399 SSA_DONTGLYPH = 0x40000000,
|
|
400 SSA_NOKASHIDA = 0x80000000,
|
|
401 }
|
|
402
|
|
403 struct SCRIPT_TABDEF {
|
|
404 int cTabStops;
|
|
405 int iScale;
|
|
406 int* pTabStops;
|
|
407 int iTabOrigin;
|
|
408 }
|
|
409
|
|
410 alias void* SCRIPT_STRING_ANALYSIS;
|
|
411
|
|
412 HRESULT ScriptStringAnalyse(
|
|
413 HDC hdc,
|
|
414 /*const*/ void* pString,
|
|
415 int cString,
|
|
416 int cGlyphs,
|
|
417 int iCharset,
|
|
418 DWORD dwFlags,
|
|
419 int iReqWidth,
|
|
420 SCRIPT_CONTROL* psControl,
|
|
421 SCRIPT_STATE* psState,
|
|
422 /*const*/ int* piDx,
|
|
423 SCRIPT_TABDEF* pTabdef,
|
|
424 /*const*/ BYTE* pbInClass,
|
|
425 SCRIPT_STRING_ANALYSIS* pssa);
|
|
426
|
|
427 HRESULT ScriptStringFree(SCRIPT_STRING_ANALYSIS* pssa);
|
|
428
|
|
429 /*const*/ SIZE* ScriptString_pSize(SCRIPT_STRING_ANALYSIS ssa);
|
|
430
|
|
431 /*const*/ int* ScriptString_pcOutChars(SCRIPT_STRING_ANALYSIS ssa);
|
|
432
|
|
433 /*const*/ SCRIPT_LOGATTR* ScriptString_pLogAttr(SCRIPT_STRING_ANALYSIS ssa);
|
|
434
|
|
435 HRESULT ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT* puOrder);
|
|
436
|
|
437 HRESULT ScriptStringCPtoX(
|
|
438 SCRIPT_STRING_ANALYSIS ssa,
|
|
439 int icp,
|
|
440 BOOL fTrailing,
|
|
441 int* pX);
|
|
442
|
|
443 HRESULT ScriptStringXtoCP(
|
|
444 SCRIPT_STRING_ANALYSIS ssa,
|
|
445 int iX,
|
|
446 int* piCh,
|
|
447 int* piTrailing);
|
|
448
|
|
449 HRESULT ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS ssa, int* piDx);
|
|
450
|
|
451 HRESULT ScriptStringValidate(SCRIPT_STRING_ANALYSIS ssa);
|
|
452
|
|
453 HRESULT ScriptStringOut(
|
|
454 SCRIPT_STRING_ANALYSIS ssa,
|
|
455 int iX,
|
|
456 int iY,
|
|
457 UINT uOptions,
|
|
458 /*const*/ RECT* prc,
|
|
459 int iMinSel,
|
|
460 int iMaxSel,
|
|
461 BOOL fDisabled);
|
|
462
|
|
463 enum {
|
|
464 SIC_COMPLEX = 1,
|
|
465 SIC_ASCIIDIGIT = 2,
|
|
466 SIC_NEUTRAL = 4,
|
|
467 }
|
|
468
|
|
469 HRESULT ScriptIsComplex(
|
|
470 /*const*/ WCHAR* pwcInChars,
|
|
471 int cInChars,
|
|
472 DWORD dwFlags);
|
|
473
|
|
474 struct SCRIPT_DIGITSUBSTITUTE {
|
|
475 DWORD fields1;
|
|
476 DWORD fields2;
|
|
477 mixin BitField!( 0, 16, fields1) NationalDigitLanguage;
|
|
478 mixin BitField!(16, 16, fields1) TraditionalDigitLanguage;
|
|
479 mixin BitField!( 0, 8, fields2) DigitSubstitute;
|
|
480
|
|
481 /*
|
|
482 DWORD NationalDigitLanguage :16;
|
|
483 DWORD TraditionalDigitLanguage :16;
|
|
484 DWORD DigitSubstitute :8;
|
|
485 */
|
|
486 DWORD dwReserved;
|
|
487 }
|
|
488
|
|
489 HRESULT ScriptRecordDigitSubstitution(
|
|
490 LCID Locale,
|
|
491 SCRIPT_DIGITSUBSTITUTE* psds);
|
|
492
|
|
493 enum {
|
|
494 SCRIPT_DIGITSUBSTITUTE_CONTEXT = 0,
|
|
495 SCRIPT_DIGITSUBSTITUTE_NONE = 1,
|
|
496 SCRIPT_DIGITSUBSTITUTE_NATIONAL = 2,
|
|
497 SCRIPT_DIGITSUBSTITUTE_TRADITIONAL = 3,
|
|
498 }
|
|
499
|
|
500 HRESULT ScriptApplyDigitSubstitution(
|
|
501 /*const*/ SCRIPT_DIGITSUBSTITUTE* psds,
|
|
502 SCRIPT_CONTROL* psc,
|
|
503 SCRIPT_STATE* pss);
|
|
504
|
|
505
|