@@ -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)
@@ -846,8 +846,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;
@@ -992,6 +992,19 @@ type
procedure SaveDDS(const aStream: TStream); virtual;
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
@@ -999,9 +1012,9 @@ type
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 a BuildWithGlu: Boolean);
procedure UploadData(const aBuildWithGlu: Boolean);
public
property Width;
property Height;
@@ -1045,24 +1058,7 @@ type
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;
end;
*)
const
@@ -2054,42 +2050,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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4064,7 +4024,7 @@ begin
exit;
if TFormatDescriptor.Get(Format).PixelSize <> TFormatDescriptor.Get(aValue).PixelSize then
raise EglBitmapUnsupportedFormat.Create(Format);
SetDataPointer(Data, aValue, Width, Height);
SetDataPointer(f Data, aValue, Width, Height); //be careful, Data could be freed by this method
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4150,7 +4110,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;
@@ -4218,8 +4178,11 @@ 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;
@@ -4280,9 +4243,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 +4384,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 +4394,7 @@ begin
DestFD.FreeMappingData(DestMD);
end;
except
if aCreateTemp then
if aCreateTemp and Assigned(TmpData) then
FreeMem(TmpData);
raise;
end;
@@ -4525,10 +4489,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 +4659,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 +4809,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 +5144,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 +5261,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;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -5450,11 +5423,11 @@ end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TglBitmap.Create;
begin
if (ClassType = TglBitmap) then
raise EglBitmapException.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 +5456,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 +5613,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 +5707,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 +6149,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;
@@ -6570,7 +6547,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,7 +6557,8 @@ begin
FormatDesc.FreeMappingData(DestMD);
end;
except
FreeMem(ImageData);
if Assigned(ImageData) then
FreeMem(ImageData);
raise;
end;
end else
@@ -7060,10 +7038,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
@@ -7384,10 +7363,11 @@ begin
end else
raise EglBitmapException.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
@@ -7452,6 +7432,112 @@ begin
aStream.Write(Data^, FormatDesc.GetSize(Dimension));
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 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);
UploadData(BuildWithGlu);
glAreTexturesResident(1, @fID, @fIsResident);
end;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap1D.AfterConstruction;
begin
inherited;
Target := GL_TEXTURE_1D;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TglBitmap2D/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -7464,7 +7550,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 +7575,7 @@ begin
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap2D.UploadData(const aTarget: Cardinal; const a BuildWithGlu: Boolean);
procedure TglBitmap2D.UploadData(const aBuildWithGlu: Boolean);
var
FormatDesc: TFormatDescriptor;
begin
@@ -7499,10 +7585,10 @@ begin
if FormatDesc.IsCompressed then begin
glCompressedTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.GetSize(fDimension), Data)
end else if aBuildWithGlu then begin
gluBuild2DMipmaps(a Target, FormatDesc.Components, Width, Height,
gluBuild2DMipmaps(Target, FormatDesc.Components, Width, Height,
FormatDesc.glFormat, FormatDesc.glDataFormat, Data)
end else begin
glTexImage2D(a Target, 0, FormatDesc.glInternalFormat, Width, Height, 0,
glTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0,
FormatDesc.glFormat, FormatDesc.glDataFormat, Data);
end;
@@ -7536,10 +7622,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 +7664,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;
@@ -7600,14 +7688,13 @@ begin
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.');
end;
CreateId;
SetupParameters(BuildWithGlu);
UploadData(Target, BuildWithGlu);
UploadData(BuildWithGlu);
glAreTexturesResident(1, @fID, @fIsResident);
end;
end;
@@ -7635,10 +7722,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 +7750,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;
@@ -7903,134 +7992,7 @@ 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;
begin
inherited;
Target := GL_TEXTURE_1D;
end;
{ TglBitmapCubeMap }