* added Swizzle Support
[glBitmap.git] / glBitmap.pas
index 38ddefd..675d5f9 100644 (file)
@@ -4,7 +4,6 @@ http://www.opengl24.de/index.php?cat=header&file=glbitmap
 
 modified by Delphi OpenGL Community (http://delphigl.com/)
 
-
 ------------------------------------------------------------
 The contents of this file are used with permission, subject to
 the Mozilla Public License Version 1.1 (the "License"); you may
@@ -241,7 +240,8 @@ unit glBitmap;
 {.$DEFINE GLB_DELPHI}
 
 // activate to enable the support for TLazIntfImage from Lazarus
-{.$DEFINE GLB_LAZARUS}
+{$DEFINE GLB_LAZARUS}
+
 
 
 // activate to enable the support of SDL_image to load files. (READ ONLY)
@@ -375,21 +375,19 @@ unit glBitmap;
 interface
 
 uses
-  {$IFNDEF GLB_NATIVE_OGL}      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_LAZARUS}          IntfGraphics, GraphType,       {$ENDIF}
-  {$IFDEF GLB_DELPHI}           Dialogs, Graphics,  {$ENDIF}
+       DEFINED(GLB_NATIVE_OGL)} windows,                  {$IFEND}
 
-  {$IFDEF GLB_SDL_IMAGE}        SDL_image,          {$ENDIF}
+  {$IFDEF GLB_SDL}              SDL,                      {$ENDIF}
+  {$IFDEF GLB_LAZARUS}          IntfGraphics, GraphType,  {$ENDIF}
+  {$IFDEF GLB_DELPHI}           Dialogs, Graphics,        {$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_SDL_IMAGE}        SDL_image,                {$ENDIF}
+  {$IFDEF GLB_PNGIMAGE}         pngimage,                 {$ENDIF}
+  {$IFDEF GLB_LIB_PNG}          libPNG,                   {$ENDIF}
+  {$IFDEF GLB_DELPHI_JPEG}      JPEG,                     {$ENDIF}
+  {$IFDEF GLB_LIB_JPEG}         libJPEG,                  {$ENDIF}
 
   Classes, SysUtils;
 
@@ -398,6 +396,9 @@ const
   GL_TRUE   = 1;
   GL_FALSE  = 0;
 
+  GL_ZERO = 0;
+  GL_ONE  = 1;
+
   GL_VERSION    = $1F02;
   GL_EXTENSIONS = $1F03;
 
@@ -405,9 +406,34 @@ const
   GL_TEXTURE_2D         = $0DE1;
   GL_TEXTURE_RECTANGLE  = $84F5;
 
+  GL_NORMAL_MAP                   = $8511;
+  GL_TEXTURE_CUBE_MAP             = $8513;
+  GL_REFLECTION_MAP               = $8512;
+  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_WIDTH            = $1000;
   GL_TEXTURE_HEIGHT           = $1001;
   GL_TEXTURE_INTERNAL_FORMAT  = $1003;
+  GL_TEXTURE_SWIZZLE_RGBA     = $8E46;
+
+  GL_S = $2000;
+  GL_T = $2001;
+  GL_R = $2002;
+  GL_Q = $2003;
+
+  GL_TEXTURE_GEN_S = $0C60;
+  GL_TEXTURE_GEN_T = $0C61;
+  GL_TEXTURE_GEN_R = $0C62;
+  GL_TEXTURE_GEN_Q = $0C63;
+
+  GL_RED    = $1903;
+  GL_GREEN  = $1904;
+  GL_BLUE   = $1905;
 
   GL_ALPHA    = $1906;
   GL_ALPHA4   = $803B;
@@ -509,6 +535,8 @@ const
 
   GL_TEXTURE_MAX_ANISOTROPY_EXT     = $84FE;
   GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF;
+  GL_MAX_CUBE_MAP_TEXTURE_SIZE      = $851C;
+  GL_TEXTURE_GEN_MODE               = $2500;
 
 {$IF DEFINED(GLB_WIN)}
   libglu    = 'glu32.dll';
@@ -551,12 +579,14 @@ type
   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}
+  TglTexParameteriv         = procedure(target: GLenum; pname: GLenum; const params: PGLint); {$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}
 
+  TglTexGeni        = procedure(coord: GLenum; pname: GLenum; param: GLint); {$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}
@@ -580,12 +610,14 @@ type
   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 glTexParameteriv(target: GLenum; pname: GLenum; const params: PGLint); {$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 glTexGeni(coord: GLenum; pname: GLenum; param: GLint); {$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;
@@ -607,6 +639,7 @@ var
   GL_VERSION_1_3,
   GL_VERSION_1_4,
   GL_VERSION_2_0,
+  GL_VERSION_3_3,
 
   GL_SGIS_generate_mipmap,
 
@@ -614,6 +647,8 @@ var
   GL_ARB_texture_mirrored_repeat,
   GL_ARB_texture_rectangle,
   GL_ARB_texture_non_power_of_two,
+  GL_ARB_texture_swizzle,
+  GL_ARB_texture_cube_map,
 
   GL_IBM_texture_mirrored_repeat,
 
@@ -621,6 +656,8 @@ var
 
   GL_EXT_texture_edge_clamp,
   GL_EXT_texture_rectangle,
+  GL_EXT_texture_swizzle,
+  GL_EXT_texture_cube_map,
   GL_EXT_texture_filter_anisotropic: Boolean;
 
   glCompressedTexImage1D: TglCompressedTexImage1D;
@@ -642,12 +679,14 @@ var
   glGetIntegerv: TglGetIntegerv;
 
   glTexParameteri: TglTexParameteri;
+  glTexParameteriv: TglTexParameteriv;
   glTexParameterfv: TglTexParameterfv;
   glGetTexParameteriv: TglGetTexParameteriv;
   glGetTexParameterfv: TglGetTexParameterfv;
   glGetTexLevelParameteriv: TglGetTexLevelParameteriv;
   glGetTexLevelParameterfv: TglGetTexLevelParameterfv;
 
+  glTexGeni: TglTexGeni;
   glGenTextures: TglGenTextures;
   glBindTexture: TglBindTexture;
   glDeleteTextures: TglDeleteTextures;
@@ -749,10 +788,11 @@ type
      nm5x5);
 
  ////////////////////////////////////////////////////////////////////////////////////////////////////
-   EglBitmapException               = class(Exception);
-   EglBitmapSizeToLargeException    = class(EglBitmapException);
-   EglBitmapNonPowerOfTwoException  = class(EglBitmapException);
-   EglBitmapUnsupportedFormat       = class(EglBitmapException)
+   EglBitmap                  = class(Exception);
+   EglBitmapNotSupported      = class(Exception);
+   EglBitmapSizeToLarge       = class(EglBitmap);
+   EglBitmapNonPowerOfTwo     = class(EglBitmap);
+   EglBitmapUnsupportedFormat = class(EglBitmap)
      constructor Create(const aFormat: TglBitmapFormat); overload;
      constructor Create(const aMsg: String; const aFormat: TglBitmapFormat); overload;
    end;
@@ -811,13 +851,16 @@ type
     fRowSize: Integer;
 
     // Filtering
-    fFilterMin: Cardinal;
-    fFilterMag: Cardinal;
+    fFilterMin: GLenum;
+    fFilterMag: GLenum;
 
     // TexturWarp
-    fWrapS: Cardinal;
-    fWrapT: Cardinal;
-    fWrapR: Cardinal;
+    fWrapS: GLenum;
+    fWrapT: GLenum;
+    fWrapR: GLenum;
+
+    //Swizzle
+    fSwizzle: array[0..3] of GLenum;
 
     // CustomData
     fFilename: String;
@@ -846,8 +889,8 @@ type
 
     procedure CreateID;
     procedure SetupParameters(out aBuildWithGlu: Boolean);
-    procedure SetDataPointer(const aData: PByte; const aFormat: TglBitmapFormat;
-      const aWidth: Integer = -1; const aHeight: Integer = -1); virtual;
+    procedure SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat;
+      const aWidth: Integer = -1; const aHeight: Integer = -1); virtual;  //be careful, aData could be freed by this method
     procedure GenTexture(const aTestTextureSize: Boolean = true); virtual; abstract;
 
     function FlipHorz: Boolean; virtual;
@@ -958,11 +1001,12 @@ type
     procedure FillWithColorFloat(const aRed, aGreen, aBlue: Single; const aAlpha : Single = 1);
 
     //TexParameters
