* added SDL support
[glBitmap.git] / glBitmap.pas
index e1e591d..19dba74 100644 (file)
@@ -218,58 +218,51 @@ unit glBitmap;
 // Please uncomment the defines below to configure the glBitmap to your preferences.
 // If you have configured the unit you can uncomment the warning above.
 
-// ###### Start of preferences ################################################
-
-{$DEFINE GLB_NO_NATIVE_GL}
-// To enable the dglOpenGL.pas Header
-// With native GL then bindings are staticlly declared to support other headers
-// or use the glBitmap inside of DLLs (minimize codesize).
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Preferences ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// activate to enable build-in OpenGL support with statically linked methods
+// use dglOpenGL.pas if not enabled
+{.$DEFINE GLB_NATIVE_OGL_STATIC}
 
+// activate to enable build-in OpenGL support with dynamically linked methods
+// use dglOpenGL.pas if not enabled
+{.$DEFINE GLB_NATIVE_OGL_DYNAMIC}
 
-{.$DEFINE GLB_SDL}
-// To enable the support for SDL_surfaces
+// activate to enable the support for SDL_surfaces
+{$DEFINE GLB_SDL}
 
+// activate  to enable the support for TBitmap from Delphi (not lazarus)
 {.$DEFINE GLB_DELPHI}
-// To enable the support for TBitmap from Delphi (not lazarus)
-
 
-// *** image libs ***
 
-{.$DEFINE GLB_SDL_IMAGE}
-// To enable the support of SDL_image to load files. (READ ONLY)
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// activate to enable the support of SDL_image to load files. (READ ONLY)
 // If you enable SDL_image all other libraries will be ignored!
+{$DEFINE GLB_SDL_IMAGE}
 
-
-{.$DEFINE GLB_PNGIMAGE}
-// to enable png support with the unit pngimage. You can download it from http://pngdelphi.sourceforge.net/
+// activate to enable png support with the unit pngimage. You can download it from http://pngdelphi.sourceforge.net/
 // if you enable pngimage the libPNG will be ignored
+{.$DEFINE GLB_PNGIMAGE}
 
-{.$DEFINE GLB_LIB_PNG}
-// to use the libPNG http://www.libpng.org/
+// activate to use the libPNG http://www.libpng.org/
 // You will need an aditional header.
 // http://www.opengl24.de/index.php?cat=header&file=libpng
+{.$DEFINE GLB_LIB_PNG}
 
-{.$DEFINE GLB_DELPHI_JPEG}
 // if you enable delphi jpegs the libJPEG will be ignored
+{.$DEFINE GLB_DELPHI_JPEG}
 
-{.$DEFINE GLB_LIB_JPEG}
-// to use the libJPEG http://www.ijg.org/
+// activateto use the libJPEG http://www.ijg.org/
 // You will need an aditional header.
 // http://www.opengl24.de/index.php?cat=header&file=libjpeg
-
-// ###### End of preferences ##################################################
+{.$DEFINE GLB_LIB_JPEG}
 
 
-// ###### PRIVATE. Do not change anything. ####################################
-// *** old defines for compatibility ***
-{$IFDEF NO_NATIVE_GL}
-  {$DEFINE GLB_NO_NATIVE_GL}
-{$ENDIF}
-{$IFDEF pngimage}
-  {$definde GLB_PNGIMAGE}
-{$ENDIF}
-
-// *** Delphi Versions ***
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// PRIVATE: DO not change anything! //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Delphi Versions
 {$IFDEF fpc}
   {$MODE Delphi}
 
@@ -283,7 +276,20 @@ unit glBitmap;
   {$ENDIF}
 {$ENDIF}
 
-// *** checking define combinations ***
+// Operation System
+{$IF DEFINED(WIN32) or DEFINED(WIN64)}
+  {$DEFINE GLB_WIN}
+{$ELSEIF DEFINED(LINUX)}
+  {$DEFINE GLB_LINUX}
+{$IFEND}
+
+// native OpenGL Support
+{$IF DEFINED(GLB_NATIVE_OGL_STATIC) OR DEFINED(GLB_NATIVE_OGL_DYNAMIC)}
+  {$DEFINE GLB_NATIVE_OGL}
+{$IFEND}
+
+// checking define combinations
+//SDL Image
 {$IFDEF GLB_SDL_IMAGE}
   {$IFNDEF GLB_SDL}
     {$MESSAGE warn 'SDL_image won''t work without SDL. SDL will be activated.'}
@@ -310,6 +316,7 @@ unit glBitmap;
   {$DEFINE GLB_SUPPORT_JPEG_READ}
 {$ENDIF}
 
+// PNG Image
 {$IFDEF GLB_PNGIMAGE}
   {$IFDEF GLB_LIB_PNG}
     {$MESSAGE warn 'The library libPNG will be ignored if you are using pngimage.'}
@@ -320,11 +327,13 @@ unit glBitmap;
   {$DEFINE GLB_SUPPORT_PNG_WRITE}
 {$ENDIF}
 
+// libPNG
 {$IFDEF GLB_LIB_PNG}
   {$DEFINE GLB_SUPPORT_PNG_READ}
   {$DEFINE GLB_SUPPORT_PNG_WRITE}
 {$ENDIF}
 
+// JPEG Image
 {$IFDEF GLB_DELPHI_JPEG}
   {$IFDEF GLB_LIB_JPEG}
     {$MESSAGE warn 'The library libJPEG will be ignored if you are using the unit JPEG.'}
@@ -335,12 +344,18 @@ unit glBitmap;
   {$DEFINE GLB_SUPPORT_JPEG_WRITE}
 {$ENDIF}
 
+// libJPEG
 {$IFDEF GLB_LIB_JPEG}
   {$DEFINE GLB_SUPPORT_JPEG_READ}
   {$DEFINE GLB_SUPPORT_JPEG_WRITE}
 {$ENDIF}
 
-// *** general options ***
+// native OpenGL
+{$IF DEFINED(GLB_NATIVE_OGL_STATIC) AND DEFINED(GLB_NATIVE_OGL_DYNAMIC)}
+  {$MESSAGE warn 'GLB_NATIVE_OGL_STATIC will be ignored because you enabled GLB_NATIVE_OGL_DYNAMIC'}
+{$ENDIF}
+
+// general options
 {$EXTENDEDSYNTAX ON}
 {$LONGSTRINGS ON}
 {$ALIGN ON}
@@ -351,18 +366,21 @@ unit glBitmap;
 interface
 
 uses
-  {$IFDEF GLB_NO_NATIVE_GL} dglOpenGL,                            {$ENDIF}
+  {$IFNDEF GLB_NATIVE_OGL}      dglOpenGL,                   {$ENDIF}
+  {$IF DEFINED(GLB_WIN) AND
+       DEFINED(GLB_NATIVE_OGL)} windows,                 {$IFEND}
 
-  {$IFDEF GLB_SDL}          SDL,                                  {$ENDIF}
-  {$IFDEF GLB_DELPHI}       Dialogs, Windows, Graphics,           {$ENDIF}
+  {$IFDEF GLB_SDL}              SDL,                         {$ENDIF}
+  {$IFDEF GLB_DELPHI}           Dialogs, Graphics,           {$ENDIF}
 
-  {$IFDEF GLB_SDL_IMAGE}    SDL_image,                            {$ENDIF}
+  {$IFDEF GLB_SDL_IMAGE}        SDL_image,                   {$ENDIF}
 
-  {$IFDEF GLB_PNGIMAGE}     pngimage,                             {$ENDIF}
-  {$IFDEF GLB_LIB_PNG}      libPNG,                               {$ENDIF}
+  {$IFDEF GLB_PNGIMAGE}         pngimage,                    {$ENDIF}
+  {$IFDEF GLB_LIB_PNG}          libPNG,                      {$ENDIF}
+
+  {$IFDEF GLB_DELPHI_JPEG}      JPEG,                        {$ENDIF}
+  {$IFDEF GLB_LIB_JPEG}         libJPEG,                     {$ENDIF}
 
-  {$IFDEF GLB_DELPHI_JPEG}  JPEG,                                 {$ENDIF}
-  {$IFDEF GLB_LIB_JPEG}     libJPEG,                              {$ENDIF}
   Classes, SysUtils;
 
 {$IFNDEF GLB_DELPHI}
@@ -379,215 +397,291 @@ type
   end;
 {$ENDIF}
 
