{.$DEFINE GLB_DELPHI}
// activate to enable the support for TLazIntfImage from Lazarus
-{$DEFINE GLB_LAZARUS}
+{.$DEFINE GLB_LAZARUS}
+// activate to enable Lazarus TPortableNetworkGraphic support
+// if you enable this pngImage and libPNG will be ignored
+{.$DEFINE GLB_LAZ_PNG}
+
// activate to enable png support with the unit pngimage -> http://pngdelphi.sourceforge.net/
// if you enable pngimage the libPNG will be ignored
{.$DEFINE GLB_PNGIMAGE}
+// activate to enable Lazarus TJPEGImage support
+// if you enable this delphi jpegs and libJPEG will be ignored
+{.$DEFINE GLB_LAZ_JPEG}
+
// if you enable delphi jpegs the libJPEG will be ignored
{.$DEFINE GLB_DELPHI_JPEG}
{$MESSAGE warn 'SDL_image won''t work without SDL. SDL will be activated.'}
{$DEFINE GLB_SDL}
{$ENDIF}
+
+ {$IFDEF GLB_LAZ_PNG}
+ {$MESSAGE warn 'The Lazarus TPortableNetworkGraphics will be ignored because you are using SDL_image.'}
+ {$undef GLB_LAZ_PNG}
+ {$ENDIF}
+
{$IFDEF GLB_PNGIMAGE}
{$MESSAGE warn 'The unit pngimage will be ignored because you are using SDL_image.'}
{$undef GLB_PNGIMAGE}
{$ENDIF}
+
+ {$IFDEF GLB_LAZ_JPEG}
+ {$MESSAGE warn 'The Lazarus TJPEGImage will be ignored because you are using SDL_image.'}
+ {$undef GLB_LAZ_JPEG}
+ {$ENDIF}
+
{$IFDEF GLB_DELPHI_JPEG}
{$MESSAGE warn 'The unit JPEG will be ignored because you are using SDL_image.'}
{$undef GLB_DELPHI_JPEG}
{$ENDIF}
+
{$IFDEF GLB_LIB_PNG}
{$MESSAGE warn 'The library libPNG will be ignored because you are using SDL_image.'}
{$undef GLB_LIB_PNG}
{$ENDIF}
+
{$IFDEF GLB_LIB_JPEG}
{$MESSAGE warn 'The library libJPEG will be ignored because you are using SDL_image.'}
{$undef GLB_LIB_JPEG}
{$DEFINE GLB_SUPPORT_JPEG_READ}
{$ENDIF}
+// Lazarus TPortableNetworkGraphic
+{$IFDEF GLB_LAZ_PNG}
+ {$IFNDEF GLB_LAZARUS}
+ {$MESSAGE warn 'Lazarus TPortableNetworkGraphic won''t work without Lazarus. Lazarus will be activated.'}
+ {$DEFINE GLB_LAZARUS}
+ {$ENDIF}
+
+ {$IFDEF GLB_PNGIMAGE}
+ {$MESSAGE warn 'The pngimage will be ignored if you are using Lazarus TPortableNetworkGraphic.'}
+ {$undef GLB_PNGIMAGE}
+ {$ENDIF}
+
+ {$IFDEF GLB_LIB_PNG}
+ {$MESSAGE warn 'The library libPNG will be ignored if you are using Lazarus TPortableNetworkGraphic.'}
+ {$undef GLB_LIB_PNG}
+ {$ENDIF}
+
+ {$DEFINE GLB_SUPPORT_PNG_READ}
+ {$DEFINE GLB_SUPPORT_PNG_WRITE}
+{$ENDIF}
+
// PNG Image
{$IFDEF GLB_PNGIMAGE}
{$IFDEF GLB_LIB_PNG}
{$DEFINE GLB_SUPPORT_PNG_WRITE}
{$ENDIF}
+// Lazarus TJPEGImage
+{$IFDEF GLB_LAZ_JPEG}
+ {$IFNDEF GLB_LAZARUS}
+ {$MESSAGE warn 'Lazarus TJPEGImage won''t work without Lazarus. Lazarus will be activated.'}
+ {$DEFINE GLB_LAZARUS}
+ {$ENDIF}
+
+ {$IFDEF GLB_DELPHI_JPEG}
+ {$MESSAGE warn 'The Delphi JPEGImage will be ignored if you are using the Lazarus TJPEGImage.'}
+ {$undef GLB_DELPHI_JPEG}
+ {$ENDIF}
+
+ {$IFDEF GLB_LIB_JPEG}
+ {$MESSAGE warn 'The library libJPEG will be ignored if you are using the Lazarus TJPEGImage.'}
+ {$undef GLB_LIB_JPEG}
+ {$ENDIF}
+
+ {$DEFINE GLB_SUPPORT_JPEG_READ}
+ {$DEFINE GLB_SUPPORT_JPEG_WRITE}
+{$ENDIF}
+
// JPEG Image
{$IFDEF GLB_DELPHI_JPEG}
{$IFDEF GLB_LIB_JPEG}
interface
uses
- {$IFNDEF GLB_NATIVE_OGL} dglOpenGL, {$ENDIF}
+ {$IFNDEF GLB_NATIVE_OGL} dglOpenGL, {$ENDIF}
{$IF DEFINED(GLB_WIN) AND
- DEFINED(GLB_NATIVE_OGL)} windows, {$IFEND}
+ (DEFINED(GLB_NATIVE_OGL) OR
+ DEFINED(GLB_DELPHI))} windows, {$IFEND}
- {$IFDEF GLB_SDL} SDL, {$ENDIF}
- {$IFDEF GLB_LAZARUS} IntfGraphics, GraphType, {$ENDIF}
- {$IFDEF GLB_DELPHI} Dialogs, Graphics, {$ENDIF}
+ {$IFDEF GLB_SDL} SDL, {$ENDIF}
+ {$IFDEF GLB_LAZARUS} IntfGraphics, GraphType, Graphics, {$ENDIF}
+ {$IFDEF GLB_DELPHI} Dialogs, Graphics, Types, {$ENDIF}
- {$IFDEF GLB_SDL_IMAGE} SDL_image, {$ENDIF}
- {$IFDEF GLB_PNGIMAGE} pngimage, {$ENDIF}
- {$IFDEF GLB_LIB_PNG} libPNG, {$ENDIF}
- {$IFDEF GLB_DELPHI_JPEG} JPEG, {$ENDIF}
- {$IFDEF GLB_LIB_JPEG} libJPEG, {$ENDIF}
+ {$IFDEF GLB_SDL_IMAGE} SDL_image, {$ENDIF}
+ {$IFDEF GLB_PNGIMAGE} pngimage, {$ENDIF}
+ {$IFDEF GLB_LIB_PNG} libPNG, {$ENDIF}
+ {$IFDEF GLB_DELPHI_JPEG} JPEG, {$ENDIF}
+ {$IFDEF GLB_LIB_JPEG} libJPEG, {$ENDIF}
Classes, SysUtils;
implementation
uses
- Math, syncobjs, typinfo;
+ Math, syncobjs, typinfo
+ {$IFDEF GLB_DELPHI}, Types{$ENDIF};
type
{$IFNDEF fpc}
procedure Unmap(var aData: PByte; out aPixel: TglBitmapPixelData; var aMapData: Pointer); virtual; abstract;
function GetSize(const aSize: TglBitmapPixelPosition): Integer; overload; virtual;
- function GetSize(const aWidth, aHeight: Integer): Integer; overload; virtual;
+ function GetSize(const aWidth, aHeight: Integer): Integer; overload; virtual;
function CreateMappingData: Pointer; virtual;
procedure FreeMappingData(var aMappingData: Pointer); virtual;
var
GL_LibHandle: Pointer = nil;
-function glbGetProcAddress(aProcName: PChar; aLibHandle: Pointer = nil): Pointer;
+function glbGetProcAddress(aProcName: PAnsiChar; aLibHandle: Pointer = nil; const aRaiseOnErr: Boolean = true): Pointer;
begin
if not Assigned(aLibHandle) then
aLibHandle := GL_LibHandle;
result := dlsym(aLibHandle, aProcName);
{$IFEND}
- if not Assigned(result) then
+ if not Assigned(result) and aRaiseOnErr then
raise EglBitmap.Create('unable to load procedure form library: ' + aProcName);
end;
if not Assigned(GLU_LibHandle) then
raise EglBitmap.Create('unable to load library: ' + libglu);
- try
- {$IF DEFINED(GLB_WIN)}
- wglGetProcAddress := glbGetProcAddress('wglGetProcAddress');
- {$ELSEIF DEFINED(GLB_LINUX)}
- glXGetProcAddress := glbGetProcAddress('glXGetProcAddress');
- glXGetProcAddressARB := glbGetProcAddress('glXGetProcAddressARB');
- {$IFEND}
-
- glEnable := glbGetProcAddress('glEnable');
- glDisable := glbGetProcAddress('glDisable');
- glGetString := glbGetProcAddress('glGetString');
- glGetIntegerv := glbGetProcAddress('glGetIntegerv');
- glTexParameteri := glbGetProcAddress('glTexParameteri');
- glTexParameteriv := glbGetProcAddress('glTexParameteriv');
- glTexParameterfv := glbGetProcAddress('glTexParameterfv');
- glGetTexParameteriv := glbGetProcAddress('glGetTexParameteriv');
- glGetTexParameterfv := glbGetProcAddress('glGetTexParameterfv');
- glGetTexLevelParameteriv := glbGetProcAddress('glGetTexLevelParameteriv');
- glGetTexLevelParameterfv := glbGetProcAddress('glGetTexLevelParameterfv');
- glTexGeni := glbGetProcAddress('glTexGeni');
- glGenTextures := glbGetProcAddress('glGenTextures');
- glBindTexture := glbGetProcAddress('glBindTexture');
- glDeleteTextures := glbGetProcAddress('glDeleteTextures');
- glAreTexturesResident := glbGetProcAddress('glAreTexturesResident');
- glReadPixels := glbGetProcAddress('glReadPixels');
- glPixelStorei := glbGetProcAddress('glPixelStorei');
- glTexImage1D := glbGetProcAddress('glTexImage1D');
- glTexImage2D := glbGetProcAddress('glTexImage2D');
- glGetTexImage := glbGetProcAddress('glGetTexImage');
-
- gluBuild1DMipmaps := glbGetProcAddress('gluBuild1DMipmaps', GLU_LibHandle);
- gluBuild2DMipmaps := glbGetProcAddress('gluBuild2DMipmaps', GLU_LibHandle);
- finally
- glbFreeLibrary(GL_LibHandle);
- glbFreeLibrary(GLU_LibHandle);
- end;
+{$IF DEFINED(GLB_WIN)}
+ wglGetProcAddress := glbGetProcAddress('wglGetProcAddress');
+{$ELSEIF DEFINED(GLB_LINUX)}
+ glXGetProcAddress := glbGetProcAddress('glXGetProcAddress');
+ glXGetProcAddressARB := glbGetProcAddress('glXGetProcAddressARB');
+{$IFEND}
+
+ glEnable := glbGetProcAddress('glEnable');
+ glDisable := glbGetProcAddress('glDisable');
+ glGetString := glbGetProcAddress('glGetString');
+ glGetIntegerv := glbGetProcAddress('glGetIntegerv');
+ glTexParameteri := glbGetProcAddress('glTexParameteri');
+ glTexParameteriv := glbGetProcAddress('glTexParameteriv');
+ glTexParameterfv := glbGetProcAddress('glTexParameterfv');
+ glGetTexParameteriv := glbGetProcAddress('glGetTexParameteriv');
+ glGetTexParameterfv := glbGetProcAddress('glGetTexParameterfv');
+ glGetTexLevelParameteriv := glbGetProcAddress('glGetTexLevelParameteriv');
+ glGetTexLevelParameterfv := glbGetProcAddress('glGetTexLevelParameterfv');
+ glTexGeni := glbGetProcAddress('glTexGeni');
+ glGenTextures := glbGetProcAddress('glGenTextures');
+ glBindTexture := glbGetProcAddress('glBindTexture');
+ glDeleteTextures := glbGetProcAddress('glDeleteTextures');
+ glAreTexturesResident := glbGetProcAddress('glAreTexturesResident');
+ glReadPixels := glbGetProcAddress('glReadPixels');
+ glPixelStorei := glbGetProcAddress('glPixelStorei');
+ glTexImage1D := glbGetProcAddress('glTexImage1D');
+ glTexImage2D := glbGetProcAddress('glTexImage2D');
+ glGetTexImage := glbGetProcAddress('glGetTexImage');
+
+ gluBuild1DMipmaps := glbGetProcAddress('gluBuild1DMipmaps', GLU_LibHandle);
+ gluBuild2DMipmaps := glbGetProcAddress('gluBuild2DMipmaps', GLU_LibHandle);
end;
{$ENDIF}
glCompressedTexImage2D := glbGetProcAddress('glCompressedTexImage2D');
glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImage');
end else begin
- glCompressedTexImage1D := glbGetProcAddress('glCompressedTexImage1DARB');
- glCompressedTexImage2D := glbGetProcAddress('glCompressedTexImage2DARB');
- glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImageARB');
+ glCompressedTexImage1D := glbGetProcAddress('glCompressedTexImage1DARB', nil, false);
+ glCompressedTexImage2D := glbGetProcAddress('glCompressedTexImage2DARB', nil, false);
+ glGetCompressedTexImage := glbGetProcAddress('glGetCompressedTexImageARB', nil, false);
end;
end;
{$ENDIF}
fData := aData;
end;
- FillChar(fDimension, SizeOf(fDimension), 0);
if not Assigned(fData) then begin
- fFormat := tfEmpty;
fPixelSize := 0;
fRowSize := 0;
end else begin
+ FillChar(fDimension, SizeOf(fDimension), 0);
if aWidth <> -1 then begin
fDimension.Fields := fDimension.Fields + [ffX];
fDimension.X := aWidth;
tfRGBA8, tfBGRA8:
aBitmap.PixelFormat := pf32bit;
else
- raise EglBitmapException.Create('AssignToBitmap - Invalid Pixelformat.');
+ raise EglBitmap.Create('AssignToBitmap - Invalid Pixelformat.');
end;
pSource := Data;
pf32bit:
IntFormat := tfBGRA8;
else
- raise EglBitmapException.Create('AssignFromBitmap - Invalid Pixelformat.');
+ raise EglBitmap.Create('AssignFromBitmap - Invalid Pixelformat.');
end;
TempWidth := aBitmap.Width;
Inc(pSource);
end;
end;
- end;
+ end;
result := true;
end;
end;
rid.Width := Width;
rid.Height := Height;
- rid.Depth := CountSetBits(FormatDesc.Range.r or FormatDesc.Range.g or FormatDesc.Range.b or FormatDesc.Range.a);
+ rid.Depth := CountSetBits(FormatDesc.RedMask or FormatDesc.GreenMask or FormatDesc.BlueMask or FormatDesc.AlphaMask);
rid.BitOrder := riboBitsInOrder;
rid.ByteOrder := riboLSBFirst;
rid.LineOrder := riloTopToBottom;
begin
if aUseRGB or aUseAlpha then
AddFunc(glBitmapInvertFunc, false, {%H-}Pointer(
- ((PtrInt(aUseAlpha) and 1) shl 1) or
- (PtrInt(aUseRGB) and 1) ));
+ ((Byte(aUseAlpha) and 1) shl 1) or
+ (Byte(aUseRGB) and 1) ));
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
end;
{$IFDEF GLB_SUPPORT_PNG_READ}
-{$IF DEFINED(GLB_SDL_IMAGE)}
+{$IF DEFINED(GLB_LAZ_PNG)}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//PNG/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TglBitmap.LoadPNG(const aStream: TStream): Boolean;
+const
+ MAGIC_LEN = 8;
+ PNG_MAGIC: String[MAGIC_LEN] = #$89#$50#$4E#$47#$0D#$0A#$1A#$0A;
+var
+ png: TPortableNetworkGraphic;
+ intf: TLazIntfImage;
+ StreamPos: Int64;
+ magic: String[MAGIC_LEN];
+begin
+ result := true;
+ StreamPos := aStream.Position;
+
+ SetLength(magic, MAGIC_LEN);
+ aStream.Read(magic[1], MAGIC_LEN);
+ aStream.Position := StreamPos;
+ if (magic <> PNG_MAGIC) then begin
+ result := false;
+ exit;
+ end;
+
+ png := TPortableNetworkGraphic.Create;
+ try try
+ png.LoadFromStream(aStream);
+ intf := png.CreateIntfImage;
+ try try
+ AssignFromLazIntfImage(intf);
+ except
+ result := false;
+ aStream.Position := StreamPos;
+ exit;
+ end;
+ finally
+ intf.Free;
+ end;
+ except
+ result := false;
+ aStream.Position := StreamPos;
+ exit;
+ end;
+ finally
+ png.Free;
+ end;
+end;
+
+{$ELSEIF DEFINED(GLB_SDL_IMAGE)}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+function TglBitmap.LoadPNG(const aStream: TStream): Boolean;
var
Surface: PSDL_Surface;
RWops: PSDL_RWops;
// read informations
png_read_info(png, png_info);
- // size
+ // size
TempHeight := png_get_image_height(png, png_info);
TempWidth := png_get_image_width(png, png_info);
end;
{$ENDIF}
-{$IF DEFINED(GLB_LIB_PNG)}
+{$IF DEFINED(GLB_LAZ_PNG)}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmap.SavePNG(const aStream: TStream);
+var
+ png: TPortableNetworkGraphic;
+ intf: TLazIntfImage;
+ raw: TRawImage;
+begin
+ png := TPortableNetworkGraphic.Create;
+ intf := TLazIntfImage.Create(0, 0);
+ try
+ if not AssignToLazIntfImage(intf) then
+ raise EglBitmap.Create('unable to create LazIntfImage from glBitmap');
+ intf.GetRawImage(raw);
+ png.LoadFromRawImage(raw, false);
+ png.SaveToStream(aStream);
+ finally
+ png.Free;
+ intf.Free;
+ end;
+end;
+
+{$ELSEIF DEFINED(GLB_LIB_PNG)}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap.SavePNG(const aStream: TStream);
var
{$ENDIF}
{$IFDEF GLB_SUPPORT_JPEG_READ}
-{$IF DEFINED(GLB_SDL_IMAGE)}
+{$IF DEFINED(GLB_LAZ_JPEG)}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+function TglBitmap.LoadJPEG(const aStream: TStream): Boolean;
+const
+ MAGIC_LEN = 2;
+ JPEG_MAGIC: String[MAGIC_LEN] = #$FF#$D8;
+var
+ jpeg: TJPEGImage;
+ intf: TLazIntfImage;
+ StreamPos: Int64;
+ magic: String[MAGIC_LEN];
+begin
+ result := true;
+ StreamPos := aStream.Position;
+
+ SetLength(magic, MAGIC_LEN);
+ aStream.Read(magic[1], MAGIC_LEN);
+ aStream.Position := StreamPos;
+ if (magic <> JPEG_MAGIC) then begin
+ result := false;
+ exit;
+ end;
+
+ jpeg := TJPEGImage.Create;
+ try try
+ jpeg.LoadFromStream(aStream);
+ intf := TLazIntfImage.Create(0, 0);
+ try try
+ intf.LoadFromBitmap(jpeg.BitmapHandle, jpeg.MaskHandle);
+ AssignFromLazIntfImage(intf);
+ except
+ result := false;
+ aStream.Position := StreamPos;
+ exit;
+ end;
+ finally
+ intf.Free;
+ end;
+ except
+ result := false;
+ aStream.Position := StreamPos;
+ exit;
+ end;
+ finally
+ jpeg.Free;
+ end;
+end;
+
+{$ELSEIF DEFINED(GLB_SDL_IMAGE)}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TglBitmap.LoadJPEG(const aStream: TStream): Boolean;
var
{$ENDIF}
{$IFDEF GLB_SUPPORT_JPEG_WRITE}
-{$IF DEFINED(GLB_LIB_JPEG)}
+{$IF DEFINED(GLB_LAZ_JPEG)}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+procedure TglBitmap.SaveJPEG(const aStream: TStream);
+var
+ jpeg: TJPEGImage;
+ intf: TLazIntfImage;
+ raw: TRawImage;
+begin
+ jpeg := TJPEGImage.Create;
+ intf := TLazIntfImage.Create(0, 0);
+ try
+ if not AssignToLazIntfImage(intf) then
+ raise EglBitmap.Create('unable to create LazIntfImage from glBitmap');
+ intf.GetRawImage(raw);
+ jpeg.LoadFromRawImage(raw, false);
+ jpeg.SaveToStream(aStream);
+ finally
+ intf.Free;
+ jpeg.Free;
+ end;
+end;
+
+{$ELSEIF DEFINED(GLB_LIB_JPEG)}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TglBitmap.SaveJPEG(const aStream: TStream);
var
var
Header: TBMPHeader;
Info: TBMPInfo;
- Converter: TbmpColorTableFormat;
+ Converter: TFormatDescriptor;
FormatDesc: TFormatDescriptor;
SourceFD, DestFD: Pointer;
pData, srcData, dstData, ConvertBuffer: pByte;
Info.biBitCount := 4;
Header.bfSize := Header.bfSize + 16 * SizeOf(Cardinal);
Header.bfOffBits := Header.bfOffBits + 16 * SizeOf(Cardinal); //16 ColorTable entries
- Converter := TbmpColorTableFormat.Create;
- Converter.PixelSize := 0.5;
- Converter.Format := Format;
- Converter.Range := glBitmapColorRec($F, $F, $F, $0);
- Converter.CreateColorTable;
+ Converter := TbmpColorTableFormat.Create;
+ with (Converter as TbmpColorTableFormat) do begin
+ PixelSize := 0.5;
+ Format := Format;
+ Range := glBitmapColorRec($F, $F, $F, $0);
+ CreateColorTable;
+ end;
end;
tfR3G3B2, tfLuminance8: begin
Info.biBitCount := 8;
Header.bfSize := Header.bfSize + 256 * SizeOf(Cardinal);
Header.bfOffBits := Header.bfOffBits + 256 * SizeOf(Cardinal); //256 ColorTable entries
- Converter := TbmpColorTableFormat.Create;
- Converter.PixelSize := 1;
- Converter.Format := Format;
- if (Format = tfR3G3B2) then begin
- Converter.Range := glBitmapColorRec($7, $7, $3, $0);
- Converter.Shift := glBitmapShiftRec(0, 3, 6, 0);
- end else
- Converter.Range := glBitmapColorRec($FF, $FF, $FF, $0);
- Converter.CreateColorTable;
+ Converter := TbmpColorTableFormat.Create;
+ with (Converter as TbmpColorTableFormat) do begin
+ PixelSize := 1;
+ Format := Format;
+ if (Format = tfR3G3B2) then begin
+ Range := glBitmapColorRec($7, $7, $3, $0);
+ Shift := glBitmapShiftRec(0, 3, 6, 0);
+ end else
+ Range := glBitmapColorRec($FF, $FF, $FF, $0);
+ CreateColorTable;
+ end;
end;
tfRGB4, tfRGB5, tfR5G6B5, tfRGB5A1, tfRGBA4,
tfBGR8, tfRGB8: begin
Info.biBitCount := 24;
+ if (Format = tfRGB8) then
+ Converter := TfdBGR8.Create; //use BGR8 Format Descriptor to Swap RGB Values
end;
tfRGB10, tfRGB10A2, tfRGBA8,
aStream.Write(Info, SizeOf(Info));
// colortable
- if Assigned(Converter) then
- aStream.Write(Converter.ColorTable[0].b,
- SizeOf(TbmpColorTableEnty) * Length(Converter.ColorTable));
+ if Assigned(Converter) and (Converter is TbmpColorTableFormat) then
+ with (Converter as TbmpColorTableFormat) do
+ aStream.Write(ColorTable[0].b,
+ SizeOf(TbmpColorTableEnty) * Length(ColorTable));
// bitmasks
if Info.biCompression = BMP_COMP_BITFIELDS then begin
if Header.ImageID <> 0 then // skip image ID
aStream.Position := aStream.Position + Header.ImageID;
- tgaFormat := tfEmpty;
+ tgaFormat := tfEmpty;
case Header.Bpp of
8: if IsGrayFormat then case (Header.ImageDesc and $F) of
0: tgaFormat := tfLuminance8;
begin
// Upload data
FormatDesc := TFormatDescriptor.Get(Format);
- if FormatDesc.IsCompressed then
+ if FormatDesc.IsCompressed then begin
+ if not Assigned(glCompressedTexImage1D) then
+ raise EglBitmap.Create('compressed formats not supported by video adapter');
glCompressedTexImage1D(Target, 0, FormatDesc.glInternalFormat, Width, 0, FormatDesc.GetSize(Width, 1), Data)
- else if aBuildWithGlu then
+ end 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);
FormatDesc := TFormatDescriptor.Get(Format);
if FormatDesc.IsCompressed then begin
+ if not Assigned(glCompressedTexImage2D) then
+ raise EglBitmap.Create('compressed formats not supported by video adapter');
glCompressedTexImage2D(aTarget, 0, FormatDesc.glInternalFormat, Width, Height, 0, FormatDesc.GetSize(fDimension), Data)
end else if aBuildWithGlu then begin
gluBuild2DMipmaps(aTarget, FormatDesc.Components, Width, Height,
FormatDesc := TFormatDescriptor.Get(IntFormat);
GetMem(Temp, FormatDesc.GetSize(TempWidth, TempHeight));
try
- if FormatDesc.IsCompressed then
+ if FormatDesc.IsCompressed then begin
+ if not Assigned(glGetCompressedTexImage) then
+ raise EglBitmap.Create('compressed formats not supported by video adapter');
glGetCompressedTexImage(Target, 0, Temp)
- else
- glGetTexImage(Target, 0, FormatDesc.glInternalFormat, FormatDesc.glDataFormat, Temp);
+ end else
+ glGetTexImage(Target, 0, FormatDesc.glFormat, FormatDesc.glDataFormat, Temp);
SetDataPointer(Temp, IntFormat, TempWidth, TempHeight); //be careful, Data could be freed by this method
except
if Assigned(Temp) then
finalization
TFormatDescriptor.Finalize;
+{$IFDEF GLB_NATIVE_OGL}
+ if Assigned(GL_LibHandle) then
+ glbFreeLibrary(GL_LibHandle);
+
{$IFDEF GLB_NATIVE_OGL_DYNAMIC}
+ if Assigned(GLU_LibHandle) then
+ glbFreeLibrary(GLU_LibHandle);
FreeAndNil(InitOpenGLCS);
{$ENDIF}
+{$ENDIF}
end.
-