-    procedure SetFilter(const aMin, aMag: Cardinal);
+    procedure SetFilter(const aMin, aMag: GLenum);
     procedure SetWrap(
-      const S: Cardinal = GL_CLAMP_TO_EDGE;
-      const T: Cardinal = GL_CLAMP_TO_EDGE;
-      const R: Cardinal = GL_CLAMP_TO_EDGE);
+      const S: GLenum = GL_CLAMP_TO_EDGE;
+      const T: GLenum = GL_CLAMP_TO_EDGE;
+      const R: GLenum = GL_CLAMP_TO_EDGE);
+    procedure SetSwizzle(const r, g, b, a: GLenum);
 
     procedure Bind(const aEnableTextureUnit: Boolean = true); virtual;
     procedure Unbind(const aDisableTextureUnit: Boolean = true); virtual;
@@ -993,15 +1037,26 @@ type
   end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+  TglBitmap1D = class(TglBitmap)
+  protected
+    procedure SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat;
+      const aWidth: Integer = - 1; const aHeight: Integer = - 1); override;
+    procedure UploadData(const aBuildWithGlu: Boolean);
+  public
+    property Width;
+    procedure AfterConstruction; override;
+    function FlipHorz: Boolean; override;
+    procedure GenTexture(const aTestTextureSize: Boolean = true); override;
+  end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   TglBitmap2D = class(TglBitmap)
   protected
-    // Bildeinstellungen
     fLines: array of PByte;
-
     function GetScanline(const aIndex: Integer): Pointer;
-    procedure SetDataPointer(const aData: PByte; const aFormat: TglBitmapFormat;
+    procedure SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat;
       const aWidth: Integer = - 1; const aHeight: Integer = - 1); override;
-    procedure UploadData(const aTarget: Cardinal; const aBuildWithGlu: Boolean);
+    procedure UploadData(const aTarget: GLenum; const aBuildWithGlu: Boolean);
   public
     property Width;
     property Height;
@@ -1020,50 +1075,24 @@ type
       const aScale: Single = 2; const aUseAlpha: Boolean = false);
   end;
 
-(* TODO
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   TglBitmapCubeMap = class(TglBitmap2D)
   protected
     fGenMode: Integer;
-
-    // Hide GenTexture
-    procedure GenTexture(TestTextureSize: Boolean = true); reintroduce;
+    procedure GenTexture(const aTestTextureSize: Boolean = true); reintroduce;
   public
     procedure AfterConstruction; override;
-
-    procedure GenerateCubeMap(CubeTarget: Cardinal; TestTextureSize: Boolean = true);
-
-    procedure Unbind(DisableTexCoordsGen: Boolean = true; DisableTextureUnit: Boolean = true); reintroduce; virtual;
-    procedure Bind(EnableTexCoordsGen: Boolean = true; EnableTextureUnit: Boolean = true); reintroduce; virtual;
+    procedure GenerateCubeMap(const aCubeTarget: Cardinal; const aTestTextureSize: Boolean = true);
+    procedure Bind(const aEnableTexCoordsGen: Boolean = true; const aEnableTextureUnit: Boolean = true); reintroduce; virtual;
+    procedure Unbind(const aDisableTexCoordsGen: Boolean = true; const aDisableTextureUnit: Boolean = true); reintroduce; virtual;
   end;
 
-
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   TglBitmapNormalMap = class(TglBitmapCubeMap)
   public
     procedure AfterConstruction; override;
-
-    procedure GenerateNormalMap(Size: Integer = 32; TestTextureSize: Boolean = true);
-  end;
-
-
-  TglBitmap1D = class(TglBitmap)
-  protected
-    procedure GetPixel1DUnmap(const Pos: TglBitmapPixelPosition; var Pixel: TglBitmapPixelData);
-
-    procedure SetDataPointer(Data: pByte; Format: TglBitmapInternalFormat; Width: Integer = -1; Height: Integer = -1); override;
-    procedure UploadData (Target, Format, InternalFormat, Typ: Cardinal; BuildWithGlu: Boolean);
-  public
-    // propertys
-    property Width;
-
-    procedure AfterConstruction; override;
-
-    // Other
-    function FlipHorz: Boolean; override;
-
-    // Generation
-    procedure GenTexture(TestTextureSize: Boolean = true); override;
+    procedure GenerateNormalMap(const aSize: Integer = 32; const aTestTextureSize: Boolean = true);
   end;
-*)
 
 const
   NULL_SIZE: TglBitmapPixelPosition = (Fields: []; X: 0; Y: 0);
@@ -1099,6 +1128,7 @@ var
   glBitmapDefaultWrapS: Cardinal;
   glBitmapDefaultWrapT: Cardinal;
   glBitmapDefaultWrapR: Cardinal;
+  glDefaultSwizzle: array[0..3] of GLenum;
 
 {$IFDEF GLB_DELPHI}
 function CreateGrayPalette: HPALETTE;
@@ -1854,7 +1884,7 @@ begin
   result := dlsym(aLibHandle, aProcName);
 {$IFEND}
   if not Assigned(result) then
-    raise EglBitmapException.Create('unable to load procedure form library: ' + aProcName);
+    raise EglBitmap.Create('unable to load procedure form library: ' + aProcName);
 end;
 
 {$IFDEF GLB_NATIVE_OGL_DYNAMIC}
@@ -1901,11 +1931,11 @@ begin
 
   GL_LibHandle := glbLoadLibrary(libopengl);
   if not Assigned(GL_LibHandle) then
-    raise EglBitmapException.Create('unable to load library: ' + libopengl);
+    raise EglBitmap.Create('unable to load library: ' + libopengl);
 
   GLU_LibHandle := glbLoadLibrary(libglu);
   if not Assigned(GLU_LibHandle) then
-    raise EglBitmapException.Create('unable to load library: ' + libglu);
+    raise EglBitmap.Create('unable to load library: ' + libglu);
 
   try
   {$IF DEFINED(GLB_WIN)}
@@ -1920,11 +1950,13 @@ begin
     glGetString := glbGetProcAddress('glGetString');
     glGetIntegerv := glbGetProcAddress('glGetIntegerv');
     glTexParameteri := glbGetProcAddress('glTexParameteri');
+    glTexParameteriv := glbGetProcAddress('glTexParameteriv');
     glTexParameterfv := glbGetProcAddress('glTexParameterfv');
     glGetTexParameteriv := glbGetProcAddress('glGetTexParameteriv');
     glGetTexParameterfv := glbGetProcAddress('glGetTexParameterfv');
     glGetTexLevelParameteriv := glbGetProcAddress('glGetTexLevelParameteriv');
     glGetTexLevelParameterfv := glbGetProcAddress('glGetTexLevelParameterfv');
+    glTexGeni := glbGetProcAddress('glTexGeni');
     glGenTextures := glbGetProcAddress('glGenTextures');
     glBindTexture := glbGetProcAddress('glBindTexture');
     glDeleteTextures := glbGetProcAddress('glDeleteTextures');
@@ -1992,6 +2024,12 @@ var
       result := ((ExtPos + Length(Extension) - 1) = Length(Buffer)) or not (Buffer[ExtPos + Length(Extension)] in ['_', 'A'..'Z', 'a'..'z']);
   end;
 
+  ///////////////////////////////////////////////////////////////////////////////////////////
+  function CheckVersion(const aMajor, aMinor: Integer): Boolean;
+  begin
+    result := (MajorVersion > aMajor) or ((MajorVersion = aMajor) and (MinorVersion >= aMinor));
+  end;
+
 begin
 {$IFDEF GLB_NATIVE_OGL_DYNAMIC}
   InitOpenGLCS.Enter;
@@ -2009,35 +2047,25 @@ begin
   Buffer := glGetString(GL_VERSION);
   TrimVersionString(Buffer, MajorVersion, MinorVersion);
 
-  GL_VERSION_1_2 := false;
-  GL_VERSION_1_3 := false;
-  GL_VERSION_1_4 := false;
-  GL_VERSION_2_0 := false;
-  if MajorVersion = 1 then begin
-    if MinorVersion >= 2 then
-      GL_VERSION_1_2 := true;
-
-    if MinorVersion >= 3 then
-      GL_VERSION_1_3 := true;
-
-    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;
-    GL_VERSION_2_0 := true;
-  end;
+  GL_VERSION_1_2 := CheckVersion(1, 2);
+  GL_VERSION_1_3 := CheckVersion(1, 3);
+  GL_VERSION_1_4 := CheckVersion(1, 4);
+  GL_VERSION_2_0 := CheckVersion(2, 0);
+  GL_VERSION_3_3 := CheckVersion(3, 3);
 
   // Extensions
   Buffer := glGetString(GL_EXTENSIONS);
   GL_ARB_texture_border_clamp       := CheckExtension('GL_ARB_texture_border_clamp');
   GL_ARB_texture_non_power_of_two   := CheckExtension('GL_ARB_texture_non_power_of_two');
