ttengine.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. {
  2. This file is part of the Free Pascal run time library.
  3. A file in Amiga system run time library.
  4. Copyright (c) 2003 by Nils Sjöholm.
  5. member of the Amiga RTL development team.
  6. This is a unit for ttengine.library
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. {
  14. History:
  15. First version of this unit.
  16. 16 Jan 2003.
  17. Changed cardinal > longword.
  18. Changed startcode for unit.
  19. 12 Feb 2003.
  20. [email protected] Nils Sjoholm
  21. }
  22. {$mode objfpc}
  23. {$I useamigasmartlink.inc}
  24. {$ifdef use_amiga_smartlink}
  25. {$smartlink on}
  26. {$endif use_amiga_smartlink}
  27. UNIT TTENGINE;
  28. INTERFACE
  29. USES Exec,utility,graphics;
  30. VAR TTEngineBase : pLibrary;
  31. const
  32. TTENGINENAME : PChar = 'ttengine.library';
  33. { $VER: ttengine.h 6.0 (3.1.2003) (c) by Grzegorz Kraszewski 2002. }
  34. const
  35. TTENGINEVERSION = 6;
  36. TTENGINEMINVERSION = 3;
  37. { Tags }
  38. { Tags applicability legend: }
  39. { O - TT_OpenFont() }
  40. { G - TT_GetAttrs() }
  41. { S - TT_SetAttrs() }
  42. { P - TT_GetPixmap() }
  43. { ---- name -------------------- value ----- applicability }
  44. { OG.. }
  45. TT_FontFile = $6EDA0000;
  46. { OG.. }
  47. TT_FontStyle = $6EDA0001;
  48. TT_FontStyle_Regular = 0;
  49. TT_FontStyle_Italic = 1;
  50. { O... }
  51. TT_FamilyTable = $6EDA0002;
  52. { OG.. }
  53. TT_FontSize = $6EDA0003;
  54. { OG.. }
  55. TT_FontWeight = $6EDA0004;
  56. TT_FontWeight_Normal = 400;
  57. TT_FontWeight_Bold = 700;
  58. { O... }
  59. TT_ColorMap = $6EDA0005;
  60. { O... }
  61. TT_Screen = $6EDA0006;
  62. { O... }
  63. TT_Window = $6EDA0007;
  64. { .G.. }
  65. TT_FontAscender = $6EDA0008;
  66. { .G.. }
  67. TT_FontDescender = $6EDA0009;
  68. { .GSP }
  69. TT_Antialias = $6EDA000F;
  70. TT_Antialias_Auto = 0;
  71. TT_Antialias_Off = 1;
  72. TT_Antialias_On = 2;
  73. { .GSP }
  74. TT_Encoding = $6EDA0010;
  75. { supported }
  76. { use ENV:ttfcodepage or ISO-8859-1 if not found }
  77. TT_Encoding_Default = 0;
  78. { Western Europe and US }
  79. TT_Encoding_ISO8859_1 = 4;
  80. { Eastern Europe }
  81. TT_Encoding_ISO8859_2 = 5;
  82. TT_Encoding_ISO8859_3 = 6;
  83. TT_Encoding_ISO8859_4 = 7;
  84. TT_Encoding_ISO8859_5 = 8;
  85. TT_Encoding_ISO8859_6 = 9;
  86. TT_Encoding_ISO8859_7 = 10;
  87. TT_Encoding_ISO8859_8 = 11;
  88. TT_Encoding_ISO8859_9 = 12;
  89. TT_Encoding_ISO8859_10 = 13;
  90. TT_Encoding_ISO8859_11 = 14;
  91. TT_Encoding_ISO8859_13 = 109;
  92. TT_Encoding_ISO8859_14 = 110;
  93. TT_Encoding_ISO8859_15 = 111;
  94. TT_Encoding_ISO8859_16 = 112;
  95. TT_Encoding_UTF16_BE = 1013;
  96. TT_Encoding_UTF32_BE = 1018;
  97. TT_Encoding_UTF8 = 106;
  98. TT_Encoding_UTF16_LE = 1014;
  99. TT_Encoding_UTF32_LE = 1019;
  100. TT_Encoding_UTF16 = 1015;
  101. TT_Encoding_UTF32 = 1017;
  102. { .G.. }
  103. TT_FontName = $6EDA0011;
  104. { .G.. }
  105. TT_FamilyName = $6EDA0012;
  106. { .G.. }
  107. TT_SubfamilyName = $6EDA0013;
  108. { .GS. from 0 to 255 }
  109. TT_Transparency = $6EDA0014;
  110. { O.SP single precision floating point +- 0.01 to 100 }
  111. TT_ScaleX = $6EDA0015;
  112. { O.SP single precision floating point +- 0.01 to 100 }
  113. TT_ScaleY = $6EDA0016;
  114. { ..SP (V5) }
  115. TT_SoftStyle = $6EDA0017;
  116. TT_SoftStyle_None = $0000;
  117. TT_SoftStyle_Underlined = $0001;
  118. TT_SoftStyle_DblUnderlined = $0002;
  119. TT_SoftStyle_Overstriked = $0004;
  120. TT_SoftStyle_DblOverstriked = $0008;
  121. { ..S. foreground RGB value }
  122. TT_Foreground = $6EDA0018;
  123. TT_Foreground_UseRastPort = -(1);
  124. { ..S. background RGB value }
  125. TT_Background = $6EDA0019;
  126. TT_Background_UseRastPort = -(1);
  127. { .G.. }
  128. TT_FontMaxTop = $6EDA001E;
  129. { .G.. }
  130. TT_FontMaxBottom = $6EDA001F;
  131. { .G.. }
  132. TT_FontDesignHeight = $6EDA0020;
  133. { .G.. }
  134. TT_FontRealAscender = $6EDA0021;
  135. { .G.. }
  136. TT_FontRealDescender = $6EDA0022;
  137. { .G.. }
  138. TT_FontAccentedAscender = $6EDA0023;
  139. { ..SP }
  140. TT_CustomEncoding = $6EDA0024;
  141. { Structure returned by TT_GetPixmap() (V5) }
  142. type
  143. PTT_Pixmap = ^tTT_Pixmap;
  144. tTT_Pixmap = record
  145. ttp_Size : ULONG; { size of the structure inculdung this field }
  146. ttp_Width : ULONG; { also equal to bytes per row }
  147. ttp_Height : ULONG; { number of rows }
  148. ttp_Data : Pointer; { grayscale pixmap data }
  149. end;
  150. { font requester attributes (V6) }
  151. const
  152. { struct Window , NULL }
  153. TTRQ_Window = $6EDA2000;
  154. { STRPTR, NULL [Workbench] }
  155. TTRQ_PubScreenName = $6EDA2001;
  156. { struct Screen , NULL }
  157. TTRQ_Screen = $6EDA2002;
  158. { BOOL, FALSE }
  159. TTRQ_SleepWindow = $6EDA2003;
  160. { STRPTR, "Select TrueType font" or localized }
  161. TTRQ_TitleText = $6EDA2004;
  162. { STRPTR, "OK" or localized }
  163. TTRQ_PositiveText = $6EDA2005;
  164. { STRPTR, "Cancel" or localized }
  165. TTRQ_NegativeText = $6EDA2006;
  166. { WORD, centered on screen }
  167. TTRQ_InitialLeftEdge = $6EDA2007;
  168. { WORD, centered on screen }
  169. TTRQ_InitialTopEdge = $6EDA2008;
  170. { WORD, max(200, 25% of sceeen width) }
  171. TTRQ_InitialWidth = $6EDA2009;
  172. { WORD, max(200, 50% of screen height) }
  173. TTRQ_InitialHeight = $6EDA200A;
  174. { BOOL, TRUE }
  175. TTRQ_DoSizes = $6EDA2000;
  176. FUNCTION TT_AllocRequest : POINTER;
  177. PROCEDURE TT_CloseFont(font : POINTER);
  178. PROCEDURE TT_DoneRastPort(rp : pRastPort);
  179. PROCEDURE TT_FreePixmap(pixmap : pTT_Pixmap);
  180. PROCEDURE TT_FreeRequest(request : POINTER);
  181. FUNCTION TT_GetAttrsA(rp : pRastPort; taglist : pTagItem) : longword;
  182. FUNCTION TT_GetPixmapA(font : POINTER; _string : POINTER; count : longword; taglist : pTagItem) : pTT_Pixmap;
  183. FUNCTION TT_OpenFontA(taglist : pTagItem) : POINTER;
  184. FUNCTION TT_RequestA(request : POINTER; taglist : pTagItem) : pTagItem;
  185. FUNCTION TT_SetAttrsA(rp : pRastPort; taglist : pTagItem) : longword;
  186. FUNCTION TT_SetFont(rp : pRastPort; font : POINTER) : BOOLEAN;
  187. PROCEDURE TT_Text(rp : pRastPort; _string : POINTER; count : longword);
  188. PROCEDURE TT_TextExtent(rp : pRastPort; _string : POINTER; count : LONGINT; te : pTextExtent);
  189. FUNCTION TT_TextFit(rp : pRastPort; _string : POINTER; count : longword; te : pTextExtent; tec : pTextExtent; dir : LONGINT; cwidth : longword; cheight : longword) : longword;
  190. FUNCTION TT_TextLength(rp : pRastPort; _string : POINTER; count : longword) : longword;
  191. {
  192. Functions and procedures with array of const go here
  193. }
  194. FUNCTION TT_GetAttrs(rp : pRastPort; const taglist : Array Of Const) : longword;
  195. FUNCTION TT_GetPixmap(font : POINTER; _string : POINTER; count : longword; const taglist : Array Of Const) : pTT_Pixmap;
  196. FUNCTION TT_OpenFont(const taglist : Array Of Const) : POINTER;
  197. FUNCTION TT_Request(request : POINTER; const taglist : Array Of Const) : pTagItem;
  198. FUNCTION TT_SetAttrs(rp : pRastPort; const taglist : Array Of Const) : longword;
  199. {You can remove this include and use a define instead}
  200. {$I useautoopenlib.inc}
  201. {$ifdef use_init_openlib}
  202. procedure InitTTENGINELibrary;
  203. {$endif use_init_openlib}
  204. {This is a variable that knows how the unit is compiled}
  205. var
  206. TTENGINEIsCompiledHow : longint;
  207. IMPLEMENTATION
  208. uses
  209. {$ifndef dont_use_openlib}
  210. msgbox,
  211. {$endif dont_use_openlib}
  212. tagsarray;
  213. FUNCTION TT_AllocRequest : POINTER;
  214. BEGIN
  215. ASM
  216. MOVE.L A6,-(A7)
  217. MOVEA.L TTEngineBase,A6
  218. JSR -102(A6)
  219. MOVEA.L (A7)+,A6
  220. MOVE.L D0,@RESULT
  221. END;
  222. END;
  223. PROCEDURE TT_CloseFont(font : POINTER);
  224. BEGIN
  225. ASM
  226. MOVE.L A6,-(A7)
  227. MOVEA.L font,A0
  228. MOVEA.L TTEngineBase,A6
  229. JSR -042(A6)
  230. MOVEA.L (A7)+,A6
  231. END;
  232. END;
  233. PROCEDURE TT_DoneRastPort(rp : pRastPort);
  234. BEGIN
  235. ASM
  236. MOVE.L A6,-(A7)
  237. MOVEA.L rp,A1
  238. MOVEA.L TTEngineBase,A6
  239. JSR -096(A6)
  240. MOVEA.L (A7)+,A6
  241. END;
  242. END;
  243. PROCEDURE TT_FreePixmap(pixmap : pTT_Pixmap);
  244. BEGIN
  245. ASM
  246. MOVE.L A6,-(A7)
  247. MOVEA.L pixmap,A0
  248. MOVEA.L TTEngineBase,A6
  249. JSR -090(A6)
  250. MOVEA.L (A7)+,A6
  251. END;
  252. END;
  253. PROCEDURE TT_FreeRequest(request : POINTER);
  254. BEGIN
  255. ASM
  256. MOVE.L A6,-(A7)
  257. MOVEA.L request,A0
  258. MOVEA.L TTEngineBase,A6
  259. JSR -114(A6)
  260. MOVEA.L (A7)+,A6
  261. END;
  262. END;
  263. FUNCTION TT_GetAttrsA(rp : pRastPort; taglist : pTagItem) : longword;
  264. BEGIN
  265. ASM
  266. MOVE.L A6,-(A7)
  267. MOVEA.L rp,A1
  268. MOVEA.L taglist,A0
  269. MOVEA.L TTEngineBase,A6
  270. JSR -060(A6)
  271. MOVEA.L (A7)+,A6
  272. MOVE.L D0,@RESULT
  273. END;
  274. END;
  275. FUNCTION TT_GetPixmapA(font : POINTER; _string : POINTER; count : longword; taglist : pTagItem) : pTT_Pixmap;
  276. BEGIN
  277. ASM
  278. MOVE.L A6,-(A7)
  279. MOVEA.L font,A1
  280. MOVEA.L _string,A2
  281. MOVE.L count,D0
  282. MOVEA.L taglist,A0
  283. MOVEA.L TTEngineBase,A6
  284. JSR -084(A6)
  285. MOVEA.L (A7)+,A6
  286. MOVE.L D0,@RESULT
  287. END;
  288. END;
  289. FUNCTION TT_OpenFontA(taglist : pTagItem) : POINTER;
  290. BEGIN
  291. ASM
  292. MOVE.L A6,-(A7)
  293. MOVEA.L taglist,A0
  294. MOVEA.L TTEngineBase,A6
  295. JSR -030(A6)
  296. MOVEA.L (A7)+,A6
  297. MOVE.L D0,@RESULT
  298. END;
  299. END;
  300. FUNCTION TT_RequestA(request : POINTER; taglist : pTagItem) : pTagItem;
  301. BEGIN
  302. ASM
  303. MOVE.L A6,-(A7)
  304. MOVEA.L request,A0
  305. MOVEA.L taglist,A1
  306. MOVEA.L TTEngineBase,A6
  307. JSR -108(A6)
  308. MOVEA.L (A7)+,A6
  309. MOVE.L D0,@RESULT
  310. END;
  311. END;
  312. FUNCTION TT_SetAttrsA(rp : pRastPort; taglist : pTagItem) : longword;
  313. BEGIN
  314. ASM
  315. MOVE.L A6,-(A7)
  316. MOVEA.L rp,A1
  317. MOVEA.L taglist,A0
  318. MOVEA.L TTEngineBase,A6
  319. JSR -054(A6)
  320. MOVEA.L (A7)+,A6
  321. MOVE.L D0,@RESULT
  322. END;
  323. END;
  324. FUNCTION TT_SetFont(rp : pRastPort; font : POINTER) : BOOLEAN;
  325. BEGIN
  326. ASM
  327. MOVE.L A6,-(A7)
  328. MOVEA.L rp,A1
  329. MOVEA.L font,A0
  330. MOVEA.L TTEngineBase,A6
  331. JSR -036(A6)
  332. MOVEA.L (A7)+,A6
  333. TST.W D0
  334. BEQ.B @end
  335. MOVEQ #1,D0
  336. @end: MOVE.B D0,@RESULT
  337. END;
  338. END;
  339. PROCEDURE TT_Text(rp : pRastPort; _string : POINTER; count : longword);
  340. BEGIN
  341. ASM
  342. MOVE.L A6,-(A7)
  343. MOVEA.L rp,A1
  344. MOVEA.L _string,A0
  345. MOVE.L count,D0
  346. MOVEA.L TTEngineBase,A6
  347. JSR -048(A6)
  348. MOVEA.L (A7)+,A6
  349. END;
  350. END;
  351. PROCEDURE TT_TextExtent(rp : pRastPort; _string : POINTER; count : LONGINT; te : pTextExtent);
  352. BEGIN
  353. ASM
  354. MOVE.L A6,-(A7)
  355. MOVEA.L rp,A1
  356. MOVEA.L _string,A0
  357. MOVE.L count,D0
  358. MOVEA.L te,A2
  359. MOVEA.L TTEngineBase,A6
  360. JSR -072(A6)
  361. MOVEA.L (A7)+,A6
  362. END;
  363. END;
  364. FUNCTION TT_TextFit(rp : pRastPort; _string : POINTER; count : longword; te : pTextExtent; tec : pTextExtent; dir : LONGINT; cwidth : longword; cheight : longword) : longword;
  365. BEGIN
  366. ASM
  367. MOVE.L A6,-(A7)
  368. MOVEA.L rp,A1
  369. MOVEA.L _string,A0
  370. MOVE.L count,D0
  371. MOVEA.L te,A2
  372. MOVEA.L tec,A3
  373. MOVE.L dir,D1
  374. MOVE.L cwidth,D2
  375. MOVE.L cheight,D3
  376. MOVEA.L TTEngineBase,A6
  377. JSR -078(A6)
  378. MOVEA.L (A7)+,A6
  379. MOVE.L D0,@RESULT
  380. END;
  381. END;
  382. FUNCTION TT_TextLength(rp : pRastPort; _string : POINTER; count : longword) : longword;
  383. BEGIN
  384. ASM
  385. MOVE.L A6,-(A7)
  386. MOVEA.L rp,A1
  387. MOVEA.L _string,A0
  388. MOVE.L count,D0
  389. MOVEA.L TTEngineBase,A6
  390. JSR -066(A6)
  391. MOVEA.L (A7)+,A6
  392. MOVE.L D0,@RESULT
  393. END;
  394. END;
  395. {
  396. Functions and procedures with array of const go here
  397. }
  398. FUNCTION TT_GetAttrs(rp : pRastPort; const taglist : Array Of Const) : longword;
  399. begin
  400. TT_GetAttrs := TT_GetAttrsA(rp , readintags(taglist));
  401. end;
  402. FUNCTION TT_GetPixmap(font : POINTER; _string : POINTER; count : longword; const taglist : Array Of Const) : pTT_Pixmap;
  403. begin
  404. TT_GetPixmap := TT_GetPixmapA(font , _string , count , readintags(taglist));
  405. end;
  406. FUNCTION TT_OpenFont(const taglist : Array Of Const) : POINTER;
  407. begin
  408. TT_OpenFont := TT_OpenFontA(readintags(taglist));
  409. end;
  410. FUNCTION TT_Request(request : POINTER; const taglist : Array Of Const) : pTagItem;
  411. begin
  412. TT_Request := TT_RequestA(request , readintags(taglist));
  413. end;
  414. FUNCTION TT_SetAttrs(rp : pRastPort; const taglist : Array Of Const) : longword;
  415. begin
  416. TT_SetAttrs := TT_SetAttrsA(rp , readintags(taglist));
  417. end;
  418. const
  419. { Change VERSION and LIBVERSION to proper values }
  420. VERSION : string[2] = '0';
  421. LIBVERSION : longword = 0;
  422. {$ifdef use_init_openlib}
  423. {$Info Compiling initopening of ttengine.library}
  424. {$Info don't forget to use InitTTENGINELibrary in the beginning of your program}
  425. var
  426. ttengine_exit : Pointer;
  427. procedure ClosettengineLibrary;
  428. begin
  429. ExitProc := ttengine_exit;
  430. if TTEngineBase <> nil then begin
  431. CloseLibrary(TTEngineBase);
  432. TTEngineBase := nil;
  433. end;
  434. end;
  435. procedure InitTTENGINELibrary;
  436. begin
  437. TTEngineBase := nil;
  438. TTEngineBase := OpenLibrary(TTENGINENAME,LIBVERSION);
  439. if TTEngineBase <> nil then begin
  440. ttengine_exit := ExitProc;
  441. ExitProc := @ClosettengineLibrary;
  442. end else begin
  443. MessageBox('FPC Pascal Error',
  444. 'Can''t open ttengine.library version ' + VERSION + #10 +
  445. 'Deallocating resources and closing down',
  446. 'Oops');
  447. halt(20);
  448. end;
  449. end;
  450. begin
  451. TTENGINEIsCompiledHow := 2;
  452. {$endif use_init_openlib}
  453. {$ifdef use_auto_openlib}
  454. {$Info Compiling autoopening of ttengine.library}
  455. var
  456. ttengine_exit : Pointer;
  457. procedure ClosettengineLibrary;
  458. begin
  459. ExitProc := ttengine_exit;
  460. if TTEngineBase <> nil then begin
  461. CloseLibrary(TTEngineBase);
  462. TTEngineBase := nil;
  463. end;
  464. end;
  465. begin
  466. TTEngineBase := nil;
  467. TTEngineBase := OpenLibrary(TTENGINENAME,LIBVERSION);
  468. if TTEngineBase <> nil then begin
  469. ttengine_exit := ExitProc;
  470. ExitProc := @ClosettengineLibrary;
  471. TTENGINEIsCompiledHow := 1;
  472. end else begin
  473. MessageBox('FPC Pascal Error',
  474. 'Can''t open ttengine.library version ' + VERSION + #10 +
  475. 'Deallocating resources and closing down',
  476. 'Oops');
  477. halt(20);
  478. end;
  479. {$endif use_auto_openlib}
  480. {$ifdef dont_use_openlib}
  481. begin
  482. TTENGINEIsCompiledHow := 3;
  483. {$Warning No autoopening of ttengine.library compiled}
  484. {$Warning Make sure you open ttengine.library yourself}
  485. {$endif dont_use_openlib}
  486. END. (* UNIT TTENGINE *)