Hex Artifact Content

Not logged in

Artifact a70e4c08c60d829b60a13b3f2c36bc97070ccc7a:


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 0a 20 2a 20 68 74 74  processor. * htt
0030: 70 3a 2f 2f 6d 73 64 6e 32 2e 6d 69 63 72 6f 73  p://msdn2.micros
0040: 6f 66 74 2e 63 6f 6d 2f 6c 69 62 72 61 72 79 2f  oft.com/library/
0050: 6d 73 37 37 36 34 38 38 20 2a 2f 0a 0a 0a 6d 6f  ms776488 */...mo
0060: 64 75 6c 65 20 77 69 6e 33 32 2e 75 73 70 31 30  dule win32.usp10
0070: 3b 0a 69 6d 70 6f 72 74 20 77 69 6e 33 32 2e 77  ;.import win32.w
0080: 69 6e 64 6f 77 73 3b 0a 0a 0a 0a 2f 2a 20 55 6e  indows;..../* Un
0090: 69 73 63 72 69 62 65 20 45 6e 75 6d 65 72 61 74  iscribe Enumerat
00a0: 69 6f 6e 20 54 79 70 65 73 0a 20 2a 20 68 74 74  ion Types. * htt
00b0: 70 3a 2f 2f 6d 73 64 6e 32 2e 6d 69 63 72 6f 73  p://msdn2.micros
00c0: 6f 66 74 2e 63 6f 6d 2f 6c 69 62 72 61 72 79 2f  oft.com/library/
00d0: 6d 73 37 37 36 35 31 38 20 2a 2f 0a 0a 65 6e 75  ms776518 */..enu
00e0: 6d 20 3a 20 57 4f 52 44 20 7b 0a 09 53 43 52 49  m : WORD {..SCRI
00f0: 50 54 5f 55 4e 44 45 46 49 4e 45 44 20 3d 20 30  PT_UNDEFINED = 0
0100: 2c 0a 7d 0a 0a 65 6e 75 6d 20 3a 20 44 57 4f 52  ,.}..enum : DWOR
0110: 44 20 7b 0a 09 53 47 43 4d 5f 52 54 4c 20 3d 20  D {..SGCM_RTL = 
0120: 30 78 30 30 30 30 30 30 30 31 2c 0a 7d 0a 0a 65  0x00000001,.}..e
0130: 6e 75 6d 20 3a 20 44 57 4f 52 44 20 7b 0a 09 53  num : DWORD {..S
0140: 53 41 5f 50 41 53 53 57 4f 52 44 20 20 20 20 20  SA_PASSWORD     
0150: 20 20 20 3d 20 30 78 30 30 30 30 30 30 30 31 2c     = 0x00000001,
0160: 0a 09 53 53 41 5f 54 41 42 20 20 20 20 20 20 20  ..SSA_TAB       
0170: 20 20 20 20 20 20 3d 20 30 78 30 30 30 30 30 30        = 0x000000
0180: 30 32 2c 0a 09 53 53 41 5f 43 4c 49 50 20 20 20  02,..SSA_CLIP   
0190: 20 20 20 20 20 20 20 20 20 3d 20 30 78 30 30 30           = 0x000
01a0: 30 30 30 30 34 2c 0a 09 53 53 41 5f 46 49 54 20  00004,..SSA_FIT 
01b0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
01c0: 30 30 30 30 30 30 30 38 2c 0a 09 53 53 41 5f 44  00000008,..SSA_D
01d0: 5a 57 47 20 20 20 20 20 20 20 20 20 20 20 20 3d  ZWG            =
01e0: 20 30 78 30 30 30 30 30 30 31 30 2c 0a 09 53 53   0x00000010,..SS
01f0: 41 5f 46 41 4c 4c 42 41 43 4b 20 20 20 20 20 20  A_FALLBACK      
0200: 20 20 3d 20 30 78 30 30 30 30 30 30 32 30 2c 0a    = 0x00000020,.
0210: 09 53 53 41 5f 42 52 45 41 4b 20 20 20 20 20 20  .SSA_BREAK      
0220: 20 20 20 20 20 3d 20 30 78 30 30 30 30 30 30 34       = 0x0000004
0230: 30 2c 0a 09 53 53 41 5f 47 4c 59 50 48 53 20 20  0,..SSA_GLYPHS  
0240: 20 20 20 20 20 20 20 20 3d 20 30 78 30 30 30 30          = 0x0000
0250: 30 30 38 30 2c 0a 09 53 53 41 5f 52 54 4c 20 20  0080,..SSA_RTL  
0260: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 30             = 0x0
0270: 30 30 30 30 31 30 30 2c 0a 09 53 53 41 5f 47 43  0000100,..SSA_GC
0280: 50 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20  P             = 
0290: 30 78 30 30 30 30 30 32 30 30 2c 0a 09 53 53 41  0x00000200,..SSA
02a0: 5f 48 4f 54 4b 45 59 20 20 20 20 20 20 20 20 20  _HOTKEY         
02b0: 20 3d 20 30 78 30 30 30 30 30 34 30 30 2c 0a 09   = 0x00000400,..
02c0: 53 53 41 5f 4d 45 54 41 46 49 4c 45 20 20 20 20  SSA_METAFILE    
02d0: 20 20 20 20 3d 20 30 78 30 30 30 30 30 38 30 30      = 0x00000800
02e0: 2c 0a 09 53 53 41 5f 4c 49 4e 4b 20 20 20 20 20  ,..SSA_LINK     
02f0: 20 20 20 20 20 20 20 3d 20 30 78 30 30 30 30 31         = 0x00001
0300: 30 30 30 2c 0a 09 53 53 41 5f 48 49 44 45 48 4f  000,..SSA_HIDEHO
0310: 54 4b 45 59 20 20 20 20 20 20 3d 20 30 78 30 30  TKEY      = 0x00
0320: 30 30 32 30 30 30 2c 0a 09 53 53 41 5f 48 4f 54  002000,..SSA_HOT
0330: 4b 45 59 4f 4e 4c 59 20 20 20 20 20 20 3d 20 30  KEYONLY      = 0
0340: 78 30 30 30 30 32 34 30 30 2c 0a 09 53 53 41 5f  x00002400,..SSA_
0350: 46 55 4c 4c 4d 45 41 53 55 52 45 20 20 20 20 20  FULLMEASURE     
0360: 3d 20 30 78 30 34 30 30 30 30 30 30 2c 0a 09 53  = 0x04000000,..S
0370: 53 41 5f 4c 50 4b 41 4e 53 49 46 41 4c 4c 42 41  SA_LPKANSIFALLBA
0380: 43 4b 20 3d 20 30 78 30 38 30 30 30 30 30 30 2c  CK = 0x08000000,
0390: 0a 09 53 53 41 5f 50 49 44 58 20 20 20 20 20 20  ..SSA_PIDX      
03a0: 20 20 20 20 20 20 3d 20 30 78 31 30 30 30 30 30        = 0x100000
03b0: 30 30 2c 0a 09 53 53 41 5f 4c 41 59 4f 55 54 52  00,..SSA_LAYOUTR
03c0: 54 4c 20 20 20 20 20 20 20 3d 20 30 78 32 30 30  TL       = 0x200
03d0: 30 30 30 30 30 2c 0a 09 53 53 41 5f 44 4f 4e 54  00000,..SSA_DONT
03e0: 47 4c 59 50 48 20 20 20 20 20 20 20 3d 20 30 78  GLYPH       = 0x
03f0: 34 30 30 30 30 30 30 30 2c 0a 09 53 53 41 5f 4e  40000000,..SSA_N
0400: 4f 4b 41 53 48 49 44 41 20 20 20 20 20 20 20 3d  OKASHIDA       =
0410: 20 30 78 38 30 30 30 30 30 30 30 2c 0a 7d 0a 0a   0x80000000,.}..
0420: 65 6e 75 6d 20 3a 20 44 57 4f 52 44 20 7b 0a 09  enum : DWORD {..
0430: 53 49 43 5f 43 4f 4d 50 4c 45 58 20 20 20 20 3d  SIC_COMPLEX    =
0440: 20 31 2c 0a 09 53 49 43 5f 41 53 43 49 49 44 49   1,..SIC_ASCIIDI
0450: 47 49 54 20 3d 20 32 2c 0a 09 53 49 43 5f 4e 45  GIT = 2,..SIC_NE
0460: 55 54 52 41 4c 20 20 20 20 3d 20 34 2c 0a 7d 0a  UTRAL    = 4,.}.
0470: 0a 65 6e 75 6d 20 3a 20 44 57 4f 52 44 20 7b 0a  .enum : DWORD {.
0480: 09 53 43 52 49 50 54 5f 44 49 47 49 54 53 55 42  .SCRIPT_DIGITSUB
0490: 53 54 49 54 55 54 45 5f 43 4f 4e 54 45 58 54 2c  STITUTE_CONTEXT,
04a0: 0a 09 53 43 52 49 50 54 5f 44 49 47 49 54 53 55  ..SCRIPT_DIGITSU
04b0: 42 53 54 49 54 55 54 45 5f 4e 4f 4e 45 2c 0a 09  BSTITUTE_NONE,..
04c0: 53 43 52 49 50 54 5f 44 49 47 49 54 53 55 42 53  SCRIPT_DIGITSUBS
04d0: 54 49 54 55 54 45 5f 4e 41 54 49 4f 4e 41 4c 2c  TITUTE_NATIONAL,
04e0: 0a 09 53 43 52 49 50 54 5f 44 49 47 49 54 53 55  ..SCRIPT_DIGITSU
04f0: 42 53 54 49 54 55 54 45 5f 54 52 41 44 49 54 49  BSTITUTE_TRADITI
0500: 4f 4e 41 4c 2c 0a 7d 0a 0a 65 6e 75 6d 20 53 43  ONAL,.}..enum SC
0510: 52 49 50 54 5f 4a 55 53 54 49 46 59 20 3a 20 57  RIPT_JUSTIFY : W
0520: 4f 52 44 20 7b 0a 20 20 20 20 53 43 52 49 50 54  ORD {.    SCRIPT
0530: 5f 4a 55 53 54 49 46 59 5f 4e 4f 4e 45 2c 0a 20  _JUSTIFY_NONE,. 
0540: 20 20 20 53 43 52 49 50 54 5f 4a 55 53 54 49 46     SCRIPT_JUSTIF
0550: 59 5f 41 52 41 42 49 43 5f 42 4c 41 4e 4b 2c 0a  Y_ARABIC_BLANK,.
0560: 20 20 20 20 53 43 52 49 50 54 5f 4a 55 53 54 49      SCRIPT_JUSTI
0570: 46 59 5f 43 48 41 52 41 43 54 45 52 2c 0a 20 20  FY_CHARACTER,.  
0580: 20 20 53 43 52 49 50 54 5f 4a 55 53 54 49 46 59    SCRIPT_JUSTIFY
0590: 5f 52 45 53 45 52 56 45 44 31 2c 0a 20 20 20 20  _RESERVED1,.    
05a0: 53 43 52 49 50 54 5f 4a 55 53 54 49 46 59 5f 42  SCRIPT_JUSTIFY_B
05b0: 4c 41 4e 4b 2c 0a 20 20 20 20 53 43 52 49 50 54  LANK,.    SCRIPT
05c0: 5f 4a 55 53 54 49 46 59 5f 52 45 53 45 52 56 45  _JUSTIFY_RESERVE
05d0: 44 32 2c 0a 20 20 20 20 53 43 52 49 50 54 5f 4a  D2,.    SCRIPT_J
05e0: 55 53 54 49 46 59 5f 52 45 53 45 52 56 45 44 33  USTIFY_RESERVED3
05f0: 2c 0a 20 20 20 20 53 43 52 49 50 54 5f 4a 55 53  ,.    SCRIPT_JUS
0600: 54 49 46 59 5f 41 52 41 42 49 43 5f 4e 4f 52 4d  TIFY_ARABIC_NORM
0610: 41 4c 2c 0a 20 20 20 20 53 43 52 49 50 54 5f 4a  AL,.    SCRIPT_J
0620: 55 53 54 49 46 59 5f 41 52 41 42 49 43 5f 4b 41  USTIFY_ARABIC_KA
0630: 53 48 49 44 41 2c 0a 20 20 20 20 53 43 52 49 50  SHIDA,.    SCRIP
0640: 54 5f 4a 55 53 54 49 46 59 5f 41 52 41 42 49 43  T_JUSTIFY_ARABIC
0650: 5f 41 4c 45 46 2c 0a 20 20 20 20 53 43 52 49 50  _ALEF,.    SCRIP
0660: 54 5f 4a 55 53 54 49 46 59 5f 41 52 41 42 49 43  T_JUSTIFY_ARABIC
0670: 5f 48 41 2c 0a 20 20 20 20 53 43 52 49 50 54 5f  _HA,.    SCRIPT_
0680: 4a 55 53 54 49 46 59 5f 41 52 41 42 49 43 5f 52  JUSTIFY_ARABIC_R
0690: 41 2c 0a 20 20 20 20 53 43 52 49 50 54 5f 4a 55  A,.    SCRIPT_JU
06a0: 53 54 49 46 59 5f 41 52 41 42 49 43 5f 42 41 2c  STIFY_ARABIC_BA,
06b0: 0a 20 20 20 20 53 43 52 49 50 54 5f 4a 55 53 54  .    SCRIPT_JUST
06c0: 49 46 59 5f 41 52 41 42 49 43 5f 42 41 52 41 2c  IFY_ARABIC_BARA,
06d0: 0a 20 20 20 20 53 43 52 49 50 54 5f 4a 55 53 54  .    SCRIPT_JUST
06e0: 49 46 59 5f 41 52 41 42 49 43 5f 53 45 45 4e 2c  IFY_ARABIC_SEEN,
06f0: 0a 20 20 20 20 53 43 52 49 50 54 5f 4a 55 53 54  .    SCRIPT_JUST
0700: 49 46 59 5f 41 52 41 42 49 43 5f 53 45 45 4e 5f  IFY_ARABIC_SEEN_
0710: 4d 2c 0a 7d 0a 0a 0a 0a 2f 2a 20 55 6e 69 73 63  M,.}..../* Unisc
0720: 72 69 62 65 20 53 74 72 75 63 74 75 72 65 73 0a  ribe Structures.
0730: 20 2a 20 68 74 74 70 3a 2f 2f 6d 73 64 6e 32 2e   * http://msdn2.
0740: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6c 69  microsoft.com/li
0750: 62 72 61 72 79 2f 6d 73 37 37 36 34 37 39 20 2a  brary/ms776479 *
0760: 2f 0a 0a 61 6c 69 61 73 20 76 6f 69 64 2a 20 53  /..alias void* S
0770: 43 52 49 50 54 5f 43 41 43 48 45 3b 0a 61 6c 69  CRIPT_CACHE;.ali
0780: 61 73 20 76 6f 69 64 2a 20 53 43 52 49 50 54 5f  as void* SCRIPT_
0790: 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49 53 3b  STRING_ANALYSIS;
07a0: 0a 0a 65 78 74 65 72 6e 20 28 43 29 0a 7b 0a 09  ..extern (C).{..
07b0: 73 74 72 75 63 74 20 53 43 52 49 50 54 5f 43 4f  struct SCRIPT_CO
07c0: 4e 54 52 4f 4c 0a 09 7b 0a 09 09 70 72 69 76 61  NTROL..{...priva
07d0: 74 65 20 44 57 4f 52 44 20 5f 62 69 74 66 69 65  te DWORD _bitfie
07e0: 6c 64 3b 0a 09 09 44 57 4f 52 44 20 75 44 65 66  ld;...DWORD uDef
07f0: 61 75 6c 74 4c 61 6e 67 75 61 67 65 28 29 20 20  aultLanguage()  
0800: 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74             { ret
0810: 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 20 3e  urn (_bitfield >
0820: 3e 20 30 29 20 26 20 30 78 46 46 46 46 3b 20 7d  > 0) & 0xFFFF; }
0830: 0a 09 09 44 57 4f 52 44 20 75 44 65 66 61 75 6c  ...DWORD uDefaul
0840: 74 4c 61 6e 67 75 61 67 65 28 44 57 4f 52 44 20  tLanguage(DWORD 
0850: 76 61 6c 29 20 20 20 20 7b 20 5f 62 69 74 66 69  val)    { _bitfi
0860: 65 6c 64 20 3d 20 63 61 73 74 28 44 57 4f 52 44  eld = cast(DWORD
0870: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
0880: 78 46 46 46 46 46 46 46 46 46 46 46 46 30 30 30  xFFFFFFFFFFFF000
0890: 30 29 20 7c 20 28 76 61 6c 20 3c 3c 20 30 29 29  0) | (val << 0))
08a0: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
08b0: 09 09 44 57 4f 52 44 20 66 43 6f 6e 74 65 78 74  ..DWORD fContext
08c0: 44 69 67 69 74 73 28 29 20 20 20 20 20 20 20 20  Digits()        
08d0: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
08e0: 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 31 36  (_bitfield >> 16
08f0: 29 20 26 20 30 78 31 3b 20 7d 0a 09 09 44 57 4f  ) & 0x1; }...DWO
0900: 52 44 20 66 43 6f 6e 74 65 78 74 44 69 67 69 74  RD fContextDigit
0910: 73 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20  s(DWORD val)    
0920: 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d 20    { _bitfield = 
0930: 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69  cast(DWORD)((_bi
0940: 74 66 69 65 6c 64 20 26 20 30 78 46 46 46 46 46  tfield & 0xFFFFF
0950: 46 46 46 46 46 46 45 46 46 46 46 29 20 7c 20 28  FFFFFFEFFFF) | (
0960: 76 61 6c 20 3c 3c 20 31 36 29 29 3b 20 72 65 74  val << 16)); ret
0970: 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 44 57 4f  urn val; }...DWO
0980: 52 44 20 66 49 6e 76 65 72 74 50 72 65 42 6f 75  RD fInvertPreBou
0990: 6e 64 44 69 72 28 29 20 20 20 20 20 20 20 20 20  ndDir()         
09a0: 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74    { return (_bit
09b0: 66 69 65 6c 64 20 3e 3e 20 31 37 29 20 26 20 30  field >> 17) & 0
09c0: 78 31 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66 49  x1; }...DWORD fI
09d0: 6e 76 65 72 74 50 72 65 42 6f 75 6e 64 44 69 72  nvertPreBoundDir
09e0: 28 44 57 4f 52 44 20 76 61 6c 29 20 20 7b 20 5f  (DWORD val)  { _
09f0: 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28  bitfield = cast(
0a00: 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  DWORD)((_bitfiel
0a10: 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  d & 0xFFFFFFFFFF
0a20: 46 44 46 46 46 46 29 20 7c 20 28 76 61 6c 20 3c  FDFFFF) | (val <
0a30: 3c 20 31 37 29 29 3b 20 72 65 74 75 72 6e 20 76  < 17)); return v
0a40: 61 6c 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66 49  al; }...DWORD fI
0a50: 6e 76 65 72 74 50 6f 73 74 42 6f 75 6e 64 44 69  nvertPostBoundDi
0a60: 72 28 29 20 20 20 20 20 20 20 20 20 20 7b 20 72  r()          { r
0a70: 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64  eturn (_bitfield
0a80: 20 3e 3e 20 31 38 29 20 26 20 30 78 31 3b 20 7d   >> 18) & 0x1; }
0a90: 0a 09 09 44 57 4f 52 44 20 66 49 6e 76 65 72 74  ...DWORD fInvert
0aa0: 50 6f 73 74 42 6f 75 6e 64 44 69 72 28 44 57 4f  PostBoundDir(DWO
0ab0: 52 44 20 76 61 6c 29 20 7b 20 5f 62 69 74 66 69  RD val) { _bitfi
0ac0: 65 6c 64 20 3d 20 63 61 73 74 28 44 57 4f 52 44  eld = cast(DWORD
0ad0: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
0ae0: 78 46 46 46 46 46 46 46 46 46 46 46 42 46 46 46  xFFFFFFFFFFFBFFF
0af0: 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 38 29  F) | (val << 18)
0b00: 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d  ); return val; }
0b10: 0a 09 09 44 57 4f 52 44 20 66 4c 69 6e 6b 53 74  ...DWORD fLinkSt
0b20: 72 69 6e 67 42 65 66 6f 72 65 28 29 20 20 20 20  ringBefore()    
0b30: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e          { return
0b40: 20 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 31   (_bitfield >> 1
0b50: 39 29 20 26 20 30 78 31 3b 20 7d 0a 09 09 44 57  9) & 0x1; }...DW
0b60: 4f 52 44 20 66 4c 69 6e 6b 53 74 72 69 6e 67 42  ORD fLinkStringB
0b70: 65 66 6f 72 65 28 44 57 4f 52 44 20 76 61 6c 29  efore(DWORD val)
0b80: 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d     { _bitfield =
0b90: 20 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62   cast(DWORD)((_b
0ba0: 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46 46  itfield & 0xFFFF
0bb0: 46 46 46 46 46 46 46 37 46 46 46 46 29 20 7c 20  FFFFFFF7FFFF) | 
0bc0: 28 76 61 6c 20 3c 3c 20 31 39 29 29 3b 20 72 65  (val << 19)); re
0bd0: 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 44 57  turn val; }...DW
0be0: 4f 52 44 20 66 4c 69 6e 6b 53 74 72 69 6e 67 41  ORD fLinkStringA
0bf0: 66 74 65 72 28 29 20 20 20 20 20 20 20 20 20 20  fter()          
0c00: 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69     { return (_bi
0c10: 74 66 69 65 6c 64 20 3e 3e 20 32 30 29 20 26 20  tfield >> 20) & 
0c20: 30 78 31 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66  0x1; }...DWORD f
0c30: 4c 69 6e 6b 53 74 72 69 6e 67 41 66 74 65 72 28  LinkStringAfter(
0c40: 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20 7b 20  DWORD val)    { 
0c50: 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74  _bitfield = cast
0c60: 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  (DWORD)((_bitfie
0c70: 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46  ld & 0xFFFFFFFFF
0c80: 46 45 46 46 46 46 46 29 20 7c 20 28 76 61 6c 20  FEFFFFF) | (val 
0c90: 3c 3c 20 32 30 29 29 3b 20 72 65 74 75 72 6e 20  << 20)); return 
0ca0: 76 61 6c 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66  val; }...DWORD f
0cb0: 4e 65 75 74 72 61 6c 4f 76 65 72 72 69 64 65 28  NeutralOverride(
0cc0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  )             { 
0cd0: 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c  return (_bitfiel
0ce0: 64 20 3e 3e 20 32 31 29 20 26 20 30 78 31 3b 20  d >> 21) & 0x1; 
0cf0: 7d 0a 09 09 44 57 4f 52 44 20 66 4e 65 75 74 72  }...DWORD fNeutr
0d00: 61 6c 4f 76 65 72 72 69 64 65 28 44 57 4f 52 44  alOverride(DWORD
0d10: 20 76 61 6c 29 20 20 20 20 7b 20 5f 62 69 74 66   val)    { _bitf
0d20: 69 65 6c 64 20 3d 20 63 61 73 74 28 44 57 4f 52  ield = cast(DWOR
0d30: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20  D)((_bitfield & 
0d40: 30 78 46 46 46 46 46 46 46 46 46 46 44 46 46 46  0xFFFFFFFFFFDFFF
0d50: 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 32 31  FF) | (val << 21
0d60: 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20  )); return val; 
0d70: 7d 0a 09 09 44 57 4f 52 44 20 66 4e 75 6d 65 72  }...DWORD fNumer
0d80: 69 63 4f 76 65 72 72 69 64 65 28 29 20 20 20 20  icOverride()    
0d90: 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72           { retur
0da0: 6e 20 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20  n (_bitfield >> 
0db0: 32 32 29 20 26 20 30 78 31 3b 20 7d 0a 09 09 44  22) & 0x1; }...D
0dc0: 57 4f 52 44 20 66 4e 75 6d 65 72 69 63 4f 76 65  WORD fNumericOve
0dd0: 72 72 69 64 65 28 44 57 4f 52 44 20 76 61 6c 29  rride(DWORD val)
0de0: 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20      { _bitfield 
0df0: 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f  = cast(DWORD)((_
0e00: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
0e10: 46 46 46 46 46 46 46 42 46 46 46 46 46 29 20 7c  FFFFFFFBFFFFF) |
0e20: 20 28 76 61 6c 20 3c 3c 20 32 32 29 29 3b 20 72   (val << 22)); r
0e30: 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 44  eturn val; }...D
0e40: 57 4f 52 44 20 66 4c 65 67 61 63 79 42 69 64 69  WORD fLegacyBidi
0e50: 43 6c 61 73 73 28 29 20 20 20 20 20 20 20 20 20  Class()         
0e60: 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62      { return (_b
0e70: 69 74 66 69 65 6c 64 20 3e 3e 20 32 33 29 20 26  itfield >> 23) &
0e80: 20 30 78 31 3b 20 7d 0a 09 09 44 57 4f 52 44 20   0x1; }...DWORD 
0e90: 66 4c 65 67 61 63 79 42 69 64 69 43 6c 61 73 73  fLegacyBidiClass
0ea0: 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20 7b  (DWORD val)    {
0eb0: 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73   _bitfield = cas
0ec0: 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69  t(DWORD)((_bitfi
0ed0: 65 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46  eld & 0xFFFFFFFF
0ee0: 46 46 37 46 46 46 46 46 29 20 7c 20 28 76 61 6c  FF7FFFFF) | (val
0ef0: 20 3c 3c 20 32 33 29 29 3b 20 72 65 74 75 72 6e   << 23)); return
0f00: 20 76 61 6c 3b 20 7d 0a 09 09 44 57 4f 52 44 20   val; }...DWORD 
0f10: 66 52 65 73 65 72 76 65 64 28 29 20 20 20 20 20  fReserved()     
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
0f30: 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65   return (_bitfie
0f40: 6c 64 20 3e 3e 20 32 34 29 20 26 20 30 78 46 46  ld >> 24) & 0xFF
0f50: 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66 52 65 73  ; }...DWORD fRes
0f60: 65 72 76 65 64 28 44 57 4f 52 44 20 76 61 6c 29  erved(DWORD val)
0f70: 20 20 20 20 20 20 20 20 20 20 20 7b 20 5f 62 69             { _bi
0f80: 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28 44 57  tfield = cast(DW
0f90: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
0fa0: 26 20 30 78 46 46 46 46 46 46 46 46 30 30 46 46  & 0xFFFFFFFF00FF
0fb0: 46 46 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20  FFFF) | (val << 
0fc0: 32 34 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c  24)); return val
0fd0: 3b 20 7d 0a 09 7d 0a 0a 09 73 74 72 75 63 74 20  ; }..}...struct 
0fe0: 53 43 52 49 50 54 5f 53 54 41 54 45 0a 09 7b 0a  SCRIPT_STATE..{.
0ff0: 09 09 70 72 69 76 61 74 65 20 57 4f 52 44 20 5f  ..private WORD _
1000: 62 69 74 66 69 65 6c 64 3b 0a 09 09 57 4f 52 44  bitfield;...WORD
1010: 20 75 42 69 64 69 4c 65 76 65 6c 28 29 20 20 20   uBidiLevel()   
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
1030: 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44  return cast(WORD
1040: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20  )((_bitfield >> 
1050: 30 29 20 26 20 30 78 31 46 29 3b 20 7d 0a 09 09  0) & 0x1F); }...
1060: 57 4f 52 44 20 75 42 69 64 69 4c 65 76 65 6c 28  WORD uBidiLevel(
1070: 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20 20  WORD val)       
1080: 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d 20    { _bitfield = 
1090: 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74  cast(WORD)((_bit
10a0: 66 69 65 6c 64 20 26 20 30 78 46 46 46 46 46 46  field & 0xFFFFFF
10b0: 46 46 46 46 46 46 46 46 45 30 29 20 7c 20 28 76  FFFFFFFFE0) | (v
10c0: 61 6c 20 3c 3c 20 30 29 29 3b 20 72 65 74 75 72  al << 0)); retur
10d0: 6e 20 76 61 6c 3b 20 7d 0a 09 09 57 4f 52 44 20  n val; }...WORD 
10e0: 66 4f 76 65 72 72 69 64 65 44 69 72 65 63 74 69  fOverrideDirecti
10f0: 6f 6e 28 29 20 20 20 20 20 20 20 20 20 7b 20 72  on()         { r
1100: 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44 29  eturn cast(WORD)
1110: 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 35  ((_bitfield >> 5
1120: 29 20 26 20 30 78 31 29 3b 20 7d 0a 09 09 57 4f  ) & 0x1); }...WO
1130: 52 44 20 66 4f 76 65 72 72 69 64 65 44 69 72 65  RD fOverrideDire
1140: 63 74 69 6f 6e 28 57 4f 52 44 20 76 61 6c 29 20  ction(WORD val) 
1150: 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61  { _bitfield = ca
1160: 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69  st(WORD)((_bitfi
1170: 65 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46  eld & 0xFFFFFFFF
1180: 46 46 46 46 46 46 44 46 29 20 7c 20 28 76 61 6c  FFFFFFDF) | (val
1190: 20 3c 3c 20 35 29 29 3b 20 72 65 74 75 72 6e 20   << 5)); return 
11a0: 76 61 6c 3b 20 7d 0a 09 09 57 4f 52 44 20 66 49  val; }...WORD fI
11b0: 6e 68 69 62 69 74 53 79 6d 53 77 61 70 28 29 20  nhibitSymSwap() 
11c0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74             { ret
11d0: 75 72 6e 20 63 61 73 74 28 57 4f 52 44 29 28 28  urn cast(WORD)((
11e0: 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 36 29 20  _bitfield >> 6) 
11f0: 26 20 30 78 31 29 3b 20 7d 0a 09 09 57 4f 52 44  & 0x1); }...WORD
1200: 20 66 49 6e 68 69 62 69 74 53 79 6d 53 77 61 70   fInhibitSymSwap
1210: 28 57 4f 52 44 20 76 61 6c 29 20 20 20 20 7b 20  (WORD val)    { 
1220: 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74  _bitfield = cast
1230: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1240: 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  d & 0xFFFFFFFFFF
1250: 46 46 46 46 42 46 29 20 7c 20 28 76 61 6c 20 3c  FFFFBF) | (val <
1260: 3c 20 36 29 29 3b 20 72 65 74 75 72 6e 20 76 61  < 6)); return va
1270: 6c 3b 20 7d 0a 09 09 57 4f 52 44 20 66 43 68 61  l; }...WORD fCha
1280: 72 53 68 61 70 65 28 29 20 20 20 20 20 20 20 20  rShape()        
1290: 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72           { retur
12a0: 6e 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62  n cast(WORD)((_b
12b0: 69 74 66 69 65 6c 64 20 3e 3e 20 37 29 20 26 20  itfield >> 7) & 
12c0: 30 78 31 29 3b 20 7d 0a 09 09 57 4f 52 44 20 66  0x1); }...WORD f
12d0: 43 68 61 72 53 68 61 70 65 28 57 4f 52 44 20 76  CharShape(WORD v
12e0: 61 6c 29 20 20 20 20 20 20 20 20 20 7b 20 5f 62  al)         { _b
12f0: 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28 57  itfield = cast(W
1300: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
1310: 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46 46  & 0xFFFFFFFFFFFF
1320: 46 46 37 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20  FF7F) | (val << 
1330: 37 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b  7)); return val;
1340: 20 7d 0a 09 09 57 4f 52 44 20 66 44 69 67 69 74   }...WORD fDigit
1350: 53 75 62 73 74 69 74 75 74 65 28 29 20 20 20 20  Substitute()    
1360: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
1370: 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74  cast(WORD)((_bit
1380: 66 69 65 6c 64 20 3e 3e 20 38 29 20 26 20 30 78  field >> 8) & 0x
1390: 31 29 3b 20 7d 0a 09 09 57 4f 52 44 20 66 44 69  1); }...WORD fDi
13a0: 67 69 74 53 75 62 73 74 69 74 75 74 65 28 57 4f  gitSubstitute(WO
13b0: 52 44 20 76 61 6c 29 20 20 20 7b 20 5f 62 69 74  RD val)   { _bit
13c0: 66 69 65 6c 64 20 3d 20 63 61 73 74 28 57 4f 52  field = cast(WOR
13d0: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20  D)((_bitfield & 
13e0: 30 78 46 46 46 46 46 46 46 46 46 46 46 46 46 45  0xFFFFFFFFFFFFFE
13f0: 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 38 29  FF) | (val << 8)
1400: 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d  ); return val; }
1410: 0a 09 09 57 4f 52 44 20 66 49 6e 68 69 62 69 74  ...WORD fInhibit
1420: 4c 69 67 61 74 65 28 29 20 20 20 20 20 20 20 20  Ligate()        
1430: 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61       { return ca
1440: 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69  st(WORD)((_bitfi
1450: 65 6c 64 20 3e 3e 20 39 29 20 26 20 30 78 31 29  eld >> 9) & 0x1)
1460: 3b 20 7d 0a 09 09 57 4f 52 44 20 66 49 6e 68 69  ; }...WORD fInhi
1470: 62 69 74 4c 69 67 61 74 65 28 57 4f 52 44 20 76  bitLigate(WORD v
1480: 61 6c 29 20 20 20 20 20 7b 20 5f 62 69 74 66 69  al)     { _bitfi
1490: 65 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29  eld = cast(WORD)
14a0: 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78  ((_bitfield & 0x
14b0: 46 46 46 46 46 46 46 46 46 46 46 46 46 44 46 46  FFFFFFFFFFFFFDFF
14c0: 29 20 7c 20 28 76 61 6c 20 3c 3c 20 39 29 29 3b  ) | (val << 9));
14d0: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09   return val; }..
14e0: 09 57 4f 52 44 20 66 44 69 73 70 6c 61 79 5a 57  .WORD fDisplayZW
14f0: 47 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  G()             
1500: 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74     { return cast
1510: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1520: 64 20 3e 3e 20 31 30 29 20 26 20 30 78 31 29 3b  d >> 10) & 0x1);
1530: 20 7d 0a 09 09 57 4f 52 44 20 66 44 69 73 70 6c   }...WORD fDispl
1540: 61 79 5a 57 47 28 57 4f 52 44 20 76 61 6c 29 20  ayZWG(WORD val) 
1550: 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65         { _bitfie
1560: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
1570: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
1580: 46 46 46 46 46 46 46 46 46 46 46 46 42 46 46 29  FFFFFFFFFFFFBFF)
1590: 20 7c 20 28 76 61 6c 20 3c 3c 20 31 30 29 29 3b   | (val << 10));
15a0: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09   return val; }..
15b0: 09 57 4f 52 44 20 66 41 72 61 62 69 63 4e 75 6d  .WORD fArabicNum
15c0: 43 6f 6e 74 65 78 74 28 29 20 20 20 20 20 20 20  Context()       
15d0: 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74     { return cast
15e0: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
15f0: 64 20 3e 3e 20 31 31 29 20 26 20 30 78 31 29 3b  d >> 11) & 0x1);
1600: 20 7d 0a 09 09 57 4f 52 44 20 66 41 72 61 62 69   }...WORD fArabi
1610: 63 4e 75 6d 43 6f 6e 74 65 78 74 28 57 4f 52 44  cNumContext(WORD
1620: 20 76 61 6c 29 20 20 7b 20 5f 62 69 74 66 69 65   val)  { _bitfie
1630: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
1640: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
1650: 46 46 46 46 46 46 46 46 46 46 46 46 37 46 46 29  FFFFFFFFFFFF7FF)
1660: 20 7c 20 28 76 61 6c 20 3c 3c 20 31 31 29 29 3b   | (val << 11));
1670: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09   return val; }..
1680: 09 57 4f 52 44 20 66 47 63 70 43 6c 75 73 74 65  .WORD fGcpCluste
1690: 72 73 28 29 20 20 20 20 20 20 20 20 20 20 20 20  rs()            
16a0: 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74     { return cast
16b0: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
16c0: 64 20 3e 3e 20 31 32 29 20 26 20 30 78 31 29 3b  d >> 12) & 0x1);
16d0: 20 7d 0a 09 09 57 4f 52 44 20 66 47 63 70 43 6c   }...WORD fGcpCl
16e0: 75 73 74 65 72 73 28 57 4f 52 44 20 76 61 6c 29  usters(WORD val)
16f0: 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65         { _bitfie
1700: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
1710: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
1720: 46 46 46 46 46 46 46 46 46 46 46 45 46 46 46 29  FFFFFFFFFFFEFFF)
1730: 20 7c 20 28 76 61 6c 20 3c 3c 20 31 32 29 29 3b   | (val << 12));
1740: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09   return val; }..
1750: 09 57 4f 52 44 20 66 52 65 73 65 72 76 65 64 28  .WORD fReserved(
1760: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1770: 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74     { return cast
1780: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1790: 64 20 3e 3e 20 31 33 29 20 26 20 30 78 31 29 3b  d >> 13) & 0x1);
17a0: 20 7d 0a 09 09 57 4f 52 44 20 66 52 65 73 65 72   }...WORD fReser
17b0: 76 65 64 28 57 4f 52 44 20 76 61 6c 29 20 20 20  ved(WORD val)   
17c0: 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65         { _bitfie
17d0: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
17e0: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
17f0: 46 46 46 46 46 46 46 46 46 46 46 44 46 46 46 29  FFFFFFFFFFFDFFF)
1800: 20 7c 20 28 76 61 6c 20 3c 3c 20 31 33 29 29 3b   | (val << 13));
1810: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09   return val; }..
1820: 09 57 4f 52 44 20 66 45 6e 67 69 6e 65 52 65 73  .WORD fEngineRes
1830: 65 72 76 65 64 28 29 20 20 20 20 20 20 20 20 20  erved()         
1840: 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73 74     { return cast
1850: 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  (WORD)((_bitfiel
1860: 64 20 3e 3e 20 31 34 29 20 26 20 30 78 33 29 3b  d >> 14) & 0x3);
1870: 20 7d 0a 09 09 57 4f 52 44 20 66 45 6e 67 69 6e   }...WORD fEngin
1880: 65 52 65 73 65 72 76 65 64 28 57 4f 52 44 20 76  eReserved(WORD v
1890: 61 6c 29 20 20 20 20 7b 20 5f 62 69 74 66 69 65  al)    { _bitfie
18a0: 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28  ld = cast(WORD)(
18b0: 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78 46  (_bitfield & 0xF
18c0: 46 46 46 46 46 46 46 46 46 46 46 33 46 46 46 29  FFFFFFFFFFF3FFF)
18d0: 20 7c 20 28 76 61 6c 20 3c 3c 20 31 34 29 29 3b   | (val << 14));
18e0: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09   return val; }..
18f0: 7d 0a 0a 0a 09 73 74 72 75 63 74 20 53 43 52 49  }....struct SCRI
1900: 50 54 5f 41 4e 41 4c 59 53 49 53 0a 09 7b 0a 09  PT_ANALYSIS..{..
1910: 09 70 72 69 76 61 74 65 20 57 4f 52 44 20 5f 62  .private WORD _b
1920: 69 74 66 69 65 6c 64 3b 0a 09 09 57 4f 52 44 20  itfield;...WORD 
1930: 65 53 63 72 69 70 74 28 29 20 20 20 20 20 20 20  eScript()       
1940: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e          { return
1950: 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69   cast(WORD)((_bi
1960: 74 66 69 65 6c 64 20 3e 3e 20 30 29 20 26 20 30  tfield >> 0) & 0
1970: 78 33 46 46 29 3b 20 7d 0a 09 09 57 4f 52 44 20  x3FF); }...WORD 
1980: 65 53 63 72 69 70 74 28 57 4f 52 44 20 76 61 6c  eScript(WORD val
1990: 29 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69  )       { _bitfi
19a0: 65 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44 29  eld = cast(WORD)
19b0: 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30 78  ((_bitfield & 0x
19c0: 46 46 46 46 46 46 46 46 46 46 46 46 46 43 30 30  FFFFFFFFFFFFFC00
19d0: 29 20 7c 20 28 76 61 6c 20 3c 3c 20 30 29 29 3b  ) | (val << 0));
19e0: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09   return val; }..
19f0: 09 57 4f 52 44 20 66 52 54 4c 28 29 20 20 20 20  .WORD fRTL()    
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
1a10: 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44  return cast(WORD
1a20: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20  )((_bitfield >> 
1a30: 31 30 29 20 26 20 30 78 31 29 3b 20 7d 0a 09 09  10) & 0x1); }...
1a40: 57 4f 52 44 20 66 52 54 4c 28 57 4f 52 44 20 76  WORD fRTL(WORD v
1a50: 61 6c 29 20 20 20 20 20 20 20 20 20 20 7b 20 5f  al)          { _
1a60: 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28  bitfield = cast(
1a70: 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64  WORD)((_bitfield
1a80: 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46   & 0xFFFFFFFFFFF
1a90: 46 46 42 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c  FFBFF) | (val <<
1aa0: 20 31 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61   10)); return va
1ab0: 6c 3b 20 7d 0a 09 09 57 4f 52 44 20 66 4c 61 79  l; }...WORD fLay
1ac0: 6f 75 74 52 54 4c 28 29 20 20 20 20 20 20 20 20  outRTL()        
1ad0: 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73      { return cas
1ae0: 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  t(WORD)((_bitfie
1af0: 6c 64 20 3e 3e 20 31 31 29 20 26 20 30 78 31 29  ld >> 11) & 0x1)
1b00: 3b 20 7d 0a 09 09 57 4f 52 44 20 66 4c 61 79 6f  ; }...WORD fLayo
1b10: 75 74 52 54 4c 28 57 4f 52 44 20 76 61 6c 29 20  utRTL(WORD val) 
1b20: 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d     { _bitfield =
1b30: 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69   cast(WORD)((_bi
1b40: 74 66 69 65 6c 64 20 26 20 30 78 46 46 46 46 46  tfield & 0xFFFFF
1b50: 46 46 46 46 46 46 46 46 37 46 46 29 20 7c 20 28  FFFFFFFF7FF) | (
1b60: 76 61 6c 20 3c 3c 20 31 31 29 29 3b 20 72 65 74  val << 11)); ret
1b70: 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 57 4f 52  urn val; }...WOR
1b80: 44 20 66 4c 69 6e 6b 42 65 66 6f 72 65 28 29 20  D fLinkBefore() 
1b90: 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75            { retu
1ba0: 72 6e 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f  rn cast(WORD)((_
1bb0: 62 69 74 66 69 65 6c 64 20 3e 3e 20 31 32 29 20  bitfield >> 12) 
1bc0: 26 20 30 78 31 29 3b 20 7d 0a 09 09 57 4f 52 44  & 0x1); }...WORD
1bd0: 20 66 4c 69 6e 6b 42 65 66 6f 72 65 28 57 4f 52   fLinkBefore(WOR
1be0: 44 20 76 61 6c 29 20 20 20 7b 20 5f 62 69 74 66  D val)   { _bitf
1bf0: 69 65 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44  ield = cast(WORD
1c00: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
1c10: 78 46 46 46 46 46 46 46 46 46 46 46 46 45 46 46  xFFFFFFFFFFFFEFF
1c20: 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 32 29  F) | (val << 12)
1c30: 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d  ); return val; }
1c40: 0a 09 09 57 4f 52 44 20 66 4c 69 6e 6b 41 66 74  ...WORD fLinkAft
1c50: 65 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20  er()            
1c60: 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f  { return cast(WO
1c70: 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e  RD)((_bitfield >
1c80: 3e 20 31 33 29 20 26 20 30 78 31 29 3b 20 7d 0a  > 13) & 0x1); }.
1c90: 09 09 57 4f 52 44 20 66 4c 69 6e 6b 41 66 74 65  ..WORD fLinkAfte
1ca0: 72 28 57 4f 52 44 20 76 61 6c 29 20 20 20 20 7b  r(WORD val)    {
1cb0: 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73   _bitfield = cas
1cc0: 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  t(WORD)((_bitfie
1cd0: 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46  ld & 0xFFFFFFFFF
1ce0: 46 46 46 44 46 46 46 29 20 7c 20 28 76 61 6c 20  FFFDFFF) | (val 
1cf0: 3c 3c 20 31 33 29 29 3b 20 72 65 74 75 72 6e 20  << 13)); return 
1d00: 76 61 6c 3b 20 7d 0a 09 09 57 4f 52 44 20 66 4c  val; }...WORD fL
1d10: 6f 67 69 63 61 6c 4f 72 64 65 72 28 29 20 20 20  ogicalOrder()   
1d20: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63        { return c
1d30: 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66  ast(WORD)((_bitf
1d40: 69 65 6c 64 20 3e 3e 20 31 34 29 20 26 20 30 78  ield >> 14) & 0x
1d50: 31 29 3b 20 7d 0a 09 09 57 4f 52 44 20 66 4c 6f  1); }...WORD fLo
1d60: 67 69 63 61 6c 4f 72 64 65 72 28 57 4f 52 44 20  gicalOrder(WORD 
1d70: 76 61 6c 29 20 7b 20 5f 62 69 74 66 69 65 6c 64  val) { _bitfield
1d80: 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f   = cast(WORD)((_
1d90: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
1da0: 46 46 46 46 46 46 46 46 46 42 46 46 46 29 20 7c  FFFFFFFFFBFFF) |
1db0: 20 28 76 61 6c 20 3c 3c 20 31 34 29 29 3b 20 72   (val << 14)); r
1dc0: 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 57  eturn val; }...W
1dd0: 4f 52 44 20 66 4e 6f 47 6c 79 70 68 49 6e 64 65  ORD fNoGlyphInde
1de0: 78 28 29 20 20 20 20 20 20 20 20 20 7b 20 72 65  x()         { re
1df0: 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44 29 28  turn cast(WORD)(
1e00: 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 31 35  (_bitfield >> 15
1e10: 29 20 26 20 30 78 31 29 3b 20 7d 0a 09 09 57 4f  ) & 0x1); }...WO
1e20: 52 44 20 66 4e 6f 47 6c 79 70 68 49 6e 64 65 78  RD fNoGlyphIndex
1e30: 28 57 4f 52 44 20 76 61 6c 29 20 7b 20 5f 62 69  (WORD val) { _bi
1e40: 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28 57 4f  tfield = cast(WO
1e50: 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26  RD)((_bitfield &
1e60: 20 30 78 46 46 46 46 46 46 46 46 46 46 46 46 37   0xFFFFFFFFFFFF7
1e70: 46 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31  FFF) | (val << 1
1e80: 35 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b  5)); return val;
1e90: 20 7d 0a 09 09 53 43 52 49 50 54 5f 53 54 41 54   }...SCRIPT_STAT
1ea0: 45 20 73 3b 0a 09 7d 0a 0a 0a 09 73 74 72 75 63  E s;..}....struc
1eb0: 74 20 53 43 52 49 50 54 5f 49 54 45 4d 0a 09 7b  t SCRIPT_ITEM..{
1ec0: 0a 09 09 69 6e 74 20 69 43 68 61 72 50 6f 73 3b  ...int iCharPos;
1ed0: 0a 09 09 53 43 52 49 50 54 5f 41 4e 41 4c 59 53  ...SCRIPT_ANALYS
1ee0: 49 53 20 61 3b 0a 09 7d 0a 0a 09 73 74 72 75 63  IS a;..}...struc
1ef0: 74 20 53 43 52 49 50 54 5f 56 49 53 41 54 54 52  t SCRIPT_VISATTR
1f00: 0a 09 7b 0a 09 09 70 72 69 76 61 74 65 20 57 4f  ..{...private WO
1f10: 52 44 20 5f 62 69 74 66 69 65 6c 64 3b 0a 09 09  RD _bitfield;...
1f20: 57 4f 52 44 20 75 4a 75 73 74 69 66 69 63 61 74  WORD uJustificat
1f30: 69 6f 6e 28 29 20 20 20 20 20 20 20 20 20 7b 20  ion()         { 
1f40: 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44  return cast(WORD
1f50: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20  )((_bitfield >> 
1f60: 30 29 20 26 20 30 78 46 29 3b 20 7d 0a 09 09 57  0) & 0xF); }...W
1f70: 4f 52 44 20 75 4a 75 73 74 69 66 69 63 61 74 69  ORD uJustificati
1f80: 6f 6e 28 57 4f 52 44 20 76 61 6c 29 20 7b 20 5f  on(WORD val) { _
1f90: 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28  bitfield = cast(
1fa0: 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64  WORD)((_bitfield
1fb0: 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46   & 0xFFFFFFFFFFF
1fc0: 46 46 46 46 30 29 20 7c 20 28 76 61 6c 20 3c 3c  FFFF0) | (val <<
1fd0: 20 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c   0)); return val
1fe0: 3b 20 7d 0a 09 09 57 4f 52 44 20 66 43 6c 75 73  ; }...WORD fClus
1ff0: 74 65 72 53 74 61 72 74 28 29 20 20 20 20 20 20  terStart()      
2000: 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63 61 73      { return cas
2010: 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  t(WORD)((_bitfie
2020: 6c 64 20 3e 3e 20 34 29 20 26 20 30 78 31 29 3b  ld >> 4) & 0x1);
2030: 20 7d 0a 09 09 57 4f 52 44 20 66 43 6c 75 73 74   }...WORD fClust
2040: 65 72 53 74 61 72 74 28 57 4f 52 44 20 76 61 6c  erStart(WORD val
2050: 29 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 20 3d  )  { _bitfield =
2060: 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69   cast(WORD)((_bi
2070: 74 66 69 65 6c 64 20 26 20 30 78 46 46 46 46 46  tfield & 0xFFFFF
2080: 46 46 46 46 46 46 46 46 46 45 46 29 20 7c 20 28  FFFFFFFFFEF) | (
2090: 76 61 6c 20 3c 3c 20 34 29 29 3b 20 72 65 74 75  val << 4)); retu
20a0: 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 57 4f 52 44  rn val; }...WORD
20b0: 20 66 44 69 61 63 72 69 74 69 63 28 29 20 20 20   fDiacritic()   
20c0: 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75            { retu
20d0: 72 6e 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f  rn cast(WORD)((_
20e0: 62 69 74 66 69 65 6c 64 20 3e 3e 20 35 29 20 26  bitfield >> 5) &
20f0: 20 30 78 31 29 3b 20 7d 0a 09 09 57 4f 52 44 20   0x1); }...WORD 
2100: 66 44 69 61 63 72 69 74 69 63 28 57 4f 52 44 20  fDiacritic(WORD 
2110: 76 61 6c 29 20 20 20 20 20 7b 20 5f 62 69 74 66  val)     { _bitf
2120: 69 65 6c 64 20 3d 20 63 61 73 74 28 57 4f 52 44  ield = cast(WORD
2130: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
2140: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 44  xFFFFFFFFFFFFFFD
2150: 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 35 29 29  F) | (val << 5))
2160: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
2170: 09 09 57 4f 52 44 20 66 5a 65 72 6f 57 69 64 74  ..WORD fZeroWidt
2180: 68 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  h()             
2190: 7b 20 72 65 74 75 72 6e 20 63 61 73 74 28 57 4f  { return cast(WO
21a0: 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20 3e  RD)((_bitfield >
21b0: 3e 20 36 29 20 26 20 30 78 31 29 3b 20 7d 0a 09  > 6) & 0x1); }..
21c0: 09 57 4f 52 44 20 66 5a 65 72 6f 57 69 64 74 68  .WORD fZeroWidth
21d0: 28 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 7b  (WORD val)     {
21e0: 20 5f 62 69 74 66 69 65 6c 64 20 3d 20 63 61 73   _bitfield = cas
21f0: 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  t(WORD)((_bitfie
2200: 6c 64 20 26 20 30 78 46 46 46 46 46 46 46 46 46  ld & 0xFFFFFFFFF
2210: 46 46 46 46 46 42 46 29 20 7c 20 28 76 61 6c 20  FFFFFBF) | (val 
2220: 3c 3c 20 36 29 29 3b 20 72 65 74 75 72 6e 20 76  << 6)); return v
2230: 61 6c 3b 20 7d 0a 09 09 57 4f 52 44 20 66 52 65  al; }...WORD fRe
2240: 73 65 72 76 65 64 28 29 20 20 20 20 20 20 20 20  served()        
2250: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 63        { return c
2260: 61 73 74 28 57 4f 52 44 29 28 28 5f 62 69 74 66  ast(WORD)((_bitf
2270: 69 65 6c 64 20 3e 3e 20 37 29 20 26 20 30 78 31  ield >> 7) & 0x1
2280: 29 3b 20 7d 0a 09 09 57 4f 52 44 20 66 52 65 73  ); }...WORD fRes
2290: 65 72 76 65 64 28 57 4f 52 44 20 76 61 6c 29 20  erved(WORD val) 
22a0: 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64       { _bitfield
22b0: 20 3d 20 63 61 73 74 28 57 4f 52 44 29 28 28 5f   = cast(WORD)((_
22c0: 62 69 74 66 69 65 6c 64 20 26 20 30 78 46 46 46  bitfield & 0xFFF
22d0: 46 46 46 46 46 46 46 46 46 46 46 37 46 29 20 7c  FFFFFFFFFFF7F) |
22e0: 20 28 76 61 6c 20 3c 3c 20 37 29 29 3b 20 72 65   (val << 7)); re
22f0: 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 57 4f  turn val; }...WO
2300: 52 44 20 66 53 68 61 70 65 52 65 73 65 72 76 65  RD fShapeReserve
2310: 64 28 29 20 20 20 20 20 20 20 20 20 7b 20 72 65  d()         { re
2320: 74 75 72 6e 20 63 61 73 74 28 57 4f 52 44 29 28  turn cast(WORD)(
2330: 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 38 29  (_bitfield >> 8)
2340: 20 26 20 30 78 46 46 29 3b 20 7d 0a 09 09 57 4f   & 0xFF); }...WO
2350: 52 44 20 66 53 68 61 70 65 52 65 73 65 72 76 65  RD fShapeReserve
2360: 64 28 57 4f 52 44 20 76 61 6c 29 20 7b 20 5f 62  d(WORD val) { _b
2370: 69 74 66 69 65 6c 64 20 3d 20 63 61 73 74 28 57  itfield = cast(W
2380: 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 20  ORD)((_bitfield 
2390: 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46 46  & 0xFFFFFFFFFFFF
23a0: 30 30 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20  00FF) | (val << 
23b0: 38 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b  8)); return val;
23c0: 20 7d 0a 09 7d 0a 0a 09 73 74 72 75 63 74 20 47   }..}...struct G
23d0: 4f 46 46 53 45 54 0a 09 7b 0a 09 09 4c 4f 4e 47  OFFSET..{...LONG
23e0: 20 64 75 3b 0a 09 09 4c 4f 4e 47 20 64 76 3b 0a   du;...LONG dv;.
23f0: 09 7d 0a 0a 09 73 74 72 75 63 74 20 53 43 52 49  .}...struct SCRI
2400: 50 54 5f 4c 4f 47 41 54 54 52 0a 09 7b 0a 09 09  PT_LOGATTR..{...
2410: 42 59 54 45 20 5f 62 69 74 66 69 65 6c 64 3b 0a  BYTE _bitfield;.
2420: 09 09 42 59 54 45 20 66 53 6f 66 74 42 72 65 61  ..BYTE fSoftBrea
2430: 6b 28 29 20 20 20 20 20 20 20 20 20 20 7b 20 72  k()          { r
2440: 65 74 75 72 6e 20 63 61 73 74 28 42 59 54 45 29  eturn cast(BYTE)
2450: 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 30  ((_bitfield >> 0
2460: 29 20 26 20 30 78 31 29 3b 20 7d 0a 09 09 42 59  ) & 0x1); }...BY
2470: 54 45 20 66 53 6f 66 74 42 72 65 61 6b 28 42 59  TE fSoftBreak(BY
2480: 54 45 20 76 61 6c 29 20 20 7b 20 5f 62 69 74 66  TE val)  { _bitf
2490: 69 65 6c 64 20 3d 20 63 61 73 74 28 42 59 54 45  ield = cast(BYTE
24a0: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
24b0: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  xFFFFFFFFFFFFFFF
24c0: 45 29 20 7c 20 28 76 61 6c 20 3c 3c 20 30 29 29  E) | (val << 0))
24d0: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
24e0: 09 09 42 59 54 45 20 66 57 68 69 74 65 53 70 61  ..BYTE fWhiteSpa
24f0: 63 65 28 29 20 20 20 20 20 20 20 20 20 7b 20 72  ce()         { 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 31  ((_bitfield >> 1
2520: 29 20 26 20 30 78 31 29 3b 20 7d 0a 09 09 42 59  ) & 0x1); }...BY
2530: 54 45 20 66 57 68 69 74 65 53 70 61 63 65 28 42  TE fWhiteSpace(B
2540: 59 54 45 20 76 61 6c 29 20 7b 20 5f 62 69 74 66  YTE val) { _bitf
2550: 69 65 6c 64 20 3d 20 63 61 73 74 28 42 59 54 45  ield = cast(BYTE
2560: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
2570: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  xFFFFFFFFFFFFFFF
2580: 44 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 29 29  D) | (val << 1))
2590: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
25a0: 09 09 42 59 54 45 20 66 43 68 61 72 53 74 6f 70  ..BYTE fCharStop
25b0: 28 29 20 20 20 20 20 20 20 20 20 20 20 7b 20 72  ()           { r
25c0: 65 74 75 72 6e 20 63 61 73 74 28 42 59 54 45 29  eturn cast(BYTE)
25d0: 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 32  ((_bitfield >> 2
25e0: 29 20 26 20 30 78 31 29 3b 20 7d 0a 09 09 42 59  ) & 0x1); }...BY
25f0: 54 45 20 66 43 68 61 72 53 74 6f 70 28 42 59 54  TE fCharStop(BYT
2600: 45 20 76 61 6c 29 20 20 20 7b 20 5f 62 69 74 66  E val)   { _bitf
2610: 69 65 6c 64 20 3d 20 63 61 73 74 28 42 59 54 45  ield = cast(BYTE
2620: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
2630: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  xFFFFFFFFFFFFFFF
2640: 42 29 20 7c 20 28 76 61 6c 20 3c 3c 20 32 29 29  B) | (val << 2))
2650: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
2660: 09 09 42 59 54 45 20 66 57 6f 72 64 53 74 6f 70  ..BYTE fWordStop
2670: 28 29 20 20 20 20 20 20 20 20 20 20 20 7b 20 72  ()           { r
2680: 65 74 75 72 6e 20 63 61 73 74 28 42 59 54 45 29  eturn cast(BYTE)
2690: 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 33  ((_bitfield >> 3
26a0: 29 20 26 20 30 78 31 29 3b 20 7d 0a 09 09 42 59  ) & 0x1); }...BY
26b0: 54 45 20 66 57 6f 72 64 53 74 6f 70 28 42 59 54  TE fWordStop(BYT
26c0: 45 20 76 61 6c 29 20 20 20 7b 20 5f 62 69 74 66  E val)   { _bitf
26d0: 69 65 6c 64 20 3d 20 63 61 73 74 28 42 59 54 45  ield = cast(BYTE
26e0: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
26f0: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46  xFFFFFFFFFFFFFFF
2700: 37 29 20 7c 20 28 76 61 6c 20 3c 3c 20 33 29 29  7) | (val << 3))
2710: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
2720: 09 09 42 59 54 45 20 66 49 6e 76 61 6c 69 64 28  ..BYTE fInvalid(
2730: 29 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72  )            { r
2740: 65 74 75 72 6e 20 63 61 73 74 28 42 59 54 45 29  eturn cast(BYTE)
2750: 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 34  ((_bitfield >> 4
2760: 29 20 26 20 30 78 31 29 3b 20 7d 0a 09 09 42 59  ) & 0x1); }...BY
2770: 54 45 20 66 49 6e 76 61 6c 69 64 28 42 59 54 45  TE fInvalid(BYTE
2780: 20 76 61 6c 29 20 20 20 20 7b 20 5f 62 69 74 66   val)    { _bitf
2790: 69 65 6c 64 20 3d 20 63 61 73 74 28 42 59 54 45  ield = cast(BYTE
27a0: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
27b0: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 45  xFFFFFFFFFFFFFFE
27c0: 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 34 29 29  F) | (val << 4))
27d0: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
27e0: 09 09 42 59 54 45 20 66 52 65 73 65 72 76 65 64  ..BYTE fReserved
27f0: 28 29 20 20 20 20 20 20 20 20 20 20 20 7b 20 72  ()           { r
2800: 65 74 75 72 6e 20 63 61 73 74 28 42 59 54 45 29  eturn cast(BYTE)
2810: 28 28 5f 62 69 74 66 69 65 6c 64 20 3e 3e 20 35  ((_bitfield >> 5
2820: 29 20 26 20 30 78 37 29 3b 20 7d 0a 09 09 42 59  ) & 0x7); }...BY
2830: 54 45 20 66 52 65 73 65 72 76 65 64 28 42 59 54  TE fReserved(BYT
2840: 45 20 76 61 6c 29 20 20 20 7b 20 5f 62 69 74 66  E val)   { _bitf
2850: 69 65 6c 64 20 3d 20 63 61 73 74 28 42 59 54 45  ield = cast(BYTE
2860: 29 28 28 5f 62 69 74 66 69 65 6c 64 20 26 20 30  )((_bitfield & 0
2870: 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 31  xFFFFFFFFFFFFFF1
2880: 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 35 29 29  F) | (val << 5))
2890: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
28a0: 09 7d 0a 0a 09 73 74 72 75 63 74 20 53 43 52 49  .}...struct SCRI
28b0: 50 54 5f 50 52 4f 50 45 52 54 49 45 53 0a 09 7b  PT_PROPERTIES..{
28c0: 0a 09 09 70 72 69 76 61 74 65 20 44 57 4f 52 44  ...private DWORD
28d0: 20 5f 62 69 74 66 69 65 6c 64 31 3b 0a 09 09 44   _bitfield1;...D
28e0: 57 4f 52 44 20 6c 61 6e 67 69 64 28 29 20 20 20  WORD langid()   
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20         { return 
2910: 28 5f 62 69 74 66 69 65 6c 64 31 20 3e 3e 20 30  (_bitfield1 >> 0
2920: 29 20 26 20 30 78 46 46 46 46 3b 20 7d 0a 09 09  ) & 0xFFFF; }...
2930: 44 57 4f 52 44 20 6c 61 6e 67 69 64 28 44 57 4f  DWORD langid(DWO
2940: 52 44 20 76 61 6c 29 20 20 20 20 20 20 20 20 20  RD val)         
2950: 20 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69          { _bitfi
2960: 65 6c 64 31 20 3d 20 63 61 73 74 28 44 57 4f 52  eld1 = cast(DWOR
2970: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 31 20 26  D)((_bitfield1 &
2980: 20 30 78 46 46 46 46 46 46 46 46 46 46 46 46 30   0xFFFFFFFFFFFF0
2990: 30 30 30 29 20 7c 20 28 76 61 6c 20 3c 3c 20 30  000) | (val << 0
29a0: 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20  )); return val; 
29b0: 7d 0a 09 09 44 57 4f 52 44 20 66 4e 75 6d 65 72  }...DWORD fNumer
29c0: 69 63 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ic()            
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65              { re
29e0: 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 31  turn (_bitfield1
29f0: 20 3e 3e 20 31 36 29 20 26 20 30 78 31 3b 20 7d   >> 16) & 0x1; }
2a00: 0a 09 09 44 57 4f 52 44 20 66 4e 75 6d 65 72 69  ...DWORD fNumeri
2a10: 63 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20  c(DWORD val)    
2a20: 20 20 20 20 20 20 20 20 20 20 20 7b 20 5f 62 69             { _bi
2a30: 74 66 69 65 6c 64 31 20 3d 20 63 61 73 74 28 44  tfield1 = cast(D
2a40: 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64  WORD)((_bitfield
2a50: 31 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  1 & 0xFFFFFFFFFF
2a60: 46 45 46 46 46 46 29 20 7c 20 28 76 61 6c 20 3c  FEFFFF) | (val <
2a70: 3c 20 31 36 29 29 3b 20 72 65 74 75 72 6e 20 76  < 16)); return v
2a80: 61 6c 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66 43  al; }...DWORD fC
2a90: 6f 6d 70 6c 65 78 28 29 20 20 20 20 20 20 20 20  omplex()        
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69  { return (_bitfi
2ac0: 65 6c 64 31 20 3e 3e 20 31 37 29 20 26 20 30 78  eld1 >> 17) & 0x
2ad0: 31 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66 43 6f  1; }...DWORD fCo
2ae0: 6d 70 6c 65 78 28 44 57 4f 52 44 20 76 61 6c 29  mplex(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 44 46 46 46 46 29 20 7c 20 28 76  FFFFFDFFFF) | (v
2b40: 61 6c 20 3c 3c 20 31 37 29 29 3b 20 72 65 74 75  al << 17)); retu
2b50: 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 44 57 4f 52  rn val; }...DWOR
2b60: 44 20 66 4e 65 65 64 73 57 6f 72 64 42 72 65 61  D fNeedsWordBrea
2b70: 6b 69 6e 67 28 29 20 20 20 20 20 20 20 20 20 20  king()          
2b80: 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62      { return (_b
2b90: 69 74 66 69 65 6c 64 31 20 3e 3e 20 31 38 29 20  itfield1 >> 18) 
2ba0: 26 20 30 78 31 3b 20 7d 0a 09 09 44 57 4f 52 44  & 0x1; }...DWORD
2bb0: 20 66 4e 65 65 64 73 57 6f 72 64 42 72 65 61 6b   fNeedsWordBreak
2bc0: 69 6e 67 28 44 57 4f 52 44 20 76 61 6c 29 20 20  ing(DWORD val)  
2bd0: 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 31 20     { _bitfield1 
2be0: 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f  = cast(DWORD)((_
2bf0: 62 69 74 66 69 65 6c 64 31 20 26 20 30 78 46 46  bitfield1 & 0xFF
2c00: 46 46 46 46 46 46 46 46 46 42 46 46 46 46 29 20  FFFFFFFFFBFFFF) 
2c10: 7c 20 28 76 61 6c 20 3c 3c 20 31 38 29 29 3b 20  | (val << 18)); 
2c20: 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09  return val; }...
2c30: 44 57 4f 52 44 20 66 4e 65 65 64 73 43 61 72 65  DWORD fNeedsCare
2c40: 74 49 6e 66 6f 28 29 20 20 20 20 20 20 20 20 20  tInfo()         
2c50: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e          { return
2c60: 20 28 5f 62 69 74 66 69 65 6c 64 31 20 3e 3e 20   (_bitfield1 >> 
2c70: 31 39 29 20 26 20 30 78 31 3b 20 7d 0a 09 09 44  19) & 0x1; }...D
2c80: 57 4f 52 44 20 66 4e 65 65 64 73 43 61 72 65 74  WORD fNeedsCaret
2c90: 49 6e 66 6f 28 44 57 4f 52 44 20 76 61 6c 29 20  Info(DWORD val) 
2ca0: 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66 69 65         { _bitfie
2cb0: 6c 64 31 20 3d 20 63 61 73 74 28 44 57 4f 52 44  ld1 = cast(DWORD
2cc0: 29 28 28 5f 62 69 74 66 69 65 6c 64 31 20 26 20  )((_bitfield1 & 
2cd0: 30 78 46 46 46 46 46 46 46 46 46 46 46 37 46 46  0xFFFFFFFFFFF7FF
2ce0: 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 39  FF) | (val << 19
2cf0: 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20  )); return val; 
2d00: 7d 0a 09 09 44 57 4f 52 44 20 62 43 68 61 72 53  }...DWORD bCharS
2d10: 65 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  et()            
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65              { re
2d30: 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64 31  turn (_bitfield1
2d40: 20 3e 3e 20 32 30 29 20 26 20 30 78 46 46 3b 20   >> 20) & 0xFF; 
2d50: 7d 0a 09 09 44 57 4f 52 44 20 62 43 68 61 72 53  }...DWORD bCharS
2d60: 65 74 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20  et(DWORD val)   
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 5f 62              { _b
2d80: 69 74 66 69 65 6c 64 31 20 3d 20 63 61 73 74 28  itfield1 = cast(
2d90: 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  DWORD)((_bitfiel
2da0: 64 31 20 26 20 30 78 46 46 46 46 46 46 46 46 46  d1 & 0xFFFFFFFFF
2db0: 30 30 46 46 46 46 46 29 20 7c 20 28 76 61 6c 20  00FFFFF) | (val 
2dc0: 3c 3c 20 32 30 29 29 3b 20 72 65 74 75 72 6e 20  << 20)); return 
2dd0: 76 61 6c 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66  val; }...DWORD f
2de0: 43 6f 6e 74 72 6f 6c 28 29 20 20 20 20 20 20 20  Control()       
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66   { return (_bitf
2e10: 69 65 6c 64 31 20 3e 3e 20 32 38 29 20 26 20 30  ield1 >> 28) & 0
2e20: 78 31 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66 43  x1; }...DWORD fC
2e30: 6f 6e 74 72 6f 6c 28 44 57 4f 52 44 20 76 61 6c  ontrol(DWORD val
2e40: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2e50: 7b 20 5f 62 69 74 66 69 65 6c 64 31 20 3d 20 63  { _bitfield1 = c
2e60: 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74  ast(DWORD)((_bit
2e70: 66 69 65 6c 64 31 20 26 20 30 78 46 46 46 46 46  field1 & 0xFFFFF
2e80: 46 46 46 45 46 46 46 46 46 46 46 29 20 7c 20 28  FFFEFFFFFFF) | (
2e90: 76 61 6c 20 3c 3c 20 32 38 29 29 3b 20 72 65 74  val << 28)); ret
2ea0: 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 44 57 4f  urn val; }...DWO
2eb0: 52 44 20 66 50 72 69 76 61 74 65 55 73 65 41 72  RD fPrivateUseAr
2ec0: 65 61 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ea()            
2ed0: 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f       { return (_
2ee0: 62 69 74 66 69 65 6c 64 31 20 3e 3e 20 32 39 29  bitfield1 >> 29)
2ef0: 20 26 20 30 78 31 3b 20 7d 0a 09 09 44 57 4f 52   & 0x1; }...DWOR
2f00: 44 20 66 50 72 69 76 61 74 65 55 73 65 41 72 65  D fPrivateUseAre
2f10: 61 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20  a(DWORD val)    
2f20: 20 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 31      { _bitfield1
2f30: 20 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28 28   = cast(DWORD)((
2f40: 5f 62 69 74 66 69 65 6c 64 31 20 26 20 30 78 46  _bitfield1 & 0xF
2f50: 46 46 46 46 46 46 46 44 46 46 46 46 46 46 46 29  FFFFFFFDFFFFFFF)
2f60: 20 7c 20 28 76 61 6c 20 3c 3c 20 32 39 29 29 3b   | (val << 29));
2f70: 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09   return val; }..
2f80: 09 44 57 4f 52 44 20 66 4e 65 65 64 73 43 68 61  .DWORD fNeedsCha
2f90: 72 61 63 74 65 72 4a 75 73 74 69 66 79 28 29 20  racterJustify() 
2fa0: 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72           { retur
2fb0: 6e 20 28 5f 62 69 74 66 69 65 6c 64 31 20 3e 3e  n (_bitfield1 >>
2fc0: 20 33 30 29 20 26 20 30 78 31 3b 20 7d 0a 09 09   30) & 0x1; }...
2fd0: 44 57 4f 52 44 20 66 4e 65 65 64 73 43 68 61 72  DWORD fNeedsChar
2fe0: 61 63 74 65 72 4a 75 73 74 69 66 79 28 44 57 4f  acterJustify(DWO
2ff0: 52 44 20 76 61 6c 29 20 7b 20 5f 62 69 74 66 69  RD val) { _bitfi
3000: 65 6c 64 31 20 3d 20 63 61 73 74 28 44 57 4f 52  eld1 = cast(DWOR
3010: 44 29 28 28 5f 62 69 74 66 69 65 6c 64 31 20 26  D)((_bitfield1 &
3020: 20 30 78 46 46 46 46 46 46 46 46 42 46 46 46 46   0xFFFFFFFFBFFFF
3030: 46 46 46 29 20 7c 20 28 76 61 6c 20 3c 3c 20 33  FFF) | (val << 3
3040: 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b  0)); return val;
3050: 20 7d 0a 09 09 44 57 4f 52 44 20 66 49 6e 76 61   }...DWORD fInva
3060: 6c 69 64 47 6c 79 70 68 28 29 20 20 20 20 20 20  lidGlyph()      
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72               { r
3080: 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64  eturn (_bitfield
3090: 31 20 3e 3e 20 33 31 29 20 26 20 30 78 31 3b 20  1 >> 31) & 0x1; 
30a0: 7d 0a 09 09 44 57 4f 52 44 20 66 49 6e 76 61 6c  }...DWORD fInval
30b0: 69 64 47 6c 79 70 68 28 44 57 4f 52 44 20 76 61  idGlyph(DWORD va
30c0: 6c 29 20 20 20 20 20 20 20 20 20 20 7b 20 5f 62  l)          { _b
30d0: 69 74 66 69 65 6c 64 31 20 3d 20 63 61 73 74 28  itfield1 = cast(
30e0: 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c  DWORD)((_bitfiel
30f0: 64 31 20 26 20 30 78 46 46 46 46 46 46 46 46 37  d1 & 0xFFFFFFFF7
3100: 46 46 46 46 46 46 46 29 20 7c 20 28 76 61 6c 20  FFFFFFF) | (val 
3110: 3c 3c 20 33 31 29 29 3b 20 72 65 74 75 72 6e 20  << 31)); return 
3120: 76 61 6c 3b 20 7d 0a 09 09 70 72 69 76 61 74 65  val; }...private
3130: 20 44 57 4f 52 44 20 5f 62 69 74 66 69 65 6c 64   DWORD _bitfield
3140: 32 3b 0a 09 09 44 57 4f 52 44 20 66 49 6e 76 61  2;...DWORD fInva
3150: 6c 69 64 4c 6f 67 41 74 74 72 28 29 20 20 20 20  lidLogAttr()    
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72               { r
3170: 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65 6c 64  eturn (_bitfield
3180: 32 20 3e 3e 20 30 29 20 26 20 30 78 31 3b 20 7d  2 >> 0) & 0x1; }
3190: 0a 09 09 44 57 4f 52 44 20 66 49 6e 76 61 6c 69  ...DWORD fInvali
31a0: 64 4c 6f 67 41 74 74 72 28 44 57 4f 52 44 20 76  dLogAttr(DWORD v
31b0: 61 6c 29 20 20 20 20 20 20 20 20 7b 20 5f 62 69  al)        { _bi
31c0: 74 66 69 65 6c 64 32 20 3d 20 63 61 73 74 28 44  tfield2 = cast(D
31d0: 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64  WORD)((_bitfield
31e0: 32 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  2 & 0xFFFFFFFFFF
31f0: 46 46 46 46 46 45 29 20 7c 20 28 76 61 6c 20 3c  FFFFFE) | (val <
3200: 3c 20 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61  < 0)); return va
3210: 6c 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66 43 44  l; }...DWORD fCD
3220: 4d 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  M()             
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3240: 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66 69 65   return (_bitfie
3250: 6c 64 32 20 3e 3e 20 31 29 20 26 20 30 78 31 3b  ld2 >> 1) & 0x1;
3260: 20 7d 0a 09 09 44 57 4f 52 44 20 66 43 44 4d 28   }...DWORD fCDM(
3270: 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20  DWORD val)      
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 5f               { _
3290: 62 69 74 66 69 65 6c 64 32 20 3d 20 63 61 73 74  bitfield2 = cast
32a0: 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65  (DWORD)((_bitfie
32b0: 6c 64 32 20 26 20 30 78 46 46 46 46 46 46 46 46  ld2 & 0xFFFFFFFF
32c0: 46 46 46 46 46 46 46 44 29 20 7c 20 28 76 61 6c  FFFFFFFD) | (val
32d0: 20 3c 3c 20 31 29 29 3b 20 72 65 74 75 72 6e 20   << 1)); return 
32e0: 76 61 6c 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66  val; }...DWORD f
32f0: 41 6d 62 69 67 75 6f 75 73 43 68 61 72 53 65 74  AmbiguousCharSet
3300: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ()              
3310: 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66   { return (_bitf
3320: 69 65 6c 64 32 20 3e 3e 20 32 29 20 26 20 30 78  ield2 >> 2) & 0x
3330: 31 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66 41 6d  1; }...DWORD fAm
3340: 62 69 67 75 6f 75 73 43 68 61 72 53 65 74 28 44  biguousCharSet(D
3350: 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20 7b  WORD val)      {
3360: 20 5f 62 69 74 66 69 65 6c 64 32 20 3d 20 63 61   _bitfield2 = ca
3370: 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69 74 66  st(DWORD)((_bitf
3380: 69 65 6c 64 32 20 26 20 30 78 46 46 46 46 46 46  ield2 & 0xFFFFFF
3390: 46 46 46 46 46 46 46 46 46 42 29 20 7c 20 28 76  FFFFFFFFFB) | (v
33a0: 61 6c 20 3c 3c 20 32 29 29 3b 20 72 65 74 75 72  al << 2)); retur
33b0: 6e 20 76 61 6c 3b 20 7d 0a 09 09 44 57 4f 52 44  n val; }...DWORD
33c0: 20 66 43 6c 75 73 74 65 72 53 69 7a 65 56 61 72   fClusterSizeVar
33d0: 69 65 73 28 29 20 20 20 20 20 20 20 20 20 20 20  ies()           
33e0: 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69     { return (_bi
33f0: 74 66 69 65 6c 64 32 20 3e 3e 20 33 29 20 26 20  tfield2 >> 3) & 
3400: 30 78 31 3b 20 7d 0a 09 09 44 57 4f 52 44 20 66  0x1; }...DWORD f
3410: 43 6c 75 73 74 65 72 53 69 7a 65 56 61 72 69 65  ClusterSizeVarie
3420: 73 28 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20  s(DWORD val)    
3430: 20 7b 20 5f 62 69 74 66 69 65 6c 64 32 20 3d 20   { _bitfield2 = 
3440: 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f 62 69  cast(DWORD)((_bi
3450: 74 66 69 65 6c 64 32 20 26 20 30 78 46 46 46 46  tfield2 & 0xFFFF
3460: 46 46 46 46 46 46 46 46 46 46 46 37 29 20 7c 20  FFFFFFFFFFF7) | 
3470: 28 76 61 6c 20 3c 3c 20 33 29 29 3b 20 72 65 74  (val << 3)); ret
3480: 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 09 44 57 4f  urn val; }...DWO
3490: 52 44 20 66 52 65 6a 65 63 74 49 6e 76 61 6c 69  RD fRejectInvali
34a0: 64 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d()             
34b0: 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 28 5f       { return (_
34c0: 62 69 74 66 69 65 6c 64 32 20 3e 3e 20 34 29 20  bitfield2 >> 4) 
34d0: 26 20 30 78 31 3b 20 7d 0a 09 09 44 57 4f 52 44  & 0x1; }...DWORD
34e0: 20 66 52 65 6a 65 63 74 49 6e 76 61 6c 69 64 28   fRejectInvalid(
34f0: 44 57 4f 52 44 20 76 61 6c 29 20 20 20 20 20 20  DWORD val)      
3500: 20 20 20 7b 20 5f 62 69 74 66 69 65 6c 64 32 20     { _bitfield2 
3510: 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28 28 5f  = cast(DWORD)((_
3520: 62 69 74 66 69 65 6c 64 32 20 26 20 30 78 46 46  bitfield2 & 0xFF
3530: 46 46 46 46 46 46 46 46 46 46 46 46 45 46 29 20  FFFFFFFFFFFFEF) 
3540: 7c 20 28 76 61 6c 20 3c 3c 20 34 29 29 3b 20 72  | (val << 4)); r
3550: 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a 09 7d 0a  eturn val; }..}.
3560: 0a 09 73 74 72 75 63 74 20 53 43 52 49 50 54 5f  ..struct SCRIPT_
3570: 46 4f 4e 54 50 52 4f 50 45 52 54 49 45 53 0a 09  FONTPROPERTIES..
3580: 7b 0a 09 09 69 6e 74 20 63 42 79 74 65 73 20 3d  {...int cBytes =
3590: 20 53 43 52 49 50 54 5f 46 4f 4e 54 50 52 4f 50   SCRIPT_FONTPROP
35a0: 45 52 54 49 45 53 2e 73 69 7a 65 6f 66 3b 0a 09  ERTIES.sizeof;..
35b0: 09 57 4f 52 44 20 77 67 42 6c 61 6e 6b 3b 0a 09  .WORD wgBlank;..
35c0: 09 57 4f 52 44 20 77 67 44 65 66 61 75 6c 74 3b  .WORD wgDefault;
35d0: 0a 09 09 57 4f 52 44 20 77 67 49 6e 76 61 6c 69  ...WORD wgInvali
35e0: 64 3b 0a 09 09 57 4f 52 44 20 77 67 4b 61 73 68  d;...WORD wgKash
35f0: 69 64 61 3b 0a 09 09 69 6e 74 20 69 4b 61 73 68  ida;...int iKash
3600: 69 64 61 57 69 64 74 68 3b 0a 09 7d 0a 0a 09 73  idaWidth;..}...s
3610: 74 72 75 63 74 20 53 43 52 49 50 54 5f 54 41 42  truct SCRIPT_TAB
3620: 44 45 46 0a 09 7b 0a 09 09 69 6e 74 20 63 54 61  DEF..{...int cTa
3630: 62 53 74 6f 70 73 3b 0a 09 09 69 6e 74 20 69 53  bStops;...int iS
3640: 63 61 6c 65 3b 0a 09 09 69 6e 74 2a 20 70 54 61  cale;...int* pTa
3650: 62 53 74 6f 70 73 3b 0a 09 09 69 6e 74 20 69 54  bStops;...int iT
3660: 61 62 4f 72 69 67 69 6e 3b 0a 09 7d 0a 0a 09 73  abOrigin;..}...s
3670: 74 72 75 63 74 20 53 43 52 49 50 54 5f 44 49 47  truct SCRIPT_DIG
3680: 49 54 53 55 42 53 54 49 54 55 54 45 0a 09 7b 0a  ITSUBSTITUTE..{.
3690: 09 09 70 72 69 76 61 74 65 20 44 57 4f 52 44 20  ..private DWORD 
36a0: 5f 62 69 74 66 69 65 6c 64 31 3b 0a 09 09 44 57  _bitfield1;...DW
36b0: 4f 52 44 20 4e 61 74 69 6f 6e 61 6c 44 69 67 69  ORD NationalDigi
36c0: 74 4c 61 6e 67 75 61 67 65 28 29 20 20 20 20 20  tLanguage()     
36d0: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e          { return
36e0: 20 28 5f 62 69 74 66 69 65 6c 64 31 20 3e 3e 20   (_bitfield1 >> 
36f0: 30 29 20 26 20 30 78 46 46 46 46 3b 20 7d 0a 09  0) & 0xFFFF; }..
3700: 09 44 57 4f 52 44 20 4e 61 74 69 6f 6e 61 6c 44  .DWORD NationalD
3710: 69 67 69 74 4c 61 6e 67 75 61 67 65 28 44 57 4f  igitLanguage(DWO
3720: 52 44 20 76 61 6c 29 20 20 20 20 7b 20 5f 62 69  RD val)    { _bi
3730: 74 66 69 65 6c 64 31 20 3d 20 63 61 73 74 28 44  tfield1 = cast(D
3740: 57 4f 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64  WORD)((_bitfield
3750: 31 20 26 20 30 78 46 46 46 46 46 46 46 46 46 46  1 & 0xFFFFFFFFFF
3760: 46 46 30 30 30 30 29 20 7c 20 28 76 61 6c 20 3c  FF0000) | (val <
3770: 3c 20 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61  < 0)); return va
3780: 6c 3b 20 7d 0a 09 09 44 57 4f 52 44 20 54 72 61  l; }...DWORD Tra
3790: 64 69 74 69 6f 6e 61 6c 44 69 67 69 74 4c 61 6e  ditionalDigitLan
37a0: 67 75 61 67 65 28 29 20 20 20 20 20 20 20 20 20  guage()         
37b0: 20 7b 20 72 65 74 75 72 6e 20 28 5f 62 69 74 66   { return (_bitf
37c0: 69 65 6c 64 31 20 3e 3e 20 31 36 29 20 26 20 30  ield1 >> 16) & 0
37d0: 78 46 46 46 46 3b 20 7d 0a 09 09 44 57 4f 52 44  xFFFF; }...DWORD
37e0: 20 54 72 61 64 69 74 69 6f 6e 61 6c 44 69 67 69   TraditionalDigi
37f0: 74 4c 61 6e 67 75 61 67 65 28 44 57 4f 52 44 20  tLanguage(DWORD 
3800: 76 61 6c 29 20 7b 20 5f 62 69 74 66 69 65 6c 64  val) { _bitfield
3810: 31 20 3d 20 63 61 73 74 28 44 57 4f 52 44 29 28  1 = cast(DWORD)(
3820: 28 5f 62 69 74 66 69 65 6c 64 31 20 26 20 30 78  (_bitfield1 & 0x
3830: 46 46 46 46 46 46 46 46 30 30 30 30 46 46 46 46  FFFFFFFF0000FFFF
3840: 29 20 7c 20 28 76 61 6c 20 3c 3c 20 31 36 29 29  ) | (val << 16))
3850: 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b 20 7d 0a  ; return val; }.
3860: 09 09 70 72 69 76 61 74 65 20 44 57 4f 52 44 20  ..private DWORD 
3870: 5f 62 69 74 66 69 65 6c 64 32 3b 0a 09 09 44 57  _bitfield2;...DW
3880: 4f 52 44 20 44 69 67 69 74 53 75 62 73 74 69 74  ORD DigitSubstit
3890: 75 74 65 28 29 20 20 20 20 20 20 20 20 20 20 20  ute()           
38a0: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e          { return
38b0: 20 28 5f 62 69 74 66 69 65 6c 64 32 20 3e 3e 20   (_bitfield2 >> 
38c0: 30 29 20 26 20 30 78 46 46 3b 20 7d 0a 09 09 44  0) & 0xFF; }...D
38d0: 57 4f 52 44 20 44 69 67 69 74 53 75 62 73 74 69  WORD DigitSubsti
38e0: 74 75 74 65 28 44 57 4f 52 44 20 76 61 6c 29 20  tute(DWORD val) 
38f0: 20 20 20 20 20 20 20 20 20 7b 20 5f 62 69 74 66           { _bitf
3900: 69 65 6c 64 32 20 3d 20 63 61 73 74 28 44 57 4f  ield2 = cast(DWO
3910: 52 44 29 28 28 5f 62 69 74 66 69 65 6c 64 32 20  RD)((_bitfield2 
3920: 26 20 30 78 46 46 46 46 46 46 46 46 46 46 46 46  & 0xFFFFFFFFFFFF
3930: 46 46 30 30 29 20 7c 20 28 76 61 6c 20 3c 3c 20  FF00) | (val << 
3940: 30 29 29 3b 20 72 65 74 75 72 6e 20 76 61 6c 3b  0)); return val;
3950: 20 7d 0a 09 09 44 57 4f 52 44 20 64 77 52 65 73   }...DWORD dwRes
3960: 65 72 76 65 64 3b 0a 09 7d 0a 0a 09 2f 2a 20 54  erved;..}.../* T
3970: 4f 44 4f 3a 20 57 69 6e 64 6f 77 73 20 56 69 73  ODO: Windows Vis
3980: 74 61 20 66 65 61 72 75 72 65 64 20 73 74 72 75  ta fearured stru
3990: 63 74 73 0a 09 4f 50 45 4e 54 59 50 45 5f 46 45  cts..OPENTYPE_FE
39a0: 41 54 55 52 45 5f 52 45 43 4f 52 44 0a 09 4f 50  ATURE_RECORD..OP
39b0: 45 4e 54 59 50 45 5f 54 41 47 0a 09 53 43 52 49  ENTYPE_TAG..SCRI
39c0: 50 54 5f 43 48 41 52 50 52 4f 50 0a 09 53 43 52  PT_CHARPROP..SCR
39d0: 49 50 54 5f 47 4c 59 50 48 50 52 4f 50 0a 09 54  IPT_GLYPHPROP..T
39e0: 45 58 54 52 41 4e 47 45 5f 50 52 4f 50 45 52 54  EXTRANGE_PROPERT
39f0: 49 45 53 0a 09 2a 2f 0a 7d 0a 0a 0a 2f 2a 20 55  IES..*/.}.../* U
3a00: 6e 69 73 63 72 69 62 65 20 46 75 6e 63 74 69 6f  niscribe Functio
3a10: 6e 73 20 0a 20 2a 20 68 74 74 70 3a 2f 2f 6d 73  ns . * http://ms
3a20: 64 6e 32 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  dn2.microsoft.co
3a30: 6d 2f 6c 69 62 72 61 72 79 2f 6d 73 37 37 36 34  m/library/ms7764
3a40: 36 39 20 2a 2f 0a 65 78 74 65 72 6e 20 28 57 69  69 */.extern (Wi
3a50: 6e 64 6f 77 73 29 0a 7b 0a 09 48 52 45 53 55 4c  ndows).{..HRESUL
3a60: 54 20 53 63 72 69 70 74 46 72 65 65 43 61 63 68  T ScriptFreeCach
3a70: 65 28 53 43 52 49 50 54 5f 43 41 43 48 45 2a 29  e(SCRIPT_CACHE*)
3a80: 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ;..HRESULT Scrip
3a90: 74 49 74 65 6d 69 7a 65 28 43 50 74 72 21 28 57  tItemize(CPtr!(W
3aa0: 43 48 41 52 29 2c 20 69 6e 74 2c 20 69 6e 74 2c  CHAR), int, int,
3ab0: 20 43 50 74 72 21 28 53 43 52 49 50 54 5f 43 4f   CPtr!(SCRIPT_CO
3ac0: 4e 54 52 4f 4c 29 2c 20 43 50 74 72 21 28 53 43  NTROL), CPtr!(SC
3ad0: 52 49 50 54 5f 53 54 41 54 45 29 2c 20 53 43 52  RIPT_STATE), SCR
3ae0: 49 50 54 5f 49 54 45 4d 2a 2c 20 69 6e 74 2a 29  IPT_ITEM*, int*)
3af0: 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ;..HRESULT Scrip
3b00: 74 4c 61 79 6f 75 74 28 69 6e 74 2c 20 43 50 74  tLayout(int, CPt
3b10: 72 21 28 42 59 54 45 29 2c 20 69 6e 74 2a 2c 20  r!(BYTE), int*, 
3b20: 69 6e 74 2a 29 3b 0a 09 48 52 45 53 55 4c 54 20  int*);..HRESULT 
3b30: 53 63 72 69 70 74 53 68 61 70 65 28 48 44 43 2c  ScriptShape(HDC,
3b40: 20 53 43 52 49 50 54 5f 43 41 43 48 45 2a 2c 20   SCRIPT_CACHE*, 
3b50: 43 50 74 72 21 28 57 43 48 41 52 29 2c 20 69 6e  CPtr!(WCHAR), in
3b60: 74 2c 20 69 6e 74 2c 20 53 43 52 49 50 54 5f 41  t, int, SCRIPT_A
3b70: 4e 41 4c 59 53 49 53 2a 2c 20 57 4f 52 44 2a 2c  NALYSIS*, WORD*,
3b80: 20 57 4f 52 44 2a 2c 20 53 43 52 49 50 54 5f 56   WORD*, SCRIPT_V
3b90: 49 53 41 54 54 52 2a 2c 20 69 6e 74 2a 29 3b 0a  ISATTR*, int*);.
3ba0: 09 48 52 45 53 55 4c 54 20 53 63 72 69 70 74 50  .HRESULT ScriptP
3bb0: 6c 61 63 65 28 48 44 43 2c 20 53 43 52 49 50 54  lace(HDC, SCRIPT
3bc0: 5f 43 41 43 48 45 2a 2c 20 43 50 74 72 21 28 57  _CACHE*, CPtr!(W
3bd0: 4f 52 44 29 2c 20 69 6e 74 2c 20 43 50 74 72 21  ORD), int, CPtr!
3be0: 28 53 43 52 49 50 54 5f 56 49 53 41 54 54 52 29  (SCRIPT_VISATTR)
3bf0: 2c 20 53 43 52 49 50 54 5f 41 4e 41 4c 59 53 49  , SCRIPT_ANALYSI
3c00: 53 2a 2c 20 69 6e 74 2a 2c 20 47 4f 46 46 53 45  S*, int*, GOFFSE
3c10: 54 2a 2c 20 41 42 43 2a 29 3b 0a 09 48 52 45 53  T*, ABC*);..HRES
3c20: 55 4c 54 20 53 63 72 69 70 74 54 65 78 74 4f 75  ULT ScriptTextOu
3c30: 74 28 48 44 43 2c 20 53 43 52 49 50 54 5f 43 41  t(HDC, SCRIPT_CA
3c40: 43 48 45 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  CHE*, int, int, 
3c50: 55 49 4e 54 2c 20 43 50 74 72 21 28 52 45 43 54  UINT, CPtr!(RECT
3c60: 29 2c 20 43 50 74 72 21 28 53 43 52 49 50 54 5f  ), CPtr!(SCRIPT_
3c70: 41 4e 41 4c 59 53 49 53 29 2c 20 43 50 74 72 21  ANALYSIS), CPtr!
3c80: 28 57 43 48 41 52 29 2c 20 69 6e 74 2c 20 43 50  (WCHAR), int, CP
3c90: 74 72 21 28 57 4f 52 44 29 2c 20 69 6e 74 2c 20  tr!(WORD), int, 
3ca0: 43 50 74 72 21 28 69 6e 74 29 2c 20 69 6e 74 2a  CPtr!(int), int*
3cb0: 2c 20 43 50 74 72 21 28 47 4f 46 46 53 45 54 29  , CPtr!(GOFFSET)
3cc0: 29 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69  );..HRESULT Scri
3cd0: 70 74 4a 75 73 74 69 66 79 28 43 50 74 72 21 28  ptJustify(CPtr!(
3ce0: 53 43 52 49 50 54 5f 56 49 53 41 54 54 52 29 2c  SCRIPT_VISATTR),
3cf0: 20 43 50 74 72 21 28 69 6e 74 29 2c 20 69 6e 74   CPtr!(int), int
3d00: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 2a  , int, int, int*
3d10: 29 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69  );..HRESULT Scri
3d20: 70 74 42 72 65 61 6b 28 43 50 74 72 21 28 57 43  ptBreak(CPtr!(WC
3d30: 48 41 52 29 2c 20 69 6e 74 2c 20 43 50 74 72 21  HAR), int, CPtr!
3d40: 28 53 43 52 49 50 54 5f 41 4e 41 4c 59 53 49 53  (SCRIPT_ANALYSIS
3d50: 29 2c 20 43 50 74 72 21 28 53 43 52 49 50 54 5f  ), CPtr!(SCRIPT_
3d60: 4c 4f 47 41 54 54 52 29 29 3b 0a 09 48 52 45 53  LOGATTR));..HRES
3d70: 55 4c 54 20 53 63 72 69 70 74 43 50 74 6f 58 28  ULT ScriptCPtoX(
3d80: 69 6e 74 2c 20 42 4f 4f 4c 2c 20 69 6e 74 2c 20  int, BOOL, int, 
3d90: 69 6e 74 2c 20 43 50 74 72 21 28 57 4f 52 44 29  int, CPtr!(WORD)
3da0: 2c 20 43 50 74 72 21 28 53 43 52 49 50 54 5f 56  , CPtr!(SCRIPT_V
3db0: 49 53 41 54 54 52 29 2c 20 43 50 74 72 21 28 69  ISATTR), CPtr!(i
3dc0: 6e 74 29 2c 20 43 50 74 72 21 28 53 43 52 49 50  nt), CPtr!(SCRIP
3dd0: 54 5f 41 4e 41 4c 59 53 49 53 29 2c 20 69 6e 74  T_ANALYSIS), int
3de0: 2a 29 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72  *);..HRESULT Scr
3df0: 69 70 74 58 74 6f 43 50 28 69 6e 74 2c 20 69 6e  iptXtoCP(int, in
3e00: 74 2c 20 69 6e 74 2c 20 43 50 74 72 21 28 57 4f  t, int, CPtr!(WO
3e10: 52 44 29 2c 20 43 50 74 72 21 28 53 43 52 49 50  RD), CPtr!(SCRIP
3e20: 54 5f 56 49 53 41 54 54 52 29 2c 20 43 50 74 72  T_VISATTR), CPtr
3e30: 21 28 69 6e 74 29 2c 20 43 50 74 72 21 28 53 43  !(int), CPtr!(SC
3e40: 52 49 50 54 5f 41 4e 41 4c 59 53 49 53 29 2c 20  RIPT_ANALYSIS), 
3e50: 69 6e 74 2a 2c 20 69 6e 74 2a 29 3b 0a 09 48 52  int*, int*);..HR
3e60: 45 53 55 4c 54 20 53 63 72 69 70 74 47 65 74 4c  ESULT ScriptGetL
3e70: 6f 67 69 63 61 6c 57 69 64 74 68 73 28 43 50 74  ogicalWidths(CPt
3e80: 72 21 28 53 43 52 49 50 54 5f 41 4e 41 4c 59 53  r!(SCRIPT_ANALYS
3e90: 49 53 29 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 43  IS), int, int, C
3ea0: 50 74 72 21 28 69 6e 74 29 2c 20 43 50 74 72 21  Ptr!(int), CPtr!
3eb0: 28 57 4f 52 44 29 2c 20 43 50 74 72 21 28 53 43  (WORD), CPtr!(SC
3ec0: 52 49 50 54 5f 56 49 53 41 54 54 52 29 2c 20 69  RIPT_VISATTR), i
3ed0: 6e 74 2a 29 3b 0a 09 48 52 45 53 55 4c 54 20 53  nt*);..HRESULT S
3ee0: 63 72 69 70 74 41 70 70 6c 79 4c 6f 67 69 63 61  criptApplyLogica
3ef0: 6c 57 69 64 74 68 28 43 50 74 72 21 28 69 6e 74  lWidth(CPtr!(int
3f00: 29 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 43 50 74  ), int, int, CPt
3f10: 72 21 28 57 4f 52 44 29 2c 20 43 50 74 72 21 28  r!(WORD), CPtr!(
3f20: 53 43 52 49 50 54 5f 56 49 53 41 54 54 52 29 2c  SCRIPT_VISATTR),
3f30: 20 43 50 74 72 21 28 69 6e 74 29 2c 20 43 50 74   CPtr!(int), CPt
3f40: 72 21 28 53 43 52 49 50 54 5f 41 4e 41 4c 59 53  r!(SCRIPT_ANALYS
3f50: 49 53 29 2c 20 41 42 43 2a 2c 20 69 6e 74 2a 29  IS), ABC*, int*)
3f60: 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ;..HRESULT Scrip
3f70: 74 47 65 74 43 4d 61 70 28 48 44 43 2c 20 53 43  tGetCMap(HDC, SC
3f80: 52 49 50 54 5f 43 41 43 48 45 2a 2c 20 43 50 74  RIPT_CACHE*, CPt
3f90: 72 21 28 57 43 48 41 52 29 2c 20 69 6e 74 2c 20  r!(WCHAR), int, 
3fa0: 44 57 4f 52 44 2c 20 57 4f 52 44 2a 29 3b 0a 09  DWORD, WORD*);..
3fb0: 48 52 45 53 55 4c 54 20 53 63 72 69 70 74 47 65  HRESULT ScriptGe
3fc0: 74 47 6c 79 70 68 41 42 43 57 69 64 74 68 28 48  tGlyphABCWidth(H
3fd0: 44 43 2c 20 53 43 52 49 50 54 5f 43 41 43 48 45  DC, SCRIPT_CACHE
3fe0: 2a 2c 20 57 4f 52 44 2c 20 41 42 43 2a 29 3b 0a  *, WORD, ABC*);.
3ff0: 09 48 52 45 53 55 4c 54 20 53 63 72 69 70 74 47  .HRESULT ScriptG
4000: 65 74 50 72 6f 70 65 72 74 69 65 73 28 43 50 74  etProperties(CPt
4010: 72 21 28 53 43 52 49 50 54 5f 50 52 4f 50 45 52  r!(SCRIPT_PROPER
4020: 54 49 45 53 2a 2a 29 2c 20 69 6e 74 2a 29 3b 0a  TIES**), int*);.
4030: 09 48 52 45 53 55 4c 54 20 53 63 72 69 70 74 47  .HRESULT ScriptG
4040: 65 74 46 6f 6e 74 50 72 6f 70 65 72 74 69 65 73  etFontProperties
4050: 28 48 44 43 2c 20 53 43 52 49 50 54 5f 43 41 43  (HDC, SCRIPT_CAC
4060: 48 45 2a 2c 20 53 43 52 49 50 54 5f 46 4f 4e 54  HE*, SCRIPT_FONT
4070: 50 52 4f 50 45 52 54 49 45 53 2a 29 3b 0a 09 48  PROPERTIES*);..H
4080: 52 45 53 55 4c 54 20 53 63 72 69 70 74 43 61 63  RESULT ScriptCac
4090: 68 65 47 65 74 48 65 69 67 68 74 28 48 44 43 2c  heGetHeight(HDC,
40a0: 20 53 43 52 49 50 54 5f 43 41 43 48 45 2a 2c 20   SCRIPT_CACHE*, 
40b0: 69 6e 74 2a 29 3b 0a 09 48 52 45 53 55 4c 54 20  int*);..HRESULT 
40c0: 53 63 72 69 70 74 49 73 43 6f 6d 70 6c 65 78 28  ScriptIsComplex(
40d0: 43 50 74 72 21 28 57 43 48 41 52 29 2c 20 69 6e  CPtr!(WCHAR), in
40e0: 74 2c 20 44 57 4f 52 44 29 3b 0a 09 48 52 45 53  t, DWORD);..HRES
40f0: 55 4c 54 20 53 63 72 69 70 74 52 65 63 6f 72 64  ULT ScriptRecord
4100: 44 69 67 69 74 53 75 62 73 74 69 74 75 74 69 6f  DigitSubstitutio
4110: 6e 28 4c 43 49 44 2c 20 53 43 52 49 50 54 5f 44  n(LCID, SCRIPT_D
4120: 49 47 49 54 53 55 42 53 54 49 54 55 54 45 2a 29  IGITSUBSTITUTE*)
4130: 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ;..HRESULT Scrip
4140: 74 41 70 70 6c 79 44 69 67 69 74 53 75 62 73 74  tApplyDigitSubst
4150: 69 74 75 74 69 6f 6e 28 43 50 74 72 21 28 53 43  itution(CPtr!(SC
4160: 52 49 50 54 5f 44 49 47 49 54 53 55 42 53 54 49  RIPT_DIGITSUBSTI
4170: 54 55 54 45 29 2c 20 53 43 52 49 50 54 5f 43 4f  TUTE), SCRIPT_CO
4180: 4e 54 52 4f 4c 2a 2c 20 53 43 52 49 50 54 5f 53  NTROL*, SCRIPT_S
4190: 54 41 54 45 2a 29 3b 0a 0a 09 2f 2a 20 53 63 72  TATE*);.../* Scr
41a0: 69 70 74 53 74 72 69 6e 67 20 46 75 6e 63 74 69  iptString Functi
41b0: 6f 6e 73 0a 09 20 2a 20 68 74 74 70 3a 2f 2f 6d  ons.. * http://m
41c0: 73 64 6e 32 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  sdn2.microsoft.c
41d0: 6f 6d 2f 6c 69 62 72 61 72 79 2f 6d 73 37 37 36  om/library/ms776
41e0: 34 38 35 20 2a 2f 0a 09 48 52 45 53 55 4c 54 20  485 */..HRESULT 
41f0: 53 63 72 69 70 74 53 74 72 69 6e 67 41 6e 61 6c  ScriptStringAnal
4200: 79 73 65 28 48 44 43 2c 20 43 50 74 72 21 28 76  yse(HDC, CPtr!(v
4210: 6f 69 64 29 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  oid), int, int, 
4220: 69 6e 74 2c 20 44 57 4f 52 44 2c 20 69 6e 74 2c  int, DWORD, int,
4230: 20 53 43 52 49 50 54 5f 43 4f 4e 54 52 4f 4c 2a   SCRIPT_CONTROL*
4240: 2c 20 53 43 52 49 50 54 5f 53 54 41 54 45 2a 2c  , SCRIPT_STATE*,
4250: 20 43 50 74 72 21 28 69 6e 74 29 2c 20 53 43 52   CPtr!(int), SCR
4260: 49 50 54 5f 54 41 42 44 45 46 2a 2c 20 43 50 74  IPT_TABDEF*, CPt
4270: 72 21 28 42 59 54 45 29 2c 20 53 43 52 49 50 54  r!(BYTE), SCRIPT
4280: 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49 53  _STRING_ANALYSIS
4290: 2a 29 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72  *);..HRESULT Scr
42a0: 69 70 74 53 74 72 69 6e 67 46 72 65 65 28 53 43  iptStringFree(SC
42b0: 52 49 50 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c  RIPT_STRING_ANAL
42c0: 59 53 49 53 2a 29 3b 0a 09 43 50 74 72 21 28 53  YSIS*);..CPtr!(S
42d0: 49 5a 45 29 20 53 63 72 69 70 74 53 74 72 69 6e  IZE) ScriptStrin
42e0: 67 5f 70 53 69 7a 65 28 53 43 52 49 50 54 5f 53  g_pSize(SCRIPT_S
42f0: 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49 53 29 3b  TRING_ANALYSIS);
4300: 0a 09 43 50 74 72 21 28 69 6e 74 29 20 53 63 72  ..CPtr!(int) Scr
4310: 69 70 74 53 74 72 69 6e 67 5f 70 63 4f 75 74 43  iptString_pcOutC
4320: 68 61 72 73 28 53 43 52 49 50 54 5f 53 54 52 49  hars(SCRIPT_STRI
4330: 4e 47 5f 41 4e 41 4c 59 53 49 53 29 3b 0a 09 43  NG_ANALYSIS);..C
4340: 50 74 72 21 28 53 43 52 49 50 54 5f 4c 4f 47 41  Ptr!(SCRIPT_LOGA
4350: 54 54 52 29 20 53 63 72 69 70 74 53 74 72 69 6e  TTR) ScriptStrin
4360: 67 5f 70 4c 6f 67 41 74 74 72 28 53 43 52 49 50  g_pLogAttr(SCRIP
4370: 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59 53 49  T_STRING_ANALYSI
4380: 53 29 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72  S);..HRESULT Scr
4390: 69 70 74 53 74 72 69 6e 67 47 65 74 4f 72 64 65  iptStringGetOrde
43a0: 72 28 53 43 52 49 50 54 5f 53 54 52 49 4e 47 5f  r(SCRIPT_STRING_
43b0: 41 4e 41 4c 59 53 49 53 2c 20 55 49 4e 54 2a 29  ANALYSIS, UINT*)
43c0: 3b 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70  ;..HRESULT Scrip
43d0: 74 53 74 72 69 6e 67 43 50 74 6f 58 28 53 43 52  tStringCPtoX(SCR
43e0: 49 50 54 5f 53 54 52 49 4e 47 5f 41 4e 41 4c 59  IPT_STRING_ANALY
43f0: 53 49 53 2c 20 69 6e 74 2c 20 42 4f 4f 4c 2c 20  SIS, int, BOOL, 
4400: 69 6e 74 2a 29 3b 0a 09 48 52 45 53 55 4c 54 20  int*);..HRESULT 
4410: 53 63 72 69 70 74 53 74 72 69 6e 67 58 74 6f 43  ScriptStringXtoC
4420: 50 28 53 43 52 49 50 54 5f 53 54 52 49 4e 47 5f  P(SCRIPT_STRING_
4430: 41 4e 41 4c 59 53 49 53 2c 20 69 6e 74 2c 20 69  ANALYSIS, int, i
4440: 6e 74 2a 2c 20 69 6e 74 2a 29 3b 0a 09 48 52 45  nt*, int*);..HRE
4450: 53 55 4c 54 20 53 63 72 69 70 74 53 74 72 69 6e  SULT ScriptStrin
4460: 67 47 65 74 4c 6f 67 69 63 61 6c 57 69 64 74 68  gGetLogicalWidth
4470: 73 28 53 43 52 49 50 54 5f 53 54 52 49 4e 47 5f  s(SCRIPT_STRING_
4480: 41 4e 41 4c 59 53 49 53 2c 20 69 6e 74 2a 29 3b  ANALYSIS, int*);
4490: 0a 09 48 52 45 53 55 4c 54 20 53 63 72 69 70 74  ..HRESULT Script
44a0: 53 74 72 69 6e 67 56 61 6c 69 64 61 74 65 28 53  StringValidate(S
44b0: 43 52 49 50 54 5f 53 54 52 49 4e 47 5f 41 4e 41  CRIPT_STRING_ANA
44c0: 4c 59 53 49 53 29 3b 0a 09 48 52 45 53 55 4c 54  LYSIS);..HRESULT
44d0: 20 53 63 72 69 70 74 53 74 72 69 6e 67 4f 75 74   ScriptStringOut
44e0: 28 53 43 52 49 50 54 5f 53 54 52 49 4e 47 5f 41  (SCRIPT_STRING_A
44f0: 4e 41 4c 59 53 49 53 2c 20 69 6e 74 2c 20 69 6e  NALYSIS, int, in
4500: 74 2c 20 55 49 4e 54 2c 20 43 50 74 72 21 28 52  t, UINT, CPtr!(R
4510: 45 43 54 29 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  ECT), int, int, 
4520: 42 4f 4f 4c 29 3b 0a 0a 09 2f 2a 20 54 4f 44 4f  BOOL);.../* TODO
4530: 3a 20 57 69 6e 64 6f 77 73 20 56 69 73 74 61 20  : Windows Vista 
4540: 66 65 61 72 75 72 65 64 20 66 75 6e 63 74 69 6f  fearured functio
4550: 6e 73 0a 09 53 63 72 69 70 74 47 65 74 46 6f 6e  ns..ScriptGetFon
4560: 74 41 6c 74 65 72 6e 61 74 65 47 6c 79 70 68 73  tAlternateGlyphs
4570: 28 29 0a 09 53 63 72 69 70 74 47 65 74 46 6f 6e  ()..ScriptGetFon
4580: 74 46 65 61 74 75 72 65 54 61 67 73 28 29 0a 09  tFeatureTags()..
4590: 53 63 72 69 70 74 47 65 74 46 6f 6e 74 4c 61 6e  ScriptGetFontLan
45a0: 67 75 61 67 65 54 61 67 73 28 29 0a 09 53 63 72  guageTags()..Scr
45b0: 69 70 74 47 65 74 46 6f 6e 74 53 63 72 69 70 74  iptGetFontScript
45c0: 54 61 67 73 28 29 0a 09 53 63 72 69 70 74 49 74  Tags()..ScriptIt
45d0: 65 6d 69 7a 65 4f 70 65 6e 54 79 70 65 28 29 0a  emizeOpenType().
45e0: 09 53 63 72 69 70 74 50 6c 61 63 65 4f 70 65 6e  .ScriptPlaceOpen
45f0: 54 79 70 65 28 29 0a 09 53 63 72 69 70 74 50 6f  Type()..ScriptPo
4600: 73 69 74 69 6f 6e 53 69 6e 67 6c 65 47 6c 79 70  sitionSingleGlyp
4610: 68 28 29 0a 09 53 63 72 69 70 74 53 68 61 70 65  h()..ScriptShape
4620: 4f 70 65 6e 54 79 70 65 28 29 0a 09 53 63 72 69  OpenType()..Scri
4630: 70 74 53 75 62 73 74 69 74 75 74 65 53 69 6e 67  ptSubstituteSing
4640: 6c 65 47 6c 79 70 68 28 29 0a 09 2a 2f 0a 7d 0a  leGlyph()..*/.}.