+  GL_ARB_texture_swizzle            := CheckExtension('GL_ARB_texture_swizzle');
+  GL_ARB_texture_cube_map           := CheckExtension('GL_ARB_texture_cube_map');
   GL_ARB_texture_rectangle          := CheckExtension('GL_ARB_texture_rectangle');
   GL_ARB_texture_mirrored_repeat    := CheckExtension('GL_ARB_texture_mirrored_repeat');
   GL_EXT_texture_edge_clamp         := CheckExtension('GL_EXT_texture_edge_clamp');
   GL_EXT_texture_filter_anisotropic := CheckExtension('GL_EXT_texture_filter_anisotropic');
   GL_EXT_texture_rectangle          := CheckExtension('GL_EXT_texture_rectangle');
+  GL_EXT_texture_swizzle            := CheckExtension('GL_EXT_texture_swizzle');
+  GL_EXT_texture_cube_map           := CheckExtension('GL_EXT_texture_cube_map');
   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');
@@ -2054,42 +2082,6 @@ begin
 end;
 {$ENDIF}
 
-(* TODO GLB_DELPHI
-{$IFDEF GLB_DELPHI}
-function CreateGrayPalette: HPALETTE;
-var
-  Idx: Integer;
-  Pal: PLogPalette;
-begin
-  GetMem(Pal, SizeOf(TLogPalette) + (SizeOf(TPaletteEntry) * 256));
-
-  Pal.palVersion := $300;
-  Pal.palNumEntries := 256;
-
-  {$IFOPT R+}
-    {$DEFINE GLB_TEMPRANGECHECK}
-    {$R-}
-  {$ENDIF}
-
-  for Idx := 0 to 256 - 1 do begin
-    Pal.palPalEntry[Idx].peRed   := Idx;
-    Pal.palPalEntry[Idx].peGreen := Idx;
-    Pal.palPalEntry[Idx].peBlue  := Idx;
-    Pal.palPalEntry[Idx].peFlags := 0;
-  end;
-
-  {$IFDEF GLB_TEMPRANGECHECK}
-    {$UNDEF GLB_TEMPRANGECHECK}
-    {$R+}
-  {$ENDIF}
-
-  result := CreatePalette(Pal^);
-
-  FreeMem(Pal);
-end;
-{$ENDIF}
-*)
-
 {$IFDEF GLB_SDL_IMAGE}
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // SDL Image Helper /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -2169,6 +2161,15 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapSetDefaultSwizzle(const r: GLenum = GL_RED; g: GLenum = GL_GREEN; b: GLenum = GL_BLUE; a: GLenum = GL_ALPHA);
+begin
+  glDefaultSwizzle[0] := r;
+  glDefaultSwizzle[1] := g;
+  glDefaultSwizzle[2] := b;
+  glDefaultSwizzle[3] := a;
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function glBitmapGetDefaultDeleteTextureOnFree: Boolean;
 begin
   result := glBitmapDefaultDeleteTextureOnFree;
@@ -2193,14 +2194,14 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure glBitmapGetDefaultFilter(var aMin, aMag: Cardinal);
+procedure glBitmapGetDefaultFilter(var aMin, aMag: GLenum);
 begin
   aMin := glBitmapDefaultFilterMin;
   aMag := glBitmapDefaultFilterMag;
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure glBitmapGetDefaultTextureWrap(var S, T, R: Cardinal);
+procedure glBitmapGetDefaultTextureWrap(var S, T, R: GLenum);
 begin
   S := glBitmapDefaultWrapS;
   T := glBitmapDefaultWrapT;
@@ -2208,6 +2209,15 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapGetDefaultSwizzle(var r, g, b, a: GLenum);
+begin
+  r := glDefaultSwizzle[0];
+  g := glDefaultSwizzle[1];
+  b := glDefaultSwizzle[2];
+  a := glDefaultSwizzle[3];
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //TglBitmapFormatDescriptor///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function TFormatDescriptor.GetRedMask: QWord;
@@ -2295,7 +2305,7 @@ function TFormatDescriptor.MaskMatch(const aRedMask, aGreenMask, aBlueMask, aAlp
 begin
   result := false;
   if (aRedMask = 0) and (aGreenMask = 0) and (aBlueMask = 0) and (aAlphaMask = 0) then
-    raise EglBitmapException.Create('FormatCheckFormat - All Masks are 0');
+    raise EglBitmap.Create('FormatCheckFormat - All Masks are 0');
   if (aRedMask   <> RedMask) then
     exit;
   if (aGreenMask <> GreenMask) then
@@ -3496,12 +3506,12 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TfdS3tcDtx1RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer);
 begin
-  raise EglBitmapException.Create('mapping for compressed formats is not supported');
+  raise EglBitmap.Create('mapping for compressed formats is not supported');
 end;
 
 procedure TfdS3tcDtx1RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
-  raise EglBitmapException.Create('mapping for compressed formats is not supported');
+  raise EglBitmap.Create('mapping for compressed formats is not supported');
 end;
 
 constructor TfdS3tcDtx1RGBA.Create;
@@ -3522,12 +3532,12 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TfdS3tcDtx3RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer);
 begin
-  raise EglBitmapException.Create('mapping for compressed formats is not supported');
+  raise EglBitmap.Create('mapping for compressed formats is not supported');
 end;
 
 procedure TfdS3tcDtx3RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
-  raise EglBitmapException.Create('mapping for compressed formats is not supported');
+  raise EglBitmap.Create('mapping for compressed formats is not supported');
 end;
 
 constructor TfdS3tcDtx3RGBA.Create;
@@ -3548,12 +3558,12 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TfdS3tcDtx5RGBA.Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer);
 begin
-  raise EglBitmapException.Create('mapping for compressed formats is not supported');
+  raise EglBitmap.Create('mapping for compressed formats is not supported');
 end;
 
 procedure TfdS3tcDtx5RGBA.Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer);
 begin
-  raise EglBitmapException.Create('mapping for compressed formats is not supported');
+  raise EglBitmap.Create('mapping for compressed formats is not supported');
 end;
 
 constructor TfdS3tcDtx5RGBA.Create;
@@ -3686,7 +3696,7 @@ begin
     4: PCardinal(aData)^ := data;
     8:    PQWord(aData)^ := data;
   else
-    raise EglBitmapException.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
+    raise EglBitmap.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
   end;
   inc(aData, s);
 end;
@@ -3704,7 +3714,7 @@ begin
     4: data := PCardinal(aData)^;
     8: data :=    PQWord(aData)^;
   else
-    raise EglBitmapException.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
+    raise EglBitmap.CreateFmt('invalid pixel size: %.1f', [fPixelSize]);
   end;
   for i := 0 to 3 do
     aPixel.Data.arr[i] := (data shr fShift.arr[i]) and fRange.arr[i];
@@ -3719,7 +3729,7 @@ var
   i: Integer;
 begin
   if not (Format in [tfLuminance4, tfLuminance8, tfR3G3B2]) then
-    raise EglBitmapException.Create(UNSUPPORTED_FORMAT);
+    raise EglBitmap.Create(UNSUPPORTED_FORMAT);
 
   if (Format = tfLuminance4) then
     SetLength(fColorTable, 16)
@@ -3762,7 +3772,7 @@ var
   d: Byte;
 begin
   if not (Format in [tfLuminance4, tfLuminance8, tfR3G3B2]) then
-    raise EglBitmapException.Create(UNSUPPORTED_FORMAT);
+    raise EglBitmap.Create(UNSUPPORTED_FORMAT);
 
   case Format of
     tfLuminance4: begin
@@ -3810,10 +3820,10 @@ begin
     4: idx := PCardinal(aData)^;
     8: idx :=    PQWord(aData)^;
   else
-    raise EglBitmapException.CreateFmt('invalid pixel size: %.3f', [fPixelSize]);
+    raise EglBitmap.CreateFmt('invalid pixel size: %.3f', [fPixelSize]);
   end;
   if (idx >= Length(fColorTable)) then
