/packages/amunits/src/coreunits/layers.pas

https://github.com/slibre/freepascal · Pascal · 657 lines · 529 code · 65 blank · 63 comment · 6 complexity · 8aecdf8ea9f3ff982ebce37b5c1c0de3 MD5 · raw file

  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) 1998-2003 by Nils Sjoholm
  5. member of the Amiga RTL development team.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {
  13. History:
  14. Added the defines use_amiga_smartlink and
  15. use_auto_openlib. Implemented autoopening
  16. of the library.
  17. 14 Jan 2003.
  18. Update for AmigaOS 3.9.
  19. Changed start code for unit.
  20. 06 Feb 2003.
  21. Changed integer > smallint,
  22. cardinal > longword.
  23. 09 Feb 2003.
  24. nils.sjoholm@mailbox.swipnet.se
  25. }
  26. {$I useamigasmartlink.inc}
  27. {$ifdef use_amiga_smartlink}
  28. {$smartlink on}
  29. {$endif use_amiga_smartlink}
  30. UNIT layers;
  31. INTERFACE
  32. USES exec, graphics, utility;
  33. const
  34. LAYERSIMPLE = 1;
  35. LAYERSMART = 2;
  36. LAYERSUPER = 4;
  37. LAYERUPDATING = $10;
  38. LAYERBACKDROP = $40;
  39. LAYERREFRESH = $80;
  40. LAYER_CLIPRECTS_LOST = $100; { during BeginUpdate }
  41. { or during layerop }
  42. { this happens if out of memory }
  43. LMN_REGION = -1;
  44. type
  45. pLayer_Info = ^tLayer_Info;
  46. tLayer_Info = record
  47. top_layer : pLayer;
  48. check_lp : pLayer; { !! Private !! }
  49. obs : pClipRect;
  50. FreeClipRects : pClipRect; { !! Private !! }
  51. PrivateReserve1, { !! Private !! }
  52. PrivateReserve2 : Longint; { !! Private !! }
  53. Lock : tSignalSemaphore; { !! Private !! }
  54. gs_Head : tMinList; { !! Private !! }
  55. PrivateReserve3 : smallint; { !! Private !! }
  56. PrivateReserve4 : Pointer; { !! Private !! }
  57. Flags : WORD;
  58. fatten_count : Shortint; { !! Private !! }
  59. LockLayersCount : Shortint; { !! Private !! }
  60. PrivateReserve5 : smallint; { !! Private !! }
  61. BlankHook, { !! Private !! }
  62. LayerInfo_extra : Pointer; { !! Private !! }
  63. end;
  64. const
  65. NEWLAYERINFO_CALLED = 1;
  66. {
  67. * LAYERS_NOBACKFILL is the value needed to get no backfill hook
  68. * LAYERS_BACKFILL is the value needed to get the default backfill hook
  69. }
  70. LAYERS_NOBACKFILL = 1;
  71. LAYERS_BACKFILL = 0;
  72. LAYERSNAME : PChar = 'layers.library';
  73. VAR LayersBase : pLibrary;
  74. FUNCTION BeginUpdate(l : pLayer) : LONGINT;
  75. FUNCTION BehindLayer(dummy : LONGINT; layer : pLayer) : LONGINT;
  76. FUNCTION CreateBehindHookLayer(li : pLayer_Info; bm : pBitMap; x0 : LONGINT; y0 : LONGINT; x1 : LONGINT; y1 : LONGINT; flags : LONGINT; hook : pHook; bm2 : pBitMap) : pLayer;
  77. FUNCTION CreateBehindLayer(li : pLayer_Info; bm : pBitMap; x0 : LONGINT; y0 : LONGINT; x1 : LONGINT; y1 : LONGINT; flags : LONGINT; bm2 : pBitMap) : pLayer;
  78. FUNCTION CreateUpfrontHookLayer(li : pLayer_Info; bm : pBitMap; x0 : LONGINT; y0 : LONGINT; x1 : LONGINT; y1 : LONGINT; flags : LONGINT; hook : pHook; bm2 : pBitMap) : pLayer;
  79. FUNCTION CreateUpfrontLayer(li : pLayer_Info; bm : pBitMap; x0 : LONGINT; y0 : LONGINT; x1 : LONGINT; y1 : LONGINT; flags : LONGINT; bm2 : pBitMap) : pLayer;
  80. FUNCTION DeleteLayer(dummy : LONGINT; layer : pLayer) : LONGINT;
  81. PROCEDURE DisposeLayerInfo(li : pLayer_Info);
  82. PROCEDURE DoHookClipRects(hook : pHook; rport : pRastPort;const rect : pRectangle);
  83. PROCEDURE EndUpdate(layer : pLayer; flag : ULONG);
  84. FUNCTION FattenLayerInfo(li : pLayer_Info) : LONGINT;
  85. PROCEDURE InitLayers(li : pLayer_Info);
  86. FUNCTION InstallClipRegion(layer : pLayer;const region : pRegion) : pRegion;
  87. FUNCTION InstallLayerHook(layer : pLayer; hook : pHook) : pHook;
  88. FUNCTION InstallLayerInfoHook(li : pLayer_Info;const hook : pHook) : pHook;
  89. PROCEDURE LockLayer(dummy : LONGINT; layer : pLayer);
  90. PROCEDURE LockLayerInfo(li : pLayer_Info);
  91. PROCEDURE LockLayers(li : pLayer_Info);
  92. FUNCTION MoveLayer(dummy : LONGINT; layer : pLayer; dx : LONGINT; dy : LONGINT) : LONGINT;
  93. FUNCTION MoveLayerInFrontOf(layer_to_move : pLayer; other_layer : pLayer) : LONGINT;
  94. FUNCTION MoveSizeLayer(layer : pLayer; dx : LONGINT; dy : LONGINT; dw : LONGINT; dh : LONGINT) : LONGINT;
  95. FUNCTION NewLayerInfo : pLayer_Info;
  96. PROCEDURE ScrollLayer(dummy : LONGINT; layer : pLayer; dx : LONGINT; dy : LONGINT);
  97. FUNCTION SizeLayer(dummy : LONGINT; layer : pLayer; dx : LONGINT; dy : LONGINT) : LONGINT;
  98. PROCEDURE SortLayerCR(layer : pLayer; dx : LONGINT; dy : LONGINT);
  99. PROCEDURE SwapBitsRastPortClipRect(rp : pRastPort; cr : pClipRect);
  100. PROCEDURE ThinLayerInfo(li : pLayer_Info);
  101. PROCEDURE UnlockLayer(layer : pLayer);
  102. PROCEDURE UnlockLayerInfo(li : pLayer_Info);
  103. PROCEDURE UnlockLayers(li : pLayer_Info);
  104. FUNCTION UpfrontLayer(dummy : LONGINT; layer : pLayer) : LONGINT;
  105. FUNCTION WhichLayer(li : pLayer_Info; x : LONGINT; y : LONGINT) : pLayer;
  106. {Here we read how to compile this unit}
  107. {You can remove this include and use a define instead}
  108. {$I useautoopenlib.inc}
  109. {$ifdef use_init_openlib}
  110. procedure InitLAYERSLibrary;
  111. {$endif use_init_openlib}
  112. {This is a variable that knows how the unit is compiled}
  113. var
  114. LAYERSIsCompiledHow : longint;
  115. IMPLEMENTATION
  116. uses
  117. {$ifndef dont_use_openlib}
  118. msgbox;
  119. {$endif dont_use_openlib}
  120. FUNCTION BeginUpdate(l : pLayer) : LONGINT;
  121. BEGIN
  122. ASM
  123. MOVE.L A6,-(A7)
  124. MOVEA.L l,A0
  125. MOVEA.L LayersBase,A6
  126. JSR -078(A6)
  127. MOVEA.L (A7)+,A6
  128. MOVE.L D0,@RESULT
  129. END;
  130. END;
  131. FUNCTION BehindLayer(dummy : LONGINT; layer : pLayer) : LONGINT;
  132. BEGIN
  133. ASM
  134. MOVE.L A6,-(A7)
  135. MOVEA.L dummy,A0
  136. MOVEA.L layer,A1
  137. MOVEA.L LayersBase,A6
  138. JSR -054(A6)
  139. MOVEA.L (A7)+,A6
  140. MOVE.L D0,@RESULT
  141. END;
  142. END;
  143. FUNCTION CreateBehindHookLayer(li : pLayer_Info; bm : pBitMap; x0 : LONGINT; y0 : LONGINT; x1 : LONGINT; y1 : LONGINT; flags : LONGINT; hook : pHook; bm2 : pBitMap) : pLayer;
  144. BEGIN
  145. ASM
  146. MOVE.L A6,-(A7)
  147. MOVEA.L li,A0
  148. MOVEA.L bm,A1
  149. MOVE.L x0,D0
  150. MOVE.L y0,D1
  151. MOVE.L x1,D2
  152. MOVE.L y1,D3
  153. MOVE.L flags,D4
  154. MOVEA.L hook,A3
  155. MOVEA.L bm2,A2
  156. MOVEA.L LayersBase,A6
  157. JSR -192(A6)
  158. MOVEA.L (A7)+,A6
  159. MOVE.L D0,@RESULT
  160. END;
  161. END;
  162. FUNCTION CreateBehindLayer(li : pLayer_Info; bm : pBitMap; x0 : LONGINT; y0 : LONGINT; x1 : LONGINT; y1 : LONGINT; flags : LONGINT; bm2 : pBitMap) : pLayer;
  163. BEGIN
  164. ASM
  165. MOVE.L A6,-(A7)
  166. MOVEA.L li,A0
  167. MOVEA.L bm,A1
  168. MOVE.L x0,D0
  169. MOVE.L y0,D1
  170. MOVE.L x1,D2
  171. MOVE.L y1,D3
  172. MOVE.L flags,D4
  173. MOVEA.L bm2,A2
  174. MOVEA.L LayersBase,A6
  175. JSR -042(A6)
  176. MOVEA.L (A7)+,A6
  177. MOVE.L D0,@RESULT
  178. END;
  179. END;
  180. FUNCTION CreateUpfrontHookLayer(li : pLayer_Info; bm : pBitMap; x0 : LONGINT; y0 : LONGINT; x1 : LONGINT; y1 : LONGINT; flags : LONGINT; hook : pHook; bm2 : pBitMap) : pLayer;
  181. BEGIN
  182. ASM
  183. MOVE.L A6,-(A7)
  184. MOVEA.L li,A0
  185. MOVEA.L bm,A1
  186. MOVE.L x0,D0
  187. MOVE.L y0,D1
  188. MOVE.L x1,D2
  189. MOVE.L y1,D3
  190. MOVE.L flags,D4
  191. MOVEA.L hook,A3
  192. MOVEA.L bm2,A2
  193. MOVEA.L LayersBase,A6
  194. JSR -186(A6)
  195. MOVEA.L (A7)+,A6
  196. MOVE.L D0,@RESULT
  197. END;
  198. END;
  199. FUNCTION CreateUpfrontLayer(li : pLayer_Info; bm : pBitMap; x0 : LONGINT; y0 : LONGINT; x1 : LONGINT; y1 : LONGINT; flags : LONGINT; bm2 : pBitMap) : pLayer;
  200. BEGIN
  201. ASM
  202. MOVE.L A6,-(A7)
  203. MOVEA.L li,A0
  204. MOVEA.L bm,A1
  205. MOVE.L x0,D0
  206. MOVE.L y0,D1
  207. MOVE.L x1,D2
  208. MOVE.L y1,D3
  209. MOVE.L flags,D4
  210. MOVEA.L bm2,A2
  211. MOVEA.L LayersBase,A6
  212. JSR -036(A6)
  213. MOVEA.L (A7)+,A6
  214. MOVE.L D0,@RESULT
  215. END;
  216. END;
  217. FUNCTION DeleteLayer(dummy : LONGINT; layer : pLayer) : LONGINT;
  218. BEGIN
  219. ASM
  220. MOVE.L A6,-(A7)
  221. MOVEA.L dummy,A0
  222. MOVEA.L layer,A1
  223. MOVEA.L LayersBase,A6
  224. JSR -090(A6)
  225. MOVEA.L (A7)+,A6
  226. MOVE.L D0,@RESULT
  227. END;
  228. END;
  229. PROCEDURE DisposeLayerInfo(li : pLayer_Info);
  230. BEGIN
  231. ASM
  232. MOVE.L A6,-(A7)
  233. MOVEA.L li,A0
  234. MOVEA.L LayersBase,A6
  235. JSR -150(A6)
  236. MOVEA.L (A7)+,A6
  237. END;
  238. END;
  239. PROCEDURE DoHookClipRects(hook : pHook; rport : pRastPort;const rect : pRectangle);
  240. BEGIN
  241. ASM
  242. MOVE.L A6,-(A7)
  243. MOVEA.L hook,A0
  244. MOVEA.L rport,A1
  245. MOVEA.L rect,A2
  246. MOVEA.L LayersBase,A6
  247. JSR -216(A6)
  248. MOVEA.L (A7)+,A6
  249. END;
  250. END;
  251. PROCEDURE EndUpdate(layer : pLayer; flag : ULONG);
  252. BEGIN
  253. ASM
  254. MOVE.L A6,-(A7)
  255. MOVEA.L layer,A0
  256. MOVE.L flag,D0
  257. MOVEA.L LayersBase,A6
  258. JSR -084(A6)
  259. MOVEA.L (A7)+,A6
  260. END;
  261. END;
  262. FUNCTION FattenLayerInfo(li : pLayer_Info) : LONGINT;
  263. BEGIN
  264. ASM
  265. MOVE.L A6,-(A7)
  266. MOVEA.L li,A0
  267. MOVEA.L LayersBase,A6
  268. JSR -156(A6)
  269. MOVEA.L (A7)+,A6
  270. MOVE.L D0,@RESULT
  271. END;
  272. END;
  273. PROCEDURE InitLayers(li : pLayer_Info);
  274. BEGIN
  275. ASM
  276. MOVE.L A6,-(A7)
  277. MOVEA.L li,A0
  278. MOVEA.L LayersBase,A6
  279. JSR -030(A6)
  280. MOVEA.L (A7)+,A6
  281. END;
  282. END;
  283. FUNCTION InstallClipRegion(layer : pLayer;const region : pRegion) : pRegion;
  284. BEGIN
  285. ASM
  286. MOVE.L A6,-(A7)
  287. MOVEA.L layer,A0
  288. MOVEA.L region,A1
  289. MOVEA.L LayersBase,A6
  290. JSR -174(A6)
  291. MOVEA.L (A7)+,A6
  292. MOVE.L D0,@RESULT
  293. END;
  294. END;
  295. FUNCTION InstallLayerHook(layer : pLayer; hook : pHook) : pHook;
  296. BEGIN
  297. ASM
  298. MOVE.L A6,-(A7)
  299. MOVEA.L layer,A0
  300. MOVEA.L hook,A1
  301. MOVEA.L LayersBase,A6
  302. JSR -198(A6)
  303. MOVEA.L (A7)+,A6
  304. MOVE.L D0,@RESULT
  305. END;
  306. END;
  307. FUNCTION InstallLayerInfoHook(li : pLayer_Info;const hook : pHook) : pHook;
  308. BEGIN
  309. ASM
  310. MOVE.L A6,-(A7)
  311. MOVEA.L li,A0
  312. MOVEA.L hook,A1
  313. MOVEA.L LayersBase,A6
  314. JSR -204(A6)
  315. MOVEA.L (A7)+,A6
  316. MOVE.L D0,@RESULT
  317. END;
  318. END;
  319. PROCEDURE LockLayer(dummy : LONGINT; layer : pLayer);
  320. BEGIN
  321. ASM
  322. MOVE.L A6,-(A7)
  323. MOVEA.L dummy,A0
  324. MOVEA.L layer,A1
  325. MOVEA.L LayersBase,A6
  326. JSR -096(A6)
  327. MOVEA.L (A7)+,A6
  328. END;
  329. END;
  330. PROCEDURE LockLayerInfo(li : pLayer_Info);
  331. BEGIN
  332. ASM
  333. MOVE.L A6,-(A7)
  334. MOVEA.L li,A0
  335. MOVEA.L LayersBase,A6
  336. JSR -120(A6)
  337. MOVEA.L (A7)+,A6
  338. END;
  339. END;
  340. PROCEDURE LockLayers(li : pLayer_Info);
  341. BEGIN
  342. ASM
  343. MOVE.L A6,-(A7)
  344. MOVEA.L li,A0
  345. MOVEA.L LayersBase,A6
  346. JSR -108(A6)
  347. MOVEA.L (A7)+,A6
  348. END;
  349. END;
  350. FUNCTION MoveLayer(dummy : LONGINT; layer : pLayer; dx : LONGINT; dy : LONGINT) : LONGINT;
  351. BEGIN
  352. ASM
  353. MOVE.L A6,-(A7)
  354. MOVEA.L dummy,A0
  355. MOVEA.L layer,A1
  356. MOVE.L dx,D0
  357. MOVE.L dy,D1
  358. MOVEA.L LayersBase,A6
  359. JSR -060(A6)
  360. MOVEA.L (A7)+,A6
  361. MOVE.L D0,@RESULT
  362. END;
  363. END;
  364. FUNCTION MoveLayerInFrontOf(layer_to_move : pLayer; other_layer : pLayer) : LONGINT;
  365. BEGIN
  366. ASM
  367. MOVE.L A6,-(A7)
  368. MOVEA.L layer_to_move,A0
  369. MOVEA.L other_layer,A1
  370. MOVEA.L LayersBase,A6
  371. JSR -168(A6)
  372. MOVEA.L (A7)+,A6
  373. MOVE.L D0,@RESULT
  374. END;
  375. END;
  376. FUNCTION MoveSizeLayer(layer : pLayer; dx : LONGINT; dy : LONGINT; dw : LONGINT; dh : LONGINT) : LONGINT;
  377. BEGIN
  378. ASM
  379. MOVE.L A6,-(A7)
  380. MOVEA.L layer,A0
  381. MOVE.L dx,D0
  382. MOVE.L dy,D1
  383. MOVE.L dw,D2
  384. MOVE.L dh,D3
  385. MOVEA.L LayersBase,A6
  386. JSR -180(A6)
  387. MOVEA.L (A7)+,A6
  388. MOVE.L D0,@RESULT
  389. END;
  390. END;
  391. FUNCTION NewLayerInfo : pLayer_Info;
  392. BEGIN
  393. ASM
  394. MOVE.L A6,-(A7)
  395. MOVEA.L LayersBase,A6
  396. JSR -144(A6)
  397. MOVEA.L (A7)+,A6
  398. MOVE.L D0,@RESULT
  399. END;
  400. END;
  401. PROCEDURE ScrollLayer(dummy : LONGINT; layer : pLayer; dx : LONGINT; dy : LONGINT);
  402. BEGIN
  403. ASM
  404. MOVE.L A6,-(A7)
  405. MOVEA.L dummy,A0
  406. MOVEA.L layer,A1
  407. MOVE.L dx,D0
  408. MOVE.L dy,D1
  409. MOVEA.L LayersBase,A6
  410. JSR -072(A6)
  411. MOVEA.L (A7)+,A6
  412. END;
  413. END;
  414. FUNCTION SizeLayer(dummy : LONGINT; layer : pLayer; dx : LONGINT; dy : LONGINT) : LONGINT;
  415. BEGIN
  416. ASM
  417. MOVE.L A6,-(A7)
  418. MOVEA.L dummy,A0
  419. MOVEA.L layer,A1
  420. MOVE.L dx,D0
  421. MOVE.L dy,D1
  422. MOVEA.L LayersBase,A6
  423. JSR -066(A6)
  424. MOVEA.L (A7)+,A6
  425. MOVE.L D0,@RESULT
  426. END;
  427. END;
  428. PROCEDURE SortLayerCR(layer : pLayer; dx : LONGINT; dy : LONGINT);
  429. BEGIN
  430. ASM
  431. MOVE.L A6,-(A7)
  432. MOVEA.L layer,A0
  433. MOVE.L dx,D0
  434. MOVE.L dy,D1
  435. MOVEA.L LayersBase,A6
  436. JSR -210(A6)
  437. MOVEA.L (A7)+,A6
  438. END;
  439. END;
  440. PROCEDURE SwapBitsRastPortClipRect(rp : pRastPort; cr : pClipRect);
  441. BEGIN
  442. ASM
  443. MOVE.L A6,-(A7)
  444. MOVEA.L rp,A0
  445. MOVEA.L cr,A1
  446. MOVEA.L LayersBase,A6
  447. JSR -126(A6)
  448. MOVEA.L (A7)+,A6
  449. END;
  450. END;
  451. PROCEDURE ThinLayerInfo(li : pLayer_Info);
  452. BEGIN
  453. ASM
  454. MOVE.L A6,-(A7)
  455. MOVEA.L li,A0
  456. MOVEA.L LayersBase,A6
  457. JSR -162(A6)
  458. MOVEA.L (A7)+,A6
  459. END;
  460. END;
  461. PROCEDURE UnlockLayer(layer : pLayer);
  462. BEGIN
  463. ASM
  464. MOVE.L A6,-(A7)
  465. MOVEA.L layer,A0
  466. MOVEA.L LayersBase,A6
  467. JSR -102(A6)
  468. MOVEA.L (A7)+,A6
  469. END;
  470. END;
  471. PROCEDURE UnlockLayerInfo(li : pLayer_Info);
  472. BEGIN
  473. ASM
  474. MOVE.L A6,-(A7)
  475. MOVEA.L li,A0
  476. MOVEA.L LayersBase,A6
  477. JSR -138(A6)
  478. MOVEA.L (A7)+,A6
  479. END;
  480. END;
  481. PROCEDURE UnlockLayers(li : pLayer_Info);
  482. BEGIN
  483. ASM
  484. MOVE.L A6,-(A7)
  485. MOVEA.L li,A0
  486. MOVEA.L LayersBase,A6
  487. JSR -114(A6)
  488. MOVEA.L (A7)+,A6
  489. END;
  490. END;
  491. FUNCTION UpfrontLayer(dummy : LONGINT; layer : pLayer) : LONGINT;
  492. BEGIN
  493. ASM
  494. MOVE.L A6,-(A7)
  495. MOVEA.L dummy,A0
  496. MOVEA.L layer,A1
  497. MOVEA.L LayersBase,A6
  498. JSR -048(A6)
  499. MOVEA.L (A7)+,A6
  500. MOVE.L D0,@RESULT
  501. END;
  502. END;
  503. FUNCTION WhichLayer(li : pLayer_Info; x : LONGINT; y : LONGINT) : pLayer;
  504. BEGIN
  505. ASM
  506. MOVE.L A6,-(A7)
  507. MOVEA.L li,A0
  508. MOVE.L x,D0
  509. MOVE.L y,D1
  510. MOVEA.L LayersBase,A6
  511. JSR -132(A6)
  512. MOVEA.L (A7)+,A6
  513. MOVE.L D0,@RESULT
  514. END;
  515. END;
  516. const
  517. { Change VERSION and LIBVERSION to proper values }
  518. VERSION : string[2] = '0';
  519. LIBVERSION : longword = 0;
  520. {$ifdef use_init_openlib}
  521. {$Info Compiling initopening of layers.library}
  522. {$Info don't forget to use InitLAYERSLibrary in the beginning of your program}
  523. var
  524. layers_exit : Pointer;
  525. procedure CloselayersLibrary;
  526. begin
  527. ExitProc := layers_exit;
  528. if LayersBase <> nil then begin
  529. CloseLibrary(LayersBase);
  530. LayersBase := nil;
  531. end;
  532. end;
  533. procedure InitLAYERSLibrary;
  534. begin
  535. LayersBase := nil;
  536. LayersBase := OpenLibrary(LAYERSNAME,LIBVERSION);
  537. if LayersBase <> nil then begin
  538. layers_exit := ExitProc;
  539. ExitProc := @CloselayersLibrary;
  540. end else begin
  541. MessageBox('FPC Pascal Error',
  542. 'Can''t open layers.library version ' + VERSION + #10 +
  543. 'Deallocating resources and closing down',
  544. 'Oops');
  545. halt(20);
  546. end;
  547. end;
  548. begin
  549. LAYERSIsCompiledHow := 2;
  550. {$endif use_init_openlib}
  551. {$ifdef use_auto_openlib}
  552. {$Info Compiling autoopening of layers.library}
  553. var
  554. layers_exit : Pointer;
  555. procedure CloselayersLibrary;
  556. begin
  557. ExitProc := layers_exit;
  558. if LayersBase <> nil then begin
  559. CloseLibrary(LayersBase);
  560. LayersBase := nil;
  561. end;
  562. end;
  563. begin
  564. LayersBase := nil;
  565. LayersBase := OpenLibrary(LAYERSNAME,LIBVERSION);
  566. if LayersBase <> nil then begin
  567. layers_exit := ExitProc;
  568. ExitProc := @CloselayersLibrary;
  569. LAYERSIsCompiledHow := 1;
  570. end else begin
  571. MessageBox('FPC Pascal Error',
  572. 'Can''t open layers.library version ' + VERSION + #10 +
  573. 'Deallocating resources and closing down',
  574. 'Oops');
  575. halt(20);
  576. end;
  577. {$endif use_auto_openlib}
  578. {$ifdef dont_use_openlib}
  579. begin
  580. LAYERSIsCompiledHow := 3;
  581. {$Warning No autoopening of layers.library compiled}
  582. {$Warning Make sure you open layers.library yourself}
  583. {$endif dont_use_openlib}
  584. END. (* UNIT LAYERS *)