{ TextSuite (C) Steffen Xonna (aka Lossy eX) http://www.opengl24.de/ ----------------------------------------------------------------------- For copyright informations see file copyright.txt. } {$I TextSuiteOptions.inc} unit TextSuiteImports; interface uses TextSuite; type DWORD = Cardinal; PDWORD = ^DWORD; // *** Global Functions *** {$IFDEF WINDOWS} const Kernel32 = 'kernel32.dll'; function LoadLibrary(lpFileName: pAnsiChar): Pointer; stdcall; external Kernel32 name 'LoadLibraryA'; function FreeLibrary(hModule: Pointer): Pointer; stdcall; external Kernel32 name 'FreeLibrary'; function GetProcAddress(hModule: Pointer; lpProcName: pAnsiChar): Pointer; stdcall; external Kernel32 name 'GetProcAddress'; {$ELSE} const LibraryLib = {$IFDEF Linux} 'libdl.so.2'{$ELSE} 'c'{$ENDIF}; RTLD_LAZY = $001; function dlopen(Name: pAnsiChar; Flags: LongInt): Pointer; cdecl; external LibraryLib name 'dlopen'; function dlclose(Lib: Pointer): LongInt; cdecl; external LibraryLib name 'dlclose'; function dlsym(Lib: Pointer; Name: pAnsiChar): Pointer; cdecl; external LibraryLib name 'dlsym'; {$ENDIF} {$IFDEF WINDOWS} function GetCurrentThreadId: DWORD; stdcall; external Kernel32 name 'GetCurrentThreadId'; {$ENDIF} // *** OpenGL *** function Init_OpenGL: Boolean; procedure Quit_OpenGL; const {$IFDEF WINDOWS} LIB_OPENGL = 'opengl32.dll'; {$ELSE} LIB_OPENGL = 'libGL.so.1'; {$ENDIF} GL_TEXTURE_2D = $0DE1; GL_RGBA = $1908; GL_UNSIGNED_BYTE = $1401; GL_NEAREST = $2600; GL_LINEAR = $2601; GL_TEXTURE_MAG_FILTER = $2800; GL_TEXTURE_MIN_FILTER = $2801; GL_LINES = $0001; GL_QUADS = $0007; GL_COMPILE = $1300; var OpenGL_initialized: Boolean; Library_OpenGL: Pointer; glEnable: procedure(cap: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glDisable: procedure(cap: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glColor4f: procedure(red, green, blue, alpha: Single); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glGenTextures: procedure(n: Integer; textures: PCardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glDeleteTextures: procedure(n: Integer; const textures: PCardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glBindTexture: procedure(target: Cardinal; texture: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glTexParameteri: procedure(target: Cardinal; pname: Cardinal; param: Integer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} 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} 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} glBegin: procedure(mode: Cardinal); {$IFNDEF CLR}{$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}{$ENDIF} glEnd: procedure(); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glTexCoord2f: procedure(s: Single; t: Single); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glTexCoord2fv: procedure(v: Pointer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glVertex2f: procedure(x: Single; y: Single); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glVertex2fv: procedure(v: Pointer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glVertex2iv: procedure(v: Pointer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glGenLists: function(range: Integer): Cardinal; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glDeleteLists: procedure(list: Cardinal; range: Integer); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glCallList: procedure(list: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glNewList: procedure(list: Cardinal; mode: Cardinal); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} glEndList: procedure(); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF} // *** Windows GDI *** function Init_GDI: Boolean; procedure Quit_GDI; type HDC = Cardinal; HFONT = Cardinal; HGDIOBJ = Cardinal; {$IFDEF CPU64} {$PACKRECORDS 8} {$ENDIF} TFixed = packed record fract: Word; value: Smallint; end; TMat2 = packed record eM11: TFixed; eM12: TFixed; eM21: TFixed; eM22: TFixed; end; PMat2 = ^TMat2; TLogFontA = record lfHeight: Longint; lfWidth: Longint; lfEscapement: Longint; lfOrientation: Longint; lfWeight: Longint; lfItalic: Byte; lfUnderline: Byte; lfStrikeOut: Byte; lfCharSet: Byte; lfOutPrecision: Byte; lfClipPrecision: Byte; lfQuality: Byte; lfPitchAndFamily: Byte; lfFaceName: array[0..31] of AnsiChar; end; PLogFontA = ^TLogFontA; TTextMetricW = record tmHeight: Longint; tmAscent: Longint; tmDescent: Longint; tmInternalLeading: Longint; tmExternalLeading: Longint; tmAveCharWidth: Longint; tmMaxCharWidth: Longint; tmWeight: Longint; tmOverhang: Longint; tmDigitizedAspectX: Longint; tmDigitizedAspectY: Longint; tmFirstChar: WideChar; tmLastChar: WideChar; tmDefaultChar: WideChar; tmBreakChar: WideChar; tmItalic: Byte; tmUnderlined: Byte; tmStruckOut: Byte; tmPitchAndFamily: Byte; tmCharSet: Byte; end; PTextMetricW = ^TTextMetricW; TGlyphMetrics = record gmBlackBoxX: Cardinal; gmBlackBoxY: Cardinal; gmptGlyphOrigin: tsPoint; gmCellIncX: Smallint; gmCellIncY: Smallint; end; PGlyphMetrics = ^TGlyphMetrics; TGCPResultsW = record lStructSize: DWORD; lpOutString: PWideChar; lpOrder: PDWORD; lpDx: PInteger; lpCaretPos: PInteger; lpClass: PChar; lpGlyphs: PCardinal; nGlyphs: Cardinal; nMaxFit: Cardinal; end; PGCPResultsW = ^TGCPResultsW; TPanose = record bFamilyType: Byte; bSerifStyle: Byte; bWeight: Byte; bProportion: Byte; bContrast: Byte; bStrokeVariation: Byte; bArmStyle: Byte; bLetterform: Byte; bMidline: Byte; bXHeight: Byte; end; PPanose = ^TPanose; TOutlineTextmetricW = record otmSize: LongWord; otmTextMetrics: TTextMetricW; otmFiller: Byte; otmPanoseNumber: TPanose; otmfsSelection: LongWord; otmfsType: LongWord; otmsCharSlopeRise: Integer; otmsCharSlopeRun: Integer; otmItalicAngle: Integer; otmEMSquare: LongWord; otmAscent: Integer; otmDescent: Integer; otmLineGap: LongWord; otmsCapEmHeight: LongWord; otmsXHeight: LongWord; otmrcFontBox: tsRect; otmMacAscent: Integer; otmMacDescent: Integer; otmMacLineGap: LongWord; otmusMinimumPPEM: LongWord; otmptSubscriptSize: tsPoint; otmptSubscriptOffset: tsPoint; otmptSuperscriptSize: tsPoint; otmptSuperscriptOffset: tsPoint; otmsStrikeoutSize: LongWord; otmsStrikeoutPosition: Integer; otmsUnderscoreSize: Integer; otmsUnderscorePosition: Integer; otmpFamilyName: PWideChar; otmpFaceName: PWideChar; otmpStyleName: PWideChar; otmpFullName: PWideChar; end; POutlineTextmetricW = ^TOutlineTextmetricW; {$IFDEF CPU64} {$PACKRECORDS 4} {$ENDIF} const LIB_GDI32 = 'gdi32.dll'; LIB_KERNEL32 = 'kernel32.dll'; GDI_ERROR = DWORD($FFFFFFFF); FW_NORMAL = 400; FW_BOLD = 700; DEFAULT_CHARSET = 1; NONANTIALIASED_QUALITY = 3; ANTIALIASED_QUALITY = 4; GGO_METRICS = 0; GGO_BITMAP = 1; GGO_GRAY8_BITMAP = 6; GGO_GLYPH_INDEX = $80; FR_PRIVATE = $10; FR_NOT_ENUM = $20; LOCALE_USER_DEFAULT = $0400; LOCALE_ILANGUAGE = $1; GCP_MAXEXTENT = $100000; TMPF_FIXED_PITCH = 1; var GDI_initialized: Boolean; Library_GDI32: Pointer; Library_KERNEL32: Pointer; CreateFontIndirectA: function (const p1: TLogFontA): HFONT; stdcall; AddFontResourceA: function(Filename: PAnsiChar): Integer; stdcall; AddFontResourceExA: function(Filename: PAnsiChar; Flag: DWORD; pdv: Pointer): Integer; stdcall; AddFontMemResourceEx: function(pbFont: Pointer; cbFont: DWORD; pdv: Pointer; pcFonts: PDWORD): THandle; stdcall; RemoveFontResourceA: function(Filename: PAnsiChar): Boolean; stdcall; RemoveFontResourceExA: function(filename: PAnsiChar; Flag: DWORD; pdv: Pointer): Boolean; stdcall; RemoveFontMemResourceEx: function(fh: THandle): Boolean; stdcall; GetTextMetricsW: function(DC: HDC; var TM: TTextMetricW): Boolean; stdcall; //GetGlyphOutlineA: function(DC: HDC; uChar, uFormat: Word; const lpgm: TGlyphMetrics; cbBuffer: DWORD; lpvBuffer: Pointer; const lpmat2: TMat2): DWORD; stdcall; GetGlyphOutlineA: function(DC: HDC; uChar, uFormat: Cardinal; lpgm: PGlyphMetrics; cbBuffer: DWORD; lpvBuffer: Pointer; lpmat2: PMat2): DWORD; stdcall; GetCharacterPlacementW: function(DC: HDC; Str: PWideChar; Count, MaxExtent: Integer; Result: PGCPResultsW; Flags: DWORD): DWORD; stdcall; GetFontData: function(DC: HDC; TableName, Offset: DWORD; Buffer: Pointer; Data: DWORD): DWORD; stdcall; CreateCompatibleDC: function(DC: HDC): HDC; stdcall; DeleteDC: function(DC: HDC): Boolean; stdcall; SelectObject: function(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall; DeleteObject: function(p1: HGDIOBJ): Boolean; stdcall; GetLocaleInfoA: function(Locale: DWORD; LCType: DWORD; lpLCData: pAnsiChar; cchData: Integer): Integer; stdcall; GetOutlineTextMetricsW: function(DC: HDC; p2: LongWord; var OTMetricStructs: TOutlineTextmetricW): LongWord; stdcall; // *** SDL globals *** function Init_SDL: Boolean; procedure Quit_SDL; type PSDL_Color = ^TSDL_Color; TSDL_Color = record r: Byte; g: Byte; b: Byte; unused: Byte; end; TSDL_Rect = record X: Smallint; Y: Smallint; Width: Word; Height: Word; end; PSDL_ColorArray = ^TSDL_ColorArray; TSDL_ColorArray = array[0..65000] of TSDL_Color; PSDL_Palette = ^TSDL_Palette; TSDL_Palette = record ncolors: Integer; colors: PSDL_ColorArray; end; PSDL_PixelFormat = ^TSDL_PixelFormat; TSDL_PixelFormat = record Palette: PSDL_Palette; BitsPerPixel: Byte; BytesPerPixel: Byte; Rloss: Byte; Gloss: Byte; Bloss: Byte; Aloss: Byte; Rshift: Byte; Gshift: Byte; Bshift: Byte; Ashift: Byte; RMask: Cardinal; GMask: Cardinal; BMask: Cardinal; AMask: Cardinal; Colorkey: Cardinal; Alpha: Byte; end; PSDL_Surface = ^TSDL_Surface; TSDL_Surface = record Flags: Cardinal; Format: PSDL_PixelFormat; Width: Integer; Height: Integer; Pitch: Word; Pixels: Pointer; Offset: Integer; HWDdata: Pointer; ClipRect: TSDL_Rect; Unused1: Cardinal; Locked: Cardinal; Blitmap: Pointer; FormatVersion: Cardinal; RefCount: Integer; end; const {$IFDEF WINDOWS} LIB_SDL = 'SDL.dll'; {$ELSE} LIB_SDL = 'libSDL.so'; LIB_SDL_VERSION = 'libSDL-1.2.so.0'; {$ENDIF} SDL_SWSURFACE = $00000000; var Library_SDL: Pointer; SDL_FreeSurface: procedure(surface: PSDL_Surface); cdecl; SDL_ConvertSurface: function(Source: PSDL_Surface; Format: PSDL_PixelFormat; flags: Cardinal): PSDL_Surface; cdecl; // *** SDL_TTF *** function Init_SDL_TTF: Boolean; procedure Quit_SDL_TTF; type PTTF_Font = ^TTTF_font; TTTF_Font = record end; const {$IFDEF WINDOWS} LIB_SDL_TTF = 'SDL_ttf.dll'; {$ELSE} LIB_SDL_TTF = 'libSDL_ttf.so'; LIB_SDL_TTF_VERSION = 'libSDL_ttf-2.0.so.0'; {$ENDIF} TTF_STYLE_NORMAL = $00; TTF_STYLE_BOLD = $01; TTF_STYLE_ITALIC = $02; // TTF_STYLE_UNDERLINE = $04; // ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark) // UNICODE_BOM_NATIVE = $FEFF; // UNICODE_BOM_SWAPPED = $FFFE; var SDL_TTF_initialized: Boolean; Library_SDL_TTF: Pointer; TTF_Init: function: Integer; cdecl; TTF_WasInit: function: Integer; cdecl; TTF_OpenFont: function(const Filename: pAnsiChar; PTSize: Integer): PTTF_Font; cdecl; TTF_CloseFont: procedure(Font: PTTF_Font); cdecl; TTF_GetFontStyle: function(Font: PTTF_Font): Integer; cdecl; TTF_SetFontStyle: procedure(Font: PTTF_Font; Style: Integer); cdecl; TTF_FontAscent: function(Font: PTTF_Font) : Integer; cdecl; TTF_FontDescent: function(Font: PTTF_Font) : Integer; cdecl; TTF_FontLineSkip: function(Font: PTTF_Font): Integer; cdecl; TTF_FontFaceIsFixedWidth: function(Font: PTTF_Font): Integer; cdecl; TTF_FontFaceFamilyName: function(Font: PTTF_Font): pAnsiChar; cdecl; TTF_FontFaceStyleName: function(Font : PTTF_Font): pAnsiChar; cdecl; 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; TTF_RenderGlyph_Solid: function(Font: PTTF_Font; Char: WORD; const ForeGround: TSDL_Color): PSDL_Surface; cdecl; TTF_RenderGlyph_Shaded: function(Font: PTTF_Font; Char: WORD; const ForeGround: TSDL_Color; const BackGround: TSDL_Color): PSDL_Surface; cdecl; // *** SDL_IMAGE *** function Init_SDL_IMAGE: Boolean; procedure Quit_SDL_IMAGE; const {$IFDEF WINDOWS} LIB_SDL_IMAGE = 'SDL_Image.dll'; {$ELSE} LIB_SDL_IMAGE = 'libSDL_image.so'; LIB_SDL_IMAGE_VERSION = 'libSDL_image-1.2.so.0'; {$ENDIF} var SDL_IMAGE_initialized: Boolean; Library_SDL_IMAGE: Pointer; IMG_Load: function(const _file: PAnsiChar): PSDL_Surface; cdecl; implementation function GetLibraryProc(hLibrary: Pointer; ProcName: pAnsiChar): Pointer; begin {$IFDEF WINDOWS} Result := GetProcAddress(hLibrary, ProcName); {$ELSE} Result := dlsym(hLibrary, ProcName); {$ENDIF} end; function GetOpenGLLibraryProc(hLibrary: Pointer; ProcName: pAnsiChar): Pointer; begin Result := GetLibraryProc(hLibrary, ProcName); end; // *** OpenGL *** function Init_OpenGL: Boolean; begin if Library_OpenGL = nil then begin {$IFDEF WINDOWS} Library_OpenGL := LoadLibrary(LIB_OPENGL); {$ELSE} Library_OpenGL := dlopen(LIB_OPENGL, RTLD_LAZY); {$ENDIF} end; if Library_OpenGL <> nil then begin glEnable := GetOpenGLLibraryProc(Library_OpenGL, 'glEnable'); glDisable := GetOpenGLLibraryProc(Library_OpenGL, 'glDisable'); glColor4f := GetOpenGLLibraryProc(Library_OpenGL, 'glColor4f'); glGenTextures := GetOpenGLLibraryProc(Library_OpenGL, 'glGenTextures'); glDeleteTextures := GetOpenGLLibraryProc(Library_OpenGL, 'glDeleteTextures'); glBindTexture := GetOpenGLLibraryProc(Library_OpenGL, 'glBindTexture'); glTexParameteri := GetOpenGLLibraryProc(Library_OpenGL, 'glTexParameteri'); glTexImage2D := GetOpenGLLibraryProc(Library_OpenGL, 'glTexImage2D'); glTexSubImage2D := GetOpenGLLibraryProc(Library_OpenGL, 'glTexSubImage2D'); glBegin := GetOpenGLLibraryProc(Library_OpenGL, 'glBegin'); glEnd := GetOpenGLLibraryProc(Library_OpenGL, 'glEnd'); glTexCoord2f := GetOpenGLLibraryProc(Library_OpenGL, 'glTexCoord2f'); glTexCoord2fv := GetOpenGLLibraryProc(Library_OpenGL, 'glTexCoord2fv'); glVertex2f := GetOpenGLLibraryProc(Library_OpenGL, 'glVertex2f'); glVertex2fv := GetOpenGLLibraryProc(Library_OpenGL, 'glVertex2fv'); glVertex2iv := GetOpenGLLibraryProc(Library_OpenGL, 'glVertex2iv'); glGenLists := GetOpenGLLibraryProc(Library_OpenGL, 'glGenLists'); glDeleteLists := GetOpenGLLibraryProc(Library_OpenGL, 'glDeleteLists'); glCallList := GetOpenGLLibraryProc(Library_OpenGL, 'glCallList'); glNewList := GetOpenGLLibraryProc(Library_OpenGL, 'glNewList'); glEndList := GetOpenGLLibraryProc(Library_OpenGL, 'glEndList'); end; OpenGL_initialized := (Addr(glEnable) <> nil) and (Addr(glDisable) <> nil) and (Addr(glColor4f) <> nil) and (Addr(glGenTextures) <> nil) and (Addr(glDeleteTextures) <> nil) and (Addr(glBindTexture) <> nil) and (Addr(glTexParameteri) <> nil) and (Addr(glTexImage2D) <> nil) and (Addr(glTexSubImage2D) <> nil) and (Addr(glBegin) <> nil) and (Addr(glEnd) <> nil) and (Addr(glTexCoord2f) <> nil) and (Addr(glTexCoord2fv) <> nil) and (Addr(glVertex2f) <> nil) and (Addr(glVertex2fv) <> nil) and (Addr(glVertex2iv) <> nil) and (Addr(glGenLists) <> nil) and (Addr(glDeleteLists) <> nil) and (Addr(glCallList) <> nil) and (Addr(glNewList) <> nil) and (Addr(glEndList) <> nil); Result := OpenGL_initialized; end; procedure Quit_OpenGL; begin glEnable := nil; glDisable := nil; glColor4f := nil; glGenTextures := nil; glDeleteTextures := nil; glBindTexture := nil; glTexParameteri := nil; glTexImage2D := nil; glTexSubImage2D := nil; glBegin := nil; glEnd := nil; glTexCoord2f := nil; glTexCoord2fv := nil; glVertex2f := nil; glVertex2fv := nil; glVertex2iv := nil; glGenLists := nil; glDeleteLists := nil; glCallList := nil; glNewList := nil; glEndList := nil; if Library_OpenGL <> nil then begin {$IFDEF WINDOWS} FreeLibrary(Library_OpenGL); Library_OpenGL := nil; {$ELSE} dlclose(Library_OpenGL); Library_OpenGL := nil; {$ENDIF} end; OpenGL_initialized := False; end; // *** Windows GDI globals *** function Init_GDI: Boolean; begin if Library_GDI32 = nil then begin {$IFDEF WINDOWS} Library_GDI32 := LoadLibrary(LIB_GDI32); // {$ELSE} // Library_GDI32 := nil; //dlopen(LIB_GDI, RTLD_LAZY); {$ENDIF} end; if Library_GDI32 <> nil then begin CreateFontIndirectA := GetLibraryProc(Library_GDI32, 'CreateFontIndirectA'); AddFontResourceA := GetLibraryProc(Library_GDI32, 'AddFontResourceA'); AddFontResourceExA := GetLibraryProc(Library_GDI32, 'AddFontResourceExA'); AddFontMemResourceEx := GetLibraryProc(Library_GDI32, 'AddFontMemResourceEx'); RemoveFontResourceA := GetLibraryProc(Library_GDI32, 'RemoveFontResourceA'); RemoveFontResourceExA := GetLibraryProc(Library_GDI32, 'RemoveFontResourceExA'); RemoveFontMemResourceEx := GetLibraryProc(Library_GDI32, 'RemoveFontMemResourceEx'); GetTextMetricsW := GetLibraryProc(Library_GDI32, 'GetTextMetricsW'); GetGlyphOutlineA := GetLibraryProc(Library_GDI32, 'GetGlyphOutlineA'); GetCharacterPlacementW := GetLibraryProc(Library_GDI32, 'GetCharacterPlacementW'); GetFontData := GetLibraryProc(Library_GDI32, 'GetFontData'); CreateCompatibleDC := GetLibraryProc(Library_GDI32, 'CreateCompatibleDC'); DeleteDC := GetLibraryProc(Library_GDI32, 'DeleteDC'); SelectObject := GetLibraryProc(Library_GDI32, 'SelectObject'); DeleteObject := GetLibraryProc(Library_GDI32, 'DeleteObject'); GetOutlineTextMetricsW := GetLibraryProc(Library_GDI32, 'GetOutlineTextMetricsW'); end; if Library_KERNEL32 = nil then begin {$IFDEF WINDOWS} Library_KERNEL32 := LoadLibrary(LIB_KERNEL32); {$ENDIF} end; if Library_KERNEL32 <> nil then begin GetLocaleInfoA := GetLibraryProc(Library_KERNEL32, 'GetLocaleInfoA'); end; GDI_initialized := (Addr(CreateFontIndirectA) <> nil) and ((Addr(AddFontResourceA) <> nil) or (Addr(AddFontResourceExA) <> nil)) and ((Addr(RemoveFontResourceA) <> nil) or (Addr(RemoveFontResourceExA) <> nil)) and (Addr(GetTextMetricsW) <> nil) and (Addr(GetGlyphOutlineA) <> nil) and // under 9x GetCharacterPlacementW dosn't exist (Addr(GetCharacterPlacementW) <> nil) and (Addr(GetFontData) <> nil) and (Addr(CreateCompatibleDC) <> nil) and (Addr(DeleteDC) <> nil) and (Addr(SelectObject) <> nil) and (Addr(DeleteObject) <> nil) and (Addr(GetLocaleInfoA) <> nil) and (Addr(GetOutlineTextMetricsW) <> nil); Result := GDI_initialized; end; procedure Quit_GDI; begin CreateFontIndirectA := nil; AddFontResourceA := nil; AddFontResourceExA := nil; RemoveFontResourceA := nil; RemoveFontResourceExA := nil; GetTextMetricsW := nil; GetGlyphOutlineA := nil; GetCharacterPlacementW := nil; GetFontData := nil; CreateCompatibleDC := nil; DeleteDC := nil; SelectObject := nil; DeleteObject := nil; if Library_GDI32 <> nil then begin {$IFDEF WINDOWS} FreeLibrary(Library_GDI32); Library_GDI32 := nil; {$ENDIF} end; GetLocaleInfoA := nil; if Library_KERNEL32 <> nil then begin {$IFDEF WINDOWS} FreeLibrary(Library_KERNEL32); Library_KERNEL32 := nil; {$ENDIF} end; GDI_initialized := False; end; // *** SDL globals *** function Init_SDL: Boolean; begin if Library_SDL = nil then begin {$IFDEF WINDOWS} Library_SDL := LoadLibrary(LIB_SDL); {$ELSE} Library_SDL := dlopen(LIB_SDL, RTLD_LAZY); if Library_SDL = nil then Library_SDL := dlopen(LIB_SDL_VERSION, RTLD_LAZY); {$ENDIF} end; if Library_SDL <> nil then begin SDL_FreeSurface := GetLibraryProc(Library_SDL, 'SDL_FreeSurface'); SDL_ConvertSurface := GetLibraryProc(Library_SDL, 'SDL_ConvertSurface'); end; Result := (Addr(SDL_FreeSurface) <> nil) and (Addr(SDL_ConvertSurface) <> nil); end; procedure Quit_SDL; begin SDL_FreeSurface := nil; SDL_ConvertSurface := nil; if Library_SDL <> nil then begin {$IFDEF WINDOWS} FreeLibrary(Library_SDL); Library_SDL := nil; {$ELSE} dlclose(Library_SDL); Library_SDL := nil; {$ENDIF} end; end; // *** SDL_TTF *** function Init_SDL_TTF: Boolean; begin if Library_SDL_TTF = nil then begin {$IFDEF WINDOWS} Library_SDL_TTF := LoadLibrary(LIB_SDL_TTF); {$ELSE} Library_SDL_TTF := dlopen(LIB_SDL_TTF, RTLD_LAZY); if Library_SDL_TTF = nil then Library_SDL_TTF := dlopen(LIB_SDL_TTF_VERSION, RTLD_LAZY); {$ENDIF} end; if Library_SDL_TTF <> nil then begin TTF_Init := GetLibraryProc(Library_SDL_TTF, 'TTF_Init'); TTF_WasInit := GetLibraryProc(Library_SDL_TTF, 'TTF_WasInit'); TTF_OpenFont := GetLibraryProc(Library_SDL_TTF, 'TTF_OpenFont'); TTF_CloseFont := GetLibraryProc(Library_SDL_TTF, 'TTF_CloseFont'); TTF_GetFontStyle := GetLibraryProc(Library_SDL_TTF, 'TTF_GetFontStyle'); TTF_SetFontStyle := GetLibraryProc(Library_SDL_TTF, 'TTF_SetFontStyle'); TTF_FontAscent := GetLibraryProc(Library_SDL_TTF, 'TTF_FontAscent'); TTF_FontDescent := GetLibraryProc(Library_SDL_TTF, 'TTF_FontDescent'); TTF_FontLineSkip := GetLibraryProc(Library_SDL_TTF, 'TTF_FontLineSkip'); TTF_FontFaceIsFixedWidth := GetLibraryProc(Library_SDL_TTF, 'TTF_FontFaceIsFixedWidth'); TTF_FontFaceFamilyName := GetLibraryProc(Library_SDL_TTF, 'TTF_FontFaceFamilyName'); TTF_FontFaceStyleName := GetLibraryProc(Library_SDL_TTF, 'TTF_FontFaceStyleName'); TTF_GlyphMetrics := GetLibraryProc(Library_SDL_TTF, 'TTF_GlyphMetrics'); TTF_RenderGlyph_Solid := GetLibraryProc(Library_SDL_TTF, 'TTF_RenderGlyph_Solid'); TTF_RenderGlyph_Shaded := GetLibraryProc(Library_SDL_TTF, 'TTF_RenderGlyph_Shaded'); end; SDL_TTF_initialized := Init_SDL and (Addr(TTF_Init) <> nil) and (Addr(TTF_WasInit) <> nil) and (Addr(TTF_OpenFont) <> nil) and (Addr(TTF_CloseFont) <> nil) and (Addr(TTF_GetFontStyle) <> nil) and (Addr(TTF_SetFontStyle) <> nil) and (Addr(TTF_FontAscent) <> nil) and (Addr(TTF_FontDescent) <> nil) and (Addr(TTF_FontLineSkip) <> nil) and (Addr(TTF_FontFaceIsFixedWidth) <> nil) and (Addr(TTF_FontFaceFamilyName) <> nil) and (Addr(TTF_FontFaceStyleName) <> nil) and (Addr(TTF_GlyphMetrics) <> nil) and (Addr(TTF_RenderGlyph_Solid) <> nil) and (Addr(TTF_RenderGlyph_Shaded) <> nil); Result := SDL_TTF_initialized; end; procedure Quit_SDL_TTF; begin TTF_Init := nil; TTF_WasInit := nil; TTF_OpenFont := nil; TTF_CloseFont := nil; TTF_GetFontStyle := nil; TTF_SetFontStyle := nil; TTF_FontAscent := nil; TTF_FontDescent := nil; TTF_FontLineSkip := nil; TTF_FontFaceIsFixedWidth := nil; TTF_FontFaceFamilyName := nil; TTF_FontFaceStyleName := nil; TTF_GlyphMetrics := nil; TTF_RenderGlyph_Solid := nil; TTF_RenderGlyph_Shaded := nil; if Library_SDL_TTF <> nil then begin {$IFDEF WINDOWS} FreeLibrary(Library_SDL_TTF); Library_SDL_TTF := nil; {$ELSE} dlclose(Library_SDl_TTF); Library_SDL_TTF := nil; {$ENDIF} end; SDL_TTF_initialized := False; end; // *** SDL_IMAGE *** function Init_SDL_IMAGE: Boolean; begin if Library_SDL_IMAGE = nil then begin {$IFDEF WINDOWS} Library_SDL_IMAGE := LoadLibrary(LIB_SDL_IMAGE); {$ELSE} Library_SDL_IMAGE := dlopen(LIB_SDL_IMAGE, RTLD_LAZY); if Library_SDL_IMAGE = nil then Library_SDL_IMAGE := dlopen(LIB_SDL_IMAGE_VERSION, RTLD_LAZY); {$ENDIF} end; if Library_SDL_IMAGE <> nil then begin IMG_Load := GetLibraryProc(Library_SDL_IMAGE, 'IMG_Load'); end; SDL_IMAGE_initialized := Init_SDL and (Addr(IMG_load) <> nil); Result := SDL_IMAGE_initialized; end; procedure Quit_SDL_IMAGE; begin IMG_Load := nil; if Library_SDL_IMAGE <> nil then begin {$IFDEF WINDOWS} FreeLibrary(Library_SDL_IMAGE); Library_SDL_IMAGE := nil; {$ELSE} dlclose(Library_SDL_IMAGE); Library_SDL_IMAGE := nil; {$ENDIF} end; end; end.