-    raise EglBitmapException.CreateFmt('invalid color index: %d', [idx]);
+    raise EglBitmap.CreateFmt('invalid color index: %d', [idx]);
   with fColorTable[idx] do begin
     aPixel.Data.r := r;
     aPixel.Data.g := g;
@@ -4064,7 +4074,7 @@ begin
     exit;
   if TFormatDescriptor.Get(Format).PixelSize <> TFormatDescriptor.Get(aValue).PixelSize then
     raise EglBitmapUnsupportedFormat.Create(Format);
-  SetDataPointer(Data, aValue, Width, Height);
+  SetDataPointer(fData, aValue, Width, Height); //be careful, Data could be freed by this method
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4138,6 +4148,9 @@ begin
   SetAnisotropic(fAnisotropic);
   SetBorderColor(fBorderColor[0], fBorderColor[1], fBorderColor[2], fBorderColor[3]);
 
+  if (GL_ARB_texture_swizzle or GL_EXT_texture_swizzle or GL_VERSION_3_3) then
+    SetSwizzle(fSwizzle[0], fSwizzle[1], fSwizzle[2], fSwizzle[3]);
+
   // Mip Maps Generation Mode
   aBuildWithGlu := false;
   if (MipMap = mmMipmap) then begin
@@ -4150,7 +4163,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TglBitmap.SetDataPointer(const aData: PByte; const aFormat: TglBitmapFormat;
+procedure TglBitmap.SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat;
   const aWidth: Integer; const aHeight: Integer);
 var
   s: Single;
@@ -4214,12 +4227,16 @@ begin
 
   glBitmapGetDefaultFilter     (fFilterMin, fFilterMag);
   glBitmapGetDefaultTextureWrap(fWrapS, fWrapT, fWrapR);
+  glBitmapGetDefaultSwizzle    (fSwizzle[0], fSwizzle[1], fSwizzle[2], fSwizzle[3]);
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TglBitmap.BeforeDestruction;
+var
+  NewData: PByte;
 begin
-  SetDataPointer(nil, tfEmpty);
+  NewData := nil;
+  SetDataPointer(NewData, tfEmpty); //be careful, Data could be freed by this method
   if (fID > 0) and fDeleteTextureOnFree then
     glDeleteTextures(1, @fID);
   inherited BeforeDestruction;
@@ -4243,7 +4260,7 @@ var
   fs: TFileStream;
 begin
   if not FileExists(aFilename) then
-    raise EglBitmapException.Create('file does not exist: ' + aFilename);
+    raise EglBitmap.Create('file does not exist: ' + aFilename);
   fFilename := aFilename;
   fs := TFileStream.Create(fFilename, fmOpenRead);
   try
@@ -4266,7 +4283,7 @@ begin
   if not LoadDDS(aStream) then
   if not LoadTGA(aStream) then
   if not LoadBMP(aStream) then
