Hex Artifact Content

Not logged in

Artifact cce453ef0465bd4e130cfa6e0d791e1bb03563b2:


0000: 2f 2a 20 55 53 50 20 2d 20 55 6e 69 63 6f 64 65  /* USP - Unicode
0010: 20 43 6f 6d 70 6c 65 78 20 53 63 72 69 70 74 20   Complex Script 
0020: 70 72 6f 63 65 73 73 6f 72 0d 0a 20 2a 20 68 74  processor.. * ht
0030: 74 70 3a 2f 2f 6d 73 64 6e 32 2e 6d 69 63 72 6f  tp://msdn2.micro
0040: 73 6f 66 74 2e 63 6f 6d 2f 6c 69 62 72 61 72 79  soft.com/library
0050: 2f 6d 73 37 37 36 34 38 38 20 2a 2f 0d 0a 0d 0a  /ms776488 */....
0060: 0d 0a 6d 6f 64 75 6c 65 20 77 69 6e 33 32 2e 75  ..module win32.u
0070: 73 70 31 30 3b 0d 0a 69 6d 70 6f 72 74 20 77 69  sp10;..import wi
0080: 6e 33 32 2e 77 69 6e 64 6f 77 73 3b 0d 0a 0d 0a  n32.windows;....
0090: 0d 0a 0d 0a 2f 2a 20 55 6e 69 73 63 72 69 62 65  ..../* Uniscribe
00a0: 20 45 6e 75 6d 65 72 61 74 69 6f 6e 20 54 79 70   Enumeration Typ
00b0: 65 73 0d 0a 20 2a 20 68 74 74 70 3a 2f 2f 6d 73  es.. * http://ms
00c0: 64 6e 32 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  dn2.microsoft.co
00d0: 6d 2f 6c 69 62 72 61 72 79 2f 6d 73 37 37 36 35  m/library/ms7765
00e0: 31 38 20 2a 2f 0d 0a 0d 0a 65 6e 75 6d 20 3a 20  18 */....enum : 
00f0: 57 4f 52 44 20 7b 0d 0a 09 53 43 52 49 50 54 5f  WORD {...SCRIPT_
0100: 55 4e 44 45 46 49 4e 45 44 20 3d 20 30 2c 0d 0a  UNDEFINED = 0,..
0110: 7d 0d 0a 0d 0a 65 6e 75 6d 20 3a 20 44 57 4f 52  }....enum : DWOR
0120: 44 20 7b 0d 0a 09 53 47 43 4d 5f 52 54 4c 20 3d  D {...SGCM_RTL =
0130: 20 30 78 30 30 30 30 30 30 30 31 2c 0d 0a 7d 0d   0x00000001,..}.
0140: 0a 0d 0a 65 6e 75 6d 20 3a 20 44 57 4f 52 44 20  ...enum : DWORD 
0150: 7b 0d 0a 09 53 53 41 5f 50 41 53 53 57 4f 52 44  {...SSA_PASSWORD
0160: 20 20 20 20 20 20 20 20 3d 20 30 78 30 30 30 30          = 0x0000
0170: 30 30 30 31 2c 0d 0a 09 53 53 41 5f 54 41 42 20  0001,...SSA_TAB 
0180: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
0190: 30 30 30 30 30 30 30 32 2c 0d 0a 09 53 53 41 5f  00000002,...SSA_
01a0: 43 4c 49 50 20 20 20 20 20 20 20 20 20 20 20 20  CLIP            
01b0: 3d 20 30 78 30 30 30 30 30 30 30 34 2c 0d 0a 09  = 0x00000004,...
01c0: 53 53 41 5f 46 49 54 20 20 20 20 20 20 20 20 20  SSA_FIT         
01d0: 20 20 20 20 3d 20 30 78 30 30 30 30 30 30 30 38      = 0x00000008
01e0: 2c 0d 0a 09 53 53 41 5f 44 5a 57 47 20 20 20 20  ,...SSA_DZWG    
01f0: 20 20 20 20 20 20 20 20 3d 20 30 78 30 30 30 30          = 0x0000
0200: 30 30 31 30 2c 0d 0a 09 53 53 41 5f 46 41 4c 4c  0010,...SSA_FALL
0210: 42 41 43 4b 20 20 20 20 20 20 20 20 3d 20 30 78  BACK        = 0x
0220: 30 30 30 30 30 30 32 30 2c 0d 0a 09 53 53 41 5f  00000020,...SSA_
0230: 42 52 45 41 4b 20 20 20 20 20 20 20 20 20 20 20  BREAK           
0240: 3d 20 30 78 30 30 30 30 30 30 34 30 2c 0d 0a 09  = 0x00000040,...
0250: 53 53 41 5f 47 4c 59 50 48 53 20 20 20 20 20 20  SSA_GLYPHS      
0260: 20 20 20 20 3d 20 30 78 30 30 30 30 30 30 38 30      = 0x00000080
0270: 2c 0d 0a 09 53 53 41 5f 52 54 4c 20 20 20 20 20  ,...SSA_RTL     
0280: 20 20 20 20 20 20 20 20 3d 20 30 78 30 30 30 30          = 0x0000
0290: 30 31 30 30 2c 0d 0a 09 53 53 41 5f 47 43 50 20  0100,...SSA_GCP 
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
02b0: 30 30 30 30 30 32 30 30 2c 0d 0a 09 53 53 41 5f  00000200,...SSA_
02c0: 48 4f 54 4b 45 59 20 20 20 20 20 20 20 20 20 20  HOTKEY          
02d0: 3d 20 30 78 30 30 30 30 30 34 30 30 2c 0d 0a 09  = 0x00000400,...
02e0: 53 53 41 5f 4d 45 54 41 46 49 4c 45 20 20 20 20  SSA_METAFILE    
02f0: 20 20 20 20 3d 20 30 78 30 30 30 30 30 38 30 30      = 0x00000800
0300: 2c 0d 0a 09 53 53 41 5f 4c 49 4e 4b 20 20 20 20  ,...SSA_LINK    
0310: 20 20 20 20 20 20 20 20 3d 20 30 78 30 30 30 30          = 0x0000
0320: 31 30 30 30 2c 0d 0a 09 53 53 41 5f 48 49 44 45  1000,...SSA_HIDE
0330: 48 4f 54 4b 45 59 20 20 20 20 20 20 3d 20 30 78  HOTKEY      = 0x
0340: 30 30 30 30 32 30 30 30 2c 0d 0a 09 53 53 41 5f  00002000,...SSA_
0350: 48 4f 54 4b 45 59 4f 4e 4c 59 20 20 20 20 20 20  HOTKEYONLY      
0360: 3d 20 30 78 30 30 30 30 32 34 30 30 2c 0d 0a 09  = 0x00002400,...
0370: 53 53 41 5f 46 55 4c 4c 4d 45 41 53 55 52 45 20  SSA_FULLMEASURE 
0380: 20 20 20 20 3d 20 30 78 30 34 30 30 30 30 30 30      = 0x04000000
0390: 2c 0d 0a 09 53 53 41 5f 4c 50 4b 41 4e 53 49 46  ,...SSA_LPKANSIF
03a0: 41 4c 4c 42 41 43 4b 20 3d 20 30 78 30 38 30 30  ALLBACK = 0x0800
03b0: 30 30 30 30 2c 0d 0a 09 53 53 41 5f 50 49 44 58  0000,...SSA_PIDX
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
03d0: 31 30 30 30 30 30 30 30 2c 0d 0a 09 53 53 41 5f  10000000,...SSA_
03e0: 4c 41 59 4f 55 54 52 54 4c 20 20 20 20 20 20 20  LAYOUTRTL       
03f0: 3d 20 30 78 32 30 30 30 30 30 30 30 2c 0d 0a 09  = 0x20000000,...
0400: 53 53 41 5f 44 4f 4e 54 47 4c 59 50 48 20 20 20  SSA_DONTGLYPH   
0410: 20 20 20 20 3d 20 30 78 34 30 30 30 30 30 30 30      = 0x40000000
0420: 2c 0d 0a 09 53 53 41 5f 4e 4f 4b 41 53 48 49 44  ,...SSA_NOKASHID
0430: 41 20 20 20 20 20 20 20 3d 20 30 78 38 30 30 30  A       = 0x8000
0440: 30 30 30 30 2c 0d 0a 7d 0d 0a 0d 0a 65 6e 75 6d  0000,..}....enum
0450: 20 3a 20 44 57 4f 52 44 20 7b 0d 0a 09 53 49 43   : DWORD {...SIC
0460: 5f 43 4f 4d 50 4c 45 58 20 20 20 20 3d 20 31 2c  _COMPLEX    = 1,
0470: 0d 0a 09 53 49 43 5f 41 53 43 49 49 44 49 47 49  ...SIC_ASCIIDIGI
0480: 54 20 3d 20 32 2c 0d 0a 09 53 49 43 5f 4e 45 55  T = 2,...SIC_NEU
0490: 54 52 41 4c 20 20 20 20 3d 20 34 2c 0d 0a 7d 0d  TRAL    = 4,..}.
04a0: 0a 0d 0a 65 6e 75 6d 20 3a 20 44 57 4f 52 44 20  ...enum : DWORD 
04b0: 7b 0d 0a 09 53 43 52 49 50 54 5f 44 49 47 49 54  {...SCRIPT_DIGIT
04c0: 53 55 42 53 54 49 54 55 54 45 5f 43 4f 4e 54 45  SUBSTITUTE_CONTE
04d0: 58 54 2c 0d 0a 09 53 43 52 49 50 54 5f 44 49 47  XT,...SCRIPT_DIG
04e0: 49 54 53 55 42 53 54 49 54 55 54 45 5f 4e 4f 4e  ITSUBSTITUTE_NON
04f0: 45 2c 0d 0a 09 53 43 52 49 50 54 5f 44 49 47 49  E,...SCRIPT_DIGI
0500: 54 53 55 42 53 54 49 54 55 54 45 5f 4e 41 54 49  TSUBSTITUTE_NATI
0510: 4f 4e 41 4c 2c 0d 0a 09 53 43 52 49 50 54 5f 44  ONAL,...SCRIPT_D
0520: 49 47 49 54 53 55 42 53 54 49 54 55 54 45 5f 54  IGITSUBSTITUTE_T
0530: 52 41 44 49 54 49 4f 4e 41 4c 2c 0d 0a 7d 0d 0a  RADITIONAL,..}..
0540: 0d 0a 65 6e 75 6d 20 53 43 52 49 50 54 5f 4a 55  ..enum SCRIPT_JU
0550: 53 54 49 46 59 20 3a 20 57 4f 52 44 20 7b 0d 0a  STIFY : WORD {..
0560: 20 20 20 20 53 43 52 49 50 54 5f 4a 55 53 54 49      SCRIPT_JUSTI
0570: 46 59 5f 4e 4f 4e 45 2c 0d 0a 20 20 20 20 53 43  FY_NONE,..    SC
0580: 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 41 52 41  RIPT_JUSTIFY_ARA
0590: 42 49 43 5f 42 4c 41 4e 4b 2c 0d 0a 20 20 20 20  BIC_BLANK,..    
05a0: 53 43 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 43  SCRIPT_JUSTIFY_C
05b0: 48 41 52 41 43 54 45 52 2c 0d 0a 20 20 20 20 53  HARACTER,..    S
05c0: 43 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 52 45  CRIPT_JUSTIFY_RE
05d0: 53 45 52 56 45 44 31 2c 0d 0a 20 20 20 20 53 43  SERVED1,..    SC
05e0: 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 42 4c 41  RIPT_JUSTIFY_BLA
05f0: 4e 4b 2c 0d 0a 20 20 20 20 53 43 52 49 50 54 5f  NK,..    SCRIPT_
0600: 4a 55 53 54 49 46 59 5f 52 45 53 45 52 56 45 44  JUSTIFY_RESERVED
0610: 32 2c 0d 0a 20 20 20 20 53 43 52 49 50 54 5f 4a  2,..    SCRIPT_J
0620: 55 53 54 49 46 59 5f 52 45 53 45 52 56 45 44 33  USTIFY_RESERVED3
0630: 2c 0d 0a 20 20 20 20 53 43 52 49 50 54 5f 4a 55  ,..    SCRIPT_JU
0640: 53 54 49 46 59 5f 41 52 41 42 49 43 5f 4e 4f 52  STIFY_ARABIC_NOR
0650: 4d 41 4c 2c 0d 0a 20 20 20 20 53 43 52 49 50 54  MAL,..    SCRIPT
0660: 5f 4a 55 53 54 49 46 59 5f 41 52 41 42 49 43 5f  _JUSTIFY_ARABIC_
0670: 4b 41 53 48 49 44 41 2c 0d 0a 20 20 20 20 53 43  KASHIDA,..    SC
0680: 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 41 52 41  RIPT_JUSTIFY_ARA
0690: 42 49 43 5f 41 4c 45 46 2c 0d 0a 20 20 20 20 53  BIC_ALEF,..    S
06a0: 43 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 41 52  CRIPT_JUSTIFY_AR
06b0: 41 42 49 43 5f 48 41 2c 0d 0a 20 20 20 20 53 43  ABIC_HA,..    SC
06c0: 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 41 52 41  RIPT_JUSTIFY_ARA
06d0: 42 49 43 5f 52 41 2c 0d 0a 20 20 20 20 53 43 52  BIC_RA,..    SCR
06e0: 49 50 54 5f 4a 55 53 54 49 46 59 5f 41 52 41 42  IPT_JUSTIFY_ARAB
06f0: 49 43 5f 42 41 2c 0d 0a 20 20 20 20 53 43 52 49  IC_BA,..    SCRI
0700: 50 54 5f 4a 55 53 54 49 46 59 5f 41 52 41 42 49  PT_JUSTIFY_ARABI
0710: 43 5f 42 41 52 41 2c 0d 0a 20 20 20 20 53 43 52  C_BARA,..    SCR
0720: 49 50 54 5f 4a 55 53 54 49 46 59 5f 41 52 41 42  IPT_JUSTIFY_ARAB
0730: 49 43 5f 53 45 45 4e 2c 0d 0a 20 20 20 20 53 43  IC_SEEN,..    SC
0740: 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 41 52 41  RIPT_JUSTIFY_ARA
0750: 42 49 43 5f 53 45 45 4e 5f 4d 2c 0d 0a 7d 0d 0a  BIC_SEEN_M,..}..
0760: 0d 0a 0d 0a 0d 0a 2f 2a 20 55 6e 69 73 63 72 69  ....../* Uniscri
0770: 62 65 20 53 74 72 75 63 74 75 72 65 73 0d 0a 20  be Structures.. 
0780: 2a 20 68 74 74 70 3a 2f 2f 6d 73 64 6e 32 2e 6d  * http://msdn2.m
0790: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6c 69 62  icrosoft.com/lib
07a0: 72 61 72 79 2f 6d 73 37 37 36 34 37 39 20 2a 2f  rary/ms776479 */
07b0: 0d 0a 0d 0a 61 6c 69 61 73 20 76 6f 69 64 2a 20  ....alias void* 
07c0: 53 43 52 49 50 54 5f 43 41 43 48 45 3b 0d 0a 61  SCRIPT_CACHE;..a
07d0: 6c 69 61 73 20 76 6f 69 64 2a 20 53 43 52 49 50  lias void* SCRIP
07e0: 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49  T_STRING_ANALYSI
07f0: 53 3b 0d 0a 0d 0a 65 78 74 65 72 6e 20 28 43 29  S;....extern (C)
0800: 0d 0a 7b 0d 0a 09 73 74 72 75 63 74 20 53 43 52  ..{...struct SCR
0810: 49 50 54 5f 43 4f 4e 54 52 4f 4c 0d 0a 09 7b 0d  IPT_CONTROL...{.
0820: 0a 09 09 70 72 69 76 61 74 65 20 44 57 4f 52 44  ...private DWORD
0830: 20 5f 62 69 74 66 69 65 6c 64 3b 0d 0a 09 09 44   _bitfield;....D
0840: 57 4f 52 44 20 75 44 65 66 61 75 6c 74 4c 61 6e  WORD uDefaultLan
0850: 67 75 61 67 65 28 29 20 20 20 20 20 20 20 20 20  guage()         
0860: 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62      { return (_b
0870: 69 74 66 69 65 6c 64 20 3e 3e 20 30 29 20 26 20  itfield >> 0) & 
0880: 30 78 46 46 46 46 3b 20 7d 0d 0a 09 09 44 57 4f  0xFFFF; }....DWO
0890: 52 44 20 75 44 65 66 61 75 6c 74 4c 61 6e 67 75  RD uDefaultLangu
08a0: 61 67 65 28 44 57 4f 52 44 20 76 61 6c 29 20 20  age(DWORD val)  
08b0: 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d 20    { _bitfield = 
08c0: 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69  cast(DWORD)((_bi
08d0: 74 66 69 65 6c 64 20 26 20 30 78 46 46 46 46 46  tfield & 0xFFFFF
08e0: 46 46 46 46 46 46 46 30 30 30 30 29 20 7c 20 28  FFFFFFF0000) | (
08f0: 76 61 6c 20 3c 3c 20 30 29 29 3b 20 72 65 74 75  val << 0)); retu
0900: 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 44 57 4f  rn val; }....DWO
0910: 52 44 20 66 43 6f 6e 74 65 78 74 44 69 67 69 74  RD fContextDigit
0920: 73 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  s()             
0930: 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74    { return (_bit
0940: 66 69 65 6c 64 20 3e 3e 20 31 36 29 20 26 20 30  field >> 16) & 0
0950: 78 31 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66  x1; }....DWORD f
0960: 43 6f 6e 74 65 78 74 44 69 67 69 74 73 28 44 57  ContextDigits(DW
0970: 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20 7b 20  ORD val)      { 
0980: 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74  _bitfield = cast
0990: 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  (DWORD)((_bitfie
09a0: 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46  ld & 0xFFFFFFFFF
09b0: 46 46 45 46 46 46 46 29 20 7c 20 28 76 61 6c 20  FFEFFFF) | (val 
09c0: 3c 3c 20 31 36 29 29 3b 20 72 65 74 75 72 6e 20  << 16)); return 
09d0: 76 61 6c 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20  val; }....DWORD 
09e0: 66 49 6e 76 65 72 74 50 72 65 42 6f 75 6e 64 44  fInvertPreBoundD
09f0: 69 72 28 29 20 20 20 20 20 20 20 20 20 20 20 7b  ir()           {
0a00: 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65   return (_bitfie
0a10: 6c 64 20 3e 3e 20 31 37 29 20 26 20 30 78 31 3b  ld >> 17) & 0x1;
0a20: 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 49 6e 76   }....DWORD fInv
0a30: 65 72 74 50 72 65 42 6f 75 6e 64 44 69 72 28 44  ertPreBoundDir(D
0a40: 57 4f 52 44 20 76 61 6c 29 20 20 7b 20 5f 62 69  WORD val)  { _bi
0a50: 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28 44 57  tfield = cast(DW
0a60: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
0a70: 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46 44  & 0xFFFFFFFFFFFD
0a80: 46 46 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20  FFFF) | (val << 
0a90: 31 37 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c  17)); return val
0aa0: 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 49 6e  ; }....DWORD fIn
0ab0: 76 65 72 74 50 6f 73 74 42 6f 75 6e 64 44 69 72  vertPostBoundDir
0ac0: 28 29 20 20 20 20 20 20 20 20 20 20 7b 20 72 65  ()          { re
0ad0: 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 20  turn (_bitfield 
0ae0: 3e 3e 20 31 38 29 20 26 20 30 78 31 3b 20 7d 0d  >> 18) & 0x1; }.
0af0: 0a 09 09 44 57 4f 52 44 20 66 49 6e 76 65 72 74  ...DWORD fInvert
0b00: 50 6f 73 74 42 6f 75 6e 64 44 69 72 28 44 57 4f  PostBoundDir(DWO
0b10: 52 44 20 76 61 6c 29 20 7b 20 5f 62 69 74 66 69  RD val) { _bitfi
0b20: 65 6c 64 20 3d 20 63 61 73 74 28 44 57 4f 52 44  eld = cast(DWORD
0b30: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
0b40: 78 46 46 46 46 46 46 46 46 46 46 46 42 46 46 46  xFFFFFFFFFFFBFFF
0b50: 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 38 29  F) | (val << 18)
0b60: 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d  ); return val; }
0b70: 0d 0a 09 09 44 57 4f 52 44 20 66 4c 69 6e 6b 53  ....DWORD fLinkS
0b80: 74 72 69 6e 67 42 65 66 6f 72 65 28 29 20 20 20  tringBefore()   
0b90: 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72           { retur
0ba0: 6e 20 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20  n (_bitfield >> 
0bb0: 31 39 29 20 26 20 30 78 31 3b 20 7d 0d 0a 09 09  19) & 0x1; }....
0bc0: 44 57 4f 52 44 20 66 4c 69 6e 6b 53 74 72 69 6e  DWORD fLinkStrin
0bd0: 67 42 65 66 6f 72 65 28 44 57 4f 52 44 20 76 61  gBefore(DWORD va
0be0: 6c 29 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64  l)   { _bitfield
0bf0: 20 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28 28   = cast(DWORD)((
0c00: 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46  _bitfield & 0xFF
0c10: 46 46 46 46 46 46 46 46 46 37 46 46 46 46 29 20  FFFFFFFFF7FFFF) 
0c20: 7c 20 28 76 61 6c 20 3c 3c 20 31 39 29 29 3b 20  | (val << 19)); 
0c30: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
0c40: 09 44 57 4f 52 44 20 66 4c 69 6e 6b 53 74 72 69  .DWORD fLinkStri
0c50: 6e 67 41 66 74 65 72 28 29 20 20 20 20 20 20 20  ngAfter()       
0c60: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28        { return (
0c70: 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 32 30 29  _bitfield >> 20)
0c80: 20 26 20 30 78 31 3b 20 7d 0d 0a 09 09 44 57 4f   & 0x1; }....DWO
0c90: 52 44 20 66 4c 69 6e 6b 53 74 72 69 6e 67 41 66  RD fLinkStringAf
0ca0: 74 65 72 28 44 57 4f 52 44 20 76 61 6c 29 20 20  ter(DWORD val)  
0cb0: 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d 20    { _bitfield = 
0cc0: 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69  cast(DWORD)((_bi
0cd0: 74 66 69 65 6c 64 20 26 20 30 78 46 46 46 46 46  tfield & 0xFFFFF
0ce0: 46 46 46 46 46 45 46 46 46 46 46 29 20 7c 20 28  FFFFFEFFFFF) | (
0cf0: 76 61 6c 20 3c 3c 20 32 30 29 29 3b 20 72 65 74  val << 20)); ret
0d00: 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 44 57  urn val; }....DW
0d10: 4f 52 44 20 66 4e 65 75 74 72 61 6c 4f 76 65 72  ORD fNeutralOver
0d20: 72 69 64 65 28 29 20 20 20 20 20 20 20 20 20 20  ride()          
0d30: 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69     { return (_bi
0d40: 74 66 69 65 6c 64 20 3e 3e 20 32 31 29 20 26 20  tfield >> 21) & 
0d50: 30 78 31 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20  0x1; }....DWORD 
0d60: 66 4e 65 75 74 72 61 6c 4f 76 65 72 72 69 64 65  fNeutralOverride
0d70: 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20 7b  (DWORD val)    {
0d80: 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73   _bitfield = cas
0d90: 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69  t(DWORD)((_bitfi
0da0: 65 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46  eld & 0xFFFFFFFF
0db0: 46 46 44 46 46 46 46 46 29 20 7c 20 28 76 61 6c  FFDFFFFF) | (val
0dc0: 20 3c 3c 20 32 31 29 29 3b 20 72 65 74 75 72 6e   << 21)); return
0dd0: 20 76 61 6c 3b 20 7d 0d 0a 09 09 44 57 4f 52 44   val; }....DWORD
0de0: 20 66 4e 75 6d 65 72 69 63 4f 76 65 72 72 69 64   fNumericOverrid
0df0: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  e()             
0e00: 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69  { return (_bitfi
0e10: 65 6c 64 20 3e 3e 20 32 32 29 20 26 20 30 78 31  eld >> 22) & 0x1
0e20: 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 4e 75  ; }....DWORD fNu
0e30: 6d 65 72 69 63 4f 76 65 72 72 69 64 65 28 44 57  mericOverride(DW
0e40: 4f 52 44 20 76 61 6c 29 20 20 20 20 7b 20 5f 62  ORD val)    { _b
0e50: 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28 44  itfield = cast(D
0e60: 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64  WORD)((_bitfield
0e70: 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46 42   & 0xFFFFFFFFFFB
0e80: 46 46 46 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c  FFFFF) | (val <<
0e90: 20 32 32 29 29 3b 20 72 65 74 75 72 6e 20 76 61   22)); return va
0ea0: 6c 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 4c  l; }....DWORD fL
0eb0: 65 67 61 63 79 42 69 64 69 43 6c 61 73 73 28 29  egacyBidiClass()
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72               { r
0ed0: 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64  eturn (_bitfield
0ee0: 20 3e 3e 20 32 33 29 20 26 20 30 78 31 3b 20 7d   >> 23) & 0x1; }
0ef0: 0d 0a 09 09 44 57 4f 52 44 20 66 4c 65 67 61 63  ....DWORD fLegac
0f00: 79 42 69 64 69 43 6c 61 73 73 28 44 57 4f 52 44  yBidiClass(DWORD
0f10: 20 76 61 6c 29 20 20 20 20 7b 20 5f 62 69 74 66   val)    { _bitf
0f20: 69 65 6c 64 20 3d 20 63 61 73 74 28 44 57 4f 52  ield = cast(DWOR
0f30: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20  D)((_bitfield & 
0f40: 30 78 46 46 46 46 46 46 46 46 46 46 37 46 46 46  0xFFFFFFFFFF7FFF
0f50: 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 32 33  FF) | (val << 23
0f60: 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20  )); return val; 
0f70: 7d 0d 0a 09 09 44 57 4f 52 44 20 66 52 65 73 65  }....DWORD fRese
0f80: 72 76 65 64 28 29 20 20 20 20 20 20 20 20 20 20  rved()          
0f90: 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75            { retu
0fa0: 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e  rn (_bitfield >>
0fb0: 20 32 34 29 20 26 20 30 78 46 46 3b 20 7d 0d 0a   24) & 0xFF; }..
0fc0: 09 09 44 57 4f 52 44 20 66 52 65 73 65 72 76 65  ..DWORD fReserve
0fd0: 64 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20  d(DWORD val)    
0fe0: 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65         { _bitfie
0ff0: 6c 64 20 3d 20 63 61 73 74 28 44 57 4f 52 44 29  ld = cast(DWORD)
1000: 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78  ((_bitfield & 0x
1010: 46 46 46 46 46 46 46 46 30 30 46 46 46 46 46 46  FFFFFFFF00FFFFFF
1020: 29 20 7c 20 28 76 61 6c 20 3c 3c 20 32 34 29 29  ) | (val << 24))
1030: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d  ; return val; }.
1040: 0a 09 7d 0d 0a 0d 0a 09 73 74 72 75 63 74 20 53  ..}.....struct S
1050: 43 52 49 50 54 5f 53 54 41 54 45 0d 0a 09 7b 0d  CRIPT_STATE...{.
1060: 0a 09 09 70 72 69 76 61 74 65 20 57 4f 52 44 20  ...private WORD 
1070: 5f 62 69 74 66 69 65 6c 64 3b 0d 0a 09 09 57 4f  _bitfield;....WO
1080: 52 44 20 75 42 69 64 69 4c 65 76 65 6c 28 29 20  RD uBidiLevel() 
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a0: 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f  { return cast(WO
10b0: 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e  RD)((_bitfield >
10c0: 3e 20 30 29 20 26 20 30 78 31 46 29 3b 20 7d 0d  > 0) & 0x1F); }.
10d0: 0a 09 09 57 4f 52 44 20 75 42 69 64 69 4c 65 76  ...WORD uBidiLev
10e0: 65 6c 28 57 4f 52 44 20 76 61 6c 29 20 20 20 20  el(WORD val)    
10f0: 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64       { _bitfield
1100: 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f   = cast(WORD)((_
1110: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
1120: 46 46 46 46 46 46 46 46 46 46 46 45 30 29 20 7c  FFFFFFFFFFFE0) |
1130: 20 28 76 61 6c 20 3c 3c 20 30 29 29 3b 20 72 65   (val << 0)); re
1140: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 57  turn val; }....W
1150: 4f 52 44 20 66 4f 76 65 72 72 69 64 65 44 69 72  ORD fOverrideDir
1160: 65 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20  ection()        
1170: 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57   { return cast(W
1180: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
1190: 3e 3e 20 35 29 20 26 20 30 78 31 29 3b 20 7d 0d  >> 5) & 0x1); }.
11a0: 0a 09 09 57 4f 52 44 20 66 4f 76 65 72 72 69 64  ...WORD fOverrid
11b0: 65 44 69 72 65 63 74 69 6f 6e 28 57 4f 52 44 20  eDirection(WORD 
11c0: 76 61 6c 29 20 7b 20 5f 62 69 74 66 69 65 6c 64  val) { _bitfield
11d0: 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f   = cast(WORD)((_
11e0: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
11f0: 46 46 46 46 46 46 46 46 46 46 46 44 46 29 20 7c  FFFFFFFFFFFDF) |
1200: 20 28 76 61 6c 20 3c 3c 20 35 29 29 3b 20 72 65   (val << 5)); re
1210: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 57  turn val; }....W
1220: 4f 52 44 20 66 49 6e 68 69 62 69 74 53 79 6d 53  ORD fInhibitSymS
1230: 77 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20  wap()           
1240: 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57   { return cast(W
1250: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
1260: 3e 3e 20 36 29 20 26 20 30 78 31 29 3b 20 7d 0d  >> 6) & 0x1); }.
1270: 0a 09 09 57 4f 52 44 20 66 49 6e 68 69 62 69 74  ...WORD fInhibit
1280: 53 79 6d 53 77 61 70 28 57 4f 52 44 20 76 61 6c  SymSwap(WORD val
1290: 29 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64  )    { _bitfield
12a0: 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f   = cast(WORD)((_
12b0: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
12c0: 46 46 46 46 46 46 46 46 46 46 46 42 46 29 20 7c  FFFFFFFFFFFBF) |
12d0: 20 28 76 61 6c 20 3c 3c 20 36 29 29 3b 20 72 65   (val << 6)); re
12e0: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 57  turn val; }....W
12f0: 4f 52 44 20 66 43 68 61 72 53 68 61 70 65 28 29  ORD fCharShape()
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57   { return cast(W
1320: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
1330: 3e 3e 20 37 29 20 26 20 30 78 31 29 3b 20 7d 0d  >> 7) & 0x1); }.
1340: 0a 09 09 57 4f 52 44 20 66 43 68 61 72 53 68 61  ...WORD fCharSha
1350: 70 65 28 57 4f 52 44 20 76 61 6c 29 20 20 20 20  pe(WORD val)    
1360: 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64       { _bitfield
1370: 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f   = cast(WORD)((_
1380: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
1390: 46 46 46 46 46 46 46 46 46 46 46 37 46 29 20 7c  FFFFFFFFFFF7F) |
13a0: 20 28 76 61 6c 20 3c 3c 20 37 29 29 3b 20 72 65   (val << 7)); re
13b0: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 57  turn val; }....W
13c0: 4f 52 44 20 66 44 69 67 69 74 53 75 62 73 74 69  ORD fDigitSubsti
13d0: 74 75 74 65 28 29 20 20 20 20 20 20 20 20 20 20  tute()          
13e0: 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57   { return cast(W
13f0: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
1400: 3e 3e 20 38 29 20 26 20 30 78 31 29 3b 20 7d 0d  >> 8) & 0x1); }.
1410: 0a 09 09 57 4f 52 44 20 66 44 69 67 69 74 53 75  ...WORD fDigitSu
1420: 62 73 74 69 74 75 74 65 28 57 4f 52 44 20 76 61  bstitute(WORD va
1430: 6c 29 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64  l)   { _bitfield
1440: 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f   = cast(WORD)((_
1450: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
1460: 46 46 46 46 46 46 46 46 46 46 45 46 46 29 20 7c  FFFFFFFFFFEFF) |
1470: 20 28 76 61 6c 20 3c 3c 20 38 29 29 3b 20 72 65   (val << 8)); re
1480: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 57  turn val; }....W
1490: 4f 52 44 20 66 49 6e 68 69 62 69 74 4c 69 67 61  ORD fInhibitLiga
14a0: 74 65 28 29 20 20 20 20 20 20 20 20 20 20 20 20  te()            
14b0: 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57   { return cast(W
14c0: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
14d0: 3e 3e 20 39 29 20 26 20 30 78 31 29 3b 20 7d 0d  >> 9) & 0x1); }.
14e0: 0a 09 09 57 4f 52 44 20 66 49 6e 68 69 62 69 74  ...WORD fInhibit
14f0: 4c 69 67 61 74 65 28 57 4f 52 44 20 76 61 6c 29  Ligate(WORD val)
1500: 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64       { _bitfield
1510: 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f   = cast(WORD)((_
1520: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
1530: 46 46 46 46 46 46 46 46 46 46 44 46 46 29 20 7c  FFFFFFFFFFDFF) |
1540: 20 28 76 61 6c 20 3c 3c 20 39 29 29 3b 20 72 65   (val << 9)); re
1550: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 57  turn val; }....W
1560: 4f 52 44 20 66 44 69 73 70 6c 61 79 5a 57 47 28  ORD fDisplayZWG(
1570: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1580: 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57   { return cast(W
1590: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
15a0: 3e 3e 20 31 30 29 20 26 20 30 78 31 29 3b 20 7d  >> 10) & 0x1); }
15b0: 0d 0a 09 09 57 4f 52 44 20 66 44 69 73 70 6c 61  ....WORD fDispla
15c0: 79 5a 57 47 28 57 4f 52 44 20 76 61 6c 29 20 20  yZWG(WORD val)  
15d0: 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c        { _bitfiel
15e0: 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28  d = cast(WORD)((
15f0: 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46  _bitfield & 0xFF
1600: 46 46 46 46 46 46 46 46 46 46 46 42 46 46 29 20  FFFFFFFFFFFBFF) 
1610: 7c 20 28 76 61 6c 20 3c 3c 20 31 30 29 29 3b 20  | (val << 10)); 
1620: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
1630: 09 57 4f 52 44 20 66 41 72 61 62 69 63 4e 75 6d  .WORD fArabicNum
1640: 43 6f 6e 74 65 78 74 28 29 20 20 20 20 20 20 20  Context()       
1650: 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74     { return cast
1660: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1670: 64 20 3e 3e 20 31 31 29 20 26 20 30 78 31 29 3b  d >> 11) & 0x1);
1680: 20 7d 0d 0a 09 09 57 4f 52 44 20 66 41 72 61 62   }....WORD fArab
1690: 69 63 4e 75 6d 43 6f 6e 74 65 78 74 28 57 4f 52  icNumContext(WOR
16a0: 44 20 76 61 6c 29 20 20 7b 20 5f 62 69 74 66 69  D val)  { _bitfi
16b0: 65 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29  eld = cast(WORD)
16c0: 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78  ((_bitfield & 0x
16d0: 46 46 46 46 46 46 46 46 46 46 46 46 46 37 46 46  FFFFFFFFFFFFF7FF
16e0: 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 31 29 29  ) | (val << 11))
16f0: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d  ; return val; }.
1700: 0a 09 09 57 4f 52 44 20 66 47 63 70 43 6c 75 73  ...WORD fGcpClus
1710: 74 65 72 73 28 29 20 20 20 20 20 20 20 20 20 20  ters()          
1720: 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61       { return ca
1730: 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69  st(WORD)((_bitfi
1740: 65 6c 64 20 3e 3e 20 31 32 29 20 26 20 30 78 31  eld >> 12) & 0x1
1750: 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 47 63  ); }....WORD fGc
1760: 70 43 6c 75 73 74 65 72 73 28 57 4f 52 44 20 76  pClusters(WORD v
1770: 61 6c 29 20 20 20 20 20 20 20 7b 20 5f 62 69 74  al)       { _bit
1780: 66 69 65 6c 64 20 3d 20 63 61 73 74 28 57 4f 52  field = cast(WOR
1790: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20  D)((_bitfield & 
17a0: 30 78 46 46 46 46 46 46 46 46 46 46 46 46 45 46  0xFFFFFFFFFFFFEF
17b0: 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 32  FF) | (val << 12
17c0: 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20  )); return val; 
17d0: 7d 0d 0a 09 09 57 4f 52 44 20 66 52 65 73 65 72  }....WORD fReser
17e0: 76 65 64 28 29 20 20 20 20 20 20 20 20 20 20 20  ved()           
17f0: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
1800: 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74  cast(WORD)((_bit
1810: 66 69 65 6c 64 20 3e 3e 20 31 33 29 20 26 20 30  field >> 13) & 0
1820: 78 31 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66  x1); }....WORD f
1830: 52 65 73 65 72 76 65 64 28 57 4f 52 44 20 76 61  Reserved(WORD va
1840: 6c 29 20 20 20 20 20 20 20 20 20 20 7b 20 5f 62  l)          { _b
1850: 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28 57  itfield = cast(W
1860: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
1870: 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46 46  & 0xFFFFFFFFFFFF
1880: 44 46 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20  DFFF) | (val << 
1890: 31 33 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c  13)); return val
18a0: 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 45 6e 67  ; }....WORD fEng
18b0: 69 6e 65 52 65 73 65 72 76 65 64 28 29 20 20 20  ineReserved()   
18c0: 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72           { retur
18d0: 6e 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62  n cast(WORD)((_b
18e0: 69 74 66 69 65 6c 64 20 3e 3e 20 31 34 29 20 26  itfield >> 14) &
18f0: 20 30 78 33 29 3b 20 7d 0d 0a 09 09 57 4f 52 44   0x3); }....WORD
1900: 20 66 45 6e 67 69 6e 65 52 65 73 65 72 76 65 64   fEngineReserved
1910: 28 57 4f 52 44 20 76 61 6c 29 20 20 20 20 7b 20  (WORD val)    { 
1920: 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74  _bitfield = cast
1930: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1940: 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  d & 0xFFFFFFFFFF
1950: 46 46 33 46 46 46 29 20 7c 20 28 76 61 6c 20 3c  FF3FFF) | (val <
1960: 3c 20 31 34 29 29 3b 20 72 65 74 75 72 6e 20 76  < 14)); return v
1970: 61 6c 3b 20 7d 0d 0a 09 7d 0d 0a 0d 0a 0d 0a 09  al; }...}.......
1980: 73 74 72 75 63 74 20 53 43 52 49 50 54 5f 41 4e  struct SCRIPT_AN
1990: 41 4c 59 53 49 53 0d 0a 09 7b 0d 0a 09 09 70 72  ALYSIS...{....pr
19a0: 69 76 61 74 65 20 57 4f 52 44 20 5f 62 69 74 66  ivate WORD _bitf
19b0: 69 65 6c 64 3b 0d 0a 09 09 57 4f 52 44 20 65 53  ield;....WORD eS
19c0: 63 72 69 70 74 28 29 20 20 20 20 20 20 20 20 20  cript()         
19d0: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63        { return c
19e0: 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66  ast(WORD)((_bitf
19f0: 69 65 6c 64 20 3e 3e 20 30 29 20 26 20 30 78 33  ield >> 0) & 0x3
1a00: 46 46 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 65  FF); }....WORD e
1a10: 53 63 72 69 70 74 28 57 4f 52 44 20 76 61 6c 29  Script(WORD val)
1a20: 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65         { _bitfie
1a30: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
1a40: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
1a50: 46 46 46 46 46 46 46 46 46 46 46 46 43 30 30 29  FFFFFFFFFFFFC00)
1a60: 20 7c 20 28 76 61 6c 20 3c 3c 20 30 29 29 3b 20   | (val << 0)); 
1a70: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
1a80: 09 57 4f 52 44 20 66 52 54 4c 28 29 20 20 20 20  .WORD fRTL()    
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
1aa0: 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44  return cast(WORD
1ab0: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20  )((_bitfield >> 
1ac0: 31 30 29 20 26 20 30 78 31 29 3b 20 7d 0d 0a 09  10) & 0x1); }...
1ad0: 09 57 4f 52 44 20 66 52 54 4c 28 57 4f 52 44 20  .WORD fRTL(WORD 
1ae0: 76 61 6c 29 20 20 20 20 20 20 20 20 20 20 7b 20  val)          { 
1af0: 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74  _bitfield = cast
1b00: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1b10: 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  d & 0xFFFFFFFFFF
1b20: 46 46 46 42 46 46 29 20 7c 20 28 76 61 6c 20 3c  FFFBFF) | (val <
1b30: 3c 20 31 30 29 29 3b 20 72 65 74 75 72 6e 20 76  < 10)); return v
1b40: 61 6c 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 4c  al; }....WORD fL
1b50: 61 79 6f 75 74 52 54 4c 28 29 20 20 20 20 20 20  ayoutRTL()      
1b60: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63        { return c
1b70: 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66  ast(WORD)((_bitf
1b80: 69 65 6c 64 20 3e 3e 20 31 31 29 20 26 20 30 78  ield >> 11) & 0x
1b90: 31 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 4c  1); }....WORD fL
1ba0: 61 79 6f 75 74 52 54 4c 28 57 4f 52 44 20 76 61  ayoutRTL(WORD va
1bb0: 6c 29 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c  l)    { _bitfiel
1bc0: 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28  d = cast(WORD)((
1bd0: 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46  _bitfield & 0xFF
1be0: 46 46 46 46 46 46 46 46 46 46 46 37 46 46 29 20  FFFFFFFFFFF7FF) 
1bf0: 7c 20 28 76 61 6c 20 3c 3c 20 31 31 29 29 3b 20  | (val << 11)); 
1c00: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
1c10: 09 57 4f 52 44 20 66 4c 69 6e 6b 42 65 66 6f 72  .WORD fLinkBefor
1c20: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 7b 20  e()           { 
1c30: 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44  return cast(WORD
1c40: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20  )((_bitfield >> 
1c50: 31 32 29 20 26 20 30 78 31 29 3b 20 7d 0d 0a 09  12) & 0x1); }...
1c60: 09 57 4f 52 44 20 66 4c 69 6e 6b 42 65 66 6f 72  .WORD fLinkBefor
1c70: 65 28 57 4f 52 44 20 76 61 6c 29 20 20 20 7b 20  e(WORD val)   { 
1c80: 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74  _bitfield = cast
1c90: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1ca0: 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  d & 0xFFFFFFFFFF
1cb0: 46 46 45 46 46 46 29 20 7c 20 28 76 61 6c 20 3c  FFEFFF) | (val <
1cc0: 3c 20 31 32 29 29 3b 20 72 65 74 75 72 6e 20 76  < 12)); return v
1cd0: 61 6c 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 4c  al; }....WORD fL
1ce0: 69 6e 6b 41 66 74 65 72 28 29 20 20 20 20 20 20  inkAfter()      
1cf0: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63        { return c
1d00: 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66  ast(WORD)((_bitf
1d10: 69 65 6c 64 20 3e 3e 20 31 33 29 20 26 20 30 78  ield >> 13) & 0x
1d20: 31 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 4c  1); }....WORD fL
1d30: 69 6e 6b 41 66 74 65 72 28 57 4f 52 44 20 76 61  inkAfter(WORD va
1d40: 6c 29 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c  l)    { _bitfiel
1d50: 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28  d = cast(WORD)((
1d60: 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46  _bitfield & 0xFF
1d70: 46 46 46 46 46 46 46 46 46 46 44 46 46 46 29 20  FFFFFFFFFFDFFF) 
1d80: 7c 20 28 76 61 6c 20 3c 3c 20 31 33 29 29 3b 20  | (val << 13)); 
1d90: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
1da0: 09 57 4f 52 44 20 66 4c 6f 67 69 63 61 6c 4f 72  .WORD fLogicalOr
1db0: 64 65 72 28 29 20 20 20 20 20 20 20 20 20 7b 20  der()         { 
1dc0: 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44  return cast(WORD
1dd0: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20  )((_bitfield >> 
1de0: 31 34 29 20 26 20 30 78 31 29 3b 20 7d 0d 0a 09  14) & 0x1); }...
1df0: 09 57 4f 52 44 20 66 4c 6f 67 69 63 61 6c 4f 72  .WORD fLogicalOr
1e00: 64 65 72 28 57 4f 52 44 20 76 61 6c 29 20 7b 20  der(WORD val) { 
1e10: 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74  _bitfield = cast
1e20: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1e30: 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  d & 0xFFFFFFFFFF
1e40: 46 46 42 46 46 46 29 20 7c 20 28 76 61 6c 20 3c  FFBFFF) | (val <
1e50: 3c 20 31 34 29 29 3b 20 72 65 74 75 72 6e 20 76  < 14)); return v
1e60: 61 6c 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 4e  al; }....WORD fN
1e70: 6f 47 6c 79 70 68 49 6e 64 65 78 28 29 20 20 20  oGlyphIndex()   
1e80: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63        { return c
1e90: 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66  ast(WORD)((_bitf
1ea0: 69 65 6c 64 20 3e 3e 20 31 35 29 20 26 20 30 78  ield >> 15) & 0x
1eb0: 31 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 4e  1); }....WORD fN
1ec0: 6f 47 6c 79 70 68 49 6e 64 65 78 28 57 4f 52 44  oGlyphIndex(WORD
1ed0: 20 76 61 6c 29 20 7b 20 5f 62 69 74 66 69 65 6c   val) { _bitfiel
1ee0: 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28  d = cast(WORD)((
1ef0: 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46  _bitfield & 0xFF
1f00: 46 46 46 46 46 46 46 46 46 46 37 46 46 46 29 20  FFFFFFFFFF7FFF) 
1f10: 7c 20 28 76 61 6c 20 3c 3c 20 31 35 29 29 3b 20  | (val << 15)); 
1f20: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
1f30: 09 53 43 52 49 50 54 5f 53 54 41 54 45 20 73 3b  .SCRIPT_STATE s;
1f40: 0d 0a 09 7d 0d 0a 0d 0a 0d 0a 09 73 74 72 75 63  ...}.......struc
1f50: 74 20 53 43 52 49 50 54 5f 49 54 45 4d 0d 0a 09  t SCRIPT_ITEM...
1f60: 7b 0d 0a 09 09 69 6e 74 20 69 43 68 61 72 50 6f  {....int iCharPo
1f70: 73 3b 0d 0a 09 09 53 43 52 49 50 54 5f 41 4e 41  s;....SCRIPT_ANA
1f80: 4c 59 53 49 53 20 61 3b 0d 0a 09 7d 0d 0a 0d 0a  LYSIS a;...}....
1f90: 09 73 74 72 75 63 74 20 53 43 52 49 50 54 5f 56  .struct SCRIPT_V
1fa0: 49 53 41 54 54 52 0d 0a 09 7b 0d 0a 09 09 70 72  ISATTR...{....pr
1fb0: 69 76 61 74 65 20 57 4f 52 44 20 5f 62 69 74 66  ivate WORD _bitf
1fc0: 69 65 6c 64 3b 0d 0a 09 09 57 4f 52 44 20 75 4a  ield;....WORD uJ
1fd0: 75 73 74 69 66 69 63 61 74 69 6f 6e 28 29 20 20  ustification()  
1fe0: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
1ff0: 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74  cast(WORD)((_bit
2000: 66 69 65 6c 64 20 3e 3e 20 30 29 20 26 20 30 78  field >> 0) & 0x
2010: 46 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 75 4a  F); }....WORD uJ
2020: 75 73 74 69 66 69 63 61 74 69 6f 6e 28 57 4f 52  ustification(WOR
2030: 44 20 76 61 6c 29 20 7b 20 5f 62 69 74 66 69 65  D val) { _bitfie
2040: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
2050: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
2060: 46 46 46 46 46 46 46 46 46 46 46 46 46 46 30 29  FFFFFFFFFFFFFF0)
2070: 20 7c 20 28 76 61 6c 20 3c 3c 20 30 29 29 3b 20   | (val << 0)); 
2080: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
2090: 09 57 4f 52 44 20 66 43 6c 75 73 74 65 72 53 74  .WORD fClusterSt
20a0: 61 72 74 28 29 20 20 20 20 20 20 20 20 20 20 7b  art()          {
20b0: 20 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52   return cast(WOR
20c0: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e  D)((_bitfield >>
20d0: 20 34 29 20 26 20 30 78 31 29 3b 20 7d 0d 0a 09   4) & 0x1); }...
20e0: 09 57 4f 52 44 20 66 43 6c 75 73 74 65 72 53 74  .WORD fClusterSt
20f0: 61 72 74 28 57 4f 52 44 20 76 61 6c 29 20 20 7b  art(WORD val)  {
2100: 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73   _bitfield = cas
2110: 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  t(WORD)((_bitfie
2120: 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46  ld & 0xFFFFFFFFF
2130: 46 46 46 46 46 45 46 29 20 7c 20 28 76 61 6c 20  FFFFFEF) | (val 
2140: 3c 3c 20 34 29 29 3b 20 72 65 74 75 72 6e 20 76  << 4)); return v
2150: 61 6c 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 44  al; }....WORD fD
2160: 69 61 63 72 69 74 69 63 28 29 20 20 20 20 20 20  iacritic()      
2170: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
2180: 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74  cast(WORD)((_bit
2190: 66 69 65 6c 64 20 3e 3e 20 35 29 20 26 20 30 78  field >> 5) & 0x
21a0: 31 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 44  1); }....WORD fD
21b0: 69 61 63 72 69 74 69 63 28 57 4f 52 44 20 76 61  iacritic(WORD va
21c0: 6c 29 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65  l)     { _bitfie
21d0: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
21e0: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
21f0: 46 46 46 46 46 46 46 46 46 46 46 46 46 44 46 29  FFFFFFFFFFFFFDF)
2200: 20 7c 20 28 76 61 6c 20 3c 3c 20 35 29 29 3b 20   | (val << 5)); 
2210: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
2220: 09 57 4f 52 44 20 66 5a 65 72 6f 57 69 64 74 68  .WORD fZeroWidth
2230: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ()             {
2240: 20 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52   return cast(WOR
2250: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e  D)((_bitfield >>
2260: 20 36 29 20 26 20 30 78 31 29 3b 20 7d 0d 0a 09   6) & 0x1); }...
2270: 09 57 4f 52 44 20 66 5a 65 72 6f 57 69 64 74 68  .WORD fZeroWidth
2280: 28 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 7b  (WORD val)     {
2290: 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73   _bitfield = cas
22a0: 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  t(WORD)((_bitfie
22b0: 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46  ld & 0xFFFFFFFFF
22c0: 46 46 46 46 46 42 46 29 20 7c 20 28 76 61 6c 20  FFFFFBF) | (val 
22d0: 3c 3c 20 36 29 29 3b 20 72 65 74 75 72 6e 20 76  << 6)); return v
22e0: 61 6c 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 52  al; }....WORD fR
22f0: 65 73 65 72 76 65 64 28 29 20 20 20 20 20 20 20  eserved()       
2300: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
2310: 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74  cast(WORD)((_bit
2320: 66 69 65 6c 64 20 3e 3e 20 37 29 20 26 20 30 78  field >> 7) & 0x
2330: 31 29 3b 20 7d 0d 0a 09 09 57 4f 52 44 20 66 52  1); }....WORD fR
2340: 65 73 65 72 76 65 64 28 57 4f 52 44 20 76 61 6c  eserved(WORD val
2350: 29 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65  )      { _bitfie
2360: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
2370: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
2380: 46 46 46 46 46 46 46 46 46 46 46 46 46 37 46 29  FFFFFFFFFFFFF7F)
2390: 20 7c 20 28 76 61 6c 20 3c 3c 20 37 29 29 3b 20   | (val << 7)); 
23a0: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09  return val; }...
23b0: 09 57 4f 52 44 20 66 53 68 61 70 65 52 65 73 65  .WORD fShapeRese
23c0: 72 76 65 64 28 29 20 20 20 20 20 20 20 20 20 7b  rved()         {
23d0: 20 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52   return cast(WOR
23e0: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e  D)((_bitfield >>
23f0: 20 38 29 20 26 20 30 78 46 46 29 3b 20 7d 0d 0a   8) & 0xFF); }..
2400: 09 09 57 4f 52 44 20 66 53 68 61 70 65 52 65 73  ..WORD fShapeRes
2410: 65 72 76 65 64 28 57 4f 52 44 20 76 61 6c 29 20  erved(WORD val) 
2420: 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61  { _bitfield = ca
2430: 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69  st(WORD)((_bitfi
2440: 65 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46  eld & 0xFFFFFFFF
2450: 46 46 46 46 30 30 46 46 29 20 7c 20 28 76 61 6c  FFFF00FF) | (val
2460: 20 3c 3c 20 38 29 29 3b 20 72 65 74 75 72 6e 20   << 8)); return 
2470: 76 61 6c 3b 20 7d 0d 0a 09 7d 0d 0a 0d 0a 09 73  val; }...}.....s
2480: 74 72 75 63 74 20 47 4f 46 46 53 45 54 0d 0a 09  truct GOFFSET...
2490: 7b 0d 0a 09 09 4c 4f 4e 47 20 64 75 3b 0d 0a 09  {....LONG du;...
24a0: 09 4c 4f 4e 47 20 64 76 3b 0d 0a 09 7d 0d 0a 0d  .LONG dv;...}...
24b0: 0a 09 73 74 72 75 63 74 20 53 43 52 49 50 54 5f  ..struct SCRIPT_
24c0: 4c 4f 47 41 54 54 52 0d 0a 09 7b 0d 0a 09 09 42  LOGATTR...{....B
24d0: 59 54 45 20 5f 62 69 74 66 69 65 6c 64 3b 0d 0a  YTE _bitfield;..
24e0: 09 09 42 59 54 45 20 66 53 6f 66 74 42 72 65 61  ..BYTE fSoftBrea
24f0: 6b 28 29 20 20 20 20 20 20 20 20 20 20 7b 20 72  k()          { r
2500: 65 74 75 72 6e 20 63 61 73 74 28 42 59 54 45 29  eturn cast(BYTE)
2510: 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 30  ((_bitfield >> 0
2520: 29 20 26 20 30 78 31 29 3b 20 7d 0d 0a 09 09 42  ) & 0x1); }....B
2530: 59 54 45 20 66 53 6f 66 74 42 72 65 61 6b 28 42  YTE fSoftBreak(B
2540: 59 54 45 20 76 61 6c 29 20 20 7b 20 5f 62 69 74  YTE val)  { _bit
2550: 66 69 65 6c 64 20 3d 20 63 61 73 74 28 42 59 54  field = cast(BYT
2560: 45 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20  E)((_bitfield & 
2570: 30 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46  0xFFFFFFFFFFFFFF
2580: 46 45 29 20 7c 20 28 76 61 6c 20 3c 3c 20 30 29  FE) | (val << 0)
2590: 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d  ); return val; }
25a0: 0d 0a 09 09 42 59 54 45 20 66 57 68 69 74 65 53  ....BYTE fWhiteS
25b0: 70 61 63 65 28 29 20 20 20 20 20 20 20 20 20 7b  pace()         {
25c0: 20 72 65 74 75 72 6e 20 63 61 73 74 28 42 59 54   return cast(BYT
25d0: 45 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e  E)((_bitfield >>
25e0: 20 31 29 20 26 20 30 78 31 29 3b 20 7d 0d 0a 09   1) & 0x1); }...
25f0: 09 42 59 54 45 20 66 57 68 69 74 65 53 70 61 63  .BYTE fWhiteSpac
2600: 65 28 42 59 54 45 20 76 61 6c 29 20 7b 20 5f 62  e(BYTE val) { _b
2610: 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28 42  itfield = cast(B
2620: 59 54 45 29 28 28 5f 62 69 74 66 69 65 6c 64 20  YTE)((_bitfield 
2630: 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46 46  & 0xFFFFFFFFFFFF
2640: 46 46 46 44 29 20 7c 20 28 76 61 6c 20 3c 3c 20  FFFD) | (val << 
2650: 31 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b  1)); return val;
2660: 20 7d 0d 0a 09 09 42 59 54 45 20 66 43 68 61 72   }....BYTE fChar
2670: 53 74 6f 70 28 29 20 20 20 20 20 20 20 20 20 20  Stop()          
2680: 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 42   { return cast(B
2690: 59 54 45 29 28 28 5f 62 69 74 66 69 65 6c 64 20  YTE)((_bitfield 
26a0: 3e 3e 20 32 29 20 26 20 30 78 31 29 3b 20 7d 0d  >> 2) & 0x1); }.
26b0: 0a 09 09 42 59 54 45 20 66 43 68 61 72 53 74 6f  ...BYTE fCharSto
26c0: 70 28 42 59 54 45 20 76 61 6c 29 20 20 20 7b 20  p(BYTE val)   { 
26d0: 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74  _bitfield = cast
26e0: 28 42 59 54 45 29 28 28 5f 62 69 74 66 69 65 6c  (BYTE)((_bitfiel
26f0: 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  d & 0xFFFFFFFFFF
2700: 46 46 46 46 46 42 29 20 7c 20 28 76 61 6c 20 3c  FFFFFB) | (val <
2710: 3c 20 32 29 29 3b 20 72 65 74 75 72 6e 20 76 61  < 2)); return va
2720: 6c 3b 20 7d 0d 0a 09 09 42 59 54 45 20 66 57 6f  l; }....BYTE fWo
2730: 72 64 53 74 6f 70 28 29 20 20 20 20 20 20 20 20  rdStop()        
2740: 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74     { return cast
2750: 28 42 59 54 45 29 28 28 5f 62 69 74 66 69 65 6c  (BYTE)((_bitfiel
2760: 64 20 3e 3e 20 33 29 20 26 20 30 78 31 29 3b 20  d >> 3) & 0x1); 
2770: 7d 0d 0a 09 09 42 59 54 45 20 66 57 6f 72 64 53  }....BYTE fWordS
2780: 74 6f 70 28 42 59 54 45 20 76 61 6c 29 20 20 20  top(BYTE val)   
2790: 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61  { _bitfield = ca
27a0: 73 74 28 42 59 54 45 29 28 28 5f 62 69 74 66 69  st(BYTE)((_bitfi
27b0: 65 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46  eld & 0xFFFFFFFF
27c0: 46 46 46 46 46 46 46 37 29 20 7c 20 28 76 61 6c  FFFFFFF7) | (val
27d0: 20 3c 3c 20 33 29 29 3b 20 72 65 74 75 72 6e 20   << 3)); return 
27e0: 76 61 6c 3b 20 7d 0d 0a 09 09 42 59 54 45 20 66  val; }....BYTE f
27f0: 49 6e 76 61 6c 69 64 28 29 20 20 20 20 20 20 20  Invalid()       
2800: 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61       { return ca
2810: 73 74 28 42 59 54 45 29 28 28 5f 62 69 74 66 69  st(BYTE)((_bitfi
2820: 65 6c 64 20 3e 3e 20 34 29 20 26 20 30 78 31 29  eld >> 4) & 0x1)
2830: 3b 20 7d 0d 0a 09 09 42 59 54 45 20 66 49 6e 76  ; }....BYTE fInv
2840: 61 6c 69 64 28 42 59 54 45 20 76 61 6c 29 20 20  alid(BYTE val)  
2850: 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d 20    { _bitfield = 
2860: 63 61 73 74 28 42 59 54 45 29 28 28 5f 62 69 74  cast(BYTE)((_bit
2870: 66 69 65 6c 64 20 26 20 30 78 46 46 46 46 46 46  field & 0xFFFFFF
2880: 46 46 46 46 46 46 46 46 45 46 29 20 7c 20 28 76  FFFFFFFFEF) | (v
2890: 61 6c 20 3c 3c 20 34 29 29 3b 20 72 65 74 75 72  al << 4)); retur
28a0: 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 42 59 54 45  n val; }....BYTE
28b0: 20 66 52 65 73 65 72 76 65 64 28 29 20 20 20 20   fReserved()    
28c0: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
28d0: 63 61 73 74 28 42 59 54 45 29 28 28 5f 62 69 74  cast(BYTE)((_bit
28e0: 66 69 65 6c 64 20 3e 3e 20 35 29 20 26 20 30 78  field >> 5) & 0x
28f0: 37 29 3b 20 7d 0d 0a 09 09 42 59 54 45 20 66 52  7); }....BYTE fR
2900: 65 73 65 72 76 65 64 28 42 59 54 45 20 76 61 6c  eserved(BYTE val
2910: 29 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20  )   { _bitfield 
2920: 3d 20 63 61 73 74 28 42 59 54 45 29 28 28 5f 62  = cast(BYTE)((_b
2930: 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46 46  itfield & 0xFFFF
2940: 46 46 46 46 46 46 46 46 46 46 31 46 29 20 7c 20  FFFFFFFFFF1F) | 
2950: 28 76 61 6c 20 3c 3c 20 35 29 29 3b 20 72 65 74  (val << 5)); ret
2960: 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 7d 0d 0a  urn val; }...}..
2970: 0d 0a 09 73 74 72 75 63 74 20 53 43 52 49 50 54  ...struct SCRIPT
2980: 5f 50 52 4f 50 45 52 54 49 45 53 0d 0a 09 7b 0d  _PROPERTIES...{.
2990: 0a 09 09 70 72 69 76 61 74 65 20 44 57 4f 52 44  ...private DWORD
29a0: 20 5f 62 69 74 66 69 65 6c 64 31 3b 0d 0a 09 09   _bitfield1;....
29b0: 44 57 4f 52 44 20 6c 61 6e 67 69 64 28 29 20 20  DWORD langid()  
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e          { return
29e0: 20 28 5f 62 69 74 66 69 65 6c 64 31 20 3e 3e 20   (_bitfield1 >> 
29f0: 30 29 20 26 20 30 78 46 46 46 46 3b 20 7d 0d 0a  0) & 0xFFFF; }..
2a00: 09 09 44 57 4f 52 44 20 6c 61 6e 67 69 64 28 44  ..DWORD langid(D
2a10: 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20 20  WORD val)       
2a20: 20 20 20 20 20 20 20 20 20 20 7b 20 5f 62 69 74            { _bit
2a30: 66 69 65 6c 64 31 20 3d 20 63 61 73 74 28 44 57  field1 = cast(DW
2a40: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 31  ORD)((_bitfield1
2a50: 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46   & 0xFFFFFFFFFFF
2a60: 46 30 30 30 30 29 20 7c 20 28 76 61 6c 20 3c 3c  F0000) | (val <<
2a70: 20 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c   0)); return val
2a80: 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 4e 75  ; }....DWORD fNu
2a90: 6d 65 72 69 63 28 29 20 20 20 20 20 20 20 20 20  meric()         
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2ab0: 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65   return (_bitfie
2ac0: 6c 64 31 20 3e 3e 20 31 36 29 20 26 20 30 78 31  ld1 >> 16) & 0x1
2ad0: 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 4e 75  ; }....DWORD fNu
2ae0: 6d 65 72 69 63 28 44 57 4f 52 44 20 76 61 6c 29  meric(DWORD val)
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2b00: 20 5f 62 69 74 66 69 65 6c 64 31 20 3d 20 63 61   _bitfield1 = ca
2b10: 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66  st(DWORD)((_bitf
2b20: 69 65 6c 64 31 20 26 20 30 78 46 46 46 46 46 46  ield1 & 0xFFFFFF
2b30: 46 46 46 46 46 45 46 46 46 46 29 20 7c 20 28 76  FFFFFEFFFF) | (v
2b40: 61 6c 20 3c 3c 20 31 36 29 29 3b 20 72 65 74 75  al << 16)); retu
2b50: 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 44 57 4f  rn val; }....DWO
2b60: 52 44 20 66 43 6f 6d 70 6c 65 78 28 29 20 20 20  RD fComplex()   
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f       { return (_
2b90: 62 69 74 66 69 65 6c 64 31 20 3e 3e 20 31 37 29  bitfield1 >> 17)
2ba0: 20 26 20 30 78 31 3b 20 7d 0d 0a 09 09 44 57 4f   & 0x1; }....DWO
2bb0: 52 44 20 66 43 6f 6d 70 6c 65 78 28 44 57 4f 52  RD fComplex(DWOR
2bc0: 44 20 76 61 6c 29 20 20 20 20 20 20 20 20 20 20  D val)          
2bd0: 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64       { _bitfield
2be0: 31 20 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28  1 = cast(DWORD)(
2bf0: 28 5f 62 69 74 66 69 65 6c 64 31 20 26 20 30 78  (_bitfield1 & 0x
2c00: 46 46 46 46 46 46 46 46 46 46 46 44 46 46 46 46  FFFFFFFFFFFDFFFF
2c10: 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 37 29 29  ) | (val << 17))
2c20: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d  ; return val; }.
2c30: 0a 09 09 44 57 4f 52 44 20 66 4e 65 65 64 73 57  ...DWORD fNeedsW
2c40: 6f 72 64 42 72 65 61 6b 69 6e 67 28 29 20 20 20  ordBreaking()   
2c50: 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74             { ret
2c60: 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 31 20  urn (_bitfield1 
2c70: 3e 3e 20 31 38 29 20 26 20 30 78 31 3b 20 7d 0d  >> 18) & 0x1; }.
2c80: 0a 09 09 44 57 4f 52 44 20 66 4e 65 65 64 73 57  ...DWORD fNeedsW
2c90: 6f 72 64 42 72 65 61 6b 69 6e 67 28 44 57 4f 52  ordBreaking(DWOR
2ca0: 44 20 76 61 6c 29 20 20 20 20 20 7b 20 5f 62 69  D val)     { _bi
2cb0: 74 66 69 65 6c 64 31 20 3d 20 63 61 73 74 28 44  tfield1 = cast(D
2cc0: 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64  WORD)((_bitfield
2cd0: 31 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  1 & 0xFFFFFFFFFF
2ce0: 46 42 46 46 46 46 29 20 7c 20 28 76 61 6c 20 3c  FBFFFF) | (val <
2cf0: 3c 20 31 38 29 29 3b 20 72 65 74 75 72 6e 20 76  < 18)); return v
2d00: 61 6c 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66  al; }....DWORD f
2d10: 4e 65 65 64 73 43 61 72 65 74 49 6e 66 6f 28 29  NeedsCaretInfo()
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66   { return (_bitf
2d40: 69 65 6c 64 31 20 3e 3e 20 31 39 29 20 26 20 30  ield1 >> 19) & 0
2d50: 78 31 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66  x1; }....DWORD f
2d60: 4e 65 65 64 73 43 61 72 65 74 49 6e 66 6f 28 44  NeedsCaretInfo(D
2d70: 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20 20  WORD val)       
2d80: 20 7b 20 5f 62 69 74 66 69 65 6c 64 31 20 3d 20   { _bitfield1 = 
2d90: 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69  cast(DWORD)((_bi
2da0: 74 66 69 65 6c 64 31 20 26 20 30 78 46 46 46 46  tfield1 & 0xFFFF
2db0: 46 46 46 46 46 46 46 37 46 46 46 46 29 20 7c 20  FFFFFFF7FFFF) | 
2dc0: 28 76 61 6c 20 3c 3c 20 31 39 29 29 3b 20 72 65  (val << 19)); re
2dd0: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 44  turn val; }....D
2de0: 57 4f 52 44 20 62 43 68 61 72 53 65 74 28 29 20  WORD bCharSet() 
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
2e10: 28 5f 62 69 74 66 69 65 6c 64 31 20 3e 3e 20 32  (_bitfield1 >> 2
2e20: 30 29 20 26 20 30 78 46 46 3b 20 7d 0d 0a 09 09  0) & 0xFF; }....
2e30: 44 57 4f 52 44 20 62 43 68 61 72 53 65 74 28 44  DWORD bCharSet(D
2e40: 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20 20  WORD val)       
2e50: 20 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69          { _bitfi
2e60: 65 6c 64 31 20 3d 20 63 61 73 74 28 44 57 4f 52  eld1 = cast(DWOR
2e70: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 31 20 26  D)((_bitfield1 &
2e80: 20 30 78 46 46 46 46 46 46 46 46 46 30 30 46 46   0xFFFFFFFFF00FF
2e90: 46 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 32  FFF) | (val << 2
2ea0: 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b  0)); return val;
2eb0: 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 43 6f 6e   }....DWORD fCon
2ec0: 74 72 6f 6c 28 29 20 20 20 20 20 20 20 20 20 20  trol()          
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
2ee0: 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c  return (_bitfiel
2ef0: 64 31 20 3e 3e 20 32 38 29 20 26 20 30 78 31 3b  d1 >> 28) & 0x1;
2f00: 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 43 6f 6e   }....DWORD fCon
2f10: 74 72 6f 6c 28 44 57 4f 52 44 20 76 61 6c 29 20  trol(DWORD val) 
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
2f30: 5f 62 69 74 66 69 65 6c 64 31 20 3d 20 63 61 73  _bitfield1 = cas
2f40: 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69  t(DWORD)((_bitfi
2f50: 65 6c 64 31 20 26 20 30 78 46 46 46 46 46 46 46  eld1 & 0xFFFFFFF
2f60: 46 45 46 46 46 46 46 46 46 29 20 7c 20 28 76 61  FEFFFFFFF) | (va
2f70: 6c 20 3c 3c 20 32 38 29 29 3b 20 72 65 74 75 72  l << 28)); retur
2f80: 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 44 57 4f 52  n val; }....DWOR
2f90: 44 20 66 50 72 69 76 61 74 65 55 73 65 41 72 65  D fPrivateUseAre
2fa0: 61 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  a()             
2fb0: 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62      { return (_b
2fc0: 69 74 66 69 65 6c 64 31 20 3e 3e 20 32 39 29 20  itfield1 >> 29) 
2fd0: 26 20 30 78 31 3b 20 7d 0d 0a 09 09 44 57 4f 52  & 0x1; }....DWOR
2fe0: 44 20 66 50 72 69 76 61 74 65 55 73 65 41 72 65  D fPrivateUseAre
2ff0: 61 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20  a(DWORD val)    
3000: 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 31      { _bitfield1
3010: 20 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28 28   = cast(DWORD)((
3020: 5f 62 69 74 66 69 65 6c 64 31 20 26 20 30 78 46  _bitfield1 & 0xF
3030: 46 46 46 46 46 46 46 44 46 46 46 46 46 46 46 29  FFFFFFFDFFFFFFF)
3040: 20 7c 20 28 76 61 6c 20 3c 3c 20 32 39 29 29 3b   | (val << 29));
3050: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a   return val; }..
3060: 09 09 44 57 4f 52 44 20 66 4e 65 65 64 73 43 68  ..DWORD fNeedsCh
3070: 61 72 61 63 74 65 72 4a 75 73 74 69 66 79 28 29  aracterJustify()
3080: 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75            { retu
3090: 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 31 20 3e  rn (_bitfield1 >
30a0: 3e 20 33 30 29 20 26 20 30 78 31 3b 20 7d 0d 0a  > 30) & 0x1; }..
30b0: 09 09 44 57 4f 52 44 20 66 4e 65 65 64 73 43 68  ..DWORD fNeedsCh
30c0: 61 72 61 63 74 65 72 4a 75 73 74 69 66 79 28 44  aracterJustify(D
30d0: 57 4f 52 44 20 76 61 6c 29 20 7b 20 5f 62 69 74  WORD val) { _bit
30e0: 66 69 65 6c 64 31 20 3d 20 63 61 73 74 28 44 57  field1 = cast(DW
30f0: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 31  ORD)((_bitfield1
3100: 20 26 20 30 78 46 46 46 46 46 46 46 46 42 46 46   & 0xFFFFFFFFBFF
3110: 46 46 46 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c  FFFFF) | (val <<
3120: 20 33 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61   30)); return va
3130: 6c 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 49  l; }....DWORD fI
3140: 6e 76 61 6c 69 64 47 6c 79 70 68 28 29 20 20 20  nvalidGlyph()   
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69  { return (_bitfi
3170: 65 6c 64 31 20 3e 3e 20 33 31 29 20 26 20 30 78  eld1 >> 31) & 0x
3180: 31 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 49  1; }....DWORD fI
3190: 6e 76 61 6c 69 64 47 6c 79 70 68 28 44 57 4f 52  nvalidGlyph(DWOR
31a0: 44 20 76 61 6c 29 20 20 20 20 20 20 20 20 20 20  D val)          
31b0: 7b 20 5f 62 69 74 66 69 65 6c 64 31 20 3d 20 63  { _bitfield1 = c
31c0: 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74  ast(DWORD)((_bit
31d0: 66 69 65 6c 64 31 20 26 20 30 78 46 46 46 46 46  field1 & 0xFFFFF
31e0: 46 46 46 37 46 46 46 46 46 46 46 29 20 7c 20 28  FFF7FFFFFFF) | (
31f0: 76 61 6c 20 3c 3c 20 33 31 29 29 3b 20 72 65 74  val << 31)); ret
3200: 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 70 72  urn val; }....pr
3210: 69 76 61 74 65 20 44 57 4f 52 44 20 5f 62 69 74  ivate DWORD _bit
3220: 66 69 65 6c 64 32 3b 0d 0a 09 09 44 57 4f 52 44  field2;....DWORD
3230: 20 66 49 6e 76 61 6c 69 64 4c 6f 67 41 74 74 72   fInvalidLogAttr
3240: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ()              
3250: 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69     { return (_bi
3260: 74 66 69 65 6c 64 32 20 3e 3e 20 30 29 20 26 20  tfield2 >> 0) & 
3270: 30 78 31 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20  0x1; }....DWORD 
3280: 66 49 6e 76 61 6c 69 64 4c 6f 67 41 74 74 72 28  fInvalidLogAttr(
3290: 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20  DWORD val)      
32a0: 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 32 20 3d    { _bitfield2 =
32b0: 20 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62   cast(DWORD)((_b
32c0: 69 74 66 69 65 6c 64 32 20 26 20 30 78 46 46 46  itfield2 & 0xFFF
32d0: 46 46 46 46 46 46 46 46 46 46 46 46 45 29 20 7c  FFFFFFFFFFFFE) |
32e0: 20 28 76 61 6c 20 3c 3c 20 30 29 29 3b 20 72 65   (val << 0)); re
32f0: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 44  turn val; }....D
3300: 57 4f 52 44 20 66 43 44 4d 28 29 20 20 20 20 20  WORD fCDM()     
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
3330: 28 5f 62 69 74 66 69 65 6c 64 32 20 3e 3e 20 31  (_bitfield2 >> 1
3340: 29 20 26 20 30 78 31 3b 20 7d 0d 0a 09 09 44 57  ) & 0x1; }....DW
3350: 4f 52 44 20 66 43 44 4d 28 44 57 4f 52 44 20 76  ORD fCDM(DWORD v
3360: 61 6c 29 20 20 20 20 20 20 20 20 20 20 20 20 20  al)             
3370: 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c        { _bitfiel
3380: 64 32 20 3d 20 63 61 73 74 28 44 57 4f 52 44 29  d2 = cast(DWORD)
3390: 28 28 5f 62 69 74 66 69 65 6c 64 32 20 26 20 30  ((_bitfield2 & 0
33a0: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  xFFFFFFFFFFFFFFF
33b0: 44 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 29 29  D) | (val << 1))
33c0: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d  ; return val; }.
33d0: 0a 09 09 44 57 4f 52 44 20 66 41 6d 62 69 67 75  ...DWORD fAmbigu
33e0: 6f 75 73 43 68 61 72 53 65 74 28 29 20 20 20 20  ousCharSet()    
33f0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74             { ret
3400: 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 32 20  urn (_bitfield2 
3410: 3e 3e 20 32 29 20 26 20 30 78 31 3b 20 7d 0d 0a  >> 2) & 0x1; }..
3420: 09 09 44 57 4f 52 44 20 66 41 6d 62 69 67 75 6f  ..DWORD fAmbiguo
3430: 75 73 43 68 61 72 53 65 74 28 44 57 4f 52 44 20  usCharSet(DWORD 
3440: 76 61 6c 29 20 20 20 20 20 20 7b 20 5f 62 69 74  val)      { _bit
3450: 66 69 65 6c 64 32 20 3d 20 63 61 73 74 28 44 57  field2 = cast(DW
3460: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 32  ORD)((_bitfield2
3470: 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46   & 0xFFFFFFFFFFF
3480: 46 46 46 46 42 29 20 7c 20 28 76 61 6c 20 3c 3c  FFFFB) | (val <<
3490: 20 32 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c   2)); return val
34a0: 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 43 6c  ; }....DWORD fCl
34b0: 75 73 74 65 72 53 69 7a 65 56 61 72 69 65 73 28  usterSizeVaries(
34c0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  )              {
34d0: 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65   return (_bitfie
34e0: 6c 64 32 20 3e 3e 20 33 29 20 26 20 30 78 31 3b  ld2 >> 3) & 0x1;
34f0: 20 7d 0d 0a 09 09 44 57 4f 52 44 20 66 43 6c 75   }....DWORD fClu
3500: 73 74 65 72 53 69 7a 65 56 61 72 69 65 73 28 44  sterSizeVaries(D
3510: 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 7b 20  WORD val)     { 
3520: 5f 62 69 74 66 69 65 6c 64 32 20 3d 20 63 61 73  _bitfield2 = cas
3530: 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69  t(DWORD)((_bitfi
3540: 65 6c 64 32 20 26 20 30 78 46 46 46 46 46 46 46  eld2 & 0xFFFFFFF
3550: 46 46 46 46 46 46 46 46 37 29 20 7c 20 28 76 61  FFFFFFFF7) | (va
3560: 6c 20 3c 3c 20 33 29 29 3b 20 72 65 74 75 72 6e  l << 3)); return
3570: 20 76 61 6c 3b 20 7d 0d 0a 09 09 44 57 4f 52 44   val; }....DWORD
3580: 20 66 52 65 6a 65 63 74 49 6e 76 61 6c 69 64 28   fRejectInvalid(
3590: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
35a0: 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69     { return (_bi
35b0: 74 66 69 65 6c 64 32 20 3e 3e 20 34 29 20 26 20  tfield2 >> 4) & 
35c0: 30 78 31 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20  0x1; }....DWORD 
35d0: 66 52 65 6a 65 63 74 49 6e 76 61 6c 69 64 28 44  fRejectInvalid(D
35e0: 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20 20  WORD val)       
35f0: 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 32 20 3d    { _bitfield2 =
3600: 20 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62   cast(DWORD)((_b
3610: 69 74 66 69 65 6c 64 32 20 26 20 30 78 46 46 46  itfield2 & 0xFFF
3620: 46 46 46 46 46 46 46 46 46 46 46 45 46 29 20 7c  FFFFFFFFFFFEF) |
3630: 20 28 76 61 6c 20 3c 3c 20 34 29 29 3b 20 72 65   (val << 4)); re
3640: 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 7d 0d  turn val; }...}.
3650: 0a 0d 0a 09 73 74 72 75 63 74 20 53 43 52 49 50  ....struct SCRIP
3660: 54 5f 46 4f 4e 54 50 52 4f 50 45 52 54 49 45 53  T_FONTPROPERTIES
3670: 0d 0a 09 7b 0d 0a 09 09 69 6e 74 20 63 42 79 74  ...{....int cByt
3680: 65 73 20 3d 20 53 43 52 49 50 54 5f 46 4f 4e 54  es = SCRIPT_FONT
3690: 50 52 4f 50 45 52 54 49 45 53 2e 73 69 7a 65 6f  PROPERTIES.sizeo
36a0: 66 3b 0d 0a 09 09 57 4f 52 44 20 77 67 42 6c 61  f;....WORD wgBla
36b0: 6e 6b 3b 0d 0a 09 09 57 4f 52 44 20 77 67 44 65  nk;....WORD wgDe
36c0: 66 61 75 6c 74 3b 0d 0a 09 09 57 4f 52 44 20 77  fault;....WORD w
36d0: 67 49 6e 76 61 6c 69 64 3b 0d 0a 09 09 57 4f 52  gInvalid;....WOR
36e0: 44 20 77 67 4b 61 73 68 69 64 61 3b 0d 0a 09 09  D wgKashida;....
36f0: 69 6e 74 20 69 4b 61 73 68 69 64 61 57 69 64 74  int iKashidaWidt
3700: 68 3b 0d 0a 09 7d 0d 0a 0d 0a 09 73 74 72 75 63  h;...}.....struc
3710: 74 20 53 43 52 49 50 54 5f 54 41 42 44 45 46 0d  t SCRIPT_TABDEF.
3720: 0a 09 7b 0d 0a 09 09 69 6e 74 20 63 54 61 62 53  ..{....int cTabS
3730: 74 6f 70 73 3b 0d 0a 09 09 69 6e 74 20 69 53 63  tops;....int iSc
3740: 61 6c 65 3b 0d 0a 09 09 69 6e 74 2a 20 70 54 61  ale;....int* pTa
3750: 62 53 74 6f 70 73 3b 0d 0a 09 09 69 6e 74 20 69  bStops;....int i
3760: 54 61 62 4f 72 69 67 69 6e 3b 0d 0a 09 7d 0d 0a  TabOrigin;...}..
3770: 0d 0a 09 73 74 72 75 63 74 20 53 43 52 49 50 54  ...struct SCRIPT
3780: 5f 44 49 47 49 54 53 55 42 53 54 49 54 55 54 45  _DIGITSUBSTITUTE
3790: 0d 0a 09 7b 0d 0a 09 09 70 72 69 76 61 74 65 20  ...{....private 
37a0: 44 57 4f 52 44 20 5f 62 69 74 66 69 65 6c 64 31  DWORD _bitfield1
37b0: 3b 0d 0a 09 09 44 57 4f 52 44 20 4e 61 74 69 6f  ;....DWORD Natio
37c0: 6e 61 6c 44 69 67 69 74 4c 61 6e 67 75 61 67 65  nalDigitLanguage
37d0: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ()             {
37e0: 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65   return (_bitfie
37f0: 6c 64 31 20 3e 3e 20 30 29 20 26 20 30 78 46 46  ld1 >> 0) & 0xFF
3800: 46 46 3b 20 7d 0d 0a 09 09 44 57 4f 52 44 20 4e  FF; }....DWORD N
3810: 61 74 69 6f 6e 61 6c 44 69 67 69 74 4c 61 6e 67  ationalDigitLang
3820: 75 61 67 65 28 44 57 4f 52 44 20 76 61 6c 29 20  uage(DWORD val) 
3830: 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 31 20     { _bitfield1 
3840: 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f  = cast(DWORD)((_
3850: 62 69 74 66 69 65 6c 64 31 20 26 20 30 78 46 46  bitfield1 & 0xFF
3860: 46 46 46 46 46 46 46 46 46 46 30 30 30 30 29 20  FFFFFFFFFF0000) 
3870: 7c 20 28 76 61 6c 20 3c 3c 20 30 29 29 3b 20 72  | (val << 0)); r
3880: 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09  eturn val; }....
3890: 44 57 4f 52 44 20 54 72 61 64 69 74 69 6f 6e 61  DWORD Traditiona
38a0: 6c 44 69 67 69 74 4c 61 6e 67 75 61 67 65 28 29  lDigitLanguage()
38b0: 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75            { retu
38c0: 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 31 20 3e  rn (_bitfield1 >
38d0: 3e 20 31 36 29 20 26 20 30 78 46 46 46 46 3b 20  > 16) & 0xFFFF; 
38e0: 7d 0d 0a 09 09 44 57 4f 52 44 20 54 72 61 64 69  }....DWORD Tradi
38f0: 74 69 6f 6e 61 6c 44 69 67 69 74 4c 61 6e 67 75  tionalDigitLangu
3900: 61 67 65 28 44 57 4f 52 44 20 76 61 6c 29 20 7b  age(DWORD val) {
3910: 20 5f 62 69 74 66 69 65 6c 64 31 20 3d 20 63 61   _bitfield1 = ca
3920: 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66  st(DWORD)((_bitf
3930: 69 65 6c 64 31 20 26 20 30 78 46 46 46 46 46 46  ield1 & 0xFFFFFF
3940: 46 46 30 30 30 30 46 46 46 46 29 20 7c 20 28 76  FF0000FFFF) | (v
3950: 61 6c 20 3c 3c 20 31 36 29 29 3b 20 72 65 74 75  al << 16)); retu
3960: 72 6e 20 76 61 6c 3b 20 7d 0d 0a 09 09 70 72 69  rn val; }....pri
3970: 76 61 74 65 20 44 57 4f 52 44 20 5f 62 69 74 66  vate DWORD _bitf
3980: 69 65 6c 64 32 3b 0d 0a 09 09 44 57 4f 52 44 20  ield2;....DWORD 
3990: 44 69 67 69 74 53 75 62 73 74 69 74 75 74 65 28  DigitSubstitute(
39a0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
39b0: 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62      { return (_b
39c0: 69 74 66 69 65 6c 64 32 20 3e 3e 20 30 29 20 26  itfield2 >> 0) &
39d0: 20 30 78 46 46 3b 20 7d 0d 0a 09 09 44 57 4f 52   0xFF; }....DWOR
39e0: 44 20 44 69 67 69 74 53 75 62 73 74 69 74 75 74  D DigitSubstitut
39f0: 65 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20  e(DWORD val)    
3a00: 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c        { _bitfiel
3a10: 64 32 20 3d 20 63 61 73 74 28 44 57 4f 52 44 29  d2 = cast(DWORD)
3a20: 28 28 5f 62 69 74 66 69 65 6c 64 32 20 26 20 30  ((_bitfield2 & 0
3a30: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 30  xFFFFFFFFFFFFFF0
3a40: 30 29 20 7c 20 28 76 61 6c 20 3c 3c 20 30 29 29  0) | (val << 0))
3a50: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0d  ; return val; }.
3a60: 0a 09 09 44 57 4f 52 44 20 64 77 52 65 73 65 72  ...DWORD dwReser
3a70: 76 65 64 3b 0d 0a 09 7d 0d 0a 0d 0a 09 2f 2a 20  ved;...}...../* 
3a80: 54 4f 44 4f 3a 20 57 69 6e 64 6f 77 73 20 56 69  TODO: Windows Vi
3a90: 73 74 61 20 66 65 61 72 75 72 65 64 20 73 74 72  sta fearured str
3aa0: 75 63 74 73 0d 0a 09 4f 50 45 4e 54 59 50 45 5f  ucts...OPENTYPE_
3ab0: 46 45 41 54 55 52 45 5f 52 45 43 4f 52 44 0d 0a  FEATURE_RECORD..
3ac0: 09 4f 50 45 4e 54 59 50 45 5f 54 41 47 0d 0a 09  .OPENTYPE_TAG...
3ad0: 53 43 52 49 50 54 5f 43 48 41 52 50 52 4f 50 0d  SCRIPT_CHARPROP.
3ae0: 0a 09 53 43 52 49 50 54 5f 47 4c 59 50 48 50 52  ..SCRIPT_GLYPHPR
3af0: 4f 50 0d 0a 09 54 45 58 54 52 41 4e 47 45 5f 50  OP...TEXTRANGE_P
3b00: 52 4f 50 45 52 54 49 45 53 0d 0a 09 2a 2f 0d 0a  ROPERTIES...*/..
3b10: 7d 0d 0a 0d 0a 0d 0a 2f 2a 20 55 6e 69 73 63 72  }....../* Uniscr
3b20: 69 62 65 20 46 75 6e 63 74 69 6f 6e 73 20 0d 0a  ibe Functions ..
3b30: 20 2a 20 68 74 74 70 3a 2f 2f 6d 73 64 6e 32 2e   * http://msdn2.
3b40: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6c 69  microsoft.com/li
3b50: 62 72 61 72 79 2f 6d 73 37 37 36 34 36 39 20 2a  brary/ms776469 *
3b60: 2f 0d 0a 65 78 74 65 72 6e 20 28 57 69 6e 64 6f  /..extern (Windo
3b70: 77 73 29 0d 0a 7b 0d 0a 09 48 52 45 53 55 4c 54  ws)..{...HRESULT
3b80: 20 53 63 72 69 70 74 46 72 65 65 43 61 63 68 65   ScriptFreeCache
3b90: 28 53 43 52 49 50 54 5f 43 41 43 48 45 2a 29 3b  (SCRIPT_CACHE*);
3ba0: 0d 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ...HRESULT Scrip
3bb0: 74 49 74 65 6d 69 7a 65 28 63 6f 6e 73 74 28 57  tItemize(const(W
3bc0: 43 48 41 52 29 2a 2c 20 69 6e 74 2c 20 69 6e 74  CHAR)*, int, int
3bd0: 2c 20 63 6f 6e 73 74 28 53 43 52 49 50 54 5f 43  , const(SCRIPT_C
3be0: 4f 4e 54 52 4f 4c 29 2a 2c 20 63 6f 6e 73 74 28  ONTROL)*, const(
3bf0: 53 43 52 49 50 54 5f 53 54 41 54 45 29 2a 2c 20  SCRIPT_STATE)*, 
3c00: 53 43 52 49 50 54 5f 49 54 45 4d 2a 2c 20 69 6e  SCRIPT_ITEM*, in
3c10: 74 2a 29 3b 0d 0a 09 48 52 45 53 55 4c 54 20 53  t*);...HRESULT S
3c20: 63 72 69 70 74 4c 61 79 6f 75 74 28 69 6e 74 2c  criptLayout(int,
3c30: 20 63 6f 6e 73 74 28 42 59 54 45 29 2a 2c 20 69   const(BYTE)*, i
3c40: 6e 74 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 09 48 52  nt*, int*);...HR
3c50: 45 53 55 4c 54 20 53 63 72 69 70 74 53 68 61 70  ESULT ScriptShap
3c60: 65 28 48 44 43 2c 20 53 43 52 49 50 54 5f 43 41  e(HDC, SCRIPT_CA
3c70: 43 48 45 2a 2c 20 63 6f 6e 73 74 28 57 43 48 41  CHE*, const(WCHA
3c80: 52 29 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 53  R)*, int, int, S
3c90: 43 52 49 50 54 5f 41 4e 41 4c 59 53 49 53 2a 2c  CRIPT_ANALYSIS*,
3ca0: 20 57 4f 52 44 2a 2c 20 57 4f 52 44 2a 2c 20 53   WORD*, WORD*, S
3cb0: 43 52 49 50 54 5f 56 49 53 41 54 54 52 2a 2c 20  CRIPT_VISATTR*, 
3cc0: 69 6e 74 2a 29 3b 0d 0a 09 48 52 45 53 55 4c 54  int*);...HRESULT
3cd0: 20 53 63 72 69 70 74 50 6c 61 63 65 28 48 44 43   ScriptPlace(HDC
3ce0: 2c 20 53 43 52 49 50 54 5f 43 41 43 48 45 2a 2c  , SCRIPT_CACHE*,
3cf0: 20 63 6f 6e 73 74 28 57 4f 52 44 29 2a 2c 20 69   const(WORD)*, i
3d00: 6e 74 2c 20 63 6f 6e 73 74 28 53 43 52 49 50 54  nt, const(SCRIPT
3d10: 5f 56 49 53 41 54 54 52 29 2a 2c 20 53 43 52 49  _VISATTR)*, SCRI
3d20: 50 54 5f 41 4e 41 4c 59 53 49 53 2a 2c 20 69 6e  PT_ANALYSIS*, in
3d30: 74 2a 2c 20 47 4f 46 46 53 45 54 2a 2c 20 41 42  t*, GOFFSET*, AB
3d40: 43 2a 29 3b 0d 0a 09 48 52 45 53 55 4c 54 20 53  C*);...HRESULT S
3d50: 63 72 69 70 74 54 65 78 74 4f 75 74 28 48 44 43  criptTextOut(HDC
3d60: 2c 20 53 43 52 49 50 54 5f 43 41 43 48 45 2a 2c  , SCRIPT_CACHE*,
3d70: 20 69 6e 74 2c 20 69 6e 74 2c 20 55 49 4e 54 2c   int, int, UINT,
3d80: 20 63 6f 6e 73 74 28 52 45 43 54 29 2a 2c 20 63   const(RECT)*, c
3d90: 6f 6e 73 74 28 53 43 52 49 50 54 5f 41 4e 41 4c  onst(SCRIPT_ANAL
3da0: 59 53 49 53 29 2a 2c 20 63 6f 6e 73 74 28 57 43  YSIS)*, const(WC
3db0: 48 41 52 29 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73  HAR)*, int, cons
3dc0: 74 28 57 4f 52 44 29 2a 2c 20 69 6e 74 2c 20 63  t(WORD)*, int, c
3dd0: 6f 6e 73 74 28 69 6e 74 29 2a 2c 20 69 6e 74 2a  onst(int)*, int*
3de0: 2c 20 63 6f 6e 73 74 28 47 4f 46 46 53 45 54 29  , const(GOFFSET)
3df0: 2a 29 3b 0d 0a 09 48 52 45 53 55 4c 54 20 53 63  *);...HRESULT Sc
3e00: 72 69 70 74 4a 75 73 74 69 66 79 28 63 6f 6e 73  riptJustify(cons
3e10: 74 28 53 43 52 49 50 54 5f 56 49 53 41 54 54 52  t(SCRIPT_VISATTR
3e20: 29 2a 2c 20 63 6f 6e 73 74 28 69 6e 74 29 2a 2c  )*, const(int)*,
3e30: 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 2c 20   int, int, int, 
3e40: 69 6e 74 2a 29 3b 0d 0a 09 48 52 45 53 55 4c 54  int*);...HRESULT
3e50: 20 53 63 72 69 70 74 42 72 65 61 6b 28 63 6f 6e   ScriptBreak(con
3e60: 73 74 28 57 43 48 41 52 29 2a 2c 20 69 6e 74 2c  st(WCHAR)*, int,
3e70: 20 63 6f 6e 73 74 28 53 43 52 49 50 54 5f 41 4e   const(SCRIPT_AN
3e80: 41 4c 59 53 49 53 29 2a 2c 20 63 6f 6e 73 74 28  ALYSIS)*, const(
3e90: 53 43 52 49 50 54 5f 4c 4f 47 41 54 54 52 29 2a  SCRIPT_LOGATTR)*
3ea0: 29 3b 0d 0a 09 48 52 45 53 55 4c 54 20 53 63 72  );...HRESULT Scr
3eb0: 69 70 74 43 50 74 6f 58 28 69 6e 74 2c 20 42 4f  iptCPtoX(int, BO
3ec0: 4f 4c 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 63 6f  OL, int, int, co
3ed0: 6e 73 74 28 57 4f 52 44 29 2a 2c 20 63 6f 6e 73  nst(WORD)*, cons
3ee0: 74 28 53 43 52 49 50 54 5f 56 49 53 41 54 54 52  t(SCRIPT_VISATTR
3ef0: 29 2a 2c 20 63 6f 6e 73 74 28 69 6e 74 29 2a 2c  )*, const(int)*,
3f00: 20 63 6f 6e 73 74 28 53 43 52 49 50 54 5f 41 4e   const(SCRIPT_AN
3f10: 41 4c 59 53 49 53 29 2a 2c 20 69 6e 74 2a 29 3b  ALYSIS)*, int*);
3f20: 0d 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ...HRESULT Scrip
3f30: 74 58 74 6f 43 50 28 69 6e 74 2c 20 69 6e 74 2c  tXtoCP(int, int,
3f40: 20 69 6e 74 2c 20 63 6f 6e 73 74 28 57 4f 52 44   int, const(WORD
3f50: 29 2a 2c 20 63 6f 6e 73 74 28 53 43 52 49 50 54  )*, const(SCRIPT
3f60: 5f 56 49 53 41 54 54 52 29 2a 2c 20 63 6f 6e 73  _VISATTR)*, cons
3f70: 74 28 69 6e 74 29 2a 2c 20 63 6f 6e 73 74 28 53  t(int)*, const(S
3f80: 43 52 49 50 54 5f 41 4e 41 4c 59 53 49 53 29 2a  CRIPT_ANALYSIS)*
3f90: 2c 20 69 6e 74 2a 2c 20 69 6e 74 2a 29 3b 0d 0a  , int*, int*);..
3fa0: 09 48 52 45 53 55 4c 54 20 53 63 72 69 70 74 47  .HRESULT ScriptG
3fb0: 65 74 4c 6f 67 69 63 61 6c 57 69 64 74 68 73 28  etLogicalWidths(
3fc0: 63 6f 6e 73 74 28 53 43 52 49 50 54 5f 41 4e 41  const(SCRIPT_ANA
3fd0: 4c 59 53 49 53 29 2a 2c 20 69 6e 74 2c 20 69 6e  LYSIS)*, int, in
3fe0: 74 2c 20 63 6f 6e 73 74 28 69 6e 74 29 2a 2c 20  t, const(int)*, 
3ff0: 63 6f 6e 73 74 28 57 4f 52 44 29 2a 2c 20 63 6f  const(WORD)*, co
4000: 6e 73 74 28 53 43 52 49 50 54 5f 56 49 53 41 54  nst(SCRIPT_VISAT
4010: 54 52 29 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 09 48  TR)*, int*);...H
4020: 52 45 53 55 4c 54 20 53 63 72 69 70 74 41 70 70  RESULT ScriptApp
4030: 6c 79 4c 6f 67 69 63 61 6c 57 69 64 74 68 28 63  lyLogicalWidth(c
4040: 6f 6e 73 74 28 69 6e 74 29 2a 2c 20 69 6e 74 2c  onst(int)*, int,
4050: 20 69 6e 74 2c 20 63 6f 6e 73 74 28 57 4f 52 44   int, const(WORD
4060: 29 2a 2c 20 63 6f 6e 73 74 28 53 43 52 49 50 54  )*, const(SCRIPT
4070: 5f 56 49 53 41 54 54 52 29 2a 2c 20 63 6f 6e 73  _VISATTR)*, cons
4080: 74 28 69 6e 74 29 2a 2c 20 63 6f 6e 73 74 28 53  t(int)*, const(S
4090: 43 52 49 50 54 5f 41 4e 41 4c 59 53 49 53 29 2a  CRIPT_ANALYSIS)*
40a0: 2c 20 41 42 43 2a 2c 20 69 6e 74 2a 29 3b 0d 0a  , ABC*, int*);..
40b0: 09 48 52 45 53 55 4c 54 20 53 63 72 69 70 74 47  .HRESULT ScriptG
40c0: 65 74 43 4d 61 70 28 48 44 43 2c 20 53 43 52 49  etCMap(HDC, SCRI
40d0: 50 54 5f 43 41 43 48 45 2a 2c 20 63 6f 6e 73 74  PT_CACHE*, const
40e0: 28 57 43 48 41 52 29 2a 2c 20 69 6e 74 2c 20 44  (WCHAR)*, int, D
40f0: 57 4f 52 44 2c 20 57 4f 52 44 2a 29 3b 0d 0a 09  WORD, WORD*);...
4100: 48 52 45 53 55 4c 54 20 53 63 72 69 70 74 47 65  HRESULT ScriptGe
4110: 74 47 6c 79 70 68 41 42 43 57 69 64 74 68 28 48  tGlyphABCWidth(H
4120: 44 43 2c 20 53 43 52 49 50 54 5f 43 41 43 48 45  DC, SCRIPT_CACHE
4130: 2a 2c 20 57 4f 52 44 2c 20 41 42 43 2a 29 3b 0d  *, WORD, ABC*);.
4140: 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70 74  ..HRESULT Script
4150: 47 65 74 50 72 6f 70 65 72 74 69 65 73 28 63 6f  GetProperties(co
4160: 6e 73 74 28 53 43 52 49 50 54 5f 50 52 4f 50 45  nst(SCRIPT_PROPE
4170: 52 54 49 45 53 2a 2a 29 2a 2c 20 69 6e 74 2a 29  RTIES**)*, int*)
4180: 3b 0d 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69  ;...HRESULT Scri
4190: 70 74 47 65 74 46 6f 6e 74 50 72 6f 70 65 72 74  ptGetFontPropert
41a0: 69 65 73 28 48 44 43 2c 20 53 43 52 49 50 54 5f  ies(HDC, SCRIPT_
41b0: 43 41 43 48 45 2a 2c 20 53 43 52 49 50 54 5f 46  CACHE*, SCRIPT_F
41c0: 4f 4e 54 50 52 4f 50 45 52 54 49 45 53 2a 29 3b  ONTPROPERTIES*);
41d0: 0d 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ...HRESULT Scrip
41e0: 74 43 61 63 68 65 47 65 74 48 65 69 67 68 74 28  tCacheGetHeight(
41f0: 48 44 43 2c 20 53 43 52 49 50 54 5f 43 41 43 48  HDC, SCRIPT_CACH
4200: 45 2a 2c 20 69 6e 74 2a 29 3b 0d 0a 09 48 52 45  E*, int*);...HRE
4210: 53 55 4c 54 20 53 63 72 69 70 74 49 73 43 6f 6d  SULT ScriptIsCom
4220: 70 6c 65 78 28 63 6f 6e 73 74 28 57 43 48 41 52  plex(const(WCHAR
4230: 29 2a 2c 20 69 6e 74 2c 20 44 57 4f 52 44 29 3b  )*, int, DWORD);
4240: 0d 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ...HRESULT Scrip
4250: 74 52 65 63 6f 72 64 44 69 67 69 74 53 75 62 73  tRecordDigitSubs
4260: 74 69 74 75 74 69 6f 6e 28 4c 43 49 44 2c 20 53  titution(LCID, S
4270: 43 52 49 50 54 5f 44 49 47 49 54 53 55 42 53 54  CRIPT_DIGITSUBST
4280: 49 54 55 54 45 2a 29 3b 0d 0a 09 48 52 45 53 55  ITUTE*);...HRESU
4290: 4c 54 20 53 63 72 69 70 74 41 70 70 6c 79 44 69  LT ScriptApplyDi
42a0: 67 69 74 53 75 62 73 74 69 74 75 74 69 6f 6e 28  gitSubstitution(
42b0: 63 6f 6e 73 74 28 53 43 52 49 50 54 5f 44 49 47  const(SCRIPT_DIG
42c0: 49 54 53 55 42 53 54 49 54 55 54 45 29 2a 2c 20  ITSUBSTITUTE)*, 
42d0: 53 43 52 49 50 54 5f 43 4f 4e 54 52 4f 4c 2a 2c  SCRIPT_CONTROL*,
42e0: 20 53 43 52 49 50 54 5f 53 54 41 54 45 2a 29 3b   SCRIPT_STATE*);
42f0: 0d 0a 0d 0a 09 2f 2a 20 53 63 72 69 70 74 53 74  ...../* ScriptSt
4300: 72 69 6e 67 20 46 75 6e 63 74 69 6f 6e 73 0d 0a  ring Functions..
4310: 09 20 2a 20 68 74 74 70 3a 2f 2f 6d 73 64 6e 32  . * http://msdn2
4320: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6c  .microsoft.com/l
4330: 69 62 72 61 72 79 2f 6d 73 37 37 36 34 38 35 20  ibrary/ms776485 
4340: 2a 2f 0d 0a 09 48 52 45 53 55 4c 54 20 53 63 72  */...HRESULT Scr
4350: 69 70 74 53 74 72 69 6e 67 41 6e 61 6c 79 73 65  iptStringAnalyse
4360: 28 48 44 43 2c 20 63 6f 6e 73 74 28 76 6f 69 64  (HDC, const(void
4370: 29 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e  )*, int, int, in
4380: 74 2c 20 44 57 4f 52 44 2c 20 69 6e 74 2c 20 53  t, DWORD, int, S
4390: 43 52 49 50 54 5f 43 4f 4e 54 52 4f 4c 2a 2c 20  CRIPT_CONTROL*, 
43a0: 53 43 52 49 50 54 5f 53 54 41 54 45 2a 2c 20 63  SCRIPT_STATE*, c
43b0: 6f 6e 73 74 28 69 6e 74 29 2a 2c 20 53 43 52 49  onst(int)*, SCRI
43c0: 50 54 5f 54 41 42 44 45 46 2a 2c 20 63 6f 6e 73  PT_TABDEF*, cons
43d0: 74 28 42 59 54 45 29 2a 2c 20 53 43 52 49 50 54  t(BYTE)*, SCRIPT
43e0: 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49 53  _STRING_ANALYSIS
43f0: 2a 29 3b 0d 0a 09 48 52 45 53 55 4c 54 20 53 63  *);...HRESULT Sc
4400: 72 69 70 74 53 74 72 69 6e 67 46 72 65 65 28 53  riptStringFree(S
4410: 43 52 49 50 54 5f 53 54 52 49 4e 47 5f 41 4e 41  CRIPT_STRING_ANA
4420: 4c 59 53 49 53 2a 29 3b 0d 0a 09 63 6f 6e 73 74  LYSIS*);...const
4430: 28 53 49 5a 45 29 2a 20 53 63 72 69 70 74 53 74  (SIZE)* ScriptSt
4440: 72 69 6e 67 5f 70 53 69 7a 65 28 53 43 52 49 50  ring_pSize(SCRIP
4450: 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49  T_STRING_ANALYSI
4460: 53 29 3b 0d 0a 09 63 6f 6e 73 74 28 69 6e 74 29  S);...const(int)
4470: 2a 20 53 63 72 69 70 74 53 74 72 69 6e 67 5f 70  * ScriptString_p
4480: 63 4f 75 74 43 68 61 72 73 28 53 43 52 49 50 54  cOutChars(SCRIPT
4490: 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49 53  _STRING_ANALYSIS
44a0: 29 3b 0d 0a 09 63 6f 6e 73 74 28 53 43 52 49 50  );...const(SCRIP
44b0: 54 5f 4c 4f 47 41 54 54 52 29 2a 20 53 63 72 69  T_LOGATTR)* Scri
44c0: 70 74 53 74 72 69 6e 67 5f 70 4c 6f 67 41 74 74  ptString_pLogAtt
44d0: 72 28 53 43 52 49 50 54 5f 53 54 52 49 4e 47 5f  r(SCRIPT_STRING_
44e0: 41 4e 41 4c 59 53 49 53 29 3b 0d 0a 09 48 52 45  ANALYSIS);...HRE
44f0: 53 55 4c 54 20 53 63 72 69 70 74 53 74 72 69 6e  SULT ScriptStrin
4500: 67 47 65 74 4f 72 64 65 72 28 53 43 52 49 50 54  gGetOrder(SCRIPT
4510: 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49 53  _STRING_ANALYSIS
4520: 2c 20 55 49 4e 54 2a 29 3b 0d 0a 09 48 52 45 53  , UINT*);...HRES
4530: 55 4c 54 20 53 63 72 69 70 74 53 74 72 69 6e 67  ULT ScriptString
4540: 43 50 74 6f 58 28 53 43 52 49 50 54 5f 53 54 52  CPtoX(SCRIPT_STR
4550: 49 4e 47 5f 41 4e 41 4c 59 53 49 53 2c 20 69 6e  ING_ANALYSIS, in
4560: 74 2c 20 42 4f 4f 4c 2c 20 69 6e 74 2a 29 3b 0d  t, BOOL, int*);.
4570: 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70 74  ..HRESULT Script
4580: 53 74 72 69 6e 67 58 74 6f 43 50 28 53 43 52 49  StringXtoCP(SCRI
4590: 50 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53  PT_STRING_ANALYS
45a0: 49 53 2c 20 69 6e 74 2c 20 69 6e 74 2a 2c 20 69  IS, int, int*, i
45b0: 6e 74 2a 29 3b 0d 0a 09 48 52 45 53 55 4c 54 20  nt*);...HRESULT 
45c0: 53 63 72 69 70 74 53 74 72 69 6e 67 47 65 74 4c  ScriptStringGetL
45d0: 6f 67 69 63 61 6c 57 69 64 74 68 73 28 53 43 52  ogicalWidths(SCR
45e0: 49 50 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59  IPT_STRING_ANALY
45f0: 53 49 53 2c 20 69 6e 74 2a 29 3b 0d 0a 09 48 52  SIS, int*);...HR
4600: 45 53 55 4c 54 20 53 63 72 69 70 74 53 74 72 69  ESULT ScriptStri
4610: 6e 67 56 61 6c 69 64 61 74 65 28 53 43 52 49 50  ngValidate(SCRIP
4620: 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49  T_STRING_ANALYSI
4630: 53 29 3b 0d 0a 09 48 52 45 53 55 4c 54 20 53 63  S);...HRESULT Sc
4640: 72 69 70 74 53 74 72 69 6e 67 4f 75 74 28 53 43  riptStringOut(SC
4650: 52 49 50 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c  RIPT_STRING_ANAL
4660: 59 53 49 53 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  YSIS, int, int, 
4670: 55 49 4e 54 2c 20 63 6f 6e 73 74 28 52 45 43 54  UINT, const(RECT
4680: 29 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 42 4f  )*, int, int, BO
4690: 4f 4c 29 3b 0d 0a 0d 0a 09 2f 2a 20 54 4f 44 4f  OL);...../* TODO
46a0: 3a 20 57 69 6e 64 6f 77 73 20 56 69 73 74 61 20  : Windows Vista 
46b0: 66 65 61 72 75 72 65 64 20 66 75 6e 63 74 69 6f  fearured functio
46c0: 6e 73 0d 0a 09 53 63 72 69 70 74 47 65 74 46 6f  ns...ScriptGetFo
46d0: 6e 74 41 6c 74 65 72 6e 61 74 65 47 6c 79 70 68  ntAlternateGlyph
46e0: 73 28 29 0d 0a 09 53 63 72 69 70 74 47 65 74 46  s()...ScriptGetF
46f0: 6f 6e 74 46 65 61 74 75 72 65 54 61 67 73 28 29  ontFeatureTags()
4700: 0d 0a 09 53 63 72 69 70 74 47 65 74 46 6f 6e 74  ...ScriptGetFont
4710: 4c 61 6e 67 75 61 67 65 54 61 67 73 28 29 0d 0a  LanguageTags()..
4720: 09 53 63 72 69 70 74 47 65 74 46 6f 6e 74 53 63  .ScriptGetFontSc
4730: 72 69 70 74 54 61 67 73 28 29 0d 0a 09 53 63 72  riptTags()...Scr
4740: 69 70 74 49 74 65 6d 69 7a 65 4f 70 65 6e 54 79  iptItemizeOpenTy
4750: 70 65 28 29 0d 0a 09 53 63 72 69 70 74 50 6c 61  pe()...ScriptPla
4760: 63 65 4f 70 65 6e 54 79 70 65 28 29 0d 0a 09 53  ceOpenType()...S
4770: 63 72 69 70 74 50 6f 73 69 74 69 6f 6e 53 69 6e  criptPositionSin
4780: 67 6c 65 47 6c 79 70 68 28 29 0d 0a 09 53 63 72  gleGlyph()...Scr
4790: 69 70 74 53 68 61 70 65 4f 70 65 6e 54 79 70 65  iptShapeOpenType
47a0: 28 29 0d 0a 09 53 63 72 69 70 74 53 75 62 73 74  ()...ScriptSubst
47b0: 69 74 75 74 65 53 69 6e 67 6c 65 47 6c 79 70 68  ituteSingleGlyph
47c0: 28 29 0d 0a 09 2a 2f 0d 0a 7d 0d 0a              ()...*/..}..