| @@ -241,7 +241,7 @@ 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) | |||
| @@ -286,16 +286,16 @@ unit glBitmap; | |||
| {$ENDIF} | |||
| // Operation System | |||
| {$IF DEFINED(WIN32) or DEFINED(WIN64)} | |||
| {$IF DEFINED(WIN32) or DEFINED(WIN64) or DEFINED(WINDOWS)} | |||
| {$DEFINE GLB_WIN} | |||
| {$ELSEIF DEFINED(LINUX)} | |||
| {$DEFINE GLB_LINUX} | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| // native OpenGL Support | |||
| {$IF DEFINED(GLB_NATIVE_OGL_STATIC) OR DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | |||
| {$DEFINE GLB_NATIVE_OGL} | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| // checking define combinations | |||
| //SDL Image | |||
| @@ -362,7 +362,7 @@ unit glBitmap; | |||
| // native OpenGL | |||
| {$IF DEFINED(GLB_NATIVE_OGL_STATIC) AND DEFINED(GLB_NATIVE_OGL_DYNAMIC)} | |||
| {$MESSAGE warn 'GLB_NATIVE_OGL_STATIC will be ignored because you enabled GLB_NATIVE_OGL_DYNAMIC'} | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| // general options | |||
| {$EXTENDEDSYNTAX ON} | |||
| @@ -377,7 +377,7 @@ interface | |||
| uses | |||
| {$IFNDEF GLB_NATIVE_OGL} dglOpenGL, {$ENDIF} | |||
| {$IF DEFINED(GLB_WIN) AND | |||
| DEFINED(GLB_NATIVE_OGL)} windows, {$ENDIF} | |||
| DEFINED(GLB_NATIVE_OGL)} windows, {$IFEND} | |||
| {$IFDEF GLB_SDL} SDL, {$ENDIF} | |||
| {$IFDEF GLB_LAZARUS} IntfGraphics, GraphType, {$ENDIF} | |||
| @@ -393,20 +393,6 @@ uses | |||
| 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} | |||
| const | |||
| GL_TRUE = 1; | |||
| @@ -524,13 +510,13 @@ const | |||
| GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE; | |||
| 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'; | |||
| libopengl = 'opengl32.dll'; | |||
| {$endif} | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| libglu = 'libGLU.so.1'; | |||
| libopengl = 'libGL.so.1'; | |||
| {$IFEND} | |||
| type | |||
| 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} | |||
| 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)} | |||
| TglEnable = 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} | |||
| 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)} | |||
| 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; | |||
| @@ -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 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 | |||
| GL_VERSION_1_2, | |||
| @@ -641,6 +627,13 @@ var | |||
| glCompressedTexImage2D: TglCompressedTexImage2D; | |||
| glGetCompressedTexImage: TglGetCompressedTexImage; | |||
| {$IF DEFINED(GLB_WIN)} | |||
| wglGetProcAddress: TwglGetProcAddress; | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| glXGetProcAddress: TglXGetProcAddress; | |||
| glXGetProcAddressARB: TglXGetProcAddress; | |||
| {$IFEND} | |||
| {$IFDEF GLB_NATIVE_OGL_DYNAMIC} | |||
| glEnable: TglEnable; | |||
| glDisable: TglDisable; | |||
| @@ -669,22 +662,7 @@ var | |||
| gluBuild1DMipmaps: TgluBuild1DMipmaps; | |||
| 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} | |||
| type | |||
| @@ -1132,6 +1110,14 @@ uses | |||
| Math, syncobjs, typinfo; | |||
| type | |||
| {$IFNDEF fpc} | |||
| QWord = System.UInt64; | |||
| PQWord = ^QWord; | |||
| PtrInt = Longint; | |||
| PtrUInt = DWord; | |||
| {$ENDIF} | |||
| //////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| TShiftRec = packed record | |||
| case Integer of | |||
| @@ -1186,8 +1172,8 @@ type | |||
| 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; | |||
| 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; | |||
| procedure FreeMappingData(var aMappingData: Pointer); virtual; | |||
| @@ -1842,8 +1828,6 @@ var | |||
| function glbGetProcAddress(aProcName: PChar; aLibHandle: Pointer = nil): Pointer; | |||
| begin | |||
| result := nil; | |||
| if not Assigned(aLibHandle) then | |||
| aLibHandle := GL_LibHandle; | |||
| @@ -1868,7 +1852,7 @@ begin | |||
| end; | |||
| result := dlsym(aLibHandle, aProcName); | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| if not Assigned(result) then | |||
| raise EglBitmapException.Create('unable to load procedure form library: ' + aProcName); | |||
| end; | |||
| @@ -1891,7 +1875,7 @@ procedure glbInitOpenGL; | |||
| result := dlopen(Name, RTLD_LAZY); | |||
| {$ELSE} | |||
| result := nil; | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| end; | |||
| //////////////////////////////////////////////////////////////////////////////// | |||
| @@ -1905,7 +1889,7 @@ procedure glbInitOpenGL; | |||
| Result := FreeLibrary({%H-}HINST(aLibHandle)); | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| Result := dlclose(aLibHandle) = 0; | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| end; | |||
| begin | |||
| @@ -1928,8 +1912,8 @@ begin | |||
| wglGetProcAddress := glbGetProcAddress('wglGetProcAddress'); | |||
| {$ELSEIF DEFINED(GLB_LINUX)} | |||
| glXGetProcAddress := glbGetProcAddress('glXGetProcAddress'); | |||
| glXGetProcAddressARB := dglGetProcAddress('glXGetProcAddressARB'); | |||
| {$ENDIF} | |||
| glXGetProcAddressARB := glbGetProcAddress('glXGetProcAddressARB'); | |||
| {$IFEND} | |||
| glEnable := glbGetProcAddress('glEnable'); | |||
| glDisable := glbGetProcAddress('glDisable'); | |||
| @@ -1963,9 +1947,6 @@ end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure glbReadOpenGLExtensions; | |||
| var | |||
| {$IFDEF GLB_DELPHI} | |||
| Context: HGLRC; | |||
| {$ENDIF} | |||
| Buffer: AnsiString; | |||
| MajorVersion, MinorVersion: Integer; | |||
| @@ -2024,61 +2005,52 @@ begin | |||
| end; | |||
| {$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; | |||
| if MinorVersion >= 3 then | |||
| 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; | |||
| {$ENDIF} | |||
| end; | |||
| {$ENDIF} | |||
| @@ -3798,7 +3770,7 @@ begin | |||
| aData^ := 0; | |||
| d := LuminanceWeight(aPixel) and Range.r; | |||
| aData^ := aData^ or (d shl (4 - {%H-}PtrUInt(aMapData))); | |||
| inc(aMapData, 4); | |||
| inc(PByte(aMapData), 4); | |||
| if ({%H-}PtrUInt(aMapData) >= 8) then begin | |||
| inc(aData); | |||
| aMapData := nil; | |||
| @@ -3848,10 +3820,10 @@ begin | |||
| aPixel.Data.b := b; | |||
| aPixel.Data.a := a; | |||
| end; | |||
| inc(aMapData, bits); | |||
| inc(PByte(aMapData), bits); | |||
| if ({%H-}PtrUInt(aMapData) >= 8) then begin | |||
| inc(aData, 1); | |||
| dec(aMapData, 8); | |||
| dec(PByte(aMapData), 8); | |||
| end; | |||
| inc(aData, s); | |||
| end; | |||
| @@ -4621,7 +4593,27 @@ end; | |||
| {$ENDIF} | |||
| {$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; | |||
| var | |||
| @@ -4635,35 +4627,30 @@ begin | |||
| aBitmap.Height := Height; | |||
| 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; | |||
| pSource := Data; | |||
| for Row := 0 to FileHeight -1 do begin | |||
| pData := Bitmap.Scanline[Row]; | |||
| pData := aBitmap.Scanline[Row]; | |||
| Move(pSource^, pData^, 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; | |||
| result := true; | |||
| end; | |||
| end; | |||
| @@ -4674,46 +4661,40 @@ function TglBitmap.AssignFromBitmap(const aBitmap: TBitmap): Boolean; | |||
| var | |||
| pSource, pData, pTempData: PByte; | |||
| Row, RowSize, TempWidth, TempHeight: Integer; | |||
| IntFormat: TglBitmapInternalFormat; | |||
| IntFormat: TglBitmapFormat; | |||
| begin | |||
| result := false; | |||
| if (Assigned(Bitmap)) then begin | |||
| case Bitmap.PixelFormat of | |||
| if (Assigned(aBitmap)) then begin | |||
| case aBitmap.PixelFormat of | |||
| pf8bit: | |||
| IntFormat := ifLuminance; | |||
| IntFormat := tfLuminance8; | |||
| pf15bit: | |||
| IntFormat := ifRGB5A1; | |||
| IntFormat := tfRGB5A1; | |||
| pf16bit: | |||
| IntFormat := ifR5G6B5; | |||
| IntFormat := tfR5G6B5; | |||
| pf24bit: | |||
| IntFormat := ifBGR8; | |||
| IntFormat := tfBGR8; | |||
| pf32bit: | |||
| IntFormat := ifBGRA8; | |||
| else | |||
| raise EglBitmapException.Create('AssignFromBitmap - Invalid Pixelformat.'); | |||
| IntFormat := tfBGRA8; | |||
| else | |||
| raise EglBitmapException.Create('AssignFromBitmap - Invalid Pixelformat.'); | |||
| 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); | |||
| try | |||
| pTempData := pData; | |||
| for Row := 0 to TempHeight -1 do begin | |||
| pSource := Bitmap.Scanline[Row]; | |||
| pSource := aBitmap.Scanline[Row]; | |||
| if (Assigned(pSource)) then begin | |||
| Move(pSource^, pTempData^, RowSize); | |||
| Inc(pTempData, RowSize); | |||
| end; | |||
| end; | |||
| SetDataPointer(pData, IntFormat, TempWidth, TempHeight); | |||
| result := true; | |||
| except | |||
| FreeMem(pData); | |||
| @@ -4731,17 +4712,17 @@ begin | |||
| result := false; | |||
| 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; | |||
| ifRGBA8, ifBGRA8: | |||
| tfRGBA8, tfBGRA8: | |||
| AlphaInterleave := 3; | |||
| else | |||
| AlphaInterleave := 0; | |||
| @@ -4751,8 +4732,7 @@ begin | |||
| pSource := Data; | |||
| for Row := 0 to Height -1 do begin | |||
| pDest := Bitmap.Scanline[Row]; | |||
| pDest := aBitmap.Scanline[Row]; | |||
| if Assigned(pDest) then begin | |||
| for Col := 0 to Width -1 do begin | |||
| Inc(pSource, AlphaInterleave); | |||
| @@ -4761,8 +4741,7 @@ begin | |||
| Inc(pSource); | |||
| end; | |||
| end; | |||
| end; | |||
| end; | |||
| result := true; | |||
| end; | |||
| end; | |||
| @@ -4770,14 +4749,14 @@ begin | |||
| 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 | |||
| tex: TglBitmap2D; | |||
| begin | |||
| tex := TglBitmap2D.Create; | |||
| try | |||
| tex.AssignFromBitmap(Bitmap); | |||
| result := AddAlphaFromglBitmap(tex, Func, CustomData); | |||
| tex.AssignFromBitmap(ABitmap); | |||
| result := AddAlphaFromglBitmap(tex, aFunc, aArgs); | |||
| finally | |||
| tex.Free; | |||
| end; | |||
| @@ -5765,7 +5744,7 @@ begin | |||
| end; | |||
| end; | |||
| end; | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| {$ENDIF} | |||
| {$IFDEF GLB_SUPPORT_PNG_WRITE} | |||
| @@ -5931,7 +5910,7 @@ begin | |||
| FreeAndNil(Png); | |||
| end; | |||
| end; | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| {$ENDIF} | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -6219,9 +6198,9 @@ begin | |||
| result := false; | |||
| // 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 ((Temp[0] = $FF) and (Temp[1] = $D8)) then begin | |||
| @@ -6229,7 +6208,7 @@ begin | |||
| try | |||
| jpg := TJPEGImage.Create; | |||
| try | |||
| jpg.LoadFromStream(Stream); | |||
| jpg.LoadFromStream(aStream); | |||
| bmp.Assign(jpg); | |||
| result := AssignFromBitmap(bmp); | |||
| finally | |||
| @@ -6240,7 +6219,7 @@ begin | |||
| end; | |||
| end; | |||
| end; | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| {$ENDIF} | |||
| {$IFDEF GLB_SUPPORT_JPEG_WRITE} | |||
| @@ -6351,25 +6330,25 @@ end; | |||
| {$ELSEIF DEFINED(GLB_DELPHI_JPEG)} | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TglBitmap.SaveJPEG(Stream: TStream); | |||
| procedure TglBitmap.SaveJPEG(const aStream: TStream); | |||
| var | |||
| Bmp: TBitmap; | |||
| Jpg: TJPEGImage; | |||
| 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; | |||
| try | |||
| Jpg := TJPEGImage.Create; | |||
| try | |||
| 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; | |||
| end; | |||
| Jpg.Assign(Bmp); | |||
| Jpg.SaveToStream(Stream); | |||
| Jpg.SaveToStream(aStream); | |||
| finally | |||
| FreeAndNil(Jpg); | |||
| end; | |||
| @@ -6377,7 +6356,7 @@ begin | |||
| FreeAndNil(Bmp); | |||
| end; | |||
| end; | |||
| {$ENDIF} | |||
| {$IFEND} | |||
| {$ENDIF} | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| @@ -6844,13 +6823,15 @@ const | |||
| begin | |||
| buf := nil; | |||
| if (Counter.X.dir < 0) then | |||
| buf := GetMem(LineSize); | |||
| GetMem(buf, LineSize); | |||
| try | |||
| 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 | |||
| 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 j := 0 to PixelSize-1 do begin //for all bytes in pixel | |||
| tmp1^ := tmp2^; | |||
| @@ -6881,9 +6862,10 @@ const | |||
| if (LinePixelsRead >= Header.Width) then begin | |||
| LinePixelsRead := 0; | |||
| 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 | |||
| TmpData := TmpData + LineSize - PixelSize; //set last pixel | |||
| inc(TmpData, LineSize - PixelSize); //set last pixel | |||
| end; | |||
| end; | |||
| @@ -6961,9 +6943,10 @@ const | |||
| GetMem(Cache, CACHE_SIZE); | |||
| 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 | |||
| TmpData := TmpData + LineSize - PixelSize; //set last pixel | |||
| inc(TmpData, LineSize - PixelSize); //set last pixel | |||
| repeat | |||
| //read CommandByte | |||
| @@ -7012,6 +6995,7 @@ begin | |||
| if Header.ImageID <> 0 then // skip image ID | |||
| aStream.Position := aStream.Position + Header.ImageID; | |||
| tgaFormat := tfEmpty; | |||
| case Header.Bpp of | |||
| 8: if IsGrayFormat then case (Header.ImageDesc and $F) of | |||
| 0: tgaFormat := tfLuminance8; | |||
| @@ -7156,7 +7140,7 @@ begin | |||
| if Assigned(Converter) then begin | |||
| LineSize := FormatDesc.GetSize(Width, 1); | |||
| LineBuf := GetMem(LineSize); | |||
| GetMem(LineBuf, LineSize); | |||
| SourceMD := FormatDesc.CreateMappingData; | |||
| DestMD := Converter.CreateMappingData; | |||
| try | |||
| @@ -7364,7 +7348,8 @@ begin | |||
| DestMD := FormatDesc.CreateMappingData; | |||
| try | |||
| for y := 0 to Header.dwHeight-1 do begin | |||
| TmpData := NewImage + y * LineSize; | |||
| TmpData := NewImage; | |||
| inc(TmpData, y * LineSize); | |||
| SrcData := RowData; | |||
| aStream.Read(SrcData^, RowSize); | |||
| for x := 0 to Header.dwWidth-1 do begin | |||