-    raise EglBitmapException.Create('LoadFromStream - Couldn''t load Stream. It''s possible to be an unknow Streamtype.');
+    raise EglBitmap.Create('LoadFromStream - Couldn''t load Stream. It''s possible to be an unknow Streamtype.');
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4280,9 +4297,10 @@ begin
   GetMem(tmpData, size);
   try
     FillChar(tmpData^, size, #$FF);
-    SetDataPointer(tmpData, aFormat, aSize.X, aSize.Y);
+    SetDataPointer(tmpData, aFormat, aSize.X, aSize.Y); //be careful, Data could be freed by this method
   except
-    FreeMem(tmpData);
+    if Assigned(tmpData) then
+      FreeMem(tmpData);
     raise;
   end;
   AddFunc(Self, aFunc, false, Format, aArgs);
@@ -4420,7 +4438,7 @@ begin
 
         // Updating Image or InternalFormat
         if aCreateTemp then
-          SetDataPointer(TmpData, aFormat, aSource.Width, aSource.Height)
+          SetDataPointer(TmpData, aFormat, aSource.Width, aSource.Height) //be careful, Data could be freed by this method
         else if (aFormat <> fFormat) then
           Format := aFormat;
 
@@ -4430,7 +4448,7 @@ begin
         DestFD.FreeMappingData(DestMD);
       end;
     except
-      if aCreateTemp then
+      if aCreateTemp and Assigned(TmpData) then
         FreeMem(TmpData);
       raise;
     end;
@@ -4525,10 +4543,11 @@ begin
           Inc(pTempData, RowSize);
         end;
       end;
-      SetDataPointer(pData, IntFormat, TempWidth, TempHeight);
+      SetDataPointer(pData, IntFormat, TempWidth, TempHeight); //be careful, Data could be freed by this method
       result := true;
     except
-      FreeMem(pData);
+      if Assigned(pData) then
+        FreeMem(pData);
       raise;
     end;
   end;
@@ -4694,10 +4713,11 @@ begin
           Inc(pTempData, RowSize);
         end;
       end;
-      SetDataPointer(pData, IntFormat, TempWidth, TempHeight);
+      SetDataPointer(pData, IntFormat, TempWidth, TempHeight); //be careful, Data could be freed by this method
       result := true;
     except
-      FreeMem(pData);
+      if Assigned(pData) then
+        FreeMem(pData);
       raise;
     end;
   end;
@@ -4843,9 +4863,10 @@ begin
   ImageData := GetMem(ImageSize);
   try
     Move(aImage.PixelData^, ImageData^, (aImage.Width * aImage.Height * aImage.DataDescription.BitsPerPixel) shr 3);
-    SetDataPointer(ImageData, f, aImage.Width, aImage.Height);
+    SetDataPointer(ImageData, f, aImage.Width, aImage.Height); //be careful, Data could be freed by this method
   except
-    FreeMem(ImageData);
+    if Assigned(ImageData) then
+      FreeMem(ImageData);
     raise;
   end;
 
@@ -5177,13 +5198,16 @@ begin
       GetMem(TempPtr, Size);
       try
         Move(Data^, TempPtr^, Size);
-        Temp.SetDataPointer(TempPtr, Format, Width, Height);
+        Temp.SetDataPointer(TempPtr, Format, Width, Height); //be careful, Data could be freed by this method
       except
-        FreeMem(TempPtr);
+        if Assigned(TempPtr) then
+          FreeMem(TempPtr);
         raise;
       end;
-    end else
-      Temp.SetDataPointer(nil, Format, Width, Height);
+    end else begin
+      TempPtr := nil;
+      Temp.SetDataPointer(TempPtr, Format, Width, Height); //be careful, Data could be freed by this method
+    end;
 
        // copy properties
     Temp.fID                      := ID;
@@ -5291,8 +5315,11 @@ end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TglBitmap.FreeData;
+var
+  TempPtr: PByte;
 begin
-  SetDataPointer(nil, tfEmpty);
+  TempPtr := nil;
+  SetDataPointer(TempPtr, tfEmpty); //be careful, Data could be freed by this method
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -5331,7 +5358,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TglBitmap.SetFilter(const aMin, aMag: Cardinal);
+procedure TglBitmap.SetFilter(const aMin, aMag: GLenum);
 begin
   //check MIN filter
   case aMin of
@@ -5348,7 +5375,7 @@ begin
     GL_LINEAR_MIPMAP_LINEAR:
       fFilterMin := GL_LINEAR_MIPMAP_LINEAR;
     else
-      raise EglBitmapException.Create('SetFilter - Unknow MIN filter.');
+      raise EglBitmap.Create('SetFilter - Unknow MIN filter.');
   end;
 
   //check MAG filter
@@ -5358,7 +5385,7 @@ begin
     GL_LINEAR:
       fFilterMag := GL_LINEAR;
     else
-      raise EglBitmapException.Create('SetFilter - Unknow MAG filter.');
+      raise EglBitmap.Create('SetFilter - Unknow MAG filter.');
   end;
 
   //apply filter
@@ -5381,7 +5408,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TglBitmap.SetWrap(const S: Cardinal; const T: Cardinal; const R: Cardinal);
+procedure TglBitmap.SetWrap(const S: GLenum; const T: GLenum; const R: GLenum);
 
   procedure CheckAndSetWrap(const aValue: Cardinal; var aTarget: Cardinal);
   begin
@@ -5410,10 +5437,10 @@ procedure TglBitmap.SetWrap(const S: Cardinal; const T: Cardinal; const R: Cardi
         if GL_VERSION_1_4 or GL_ARB_texture_mirrored_repeat or GL_IBM_texture_mirrored_repeat then
           aTarget := GL_MIRRORED_REPEAT
         else
-          raise EglBitmapException.Create('SetWrap - Unsupported Texturewrap GL_MIRRORED_REPEAT (S).');
+          raise EglBitmap.Create('SetWrap - Unsupported Texturewrap GL_MIRRORED_REPEAT (S).');
       end;
     else
-      raise EglBitmapException.Create('SetWrap - Unknow Texturewrap (S).');
+      raise EglBitmap.Create('SetWrap - Unknow Texturewrap');
     end;
   end;
 
@@ -5431,6 +5458,32 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmap.SetSwizzle(const r, g, b, a: GLenum);
+
+  procedure CheckAndSetValue(const aValue: GLenum; const aIndex: Integer);
+  begin
+    if (aValue = GL_ZERO) or (aValue =   GL_ONE) or (aValue = GL_ALPHA) or
+       (aValue =  GL_RED) or (aValue = GL_GREEN) or (aValue =  GL_BLUE) then
+      fSwizzle[aIndex] := aValue
+    else
+      raise EglBitmap.Create('SetSwizzle - Unknow Swizle Value');
+  end;
+
+begin
+  if not (GL_ARB_texture_swizzle or GL_EXT_texture_swizzle or GL_VERSION_3_3) then
+    raise EglBitmapNotSupported.Create('texture swizzle is not supported');
+  CheckAndSetValue(r, 0);
+  CheckAndSetValue(g, 1);
+  CheckAndSetValue(b, 2);
+  CheckAndSetValue(a, 3);
+
+  if (ID > 0) then begin
+    Bind(false);
+    glTexParameteriv(Target, GL_TEXTURE_SWIZZLE_RGBA, @fSwizzle[0]);
+  end;
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TglBitmap.Bind(const aEnableTextureUnit: Boolean);
 begin
   if aEnableTextureUnit then
@@ -5450,11 +5503,11 @@ end;
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 constructor TglBitmap.Create;
 begin
+  if (ClassType = TglBitmap) then
+    raise EglBitmap.Create('Don''t create TglBitmap directly. Use one of the deviated classes (TglBitmap2D) instead.');
 {$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.');
   inherited Create;
 end;
 
@@ -5483,9 +5536,10 @@ begin
   GetMem(Image, ImageSize);
   try
     FillChar(Image^, ImageSize, #$FF);
-    SetDataPointer(Image, aFormat, aSize.X, aSize.Y);
+    SetDataPointer(Image, aFormat, aSize.X, aSize.Y); //be careful, Data could be freed by this method
   except
-    FreeMem(Image);
+    if Assigned(Image) then
+      FreeMem(Image);
     raise;
   end;
 end;
@@ -5639,11 +5693,12 @@ begin
         SetLength(png_rows, 0);
 
         // set new data
-        SetDataPointer(png_data, Format, TempWidth, TempHeight);
+        SetDataPointer(png_data, Format, TempWidth, TempHeight); //be careful, Data could be freed by this method
 
         result := true;
       except
-        FreeMem(png_data);
+        if Assigned(png_data) then
+          FreeMem(png_data);
         raise;
       end;
     end;
@@ -5732,11 +5787,12 @@ begin
             raise EglBitmapException.Create ('LoadPng - Unsupported Colortype found.');
         end;
 
-        SetDataPointer(NewImage, PngFormat, Png.Header.Width, Png.Header.Height);
+        SetDataPointer(NewImage, PngFormat, Png.Header.Width, Png.Header.Height); //be careful, Data could be freed by this method
 
         result := true;
       except
-        FreeMem(NewImage);
+        if Assigned(NewImage) then
+          FreeMem(NewImage);
         raise;
       end;
     finally
@@ -6173,11 +6229,12 @@ begin
         // destroy decompression
         jpeg_destroy_decompress(@jpeg);
 
-        SetDataPointer(pImage, IntFormat, TempWidth, TempHeight);
+        SetDataPointer(pImage, IntFormat, TempWidth, TempHeight); //be careful, Data could be freed by this method
 
         result := true;
       except
-        FreeMem(pImage);
+        if Assigned(pImage) then
+          FreeMem(pImage);
         raise;
       end;
     end;
@@ -6407,7 +6464,7 @@ function TglBitmap.LoadBMP(const aStream: TStream): Boolean;
     case aInfo.biCompression of
       BMP_COMP_RLE4,
       BMP_COMP_RLE8: begin
-        raise EglBitmapException.Create('RLE compression is not supported');
+        raise EglBitmap.Create('RLE compression is not supported');
       end;
       BMP_COMP_BITFIELDS: begin
         if (aInfo.biBitCount = 16) or (aInfo.biBitCount = 32) then begin
@@ -6416,7 +6473,7 @@ function TglBitmap.LoadBMP(const aStream: TStream): Boolean;
           aStream.Read(aMask.b, SizeOf(aMask.b));
           aStream.Read(aMask.a, SizeOf(aMask.a));
         end else
-          raise EglBitmapException.Create('Bitfields are only supported for 16bit and 32bit formats');
+          raise EglBitmap.Create('Bitfields are only supported for 16bit and 32bit formats');
       end;
     end;
 
@@ -6570,7 +6627,7 @@ begin
               inc(TmpData, wbLineSize);
             aStream.Read(PaddingBuff{%H-}, Padding);
           end;
-          SetDataPointer(ImageData, BmpFormat, Info.biWidth, abs(Info.biHeight));
+          SetDataPointer(ImageData, BmpFormat, Info.biWidth, abs(Info.biHeight)); //be careful, Data could be freed by this method
           result := true;
         finally
           if Assigned(LineBuf) then
@@ -6580,11 +6637,12 @@ begin
           FormatDesc.FreeMappingData(DestMD);
         end;
         except
-          FreeMem(ImageData);
+          if Assigned(ImageData) then
+            FreeMem(ImageData);
           raise;
         end;
       end else
-        raise EglBitmapException.Create('LoadBMP - No suitable format found');
+        raise EglBitmap.Create('LoadBMP - No suitable format found');
     except
       aStream.Position := StartPos;
       raise;
@@ -7022,7 +7080,7 @@ begin
       end;
 
       if (tgaFormat = tfEmpty) then
-        raise EglBitmapException.Create('LoadTga - unsupported format');
+        raise EglBitmap.Create('LoadTga - unsupported format');
 
       FormatDesc := TFormatDescriptor.Get(tgaFormat);
       PixelSize  := FormatDesc.GetSize(1, 1);
@@ -7060,10 +7118,11 @@ begin
             ReadCompressed;
         end;
 
-        SetDataPointer(ImageData, tgaFormat, Header.Width, Header.Height);
+        SetDataPointer(ImageData, tgaFormat, Header.Width, Header.Height); //be careful, Data could be freed by this method
         result := true;
       except
-        FreeMem(ImageData);
+        if Assigned(ImageData) then
+          FreeMem(ImageData);
         raise;
       end;
     finally
@@ -7131,11 +7190,11 @@ begin
   Size       := FormatDesc.GetSize(Dimension);
   if Format in [tfRGB5, tfRGB5A1, tfRGBA4, tfRGB8, tfRGB10A2, tfRGBA8] then begin
     if (FormatDesc.RGBInverted = tfEmpty) then
-      raise EglBitmapException.Create('inverted RGB format is empty');
+      raise EglBitmap.Create('inverted RGB format is empty');
     Converter := TFormatDescriptor.Get(FormatDesc.RGBInverted);
     if not glBitmapColorRecCmp(Converter.Range, FormatDesc.Range) or
        (Converter.PixelSize <> FormatDesc.PixelSize) then
-      raise EglBitmapException.Create('invalid inverted RGB format');
+      raise EglBitmap.Create('invalid inverted RGB format');
   end;
 
   if Assigned(Converter) then begin
@@ -7327,12 +7386,12 @@ begin
   end;
 
   if ((Header.Caps.dwCaps1 and DDSCAPS2_CUBEMAP) > 0) then
-    raise EglBitmapException.Create('LoadDDS - CubeMaps are not supported');
+    raise EglBitmap.Create('LoadDDS - CubeMaps are not supported');
 
   ddsFormat := GetDDSFormat;
   try
     if (ddsFormat = tfEmpty) then
-      raise EglBitmapException.Create('LoadDDS - unsupported Pixelformat found.');
+      raise EglBitmap.Create('LoadDDS - unsupported Pixelformat found.');
 
     FormatDesc := TFormatDescriptor.Get(ddsFormat);
     LineSize   := Trunc(Header.dwWidth * FormatDesc.PixelSize);
@@ -7382,12 +7441,13 @@ begin
           Inc(TmpData, LineSize);
         end;
       end else
-        raise EglBitmapException.Create('LoadDDS - unsupported Pixelformat found.');
+        raise EglBitmap.Create('LoadDDS - unsupported Pixelformat found.');
 
-      SetDataPointer(NewImage, ddsFormat, Header.dwWidth, Header.dwHeight);
+      SetDataPointer(NewImage, ddsFormat, Header.dwWidth, Header.dwHeight); //be careful, Data could be freed by this method
       result := true;
     except
-      FreeMem(NewImage);
+      if Assigned(NewImage) then
+        FreeMem(NewImage);
       raise;
     end;
   finally
@@ -7453,6 +7513,112 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//TglBitmap1D/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmap1D.SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat;
+  const aWidth: Integer; const aHeight: Integer);
+var
+  pTemp: pByte;
+  Size: Integer;
+begin
+  if (aHeight > 1) then begin
+    Size := TFormatDescriptor.Get(aFormat).GetSize(aWidth, 1);
+    GetMem(pTemp, Size);
+    try
+      Move(aData^, pTemp^, Size);
+      FreeMem(aData);
+      aData := nil;
+    except
+      FreeMem(pTemp);
+      raise;
+    end;
+  end else
+    pTemp := aData;
+  inherited SetDataPointer(pTemp, aFormat, aWidth);
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+function TglBitmap1D.FlipHorz: Boolean;
+var
+  Col: Integer;
+  pTempDest, pDest, pSource: PByte;
+begin
+  result := inherited FlipHorz;
+  if Assigned(Data) and not TFormatDescriptor.Get(Format).IsCompressed then begin
+    pSource := Data;
+    GetMem(pDest, fRowSize);
+    try
+      pTempDest := pDest;
+      Inc(pTempDest, fRowSize);
+      for Col := 0 to Width-1 do begin
+        dec(pTempDest, fPixelSize); //dec before, because ptr is behind last byte of data
+        Move(pSource^, pTempDest^, fPixelSize);
+        Inc(pSource, fPixelSize);
+      end;
+      SetDataPointer(pDest, Format, Width); //be careful, Data could be freed by this method
+      result := true;
+    except
+      if Assigned(pDest) then
+        FreeMem(pDest);
+      raise;
+    end;
+  end;
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmap1D.UploadData(const aBuildWithGlu: Boolean);
+var
+  FormatDesc: TFormatDescriptor;
+begin
+  // Upload data
+  FormatDesc := TFormatDescriptor.Get(Format);
+  if FormatDesc.IsCompressed then
+    glCompressedTexImage1D(Target, 0, FormatDesc.glInternalFormat, Width, 0, FormatDesc.GetSize(Width, 1), Data)
+  else if aBuildWithGlu then
+    gluBuild1DMipmaps(Target, FormatDesc.glInternalFormat, Width, FormatDesc.glFormat, FormatDesc.glDataFormat, Data)
+  else
+    glTexImage1D(Target, 0, FormatDesc.glInternalFormat, Width, 0, FormatDesc.glFormat, FormatDesc.glDataFormat, Data);
+
+  // Free Data
+  if (FreeDataAfterGenTexture) then
+    FreeData;
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmap1D.GenTexture(const aTestTextureSize: Boolean);
+var
+  BuildWithGlu, TexRec: Boolean;
+  TexSize: Integer;
+begin
+  if Assigned(Data) then begin
+    // Check Texture Size
+    if (aTestTextureSize) then begin
+      glGetIntegerv(GL_MAX_TEXTURE_SIZE, @TexSize);
+
+      if (Width > TexSize) then
+        raise EglBitmapSizeToLarge.Create('TglBitmap1D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');
+
+      TexRec := (GL_ARB_texture_rectangle or GL_EXT_texture_rectangle or GL_NV_texture_rectangle) and
+                (Target = GL_TEXTURE_RECTANGLE);
+      if not (IsPowerOfTwo(Width) or GL_ARB_texture_non_power_of_two or GL_VERSION_2_0 or TexRec) then
+        raise EglBitmapNonPowerOfTwo.Create('TglBitmap1D.GenTexture - Rendercontex dosn''t support non power of two texture.');
+    end;
+
+    CreateId;
+    SetupParameters(BuildWithGlu);
+    UploadData(BuildWithGlu);
+    glAreTexturesResident(1, @fID, @fIsResident);
+  end;
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmap1D.AfterConstruction;
+begin
+  inherited;
+  Target := GL_TEXTURE_1D;
+end;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //TglBitmap2D/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function TglBitmap2D.GetScanline(const aIndex: Integer): Pointer;
@@ -7464,7 +7630,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TglBitmap2D.SetDataPointer(const aData: PByte; const aFormat: TglBitmapFormat;
+procedure TglBitmap2D.SetDataPointer(var aData: PByte; const aFormat: TglBitmapFormat;
   const aWidth: Integer; const aHeight: Integer);
 var
   Idx, LineWidth: Integer;
@@ -7489,7 +7655,7 @@ begin
 end;
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-procedure TglBitmap2D.UploadData(const aTarget: Cardinal; const aBuildWithGlu: Boolean);
+procedure TglBitmap2D.UploadData(const aTarget: GLenum; const aBuildWithGlu: Boolean);
 var
   FormatDesc: TFormatDescriptor;
 begin
@@ -7497,7 +7663,7 @@ begin
 
   FormatDesc := TFormatDescriptor.Get(Format);
   if FormatDesc.IsCompressed then begin
-    glCompressedTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.GetSize(fDimension), Data)
+    glCompressedTexImage2D(aTarget, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.GetSize(fDimension), Data)
   end else if aBuildWithGlu then begin
     gluBuild2DMipmaps(aTarget, FormatDesc.Components, Width, Height,
       FormatDesc.glFormat, FormatDesc.glDataFormat, Data)
@@ -7536,10 +7702,11 @@ begin
   try
     glPixelStorei(GL_PACK_ALIGNMENT, 1);
     glReadPixels(aLeft, aTop, w, h, FormatDesc.glFormat, FormatDesc.glDataFormat, Temp);
-    SetDataPointer(Temp, Format, w, h);
+    SetDataPointer(Temp, Format, w, h); //be careful, Data could be freed by this method
     FlipVert;
   except
-    FreeMem(Temp);
+    if Assigned(Temp) then
+      FreeMem(Temp);
     raise;
   end;
 end;
@@ -7577,9 +7744,10 @@ begin
       glGetCompressedTexImage(Target, 0, Temp)
     else
      glGetTexImage(Target, 0, FormatDesc.glInternalFormat, FormatDesc.glDataFormat, Temp);
-    SetDataPointer(Temp, IntFormat, TempWidth, TempHeight);
+    SetDataPointer(Temp, IntFormat, TempWidth, TempHeight); //be careful, Data could be freed by this method
   except
-    FreeMem(Temp);
+    if Assigned(Temp) then
+      FreeMem(Temp);
     raise;
   end;
 end;
@@ -7596,13 +7764,12 @@ begin
       glGetIntegerv(GL_MAX_TEXTURE_SIZE, @TexSize);
 
       if ((Height > TexSize) or (Width > TexSize)) then
-        raise EglBitmapSizeToLargeException.Create('TglBitmap2D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');
+        raise EglBitmapSizeToLarge.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);
-
       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.');
+        raise EglBitmapNonPowerOfTwo.Create('TglBitmap2D.GenTexture - Rendercontex dosn''t support non power of two texture.');
     end;
 
     CreateId;
@@ -7635,10 +7802,11 @@ begin
           Dec(TempDestData, fPixelSize);
         end;
       end;
-      SetDataPointer(DestData, Format);
+      SetDataPointer(DestData, Format); //be careful, Data could be freed by this method
       result := true;
     except
-      FreeMem(DestData);
+      if Assigned(DestData) then
+        FreeMem(DestData);
       raise;
     end;
   end;
@@ -7662,10 +7830,11 @@ begin
         Dec(TempDestData, fRowSize);
         Inc(SourceData, fRowSize);
       end;
-      SetDataPointer(DestData, Format);
+      SetDataPointer(DestData, Format); //be careful, Data could be freed by this method
       result := true;
     except
-      FreeMem(DestData);
+      if Assigned(DestData) then
+        FreeMem(DestData);
       raise;
     end;
   end;
@@ -7894,228 +8063,80 @@ begin
   end;
 end;
 
-
-
-
-
-
-
-
-
-(*
-procedure TglBitmap1D.SetDataPointer(Data: pByte; Format: TglBitmapInternalFormat; Width, Height: Integer);
-var
-  pTemp: pByte;
-  Size: Integer;
-begin
-  if Height > 1 then begin
-    // extract first line of the data
-    Size := FormatGetImageSize(glBitmapPosition(Width), Format);
-    GetMem(pTemp, Size);
-
-    Move(Data^, pTemp^, Size);
-
-    FreeMem(Data);
-  end else
-    pTemp := Data;
-
-  // set data pointer
-  inherited SetDataPointer(pTemp, Format, Width);
-
-  if FormatIsUncompressed(Format) then begin
-    fUnmapFunc := FormatGetUnMapFunc(Format);
-    fGetPixelFunc := GetPixel1DUnmap;
-  end;
-end;
-
-
-procedure TglBitmap1D.GetPixel1DUnmap(const Pos: TglBitmapPixelPosition; var Pixel: TglBitmapPixelData);
-var
-  pTemp: pByte;
-begin
-  pTemp := Data;
-  Inc(pTemp, Pos.X * fPixelSize);
-
-  fUnmapFunc(pTemp, Pixel);
-end;
-
-
-function TglBitmap1D.FlipHorz: Boolean;
-var
-  Col: Integer;
-  pTempDest, pDest, pSource: pByte;
-begin
-  result := inherited FlipHorz;
-
-  if Assigned(Data) and FormatIsUncompressed(InternalFormat) then begin
-    pSource := Data;
-
-    GetMem(pDest, fRowSize);
-    try
-      pTempDest := pDest;
-
-      Inc(pTempDest, fRowSize);
-      for Col := 0 to Width -1 do begin
-        Move(pSource^, pTempDest^, fPixelSize);
-
-        Inc(pSource, fPixelSize);
-        Dec(pTempDest, fPixelSize);
-      end;
-
-      SetDataPointer(pDest, InternalFormat);
-
-      result := true;
-    finally
-      FreeMem(pDest);
-    end;
-  end;
-end;
-
-
-procedure TglBitmap1D.UploadData (Target, Format, InternalFormat, Typ: Cardinal; BuildWithGlu: Boolean);
-begin
-  // Upload data
-  if Self.InternalFormat in [ifDXT1, ifDXT3, ifDXT5] then
-    glCompressedTexImage1D(Target, 0, InternalFormat, Width, 0, Trunc(Width * FormatGetSize(Self.InternalFormat)), Data)
-  else
-
-  // Upload data
-  if BuildWithGlu then
-    gluBuild1DMipmaps(Target, InternalFormat, Width, Format, Typ, Data)
-  else
-    glTexImage1D(Target, 0, InternalFormat, Width, 0, Format, Typ, Data);
-
-  // Freigeben
-  if (FreeDataAfterGenTexture) then
-    FreeData;
-end;
-
-
-procedure TglBitmap1D.GenTexture(TestTextureSize: Boolean);
-var
-  BuildWithGlu, TexRec: Boolean;
-  glFormat, glInternalFormat, glType: Cardinal;
-  TexSize: Integer;
-begin
-  if Assigned(Data) then begin
-    // Check Texture Size
-    if (TestTextureSize) then begin
-      glGetIntegerv(GL_MAX_TEXTURE_SIZE, @TexSize);
-
-      if (Width > TexSize) then
-        raise EglBitmapSizeToLargeException.Create('TglBitmap1D.GenTexture - The size for the texture is to large. It''s may be not conform with the Hardware.');
-
-      TexRec := (GL_ARB_texture_rectangle or GL_EXT_texture_rectangle or GL_NV_texture_rectangle) and
-                (Target = GL_TEXTURE_RECTANGLE_ARB);
-
-      if not (IsPowerOfTwo (Width) or GL_ARB_texture_non_power_of_two or GL_VERSION_2_0 or TexRec) then
-        raise EglBitmapNonPowerOfTwoException.Create('TglBitmap1D.GenTexture - Rendercontex dosn''t support non power of two texture.');
-    end;
-
-    CreateId;
-
-    SetupParameters(BuildWithGlu);
-    SelectFormat(InternalFormat, glFormat, glInternalFormat, glType);
-
-    UploadData(Target, glFormat, glInternalFormat, glType, BuildWithGlu);
-
-    // Infos sammeln
-    glAreTexturesResident(1, @fID, @fIsResident);
-  end;
-end;
-
-
-procedure TglBitmap1D.AfterConstruction;
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//TglBitmapCubeMap////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmapCubeMap.GenTexture(const aTestTextureSize: Boolean);
 begin
-  inherited;
-
-  Target := GL_TEXTURE_1D;
+  Assert(false, 'TglBitmapCubeMap.GenTexture - Don''t call GenTextures directly.');
 end;
 
-
-{ TglBitmapCubeMap }
-
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TglBitmapCubeMap.AfterConstruction;
 begin
   inherited;
 
   if not (GL_VERSION_1_3 or GL_ARB_texture_cube_map or GL_EXT_texture_cube_map) then
-    raise EglBitmapException.Create('TglBitmapCubeMap.AfterConstruction - CubeMaps are unsupported.');
+    raise EglBitmap.Create('TglBitmapCubeMap.AfterConstruction - CubeMaps are unsupported.');
 
-  SetWrap; // set all to GL_CLAMP_TO_EDGE
-  Target := GL_TEXTURE_CUBE_MAP;
+  SetWrap;
+  Target   := GL_TEXTURE_CUBE_MAP;
   fGenMode := GL_REFLECTION_MAP;
 end;
 
-
-procedure TglBitmapCubeMap.Bind(EnableTexCoordsGen, EnableTextureUnit: Boolean);
-begin
-  inherited Bind (EnableTextureUnit);
-
-  if EnableTexCoordsGen then begin
-    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, fGenMode);
-    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, fGenMode);
-    glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, fGenMode);
-    glEnable(GL_TEXTURE_GEN_S);
-    glEnable(GL_TEXTURE_GEN_T);
-    glEnable(GL_TEXTURE_GEN_R);
-  end;
-end;
-
-
-procedure TglBitmapCubeMap.GenerateCubeMap(CubeTarget: Cardinal; TestTextureSize: Boolean);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmapCubeMap.GenerateCubeMap(const aCubeTarget: Cardinal; const aTestTextureSize: Boolean);
 var
