Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

727 рядки
22 KiB

  1. unit utsFreeType;
  2. {$IFDEF FPC}
  3. {$mode delphi}{$H+}
  4. {$ENDIF}
  5. interface
  6. uses
  7. Classes, SysUtils, syncobjs, dynlibs, utsTextSuite;
  8. type
  9. // Simple Types
  10. FT_Error = Integer;
  11. FT_Library = Pointer;
  12. FT_Short = SmallInt;
  13. FT_Byte = Byte;
  14. FT_Char = AnsiChar;
  15. FT_UShort = Word;
  16. FT_Int = Integer;
  17. FT_Int32 = Integer;
  18. FT_UInt = Cardinal;
  19. FT_Long = LongInt;
  20. FT_ULong = Cardinal;
  21. FT_Fixed = LongInt;
  22. FT_Pos = LongInt;
  23. FT_F26Dot6 = LongInt;
  24. FT_String = AnsiChar;
  25. // Enums
  26. FT_Encoding = Integer;
  27. FT_Glyph_Format = Integer;
  28. // Pointer
  29. FT_Face = ^FT_FaceRec;
  30. FT_GlyphSlot = ^FT_GlyphSlotRec;
  31. FT_Size = ^FT_SizeRec;
  32. FT_CharMap = ^FT_CharMapRec;
  33. PFT_Library = ^FT_Library;
  34. PFT_Face = ^FT_Face;
  35. PFT_String = ^FT_String;
  36. PFT_SfntName = ^FT_SfntName;
  37. PFT_Bitmap = ^FT_Bitmap;
  38. PTT_OS2 = ^TT_OS2;
  39. PTT_Postscript = ^TT_Postscript;
  40. PTT_HoriHeader = ^TT_HoriHeader;
  41. // unneeded
  42. FT_Driver = Pointer;
  43. FT_Memory = Pointer;
  44. FT_Stream = Pointer;
  45. FT_ListNode = Pointer;
  46. FT_Face_Internal = Pointer;
  47. FT_SubGlyph = Pointer;
  48. FT_Slot_Internal = Pointer;
  49. FT_Size_Internal = Pointer;
  50. FT_Generic_Finalizer = procedure(aObject: Pointer);
  51. FT_Generic = record
  52. data: Pointer;
  53. finalizer: FT_Generic_Finalizer;
  54. end;
  55. FT_BBox = record
  56. xMin, yMin, xMax, yMax: FT_Pos;
  57. end;
  58. FT_Vector = record
  59. x, y: FT_Pos;
  60. end;
  61. FT_ListRec = record
  62. head: FT_ListNode;
  63. tail: FT_ListNode;
  64. end;
  65. FT_CharMapRec = record
  66. face: FT_Face;
  67. encoding: FT_Encoding;
  68. platform_id: FT_UShort;
  69. encoding_id: FT_UShort;
  70. end;
  71. FT_Size_Metrics = record
  72. x_ppem: FT_UShort;
  73. y_ppem: FT_UShort;
  74. x_scale: FT_Fixed;
  75. y_scale: FT_Fixed;
  76. ascender: FT_Pos;
  77. descender: FT_Pos;
  78. height: FT_Pos;
  79. max_advance: FT_Pos;
  80. end;
  81. FT_SizeRec = record
  82. face: FT_Face;
  83. generic_: FT_Generic;
  84. metrics: FT_Size_Metrics;
  85. internal: FT_Size_Internal;
  86. end;
  87. FT_Glyph_Metrics = record
  88. width: FT_Pos;
  89. height: FT_Pos;
  90. horiBearingX: FT_Pos;
  91. horiBearingY: FT_Pos;
  92. horiAdvance: FT_Pos;
  93. vertBearingX: FT_Pos;
  94. vertBearingY: FT_Pos;
  95. vertAdvance: FT_Pos;
  96. end;
  97. FT_Bitmap_Size = record
  98. height: FT_Short;
  99. width: FT_Short;
  100. size: FT_Pos;
  101. x_ppem: FT_Pos;
  102. y_ppem: FT_Pos;
  103. end;
  104. FT_Bitmap = record
  105. rows: Integer;
  106. width: Integer;
  107. pitch: Integer;
  108. buffer: PByte;
  109. num_grays: ShortInt;
  110. pixel_mode: Byte;
  111. palette_mode: Byte;
  112. palette: Pointer;
  113. end;
  114. FT_Outline = record
  115. n_contours: ShortInt;
  116. n_points: ShortInt;
  117. points: ^FT_Vector;
  118. tags: PByte;
  119. contours: PShortInt;
  120. flags: Integer;
  121. end;
  122. FT_GlyphSlotRec = record
  123. library_: FT_Library;
  124. face: FT_Face;
  125. next: FT_GlyphSlot;
  126. reserved: FT_UInt;
  127. generic_: FT_Generic;
  128. metrics: FT_Glyph_Metrics;
  129. linearHoriAdvance: FT_Fixed;
  130. linearVertAdvance: FT_Fixed;
  131. advance: FT_Vector;
  132. format: FT_Glyph_Format;
  133. bitmap: FT_Bitmap;
  134. bitmap_left: FT_Int;
  135. bitmap_top: FT_Int;
  136. outline: FT_Outline;
  137. num_subglyphs: FT_UInt;
  138. subglyphs: FT_SubGlyph;
  139. control_data: Pointer;
  140. control_len: LongInt;
  141. lsb_delta: FT_Pos;
  142. rsb_delta: FT_Pos;
  143. other: Pointer;
  144. internal: FT_Slot_Internal;
  145. end;
  146. FT_FaceRec = record
  147. num_faces: FT_Long;
  148. face_index: FT_Long;
  149. face_flags: FT_Long;
  150. style_flags: FT_Long;
  151. num_glyphs: FT_Long;
  152. family_name: PFT_String;
  153. style_name: PFT_String;
  154. num_fixed_sizes: FT_Int;
  155. available_sizes: ^FT_Bitmap_Size;
  156. num_charmaps: FT_Int;
  157. charmaps: ^FT_CharMap;
  158. generic_: FT_Generic;
  159. bbox: FT_BBox;
  160. units_per_EM: FT_UShort;
  161. ascender: FT_Short;
  162. descender: FT_Short;
  163. height: FT_Short;
  164. max_advance_width: FT_Short;
  165. max_advance_height: FT_Short;
  166. underline_position: FT_Short;
  167. underline_thickness: FT_Short;
  168. glyph: FT_GlyphSlot;
  169. size: FT_Size;
  170. charmap: FT_CharMap;
  171. { private }
  172. driver: FT_Driver;
  173. memory: FT_Memory;
  174. stream: FT_Stream;
  175. sizes_list: FT_ListRec;
  176. autohint: FT_Generic;
  177. extensions: Pointer;
  178. internal: FT_Face_Internal;
  179. { private end }
  180. end;
  181. FT_SfntName = record
  182. platform_id: FT_UShort;
  183. encoding_id: FT_UShort;
  184. language_id: FT_UShort;
  185. name_id: FT_UShort;
  186. string_: PByte;
  187. string_len: FT_UInt;
  188. end;
  189. TT_OS2 = record
  190. version: FT_UShort;
  191. xAvgCharWidth: FT_Short;
  192. usWeightClass: FT_UShort;
  193. usWidthClass: FT_UShort;
  194. fsType: FT_Short;
  195. ySubscriptXSize: FT_Short;
  196. ySubscriptYSize: FT_Short;
  197. ySubscriptXOffset: FT_Short;
  198. ySubscriptYOffset: FT_Short;
  199. ySuperscriptXSize: FT_Short;
  200. ySuperscriptYSize: FT_Short;
  201. ySuperscriptXOffset: FT_Short;
  202. ySuperscriptYOffset: FT_Short;
  203. yStrikeoutSize: FT_Short;
  204. yStrikeoutPosition: FT_Short;
  205. sFamilyClass: FT_Short;
  206. panose: array[0..9] of FT_Byte;
  207. ulUnicodeRange1: FT_ULong;
  208. ulUnicodeRange3: FT_ULong;
  209. ulUnicodeRange2: FT_ULong;
  210. ulUnicodeRange4: FT_ULong;
  211. achVendID: array[0..3] of FT_Char;
  212. fsSelection: FT_UShort;
  213. usFirstCharIndex: FT_UShort;
  214. usLastCharIndex: FT_UShort;
  215. sTypoAscender: FT_Short;
  216. sTypoDescender: FT_Short;
  217. sTypoLineGap: FT_Short;
  218. usWinAscent: FT_UShort;
  219. usWinDescent: FT_UShort;
  220. ulCodePageRange1: FT_ULong;
  221. ulCodePageRange2: FT_ULong;
  222. { only version 2 and higher: }
  223. sxHeight: FT_Short;
  224. sCapHeight: FT_Short;
  225. usDefaultChar: FT_UShort;
  226. usBreakChar: FT_UShort;
  227. usMaxContext: FT_UShort;
  228. { only version 5 and higher: }
  229. usLowerOpticalPointSize: FT_UShort;
  230. usUpperOpticalPointSize: FT_UShort;
  231. end;
  232. TT_Postscript = record
  233. FormatType: FT_Fixed;
  234. italicAngle: FT_Fixed;
  235. underlinePosition: FT_Short;
  236. underlineThickness: FT_Short;
  237. isFixedPitch: FT_ULong;
  238. minMemType42: FT_ULong;
  239. maxMemType42: FT_ULong;
  240. minMemType1: FT_ULong;
  241. maxMemType1: FT_ULong;
  242. end;
  243. TT_HoriHeader = record
  244. Version: FT_Fixed;
  245. Ascender: FT_Short;
  246. Descender: FT_Short;
  247. Line_Gap: FT_Short;
  248. advance_Width_Max: FT_UShort;
  249. min_Left_Side_Bearin: FT_Short;
  250. min_Right_Side_Bearing: FT_Short;
  251. xMax_Extent: FT_Short;
  252. caret_Slope_Rise: FT_Short;
  253. caret_Slope_Run: FT_Short;
  254. caret_Offset: FT_Short;
  255. Reserved: array[0..3] of FT_Short;
  256. metric_Data_Format: FT_Short;
  257. number_Of_HMetrics: FT_UShort;
  258. long_metrics: Pointer;
  259. short_metrics: Pointer;
  260. end;
  261. TFT_Init_FreeType = function(aLibrary: PFT_Library): FT_Error;
  262. TFT_Done_FreeType = function(aLibrary: FT_Library): FT_Error;
  263. TFT_New_Face = function(aLibrary: FT_Library; const aFilename: PAnsiChar; aFaceIndex: FT_Long; aFace: PFT_Face): FT_Error;
  264. TFT_New_Memory_Face = function(aLibrary: FT_Library; aData: PByte; aSize: FT_Long; aFaceIndex: FT_Long; aFace: PFT_Face): FT_Error;
  265. TFT_Done_Face = function(aFace: FT_Face): FT_Error;
  266. TFT_Get_Sfnt_Name_Count = function(aFace: FT_Face): FT_UInt;
  267. TFT_Get_Sfnt_Name = function(aFace: FT_Face; aIndex: FT_UInt; aName: PFT_SfntName): FT_Error;
  268. TFT_Set_Char_Size = function(aFace: FT_Face; aCharWidth: FT_F26Dot6; aCharHeight: FT_F26Dot6; aHorzDPI: FT_UInt; aVertDPI: FT_UInt): FT_Error;
  269. TFT_Load_Char = function(aFace: FT_Face; aCharCode: FT_ULong; aLoadFlags: FT_Int32): FT_Error;
  270. TFT_Get_Sfnt_Table = function(aFace: FT_Face; aTag: Integer): Pointer;
  271. var
  272. FT_Init_FreeType: TFT_Init_FreeType;
  273. FT_Done_FreeType: TFT_Done_FreeType;
  274. FT_New_Face: TFT_New_Face;
  275. FT_New_Memory_Face: TFT_New_Memory_Face;
  276. FT_Done_Face: TFT_Done_Face;
  277. FT_Get_Sfnt_Name_Count: TFT_Get_Sfnt_Name_Count;
  278. FT_Get_Sfnt_Name: TFT_Get_Sfnt_Name;
  279. FT_Set_Char_Size: TFT_Set_Char_Size;
  280. FT_Load_Char: TFT_Load_Char;
  281. FT_Get_Sfnt_Table: TFT_Get_Sfnt_Table;
  282. const
  283. TT_NAME_ID_COPYRIGHT = 0;
  284. TT_NAME_ID_FONT_FAMILY = 1;
  285. TT_NAME_ID_FONT_SUBFAMILY = 2;
  286. TT_NAME_ID_UNIQUE_ID = 3;
  287. TT_NAME_ID_FULL_NAME = 4;
  288. TT_NAME_ID_VERSION_STRING = 5;
  289. TT_NAME_ID_PS_NAME = 6;
  290. TT_NAME_ID_TRADEMARK = 7;
  291. TT_PLATFORM_APPLE_UNICODE = 0;
  292. TT_PLATFORM_MACINTOSH = 1;
  293. TT_PLATFORM_ISO = 2; // deprecated
  294. TT_PLATFORM_MICROSOFT = 3;
  295. TT_PLATFORM_CUSTOM = 4;
  296. TT_PLATFORM_ADOBE = 7; // artificial
  297. TT_ISO_ID_7BIT_ASCII = 0;
  298. TT_ISO_ID_10646 = 1;
  299. TT_ISO_ID_8859_1 = 2;
  300. TT_APPLE_ID_DEFAULT = 0; // Unicode 1.0
  301. TT_APPLE_ID_UNICODE_1_1 = 1; // specify Hangul at U+34xx
  302. TT_APPLE_ID_ISO_10646 = 2; // deprecated
  303. TT_APPLE_ID_UNICODE_2_0 = 3; // or later
  304. TT_APPLE_ID_UNICODE_32 = 4; // 2.0 or later, full repertoire
  305. TT_MAC_ID_ROMAN = 0;
  306. TT_MAC_ID_JAPANESE = 1;
  307. TT_MAC_ID_TRADITIONAL_CHINESE = 2;
  308. TT_MAC_ID_KOREAN = 3;
  309. TT_MAC_ID_ARABIC = 4;
  310. TT_MAC_ID_HEBREW = 5;
  311. TT_MAC_ID_GREEK = 6;
  312. TT_MAC_ID_RUSSIAN = 7;
  313. TT_MAC_ID_RSYMBOL = 8;
  314. TT_MAC_ID_DEVANAGARI = 9;
  315. TT_MAC_ID_GURMUKHI = 10;
  316. TT_MAC_ID_GUJARATI = 11;
  317. TT_MAC_ID_ORIYA = 12;
  318. TT_MAC_ID_BENGALI = 13;
  319. TT_MAC_ID_TAMIL = 14;
  320. TT_MAC_ID_TELUGU = 15;
  321. TT_MAC_ID_KANNADA = 16;
  322. TT_MAC_ID_MALAYALAM = 17;
  323. TT_MAC_ID_SINHALESE = 18;
  324. TT_MAC_ID_BURMESE = 19;
  325. TT_MAC_ID_KHMER = 20;
  326. TT_MAC_ID_THAI = 21;
  327. TT_MAC_ID_LAOTIAN = 22;
  328. TT_MAC_ID_GEORGIAN = 23;
  329. TT_MAC_ID_ARMENIAN = 24;
  330. TT_MAC_ID_MALDIVIAN = 25;
  331. TT_MAC_ID_SIMPLIFIED_CHINESE = 25;
  332. TT_MAC_ID_TIBETAN = 26;
  333. TT_MAC_ID_MONGOLIAN = 27;
  334. TT_MAC_ID_GEEZ = 28;
  335. TT_MAC_ID_SLAVIC = 29;
  336. TT_MAC_ID_VIETNAMESE = 30;
  337. TT_MAC_ID_SINDHI = 31;
  338. TT_MAC_ID_UNINTERP = 32;
  339. FT_LOAD_DEFAULT = 0;
  340. FT_LOAD_NO_SCALE = ( 1 shl 0 );
  341. FT_LOAD_NO_HINTING = ( 1 shl 1 );
  342. FT_LOAD_RENDER = ( 1 shl 2 );
  343. FT_LOAD_NO_BITMAP = ( 1 shl 3 );
  344. FT_LOAD_VERTICAL_LAYOUT = ( 1 shl 4 );
  345. FT_LOAD_FORCE_AUTOHINT = ( 1 shl 5 );
  346. FT_LOAD_CROP_BITMAP = ( 1 shl 6 );
  347. FT_LOAD_PEDANTIC = ( 1 shl 7 );
  348. FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH = ( 1 shl 9 );
  349. FT_LOAD_NO_RECURSE = ( 1 shl 10 );
  350. FT_LOAD_IGNORE_TRANSFORM = ( 1 shl 11 );
  351. FT_LOAD_MONOCHROME = ( 1 shl 12 );
  352. FT_LOAD_LINEAR_DESIGN = ( 1 shl 13 );
  353. FT_LOAD_NO_AUTOHINT = ( 1 shl 15 );
  354. FT_LOAD_COLOR = ( 1 shl 20 );
  355. FT_GLYPH_FORMAT_NONE = 0;
  356. FT_GLYPH_FORMAT_COMPOSITE = (Ord('c') shl 24) or
  357. (Ord('o') shl 16) or
  358. (Ord('m') shl 8) or
  359. (Ord('p'));
  360. FT_GLYPH_FORMAT_BITMAP = (Ord('b') shl 24) or
  361. (Ord('i') shl 16) or
  362. (Ord('t') shl 8) or
  363. (Ord('s'));
  364. FT_GLYPH_FORMAT_OUTLINE = (Ord('o') shl 24) or
  365. (Ord('u') shl 16) or
  366. (Ord('t') shl 8) or
  367. (Ord('l'));
  368. FT_GLYPH_FORMAT_PLOTTER = (Ord('p') shl 24) or
  369. (Ord('l') shl 16) or
  370. (Ord('o') shl 8) or
  371. (Ord('t'));
  372. //FT_PIXEL_MODE_NONE = 0;
  373. FT_PIXEL_MODE_MONO = 0;
  374. FT_PIXEL_MODE_GRAY = 1;
  375. FT_PIXEL_MODE_GRAY2 = 2;
  376. FT_PIXEL_MODE_GRAY4 = 3;
  377. FT_PIXEL_MODE_LCD = 4;
  378. FT_PIXEL_MODE_LCD_V = 5;
  379. FT_PIXEL_MODE_BGRA = 6;
  380. FT_ERR_Ok = $00;
  381. FT_ERR_None = $00;
  382. FT_ERR_Cannot_Open_Resource = $01;
  383. FT_ERR_Unknown_File_Format = $02;
  384. FT_ERR_Invalid_File_Format = $03;
  385. FT_ERR_Invalid_Version = $04;
  386. FT_ERR_Lower_Module_Version = $05;
  387. FT_ERR_Invalid_Argument = $06;
  388. FT_ERR_Unimplemented_Feature = $07;
  389. FT_ERR_Invalid_Table = $08;
  390. FT_ERR_Invalid_Offset = $09;
  391. FT_ERR_Array_Too_Large = $0A;
  392. { glyph/character errors }
  393. FT_ERR_Invalid_Glyph_Index = $10;
  394. FT_ERR_Invalid_Character_Code = $11;
  395. FT_ERR_Invalid_Glyph_Format = $12;
  396. FT_ERR_Cannot_Render_Glyph = $13;
  397. FT_ERR_Invalid_Outline = $14;
  398. FT_ERR_Invalid_Composite = $15;
  399. FT_ERR_Too_Many_Hints = $16;
  400. FT_ERR_Invalid_Pixel_Size = $17;
  401. { handle errors }
  402. FT_ERR_Invalid_Handle = $20;
  403. FT_ERR_Invalid_Library_Handle = $21;
  404. FT_ERR_Invalid_Driver_Handle = $22;
  405. FT_ERR_Invalid_Face_Handle = $23;
  406. FT_ERR_Invalid_Size_Handle = $24;
  407. FT_ERR_Invalid_Slot_Handle = $25;
  408. FT_ERR_Invalid_CharMap_Handle = $26;
  409. FT_ERR_Invalid_Cache_Handle = $27;
  410. FT_ERR_Invalid_Stream_Handle = $28;
  411. { driver errors }
  412. FT_ERR_Too_Many_Drivers = $30;
  413. FT_ERR_Too_Many_Extensions = $31;
  414. { memory errors }
  415. FT_ERR_Out_Of_Memory = $40;
  416. FT_ERR_Unlisted_Object = $41;
  417. { stream errors }
  418. FT_ERR_Cannot_Open_Stream = $51;
  419. FT_ERR_Invalid_Stream_Seek = $52;
  420. FT_ERR_Invalid_Stream_Skip = $53;
  421. FT_ERR_Invalid_Stream_Read = $54;
  422. FT_ERR_Invalid_Stream_Operation = $55;
  423. FT_ERR_Invalid_Frame_Operation = $56;
  424. FT_ERR_Nested_Frame_Access = $57;
  425. FT_ERR_Invalid_Frame_Read = $58;
  426. { raster errors }
  427. FT_ERR_Raster_Uninitialized = $60;
  428. FT_ERR_Raster_Corrupted = $61;
  429. FT_ERR_Raster_Overflow = $62;
  430. FT_ERR_Raster_Negative_Height = $63;
  431. { cache errors }
  432. FT_ERR_Too_Many_Caches = $70;
  433. { TrueType and SFNT errors }
  434. FT_ERR_Invalid_Opcode = $80;
  435. FT_ERR_Too_Few_Arguments = $81;
  436. FT_ERR_Stack_Overflow = $82;
  437. FT_ERR_Code_Overflow = $83;
  438. FT_ERR_Bad_Argument = $84;
  439. FT_ERR_Divide_By_Zero = $85;
  440. FT_ERR_Invalid_Reference = $86;
  441. FT_ERR_Debug_OpCode = $87;
  442. FT_ERR_ENDF_In_Exec_Stream = $88;
  443. FT_ERR_Nested_DEFS = $89;
  444. FT_ERR_Invalid_CodeRange = $8A;
  445. FT_ERR_Execution_Too_Long = $8B;
  446. FT_ERR_Too_Many_Function_Defs = $8C;
  447. FT_ERR_Too_Many_Instruction_Defs = $8D;
  448. FT_ERR_Table_Missing = $8E;
  449. FT_ERR_Horiz_Header_Missing = $8F;
  450. FT_ERR_Locations_Missing = $90;
  451. FT_ERR_Name_Table_Missing = $91;
  452. FT_ERR_CMap_Table_Missing = $92;
  453. FT_ERR_Hmtx_Table_Missing = $93;
  454. FT_ERR_Post_Table_Missing = $94;
  455. FT_ERR_Invalid_Horiz_Metrics = $95;
  456. FT_ERR_Invalid_CharMap_Format = $96;
  457. FT_ERR_Invalid_PPem = $97;
  458. FT_ERR_Invalid_Vert_Metrics = $98;
  459. FT_ERR_Could_Not_Find_Context = $99;
  460. FT_ERR_Invalid_Post_Table_Format = $9A;
  461. FT_ERR_Invalid_Post_Table = $9B;
  462. { CFF CID and Type 1 errors }
  463. FT_ERR_Syntax_Error = $A0;
  464. FT_ERR_Stack_Underflow = $A1;
  465. FT_ERR_Ignore = $A2;
  466. { BDF errors }
  467. FT_ERR_Missing_Startfont_Field = $B0;
  468. FT_ERR_Missing_Font_Field = $B1;
  469. FT_ERR_Missing_Size_Field = $B2;
  470. FT_ERR_Missing_Chars_Field = $B3;
  471. FT_ERR_Missing_Startchar_Field = $B4;
  472. FT_ERR_Missing_Encoding_Field = $B5;
  473. FT_ERR_Missing_Bbx_Field = $B6;
  474. FT_ERR_Bbx_Too_Big = $B7;
  475. FT_ERR_Corrupted_Font_Header = $B8;
  476. FT_ERR_Corrupted_Font_Glyphs = $B9;
  477. FT_STYLE_FLAG_ITALIC = (1 shl 0);
  478. FT_STYLE_FLAG_BOLD = (1 shl 1);
  479. FT_RENDER_MODE_NORMAL = 0;
  480. FT_RENDER_MODE_LIGHT = 1;
  481. FT_RENDER_MODE_MONO = 2;
  482. FT_RENDER_MODE_LCD = 3;
  483. FT_RENDER_MODE_LCD_V = 4;
  484. FT_LOAD_TARGET_NORMAL = FT_RENDER_MODE_NORMAL shl 16;
  485. FT_LOAD_TARGET_LIGHT = FT_RENDER_MODE_LIGHT shl 16;
  486. FT_LOAD_TARGET_MONO = FT_RENDER_MODE_MONO shl 16;
  487. FT_LOAD_TARGET_LCD = FT_RENDER_MODE_LCD shl 16;
  488. FT_LOAD_TARGET_LCD_V = FT_RENDER_MODE_LCD_V shl 16;
  489. FT_SFNT_HEAD = 0;
  490. FT_SFNT_MAXP = 1;
  491. FT_SFNT_OS2 = 2;
  492. FT_SFNT_HHEA = 3;
  493. FT_SFNT_VHEA = 4;
  494. FT_SFNT_POST = 5;
  495. FT_SFNT_PCLT = 6;
  496. function InitFreeType: FT_Library;
  497. procedure QuitFreeType;
  498. implementation
  499. {$IFDEF WINDOWS}
  500. {$IFDEF WIN32}
  501. {$DEFINE TS_FT_WIN32}
  502. {$ELSE}
  503. {$DEFINE TS_FT_WIN64}
  504. {$ENDIF}
  505. {$ELSE}
  506. {$DEFINE TS_FT_LINUX}
  507. {$ENDIF}
  508. const
  509. {$IF DEFINED(TS_FT_WIN32)}
  510. LIB_FREE_TYPE = 'freetype6-x86.dll';
  511. {$ELSEIF DEFINED(TS_FT_WIN64)}
  512. LIB_FREE_TYPE = 'freetype6-x64.dll';
  513. {$ELSEIF DEFINED(TS_FT_LINUX)}
  514. LIB_FREE_TYPE = 'libfreetype.so';
  515. {$ELSE}
  516. {$ERROR 'unknown/unsupported OS'}
  517. {$IFEND}
  518. var
  519. FreeTypeInitialized: Boolean;
  520. FreeTypeRefCount: Integer;
  521. FreeTypeCritSec: TCriticalSection;
  522. FreeTypeLibHandle: TLibHandle = 0;
  523. ftLibrary: FT_Library;
  524. function InitFreeType: FT_Library;
  525. function GetProcAddr(const aName: String): Pointer;
  526. begin
  527. result := GetProcAddress(FreeTypeLibHandle, aName);
  528. if not Assigned(result) then
  529. raise EtsException.Create('unable to load procedure from library: ' + aName);
  530. end;
  531. var
  532. err: FT_Error;
  533. begin
  534. result := nil;
  535. FreeTypeCritSec.Enter;
  536. try try
  537. inc(FreeTypeRefCount, 1);
  538. if FreeTypeInitialized then
  539. exit;
  540. if (FreeTypeLibHandle = 0) then begin
  541. FreeTypeLibHandle := LoadLibrary(LIB_FREE_TYPE);
  542. if (FreeTypeLibHandle = 0) then
  543. raise EtsException.Create('unable to load free type lib: ' + LIB_FREE_TYPE + ' error=' + IntToStr(GetLastOSError));
  544. end;
  545. FT_Init_FreeType := TFT_Init_FreeType( GetProcAddr('FT_Init_FreeType'));
  546. FT_Done_FreeType := TFT_Done_FreeType( GetProcAddr('FT_Done_FreeType'));
  547. FT_New_Face := TFT_New_Face( GetProcAddr('FT_New_Face'));
  548. FT_New_Memory_Face := TFT_New_Memory_Face(GetProcAddr('FT_New_Memory_Face'));
  549. FT_Done_Face := TFT_Done_Face( GetProcAddr('FT_Done_Face'));
  550. FT_Get_Sfnt_Name_Count := TFT_Get_Sfnt_Name_Count(GetProcAddr('FT_Get_Sfnt_Name_Count'));
  551. FT_Get_Sfnt_Name := TFT_Get_Sfnt_Name( GetProcAddr('FT_Get_Sfnt_Name'));
  552. FT_Set_Char_Size := TFT_Set_Char_Size( GetProcAddr('FT_Set_Char_Size'));
  553. FT_Load_Char := TFT_Load_Char( GetProcAddr('FT_Load_Char'));
  554. FT_Get_Sfnt_Table := TFT_Get_Sfnt_Table(GetProcAddr('FT_Get_Sfnt_Table'));
  555. err := FT_Init_FreeType(@ftLibrary);
  556. if (err <> 0) then
  557. raise EtsException.Create('unable to create free type library handle: ' + IntToStr(err));
  558. FreeTypeInitialized := true;
  559. result := ftLibrary;
  560. except
  561. FreeTypeInitialized := false;
  562. end;
  563. finally
  564. FreeTypeCritSec.Leave;
  565. end;
  566. end;
  567. procedure QuitFreeType;
  568. begin
  569. FreeTypeCritSec.Enter;
  570. try
  571. dec(FreeTypeRefCount, 1);
  572. if (FreeTypeRefCount > 0) then
  573. exit;
  574. FT_Done_FreeType(ftLibrary);
  575. FT_Init_FreeType := nil;
  576. FT_Done_FreeType := nil;
  577. FT_New_Face := nil;
  578. FT_New_Memory_Face := nil;
  579. FT_Done_Face := nil;
  580. FT_Get_Sfnt_Name_Count := nil;
  581. FT_Get_Sfnt_Name := nil;
  582. FT_Set_Char_Size := nil;
  583. FT_Load_Char := nil;
  584. FT_Get_Sfnt_Table := nil;
  585. if (FreeTypeLibHandle <> 0) then begin
  586. FreeLibrary(FreeTypeLibHandle);
  587. FreeTypeLibHandle := 0;
  588. end;
  589. FreeTypeInitialized := false;
  590. finally
  591. FreeTypeCritSec.Leave;
  592. end;
  593. end;
  594. initialization
  595. FreeTypeRefCount := 0;
  596. FreeTypeInitialized := false;
  597. FreeTypeCritSec := TCriticalSection.Create;
  598. finalization
  599. if FreeTypeInitialized then
  600. QuitFreeType;
  601. FreeAndNil(FreeTypeCritSec);
  602. end.