You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

868 lines
25 KiB

  1. {
  2. TextSuite (C) Steffen Xonna (aka Lossy eX)
  3. http://www.opengl24.de/
  4. -----------------------------------------------------------------------
  5. For copyright informations see file copyright.txt.
  6. }
  7. {$I TextSuiteOptions.inc}
  8. unit TextSuiteImports;
  9. interface
  10. uses
  11. TextSuite;
  12. type
  13. DWORD = Cardinal;
  14. PDWORD = ^DWORD;
  15. // *** Global Functions ***
  16. {$IFDEF WINDOWS}
  17. const
  18. Kernel32 = 'kernel32.dll';
  19. function LoadLibrary(lpFileName: pAnsiChar): Pointer; stdcall; external Kernel32 name 'LoadLibraryA';
  20. function FreeLibrary(hModule: Pointer): Pointer; stdcall; external Kernel32 name 'FreeLibrary';
  21. function GetProcAddress(hModule: Pointer; lpProcName: pAnsiChar): Pointer; stdcall; external Kernel32 name 'GetProcAddress';
  22. {$ELSE}
  23. const
  24. LibraryLib = {$IFDEF Linux} 'libdl.so.2'{$ELSE} 'c'{$ENDIF};
  25. RTLD_LAZY = $001;
  26. function dlopen(Name: pAnsiChar; Flags: LongInt): Pointer; cdecl; external LibraryLib name 'dlopen';
  27. function dlclose(Lib: Pointer): LongInt; cdecl; external LibraryLib name 'dlclose';
  28. function dlsym(Lib: Pointer; Name: pAnsiChar): Pointer; cdecl; external LibraryLib name 'dlsym';
  29. {$ENDIF}
  30. {$IFDEF WINDOWS}
  31. function GetCurrentThreadId: DWORD; stdcall; external Kernel32 name 'GetCurrentThreadId';
  32. {$ENDIF}
  33. // *** OpenGL ***
  34. function Init_OpenGL: Boolean;
  35. procedure Quit_OpenGL;
  36. const
  37. {$IFDEF WINDOWS}
  38. LIB_OPENGL = 'opengl32.dll';
  39. {$ELSE}
  40. LIB_OPENGL = 'libGL.so.1';
  41. {$ENDIF}
  42. GL_TEXTURE_2D = $0DE1;
  43. GL_RGBA = $1908;
  44. GL_UNSIGNED_BYTE = $1401;
  45. GL_NEAREST = $2600;
  46. GL_LINEAR = $2601;
  47. GL_TEXTURE_MAG_FILTER = $2800;
  48. GL_TEXTURE_MIN_FILTER = $2801;
  49. GL_LINES = $0001;
  50. GL_QUADS = $0007;
  51. GL_COMPILE = $1300;
  52. var
  53. OpenGL_initialized: Boolean;
  54. Library_OpenGL: Pointer;
  55. glEnable: procedure(cap: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  56. glDisable: procedure(cap: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  57. glColor4f: procedure(red, green, blue, alpha: Single); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  58. glGenTextures: procedure(n: Integer; textures: PCardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  59. glDeleteTextures: procedure(n: Integer; const textures: PCardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  60. glBindTexture: procedure(target: Cardinal; texture: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  61. glTexParameteri: procedure(target: Cardinal; pname: Cardinal; param: Integer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  62. glTexImage2D: procedure(target: Cardinal; level: Integer; internalformat: Integer; width: Integer; height: Integer; border: Integer; format: Cardinal; _type: Cardinal; const pixels: Pointer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  63. glTexSubImage2D: procedure(target: Cardinal; level: Integer; xoffset: Integer; yoffset: Integer; width: Integer; height: Integer; format: Cardinal; _type: Cardinal; const pixels: Pointer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  64. glBegin: procedure(mode: Cardinal); {$IFNDEF CLR}{$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}{$ENDIF}
  65. glEnd: procedure(); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  66. glTexCoord2f: procedure(s: Single; t: Single); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  67. glTexCoord2fv: procedure(v: Pointer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  68. glVertex2f: procedure(x: Single; y: Single); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  69. glVertex2fv: procedure(v: Pointer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  70. glVertex2iv: procedure(v: Pointer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  71. glGenLists: function(range: Integer): Cardinal; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  72. glDeleteLists: procedure(list: Cardinal; range: Integer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  73. glCallList: procedure(list: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  74. glNewList: procedure(list: Cardinal; mode: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  75. glEndList: procedure(); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
  76. // *** Windows GDI ***
  77. function Init_GDI: Boolean;
  78. procedure Quit_GDI;
  79. type
  80. HDC = Cardinal;
  81. HFONT = Cardinal;
  82. HGDIOBJ = Cardinal;
  83. {$IFDEF CPU64}
  84. {$PACKRECORDS 8}
  85. {$ENDIF}
  86. TFixed = packed record
  87. fract: Word;
  88. value: Smallint;
  89. end;
  90. TMat2 = packed record
  91. eM11: TFixed;
  92. eM12: TFixed;
  93. eM21: TFixed;
  94. eM22: TFixed;
  95. end;
  96. PMat2 = ^TMat2;
  97. TLogFontA = record
  98. lfHeight: Longint;
  99. lfWidth: Longint;
  100. lfEscapement: Longint;
  101. lfOrientation: Longint;
  102. lfWeight: Longint;
  103. lfItalic: Byte;
  104. lfUnderline: Byte;
  105. lfStrikeOut: Byte;
  106. lfCharSet: Byte;
  107. lfOutPrecision: Byte;
  108. lfClipPrecision: Byte;
  109. lfQuality: Byte;
  110. lfPitchAndFamily: Byte;
  111. lfFaceName: array[0..31] of AnsiChar;
  112. end;
  113. PLogFontA = ^TLogFontA;
  114. TTextMetricW = record
  115. tmHeight: Longint;
  116. tmAscent: Longint;
  117. tmDescent: Longint;
  118. tmInternalLeading: Longint;
  119. tmExternalLeading: Longint;
  120. tmAveCharWidth: Longint;
  121. tmMaxCharWidth: Longint;
  122. tmWeight: Longint;
  123. tmOverhang: Longint;
  124. tmDigitizedAspectX: Longint;
  125. tmDigitizedAspectY: Longint;
  126. tmFirstChar: WideChar;
  127. tmLastChar: WideChar;
  128. tmDefaultChar: WideChar;
  129. tmBreakChar: WideChar;
  130. tmItalic: Byte;
  131. tmUnderlined: Byte;
  132. tmStruckOut: Byte;
  133. tmPitchAndFamily: Byte;
  134. tmCharSet: Byte;
  135. end;
  136. PTextMetricW = ^TTextMetricW;
  137. TGlyphMetrics = record
  138. gmBlackBoxX: Cardinal;
  139. gmBlackBoxY: Cardinal;
  140. gmptGlyphOrigin: tsPoint;
  141. gmCellIncX: Smallint;
  142. gmCellIncY: Smallint;
  143. end;
  144. PGlyphMetrics = ^TGlyphMetrics;
  145. TGCPResultsW = record
  146. lStructSize: DWORD;
  147. lpOutString: PWideChar;
  148. lpOrder: PDWORD;
  149. lpDx: PInteger;
  150. lpCaretPos: PInteger;
  151. lpClass: PChar;
  152. lpGlyphs: PCardinal;
  153. nGlyphs: Cardinal;
  154. nMaxFit: Cardinal;
  155. end;
  156. PGCPResultsW = ^TGCPResultsW;
  157. TPanose = record
  158. bFamilyType: Byte;
  159. bSerifStyle: Byte;
  160. bWeight: Byte;
  161. bProportion: Byte;
  162. bContrast: Byte;
  163. bStrokeVariation: Byte;
  164. bArmStyle: Byte;
  165. bLetterform: Byte;
  166. bMidline: Byte;
  167. bXHeight: Byte;
  168. end;
  169. PPanose = ^TPanose;
  170. TOutlineTextmetricW = record
  171. otmSize: LongWord;
  172. otmTextMetrics: TTextMetricW;
  173. otmFiller: Byte;
  174. otmPanoseNumber: TPanose;
  175. otmfsSelection: LongWord;
  176. otmfsType: LongWord;
  177. otmsCharSlopeRise: Integer;
  178. otmsCharSlopeRun: Integer;
  179. otmItalicAngle: Integer;
  180. otmEMSquare: LongWord;
  181. otmAscent: Integer;
  182. otmDescent: Integer;
  183. otmLineGap: LongWord;
  184. otmsCapEmHeight: LongWord;
  185. otmsXHeight: LongWord;
  186. otmrcFontBox: tsRect;
  187. otmMacAscent: Integer;
  188. otmMacDescent: Integer;
  189. otmMacLineGap: LongWord;
  190. otmusMinimumPPEM: LongWord;
  191. otmptSubscriptSize: tsPoint;
  192. otmptSubscriptOffset: tsPoint;
  193. otmptSuperscriptSize: tsPoint;
  194. otmptSuperscriptOffset: tsPoint;
  195. otmsStrikeoutSize: LongWord;
  196. otmsStrikeoutPosition: Integer;
  197. otmsUnderscoreSize: Integer;
  198. otmsUnderscorePosition: Integer;
  199. otmpFamilyName: PWideChar;
  200. otmpFaceName: PWideChar;
  201. otmpStyleName: PWideChar;
  202. otmpFullName: PWideChar;
  203. end;
  204. POutlineTextmetricW = ^TOutlineTextmetricW;
  205. {$IFDEF CPU64}
  206. {$PACKRECORDS 4}
  207. {$ENDIF}
  208. const
  209. LIB_GDI32 = 'gdi32.dll';
  210. LIB_KERNEL32 = 'kernel32.dll';
  211. GDI_ERROR = DWORD($FFFFFFFF);
  212. FW_NORMAL = 400;
  213. FW_BOLD = 700;
  214. DEFAULT_CHARSET = 1;
  215. NONANTIALIASED_QUALITY = 3;
  216. ANTIALIASED_QUALITY = 4;
  217. GGO_METRICS = 0;
  218. GGO_BITMAP = 1;
  219. GGO_GRAY8_BITMAP = 6;
  220. GGO_GLYPH_INDEX = $80;
  221. FR_PRIVATE = $10;
  222. FR_NOT_ENUM = $20;
  223. LOCALE_USER_DEFAULT = $0400;
  224. LOCALE_ILANGUAGE = $1;
  225. GCP_MAXEXTENT = $100000;
  226. TMPF_FIXED_PITCH = 1;
  227. var
  228. GDI_initialized: Boolean;
  229. Library_GDI32: Pointer;
  230. Library_KERNEL32: Pointer;
  231. CreateFontIndirectA: function (const p1: TLogFontA): HFONT; stdcall;
  232. AddFontResourceA: function(Filename: PAnsiChar): Integer; stdcall;
  233. AddFontResourceExA: function(Filename: PAnsiChar; Flag: DWORD; pdv: Pointer): Integer; stdcall;
  234. AddFontMemResourceEx: function(pbFont: Pointer; cbFont: DWORD; pdv: Pointer; pcFonts: PDWORD): THandle; stdcall;
  235. RemoveFontResourceA: function(Filename: PAnsiChar): Boolean; stdcall;
  236. RemoveFontResourceExA: function(filename: PAnsiChar; Flag: DWORD; pdv: Pointer): Boolean; stdcall;
  237. RemoveFontMemResourceEx: function(fh: THandle): Boolean; stdcall;
  238. GetTextMetricsW: function(DC: HDC; var TM: TTextMetricW): Boolean; stdcall;
  239. //GetGlyphOutlineA: function(DC: HDC; uChar, uFormat: Word; const lpgm: TGlyphMetrics; cbBuffer: DWORD; lpvBuffer: Pointer; const lpmat2: TMat2): DWORD; stdcall;
  240. GetGlyphOutlineA: function(DC: HDC; uChar, uFormat: Cardinal; lpgm: PGlyphMetrics; cbBuffer: DWORD; lpvBuffer: Pointer; lpmat2: PMat2): DWORD; stdcall;
  241. GetCharacterPlacementW: function(DC: HDC; Str: PWideChar; Count, MaxExtent: Integer; Result: PGCPResultsW; Flags: DWORD): DWORD; stdcall;
  242. GetFontData: function(DC: HDC; TableName, Offset: DWORD; Buffer: Pointer; Data: DWORD): DWORD; stdcall;
  243. CreateCompatibleDC: function(DC: HDC): HDC; stdcall;
  244. DeleteDC: function(DC: HDC): Boolean; stdcall;
  245. SelectObject: function(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
  246. DeleteObject: function(p1: HGDIOBJ): Boolean; stdcall;
  247. GetLocaleInfoA: function(Locale: DWORD; LCType: DWORD; lpLCData: pAnsiChar; cchData: Integer): Integer; stdcall;
  248. GetOutlineTextMetricsW: function(DC: HDC; p2: LongWord; var OTMetricStructs: TOutlineTextmetricW): LongWord; stdcall;
  249. // *** SDL globals ***
  250. function Init_SDL: Boolean;
  251. procedure Quit_SDL;
  252. type
  253. PSDL_Color = ^TSDL_Color;
  254. TSDL_Color = record
  255. r: Byte;
  256. g: Byte;
  257. b: Byte;
  258. unused: Byte;
  259. end;
  260. TSDL_Rect = record
  261. X: Smallint;
  262. Y: Smallint;
  263. Width: Word;
  264. Height: Word;
  265. end;
  266. PSDL_ColorArray = ^TSDL_ColorArray;
  267. TSDL_ColorArray = array[0..65000] of TSDL_Color;
  268. PSDL_Palette = ^TSDL_Palette;
  269. TSDL_Palette = record
  270. ncolors: Integer;
  271. colors: PSDL_ColorArray;
  272. end;
  273. PSDL_PixelFormat = ^TSDL_PixelFormat;
  274. TSDL_PixelFormat = record
  275. Palette: PSDL_Palette;
  276. BitsPerPixel: Byte;
  277. BytesPerPixel: Byte;
  278. Rloss: Byte;
  279. Gloss: Byte;
  280. Bloss: Byte;
  281. Aloss: Byte;
  282. Rshift: Byte;
  283. Gshift: Byte;
  284. Bshift: Byte;
  285. Ashift: Byte;
  286. RMask: Cardinal;
  287. GMask: Cardinal;
  288. BMask: Cardinal;
  289. AMask: Cardinal;
  290. Colorkey: Cardinal;
  291. Alpha: Byte;
  292. end;
  293. PSDL_Surface = ^TSDL_Surface;
  294. TSDL_Surface = record
  295. Flags: Cardinal;
  296. Format: PSDL_PixelFormat;
  297. Width: Integer;
  298. Height: Integer;
  299. Pitch: Word;
  300. Pixels: Pointer;
  301. Offset: Integer;
  302. HWDdata: Pointer;
  303. ClipRect: TSDL_Rect;
  304. Unused1: Cardinal;
  305. Locked: Cardinal;
  306. Blitmap: Pointer;
  307. FormatVersion: Cardinal;
  308. RefCount: Integer;
  309. end;
  310. const
  311. {$IFDEF WINDOWS}
  312. LIB_SDL = 'SDL.dll';
  313. {$ELSE}
  314. LIB_SDL = 'libSDL.so';
  315. LIB_SDL_VERSION = 'libSDL-1.2.so.0';
  316. {$ENDIF}
  317. SDL_SWSURFACE = $00000000;
  318. var
  319. Library_SDL: Pointer;
  320. SDL_FreeSurface: procedure(surface: PSDL_Surface); cdecl;
  321. SDL_ConvertSurface: function(Source: PSDL_Surface; Format: PSDL_PixelFormat; flags: Cardinal): PSDL_Surface; cdecl;
  322. // *** SDL_TTF ***
  323. function Init_SDL_TTF: Boolean;
  324. procedure Quit_SDL_TTF;
  325. type
  326. PTTF_Font = ^TTTF_font;
  327. TTTF_Font = record end;
  328. const
  329. {$IFDEF WINDOWS}
  330. LIB_SDL_TTF = 'SDL_ttf.dll';
  331. {$ELSE}
  332. LIB_SDL_TTF = 'libSDL_ttf.so';
  333. LIB_SDL_TTF_VERSION = 'libSDL_ttf-2.0.so.0';
  334. {$ENDIF}
  335. TTF_STYLE_NORMAL = $00;
  336. TTF_STYLE_BOLD = $01;
  337. TTF_STYLE_ITALIC = $02;
  338. // TTF_STYLE_UNDERLINE = $04;
  339. // ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark)
  340. // UNICODE_BOM_NATIVE = $FEFF;
  341. // UNICODE_BOM_SWAPPED = $FFFE;
  342. var
  343. SDL_TTF_initialized: Boolean;
  344. Library_SDL_TTF: Pointer;
  345. TTF_Init: function: Integer; cdecl;
  346. TTF_WasInit: function: Integer; cdecl;
  347. TTF_OpenFont: function(const Filename: pAnsiChar; PTSize: Integer): PTTF_Font; cdecl;
  348. TTF_CloseFont: procedure(Font: PTTF_Font); cdecl;
  349. TTF_GetFontStyle: function(Font: PTTF_Font): Integer; cdecl;
  350. TTF_SetFontStyle: procedure(Font: PTTF_Font; Style: Integer); cdecl;
  351. TTF_FontAscent: function(Font: PTTF_Font) : Integer; cdecl;
  352. TTF_FontDescent: function(Font: PTTF_Font) : Integer; cdecl;
  353. TTF_FontLineSkip: function(Font: PTTF_Font): Integer; cdecl;
  354. TTF_FontFaceIsFixedWidth: function(Font: PTTF_Font): Integer; cdecl;
  355. TTF_FontFaceFamilyName: function(Font: PTTF_Font): pAnsiChar; cdecl;
  356. TTF_FontFaceStyleName: function(Font : PTTF_Font): pAnsiChar; cdecl;
  357. TTF_GlyphMetrics: function(Font: PTTF_Font; CharCode: WORD; var MinX: Integer; var MaxX: Integer; var MinY: Integer; var MaxY: Integer; var Advance: Integer): Integer; cdecl;
  358. TTF_RenderGlyph_Solid: function(Font: PTTF_Font; Char: WORD; const ForeGround: TSDL_Color): PSDL_Surface; cdecl;
  359. TTF_RenderGlyph_Shaded: function(Font: PTTF_Font; Char: WORD; const ForeGround: TSDL_Color; const BackGround: TSDL_Color): PSDL_Surface; cdecl;
  360. // *** SDL_IMAGE ***
  361. function Init_SDL_IMAGE: Boolean;
  362. procedure Quit_SDL_IMAGE;
  363. const
  364. {$IFDEF WINDOWS}
  365. LIB_SDL_IMAGE = 'SDL_Image.dll';
  366. {$ELSE}
  367. LIB_SDL_IMAGE = 'libSDL_image.so';
  368. LIB_SDL_IMAGE_VERSION = 'libSDL_image-1.2.so.0';
  369. {$ENDIF}
  370. var
  371. SDL_IMAGE_initialized: Boolean;
  372. Library_SDL_IMAGE: Pointer;
  373. IMG_Load: function(const _file: PAnsiChar): PSDL_Surface; cdecl;
  374. implementation
  375. function GetLibraryProc(hLibrary: Pointer; ProcName: pAnsiChar): Pointer;
  376. begin
  377. {$IFDEF WINDOWS}
  378. Result := GetProcAddress(hLibrary, ProcName);
  379. {$ELSE}
  380. Result := dlsym(hLibrary, ProcName);
  381. {$ENDIF}
  382. end;
  383. function GetOpenGLLibraryProc(hLibrary: Pointer; ProcName: pAnsiChar): Pointer;
  384. begin
  385. Result := GetLibraryProc(hLibrary, ProcName);
  386. end;
  387. // *** OpenGL ***
  388. function Init_OpenGL: Boolean;
  389. begin
  390. if Library_OpenGL = nil then begin
  391. {$IFDEF WINDOWS}
  392. Library_OpenGL := LoadLibrary(LIB_OPENGL);
  393. {$ELSE}
  394. Library_OpenGL := dlopen(LIB_OPENGL, RTLD_LAZY);
  395. {$ENDIF}
  396. end;
  397. if Library_OpenGL <> nil then begin
  398. glEnable := GetOpenGLLibraryProc(Library_OpenGL, 'glEnable');
  399. glDisable := GetOpenGLLibraryProc(Library_OpenGL, 'glDisable');
  400. glColor4f := GetOpenGLLibraryProc(Library_OpenGL, 'glColor4f');
  401. glGenTextures := GetOpenGLLibraryProc(Library_OpenGL, 'glGenTextures');
  402. glDeleteTextures := GetOpenGLLibraryProc(Library_OpenGL, 'glDeleteTextures');
  403. glBindTexture := GetOpenGLLibraryProc(Library_OpenGL, 'glBindTexture');
  404. glTexParameteri := GetOpenGLLibraryProc(Library_OpenGL, 'glTexParameteri');
  405. glTexImage2D := GetOpenGLLibraryProc(Library_OpenGL, 'glTexImage2D');
  406. glTexSubImage2D := GetOpenGLLibraryProc(Library_OpenGL, 'glTexSubImage2D');
  407. glBegin := GetOpenGLLibraryProc(Library_OpenGL, 'glBegin');
  408. glEnd := GetOpenGLLibraryProc(Library_OpenGL, 'glEnd');
  409. glTexCoord2f := GetOpenGLLibraryProc(Library_OpenGL, 'glTexCoord2f');
  410. glTexCoord2fv := GetOpenGLLibraryProc(Library_OpenGL, 'glTexCoord2fv');
  411. glVertex2f := GetOpenGLLibraryProc(Library_OpenGL, 'glVertex2f');
  412. glVertex2fv := GetOpenGLLibraryProc(Library_OpenGL, 'glVertex2fv');
  413. glVertex2iv := GetOpenGLLibraryProc(Library_OpenGL, 'glVertex2iv');
  414. glGenLists := GetOpenGLLibraryProc(Library_OpenGL, 'glGenLists');
  415. glDeleteLists := GetOpenGLLibraryProc(Library_OpenGL, 'glDeleteLists');
  416. glCallList := GetOpenGLLibraryProc(Library_OpenGL, 'glCallList');
  417. glNewList := GetOpenGLLibraryProc(Library_OpenGL, 'glNewList');
  418. glEndList := GetOpenGLLibraryProc(Library_OpenGL, 'glEndList');
  419. end;
  420. OpenGL_initialized :=
  421. (Addr(glEnable) <> nil) and
  422. (Addr(glDisable) <> nil) and
  423. (Addr(glColor4f) <> nil) and
  424. (Addr(glGenTextures) <> nil) and
  425. (Addr(glDeleteTextures) <> nil) and
  426. (Addr(glBindTexture) <> nil) and
  427. (Addr(glTexParameteri) <> nil) and
  428. (Addr(glTexImage2D) <> nil) and
  429. (Addr(glTexSubImage2D) <> nil) and
  430. (Addr(glBegin) <> nil) and
  431. (Addr(glEnd) <> nil) and
  432. (Addr(glTexCoord2f) <> nil) and
  433. (Addr(glTexCoord2fv) <> nil) and
  434. (Addr(glVertex2f) <> nil) and
  435. (Addr(glVertex2fv) <> nil) and
  436. (Addr(glVertex2iv) <> nil) and
  437. (Addr(glGenLists) <> nil) and
  438. (Addr(glDeleteLists) <> nil) and
  439. (Addr(glCallList) <> nil) and
  440. (Addr(glNewList) <> nil) and
  441. (Addr(glEndList) <> nil);
  442. Result := OpenGL_initialized;
  443. end;
  444. procedure Quit_OpenGL;
  445. begin
  446. glEnable := nil;
  447. glDisable := nil;
  448. glColor4f := nil;
  449. glGenTextures := nil;
  450. glDeleteTextures := nil;
  451. glBindTexture := nil;
  452. glTexParameteri := nil;
  453. glTexImage2D := nil;
  454. glTexSubImage2D := nil;
  455. glBegin := nil;
  456. glEnd := nil;
  457. glTexCoord2f := nil;
  458. glTexCoord2fv := nil;
  459. glVertex2f := nil;
  460. glVertex2fv := nil;
  461. glVertex2iv := nil;
  462. glGenLists := nil;
  463. glDeleteLists := nil;
  464. glCallList := nil;
  465. glNewList := nil;
  466. glEndList := nil;
  467. if Library_OpenGL <> nil then begin
  468. {$IFDEF WINDOWS}
  469. FreeLibrary(Library_OpenGL);
  470. Library_OpenGL := nil;
  471. {$ELSE}
  472. dlclose(Library_OpenGL);
  473. Library_OpenGL := nil;
  474. {$ENDIF}
  475. end;
  476. OpenGL_initialized := False;
  477. end;
  478. // *** Windows GDI globals ***
  479. function Init_GDI: Boolean;
  480. begin
  481. if Library_GDI32 = nil then begin
  482. {$IFDEF WINDOWS}
  483. Library_GDI32 := LoadLibrary(LIB_GDI32);
  484. // {$ELSE}
  485. // Library_GDI32 := nil; //dlopen(LIB_GDI, RTLD_LAZY);
  486. {$ENDIF}
  487. end;
  488. if Library_GDI32 <> nil then begin
  489. CreateFontIndirectA := GetLibraryProc(Library_GDI32, 'CreateFontIndirectA');
  490. AddFontResourceA := GetLibraryProc(Library_GDI32, 'AddFontResourceA');
  491. AddFontResourceExA := GetLibraryProc(Library_GDI32, 'AddFontResourceExA');
  492. AddFontMemResourceEx := GetLibraryProc(Library_GDI32, 'AddFontMemResourceEx');
  493. RemoveFontResourceA := GetLibraryProc(Library_GDI32, 'RemoveFontResourceA');
  494. RemoveFontResourceExA := GetLibraryProc(Library_GDI32, 'RemoveFontResourceExA');
  495. RemoveFontMemResourceEx := GetLibraryProc(Library_GDI32, 'RemoveFontMemResourceEx');
  496. GetTextMetricsW := GetLibraryProc(Library_GDI32, 'GetTextMetricsW');
  497. GetGlyphOutlineA := GetLibraryProc(Library_GDI32, 'GetGlyphOutlineA');
  498. GetCharacterPlacementW := GetLibraryProc(Library_GDI32, 'GetCharacterPlacementW');
  499. GetFontData := GetLibraryProc(Library_GDI32, 'GetFontData');
  500. CreateCompatibleDC := GetLibraryProc(Library_GDI32, 'CreateCompatibleDC');
  501. DeleteDC := GetLibraryProc(Library_GDI32, 'DeleteDC');
  502. SelectObject := GetLibraryProc(Library_GDI32, 'SelectObject');
  503. DeleteObject := GetLibraryProc(Library_GDI32, 'DeleteObject');
  504. GetOutlineTextMetricsW := GetLibraryProc(Library_GDI32, 'GetOutlineTextMetricsW');
  505. end;
  506. if Library_KERNEL32 = nil then begin
  507. {$IFDEF WINDOWS}
  508. Library_KERNEL32 := LoadLibrary(LIB_KERNEL32);
  509. {$ENDIF}
  510. end;
  511. if Library_KERNEL32 <> nil then begin
  512. GetLocaleInfoA := GetLibraryProc(Library_KERNEL32, 'GetLocaleInfoA');
  513. end;
  514. GDI_initialized :=
  515. (Addr(CreateFontIndirectA) <> nil) and
  516. ((Addr(AddFontResourceA) <> nil) or
  517. (Addr(AddFontResourceExA) <> nil)) and
  518. ((Addr(RemoveFontResourceA) <> nil) or
  519. (Addr(RemoveFontResourceExA) <> nil)) and
  520. (Addr(GetTextMetricsW) <> nil) and
  521. (Addr(GetGlyphOutlineA) <> nil) and
  522. // under 9x GetCharacterPlacementW dosn't exist
  523. (Addr(GetCharacterPlacementW) <> nil) and
  524. (Addr(GetFontData) <> nil) and
  525. (Addr(CreateCompatibleDC) <> nil) and
  526. (Addr(DeleteDC) <> nil) and
  527. (Addr(SelectObject) <> nil) and
  528. (Addr(DeleteObject) <> nil) and
  529. (Addr(GetLocaleInfoA) <> nil) and
  530. (Addr(GetOutlineTextMetricsW) <> nil);
  531. Result := GDI_initialized;
  532. end;
  533. procedure Quit_GDI;
  534. begin
  535. CreateFontIndirectA := nil;
  536. AddFontResourceA := nil;
  537. AddFontResourceExA := nil;
  538. RemoveFontResourceA := nil;
  539. RemoveFontResourceExA := nil;
  540. GetTextMetricsW := nil;
  541. GetGlyphOutlineA := nil;
  542. GetCharacterPlacementW := nil;
  543. GetFontData := nil;
  544. CreateCompatibleDC := nil;
  545. DeleteDC := nil;
  546. SelectObject := nil;
  547. DeleteObject := nil;
  548. if Library_GDI32 <> nil then begin
  549. {$IFDEF WINDOWS}
  550. FreeLibrary(Library_GDI32);
  551. Library_GDI32 := nil;
  552. {$ENDIF}
  553. end;
  554. GetLocaleInfoA := nil;
  555. if Library_KERNEL32 <> nil then begin
  556. {$IFDEF WINDOWS}
  557. FreeLibrary(Library_KERNEL32);
  558. Library_KERNEL32 := nil;
  559. {$ENDIF}
  560. end;
  561. GDI_initialized := False;
  562. end;
  563. // *** SDL globals ***
  564. function Init_SDL: Boolean;
  565. begin
  566. if Library_SDL = nil then begin
  567. {$IFDEF WINDOWS}
  568. Library_SDL := LoadLibrary(LIB_SDL);
  569. {$ELSE}
  570. Library_SDL := dlopen(LIB_SDL, RTLD_LAZY);
  571. if Library_SDL = nil then
  572. Library_SDL := dlopen(LIB_SDL_VERSION, RTLD_LAZY);
  573. {$ENDIF}
  574. end;
  575. if Library_SDL <> nil then begin
  576. SDL_FreeSurface := GetLibraryProc(Library_SDL, 'SDL_FreeSurface');
  577. SDL_ConvertSurface := GetLibraryProc(Library_SDL, 'SDL_ConvertSurface');
  578. end;
  579. Result :=
  580. (Addr(SDL_FreeSurface) <> nil) and
  581. (Addr(SDL_ConvertSurface) <> nil);
  582. end;
  583. procedure Quit_SDL;
  584. begin
  585. SDL_FreeSurface := nil;
  586. SDL_ConvertSurface := nil;
  587. if Library_SDL <> nil then begin
  588. {$IFDEF WINDOWS}
  589. FreeLibrary(Library_SDL);
  590. Library_SDL := nil;
  591. {$ELSE}
  592. dlclose(Library_SDL);
  593. Library_SDL := nil;
  594. {$ENDIF}
  595. end;
  596. end;
  597. // *** SDL_TTF ***
  598. function Init_SDL_TTF: Boolean;
  599. begin
  600. if Library_SDL_TTF = nil then begin
  601. {$IFDEF WINDOWS}
  602. Library_SDL_TTF := LoadLibrary(LIB_SDL_TTF);
  603. {$ELSE}
  604. Library_SDL_TTF := dlopen(LIB_SDL_TTF, RTLD_LAZY);
  605. if Library_SDL_TTF = nil then
  606. Library_SDL_TTF := dlopen(LIB_SDL_TTF_VERSION, RTLD_LAZY);
  607. {$ENDIF}
  608. end;
  609. if Library_SDL_TTF <> nil then begin
  610. TTF_Init := GetLibraryProc(Library_SDL_TTF, 'TTF_Init');
  611. TTF_WasInit := GetLibraryProc(Library_SDL_TTF, 'TTF_WasInit');
  612. TTF_OpenFont := GetLibraryProc(Library_SDL_TTF, 'TTF_OpenFont');
  613. TTF_CloseFont := GetLibraryProc(Library_SDL_TTF, 'TTF_CloseFont');
  614. TTF_GetFontStyle := GetLibraryProc(Library_SDL_TTF, 'TTF_GetFontStyle');
  615. TTF_SetFontStyle := GetLibraryProc(Library_SDL_TTF, 'TTF_SetFontStyle');
  616. TTF_FontAscent := GetLibraryProc(Library_SDL_TTF, 'TTF_FontAscent');
  617. TTF_FontDescent := GetLibraryProc(Library_SDL_TTF, 'TTF_FontDescent');
  618. TTF_FontLineSkip := GetLibraryProc(Library_SDL_TTF, 'TTF_FontLineSkip');
  619. TTF_FontFaceIsFixedWidth := GetLibraryProc(Library_SDL_TTF, 'TTF_FontFaceIsFixedWidth');
  620. TTF_FontFaceFamilyName := GetLibraryProc(Library_SDL_TTF, 'TTF_FontFaceFamilyName');
  621. TTF_FontFaceStyleName := GetLibraryProc(Library_SDL_TTF, 'TTF_FontFaceStyleName');
  622. TTF_GlyphMetrics := GetLibraryProc(Library_SDL_TTF, 'TTF_GlyphMetrics');
  623. TTF_RenderGlyph_Solid := GetLibraryProc(Library_SDL_TTF, 'TTF_RenderGlyph_Solid');
  624. TTF_RenderGlyph_Shaded := GetLibraryProc(Library_SDL_TTF, 'TTF_RenderGlyph_Shaded');
  625. end;
  626. SDL_TTF_initialized :=
  627. Init_SDL and
  628. (Addr(TTF_Init) <> nil) and
  629. (Addr(TTF_WasInit) <> nil) and
  630. (Addr(TTF_OpenFont) <> nil) and
  631. (Addr(TTF_CloseFont) <> nil) and
  632. (Addr(TTF_GetFontStyle) <> nil) and
  633. (Addr(TTF_SetFontStyle) <> nil) and
  634. (Addr(TTF_FontAscent) <> nil) and
  635. (Addr(TTF_FontDescent) <> nil) and
  636. (Addr(TTF_FontLineSkip) <> nil) and
  637. (Addr(TTF_FontFaceIsFixedWidth) <> nil) and
  638. (Addr(TTF_FontFaceFamilyName) <> nil) and
  639. (Addr(TTF_FontFaceStyleName) <> nil) and
  640. (Addr(TTF_GlyphMetrics) <> nil) and
  641. (Addr(TTF_RenderGlyph_Solid) <> nil) and
  642. (Addr(TTF_RenderGlyph_Shaded) <> nil);
  643. Result := SDL_TTF_initialized;
  644. end;
  645. procedure Quit_SDL_TTF;
  646. begin
  647. TTF_Init := nil;
  648. TTF_WasInit := nil;
  649. TTF_OpenFont := nil;
  650. TTF_CloseFont := nil;
  651. TTF_GetFontStyle := nil;
  652. TTF_SetFontStyle := nil;
  653. TTF_FontAscent := nil;
  654. TTF_FontDescent := nil;
  655. TTF_FontLineSkip := nil;
  656. TTF_FontFaceIsFixedWidth := nil;
  657. TTF_FontFaceFamilyName := nil;
  658. TTF_FontFaceStyleName := nil;
  659. TTF_GlyphMetrics := nil;
  660. TTF_RenderGlyph_Solid := nil;
  661. TTF_RenderGlyph_Shaded := nil;
  662. if Library_SDL_TTF <> nil then begin
  663. {$IFDEF WINDOWS}
  664. FreeLibrary(Library_SDL_TTF);
  665. Library_SDL_TTF := nil;
  666. {$ELSE}
  667. dlclose(Library_SDl_TTF);
  668. Library_SDL_TTF := nil;
  669. {$ENDIF}
  670. end;
  671. SDL_TTF_initialized := False;
  672. end;
  673. // *** SDL_IMAGE ***
  674. function Init_SDL_IMAGE: Boolean;
  675. begin
  676. if Library_SDL_IMAGE = nil then begin
  677. {$IFDEF WINDOWS}
  678. Library_SDL_IMAGE := LoadLibrary(LIB_SDL_IMAGE);
  679. {$ELSE}
  680. Library_SDL_IMAGE := dlopen(LIB_SDL_IMAGE, RTLD_LAZY);
  681. if Library_SDL_IMAGE = nil then
  682. Library_SDL_IMAGE := dlopen(LIB_SDL_IMAGE_VERSION, RTLD_LAZY);
  683. {$ENDIF}
  684. end;
  685. if Library_SDL_IMAGE <> nil then begin
  686. IMG_Load := GetLibraryProc(Library_SDL_IMAGE, 'IMG_Load');
  687. end;
  688. SDL_IMAGE_initialized :=
  689. Init_SDL and
  690. (Addr(IMG_load) <> nil);
  691. Result := SDL_IMAGE_initialized;
  692. end;
  693. procedure Quit_SDL_IMAGE;
  694. begin
  695. IMG_Load := nil;
  696. if Library_SDL_IMAGE <> nil then begin
  697. {$IFDEF WINDOWS}
  698. FreeLibrary(Library_SDL_IMAGE);
  699. Library_SDL_IMAGE := nil;
  700. {$ELSE}
  701. dlclose(Library_SDL_IMAGE);
  702. Library_SDL_IMAGE := nil;
  703. {$ENDIF}
  704. end;
  705. end;
  706. end.