-  glFormat, glInternalFormat, glType: Cardinal;
   BuildWithGlu: Boolean;
   TexSize: Integer;
 begin
-  // Check Texture Size
-  if (TestTextureSize) then begin
+  if (aTestTextureSize) then begin
     glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, @TexSize);
 
-    if ((Height > TexSize) or (Width > TexSize)) then
-      raise EglBitmapSizeToLargeException.Create('TglBitmapCubeMap.GenTexture - The size for the Cubemap is to large. It''s may be not conform with the Hardware.');
+    if (Height > TexSize) or (Width > TexSize) then
+      raise EglBitmapSizeToLarge.Create('TglBitmapCubeMap.GenTexture - The size for the Cubemap is to large. It''s may be not conform with the Hardware.');
 
-    if not ((IsPowerOfTwo (Height) and IsPowerOfTwo (Width)) or GL_VERSION_2_0 or GL_ARB_texture_non_power_of_two) then
-      raise EglBitmapNonPowerOfTwoException.Create('TglBitmapCubeMap.GenTexture - Cubemaps dosn''t support non power of two texture.');
+    if not ((IsPowerOfTwo(Height) and IsPowerOfTwo(Width)) or GL_VERSION_2_0 or GL_ARB_texture_non_power_of_two) then
+      raise EglBitmapNonPowerOfTwo.Create('TglBitmapCubeMap.GenTexture - Cubemaps dosn''t support non power of two texture.');
   end;
 
