| @@ -241,7 +241,7 @@ unit glBitmap; | |||||
| {.$DEFINE GLB_DELPHI} | {.$DEFINE GLB_DELPHI} | ||||
| // activate to enable the support for TLazIntfImage from Lazarus | // 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) | // activate to enable the support of SDL_image to load files. (READ ONLY) | ||||
| @@ -286,16 +286,16 @@ unit glBitmap; | |||||
| {$ENDIF} | {$ENDIF} | ||||
| // Operation System | // Operation System | ||||
| {$IF DEFINED(WIN32) or DEFINED(WIN64)} | |||||
| {$IF DEFINED(WIN32) or DEFINED(WIN64) or DEFINED(WINDOWS)} | |||||
| {$DEFINE GLB_WIN} | {$DEFINE GLB_WIN} | ||||
| {$ELSEIF DEFINED(LINUX)} | {$ELSEIF DEFINED(LINUX)} | ||||
| {$DEFINE GLB_LINUX} | {$DEFINE GLB_LINUX} | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| // native OpenGL Support | // native OpenGL Support | ||||
| {$IF DEFINED(GLB_NATIVE_OGL_STATIC) OR DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | {$IF DEFINED(GLB_NATIVE_OGL_STATIC) OR DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | ||||
| {$DEFINE GLB_NATIVE_OGL} | {$DEFINE GLB_NATIVE_OGL} | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| // checking define combinations | // checking define combinations | ||||
| //SDL Image | //SDL Image | ||||
| @@ -362,7 +362,7 @@ unit glBitmap; | |||||
| // native OpenGL | // native OpenGL | ||||
| {$IF DEFINED(GLB_NATIVE_OGL_STATIC) AND DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | {$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'} | {$MESSAGE warn 'GLB_NATIVE_OGL_STATIC will be ignored because you enabled GLB_NATIVE_OGL_DYNAMIC'} | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| // general options | // general options | ||||
| {$EXTENDEDSYNTAX ON} | {$EXTENDEDSYNTAX ON} | ||||
| @@ -377,7 +377,7 @@ interface | |||||
| uses | uses | ||||
| {$IFNDEF GLB_NATIVE_OGL} dglOpenGL, {$ENDIF} | {$IFNDEF GLB_NATIVE_OGL} dglOpenGL, {$ENDIF} | ||||
| {$IF DEFINED(GLB_WIN) AND | {$IF DEFINED(GLB_WIN) AND | ||||
| DEFINED(GLB_NATIVE_OGL)} windows, {$ENDIF} | |||||
| DEFINED(GLB_NATIVE_OGL)} windows, {$IFEND} | |||||
| {$IFDEF GLB_SDL} SDL, {$ENDIF} | {$IFDEF GLB_SDL} SDL, {$ENDIF} | ||||
| {$IFDEF GLB_LAZARUS} IntfGraphics, GraphType, {$ENDIF} | {$IFDEF GLB_LAZARUS} IntfGraphics, GraphType, {$ENDIF} | ||||
| @@ -393,20 +393,6 @@ uses | |||||
| Classes, SysUtils; | Classes, SysUtils; | ||||
| {$IFNDEF GLB_DELPHI} | |||||
| type | |||||
| HGLRC = Cardinal; | |||||
| DWORD = Cardinal; | |||||
| PDWORD = ^DWORD; | |||||
| TRGBQuad = packed record | |||||
| rgbBlue: Byte; | |||||
| rgbGreen: Byte; | |||||
| rgbRed: Byte; | |||||
| rgbReserved: Byte; | |||||
| end; | |||||
| {$ENDIF} | |||||
| {$IFDEF GLB_NATIVE_OGL} | {$IFDEF GLB_NATIVE_OGL} | ||||
| const | const | ||||
| GL_TRUE = 1; | GL_TRUE = 1; | ||||
| @@ -524,13 +510,13 @@ const | |||||
| GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE; | GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE; | ||||
| GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF; | GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF; | ||||
| {$ifdef LINUX} | |||||
| libglu = 'libGLU.so.1'; | |||||
| libopengl = 'libGL.so.1'; | |||||
| {$else} | |||||
| {$IF DEFINED(GLB_WIN)} | |||||
| libglu = 'glu32.dll'; | libglu = 'glu32.dll'; | ||||
| libopengl = 'opengl32.dll'; | libopengl = 'opengl32.dll'; | ||||
| {$endif} | |||||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||||
| libglu = 'libGLU.so.1'; | |||||
| libopengl = 'libGL.so.1'; | |||||
| {$IFEND} | |||||
| type | type | ||||
| GLboolean = BYTEBOOL; | GLboolean = BYTEBOOL; | ||||
| @@ -550,6 +536,13 @@ type | |||||
| 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} | 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} | TglGetCompressedTexImage = procedure(target: GLenum; level: GLint; img: PGLvoid); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | ||||
| {$IF DEFINED(GLB_WIN)} | |||||
| TwglGetProcAddress = function (ProcName: PAnsiChar): Pointer; stdcall; | |||||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||||
| TglXGetProcAddress = function(ProcName: PAnsiChar): Pointer; cdecl; | |||||
| TglXGetProcAddressARB = function(const name: PAnsiChar): pointer; cdecl; | |||||
| {$IFEND} | |||||
| {$IF DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | {$IF DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | ||||
| TglEnable = procedure(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | TglEnable = procedure(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | ||||
| TglDisable = procedure(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | TglDisable = procedure(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} | ||||
| @@ -579,13 +572,6 @@ type | |||||
| TgluBuild1DMipmaps = function(target: GLEnum; components, width: GLint; format, atype: GLEnum; const data: Pointer): GLint; {$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} | 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; | |||||
| TglXGetProcAddressARB = function(const name: PAnsiChar): pointer; cdecl; | |||||
| {$ELSE} | |||||
| TwglGetProcAddress = function(ProcName: PAnsiChar): Pointer; stdcall; | |||||
| {$ENDIF} | |||||
| {$ELSEIF DEFINED(GLB_NATIVE_OGL_STATIC)} | {$ELSEIF DEFINED(GLB_NATIVE_OGL_STATIC)} | ||||
| procedure glEnable(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | 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; | procedure glDisable(cap: GLenum); {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libopengl; | ||||
| @@ -614,7 +600,7 @@ type | |||||
| function gluBuild1DMipmaps(target: GLEnum; components, width: GLint; format, atype: GLEnum; const data: Pointer): GLint; {$IFDEF GLB_WIN}stdcall; {$ELSE}cdecl; {$ENDIF} external libglu; | 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; | 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} | |||||
| {$IFEND} | |||||
| var | var | ||||
| GL_VERSION_1_2, | GL_VERSION_1_2, | ||||
| @@ -641,6 +627,13 @@ var | |||||
| glCompressedTexImage2D: TglCompressedTexImage2D; | glCompressedTexImage2D: TglCompressedTexImage2D; | ||||
| glGetCompressedTexImage: TglGetCompressedTexImage; | glGetCompressedTexImage: TglGetCompressedTexImage; | ||||
| {$IF DEFINED(GLB_WIN)} | |||||
| wglGetProcAddress: TwglGetProcAddress; | |||||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||||
| glXGetProcAddress: TglXGetProcAddress; | |||||
| glXGetProcAddressARB: TglXGetProcAddress; | |||||
| {$IFEND} | |||||
| {$IFDEF GLB_NATIVE_OGL_DYNAMIC} | {$IFDEF GLB_NATIVE_OGL_DYNAMIC} | ||||
| glEnable: TglEnable; | glEnable: TglEnable; | ||||
| glDisable: TglDisable; | glDisable: TglDisable; | ||||
| @@ -669,22 +662,7 @@ var | |||||
| gluBuild1DMipmaps: TgluBuild1DMipmaps; | gluBuild1DMipmaps: TgluBuild1DMipmaps; | ||||
| gluBuild2DMipmaps: TgluBuild2DMipmaps; | gluBuild2DMipmaps: TgluBuild2DMipmaps; | ||||
| {$IF DEFINED(GLB_WIN)} | |||||
| wglGetProcAddress: TwglGetProcAddress; | |||||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||||
| glXGetProcAddress: TglXGetProcAddress; | |||||
| glXGetProcAddressARB: TglXGetProcAddressARB; | |||||
| {$ENDIF} | |||||
| {$ENDIF} | |||||
| (* | |||||
| {$IFDEF GLB_DELPHI} | |||||
| var | |||||
| gLastContext: HGLRC; | |||||
| {$ENDIF} | {$ENDIF} | ||||
| *) | |||||
| {$ENDIF} | {$ENDIF} | ||||
| type | type | ||||
| @@ -1132,6 +1110,14 @@ uses | |||||
| Math, syncobjs, typinfo; | Math, syncobjs, typinfo; | ||||
| type | type | ||||
| {$IFNDEF fpc} | |||||
| QWord = System.UInt64; | |||||
| PQWord = ^QWord; | |||||
| PtrInt = Longint; | |||||
| PtrUInt = DWord; | |||||
| {$ENDIF} | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| TShiftRec = packed record | TShiftRec = packed record | ||||
| case Integer of | case Integer of | ||||
| @@ -1186,8 +1172,8 @@ type | |||||
| procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); virtual; abstract; | procedure Map(const aPixel: TglBitmapPixelData; var aData: PByte; var aMapData: Pointer); virtual; abstract; | ||||
| procedure Unmap(var aData: PByte; out 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; | |||||
| function GetSize(const aSize: TglBitmapPixelPosition): Integer; overload; virtual; | |||||
| function GetSize(const aWidth, aHeight: Integer): Integer; overload; virtual; | |||||
| function CreateMappingData: Pointer; virtual; | function CreateMappingData: Pointer; virtual; | ||||
| procedure FreeMappingData(var aMappingData: Pointer); virtual; | procedure FreeMappingData(var aMappingData: Pointer); virtual; | ||||
| @@ -1842,8 +1828,6 @@ var | |||||
| function glbGetProcAddress(aProcName: PChar; aLibHandle: Pointer = nil): Pointer; | function glbGetProcAddress(aProcName: PChar; aLibHandle: Pointer = nil): Pointer; | ||||
| begin | begin | ||||
| result := nil; | |||||
| if not Assigned(aLibHandle) then | if not Assigned(aLibHandle) then | ||||
| aLibHandle := GL_LibHandle; | aLibHandle := GL_LibHandle; | ||||
| @@ -1868,7 +1852,7 @@ begin | |||||
| end; | end; | ||||
| result := dlsym(aLibHandle, aProcName); | result := dlsym(aLibHandle, aProcName); | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| if not Assigned(result) then | if not Assigned(result) then | ||||
| raise EglBitmapException.Create('unable to load procedure form library: ' + aProcName); | raise EglBitmapException.Create('unable to load procedure form library: ' + aProcName); | ||||
| end; | end; | ||||
| @@ -1891,7 +1875,7 @@ procedure glbInitOpenGL; | |||||
| result := dlopen(Name, RTLD_LAZY); | result := dlopen(Name, RTLD_LAZY); | ||||
| {$ELSE} | {$ELSE} | ||||
| result := nil; | result := nil; | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -1905,7 +1889,7 @@ procedure glbInitOpenGL; | |||||
| Result := FreeLibrary({%H-}HINST(aLibHandle)); | Result := FreeLibrary({%H-}HINST(aLibHandle)); | ||||
| {$ELSEIF DEFINED(GLB_LINUX)} | {$ELSEIF DEFINED(GLB_LINUX)} | ||||
| Result := dlclose(aLibHandle) = 0; | Result := dlclose(aLibHandle) = 0; | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| end; | end; | ||||
| begin | begin | ||||
| @@ -1928,8 +1912,8 @@ begin | |||||
| wglGetProcAddress := glbGetProcAddress('wglGetProcAddress'); | wglGetProcAddress := glbGetProcAddress('wglGetProcAddress'); | ||||
| {$ELSEIF DEFINED(GLB_LINUX)} | {$ELSEIF DEFINED(GLB_LINUX)} | ||||
| glXGetProcAddress := glbGetProcAddress('glXGetProcAddress'); | glXGetProcAddress := glbGetProcAddress('glXGetProcAddress'); | ||||
| glXGetProcAddressARB := dglGetProcAddress('glXGetProcAddressARB'); | |||||
| {$ENDIF} | |||||
| glXGetProcAddressARB := glbGetProcAddress('glXGetProcAddressARB'); | |||||
| {$IFEND} | |||||
| glEnable := glbGetProcAddress('glEnable'); | glEnable := glbGetProcAddress('glEnable'); | ||||
| glDisable := glbGetProcAddress('glDisable'); | glDisable := glbGetProcAddress('glDisable'); | ||||
| @@ -1963,9 +1947,6 @@ end; | |||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure glbReadOpenGLExtensions; | procedure glbReadOpenGLExtensions; | ||||
| var | var | ||||
| {$IFDEF GLB_DELPHI} | |||||
| Context: HGLRC; | |||||
| {$ENDIF} | |||||
| Buffer: AnsiString; | Buffer: AnsiString; | ||||
| MajorVersion, MinorVersion: Integer; | MajorVersion, MinorVersion: Integer; | ||||
| @@ -2024,61 +2005,52 @@ begin | |||||
| end; | end; | ||||
| {$ENDIF} | {$ENDIF} | ||||
| {$IFDEF GLB_DELPHI} | |||||
| Context := wglGetCurrentContext; | |||||
| if (Context <> gLastContext) then begin | |||||
| gLastContext := Context; | |||||
| {$ENDIF} | |||||
| // Version | |||||
| Buffer := glGetString(GL_VERSION); | |||||
| TrimVersionString(Buffer, MajorVersion, MinorVersion); | |||||
| // Version | |||||
| 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 := 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; | GL_VERSION_1_2 := true; | ||||
| if MinorVersion >= 3 then | |||||
| GL_VERSION_1_3 := true; | GL_VERSION_1_3 := true; | ||||
| GL_VERSION_1_4 := true; | |||||
| GL_VERSION_2_0 := true; | |||||
| end; | |||||
| // 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_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_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'); | |||||
| if GL_VERSION_1_3 then begin | |||||
| 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} | |||||
| 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; | |||||
| // 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_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_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'); | |||||
| if GL_VERSION_1_3 then begin | |||||
| glCompressedTexImage1D := glbGetProcAddress('glCompressedTexImage1D'); | |||||
| glCompressedTexImage2D := glbGetProcAddress('glCompressedTexImage2D'); | |||||
| glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImage'); | |||||
| end else begin | |||||
| glCompressedTexImage1D := glbGetProcAddress('glCompressedTexImage1DARB'); | |||||
| glCompressedTexImage2D := glbGetProcAddress('glCompressedTexImage2DARB'); | |||||
| glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImageARB'); | |||||
| end; | end; | ||||
| {$ENDIF} | |||||
| end; | end; | ||||
| {$ENDIF} | {$ENDIF} | ||||
| @@ -3798,7 +3770,7 @@ begin | |||||
| aData^ := 0; | aData^ := 0; | ||||
| d := LuminanceWeight(aPixel) and Range.r; | d := LuminanceWeight(aPixel) and Range.r; | ||||
| aData^ := aData^ or (d shl (4 - {%H-}PtrUInt(aMapData))); | aData^ := aData^ or (d shl (4 - {%H-}PtrUInt(aMapData))); | ||||
| inc(aMapData, 4); | |||||
| inc(PByte(aMapData), 4); | |||||
| if ({%H-}PtrUInt(aMapData) >= 8) then begin | if ({%H-}PtrUInt(aMapData) >= 8) then begin | ||||
| inc(aData); | inc(aData); | ||||
| aMapData := nil; | aMapData := nil; | ||||
| @@ -3848,10 +3820,10 @@ begin | |||||
| aPixel.Data.b := b; | aPixel.Data.b := b; | ||||
| aPixel.Data.a := a; | aPixel.Data.a := a; | ||||
| end; | end; | ||||
| inc(aMapData, bits); | |||||
| inc(PByte(aMapData), bits); | |||||
| if ({%H-}PtrUInt(aMapData) >= 8) then begin | if ({%H-}PtrUInt(aMapData) >= 8) then begin | ||||
| inc(aData, 1); | inc(aData, 1); | ||||
| dec(aMapData, 8); | |||||
| dec(PByte(aMapData), 8); | |||||
| end; | end; | ||||
| inc(aData, s); | inc(aData, s); | ||||
| end; | end; | ||||
| @@ -4621,7 +4593,27 @@ end; | |||||
| {$ENDIF} | {$ENDIF} | ||||
| {$IFDEF GLB_DELPHI} | {$IFDEF GLB_DELPHI} | ||||
| //TODO rework & test | |||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function CreateGrayPalette: HPALETTE; | |||||
| var | |||||
| Idx: Integer; | |||||
| Pal: PLogPalette; | |||||
| begin | |||||
| GetMem(Pal, SizeOf(TLogPalette) + (SizeOf(TPaletteEntry) * 256)); | |||||
| Pal.palVersion := $300; | |||||
| Pal.palNumEntries := 256; | |||||
| for Idx := 0 to Pal.palNumEntries - 1 do begin | |||||
| Pal.palPalEntry[Idx].peRed := Idx; | |||||
| Pal.palPalEntry[Idx].peGreen := Idx; | |||||
| Pal.palPalEntry[Idx].peBlue := Idx; | |||||
| Pal.palPalEntry[Idx].peFlags := 0; | |||||
| end; | |||||
| Result := CreatePalette(Pal^); | |||||
| FreeMem(Pal); | |||||
| end; | |||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| function TglBitmap.AssignToBitmap(const aBitmap: TBitmap): Boolean; | function TglBitmap.AssignToBitmap(const aBitmap: TBitmap): Boolean; | ||||
| var | var | ||||
| @@ -4635,35 +4627,30 @@ begin | |||||
| aBitmap.Height := Height; | aBitmap.Height := Height; | ||||
| case Format of | case Format of | ||||
| tfAlpha8, ifLuminance, ifDepth8: | |||||
| begin | |||||
| Bitmap.PixelFormat := pf8bit; | |||||
| Bitmap.Palette := CreateGrayPalette; | |||||
| end; | |||||
| ifRGB5A1: | |||||
| Bitmap.PixelFormat := pf15bit; | |||||
| ifR5G6B5: | |||||
| Bitmap.PixelFormat := pf16bit; | |||||
| ifRGB8, ifBGR8: | |||||
| Bitmap.PixelFormat := pf24bit; | |||||
| ifRGBA8, ifBGRA8: | |||||
| Bitmap.PixelFormat := pf32bit; | |||||
| else | |||||
| raise EglBitmapException.Create('AssignToBitmap - Invalid Pixelformat.'); | |||||
| tfAlpha8, tfLuminance8: begin | |||||
| aBitmap.PixelFormat := pf8bit; | |||||
| aBitmap.Palette := CreateGrayPalette; | |||||
| end; | |||||
| tfRGB5A1: | |||||
| aBitmap.PixelFormat := pf15bit; | |||||
| tfR5G6B5: | |||||
| aBitmap.PixelFormat := pf16bit; | |||||
| tfRGB8, tfBGR8: | |||||
| aBitmap.PixelFormat := pf24bit; | |||||
| tfRGBA8, tfBGRA8: | |||||
| aBitmap.PixelFormat := pf32bit; | |||||
| else | |||||
| raise EglBitmapException.Create('AssignToBitmap - Invalid Pixelformat.'); | |||||
| end; | end; | ||||
| pSource := Data; | pSource := Data; | ||||
| for Row := 0 to FileHeight -1 do begin | for Row := 0 to FileHeight -1 do begin | ||||
| pData := Bitmap.Scanline[Row]; | |||||
| pData := aBitmap.Scanline[Row]; | |||||
| Move(pSource^, pData^, fRowSize); | Move(pSource^, pData^, fRowSize); | ||||
| Inc(pSource, fRowSize); | Inc(pSource, fRowSize); | ||||
| // swap RGB(A) to BGR(A) | |||||
| if InternalFormat in [ifRGB8, ifRGBA8] then | |||||
| SwapRGB(pData, FileWidth, InternalFormat = ifRGBA8); | |||||
| if (Format in [tfRGB8, tfRGBA8]) then // swap RGB(A) to BGR(A) | |||||
| SwapRGB(pData, FileWidth, Format = tfRGBA8); | |||||
| end; | end; | ||||
| result := true; | result := true; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -4674,46 +4661,40 @@ function TglBitmap.AssignFromBitmap(const aBitmap: TBitmap): Boolean; | |||||
| var | var | ||||
| pSource, pData, pTempData: PByte; | pSource, pData, pTempData: PByte; | ||||
| Row, RowSize, TempWidth, TempHeight: Integer; | Row, RowSize, TempWidth, TempHeight: Integer; | ||||
| IntFormat: TglBitmapInternalFormat; | |||||
| IntFormat: TglBitmapFormat; | |||||
| begin | begin | ||||
| result := false; | result := false; | ||||
| if (Assigned(Bitmap)) then begin | |||||
| case Bitmap.PixelFormat of | |||||
| if (Assigned(aBitmap)) then begin | |||||
| case aBitmap.PixelFormat of | |||||
| pf8bit: | pf8bit: | ||||
| IntFormat := ifLuminance; | |||||
| IntFormat := tfLuminance8; | |||||
| pf15bit: | pf15bit: | ||||
| IntFormat := ifRGB5A1; | |||||
| IntFormat := tfRGB5A1; | |||||
| pf16bit: | pf16bit: | ||||
| IntFormat := ifR5G6B5; | |||||
| IntFormat := tfR5G6B5; | |||||
| pf24bit: | pf24bit: | ||||
| IntFormat := ifBGR8; | |||||
| IntFormat := tfBGR8; | |||||
| pf32bit: | pf32bit: | ||||
| IntFormat := ifBGRA8; | |||||
| else | |||||
| raise EglBitmapException.Create('AssignFromBitmap - Invalid Pixelformat.'); | |||||
| IntFormat := tfBGRA8; | |||||
| else | |||||
| raise EglBitmapException.Create('AssignFromBitmap - Invalid Pixelformat.'); | |||||
| end; | end; | ||||
| TempWidth := Bitmap.Width; | |||||
| TempHeight := Bitmap.Height; | |||||
| RowSize := Trunc(TempWidth * FormatGetSize(IntFormat)); | |||||
| TempWidth := aBitmap.Width; | |||||
| TempHeight := aBitmap.Height; | |||||
| RowSize := TFormatDescriptor.Get(IntFormat).GetSize(TempWidth, 1); | |||||
| GetMem(pData, TempHeight * RowSize); | GetMem(pData, TempHeight * RowSize); | ||||
| try | try | ||||
| pTempData := pData; | pTempData := pData; | ||||
| for Row := 0 to TempHeight -1 do begin | for Row := 0 to TempHeight -1 do begin | ||||
| pSource := Bitmap.Scanline[Row]; | |||||
| pSource := aBitmap.Scanline[Row]; | |||||
| if (Assigned(pSource)) then begin | if (Assigned(pSource)) then begin | ||||
| Move(pSource^, pTempData^, RowSize); | Move(pSource^, pTempData^, RowSize); | ||||
| Inc(pTempData, RowSize); | Inc(pTempData, RowSize); | ||||
| end; | end; | ||||
| end; | end; | ||||
| SetDataPointer(pData, IntFormat, TempWidth, TempHeight); | SetDataPointer(pData, IntFormat, TempWidth, TempHeight); | ||||
| result := true; | result := true; | ||||
| except | except | ||||
| FreeMem(pData); | FreeMem(pData); | ||||
| @@ -4731,17 +4712,17 @@ begin | |||||
| result := false; | result := false; | ||||
| if Assigned(Data) then begin | if Assigned(Data) then begin | ||||
| if InternalFormat in [ifAlpha, ifLuminanceAlpha, ifRGBA8, ifBGRA8] then begin | |||||
| if Assigned(Bitmap) then begin | |||||
| Bitmap.PixelFormat := pf8bit; | |||||
| Bitmap.Palette := CreateGrayPalette; | |||||
| Bitmap.Width := Width; | |||||
| Bitmap.Height := Height; | |||||
| case InternalFormat of | |||||
| ifLuminanceAlpha: | |||||
| if (Format in [tfAlpha8, tfLuminance8Alpha8, tfRGBA8, tfBGRA8]) then begin | |||||
| if Assigned(aBitmap) then begin | |||||
| aBitmap.PixelFormat := pf8bit; | |||||
| aBitmap.Palette := CreateGrayPalette; | |||||
| aBitmap.Width := Width; | |||||
| aBitmap.Height := Height; | |||||
| case Format of | |||||
| tfLuminance8Alpha8: | |||||
| AlphaInterleave := 1; | AlphaInterleave := 1; | ||||
| ifRGBA8, ifBGRA8: | |||||
| tfRGBA8, tfBGRA8: | |||||
| AlphaInterleave := 3; | AlphaInterleave := 3; | ||||
| else | else | ||||
| AlphaInterleave := 0; | AlphaInterleave := 0; | ||||
| @@ -4751,8 +4732,7 @@ begin | |||||
| pSource := Data; | pSource := Data; | ||||
| for Row := 0 to Height -1 do begin | for Row := 0 to Height -1 do begin | ||||
| pDest := Bitmap.Scanline[Row]; | |||||
| pDest := aBitmap.Scanline[Row]; | |||||
| if Assigned(pDest) then begin | if Assigned(pDest) then begin | ||||
| for Col := 0 to Width -1 do begin | for Col := 0 to Width -1 do begin | ||||
| Inc(pSource, AlphaInterleave); | Inc(pSource, AlphaInterleave); | ||||
| @@ -4761,8 +4741,7 @@ begin | |||||
| Inc(pSource); | Inc(pSource); | ||||
| end; | end; | ||||
| end; | end; | ||||
| end; | |||||
| end; | |||||
| result := true; | result := true; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -4770,14 +4749,14 @@ begin | |||||
| end; | end; | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| function TglBitmap.AddAlphaFromBitmap(const aBitmap: TBitmap; const aFunc: TglBitmapFunction; const aArgs: PtrInt): Boolean; | |||||
| function TglBitmap.AddAlphaFromBitmap(const aBitmap: TBitmap; const aFunc: TglBitmapFunction; const aArgs: Pointer): Boolean; | |||||
| var | var | ||||
| tex: TglBitmap2D; | tex: TglBitmap2D; | ||||
| begin | begin | ||||
| tex := TglBitmap2D.Create; | tex := TglBitmap2D.Create; | ||||
| try | try | ||||
| tex.AssignFromBitmap(Bitmap); | |||||
| result := AddAlphaFromglBitmap(tex, Func, CustomData); | |||||
| tex.AssignFromBitmap(ABitmap); | |||||
| result := AddAlphaFromglBitmap(tex, aFunc, aArgs); | |||||
| finally | finally | ||||
| tex.Free; | tex.Free; | ||||
| end; | end; | ||||
| @@ -5765,7 +5744,7 @@ begin | |||||
| end; | end; | ||||
| end; | end; | ||||
| end; | end; | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| {$ENDIF} | {$ENDIF} | ||||
| {$IFDEF GLB_SUPPORT_PNG_WRITE} | {$IFDEF GLB_SUPPORT_PNG_WRITE} | ||||
| @@ -5931,7 +5910,7 @@ begin | |||||
| FreeAndNil(Png); | FreeAndNil(Png); | ||||
| end; | end; | ||||
| end; | end; | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| {$ENDIF} | {$ENDIF} | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -6219,9 +6198,9 @@ begin | |||||
| result := false; | result := false; | ||||
| // reading first two bytes to test file and set cursor back to begin | // reading first two bytes to test file and set cursor back to begin | ||||
| StreamPos := Stream.Position; | |||||
| Stream.Read(Temp[0], 2); | |||||
| Stream.Position := StreamPos; | |||||
| StreamPos := aStream.Position; | |||||
| aStream.Read(Temp[0], 2); | |||||
| aStream.Position := StreamPos; | |||||
| // if Bitmap then read file. | // if Bitmap then read file. | ||||
| if ((Temp[0] = $FF) and (Temp[1] = $D8)) then begin | if ((Temp[0] = $FF) and (Temp[1] = $D8)) then begin | ||||
| @@ -6229,7 +6208,7 @@ begin | |||||
| try | try | ||||
| jpg := TJPEGImage.Create; | jpg := TJPEGImage.Create; | ||||
| try | try | ||||
| jpg.LoadFromStream(Stream); | |||||
| jpg.LoadFromStream(aStream); | |||||
| bmp.Assign(jpg); | bmp.Assign(jpg); | ||||
| result := AssignFromBitmap(bmp); | result := AssignFromBitmap(bmp); | ||||
| finally | finally | ||||
| @@ -6240,7 +6219,7 @@ begin | |||||
| end; | end; | ||||
| end; | end; | ||||
| end; | end; | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| {$ENDIF} | {$ENDIF} | ||||
| {$IFDEF GLB_SUPPORT_JPEG_WRITE} | {$IFDEF GLB_SUPPORT_JPEG_WRITE} | ||||
| @@ -6351,25 +6330,25 @@ end; | |||||
| {$ELSEIF DEFINED(GLB_DELPHI_JPEG)} | {$ELSEIF DEFINED(GLB_DELPHI_JPEG)} | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TglBitmap.SaveJPEG(Stream: TStream); | |||||
| procedure TglBitmap.SaveJPEG(const aStream: TStream); | |||||
| var | var | ||||
| Bmp: TBitmap; | Bmp: TBitmap; | ||||
| Jpg: TJPEGImage; | Jpg: TJPEGImage; | ||||
| begin | begin | ||||
| if not (ftJPEG in FormatGetSupportedFiles (InternalFormat)) then | |||||
| raise EglBitmapUnsupportedInternalFormat.Create('SaveJpg - ' + UNSUPPORTED_INTERNAL_FORMAT); | |||||
| if not (ftJPEG in FormatGetSupportedFiles(Format)) then | |||||
| raise EglBitmapUnsupportedFormat.Create(Format); | |||||
| Bmp := TBitmap.Create; | Bmp := TBitmap.Create; | ||||
| try | try | ||||
| Jpg := TJPEGImage.Create; | Jpg := TJPEGImage.Create; | ||||
| try | try | ||||
| AssignToBitmap(Bmp); | AssignToBitmap(Bmp); | ||||
| if FInternalFormat in [ifAlpha, ifLuminance, ifDepth8] then begin | |||||
| Jpg.Grayscale := true; | |||||
| if (Format in [tfAlpha8, tfLuminance8]) then begin | |||||
| Jpg.Grayscale := true; | |||||
| Jpg.PixelFormat := jf8Bit; | Jpg.PixelFormat := jf8Bit; | ||||
| end; | end; | ||||
| Jpg.Assign(Bmp); | Jpg.Assign(Bmp); | ||||
| Jpg.SaveToStream(Stream); | |||||
| Jpg.SaveToStream(aStream); | |||||
| finally | finally | ||||
| FreeAndNil(Jpg); | FreeAndNil(Jpg); | ||||
| end; | end; | ||||
| @@ -6377,7 +6356,7 @@ begin | |||||
| FreeAndNil(Bmp); | FreeAndNil(Bmp); | ||||
| end; | end; | ||||
| end; | end; | ||||
| {$ENDIF} | |||||
| {$IFEND} | |||||
| {$ENDIF} | {$ENDIF} | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -6844,13 +6823,15 @@ const | |||||
| begin | begin | ||||
| buf := nil; | buf := nil; | ||||
| if (Counter.X.dir < 0) then | if (Counter.X.dir < 0) then | ||||
| buf := GetMem(LineSize); | |||||
| GetMem(buf, LineSize); | |||||
| try | try | ||||
| while (Counter.Y.low <> Counter.Y.high + counter.Y.dir) do begin | while (Counter.Y.low <> Counter.Y.high + counter.Y.dir) do begin | ||||
| tmp1 := ImageData + (Counter.Y.low * LineSize); //pointer to LineStart | |||||
| tmp1 := ImageData; | |||||
| inc(tmp1, (Counter.Y.low * LineSize)); //pointer to LineStart | |||||
| if (Counter.X.dir < 0) then begin //flip X | if (Counter.X.dir < 0) then begin //flip X | ||||
| aStream.Read(buf^, LineSize); | aStream.Read(buf^, LineSize); | ||||
| tmp2 := buf + LineSize - PixelSize; //pointer to last pixel in line | |||||
| tmp2 := buf; | |||||
| inc(tmp2, LineSize - PixelSize); //pointer to last pixel in line | |||||
| for i := 0 to Header.Width-1 do begin //for all pixels in line | for i := 0 to Header.Width-1 do begin //for all pixels in line | ||||
| for j := 0 to PixelSize-1 do begin //for all bytes in pixel | for j := 0 to PixelSize-1 do begin //for all bytes in pixel | ||||
| tmp1^ := tmp2^; | tmp1^ := tmp2^; | ||||
| @@ -6881,9 +6862,10 @@ const | |||||
| if (LinePixelsRead >= Header.Width) then begin | if (LinePixelsRead >= Header.Width) then begin | ||||
| LinePixelsRead := 0; | LinePixelsRead := 0; | ||||
| inc(Counter.Y.low, Counter.Y.dir); //next line index | inc(Counter.Y.low, Counter.Y.dir); //next line index | ||||
| TmpData := ImageData + Counter.Y.low * LineSize; //set line | |||||
| TmpData := ImageData; | |||||
| inc(TmpData, Counter.Y.low * LineSize); //set line | |||||
| if (Counter.X.dir < 0) then //if x flipped then | if (Counter.X.dir < 0) then //if x flipped then | ||||
| TmpData := TmpData + LineSize - PixelSize; //set last pixel | |||||
| inc(TmpData, LineSize - PixelSize); //set last pixel | |||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -6961,9 +6943,10 @@ const | |||||
| GetMem(Cache, CACHE_SIZE); | GetMem(Cache, CACHE_SIZE); | ||||
| try | try | ||||
| TmpData := ImageData + Counter.Y.low * LineSize; //set line | |||||
| TmpData := ImageData; | |||||
| inc(TmpData, Counter.Y.low * LineSize); //set line | |||||
| if (Counter.X.dir < 0) then //if x flipped then | if (Counter.X.dir < 0) then //if x flipped then | ||||
| TmpData := TmpData + LineSize - PixelSize; //set last pixel | |||||
| inc(TmpData, LineSize - PixelSize); //set last pixel | |||||
| repeat | repeat | ||||
| //read CommandByte | //read CommandByte | ||||
| @@ -7012,6 +6995,7 @@ begin | |||||
| if Header.ImageID <> 0 then // skip image ID | if Header.ImageID <> 0 then // skip image ID | ||||
| aStream.Position := aStream.Position + Header.ImageID; | aStream.Position := aStream.Position + Header.ImageID; | ||||
| tgaFormat := tfEmpty; | |||||
| case Header.Bpp of | case Header.Bpp of | ||||
| 8: if IsGrayFormat then case (Header.ImageDesc and $F) of | 8: if IsGrayFormat then case (Header.ImageDesc and $F) of | ||||
| 0: tgaFormat := tfLuminance8; | 0: tgaFormat := tfLuminance8; | ||||
| @@ -7156,7 +7140,7 @@ begin | |||||
| if Assigned(Converter) then begin | if Assigned(Converter) then begin | ||||
| LineSize := FormatDesc.GetSize(Width, 1); | LineSize := FormatDesc.GetSize(Width, 1); | ||||
| LineBuf := GetMem(LineSize); | |||||
| GetMem(LineBuf, LineSize); | |||||
| SourceMD := FormatDesc.CreateMappingData; | SourceMD := FormatDesc.CreateMappingData; | ||||
| DestMD := Converter.CreateMappingData; | DestMD := Converter.CreateMappingData; | ||||
| try | try | ||||
| @@ -7364,7 +7348,8 @@ begin | |||||
| DestMD := FormatDesc.CreateMappingData; | DestMD := FormatDesc.CreateMappingData; | ||||
| try | try | ||||
| for y := 0 to Header.dwHeight-1 do begin | for y := 0 to Header.dwHeight-1 do begin | ||||
| TmpData := NewImage + y * LineSize; | |||||
| TmpData := NewImage; | |||||
| inc(TmpData, y * LineSize); | |||||
| SrcData := RowData; | SrcData := RowData; | ||||
| aStream.Read(SrcData^, RowSize); | aStream.Read(SrcData^, RowSize); | ||||
| for x := 0 to Header.dwWidth-1 do begin | for x := 0 to Header.dwWidth-1 do begin | ||||