Mercurial > projects > dynamin
annotate dynamin/c/uniscribe.d @ 106:acdbb30fee7e
Port to D2.
Most of the effort was dealing with immutable and const.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Mon, 17 Dec 2012 23:41:50 -0600 |
parents | 0d6778fea624 |
children |
rev | line source |
---|---|
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 | |
88
f149c868a34f
Change wrong extern type for Uniscribe functions. It caused a function-not-found
Jordan Miner <jminer7@gmail.com>
parents:
0
diff
changeset
|
29 extern(Windows): |
0 | 30 |
106 | 31 //const int USPBUILD = octal!400; |
0 | 32 |
33 enum { | |
34 SCRIPT_UNDEFINED = 0 | |
35 } | |
36 | |
89
0d6778fea624
Add some Windows error constants and related functions.
Jordan Miner <jminer7@gmail.com>
parents:
88
diff
changeset
|
37 const HRESULT USP_E_SCRIPT_NOT_IN_FONT = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x200); |
0 | 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( | |
106 | 128 const(WCHAR)* pwcInChars, |
0 | 129 int cInChars, |
130 int cMaxItems, | |
106 | 131 const(SCRIPT_CONTROL)* psControl, |
132 const(SCRIPT_STATE)* psState, | |
0 | 133 SCRIPT_ITEM* pItems, |
134 int* pcItems); | |
135 | |
136 HRESULT ScriptLayout( | |
137 int cRuns, | |
106 | 138 const(BYTE)* pbLevel, |
0 | 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, | |
106 | 183 const(WCHAR)* pwcChars, |
0 | 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, | |
106 | 200 const(WORD)* pwGlyphs, |
0 | 201 int cGlyphs, |
106 | 202 const(SCRIPT_VISATTR)* psva, |
0 | 203 SCRIPT_ANALYSIS* psa, |
204 int* piAdvance, | |
205 GOFFSET* pGoffset, | |
206 ABC* pABC); | |
207 | |
208 HRESULT ScriptTextOut( | |
106 | 209 const(HDC) hdc, |
0 | 210 SCRIPT_CACHE* psc, |
211 int x, | |
212 int y, | |
213 UINT fuOptions, | |
106 | 214 const(RECT)* lprc, |
215 const(SCRIPT_ANALYSIS)* psa, | |
216 const(WCHAR)* pwcReserved, | |
0 | 217 int iReserved, |
106 | 218 const(WORD)* pwGlyphs, |
0 | 219 int cGlyphs, |
106 | 220 const(int)* piAdvance, |
221 const(int)* piJustify, | |
222 const(GOFFSET)* pGoffset); | |
0 | 223 |
224 HRESULT ScriptJustify( | |
106 | 225 const(SCRIPT_VISATTR)* psva, |
226 const(int)* piAdvance, | |
0 | 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( | |
106 | 252 const(WCHAR)* pwcChars, |
0 | 253 int cChars, |
106 | 254 const(SCRIPT_ANALYSIS)* psa, |
0 | 255 SCRIPT_LOGATTR* psla); |
256 | |
257 HRESULT ScriptCPtoX( | |
258 int iCP, | |
259 BOOL fTrailing, | |
260 int cChars, | |
261 int cGlyphs, | |
106 | 262 const(WORD)* pwLogClust, |
263 const(SCRIPT_VISATTR)* psva, | |
264 const(int)* piAdvance, | |
265 const(SCRIPT_ANALYSIS)* psa, | |
0 | 266 int* piX); |
267 | |
268 HRESULT ScriptXtoCP( | |
269 int iX, | |
270 int cChars, | |
271 int cGlyphs, | |
106 | 272 const(WORD)* pwLogClust, |
273 const(SCRIPT_VISATTR)* psva, | |
274 const(int)* piAdvance, | |
275 const(SCRIPT_ANALYSIS)* psa, | |
0 | 276 int* piCP, |
277 int* piTrailing); | |
278 | |
279 HRESULT ScriptGetLogicalWidths( | |
106 | 280 const(SCRIPT_ANALYSIS)* psa, |
0 | 281 int cChars, |
282 int cGlyphs, | |
106 | 283 const(int)* piGlyphWidth, |
284 const(WORD)* pwLogClust, | |
285 const(SCRIPT_VISATTR)* psva, | |
0 | 286 int* piDx); |
287 | |
288 HRESULT ScriptApplyLogicalWidth( | |
106 | 289 const(int)* piDx, |
0 | 290 int cChars, |
291 int cGlyphs, | |
106 | 292 const(WORD)* pwLogClust, |
293 const(SCRIPT_VISATTR)* psva, | |
294 const(int)* piAdvance, | |
295 const(SCRIPT_ANALYSIS)* psa, | |
0 | 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, | |
106 | 306 const(WCHAR)* pwcInChars, |
0 | 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, | |
106 | 414 const(void)* pString, |
0 | 415 int cString, |
416 int cGlyphs, | |
417 int iCharset, | |
418 DWORD dwFlags, | |
419 int iReqWidth, | |
420 SCRIPT_CONTROL* psControl, | |
421 SCRIPT_STATE* psState, | |
106 | 422 const(int)* piDx, |
0 | 423 SCRIPT_TABDEF* pTabdef, |
106 | 424 const(BYTE)* pbInClass, |
0 | 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, | |
106 | 458 const(RECT)* prc, |
0 | 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( | |
106 | 470 const(WCHAR)* pwcInChars, |
0 | 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( | |
106 | 501 const(SCRIPT_DIGITSUBSTITUTE)* psds, |
0 | 502 SCRIPT_CONTROL* psc, |
503 SCRIPT_STATE* pss); | |
504 | |
505 |