| @@ -4,7 +4,6 @@ http://www.opengl24.de/index.php?cat=header&file=glbitmap | |||||
| modified by Delphi OpenGL Community (http://delphigl.com/) | modified by Delphi OpenGL Community (http://delphigl.com/) | ||||
| ------------------------------------------------------------ | ------------------------------------------------------------ | ||||
| The contents of this file are used with permission, subject to | The contents of this file are used with permission, subject to | ||||
| the Mozilla Public License Version 1.1 (the "License"); you may | the Mozilla Public License Version 1.1 (the "License"); you may | ||||
| @@ -241,7 +240,8 @@ 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) | ||||
| @@ -846,8 +846,8 @@ type | |||||
| procedure CreateID; | procedure CreateID; | ||||
| procedure SetupParameters(out aBuildWithGlu: Boolean); | procedure SetupParameters(out aBuildWithGlu: Boolean); | ||||
| procedure SetDataPointer(const aData: PByte; const aFormat: TglBitmapFormat; | |||||
| const aWidth: Integer = -1; const aHeight: Integer = -1); virtual; | |||||
| procedure 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; | procedure GenTexture(const aTestTextureSize: Boolean = true); virtual; abstract; | ||||
| function FlipHorz: Boolean; virtual; | function FlipHorz: Boolean; virtual; | ||||
| @@ -992,6 +992,19 @@ type | |||||
| procedure SaveDDS(const aStream: TStream); virtual; | procedure SaveDDS(const aStream: TStream); virtual; | ||||
| end; | 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) | TglBitmap2D = class(TglBitmap) | ||||
| protected | protected | ||||
| @@ -999,9 +1012,9 @@ type | |||||
| fLines: array of PByte; | fLines: array of PByte; | ||||
| function GetScanline(const aIndex: Integer): Pointer; | 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; | const aWidth: Integer = - 1; const aHeight: Integer = - 1); override; | ||||
| procedure UploadData(const aTarget: Cardinal; const aBuildWithGlu: Boolean); | |||||
| procedure UploadData(const aBuildWithGlu: Boolean); | |||||
| public | public | ||||
| property Width; | property Width; | ||||
| property Height; | property Height; | ||||
| @@ -1045,24 +1058,7 @@ type | |||||
| end; | 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 | const | ||||
| @@ -2054,42 +2050,6 @@ begin | |||||
| end; | end; | ||||
| {$ENDIF} | {$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} | {$IFDEF GLB_SDL_IMAGE} | ||||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| // SDL Image Helper ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | // SDL Image Helper ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -4064,7 +4024,7 @@ begin | |||||
| exit; | exit; | ||||
| if TFormatDescriptor.Get(Format).PixelSize <> TFormatDescriptor.Get(aValue).PixelSize then | if TFormatDescriptor.Get(Format).PixelSize <> TFormatDescriptor.Get(aValue).PixelSize then | ||||
| raise EglBitmapUnsupportedFormat.Create(Format); | raise EglBitmapUnsupportedFormat.Create(Format); | ||||
| SetDataPointer(Data, aValue, Width, Height); | |||||
| SetDataPointer(fData, aValue, Width, Height); //be careful, Data could be freed by this method | |||||
| end; | end; | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -4150,7 +4110,7 @@ begin | |||||
| end; | 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); | const aWidth: Integer; const aHeight: Integer); | ||||
| var | var | ||||
| s: Single; | s: Single; | ||||
| @@ -4218,8 +4178,11 @@ end; | |||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TglBitmap.BeforeDestruction; | procedure TglBitmap.BeforeDestruction; | ||||
| var | |||||
| NewData: PByte; | |||||
| begin | begin | ||||
| SetDataPointer(nil, tfEmpty); | |||||
| NewData := nil; | |||||
| SetDataPointer(NewData, tfEmpty); //be careful, Data could be freed by this method | |||||
| if (fID > 0) and fDeleteTextureOnFree then | if (fID > 0) and fDeleteTextureOnFree then | ||||
| glDeleteTextures(1, @fID); | glDeleteTextures(1, @fID); | ||||
| inherited BeforeDestruction; | inherited BeforeDestruction; | ||||
| @@ -4280,9 +4243,10 @@ begin | |||||
| GetMem(tmpData, size); | GetMem(tmpData, size); | ||||
| try | try | ||||
| FillChar(tmpData^, size, #$FF); | 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 | except | ||||
| FreeMem(tmpData); | |||||
| if Assigned(tmpData) then | |||||
| FreeMem(tmpData); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| AddFunc(Self, aFunc, false, Format, aArgs); | AddFunc(Self, aFunc, false, Format, aArgs); | ||||
| @@ -4420,7 +4384,7 @@ begin | |||||
| // Updating Image or InternalFormat | // Updating Image or InternalFormat | ||||
| if aCreateTemp then | 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 | else if (aFormat <> fFormat) then | ||||
| Format := aFormat; | Format := aFormat; | ||||
| @@ -4430,7 +4394,7 @@ begin | |||||
| DestFD.FreeMappingData(DestMD); | DestFD.FreeMappingData(DestMD); | ||||
| end; | end; | ||||
| except | except | ||||
| if aCreateTemp then | |||||
| if aCreateTemp and Assigned(TmpData) then | |||||
| FreeMem(TmpData); | FreeMem(TmpData); | ||||
| raise; | raise; | ||||
| end; | end; | ||||
| @@ -4525,10 +4489,11 @@ begin | |||||
| Inc(pTempData, RowSize); | Inc(pTempData, RowSize); | ||||
| end; | end; | ||||
| end; | end; | ||||
| SetDataPointer(pData, IntFormat, TempWidth, TempHeight); | |||||
| SetDataPointer(pData, IntFormat, TempWidth, TempHeight); //be careful, Data could be freed by this method | |||||
| result := true; | result := true; | ||||
| except | except | ||||
| FreeMem(pData); | |||||
| if Assigned(pData) then | |||||
| FreeMem(pData); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -4694,10 +4659,11 @@ begin | |||||
| Inc(pTempData, RowSize); | Inc(pTempData, RowSize); | ||||
| end; | end; | ||||
| end; | end; | ||||
| SetDataPointer(pData, IntFormat, TempWidth, TempHeight); | |||||
| SetDataPointer(pData, IntFormat, TempWidth, TempHeight); //be careful, Data could be freed by this method | |||||
| result := true; | result := true; | ||||
| except | except | ||||
| FreeMem(pData); | |||||
| if Assigned(pData) then | |||||
| FreeMem(pData); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -4843,9 +4809,10 @@ begin | |||||
| ImageData := GetMem(ImageSize); | ImageData := GetMem(ImageSize); | ||||
| try | try | ||||
| Move(aImage.PixelData^, ImageData^, (aImage.Width * aImage.Height * aImage.DataDescription.BitsPerPixel) shr 3); | 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 | except | ||||
| FreeMem(ImageData); | |||||
| if Assigned(ImageData) then | |||||
| FreeMem(ImageData); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| @@ -5177,13 +5144,16 @@ begin | |||||
| GetMem(TempPtr, Size); | GetMem(TempPtr, Size); | ||||
| try | try | ||||
| Move(Data^, TempPtr^, Size); | 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 | except | ||||
| FreeMem(TempPtr); | |||||
| if Assigned(TempPtr) then | |||||
| FreeMem(TempPtr); | |||||
| raise; | raise; | ||||
| end; | 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 | // copy properties | ||||
| Temp.fID := ID; | Temp.fID := ID; | ||||
| @@ -5291,8 +5261,11 @@ end; | |||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TglBitmap.FreeData; | procedure TglBitmap.FreeData; | ||||
| var | |||||
| TempPtr: PByte; | |||||
| begin | begin | ||||
| SetDataPointer(nil, tfEmpty); | |||||
| TempPtr := nil; | |||||
| SetDataPointer(TempPtr, tfEmpty); //be careful, Data could be freed by this method | |||||
| end; | end; | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -5450,11 +5423,11 @@ end; | |||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| constructor TglBitmap.Create; | constructor TglBitmap.Create; | ||||
| begin | 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} | {$IFDEF GLB_NATIVE_OGL} | ||||
| glbReadOpenGLExtensions; | glbReadOpenGLExtensions; | ||||
| {$ENDIF} | {$ENDIF} | ||||
| if (ClassType = TglBitmap) then | |||||
| raise EglBitmapException.Create('Don''t create TglBitmap directly. Use one of the deviated classes (TglBitmap2D) instead.'); | |||||
| inherited Create; | inherited Create; | ||||
| end; | end; | ||||
| @@ -5483,9 +5456,10 @@ begin | |||||
| GetMem(Image, ImageSize); | GetMem(Image, ImageSize); | ||||
| try | try | ||||
| FillChar(Image^, ImageSize, #$FF); | 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 | except | ||||
| FreeMem(Image); | |||||
| if Assigned(Image) then | |||||
| FreeMem(Image); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -5639,11 +5613,12 @@ begin | |||||
| SetLength(png_rows, 0); | SetLength(png_rows, 0); | ||||
| // set new data | // 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; | result := true; | ||||
| except | except | ||||
| FreeMem(png_data); | |||||
| if Assigned(png_data) then | |||||
| FreeMem(png_data); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -5732,11 +5707,12 @@ begin | |||||
| raise EglBitmapException.Create ('LoadPng - Unsupported Colortype found.'); | raise EglBitmapException.Create ('LoadPng - Unsupported Colortype found.'); | ||||
| end; | 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; | result := true; | ||||
| except | except | ||||
| FreeMem(NewImage); | |||||
| if Assigned(NewImage) then | |||||
| FreeMem(NewImage); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| finally | finally | ||||
| @@ -6173,11 +6149,12 @@ begin | |||||
| // destroy decompression | // destroy decompression | ||||
| jpeg_destroy_decompress(@jpeg); | 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; | result := true; | ||||
| except | except | ||||
| FreeMem(pImage); | |||||
| if Assigned(pImage) then | |||||
| FreeMem(pImage); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -6570,7 +6547,7 @@ begin | |||||
| inc(TmpData, wbLineSize); | inc(TmpData, wbLineSize); | ||||
| aStream.Read(PaddingBuff{%H-}, Padding); | aStream.Read(PaddingBuff{%H-}, Padding); | ||||
| end; | 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; | result := true; | ||||
| finally | finally | ||||
| if Assigned(LineBuf) then | if Assigned(LineBuf) then | ||||
| @@ -6580,7 +6557,8 @@ begin | |||||
| FormatDesc.FreeMappingData(DestMD); | FormatDesc.FreeMappingData(DestMD); | ||||
| end; | end; | ||||
| except | except | ||||
| FreeMem(ImageData); | |||||
| if Assigned(ImageData) then | |||||
| FreeMem(ImageData); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end else | end else | ||||
| @@ -7060,10 +7038,11 @@ begin | |||||
| ReadCompressed; | ReadCompressed; | ||||
| end; | 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; | result := true; | ||||
| except | except | ||||
| FreeMem(ImageData); | |||||
| if Assigned(ImageData) then | |||||
| FreeMem(ImageData); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| finally | finally | ||||
| @@ -7384,10 +7363,11 @@ begin | |||||
| end else | end else | ||||
| raise EglBitmapException.Create('LoadDDS - unsupported Pixelformat found.'); | 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; | result := true; | ||||
| except | except | ||||
| FreeMem(NewImage); | |||||
| if Assigned(NewImage) then | |||||
| FreeMem(NewImage); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| finally | finally | ||||
| @@ -7452,6 +7432,112 @@ begin | |||||
| aStream.Write(Data^, FormatDesc.GetSize(Dimension)); | aStream.Write(Data^, FormatDesc.GetSize(Dimension)); | ||||
| end; | 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///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TglBitmap2D///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -7464,7 +7550,7 @@ begin | |||||
| end; | 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); | const aWidth: Integer; const aHeight: Integer); | ||||
| var | var | ||||
| Idx, LineWidth: Integer; | Idx, LineWidth: Integer; | ||||
| @@ -7489,7 +7575,7 @@ begin | |||||
| end; | end; | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TglBitmap2D.UploadData(const aTarget: Cardinal; const aBuildWithGlu: Boolean); | |||||
| procedure TglBitmap2D.UploadData(const aBuildWithGlu: Boolean); | |||||
| var | var | ||||
| FormatDesc: TFormatDescriptor; | FormatDesc: TFormatDescriptor; | ||||
| begin | begin | ||||
| @@ -7499,10 +7585,10 @@ begin | |||||
| if FormatDesc.IsCompressed then begin | if FormatDesc.IsCompressed then begin | ||||
| glCompressedTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.GetSize(fDimension), Data) | glCompressedTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.GetSize(fDimension), Data) | ||||
| end else if aBuildWithGlu then begin | end else if aBuildWithGlu then begin | ||||
| gluBuild2DMipmaps(aTarget, FormatDesc.Components, Width, Height, | |||||
| gluBuild2DMipmaps(Target, FormatDesc.Components, Width, Height, | |||||
| FormatDesc.glFormat, FormatDesc.glDataFormat, Data) | FormatDesc.glFormat, FormatDesc.glDataFormat, Data) | ||||
| end else begin | end else begin | ||||
| glTexImage2D(aTarget, 0, FormatDesc.glInternalFormat, Width, Height, 0, | |||||
| glTexImage2D(Target, 0, FormatDesc.glInternalFormat, Width, Height, 0, | |||||
| FormatDesc.glFormat, FormatDesc.glDataFormat, Data); | FormatDesc.glFormat, FormatDesc.glDataFormat, Data); | ||||
| end; | end; | ||||
| @@ -7536,10 +7622,11 @@ begin | |||||
| try | try | ||||
| glPixelStorei(GL_PACK_ALIGNMENT, 1); | glPixelStorei(GL_PACK_ALIGNMENT, 1); | ||||
| glReadPixels(aLeft, aTop, w, h, FormatDesc.glFormat, FormatDesc.glDataFormat, Temp); | 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; | FlipVert; | ||||
| except | except | ||||
| FreeMem(Temp); | |||||
| if Assigned(Temp) then | |||||
| FreeMem(Temp); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -7577,9 +7664,10 @@ begin | |||||
| glGetCompressedTexImage(Target, 0, Temp) | glGetCompressedTexImage(Target, 0, Temp) | ||||
| else | else | ||||
| glGetTexImage(Target, 0, FormatDesc.glInternalFormat, FormatDesc.glDataFormat, Temp); | 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 | except | ||||
| FreeMem(Temp); | |||||
| if Assigned(Temp) then | |||||
| FreeMem(Temp); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -7600,14 +7688,13 @@ begin | |||||
| PotTex := IsPowerOfTwo(Height) and IsPowerOfTwo(Width); | 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); | 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 | 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 EglBitmapNonPowerOfTwoException.Create('TglBitmap2D.GenTexture - Rendercontex dosn''t support non power of two texture.'); | ||||
| end; | end; | ||||
| CreateId; | CreateId; | ||||
| SetupParameters(BuildWithGlu); | SetupParameters(BuildWithGlu); | ||||
| UploadData(Target, BuildWithGlu); | |||||
| UploadData(BuildWithGlu); | |||||
| glAreTexturesResident(1, @fID, @fIsResident); | glAreTexturesResident(1, @fID, @fIsResident); | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -7635,10 +7722,11 @@ begin | |||||
| Dec(TempDestData, fPixelSize); | Dec(TempDestData, fPixelSize); | ||||
| end; | end; | ||||
| end; | end; | ||||
| SetDataPointer(DestData, Format); | |||||
| SetDataPointer(DestData, Format); //be careful, Data could be freed by this method | |||||
| result := true; | result := true; | ||||
| except | except | ||||
| FreeMem(DestData); | |||||
| if Assigned(DestData) then | |||||
| FreeMem(DestData); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -7662,10 +7750,11 @@ begin | |||||
| Dec(TempDestData, fRowSize); | Dec(TempDestData, fRowSize); | ||||
| Inc(SourceData, fRowSize); | Inc(SourceData, fRowSize); | ||||
| end; | end; | ||||
| SetDataPointer(DestData, Format); | |||||
| SetDataPointer(DestData, Format); //be careful, Data could be freed by this method | |||||
| result := true; | result := true; | ||||
| except | except | ||||
| FreeMem(DestData); | |||||
| if Assigned(DestData) then | |||||
| FreeMem(DestData); | |||||
| raise; | raise; | ||||
| end; | end; | ||||
| 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 } | { TglBitmapCubeMap } | ||||