OS2WindowsMetricsClass.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. using System;
  2. using System.Runtime.InteropServices;
  3. #pragma warning disable CS3001, CS3002, CS3003, CS1591
  4. namespace FastReport.Fonts
  5. {
  6. /// <summary>
  7. /// OS/2 and Windows Metrics table
  8. /// </summary>
  9. public class OS2WindowsMetricsClass : TrueTypeTable
  10. {
  11. #region "Type definition"
  12. /// <summary>
  13. /// Description of FontTextMetric structure
  14. /// </summary>
  15. [StructLayout(LayoutKind.Sequential)]
  16. public struct FontTextMetric
  17. {
  18. public int tmHeight;
  19. public int tmAscent;
  20. public int tmDescent;
  21. public int tmInternalLeading;
  22. public int tmExternalLeading;
  23. public int tmAveCharWidth;
  24. public int tmMaxCharWidth;
  25. public int tmWeight;
  26. public int tmOverhang;
  27. public int tmDigitizedAspectX;
  28. public int tmDigitizedAspectY;
  29. public char tmFirstChar;
  30. public char tmLastChar;
  31. public char tmDefaultChar;
  32. public char tmBreakChar;
  33. public byte tmItalic;
  34. public byte tmUnderlined;
  35. public byte tmStruckOut;
  36. public byte tmPitchAndFamily;
  37. public byte tmCharSet;
  38. }
  39. /// <summary>
  40. /// Description of FontPanose structure
  41. /// </summary>
  42. [StructLayout(LayoutKind.Sequential, Pack = 1)]
  43. public struct FontPanose
  44. {
  45. public byte bFamilyType;
  46. public byte bSerifStyle;
  47. public byte bWeight;
  48. public byte bProportion;
  49. public byte bContrast;
  50. public byte bStrokeVariation;
  51. public byte ArmStyle;
  52. public byte bLetterform;
  53. public byte bMidline;
  54. public byte bXHeight;
  55. }
  56. [StructLayout(LayoutKind.Sequential, Pack = 1)]
  57. public struct OS2WindowsMetrics
  58. {
  59. public ushort Version; // version number 0x0004
  60. public short xAvgCharWidth;
  61. public ushort usWeightClass;
  62. public ushort usWidthClass;
  63. public ushort fsType;
  64. public short ySubscriptXSize;
  65. public short ySubscriptYSize;
  66. public short ySubscriptXOffset;
  67. public short ySubscriptYOffset;
  68. public short ySuperscriptXSize;
  69. public short ySuperscriptYSize;
  70. public short ySuperscriptXOffset;
  71. public short ySuperscriptYOffset;
  72. public short yStrikeoutSize;
  73. public short yStrikeoutPosition;
  74. public short sFamilyClass;
  75. #if false
  76. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
  77. public byte[] panose; // = new byte[10];
  78. #else
  79. public FontPanose panose;
  80. #endif
  81. public uint ulUnicodeRange1;
  82. public uint ulUnicodeRange2;
  83. public uint ulUnicodeRange3;
  84. public uint ulUnicodeRange4;
  85. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
  86. public byte[] achVendID; // = new vyte[4];
  87. public ushort fsSelection;
  88. public ushort usFirstCharIndex;
  89. public ushort usLastCharIndex;
  90. public short sTypoAscender;
  91. public short sTypoDescender;
  92. public short sTypoLineGap;
  93. public ushort usWinAscent;
  94. public ushort usWinDescent;
  95. public uint ulCodePageRange1;
  96. public uint ulCodePageRange2;
  97. public short sxHeight;
  98. public short sCapHeight;
  99. public ushort usDefaultChar;
  100. public ushort usBreakChar;
  101. public ushort usMaxContext;
  102. }
  103. #endregion
  104. private OS2WindowsMetrics win_metrix;
  105. private void ChangeEndian()
  106. {
  107. win_metrix.Version = SwapUInt16(win_metrix.Version);
  108. win_metrix.xAvgCharWidth = SwapInt16(win_metrix.xAvgCharWidth);
  109. win_metrix.usWeightClass = SwapUInt16(win_metrix.usWeightClass);
  110. win_metrix.usWidthClass = SwapUInt16(win_metrix.usWidthClass);
  111. win_metrix.fsType = SwapUInt16(win_metrix.fsType);
  112. win_metrix.ySubscriptXSize = SwapInt16(win_metrix.ySubscriptXSize);
  113. win_metrix.ySubscriptYSize = SwapInt16(win_metrix.ySubscriptYSize);
  114. win_metrix.ySubscriptXOffset = SwapInt16(win_metrix.ySubscriptXOffset);
  115. win_metrix.ySubscriptYOffset = SwapInt16(win_metrix.ySubscriptYOffset);
  116. win_metrix.ySuperscriptXSize = SwapInt16(win_metrix.ySuperscriptXSize);
  117. win_metrix.ySuperscriptYSize = SwapInt16(win_metrix.ySuperscriptYSize);
  118. win_metrix.ySuperscriptXOffset = SwapInt16(win_metrix.ySuperscriptXOffset);
  119. win_metrix.ySuperscriptYOffset = SwapInt16(win_metrix.ySuperscriptYOffset);
  120. win_metrix.yStrikeoutSize = SwapInt16(win_metrix.yStrikeoutSize);
  121. win_metrix.yStrikeoutPosition = SwapInt16(win_metrix.yStrikeoutPosition);
  122. win_metrix.sFamilyClass = SwapInt16(win_metrix.sFamilyClass);
  123. win_metrix.ulUnicodeRange1 = SwapUInt32(win_metrix.ulUnicodeRange1);
  124. win_metrix.ulUnicodeRange2 = SwapUInt32(win_metrix.ulUnicodeRange2);
  125. win_metrix.ulUnicodeRange3 = SwapUInt32(win_metrix.ulUnicodeRange3);
  126. win_metrix.ulUnicodeRange4 = SwapUInt32(win_metrix.ulUnicodeRange4);
  127. win_metrix.fsSelection = SwapUInt16(win_metrix.fsSelection);
  128. win_metrix.usFirstCharIndex = SwapUInt16(win_metrix.usFirstCharIndex);
  129. win_metrix.usLastCharIndex = SwapUInt16(win_metrix.usLastCharIndex);
  130. win_metrix.sTypoAscender = SwapInt16(win_metrix.sTypoAscender);
  131. win_metrix.sTypoDescender = SwapInt16(win_metrix.sTypoDescender);
  132. win_metrix.sTypoLineGap = SwapInt16(win_metrix.sTypoLineGap);
  133. win_metrix.usWinAscent = SwapUInt16(win_metrix.usWinAscent);
  134. win_metrix.usWinDescent = SwapUInt16(win_metrix.usWinDescent);
  135. win_metrix.ulCodePageRange1 = SwapUInt32(win_metrix.ulCodePageRange1);
  136. win_metrix.ulCodePageRange2 = SwapUInt32(win_metrix.ulCodePageRange2);
  137. win_metrix.sxHeight = SwapInt16(win_metrix.sxHeight);
  138. win_metrix.sCapHeight = SwapInt16(win_metrix.sCapHeight);
  139. win_metrix.usDefaultChar = SwapUInt16(win_metrix.usDefaultChar);
  140. win_metrix.usBreakChar = SwapUInt16(win_metrix.usBreakChar);
  141. win_metrix.usMaxContext = SwapUInt16(win_metrix.usMaxContext);
  142. }
  143. internal override void Load(IntPtr font)
  144. {
  145. IntPtr win_metrix_ptr = Increment(font, (int)this.Offset);
  146. win_metrix = (OS2WindowsMetrics)Marshal.PtrToStructure(win_metrix_ptr, typeof(OS2WindowsMetrics));
  147. ChangeEndian();
  148. }
  149. internal override uint Save(IntPtr font, uint offset)
  150. {
  151. this.Offset = offset;
  152. ChangeEndian();
  153. IntPtr win_metrix_ptr = Increment(font, (int)offset);
  154. Marshal.StructureToPtr(win_metrix, win_metrix_ptr, false);
  155. ChangeEndian();
  156. offset = (offset + this.Length + 3) & 0xfffffffc;
  157. return offset;
  158. }
  159. // Public properties
  160. public bool IsBold { get { return win_metrix.usWeightClass >= 600; } }
  161. public ushort Ascent { get { return win_metrix.usWinAscent; } }
  162. public ushort Descent { get { return win_metrix.usWinDescent; } }
  163. public short AvgCharWidth { get { return win_metrix.xAvgCharWidth; } }
  164. public ushort Weight { get { return win_metrix.usWeightClass; } }
  165. public ushort WidthClass { get { return win_metrix.usWidthClass; } }
  166. public short Height { get { return win_metrix.sxHeight; } }
  167. public ushort BreakChar { get { return win_metrix.usBreakChar; } }
  168. public ushort DefaultChar { get { return win_metrix.usDefaultChar; } }
  169. public ushort FirstCharIndex { get { return win_metrix.usFirstCharIndex; } }
  170. public ushort LastCharIndex { get { return win_metrix.usLastCharIndex; } }
  171. public ushort LicensingRights { get { return win_metrix.fsType; } }
  172. public OS2WindowsMetricsClass.FontPanose Panose { get { return win_metrix.panose; } }
  173. public OS2WindowsMetricsClass(TrueTypeTable src) : base(src) { }
  174. public uint UnicodeRange1 { get { return win_metrix.ulUnicodeRange1; } }
  175. public uint UnicodeRange2 { get { return win_metrix.ulUnicodeRange2; } }
  176. public uint UnicodeRange3 { get { return win_metrix.ulUnicodeRange3; } }
  177. public uint UnicodeRange4 { get { return win_metrix.ulUnicodeRange4; } }
  178. public short FamilyClass { get { return win_metrix.sFamilyClass; } }
  179. public ushort Selection { get { return win_metrix.fsSelection; } }
  180. public uint CodepageRange1 { get { return win_metrix.ulCodePageRange1; } }
  181. public uint CodepageRange2 { get { return win_metrix.ulCodePageRange2; } }
  182. public string VendorID
  183. {
  184. get
  185. {
  186. return "" +
  187. (char) win_metrix.achVendID[0] +
  188. (char) win_metrix.achVendID[1] +
  189. (char) win_metrix.achVendID[2] +
  190. (char) win_metrix.achVendID[3];
  191. }
  192. }
  193. }
  194. }
  195. #pragma warning restore