-  // create Texture
-  if ID = 0 then begin
+  if (ID = 0) then
     CreateID;
-    SetupParameters(BuildWithGlu);
-  end;
-
-  SelectFormat(InternalFormat, glFormat, glInternalFormat, glType);
-
-  UploadData (CubeTarget, glFormat, glInternalFormat, glType, BuildWithGlu);
+  SetupParameters(BuildWithGlu);
+  UploadData(aCubeTarget, BuildWithGlu);
 end;
 
-
-procedure TglBitmapCubeMap.GenTexture(TestTextureSize: Boolean);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmapCubeMap.Bind(const aEnableTexCoordsGen: Boolean; const aEnableTextureUnit: Boolean);
 begin
-  Assert(false, 'TglBitmapCubeMap.GenTexture - Don''t call GenTextures directly.');
+  inherited Bind (aEnableTextureUnit);
+  if aEnableTexCoordsGen then begin
+    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, fGenMode);
+    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, fGenMode);
+    glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, fGenMode);
+    glEnable(GL_TEXTURE_GEN_S);
+    glEnable(GL_TEXTURE_GEN_T);
+    glEnable(GL_TEXTURE_GEN_R);
+  end;
 end;
 
-
-procedure TglBitmapCubeMap.Unbind(DisableTexCoordsGen,
-  DisableTextureUnit: Boolean);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmapCubeMap.Unbind(const aDisableTexCoordsGen: Boolean; const aDisableTextureUnit: Boolean);
 begin