-(* TODO dglOpenGL
-{$IFNDEF GLB_NO_NATIVE_GL}
-// Native OpenGL Implementation
-type
-  PByteBool = ^ByteBool;
-
-{$IFDEF GLB_DELPHI}
-var
-  gLastContext: HGLRC;
-{$ENDIF}
-
+{$IFDEF GLB_NATIVE_OGL}
 const
-  // Generell
-  GL_VERSION = $1F02;
+  GL_TRUE   = 1;
+  GL_FALSE  = 0;
+
+  GL_VERSION    = $1F02;
   GL_EXTENSIONS = $1F03;
 
-  GL_TRUE = 1;
-  GL_FALSE = 0;
-
-  GL_TEXTURE_1D = $0DE0;
-  GL_TEXTURE_2D = $0DE1;
-
-  GL_MAX_TEXTURE_SIZE = $0D33;
-  GL_PACK_ALIGNMENT = $0D05;
-  GL_UNPACK_ALIGNMENT = $0CF5;
-
-  // Textureformats
-  GL_RGB = $1907;
-  GL_RGB4 = $804F;
-  GL_RGB8 = $8051;
-  GL_RGBA = $1908;
-  GL_RGBA4 = $8056;
-  GL_RGBA8 = $8058;
-  GL_BGR = $80E0;
-  GL_BGRA = $80E1;
-  GL_ALPHA4 = $803B;
-  GL_ALPHA8 = $803C;
-  GL_LUMINANCE4 = $803F;
-  GL_LUMINANCE8 = $8040;
-  GL_LUMINANCE4_ALPHA4 = $8043;
-  GL_LUMINANCE8_ALPHA8 = $8045;
-  GL_DEPTH_COMPONENT = $1902;
-
-  GL_UNSIGNED_BYTE = $1401;
-  GL_ALPHA = $1906;
-  GL_LUMINANCE = $1909;
-  GL_LUMINANCE_ALPHA = $190A;
-
-  GL_TEXTURE_WIDTH = $1000;
-  GL_TEXTURE_HEIGHT = $1001;
-  GL_TEXTURE_INTERNAL_FORMAT = $1003;
-  GL_TEXTURE_RED_SIZE = $805C;
-  GL_TEXTURE_GREEN_SIZE = $805D;
-  GL_TEXTURE_BLUE_SIZE = $805E;
-  GL_TEXTURE_ALPHA_SIZE = $805F;
-  GL_TEXTURE_LUMINANCE_SIZE = $8060;
-
-  // Dataformats
-  GL_UNSIGNED_SHORT_5_6_5 = $8363;
-  GL_UNSIGNED_SHORT_5_6_5_REV = $8364;
+  GL_TEXTURE_1D         = $0DE0;
+  GL_TEXTURE_2D         = $0DE1;
+  GL_TEXTURE_RECTANGLE  = $84F5;
+
+  GL_TEXTURE_WIDTH            = $1000;
+  GL_TEXTURE_HEIGHT           = $1001;
+  GL_TEXTURE_INTERNAL_FORMAT  = $1003;
+
+  GL_ALPHA    = $1906;
+  GL_ALPHA4   = $803B;
+  GL_ALPHA8   = $803C;
+  GL_ALPHA12  = $803D;
+  GL_ALPHA16  = $803E;
+
+  GL_LUMINANCE    = $1909;
+  GL_LUMINANCE4   = $803F;
+  GL_LUMINANCE8   = $8040;
+  GL_LUMINANCE12  = $8041;
+  GL_LUMINANCE16  = $8042;
+
+  GL_LUMINANCE_ALPHA      = $190A;
+  GL_LUMINANCE4_ALPHA4    = $8043;
+  GL_LUMINANCE6_ALPHA2    = $8044;
+  GL_LUMINANCE8_ALPHA8    = $8045;
+  GL_LUMINANCE12_ALPHA4   = $8046;
+  GL_LUMINANCE12_ALPHA12  = $8047;
+  GL_LUMINANCE16_ALPHA16  = $8048;
+
+  GL_RGB      = $1907;
+  GL_BGR      = $80E0;
+  GL_R3_G3_B2 = $2A10;
+  GL_RGB4     = $804F;
+  GL_RGB5     = $8050;
+  GL_RGB565   = $8D62;
+  GL_RGB8     = $8051;
+  GL_RGB10    = $8052;
+  GL_RGB12    = $8053;
+  GL_RGB16    = $8054;
+
+  GL_RGBA     = $1908;
+  GL_BGRA     = $80E1;
+  GL_RGBA2    = $8055;
+  GL_RGBA4    = $8056;
+  GL_RGB5_A1  = $8057;
+  GL_RGBA8    = $8058;
+  GL_RGB10_A2 = $8059;
+  GL_RGBA12   = $805A;
+  GL_RGBA16   = $805B;
+
+  GL_DEPTH_COMPONENT    = $1902;
+  GL_DEPTH_COMPONENT16  = $81A5;
+  GL_DEPTH_COMPONENT24  = $81A6;
+  GL_DEPTH_COMPONENT32  = $81A7;
+
+  GL_COMPRESSED_RGB                 = $84ED;
+  GL_COMPRESSED_RGBA                = $84EE;
+  GL_COMPRESSED_RGB_S3TC_DXT1_EXT   = $83F0;
+  GL_COMPRESSED_RGBA_S3TC_DXT1_EXT  = $83F1;
+  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT  = $83F2;
+  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT  = $83F3;
+
+  GL_UNSIGNED_BYTE            = $1401;
+  GL_UNSIGNED_BYTE_3_3_2      = $8032;
+  GL_UNSIGNED_BYTE_2_3_3_REV  = $8362;
+
+  GL_UNSIGNED_SHORT             = $1403;
+  GL_UNSIGNED_SHORT_5_6_5       = $8363;
+  GL_UNSIGNED_SHORT_4_4_4_4     = $8033;
+  GL_UNSIGNED_SHORT_5_5_5_1     = $8034;
+  GL_UNSIGNED_SHORT_5_6_5_REV   = $8364;
   GL_UNSIGNED_SHORT_4_4_4_4_REV = $8365;
   GL_UNSIGNED_SHORT_1_5_5_5_REV = $8366;
-  GL_UNSIGNED_INT_2_10_10_10_REV = $8368;
 
-  // Filter
-  GL_NEAREST = $2600;
-  GL_LINEAR = $2601;
+  GL_UNSIGNED_INT                 = $1405;
+  GL_UNSIGNED_INT_8_8_8_8         = $8035;
+  GL_UNSIGNED_INT_10_10_10_2      = $8036;
+  GL_UNSIGNED_INT_8_8_8_8_REV     = $8367;
+  GL_UNSIGNED_INT_2_10_10_10_REV  = $8368;
+
+  { Texture Filter }
+  GL_TEXTURE_MAG_FILTER     = $2800;
+  GL_TEXTURE_MIN_FILTER     = $2801;
+  GL_NEAREST                = $2600;
   GL_NEAREST_MIPMAP_NEAREST = $2700;
-  GL_LINEAR_MIPMAP_NEAREST = $2701;
-  GL_NEAREST_MIPMAP_LINEAR = $2702;
-  GL_LINEAR_MIPMAP_LINEAR = $2703;
-  GL_TEXTURE_MAG_FILTER = $2800;
-  GL_TEXTURE_MIN_FILTER = $2801;
-
-  // Wrapmodes
-  GL_TEXTURE_WRAP_S = $2802;
-  GL_TEXTURE_WRAP_T = $2803;
-  GL_CLAMP = $2900;
-  GL_REPEAT = $2901;
-  GL_CLAMP_TO_EDGE = $812F;
-  GL_CLAMP_TO_BORDER = $812D;
-  GL_TEXTURE_WRAP_R = $8072;
-
-  GL_MIRRORED_REPEAT = $8370;
-
-  // Border Color
+  GL_NEAREST_MIPMAP_LINEAR  = $2702;
+  GL_LINEAR                 = $2601;
+  GL_LINEAR_MIPMAP_NEAREST  = $2701;
+  GL_LINEAR_MIPMAP_LINEAR   = $2703;
+
+  { Texture Wrap }
+  GL_TEXTURE_WRAP_S   = $2802;
+  GL_TEXTURE_WRAP_T   = $2803;
+  GL_TEXTURE_WRAP_R   = $8072;
+  GL_CLAMP            = $2900;
+  GL_REPEAT           = $2901;
+  GL_CLAMP_TO_EDGE    = $812F;
+  GL_CLAMP_TO_BORDER  = $812D;
+  GL_MIRRORED_REPEAT  = $8370;
+
+  { Other }
+  GL_GENERATE_MIPMAP      = $8191;
   GL_TEXTURE_BORDER_COLOR = $1004;
+  GL_MAX_TEXTURE_SIZE     = $0D33;
+  GL_PACK_ALIGNMENT       = $0D05;
+  GL_UNPACK_ALIGNMENT     = $0CF5;
 
-  // Texgen
-  GL_NORMAL_MAP = $8511;
-  GL_REFLECTION_MAP = $8512;
-  GL_S = $2000;
-  GL_T = $2001;
-  GL_R = $2002;
-  GL_TEXTURE_GEN_MODE = $2500;
-  GL_TEXTURE_GEN_S = $0C60;
-  GL_TEXTURE_GEN_T = $0C61;
-  GL_TEXTURE_GEN_R = $0C62;
-
-  // Cubemaps
-  GL_MAX_CUBE_MAP_TEXTURE_SIZE = $851C;
-  GL_TEXTURE_CUBE_MAP = $8513;
-  GL_TEXTURE_BINDING_CUBE_MAP = $8514;
-  GL_TEXTURE_CUBE_MAP_POSITIVE_X = $8515;
-  GL_TEXTURE_CUBE_MAP_NEGATIVE_X = $8516;
-  GL_TEXTURE_CUBE_MAP_POSITIVE_Y = $8517;
-  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = $8518;
-  GL_TEXTURE_CUBE_MAP_POSITIVE_Z = $8519;
-  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = $851A;
-
-  GL_TEXTURE_RECTANGLE_ARB = $84F5;
-
-  // GL_SGIS_generate_mipmap
-  GL_GENERATE_MIPMAP = $8191;
-
-  // GL_EXT_texture_compression_s3tc
-  GL_COMPRESSED_RGB_S3TC_DXT1_EXT = $83F0;
-  GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = $83F1;
-  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = $83F2;
-  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = $83F3;
-
-  // GL_EXT_texture_filter_anisotropic
-  GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE;
+  GL_TEXTURE_MAX_ANISOTROPY_EXT     = $84FE;
   GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF;
 
-  // GL_ARB_texture_compression
-  GL_COMPRESSED_RGB = $84ED;
-  GL_COMPRESSED_RGBA = $84EE;
-  GL_COMPRESSED_ALPHA = $84E9;
-  GL_COMPRESSED_LUMINANCE = $84EA;
-  GL_COMPRESSED_LUMINANCE_ALPHA = $84EB;
+{$ifdef LINUX}
+  libglu    = 'libGLU.so.1';
+  libopengl = 'libGL.so.1';
+{$else}
+  libglu    = 'glu32.dll';
+  libopengl = 'opengl32.dll';
+{$endif}
+
+type
+  GLboolean = BYTEBOOL;
+  GLint     = Integer;
+  GLsizei   = Integer;
+  GLuint    = Cardinal;
+  GLfloat   = Single;
+  GLenum    = Cardinal;
+
+  PGLvoid    = Pointer;
+  PGLboolean = ^GLboolean;
+  PGLint     = ^GLint;
+  PGLuint    = ^GLuint;
+  PGLfloat   = ^GLfloat;
+
+  TglCompressedTexImage1D  = procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglCompressedTexImage2D  = procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglGetCompressedTexImage = procedure(target: GLenum; level: GLint; img: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+{$IF DEFINED(GLB_NATIVE_OGL_DYNAMIC)}
+  TglEnable  = procedure(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglDisable = procedure(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+  TglGetString   = function(name: GLenum): PAnsiChar; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglGetIntegerv = procedure(pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+  TglTexParameteri          = procedure(target: GLenum; pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglTexParameterfv         = procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglGetTexParameteriv      = procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglGetTexParameterfv      = procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglGetTexLevelParameteriv = procedure(target: GLenum; level: GLint; pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglGetTexLevelParameterfv = procedure(target: GLenum; level: GLint; pname: GLenum; params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+  TglGenTextures    = procedure(n: GLsizei; textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglBindTexture    = procedure(target: GLenum; texture: GLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglDeleteTextures = procedure(n: GLsizei; const textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+  TglAreTexturesResident = function(n: GLsizei; const textures: PGLuint; residences: PGLboolean): GLboolean; {$IFDEF DGL_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglReadPixels          = procedure(x: GLint; y: GLint; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglPixelStorei         = procedure(pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+  TglTexImage1D  = procedure(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglTexImage2D  = procedure(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; height: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TglGetTexImage = procedure(target: GLenum; level: GLint; format: GLenum; _type: GLenum; pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+  TgluBuild1DMipmaps = function(target: GLEnum; components, width: GLint; format, atype: GLEnum; const data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+  TgluBuild2DMipmaps = function(target: GLEnum; components, width, height: GLint; format, atype: GLEnum; const Data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+  {$IFDEF GLB_LINUX}
+  TglXGetProcAddress = function(ProcName: PAnsiChar): Pointer; cdecl;
+  {$ELSE}
+  TwglGetProcAddress = function (ProcName: PAnsiChar): Pointer; stdcall;
+  {$ENDIF}
+
+{$ELSEIF DEFINED(GLB_NATIVE_OGL_STATIC)}
+  procedure glEnable(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glDisable(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+
+  function glGetString(name: GLenum): PAnsiChar; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glGetIntegerv(pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+
+  procedure glTexParameteri(target: GLenum; pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glTexParameterfv(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glGetTexParameteriv(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glGetTexParameterfv(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glGetTexLevelParameteriv(target: GLenum; level: GLint; pname: GLenum; params: PGLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glGetTexLevelParameterfv(target: GLenum; level: GLint; pname: GLenum; params: PGLfloat); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+
+  procedure glGenTextures(n: GLsizei; textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glBindTexture(target: GLenum; texture: GLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glDeleteTextures(n: GLsizei; const textures: PGLuint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+
+  function  glAreTexturesResident(n: GLsizei; const textures: PGLuint; residences: PGLboolean): GLboolean; {$IFDEF DGL_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glReadPixels(x: GLint; y: GLint; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glPixelStorei(pname: GLenum; param: GLint); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+
+  procedure glTexImage1D(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glTexImage2D(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; height: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+  procedure glGetTexImage(target: GLenum; level: GLint; format: GLenum; _type: GLenum; pixels: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl;
+
+  function gluBuild1DMipmaps(target: GLEnum; components, width: GLint; format, atype: GLEnum; const data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libglu;
+  function gluBuild2DMipmaps(target: GLEnum; components, width, height: GLint; format, atype: GLEnum; const Data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libglu;
+{$ENDIF}
 
-  // Extensions
 var
   GL_VERSION_1_2,
   GL_VERSION_1_3,
   GL_VERSION_1_4,
   GL_VERSION_2_0,
 
+  GL_SGIS_generate_mipmap,
+
   GL_ARB_texture_border_clamp,
-  GL_ARB_texture_cube_map,
-  GL_ARB_texture_compression,
-  GL_ARB_texture_non_power_of_two,
-  GL_ARB_texture_rectangle,
   GL_ARB_texture_mirrored_repeat,
-  GL_EXT_bgra,
-  GL_EXT_texture_edge_clamp,
-  GL_EXT_texture_cube_map,
-  GL_EXT_texture_compression_s3tc,
-  GL_EXT_texture_filter_anisotropic,
-  GL_EXT_texture_rectangle,
-  GL_NV_texture_rectangle,
+  GL_ARB_texture_rectangle,
+  GL_ARB_texture_non_power_of_two,
+
   GL_IBM_texture_mirrored_repeat,
-  GL_SGIS_generate_mipmap: Boolean;
 
-const
-{$IFDEF LINUX}
-  libglu = 'libGLU.so.1';
-  libopengl = 'libGL.so.1';
-{$else}
-  libglu = 'glu32.dll';
-  libopengl = 'opengl32.dll';
-{$ENDIF}
+  GL_NV_texture_rectangle,
 
-{$IFDEF LINUX}
-  function glXGetProcAddress(ProcName: PAnsiChar): Pointer; cdecl; external libopengl;
-{$else}
-  function wglGetProcAddress(ProcName: PAnsiChar): Pointer; stdcall; external libopengl;
+  GL_EXT_texture_edge_clamp,
+  GL_EXT_texture_rectangle,
+  GL_EXT_texture_filter_anisotropic: Boolean;
+
+  glCompressedTexImage1D: TglCompressedTexImage1D;
+  glCompressedTexImage2D: TglCompressedTexImage2D;
+  glGetCompressedTexImage: TglGetCompressedTexImage;
+
+{$IFDEF GLB_NATIVE_OGL_DYNAMIC}
+  glEnable: TglEnable;
+  glDisable: TglDisable;
+
+  glGetString: TglGetString;
+  glGetIntegerv: TglGetIntegerv;
+
+  glTexParameteri: TglTexParameteri;
+  glTexParameterfv: TglTexParameterfv;
+  glGetTexParameteriv: TglGetTexParameteriv;
+  glGetTexParameterfv: TglGetTexParameterfv;
+  glGetTexLevelParameteriv: TglGetTexLevelParameteriv;
+  glGetTexLevelParameterfv: TglGetTexLevelParameterfv;
+
+  glGenTextures: TglGenTextures;
+  glBindTexture: TglBindTexture;
+  glDeleteTextures: TglDeleteTextures;
+
+  glAreTexturesResident: TglAreTexturesResident;
+  glReadPixels: TglReadPixels;
+  glPixelStorei: TglPixelStorei;
+
+  glTexImage1D: TglTexImage1D;
+  glTexImage2D: TglTexImage2D;
+  glGetTexImage: TglGetTexImage;
+
+  gluBuild1DMipmaps: TgluBuild1DMipmaps;
+  gluBuild2DMipmaps: TgluBuild2DMipmaps;
+
+  {$IF DEFINED(GLB_WIN)}
+  wglGetProcAddress: TwglGetProcAddress;
+  {$ELSEIF DEFINED(GLB_LINUX)}
+  glXGetProcAddress: TglXGetProcAddress;
+  glXGetProcAddressARB: TglXGetProcAddressARB;
+  {$ENDIF}
 {$ENDIF}
 
-  function glGetString(name: Cardinal): PAnsiChar; {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-
-  procedure glEnable(cap: Cardinal); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glDisable(cap: Cardinal); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glGetIntegerv(pname: Cardinal; params: PInteger); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-
-  procedure glTexImage1D(target: Cardinal; level, internalformat, width, border: Integer; format, atype: Cardinal; const pixels: Pointer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glTexImage2D(target: Cardinal; level, internalformat, width, height, border: Integer; format, atype: Cardinal; const pixels: Pointer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-
-  procedure glGenTextures(n: Integer; Textures: PCardinal); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glBindTexture(target: Cardinal; Texture: Cardinal); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glDeleteTextures(n: Integer; const textures: PCardinal); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-
-  procedure glReadPixels(x, y: Integer; width, height: Integer; format, atype: Cardinal; pixels: Pointer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glPixelStorei(pname: Cardinal; param: Integer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glGetTexImage(target: Cardinal; level: Integer; format: Cardinal; _type: Cardinal; pixels: Pointer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-
-  function glAreTexturesResident(n: Integer; const Textures: PCardinal; residences: PByteBool): ByteBool;  {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glTexParameteri(target: Cardinal; pname: Cardinal; param: Integer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glTexParameterfv(target: Cardinal; pname: Cardinal; const params: PSingle); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glGetTexLevelParameteriv(target: Cardinal; level: Integer; pname: Cardinal; params: PInteger); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-  procedure glTexGeni(coord, pname: Cardinal; param: Integer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libopengl;
-
-  function gluBuild1DMipmaps(Target: Cardinal; Components, Width: Integer; Format, atype: Cardinal; Data: Pointer): Integer; {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libglu;
-  function gluBuild2DMipmaps(Target: Cardinal; Components, Width, Height: Integer; Format, aType: Cardinal; Data: Pointer): Integer; {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF} external libglu;
-
+(*
+{$IFDEF GLB_DELPHI}
 var
-  glCompressedTexImage2D : procedure(target: Cardinal; level: Integer; internalformat: Cardinal; width, height: Integer; border: Integer; imageSize: Integer; const data: Pointer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF}
-  glCompressedTexImage1D : procedure(target: Cardinal; level: Integer; internalformat: Cardinal; width: Integer; border: Integer; imageSize: Integer; const data: Pointer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF}
-  glGetCompressedTexImage : procedure(target: Cardinal; level: Integer; img: Pointer); {$IFDEF WINDOWS}stdcall; {$else}cdecl; {$ENDIF}
+  gLastContext: HGLRC;
 {$ENDIF}
 *)
 
+{$ENDIF}
+
 type
 ////////////////////////////////////////////////////////////////////////////////////////////////////
   EglBitmapException               = class(Exception);
   EglBitmapSizeToLargeException    = class(EglBitmapException);
   EglBitmapNonPowerOfTwoException  = class(EglBitmapException);
-  EglBitmapUnsupportedFormatFormat = class(EglBitmapException);
+  EglBitmapUnsupportedFormat       = class(EglBitmapException);
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
   TglBitmapFormat = (
@@ -700,7 +794,7 @@ type
     Position: TglBitmapPixelPosition;
     Source:   TglBitmapPixelData;
     Dest:     TglBitmapPixelData;
-    Args:     PtrInt;
+    Args:     Pointer;
   end;
   TglBitmapFunction = procedure(var FuncRec: TglBitmapFunctionRec);
 
@@ -759,7 +853,7 @@ type
     procedure SetAnisotropic(const aValue: Integer);
 
     procedure CreateID;
-    procedure SetupParameters(var aBuildWithGlu: Boolean);
+    procedure SetupParameters(out aBuildWithGlu: Boolean);
     procedure SetDataPointer(const aData: PByte; const aFormat: TglBitmapFormat;
       const aWidth: Integer = -1; const aHeight: Integer = -1); virtual;
     procedure GenTexture(const aTestTextureSize: Boolean = true); virtual; abstract;
@@ -799,7 +893,7 @@ type
     procedure LoadFromFile(const aFilename: String);
     procedure LoadFromStream(const aStream: TStream); virtual;
     procedure LoadFromFunc(const aSize: TglBitmapPixelPosition; const aFunc: TglBitmapFunction;
-      const aFormat: TglBitmapFormat; const aArgs: PtrInt = 0);
+      const aFormat: TglBitmapFormat; const aArgs: Pointer = nil);
     {$IFDEF GLB_DELPHI}
     procedure LoadFromResource(const aInstance: Cardinal; const aResource: String; const aResType: PChar = nil);
     procedure LoadFromResourceID(const sInstance: Cardinal; const aResourceID: Integer; const aResType: PChar);
@@ -810,9 +904,9 @@ type
     procedure SaveToStream(const aStream: TStream; const aFileType: TglBitmapFileType); virtual;
 
     //Convert
-    function AddFunc(const aFunc: TglBitmapFunction; const aCreateTemp: Boolean; const aArgs: PtrInt = 0): Boolean; overload;
+    function AddFunc(const aFunc: TglBitmapFunction; const aCreateTemp: Boolean; const aArgs: Pointer = nil): Boolean; overload;
     function AddFunc(const aSource: TglBitmap; const aFunc: TglBitmapFunction; aCreateTemp: Boolean;
-      const aFormat: TglBitmapFormat; const aArgs: PtrInt = 0): Boolean; overload;
+      const aFormat: TglBitmapFormat; const aArgs: Pointer = nil): Boolean; overload;
   public
     //Alpha & Co
     {$IFDEF GLB_SDL}
@@ -820,7 +914,7 @@ type
     function AssignFromSurface(const aSurface: PSDL_Surface): Boolean;
     function AssignAlphaToSurface(out aSurface: PSDL_Surface): Boolean;
     function AddAlphaFromSurface(const aSurface: PSDL_Surface; const aFunc: TglBitmapFunction = nil;
-      const aArgs: PtrInt = 0): Boolean;
+      const aArgs: Pointer = nil): Boolean;
     {$ENDIF}
 
     {$IFDEF GLB_DELPHI}
@@ -828,17 +922,17 @@ type
     function AssignFromBitmap(const aBitmap: TBitmap): Boolean;
     function AssignAlphaToBitmap(const aBitmap: TBitmap): Boolean;
     function AddAlphaFromBitmap(const aBitmap: TBitmap; const aFunc: TglBitmapFunction = nil;
-      const aArgs: PtrInt = 0): Boolean;
+      const aArgs: Pointer = nil): Boolean;
     function AddAlphaFromResource(const aInstance: Cardinal; const aResource: String; const aResType: PChar = nil;
-      const aFunc: TglBitmapFunction = nil; const aArgs: PtrInt = 0): Boolean;
+      const aFunc: TglBitmapFunction = nil; const aArgs: Pointer = nil): Boolean;
     function AddAlphaFromResourceID(const aInstance: Cardinal; const aResourceID: Integer; const aResType: PChar;
-      const aFunc: TglBitmapFunction = nil; const aArgs: PtrInt = 0): Boolean;
+      const aFunc: TglBitmapFunction = nil; const aArgs: Pointer = nil): Boolean;
     {$ENDIF}
 
-    function AddAlphaFromFunc(const aFunc: TglBitmapFunction; const aArgs: PtrInt = 0): Boolean; virtual;
-    function AddAlphaFromFile(const aFileName: String; const aFunc: TglBitmapFunction = nil; const aArgs: PtrInt = 0): Boolean;
-    function AddAlphaFromStream(const aStream: TStream; const aFunc: TglBitmapFunction = nil; const aArgs: PtrInt = 0): Boolean;
-    function AddAlphaFromGlBitmap(const aBitmap: TglBitmap; aFunc: TglBitmapFunction = nil; const aArgs: PtrInt = 0): Boolean;
+    function AddAlphaFromFunc(const aFunc: TglBitmapFunction; const aArgs: Pointer = nil): Boolean; virtual;
+    function AddAlphaFromFile(const aFileName: String; const aFunc: TglBitmapFunction = nil; const aArgs: Pointer = nil): Boolean;
+    function AddAlphaFromStream(const aStream: TStream; const aFunc: TglBitmapFunction = nil; const aArgs: Pointer = nil): Boolean;
+    function AddAlphaFromGlBitmap(const aBitmap: TglBitmap; aFunc: TglBitmapFunction = nil; const aArgs: Pointer = nil): Boolean;
 
     function AddAlphaFromColorKey(const aRed, aGreen, aBlue: Byte; const aDeviation: Byte = 0): Boolean;
     function AddAlphaFromColorKeyRange(const aRed, aGreen, aBlue: Cardinal; const aDeviation: Cardinal = 0): Boolean;
@@ -869,9 +963,6 @@ type
       const T: Cardinal = GL_CLAMP_TO_EDGE;
       const R: Cardinal = GL_CLAMP_TO_EDGE);
 
-    procedure GetPixel(const aPos: TglBitmapPixelPosition; var aPixel: TglBitmapPixelData);   virtual;
-    procedure SetPixel(const aPos: TglBitmapPixelPosition; const aPixel: TglBitmapPixelData); virtual;
-
     procedure Bind(const aEnableTextureUnit: Boolean = true); virtual;
     procedure Unbind(const aDisableTextureUnit: Boolean = true); virtual;
 
@@ -880,20 +971,18 @@ type
     constructor Create(const aFileName: String); overload;
     constructor Create(const aStream: TStream); overload;
     constructor Create(const aSize: TglBitmapPixelPosition; const aFormat: TglBitmapFormat); overload;
-    constructor Create(const aSize: TglBitmapPixelPosition; const aFormat: TglBitmapFormat; const aFunc: TglBitmapFunction; const aArgs: PtrInt = 0); overload;
+    constructor Create(const aSize: TglBitmapPixelPosition; const aFormat: TglBitmapFormat; const aFunc: TglBitmapFunction; const aArgs: Pointer = nil); overload;
     {$IFDEF GLB_DELPHI}
     constructor Create(const aInstance: Cardinal; const aResource: String; const aResType: PChar = nil); overload;
     constructor Create(const aInstance: Cardinal; const aResourceID: Integer; const aResType: PChar); overload;
     {$ENDIF}
   private
-    {$IFDEF GLB_SUPPORT_PNG_READ}
-    function LoadPNG(const aStream: TStream): Boolean; virtual;
-    procedure SavePNG(const aStream: TStream); virtual;
-    {$ENDIF}
-    {$IFDEF GLB_SUPPORT_JPEG_READ}
-    function LoadJPEG(const aStream: TStream): Boolean; virtual;
-    procedure SaveJPEG(const aStream: TStream); virtual;
-    {$ENDIF}
+    {$IFDEF GLB_SUPPORT_PNG_READ}  function  LoadPNG(const aStream: TStream): Boolean; virtual; {$ENDIF}
+    {$ifdef GLB_SUPPORT_PNG_WRITE} procedure SavePNG(const aStream: TStream); virtual; {$ENDIF}
+
+    {$IFDEF GLB_SUPPORT_JPEG_READ}  function  LoadJPEG(const aStream: TStream): Boolean; virtual; {$ENDIF}
+    {$IFDEF GLB_SUPPORT_JPEG_WRITE} procedure SaveJPEG(const aStream: TStream); virtual; {$ENDIF}
+
     function LoadBMP(const aStream: TStream): Boolean; virtual;
     procedure SaveBMP(const aStream: TStream); virtual;
 
@@ -1049,10 +1138,10 @@ type
 
   TFormatDescriptor = class(TObject)
   private
-    function GetRedMask: UInt64;
-    function GetGreenMask: UInt64;
-    function GetBlueMask: UInt64;
-    function GetAlphaMask: UInt64;
+    function GetRedMask: QWord;
+    function GetGreenMask: QWord;
+    function GetBlueMask: QWord;
+    function GetAlphaMask: QWord;
   protected
     fFormat: TglBitmapFormat;
     fWithAlpha: TglBitmapFormat;
@@ -1086,13 +1175,13 @@ type
     property Range: TglBitmapColorRec read fRange;
     property Shift: TShiftRec         read fShift;
 
-    property RedMask:   UInt64 read GetRedMask;
-    property GreenMask: UInt64 read GetGreenMask;
-    property BlueMask:  UInt64 read GetBlueMask;
-    property AlphaMask: UInt64 read GetAlphaMask;
+    property RedMask:   QWord read GetRedMask;
+    property GreenMask: QWord read GetGreenMask;
+    property BlueMask:  QWord read GetBlueMask;
+    property AlphaMask: QWord read GetAlphaMask;
 
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); virtual; abstract;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); virtual; abstract;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); virtual; abstract;
 
     function GetSize(const aSize: TglBitmapPixelPosition): Integer; virtual; overload;
     function GetSize(const aWidth, aHeight: Integer): Integer; virtual; overload;
@@ -1102,9 +1191,9 @@ type
 
     function IsEmpty:  Boolean; virtual;
     function HasAlpha: Boolean; virtual;
-    function MaskMatch(const aRedMask, aGreenMask, aBlueMask, aAlphaMask: UInt64): Boolean; virtual;
+    function MaskMatch(const aRedMask, aGreenMask, aBlueMask, aAlphaMask: QWord): Boolean; virtual;
 
-    procedure PreparePixel(var aPixel: TglBitmapPixelData); virtual;
+    procedure PreparePixel(out aPixel: TglBitmapPixelData); virtual;
 
     constructor Create; virtual;
   public
@@ -1121,117 +1210,117 @@ type
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   TfdAlpha_UB1 = class(TFormatDescriptor) //1* unsigned byte
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdLuminance_UB1 = class(TFormatDescriptor) //1* unsigned byte
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdUniversal_UB1 = class(TFormatDescriptor) //1* unsigned byte
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdLuminanceAlpha_UB2 = class(TfdLuminance_UB1) //2* unsigned byte
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdRGB_UB3 = class(TFormatDescriptor) //3* unsigned byte
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdBGR_UB3 = class(TFormatDescriptor) //3* unsigned byte (inverse)
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdRGBA_UB4 = class(TfdRGB_UB3) //4* unsigned byte
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdBGRA_UB4 = class(TfdBGR_UB3) //4* unsigned byte  (inverse)
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   TfdAlpha_US1 = class(TFormatDescriptor) //1* unsigned short
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdLuminance_US1 = class(TFormatDescriptor) //1* unsigned short
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdUniversal_US1 = class(TFormatDescriptor) //1* unsigned short
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdDepth_US1 = class(TFormatDescriptor) //1* unsigned short
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdLuminanceAlpha_US2 = class(TfdLuminance_US1) //2* unsigned short
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdRGB_US3 = class(TFormatDescriptor) //3* unsigned short
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdBGR_US3 = class(TFormatDescriptor) //3* unsigned short (inverse)
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdRGBA_US4 = class(TfdRGB_US3) //4* unsigned short
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdBGRA_US4 = class(TfdBGR_US3) //4* unsigned short (inverse)
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   TfdUniversal_UI1 = class(TFormatDescriptor) //1* unsigned int
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdDepth_UI1 = class(TFormatDescriptor) //1* unsigned int
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
@@ -1422,41 +1511,41 @@ type
 
   TfdS3tcDtx1RGBA = class(TFormatDescriptor)
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdS3tcDtx3RGBA = class(TFormatDescriptor)
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
   TfdS3tcDtx5RGBA = class(TFormatDescriptor)
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     constructor Create; override;
   end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   TbmpBitfieldFormat = class(TFormatDescriptor)
   private
-    procedure SetRedMask  (const aValue: UInt64);
-    procedure SetGreenMask(const aValue: UInt64);
-    procedure SetBlueMask (const aValue: UInt64);
-    procedure SetAlphaMask(const aValue: UInt64);
+    procedure SetRedMask  (const aValue: QWord);
+    procedure SetGreenMask(const aValue: QWord);
+    procedure SetBlueMask (const aValue: QWord);
+    procedure SetAlphaMask(const aValue: QWord);
 
-    procedure Update(aMask: UInt64; out aRange: Cardinal; out aShift: Byte);
+    procedure Update(aMask: QWord; out aRange: Cardinal; out aShift: Byte);
   public
-    property RedMask:   UInt64 read GetRedMask   write SetRedMask;
-    property GreenMask: UInt64 read GetGreenMask write SetGreenMask;
-    property BlueMask:  UInt64 read GetBlueMask  write SetBlueMask;
-    property AlphaMask: UInt64 read GetAlphaMask write SetAlphaMask;
+    property RedMask:   QWord read GetRedMask   write SetRedMask;
+    property GreenMask: QWord read GetGreenMask write SetGreenMask;
+    property BlueMask:  QWord read GetBlueMask  write SetBlueMask;
+    property AlphaMask: QWord read GetAlphaMask write SetAlphaMask;
 
     property PixelSize: Single read fPixelSize write fPixelSize;
 
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
   end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1477,7 +1566,7 @@ type
     procedure CreateColorTable;
 
     procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); override;
-    procedure Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
+    procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); override;
     destructor Destroy; override;
   end;
 
@@ -1609,6 +1698,8 @@ end;
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function FormatGetSupportedFiles(const aFormat: TglBitmapFormat): TglBitmapFileTypes;
 begin
+  result := [];
+
   if (aFormat in [
         //4 bbp
         tfLuminance4,
@@ -1710,7 +1801,7 @@ begin
 end;
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function GetTopMostBit(aBitSet: UInt64): Integer;
+function GetTopMostBit(aBitSet: QWord): Integer;
 begin
   result := 0;
   while aBitSet > 0 do begin
@@ -1720,7 +1811,7 @@ begin
 end;
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function CountSetBits(aBitSet: UInt64): Integer;
+function CountSetBits(aBitSet: QWord): Integer;
 begin
   result := 0;
   while aBitSet > 0 do begin
@@ -1739,6 +1830,7 @@ begin
     LUMINANCE_WEIGHT_B * aPixel.Data.b);
 end;
 
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function DepthWeight(const aPixel: TglBitmapPixelData): Cardinal;
 begin
   result := Trunc(
@@ -1747,11 +1839,135 @@ begin
     DEPTH_WEIGHT_B * aPixel.Data.b);
 end;
 
-//TODO check _ARB functions and constants
+{$IFDEF GLB_NATIVE_OGL}
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//OpenGLInitialization///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+var
+  GL_LibHandle: Pointer = nil;
 
-(* GLB_NO_NATIVE_GL
-{$IFNDEF GLB_NO_NATIVE_GL}
-procedure ReadOpenGLExtensions;
+function glbGetProcAddress(aProcName: PChar; aLibHandle: Pointer = nil): Pointer;
+begin
+  result :=  nil;
+
+  if not Assigned(aLibHandle) then
+    aLibHandle := GL_LibHandle;
+
+{$IF DEFINED(GLB_WIN)}
+  result := GetProcAddress({%H-}HMODULE(aLibHandle), aProcName);
+  if Assigned(result) then
+    exit;
+
+  if Assigned(wglGetProcAddress) then
+    result := wglGetProcAddress(aProcName);
+{$ELSEIF DEFINED(GLB_LINUX)}
+  if Assigned(glXGetProcAddress) then begin
+    result := glXGetProcAddress(aProcName);
+    if Assigned(result) then
+      exit;
+  end;
+
+  if Assigned(glXGetProcAddressARB) then begin
+    result := glXGetProcAddressARB(aProcName);
+    if Assigned(result) then
+      exit;
+  end;
+
+  result := dlsym(aLibHandle, aProcName);
+{$ENDIF}
+  if not Assigned(result) then
+    raise EglBitmapException.Create('unable to load procedure form library: ' + aProcName);
+end;
+
+{$IFDEF GLB_NATIVE_OGL_DYNAMIC}
+var
+  GLU_LibHandle: Pointer = nil;
+  OpenGLInitialized: Boolean;
+  InitOpenGLCS: TCriticalSection;
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glbInitOpenGL;
+
+  ////////////////////////////////////////////////////////////////////////////////
+  function glbLoadLibrary(const aName: PChar): Pointer;
+  begin
+    {$IF DEFINED(GLB_WIN)}
+    result := {%H-}Pointer(LoadLibrary(aName));
+    {$ELSEIF DEFINED(GLB_LINUX)}
+    result := dlopen(Name, RTLD_LAZY);
+    {$ELSE}
+    result := nil;
+    {$ENDIF}
+  end;
+
+  ////////////////////////////////////////////////////////////////////////////////
+  function glbFreeLibrary(const aLibHandle: Pointer): Boolean;
+  begin
+    result := false;
+    if not Assigned(aLibHandle) then
+      exit;
+
+    {$IF DEFINED(GLB_WIN)}
+    Result := FreeLibrary({%H-}HINST(aLibHandle));
+    {$ELSEIF DEFINED(GLB_LINUX)}
+    Result := dlclose(aLibHandle) = 0;
+    {$ENDIF}
+  end;
+
+begin
+  if Assigned(GL_LibHandle) then
+    glbFreeLibrary(GL_LibHandle);
+
+  if Assigned(GLU_LibHandle) then
+    glbFreeLibrary(GLU_LibHandle);
+
+  GL_LibHandle := glbLoadLibrary(libopengl);
+  if not Assigned(GL_LibHandle) then
+    raise EglBitmapException.Create('unable to load library: ' + libopengl);
+
+  GLU_LibHandle := glbLoadLibrary(libglu);
+  if not Assigned(GLU_LibHandle) then
+    raise EglBitmapException.Create('unable to load library: ' + libglu);
+
+  try
+  {$IF DEFINED(GLB_WIN)}
+    wglGetProcAddress    := glbGetProcAddress('wglGetProcAddress');
+  {$ELSEIF DEFINED(GLB_LINUX)}
+    glXGetProcAddress    := glbGetProcAddress('glXGetProcAddress');
+    glXGetProcAddressARB := dglGetProcAddress('glXGetProcAddressARB');
+  {$ENDIF}
+
+    glEnable := glbGetProcAddress('glEnable');
+    glDisable := glbGetProcAddress('glDisable');
+    glGetString := glbGetProcAddress('glGetString');
+    glGetIntegerv := glbGetProcAddress('glGetIntegerv');
+    glTexParameteri := glbGetProcAddress('glTexParameteri');
+    glTexParameterfv := glbGetProcAddress('glTexParameterfv');
+    glGetTexParameteriv := glbGetProcAddress('glGetTexParameteriv');
+    glGetTexParameterfv := glbGetProcAddress('glGetTexParameterfv');
+    glGetTexLevelParameteriv := glbGetProcAddress('glGetTexLevelParameteriv');
+    glGetTexLevelParameterfv := glbGetProcAddress('glGetTexLevelParameterfv');
+    glGenTextures := glbGetProcAddress('glGenTextures');
+    glBindTexture := glbGetProcAddress('glBindTexture');
+    glDeleteTextures := glbGetProcAddress('glDeleteTextures');
+    glAreTexturesResident := glbGetProcAddress('glAreTexturesResident');
+    glReadPixels := glbGetProcAddress('glReadPixels');
+    glPixelStorei := glbGetProcAddress('glPixelStorei');
+    glTexImage1D := glbGetProcAddress('glTexImage1D');
+    glTexImage2D := glbGetProcAddress('glTexImage2D');
+    glGetTexImage := glbGetProcAddress('glGetTexImage');
+
+    gluBuild1DMipmaps := glbGetProcAddress('gluBuild1DMipmaps', GLU_LibHandle);
+    gluBuild2DMipmaps := glbGetProcAddress('gluBuild2DMipmaps', GLU_LibHandle);
+  finally
+    glbFreeLibrary(GL_LibHandle);
+    glbFreeLibrary(GLU_LibHandle);
+  end;
+end;
+{$ENDIF}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glbReadOpenGLExtensions;
 var
   {$IFDEF GLB_DELPHI}
   Context: HGLRC;
@@ -1759,68 +1975,66 @@ var
   Buffer: AnsiString;
   MajorVersion, MinorVersion: Integer;
 
-
-  procedure TrimVersionString(Buffer: AnsiString; var Major, Minor: Integer);
+  ///////////////////////////////////////////////////////////////////////////////////////////
+  procedure TrimVersionString(aBuffer: AnsiString; out aMajor, aMinor: Integer);
   var
     Separator: Integer;
   begin
-    Minor := 0;
-    Major := 0;
-
-    Separator := Pos(AnsiString('.'), Buffer);
+    aMinor := 0;
+    aMajor := 0;
 
-    if (Separator > 1) and (Separator < Length(Buffer)) and
-       (Buffer[Separator - 1] in ['0'..'9']) and
-       (Buffer[Separator + 1] in ['0'..'9']) then begin
+    Separator := Pos(AnsiString('.'), aBuffer);
+    if (Separator > 1) and (Separator < Length(aBuffer)) and
+       (aBuffer[Separator - 1] in ['0'..'9']) and
+       (aBuffer[Separator + 1] in ['0'..'9']) then begin
 
       Dec(Separator);
-      while (Separator > 0) and (Buffer[Separator] in ['0'..'9']) do
+      while (Separator > 0) and (aBuffer[Separator] in ['0'..'9']) do
         Dec(Separator);
 
-      Delete(Buffer, 1, Separator);
-      Separator := Pos(AnsiString('.'), Buffer) + 1;
+      Delete(aBuffer, 1, Separator);
+      Separator := Pos(AnsiString('.'), aBuffer) + 1;
 
-      while (Separator <= Length(Buffer)) and (AnsiChar(Buffer[Separator]) in ['0'..'9']) do
+      while (Separator <= Length(aBuffer)) and (AnsiChar(aBuffer[Separator]) in ['0'..'9']) do
         Inc(Separator);
 
-      Delete(Buffer, Separator, 255);
-      Separator := Pos(AnsiString('.'), Buffer);
+      Delete(aBuffer, Separator, 255);
+      Separator := Pos(AnsiString('.'), aBuffer);
 
-      Major := StrToInt(Copy(String(Buffer), 1, Separator - 1));
-      Minor := StrToInt(Copy(String(Buffer), Separator + 1, 1));
+      aMajor := StrToInt(Copy(String(aBuffer), 1, Separator - 1));
+      aMinor := StrToInt(Copy(String(aBuffer), Separator + 1, 1));
     end;
   end;
 
-
+  ///////////////////////////////////////////////////////////////////////////////////////////
   function CheckExtension(const Extension: AnsiString): Boolean;
   var
     ExtPos: Integer;
   begin
     ExtPos := Pos(Extension, Buffer);
     result := ExtPos > 0;
-
     if result then
       result := ((ExtPos + Length(Extension) - 1) = Length(Buffer)) or not (Buffer[ExtPos + Length(Extension)] in ['_', 'A'..'Z', 'a'..'z']);
   end;
 
-
-  function glLoad (aFunc: pAnsiChar): pointer;
-  begin
-    {$IFDEF LINUX}
-      result := glXGetProcAddress(aFunc);
-    {$else}
-      result := wglGetProcAddress(aFunc);
-    {$ENDIF}
+begin
+{$IFDEF GLB_NATIVE_OGL_DYNAMIC}
+  InitOpenGLCS.Enter;
+  try
+    if not OpenGLInitialized then begin
+      glbInitOpenGL;
+      OpenGLInitialized := true;
+    end;
+  finally
+    InitOpenGLCS.Leave;
   end;
+{$ENDIF}
 
-
-begin
-  {$IFDEF GLB_DELPHI}
+{$IFDEF GLB_DELPHI}
   Context := wglGetCurrentContext;
-
-  if Context <> gLastContext then begin
+  if (Context <> gLastContext) then begin
     gLastContext := Context;
-  {$ENDIF}
+{$ENDIF}
 
     // Version
     Buffer := glGetString(GL_VERSION);
@@ -1830,21 +2044,16 @@ begin
     GL_VERSION_1_3 := false;
     GL_VERSION_1_4 := false;
     GL_VERSION_2_0 := false;
-
     if MajorVersion = 1 then begin
-      if MinorVersion >= 1 then begin
-        if MinorVersion >= 2 then
-          GL_VERSION_1_2 := true;
-
-        if MinorVersion >= 3 then
-          GL_VERSION_1_3 := true;
+      if MinorVersion >= 2 then
+        GL_VERSION_1_2 := true;
 
-        if MinorVersion >= 4 then
-          GL_VERSION_1_4 := true;
-      end;
-    end;
+      if MinorVersion >= 3 then
+        GL_VERSION_1_3 := true;
 
-    if MajorVersion >= 2 then begin
+      if MinorVersion >= 4 then
+        GL_VERSION_1_4 := true;
+    end else if MajorVersion >= 2 then begin
       GL_VERSION_1_2 := true;
       GL_VERSION_1_3 := true;
       GL_VERSION_1_4 := true;
@@ -1854,41 +2063,30 @@ begin
     // Extensions
     Buffer := glGetString(GL_EXTENSIONS);
     GL_ARB_texture_border_clamp       := CheckExtension('GL_ARB_texture_border_clamp');
-    GL_ARB_texture_cube_map           := CheckExtension('GL_ARB_texture_cube_map');
-    GL_ARB_texture_compression        := CheckExtension('GL_ARB_texture_compression');
     GL_ARB_texture_non_power_of_two   := CheckExtension('GL_ARB_texture_non_power_of_two');
     GL_ARB_texture_rectangle          := CheckExtension('GL_ARB_texture_rectangle');
     GL_ARB_texture_mirrored_repeat    := CheckExtension('GL_ARB_texture_mirrored_repeat');
-    GL_EXT_bgra                       := CheckExtension('GL_EXT_bgra');
     GL_EXT_texture_edge_clamp         := CheckExtension('GL_EXT_texture_edge_clamp');
-    GL_EXT_texture_cube_map           := CheckExtension('GL_EXT_texture_cube_map');
-    GL_EXT_texture_compression_s3tc   := CheckExtension('GL_EXT_texture_compression_s3tc');
     GL_EXT_texture_filter_anisotropic := CheckExtension('GL_EXT_texture_filter_anisotropic');
     GL_EXT_texture_rectangle          := CheckExtension('GL_EXT_texture_rectangle');
     GL_NV_texture_rectangle           := CheckExtension('GL_NV_texture_rectangle');
     GL_IBM_texture_mirrored_repeat    := CheckExtension('GL_IBM_texture_mirrored_repeat');
     GL_SGIS_generate_mipmap           := CheckExtension('GL_SGIS_generate_mipmap');
 
-    // Funtions
     if GL_VERSION_1_3 then begin
-      // Loading Core
-      glCompressedTexImage1D := glLoad('glCompressedTexImage1D');
-      glCompressedTexImage2D := glLoad('glCompressedTexImage2D');
-      glGetCompressedTexImage := glLoad('glGetCompressedTexImage');
-    end else
-
-    begin
-      // Try loading Extension
-      glCompressedTexImage1D := glLoad('glCompressedTexImage1DARB');
-      glCompressedTexImage2D := glLoad('glCompressedTexImage2DARB');
-      glGetCompressedTexImage := glLoad('glGetCompressedTexImageARB');
+      glCompressedTexImage1D  := glbGetProcAddress('glCompressedTexImage1D');
+      glCompressedTexImage2D  := glbGetProcAddress('glCompressedTexImage2D');
+      glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImage');
+    end else begin
+      glCompressedTexImage1D  := glbGetProcAddress('glCompressedTexImage1DARB');
+      glCompressedTexImage2D  := glbGetProcAddress('glCompressedTexImage2DARB');
+      glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImageARB');
     end;
-  {$IFDEF GLB_DELPHI}
+{$IFDEF GLB_DELPHI}
   end;
-  {$ENDIF}
+{$ENDIF}
 end;
 {$ENDIF}
-*)
 
 (* TODO GLB_DELPHI
 {$IFDEF GLB_DELPHI}
@@ -1926,8 +2124,10 @@ end;
 {$ENDIF}
 *)
 
-(* TODO GLB_SDL_IMAGE
 {$IFDEF GLB_SDL_IMAGE}
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// SDL Image Helper /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function glBitmapRWseek(context: PSDL_RWops; offset: Integer; whence: Integer): Integer; cdecl;
 begin
   result := TStream(context^.unknown.data1).Seek(offset, whence);
@@ -1962,7 +2162,6 @@ begin
   result^.unknown.data1 := Stream;
 end;
 {$ENDIF}
-*)
 
 (* TODO LoadFuncs
 function LoadTexture(Filename: String; var Texture: Cardinal{$IFDEF GLB_DELPHI}; LoadFromRes : Boolean; Instance: Cardinal{$ENDIF}): Boolean;
@@ -2166,25 +2365,25 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //TglBitmapFormatDescriptor///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TFormatDescriptor.GetRedMask: UInt64;
+function TFormatDescriptor.GetRedMask: QWord;
 begin
   result := fRange.r shl fShift.r;
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TFormatDescriptor.GetGreenMask: UInt64;
+function TFormatDescriptor.GetGreenMask: QWord;
 begin
   result := fRange.g shl fShift.g;
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TFormatDescriptor.GetBlueMask: UInt64;
+function TFormatDescriptor.GetBlueMask: QWord;
 begin
   result := fRange.b shl fShift.b;
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TFormatDescriptor.GetAlphaMask: UInt64;
+function TFormatDescriptor.GetAlphaMask: QWord;
 begin
   result := fRange.a shl fShift.a;
 end;
@@ -2247,7 +2446,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TFormatDescriptor.MaskMatch(const aRedMask, aGreenMask, aBlueMask, aAlphaMask: UInt64): Boolean;
+function TFormatDescriptor.MaskMatch(const aRedMask, aGreenMask, aBlueMask, aAlphaMask: QWord): Boolean;
 begin
   result := false;
 
@@ -2266,9 +2465,9 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TFormatDescriptor.PreparePixel(var aPixel: TglBitmapPixelData);
+procedure TFormatDescriptor.PreparePixel(out aPixel: TglBitmapPixelData);
 begin
-  FillChar(aPixel, SizeOf(aPixel), 0);
+  FillChar(aPixel{%H-}, SizeOf(aPixel), 0);
   aPixel.Data   := fRange;
   aPixel.Range  := fRange;
   aPixel.Format := fFormat;
@@ -2304,7 +2503,7 @@ begin
   inc(aData);
 end;
 
-procedure TfdAlpha_UB1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdAlpha_UB1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.r := 0;
   aPixel.Data.g := 0;
@@ -2331,7 +2530,7 @@ begin
   inc(aData);
 end;
 
-procedure TfdLuminance_UB1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdLuminance_UB1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.r := aData^;
   aPixel.Data.g := aData^;
@@ -2365,7 +2564,7 @@ begin
   inc(aData);
 end;
 
-procedure TfdUniversal_UB1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdUniversal_UB1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 var
   i: Integer;
 begin
@@ -2390,7 +2589,7 @@ begin
   inc(aData);
 end;
 
-procedure TfdLuminanceAlpha_UB2.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdLuminanceAlpha_UB2.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   inherited Unmap(aData, aPixel, aMapData);
   aPixel.Data.a := aData^;
@@ -2420,7 +2619,7 @@ begin
   inc(aData);
 end;
 
-procedure TfdRGB_UB3.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdRGB_UB3.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.r := aData^;
   inc(aData);
@@ -2458,7 +2657,7 @@ begin
   inc(aData);
 end;
 
-procedure TfdBGR_UB3.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdBGR_UB3.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.b := aData^;
   inc(aData);
@@ -2492,7 +2691,7 @@ begin
   inc(aData);
 end;
 
-procedure TfdRGBA_UB4.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdRGBA_UB4.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   inherited Unmap(aData, aPixel, aMapData);
   aPixel.Data.a := aData^;
@@ -2519,7 +2718,7 @@ begin
   inc(aData);
 end;
 
-procedure TfdBGRA_UB4.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdBGRA_UB4.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   inherited Unmap(aData, aPixel, aMapData);
   aPixel.Data.a := aData^;
@@ -2545,7 +2744,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdAlpha_US1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdAlpha_US1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.r := 0;
   aPixel.Data.g := 0;
@@ -2572,7 +2771,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdLuminance_US1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdLuminance_US1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.r := PWord(aData)^;
   aPixel.Data.g := PWord(aData)^;
@@ -2606,7 +2805,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdUniversal_US1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdUniversal_US1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 var
   i: Integer;
 begin
@@ -2630,7 +2829,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdDepth_US1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdDepth_US1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.r := PWord(aData)^;
   aPixel.Data.g := PWord(aData)^;
@@ -2660,7 +2859,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdLuminanceAlpha_US2.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdLuminanceAlpha_US2.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   inherited Unmap(aData, aPixel, aMapData);
   aPixel.Data.a := PWord(aData)^;
@@ -2690,7 +2889,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdRGB_US3.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdRGB_US3.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.r := PWord(aData)^;
   inc(aData, 2);
@@ -2728,7 +2927,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdBGR_US3.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdBGR_US3.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.b := PWord(aData)^;
   inc(aData, 2);
@@ -2763,7 +2962,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdRGBA_US4.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdRGBA_US4.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   inherited Unmap(aData, aPixel, aMapData);
   aPixel.Data.a := PWord(aData)^;
@@ -2790,7 +2989,7 @@ begin
   inc(aData, 2);
 end;
 
-procedure TfdBGRA_US4.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdBGRA_US4.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   inherited Unmap(aData, aPixel, aMapData);
   aPixel.Data.a := PWord(aData)^;
@@ -2821,7 +3020,7 @@ begin
   inc(aData, 4);
 end;
 
-procedure TfdUniversal_UI1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdUniversal_UI1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 var
   i: Integer;
 begin
@@ -2845,7 +3044,7 @@ begin
   inc(aData, 4);
 end;
 
-procedure TfdDepth_UI1.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdDepth_UI1.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   aPixel.Data.r := PCardinal(aData)^;
   aPixel.Data.g := PCardinal(aData)^;
@@ -3457,7 +3656,7 @@ begin
   raise EglBitmapException.Create('mapping for compressed formats is not supported');
 end;
 
-procedure TfdS3tcDtx1RGBA.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdS3tcDtx1RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   raise EglBitmapException.Create('mapping for compressed formats is not supported');
 end;
@@ -3483,7 +3682,7 @@ begin
   raise EglBitmapException.Create('mapping for compressed formats is not supported');
 end;
 
-procedure TfdS3tcDtx3RGBA.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdS3tcDtx3RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   raise EglBitmapException.Create('mapping for compressed formats is not supported');
 end;
@@ -3509,7 +3708,7 @@ begin
   raise EglBitmapException.Create('mapping for compressed formats is not supported');
 end;
 
-procedure TfdS3tcDtx5RGBA.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TfdS3tcDtx5RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
   raise EglBitmapException.Create('mapping for compressed formats is not supported');
 end;
@@ -3581,31 +3780,31 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //TBitfieldFormat/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TbmpBitfieldFormat.SetRedMask(const aValue: UInt64);
+procedure TbmpBitfieldFormat.SetRedMask(const aValue: QWord);
 begin
   Update(aValue, fRange.r, fShift.r);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TbmpBitfieldFormat.SetGreenMask(const aValue: UInt64);
+procedure TbmpBitfieldFormat.SetGreenMask(const aValue: QWord);
 begin
   Update(aValue, fRange.g, fShift.g);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TbmpBitfieldFormat.SetBlueMask(const aValue: UInt64);
+procedure TbmpBitfieldFormat.SetBlueMask(const aValue: QWord);
 begin
   Update(aValue, fRange.b, fShift.b);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TbmpBitfieldFormat.SetAlphaMask(const aValue: UInt64);
+procedure TbmpBitfieldFormat.SetAlphaMask(const aValue: QWord);
 begin
   Update(aValue, fRange.a, fShift.a);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TbmpBitfieldFormat.Update(aMask: UInt64; out aRange: Cardinal; out
+procedure TbmpBitfieldFormat.Update(aMask: QWord; out aRange: Cardinal; out
   aShift: Byte);
 begin
   aShift := 0;
@@ -3629,10 +3828,8 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TbmpBitfieldFormat.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer);
 var
-  data: UInt64;
+  data: QWord;
   s: Integer;
-type
-  PUInt64 = ^UInt64;
 begin
   data :=
     ((aPixel.Data.r and fRange.r) shl fShift.r) or
@@ -3644,7 +3841,7 @@ begin
     1:           aData^  := data;
     2:     PWord(aData)^ := data;
     4: PCardinal(aData)^ := data;
-    8:   PUInt64(aData)^ := data;
+    8:    PQWord(aData)^ := data;
   else
     raise EglBitmapException.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
   end;
@@ -3652,19 +3849,17 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TbmpBitfieldFormat.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
+procedure TbmpBitfieldFormat.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 var
-  data: UInt64;
+  data: QWord;
   s, i: Integer;
-type
-  PUInt64 = ^UInt64;
 begin
   s := Round(fPixelSize);
   case s of
     1: data :=           aData^;
     2: data :=     PWord(aData)^;
     4: data := PCardinal(aData)^;
-    8: data :=   PUInt64(aData)^;
+    8: data :=    PQWord(aData)^;
   else
     raise EglBitmapException.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
   end;
@@ -3678,8 +3873,6 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TbmpColorTableFormat.CreateColorTable;
 var
-  bits: Byte;
-  len: Integer;
   i: Integer;
 begin
   if not (Format in [tfLuminance4, tfLuminance8, tfR3G3B2]) then
@@ -3733,9 +3926,9 @@ begin
       if (aMapData = nil) then
         aData^ := 0;
       d := LuminanceWeight(aPixel) and Range.r;
-      aData^ := aData^ or (d shl (4 - PtrInt(aMapData)));
+      aData^ := aData^ or (d shl (4 - {%H-}PtrUInt(aMapData)));
       inc(aMapData, 4);
-      if (PtrInt(aMapData) >= 8) then begin
+      if ({%H-}PtrUInt(aMapData) >= 8) then begin
         inc(aData);
         aMapData := nil;
       end;
@@ -3756,11 +3949,10 @@ begin
   end;
 end;
 
-procedure TbmpColorTableFormat.Unmap(var aData: PByte; var aPixel: TglBitmapPixelData; var aMapData: Pointer);
-type
-  PUInt64 = ^UInt64;
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TbmpColorTableFormat.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 var
-  idx: UInt64;
+  idx: QWord;
   s: Integer;
   bits: Byte;
   f: Single;
@@ -3769,11 +3961,11 @@ begin
   f    := fPixelSize - s;
   bits := Round(8 * f);
   case s of
-    0: idx :=          (aData^ shr (8 - bits - PtrInt(aMapData))) and ((1 shl bits) - 1);
+    0: idx :=          (aData^ shr (8 - bits - {%H-}PtrUInt(aMapData))) and ((1 shl bits) - 1);
     1: idx :=           aData^;
     2: idx :=     PWord(aData)^;
     4: idx := PCardinal(aData)^;
-    8: idx :=   PUInt64(aData)^;
+    8: idx :=    PQWord(aData)^;
   else
     raise EglBitmapException.CreateFmt('invalid pixel size: %.3f', [fPixelSize]);
   end;
@@ -3786,7 +3978,7 @@ begin
     aPixel.Data.a := a;
   end;
   inc(aMapData, bits);
-  if (PtrInt(aMapData) >= 8) then begin
+  if ({%H-}PtrUInt(aMapData) >= 8) then begin
     inc(aData, 1);
     dec(aMapData, 8);
   end;
@@ -3802,6 +3994,21 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //TglBitmap - Helper//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapConvertPixel(var aPixel: TglBitmapPixelData; const aSourceFD, aDestFD: TFormatDescriptor);
+var
+  i: Integer;
+begin
+  for i := 0 to 3 do begin
+    if (aSourceFD.Range.arr[i] <> aDestFD.Range.arr[i]) then begin
+      if (aSourceFD.Range.arr[i] > 0) then
+        aPixel.Data.arr[i] := Round(aPixel.Data.arr[i] / aSourceFD.Range.arr[i] * aDestFD.Range.arr[i])
+      else
+        aPixel.Data.arr[i] := aDestFD.Range.arr[i];
+    end;
+  end;
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure glBitmapConvertCopyFunc(var aFuncRec: TglBitmapFunctionRec);
 begin
   with aFuncRec do begin
@@ -3851,16 +4058,13 @@ end;
 procedure glBitmapInvertFunc(var aFuncRec: TglBitmapFunctionRec);
 begin
   with aFuncRec do begin
-    Dest.Data.r := Source.Data.r;
-    Dest.Data.g := Source.Data.g;
-    Dest.Data.b := Source.Data.b;
-    Dest.Data.a := Source.Data.a;
-    if (Args and $1 > 0) then begin
+    Dest.Data := Source.Data;
+    if ({%H-}PtrUInt(Args) and $1 > 0) then begin
       Dest.Data.r := Dest.Data.r xor Dest.Range.r;
       Dest.Data.g := Dest.Data.g xor Dest.Range.g;
       Dest.Data.b := Dest.Data.b xor Dest.Range.b;
     end;
-    if (Args and $2 > 0) then begin
+    if ({%H-}PtrUInt(Args) and $2 > 0) then begin
       Dest.Data.a := Dest.Data.a xor Dest.Range.a;
     end;
   end;
@@ -3883,7 +4087,7 @@ var
   Temp: Single;
 begin
   with FuncRec do begin
-    if (FuncRec.Args = 0) then begin //source has no alpha
+    if (FuncRec.Args = nil) then begin //source has no alpha
       Temp :=
         Source.Data.r / Source.Range.r * ALPHA_WEIGHT_R +
         Source.Data.g / Source.Range.g * ALPHA_WEIGHT_G +
@@ -3916,8 +4120,6 @@ end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure glBitmapValueAlphaFunc(var FuncRec: TglBitmapFunctionRec);
-type
-  PglBitmapPixelData = ^TglBitmapPixelData;
 begin
   with FuncRec do begin
     Dest.Data.r := Source.Data.r;
@@ -4018,7 +4220,7 @@ begin
   if fFormat = aValue then
     exit;
   if TFormatDescriptor.Get(Format).PixelSize <> TFormatDescriptor.Get(aValue).PixelSize then
-    raise EglBitmapUnsupportedFormatFormat.Create('SetInternalFormat - ' + UNSUPPORTED_FORMAT);
+    raise EglBitmapUnsupportedFormat.Create('SetFormat');
   SetDataPointer(Data, aValue, Width, Height);
 end;
 
@@ -4085,7 +4287,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TglBitmap.SetupParameters(var aBuildWithGlu: Boolean);
+procedure TglBitmap.SetupParameters(out aBuildWithGlu: Boolean);
 begin
   // Set Up Parameters
   SetWrap(fWrapS, fWrapT, fWrapR);
@@ -4214,7 +4416,7 @@ end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TglBitmap.LoadFromFunc(const aSize: TglBitmapPixelPosition; const aFunc: TglBitmapFunction;
-  const aFormat: TglBitmapFormat; const aArgs: PtrInt);
+  const aFormat: TglBitmapFormat; const aArgs: Pointer);
 var
   tmpData: PByte;
   size: Integer;
@@ -4301,14 +4503,14 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TglBitmap.AddFunc(const aFunc: TglBitmapFunction; const aCreateTemp: Boolean; const aArgs: PtrInt): Boolean;
+function TglBitmap.AddFunc(const aFunc: TglBitmapFunction; const aCreateTemp: Boolean; const aArgs: Pointer): Boolean;
 begin
   result := AddFunc(Self, aFunc, aCreateTemp, Format, aArgs);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function TglBitmap.AddFunc(const aSource: TglBitmap; const aFunc: TglBitmapFunction; aCreateTemp: Boolean;
-  const aFormat: TglBitmapFormat; const aArgs: PtrInt): Boolean;
+  const aFormat: TglBitmapFormat; const aArgs: Pointer): Boolean;
 var
   DestData, TmpData, SourceData: pByte;
   TempHeight, TempWidth: Integer;
@@ -4394,42 +4596,37 @@ var
   Row, RowSize: Integer;
   SourceData, TmpData: PByte;
   TempDepth: Integer;
-  Pix: TglBitmapPixelData;
-  FormatDesc: TglBitmapFormatDescriptor;
+  FormatDesc: TFormatDescriptor;
 
   function GetRowPointer(Row: Integer): pByte;
   begin
-    result := Surface.pixels;
+    result := aSurface.pixels;
     Inc(result, Row * RowSize);
   end;
 
 begin
   result := false;
 
-  (* TODO
-  if not FormatIsUncompressed(InternalFormat) then
-    raise EglBitmapUnsupportedInternalFormat.Create('AssignToSurface - ' + UNSUPPORTED_INTERNAL_FORMAT);
-  *)
+  FormatDesc := TFormatDescriptor.Get(Format);
+  if FormatDesc.IsCompressed then
+    raise EglBitmapUnsupportedFormat.Create('AssignToSurface');
 
-  FormatDesc := FORMAT_DESCRIPTORS[Format];
   if Assigned(Data) then begin
-    case Trunc(FormatDesc.GetSize) of
+    case Trunc(FormatDesc.PixelSize) of
       1: TempDepth :=  8;
       2: TempDepth := 16;
       3: TempDepth := 24;
       4: TempDepth := 32;
     else
-      raise EglBitmapException.Create('AssignToSurface - ' + UNSUPPORTED_INTERNAL_FORMAT);
+      raise EglBitmapUnsupportedFormat.Create('AssignToSurface');
     end;
-    FormatDesc.PreparePixel(Pix);
-    with Pix.PixelDesc do
-      Surface := SDL_CreateRGBSurface(SDL_SWSURFACE, Width, Height, TempDepth,
-        RedRange shl RedShift, GreenRange shl GreenShift, BlueRange shl BlueShift, AlphaRange shl AlphaShift);
 
+    aSurface := SDL_CreateRGBSurface(SDL_SWSURFACE, Width, Height, TempDepth,
+      FormatDesc.RedMask, FormatDesc.GreenMask, FormatDesc.BlueMask, FormatDesc.AlphaMask);
     SourceData := Data;
-    RowSize    := Ceil(FileWidth * FormatDesc.GetSize);
+    RowSize    := FormatDesc.GetSize(FileWidth, 1);
 
-    for Row := 0 to FileHeight -1 do begin
+    for Row := 0 to FileHeight-1 do begin
       TmpData := GetRowPointer(Row);
       if Assigned(TmpData) then begin
         Move(SourceData^, TmpData^, RowSize);
@@ -4445,34 +4642,31 @@ function TglBitmap.AssignFromSurface(const aSurface: PSDL_Surface): Boolean;
 var
   pSource, pData, pTempData: PByte;
   Row, RowSize, TempWidth, TempHeight: Integer;
-  IntFormat, f: TglBitmapInternalFormat;
-  FormatDesc: TglBitmapFormatDescriptor;
+  IntFormat: TglBitmapFormat;
+  FormatDesc: TFormatDescriptor;
 
   function GetRowPointer(Row: Integer): pByte;
   begin
-    result := Surface^.pixels;
+    result := aSurface^.pixels;
     Inc(result, Row * RowSize);
   end;
 
 begin
   result := false;
-  if (Assigned(Surface)) then begin
-    with Surface^.format^ do begin
-      IntFormat := tfEmpty;
-      for f := Low(f) to High(f) do begin
-        if FORMAT_DESCRIPTORS[f].MaskMatch(RMask, GMask, BMask, AMask) then begin
-          IntFormat := f;
+  if (Assigned(aSurface)) then begin
+    with aSurface^.format^ do begin
+      for IntFormat := High(TglBitmapFormat) to Low(TglBitmapFormat) do begin
+        FormatDesc := TFormatDescriptor.Get(IntFormat);
+        if (FormatDesc.MaskMatch(RMask, GMask, BMask, AMask)) then
           break;
-        end;
       end;
       if (IntFormat = tfEmpty) then
         raise EglBitmapException.Create('AssignFromSurface - Invalid Pixelformat.');
     end;
 
-    FormatDesc := FORMAT_DESCRIPTORS[IntFormat];
-    TempWidth  := Surface^.w;
-    TempHeight := Surface^.h;
-    RowSize := Trunc(TempWidth * FormatDesc.GetSize);
+    TempWidth  := aSurface^.w;
+    TempHeight := aSurface^.h;
+    RowSize := FormatDesc.GetSize(TempWidth, 1);
     GetMem(pData, TempHeight * RowSize);
     try
       pTempData := pData;
@@ -4512,9 +4706,9 @@ begin
 
       AlphaInterleave := 0;
       case Format of
-        ifLuminance8Alpha8:
+        tfLuminance8Alpha8:
           AlphaInterleave := 1;
-        ifBGRA8, ifRGBA8:
+        tfBGRA8, tfRGBA8:
           AlphaInterleave := 3;
       end;
 
@@ -4536,14 +4730,14 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TglBitmap.AddAlphaFromSurface(const aSurface: PSDL_Surface; const aFunc: TglBitmapFunction; const aArgs: PtrInt): Boolean;
+function TglBitmap.AddAlphaFromSurface(const aSurface: PSDL_Surface; const aFunc: TglBitmapFunction = nil; const aArgs: Pointer = nil): Boolean;
 var
   bmp: TglBitmap2D;
 begin
   bmp := TglBitmap2D.Create;
   try
-    bmp.AssignFromSurface(Surface);
-    result := AddAlphaFromGlBitmap(bmp, Func, CustomData);
+    bmp.AssignFromSurface(aSurface);
+    result := AddAlphaFromGlBitmap(bmp, aFunc, aArgs);
   finally
     bmp.Free;
   end;
@@ -4756,7 +4950,7 @@ end;
 {$ENDIF}
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TglBitmap.AddAlphaFromFunc(const aFunc: TglBitmapFunction; const aArgs: PtrInt): Boolean;
+function TglBitmap.AddAlphaFromFunc(const aFunc: TglBitmapFunction; const aArgs: Pointer): Boolean;
 begin
   (* TODO
   if not FormatIsUncompressed(InternalFormat) then
@@ -4766,7 +4960,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TglBitmap.AddAlphaFromFile(const aFileName: String; const aFunc: TglBitmapFunction; const aArgs: PtrInt): Boolean;
+function TglBitmap.AddAlphaFromFile(const aFileName: String; const aFunc: TglBitmapFunction; const aArgs: Pointer): Boolean;
 var
   FS: TFileStream;
 begin
@@ -4779,7 +4973,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TglBitmap.AddAlphaFromStream(const aStream: TStream; const aFunc: TglBitmapFunction; const aArgs: PtrInt): Boolean;
+function TglBitmap.AddAlphaFromStream(const aStream: TStream; const aFunc: TglBitmapFunction; const aArgs: Pointer): Boolean;
 var
   tex: TglBitmap2D;
 begin
@@ -4792,7 +4986,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-function TglBitmap.AddAlphaFromGlBitmap(const aBitmap: TglBitmap; aFunc: TglBitmapFunction; const aArgs: PtrInt): Boolean;
+function TglBitmap.AddAlphaFromGlBitmap(const aBitmap: TglBitmap; aFunc: TglBitmapFunction; const aArgs: Pointer): Boolean;
 var
   DestData, DestData2, SourceData: pByte;
   TempHeight, TempWidth: Integer;
@@ -4809,21 +5003,23 @@ begin
 
   if ((aBitmap.Width = Width) and (aBitmap.Height = Height)) then begin
     result := ConvertTo(TFormatDescriptor.Get(Format).WithAlpha);
-    if not Assigned(aFunc) then
-      aFunc := glBitmapAlphaFunc;
 
     SourceFD := TFormatDescriptor.Get(aBitmap.Format);
     DestFD   := TFormatDescriptor.Get(Format);
 
+    if not Assigned(aFunc) then begin
+      aFunc        := glBitmapAlphaFunc;
+      FuncRec.Args := {%H-}Pointer(SourceFD.HasAlpha);
+    end else
+      FuncRec.Args := aArgs;
+
     // Values
     TempHeight := aBitmap.FileHeight;
     TempWidth  := aBitmap.FileWidth;
 
     FuncRec.Sender          := Self;
-    FuncRec.Args            := aArgs;
     FuncRec.Size            := Dimension;
     FuncRec.Position.Fields := FuncRec.Size.Fields;
-    FuncRec.Args            := PtrInt(SourceFD.HasAlpha) and 1;
 
     DestData   := Data;
     DestData2  := Data;
@@ -4898,7 +5094,7 @@ begin
     Data.a  := 0;
     Range.a := 0;
   end;
-  result := AddAlphaFromFunc(glBitmapColorKeyAlphaFunc, PtrInt(@PixelData));
+  result := AddAlphaFromFunc(glBitmapColorKeyAlphaFunc, @PixelData);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4924,7 +5120,7 @@ begin
   TFormatDescriptor.GetWithAlpha(Format).PreparePixel(PixelData);
   with PixelData do
     Data.a := Min(Range.a, Max(0, Round(Range.a * aAlpha)));
-  result := AddAlphaFromFunc(glBitmapValueAlphaFunc, PtrInt(@PixelData.Data.a));
+  result := AddAlphaFromFunc(glBitmapValueAlphaFunc, @PixelData.Data.a);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4935,8 +5131,8 @@ begin
   result := false;
   FormatDesc := TFormatDescriptor.Get(Format);
   if Assigned(Data) then begin
-    if not ({FormatDesc.IsUncompressed or }FormatDesc.HasAlpha) then
-      raise EglBitmapUnsupportedFormatFormat.Create('RemoveAlpha - ' + UNSUPPORTED_FORMAT);
+    if FormatDesc.IsCompressed or not FormatDesc.HasAlpha then
+      raise EglBitmapUnsupportedFormat.Create('RemoveAlpha');
     result := ConvertTo(FormatDesc.WithoutAlpha);
   end;
 end;
@@ -5040,7 +5236,7 @@ begin
       ShiftData.g := GetShift(SourcePD.Range.g, DestPD.Range.g);
       ShiftData.b := GetShift(SourcePD.Range.b, DestPD.Range.b);
       ShiftData.a := GetShift(SourcePD.Range.a, DestPD.Range.a);
-      result := AddFunc(Self, glBitmapConvertShiftRGBAFunc, false, aFormat, PtrInt(@ShiftData));
+      result := AddFunc(Self, glBitmapConvertShiftRGBAFunc, false, aFormat, @ShiftData);
     end else
       result := AddFunc(Self, glBitmapConvertCalculateRGBAFunc, false, aFormat);
   end else
@@ -5051,7 +5247,9 @@ end;
 procedure TglBitmap.Invert(const aUseRGB: Boolean; const aUseAlpha: Boolean);
 begin
   if aUseRGB or aUseAlpha then
-    AddFunc(glBitmapInvertFunc, false, ((PtrInt(aUseAlpha) and 1) shl 1) or (PtrInt(aUseRGB) and 1));
+    AddFunc(glBitmapInvertFunc, false, {%H-}Pointer(
+      ((PtrInt(aUseAlpha) and 1) shl 1) or
+       (PtrInt(aUseRGB)   and 1)      ));
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -5105,7 +5303,7 @@ begin
     Data.b := Max(0, Min(Range.b, Trunc(Range.b * aBlue)));
     Data.a := Max(0, Min(Range.a, Trunc(Range.a * aAlpha)));
   end;
-  AddFunc(glBitmapFillWithColorFunc, false, PtrInt(@PixelData));
+  AddFunc(glBitmapFillWithColorFunc, false, @PixelData);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -5209,24 +5407,6 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TglBitmap.GetPixel(const aPos: TglBitmapPixelPosition; var aPixel: TglBitmapPixelData);
-begin
-  { TODO delete?
-  if Assigned (fGetPixelFunc) then
-    fGetPixelFunc(aPos, aPixel);
-    }
-end;
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TglBitmap.SetPixel(const aPos: TglBitmapPixelPosition; const aPixel: TglBitmapPixelData);
-begin
-  {TODO delete?
-  if Assigned (fSetPixelFunc) then
-    fSetPixelFuc(aPos, aPixel);
-    }
-end;
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TglBitmap.Bind(const aEnableTextureUnit: Boolean);
 begin
   if aEnableTextureUnit then
@@ -5246,8 +5426,8 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 constructor TglBitmap.Create;
 begin
-{$IFNDEF GLB_NO_NATIVE_GL}
-  ReadOpenGLExtensions;
+{$IFDEF GLB_NATIVE_OGL}
+  glbReadOpenGLExtensions;
 {$ENDIF}
   if (ClassType = TglBitmap) then
     raise EglBitmapException.Create('Don''t create TglBitmap directly. Use one of the deviated classes (TglBitmap2D) instead.');
@@ -5275,7 +5455,7 @@ var
   ImageSize: Integer;
 begin
   Create;
-  TFormatDescriptor.Get(aFormat).GetSize(aSize);
+  ImageSize := TFormatDescriptor.Get(aFormat).GetSize(aSize);
   GetMem(Image, ImageSize);
   try
     FillChar(Image^, ImageSize, #$FF);
@@ -5288,7 +5468,7 @@ end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 constructor TglBitmap.Create(const aSize: TglBitmapPixelPosition; const aFormat: TglBitmapFormat;
-  const aFunc: TglBitmapFunction; const aArgs: PtrInt);
+  const aFunc: TglBitmapFunction; const aArgs: Pointer);
 begin
   Create;
   LoadFromFunc(aSize, aFunc, aFormat, aArgs);
@@ -5327,7 +5507,7 @@ begin
       Surface := IMG_LoadPNG_RW(RWops);
       try
         AssignFromSurface(Surface);
-        Rresult := true;
+        result := true;
       finally
         SDL_FreeSurface(Surface);
       end;
@@ -5728,40 +5908,6 @@ type
   end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-{
-procedure glBitmap_libJPEG_error_exit(cinfo: j_common_ptr); cdecl;
-var
-  Msg: String;
-begin
-  SetLength(Msg, 256);
-  cinfo^.err^.format_message(cinfo, pChar(Msg));
-  Writeln('ERROR [' + IntToStr(cinfo^.err^.msg_code) + '] ' + Msg);
-  cinfo^.global_state := 0;
-  jpeg_abort(cinfo);
-end;
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-{
-procedure glBitmap_libJPEG_output_message(cinfo: j_common_ptr); cdecl;
-var
-  Msg: String;
-begin
-  SetLength(Msg, 256);
-  cinfo^.err^.format_message(cinfo, pChar(Msg));
-  Writeln('OUTPUT [' + IntToStr(cinfo^.err^.msg_code) + '] ' + Msg);
-  cinfo^.global_state := 0;
-end;
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-{
-procedure glBitmap_libJPEG_init_source(cinfo: j_decompress_ptr); cdecl;
-begin
-end;
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function glBitmap_libJPEG_fill_input_buffer(cinfo: j_decompress_ptr): boolean; cdecl;
 var
   src: glBitmap_libJPEG_source_mgr_ptr;
@@ -5803,20 +5949,6 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-{
-procedure glBitmap_libJPEG_term_source(cinfo: j_decompress_ptr); cdecl;
-begin
-end;
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-{
-procedure glBitmap_libJPEG_init_destination(cinfo: j_compress_ptr); cdecl;
-begin
-end;
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function glBitmap_libJPEG_empty_output_buffer(cinfo: j_compress_ptr): boolean; cdecl;
 var
   dest: glBitmap_libJPEG_dest_mgr_ptr;
@@ -5867,7 +5999,7 @@ var
 begin
   result := false;
 
-  RWops := glBitmapCreateRWops(Stream);
+  RWops := glBitmapCreateRWops(aStream);
   try
     if IMG_isJPG(RWops) > 0 then begin
       Surface := IMG_LoadJPG_RW(RWops);
@@ -6205,11 +6337,11 @@ type
 function TglBitmap.LoadBMP(const aStream: TStream): Boolean;
 
   //////////////////////////////////////////////////////////////////////////////////////////////////
-  function ReadInfo(var aInfo: TBMPInfo; var aMask: TglBitmapColorRec): TglBitmapFormat;
+  function ReadInfo(out aInfo: TBMPInfo; out aMask: TglBitmapColorRec): TglBitmapFormat;
   begin
     result := tfEmpty;
-    aStream.Read(aInfo, SizeOf(aInfo));
-    FillChar(aMask, SizeOf(aMask), 0);
+    aStream.Read(aInfo{%H-}, SizeOf(aInfo));
+    FillChar(aMask{%H-}, SizeOf(aMask), 0);
 
     //Read Compression
     case aInfo.biCompression of
@@ -6301,7 +6433,6 @@ var
   LineBuf, ImageData, TmpData: PByte;
   SourceMD, DestMD: Pointer;
   BmpFormat: TglBitmapFormat;
-  ColorTable: TbmpColorTable;
 
   //records
   Mask: TglBitmapColorRec;
@@ -6315,23 +6446,14 @@ var
   //////////////////////////////////////////////////////////////////////////////////////////////////
   procedure SpecialFormatReadLine(aData: PByte; aLineBuf: PByte);
   var
-    i, j: Integer;
+    i: Integer;
     Pixel: TglBitmapPixelData;
   begin
     aStream.Read(aLineBuf^, rbLineSize);
     SpecialFormat.PreparePixel(Pixel);
     for i := 0 to Info.biWidth-1 do begin
       SpecialFormat.Unmap(aLineBuf, Pixel, SourceMD);
-      with FormatDesc do begin
-        //TODO: use convert function
-        for j := 0 to 3 do
-          if (SpecialFormat.Range.arr[j] <> Range.arr[j]) then begin
-            if (SpecialFormat.Range.arr[j] > 0) then
-              Pixel.Data.arr[j] := Round(Pixel.Data.arr[j] / SpecialFormat.Range.arr[j] * Range.arr[j])
-            else
-              Pixel.Data.arr[j] := 0;
-          end;
-      end;
+      glBitmapConvertPixel(Pixel, SpecialFormat, FormatDesc);
       FormatDesc.Map(Pixel, aData, DestMD);
     end;
   end;
@@ -6346,7 +6468,7 @@ begin
 
   // Header
   StartPos := aStream.Position;
-  aStream.Read(Header, SizeOf(Header));
+  aStream.Read(Header{%H-}, SizeOf(Header));
 
   if Header.bfType = BMP_MAGIC then begin
     try try
@@ -6386,7 +6508,7 @@ begin
               dec(TmpData, wbLineSize)
             else
               inc(TmpData, wbLineSize);
-            aStream.Read(PaddingBuff, Padding);
+            aStream.Read(PaddingBuff{%H-}, Padding);
           end;
           SetDataPointer(ImageData, BmpFormat, Info.biWidth, abs(Info.biHeight));
           result := true;
@@ -6425,8 +6547,7 @@ var
   pData, srcData, dstData, ConvertBuffer: pByte;
 
   Pixel: TglBitmapPixelData;
-  PixelFormat: TglBitmapPixelData;
-  ImageSize, wbLineSize, rbLineSize, Padding, LineIdx, PixelIdx, i: Integer;
+  ImageSize, wbLineSize, rbLineSize, Padding, LineIdx, PixelIdx: Integer;
   RedMask, GreenMask, BlueMask, AlphaMask: Cardinal;
 
   PaddingBuff: Cardinal;
@@ -6438,20 +6559,20 @@ var
 
 begin
   if not (ftBMP in FormatGetSupportedFiles(Format)) then
-    raise EglBitmapUnsupportedFormatFormat.Create('SaveBMP - ' + UNSUPPORTED_FORMAT);
+    raise EglBitmapUnsupportedFormat.Create('SaveBMP');
 
   Converter  := nil;
   FormatDesc := TFormatDescriptor.Get(Format);
   ImageSize  := FormatDesc.GetSize(Dimension);
 
-  FillChar(Header, SizeOf(Header), 0);
+  FillChar(Header{%H-}, SizeOf(Header), 0);
   Header.bfType      := BMP_MAGIC;
   Header.bfSize      := SizeOf(Header) + SizeOf(Info) + ImageSize;
   Header.bfReserved1 := 0;
   Header.bfReserved2 := 0;
   Header.bfOffBits   := SizeOf(Header) + SizeOf(Info);
 
-  FillChar(Info, SizeOf(Info), 0);
+  FillChar(Info{%H-}, SizeOf(Info), 0);
   Info.biSize        := SizeOf(Info);
   Info.biWidth       := Width;
   Info.biHeight      := Height;
@@ -6503,7 +6624,7 @@ begin
         Info.biCompression := BMP_COMP_BITFIELDS;
       end;
     else
-      raise EglBitmapUnsupportedFormatFormat.Create('SaveBMP - ' + UNSUPPORTED_FORMAT);
+      raise EglBitmapUnsupportedFormat.Create('SaveBMP - ' + UNSUPPORTED_FORMAT);
     end;
     Info.biXPelsPerMeter := 2835;
     Info.biYPelsPerMeter := 2835;
@@ -6563,16 +6684,7 @@ begin
           dstData := ConvertBuffer;
           for PixelIdx := 0 to Info.biWidth-1 do begin
             FormatDesc.Unmap(srcData, Pixel, SourceFD);
-            with FormatDesc do begin
-              //TODO use convert function
-              for i := 0 to 3 do
-                if (Converter.Range.arr[i] <> Range.arr[i]) then begin
-                  if (Range.arr[i] > 0) then
-                    Pixel.Data.arr[i] := Round(Pixel.Data.arr[i] / Range.arr[i] * Converter.Range.arr[i])
-                  else
-                    Pixel.Data.arr[i] := 0;
-                end;
-            end;
+            glBitmapConvertPixel(Pixel, FormatDesc, Converter);
             Converter.Map(Pixel, dstData, DestFD);
           end;
           aStream.Write(ConvertBuffer^, wbLineSize);
@@ -6618,21 +6730,18 @@ type
   end;
 
 const
-  TGA_UNCOMPRESSED_COLOR_TABLE =  1;
-  TGA_UNCOMPRESSED_RGB         =  2;
-  TGA_UNCOMPRESSED_GRAY        =  3;
-  TGA_COMPRESSED_COLOR_TABLE   =  9;
-  TGA_COMPRESSED_RGB           = 10;
-  TGA_COMPRESSED_GRAY          = 11;
+  TGA_UNCOMPRESSED_RGB  =  2;
+  TGA_UNCOMPRESSED_GRAY =  3;
+  TGA_COMPRESSED_RGB    = 10;
+  TGA_COMPRESSED_GRAY   = 11;
 
-  TGA_NONE_COLOR_TABLE = 0;
-  TGA_COLOR_TABLE      = 1;
+  TGA_NONE_COLOR_TABLE  = 0;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function TglBitmap.LoadTGA(const aStream: TStream): Boolean;
 var
   Header: TTGAHeader;
-  ImageData: PByte;
+  ImageData: System.PByte;
   StartPosition: Int64;
   PixelSize, LineSize: Integer;
   tgaFormat: TglBitmapFormat;
@@ -6650,7 +6759,7 @@ const
   procedure ReadUncompressed;
   var
     i, j: Integer;
-    buf, tmp1, tmp2: PByte;
+    buf, tmp1, tmp2: System.PByte;
   begin
     buf := nil;
     if (Counter.X.dir < 0) then
@@ -6684,7 +6793,7 @@ const
 
     /////////////////////////////////////////////////////////////////
     var
-      TmpData: PByte;
+      TmpData: System.PByte;
       LinePixelsRead: Integer;
     procedure CheckLine;
     begin
@@ -6710,7 +6819,7 @@ const
         BytesRead := 0;
         if (CacheSize - CachePos > 0) then begin
           BytesRead := CacheSize - CachePos;
-          Move(PByteArray(Cache)^[CachePos], Buffer, BytesRead);
+          Move(PByteArray(Cache)^[CachePos], Buffer{%H-}, BytesRead);
           inc(CachePos, BytesRead);
         end;
 
@@ -6812,7 +6921,7 @@ begin
 
   // reading header to test file and set cursor back to begin
   StartPosition := aStream.Position;
-  aStream.Read(Header, SizeOf(Header));
+  aStream.Read(Header{%H-}, SizeOf(Header));
 
   // no colormapped files
   if (Header.ColorMapType = TGA_NONE_COLOR_TABLE) and (Header.ImageType in [
@@ -6911,10 +7020,10 @@ var
   Converter: TFormatDescriptor;
 begin
   if not (ftTGA in FormatGetSupportedFiles(Format)) then
-    raise EglBitmapUnsupportedFormatFormat.Create('SaveTGA - ' + UNSUPPORTED_FORMAT);
+    raise EglBitmapUnsupportedFormat.Create('SaveTGA');
 
   //prepare header
-  FillChar(Header, SizeOf(Header), 0);
+  FillChar(Header{%H-}, SizeOf(Header), 0);
 
   //set ImageType
   if (Format in [tfLuminance8, tfLuminance6Alpha2, tfLuminance4Alpha4, tfAlpha8,
@@ -6998,34 +7107,20 @@ const
   DDSD_CAPS                   = $00000001;
   DDSD_HEIGHT                 = $00000002;
   DDSD_WIDTH                  = $00000004;
-  DDSD_PITCH                  = $00000008;
   DDSD_PIXELFORMAT            = $00001000;
-  DDSD_MIPMAPCOUNT            = $00020000;
-  DDSD_LINEARSIZE             = $00080000;
-  DDSD_DEPTH                  = $00800000;
 
   // DDS_header.sPixelFormat.dwFlags
   DDPF_ALPHAPIXELS            = $00000001;
   DDPF_ALPHA                  = $00000002;
   DDPF_FOURCC                 = $00000004;
-  DDPF_INDEXED                = $00000020;
   DDPF_RGB                    = $00000040;
   DDPF_LUMINANCE              = $00020000;
 
   // DDS_header.sCaps.dwCaps1
-  DDSCAPS_COMPLEX             = $00000008;
   DDSCAPS_TEXTURE             = $00001000;
-  DDSCAPS_MIPMAP              = $00400000;
 
   // DDS_header.sCaps.dwCaps2
   DDSCAPS2_CUBEMAP            = $00000200;
-  DDSCAPS2_CUBEMAP_POSITIVEX  = $00000400;
-  DDSCAPS2_CUBEMAP_NEGATIVEX  = $00000800;
-  DDSCAPS2_CUBEMAP_POSITIVEY  = $00001000;
-  DDSCAPS2_CUBEMAP_NEGATIVEY  = $00002000;
-  DDSCAPS2_CUBEMAP_POSITIVEZ  = $00004000;
-  DDSCAPS2_CUBEMAP_NEGATIVEZ  = $00008000;
-  DDSCAPS2_VOLUME             = $00200000;
 
   D3DFMT_DXT1                 = $31545844;
   D3DFMT_DXT3                 = $33545844;
@@ -7137,8 +7232,8 @@ var
 
 var
   StreamPos: Int64;
-  x, y, j, LineSize, RowSize, Magic: Cardinal;
-  NewImage, TmpData, RowData, SrcData: PByte;
+  x, y, LineSize, RowSize, Magic: Cardinal;
+  NewImage, TmpData, RowData, SrcData: System.PByte;
   SourceMD, DestMD: Pointer;
   Pixel: TglBitmapPixelData;
   ddsFormat: TglBitmapFormat;
@@ -7150,14 +7245,14 @@ begin
   StreamPos := aStream.Position;
 
   // Magic
-  aStream.Read(Magic, sizeof(Magic));
+  aStream.Read(Magic{%H-}, sizeof(Magic));
   if (Magic <> DDS_MAGIC) then begin
     aStream.Position := StreamPos;
     exit;
   end;
 
   //Header
-  aStream.Read(Header, sizeof(Header));
+  aStream.Read(Header{%H-}, sizeof(Header));
   if (Header.dwSize <> SizeOf(Header)) or
      ((Header.dwFlags and (DDSD_PIXELFORMAT or DDSD_CAPS or DDSD_WIDTH or DDSD_HEIGHT)) <>
         (DDSD_PIXELFORMAT or DDSD_CAPS or DDSD_WIDTH or DDSD_HEIGHT)) then
@@ -7193,14 +7288,7 @@ begin
             aStream.Read(SrcData^, RowSize);
             for x := 0 to Header.dwWidth-1 do begin
               Converter.Unmap(SrcData, Pixel, SourceMD);
-              //TODO use converter function
-              for j := 0 to 3 do
-                if (Converter.Range.arr[j] <> FormatDesc.Range.arr[j]) then begin
-                  if (Converter.Range.arr[j] > 0) then
-                    Pixel.Data.arr[j] := Round(Pixel.Data.arr[j] / Converter.Range.arr[j] * FormatDesc.Range.arr[j])
-                  else
-                    Pixel.Data.arr[j] := 0;
-                end;
+              glBitmapConvertPixel(Pixel, Converter, FormatDesc);
               FormatDesc.Map(Pixel, TmpData, DestMD);
             end;
           end;
@@ -7248,12 +7336,12 @@ var
   FormatDesc: TFormatDescriptor;
 begin
   if not (ftDDS in FormatGetSupportedFiles(Format)) then
-    raise EglBitmapUnsupportedFormatFormat.Create('SaveDDS - ' + UNSUPPORTED_FORMAT);
+    raise EglBitmapUnsupportedFormat.Create('SaveDDS');
 
   FormatDesc := TFormatDescriptor.Get(Format);
 
   // Generell
-  FillChar(Header, SizeOf(Header), 0);
+  FillChar(Header{%H-}, SizeOf(Header), 0);
   Header.dwSize  := SizeOf(Header);
   Header.dwFlags := DDSD_WIDTH or DDSD_HEIGHT or DDSD_CAPS or DDSD_PIXELFORMAT;
 
@@ -7391,7 +7479,7 @@ var
 begin
   FormatDesc := TFormatDescriptor.Get(Format);
   if FormatDesc.IsCompressed then
-    raise EglBitmapUnsupportedFormatFormat.Create('TglBitmap2D.GrabScreen - ' + UNSUPPORTED_FORMAT);
+    raise EglBitmapUnsupportedFormat.Create('TglBitmap2D.GrabScreen');
 
   w    := aRight  - aLeft;
   h    := aBottom - aTop;
@@ -7413,7 +7501,7 @@ procedure TglBitmap2D.GetDataFromTexture;
 var
   Temp: PByte;
   TempWidth, TempHeight: Integer;
-  TempType, TempIntFormat: Cardinal;
+  TempIntFormat: Cardinal;
   IntFormat, f: TglBitmapFormat;
   FormatDesc: TFormatDescriptor;
 begin
@@ -7425,11 +7513,13 @@ begin
   glGetTexLevelParameteriv(Target, 0, GL_TEXTURE_INTERNAL_FORMAT, @TempIntFormat);
 
   IntFormat := tfEmpty;
-  for f := Low(TglBitmapFormat) to High(TglBitmapFormat) do
-    if (TFormatDescriptor.Get(f).glInternalFormat = TempIntFormat) then begin
+  for f := Low(TglBitmapFormat) to High(TglBitmapFormat) do begin
+    FormatDesc := TFormatDescriptor.Get(f);
+    if (FormatDesc.glInternalFormat = TempIntFormat) then begin
       IntFormat := FormatDesc.Format;
       break;
     end;
+  end;
 
   // Getting data from OpenGL
   FormatDesc := TFormatDescriptor.Get(IntFormat);
@@ -7461,7 +7551,7 @@ begin
         raise EglBitmapSizeToLargeException.Create('TglBitmap2D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');
 
       PotTex := IsPowerOfTwo(Height) and IsPowerOfTwo(Width);
-      TexRec := (GL_ARB_texture_rectangle or GL_EXT_texture_rectangle or GL_NV_texture_rectangle) and (Target = GL_TEXTURE_RECTANGLE_ARB);
+      TexRec := (GL_ARB_texture_rectangle or GL_EXT_texture_rectangle or GL_NV_texture_rectangle) and (Target = GL_TEXTURE_RECTANGLE);
 
       if not (PotTex or GL_ARB_texture_non_power_of_two or GL_VERSION_2_0 or TexRec) then
         raise EglBitmapNonPowerOfTwoException.Create('TglBitmap2D.GenTexture - Rendercontex dosn''t support non power of two texture.');
@@ -7749,10 +7839,10 @@ begin
 
     // Daten Sammeln
     if aUseAlpha and TFormatDescriptor.Get(Format).HasAlpha then
-      AddFunc(glBitmapToNormalMapPrepareAlphaFunc, false, PtrInt(@Rec))
+      AddFunc(glBitmapToNormalMapPrepareAlphaFunc, false, @Rec)
     else
-      AddFunc(glBitmapToNormalMapPrepareFunc, false, PtrInt(@Rec));
-    AddFunc(glBitmapToNormalMapFunc, false, PtrInt(@Rec));
+      AddFunc(glBitmapToNormalMapPrepareFunc, false, @Rec);
+    AddFunc(glBitmapToNormalMapFunc, false, @Rec);
   finally
     SetLength(Rec.Heights, 0);
   end;
@@ -8132,8 +8222,17 @@ initialization
 
   TFormatDescriptor.Init;
 
+{$IFDEF GLB_NATIVE_OGL_DYNAMIC}
+  OpenGLInitialized := false;
+  InitOpenGLCS := TCriticalSection.Create;
+{$ENDIF}
+
 finalization
   TFormatDescriptor.Finalize;
 
+{$IFDEF GLB_NATIVE_OGL_DYNAMIC}
+  FreeAndNil(InitOpenGLCS);
+{$ENDIF}
+
 end.