-  inherited Unbind (DisableTextureUnit);
-
-  if DisableTexCoordsGen then begin
+  inherited Unbind(aDisableTextureUnit);
+  if aDisableTexCoordsGen then begin
     glDisable(GL_TEXTURE_GEN_S);
     glDisable(GL_TEXTURE_GEN_T);
     glDisable(GL_TEXTURE_GEN_R);
   end;
 end;
 
-
-{ TglBitmapNormalMap }
-
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//TglBitmapNormalMap//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 type
   TVec = Array[0..2] of Single;
-  TglBitmapNormalMapGetVectorFunc = procedure (var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
+  TglBitmapNormalMapGetVectorFunc = procedure (out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
 
   PglBitmapNormalMapRec = ^TglBitmapNormalMapRec;
   TglBitmapNormalMapRec = record
@@ -8123,62 +8144,63 @@ type
     Func: TglBitmapNormalMapGetVectorFunc;
   end;
 
-
-procedure glBitmapNormalMapPosX(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
+  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapNormalMapPosX(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
 begin
-  Vec[0] := HalfSize;
-  Vec[1] := - (Position.Y + 0.5 - HalfSize);
-  Vec[2] := - (Position.X + 0.5 - HalfSize);
+  aVec[0] := aHalfSize;
+  aVec[1] := - (aPosition.Y + 0.5 - aHalfSize);
+  aVec[2] := - (aPosition.X + 0.5 - aHalfSize);
 end;
 
-
-procedure glBitmapNormalMapNegX(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapNormalMapNegX(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
 begin
-  Vec[0] := - HalfSize;
-  Vec[1] := - (Position.Y + 0.5 - HalfSize);
-  Vec[2] := Position.X + 0.5 - HalfSize;
+  aVec[0] := - aHalfSize;
+  aVec[1] := - (aPosition.Y + 0.5 - aHalfSize);
+  aVec[2] := aPosition.X + 0.5 - aHalfSize;
 end;
 
-
-procedure glBitmapNormalMapPosY(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapNormalMapPosY(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
 begin
-  Vec[0] := Position.X + 0.5 - HalfSize;
-  Vec[1] := HalfSize;
-  Vec[2] := Position.Y + 0.5 - HalfSize;
+  aVec[0] := aPosition.X + 0.5 - aHalfSize;
+  aVec[1] := aHalfSize;
+  aVec[2] := aPosition.Y + 0.5 - aHalfSize;
 end;
 
-
-procedure glBitmapNormalMapNegY(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapNormalMapNegY(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
 begin
-  Vec[0] := Position.X + 0.5 - HalfSize;
-  Vec[1] := - HalfSize;
-  Vec[2] := - (Position.Y + 0.5 - HalfSize);
+  aVec[0] := aPosition.X + 0.5 - aHalfSize;
+  aVec[1] := - aHalfSize;
+  aVec[2] := - (aPosition.Y + 0.5 - aHalfSize);
 end;
 
-
-procedure glBitmapNormalMapPosZ(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapNormalMapPosZ(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
 begin
-  Vec[0] := Position.X + 0.5 - HalfSize;
-  Vec[1] := - (Position.Y + 0.5 - HalfSize);
-  Vec[2] := HalfSize;
+  aVec[0] := aPosition.X + 0.5 - aHalfSize;
+  aVec[1] := - (aPosition.Y + 0.5 - aHalfSize);
+  aVec[2] := aHalfSize;
 end;
 
-
-procedure glBitmapNormalMapNegZ(var Vec: TVec; const Position: TglBitmapPixelPosition; const HalfSize: Integer);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure glBitmapNormalMapNegZ(out aVec: TVec; const aPosition: TglBitmapPixelPosition; const aHalfSize: Integer);
 begin
-  Vec[0] := - (Position.X + 0.5 - HalfSize);
-  Vec[1] := - (Position.Y + 0.5 - HalfSize);
-  Vec[2] := - HalfSize;
+  aVec[0] := - (aPosition.X + 0.5 - aHalfSize);
+  aVec[1] := - (aPosition.Y + 0.5 - aHalfSize);
+  aVec[2] := - aHalfSize;
 end;
 
-
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure glBitmapNormalMapFunc(var FuncRec: TglBitmapFunctionRec);
 var
-  Vec : TVec;
+  i: Integer;
+  Vec: TVec;
   Len: Single;
 begin
   with FuncRec do begin
-    with PglBitmapNormalMapRec (CustomData)^ do begin
+    with PglBitmapNormalMapRec(Args)^ do begin
       Func(Vec, Position, HalfSize);
 
       // Normalize
@@ -8196,72 +8218,69 @@ begin
     end;
 
     // Set Color
-    Dest.Red   := Round(Vec[0] * 255);
-    Dest.Green := Round(Vec[1] * 255);
-    Dest.Blue  := Round(Vec[2] * 255);
+    for i := 0 to 2 do
+      Dest.Data.arr[i] := Round(Vec[i] * 255);
   end;
 end;
 
-
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 procedure TglBitmapNormalMap.AfterConstruction;
 begin
   inherited;
-
   fGenMode := GL_NORMAL_MAP;
 end;
 
-
-procedure TglBitmapNormalMap.GenerateNormalMap(Size: Integer;
-  TestTextureSize: Boolean);
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmapNormalMap.GenerateNormalMap(const aSize: Integer; const aTestTextureSize: Boolean);
 var
   Rec: TglBitmapNormalMapRec;
   SizeRec: TglBitmapPixelPosition;
 begin
-  Rec.HalfSize := Size div 2;
-
+  Rec.HalfSize := aSize div 2;
   FreeDataAfterGenTexture := false;
 
   SizeRec.Fields := [ffX, ffY];
-  SizeRec.X := Size;
-  SizeRec.Y := Size;
+  SizeRec.X := aSize;
+  SizeRec.Y := aSize;
 
   // Positive X
   Rec.Func := glBitmapNormalMapPosX;
-  LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec);
-  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_X, TestTextureSize);
+  LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec);
+  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_X, aTestTextureSize);
 
   // Negative X
   Rec.Func := glBitmapNormalMapNegX;
-  LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec);
-  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, TestTextureSize);
+  LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec);
+  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, aTestTextureSize);
 
   // Positive Y
   Rec.Func := glBitmapNormalMapPosY;
-  LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec);
-  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, TestTextureSize);
+  LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec);
+  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, aTestTextureSize);
 
   // Negative Y
   Rec.Func := glBitmapNormalMapNegY;
-  LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec);
-  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, TestTextureSize);
+  LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec);
+  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, aTestTextureSize);
 
   // Positive Z
   Rec.Func := glBitmapNormalMapPosZ;
-  LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec);
-  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, TestTextureSize);
+  LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec);
+  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, aTestTextureSize);
 
   // Negative Z
   Rec.Func := glBitmapNormalMapNegZ;
-  LoadFromFunc (SizeRec, glBitmapNormalMapFunc, ifBGR8, @Rec);
-  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, TestTextureSize);
+  LoadFromFunc(SizeRec, glBitmapNormalMapFunc, tfBGR8, @Rec);
+  GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, aTestTextureSize);
 end;
-*)
+
 
 initialization
-  glBitmapSetDefaultFormat(tfEmpty);
-  glBitmapSetDefaultMipmap(mmMipmap);
-  glBitmapSetDefaultFilter(GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR);
-  glBitmapSetDefaultWrap  (GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
+  glBitmapSetDefaultFormat (tfEmpty);
+  glBitmapSetDefaultMipmap (mmMipmap);
+  glBitmapSetDefaultFilter (GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR);
+  glBitmapSetDefaultWrap   (GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
+  glBitmapSetDefaultSwizzle(GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA);
 
   glBitmapSetDefaultFreeDataAfterGenTexture(true);
   glBitmapSetDefaultDeleteTextureOnFree    (true);