Browse Source

* added LibPNG Support

master
Bergmann89 10 years ago
parent
commit
77bababf6d
1 changed files with 61 additions and 64 deletions
  1. +61
    -64
      glBitmap.pas

+ 61
- 64
glBitmap.pas View File

@@ -1,6 +1,10 @@
{***********************************************************
glBitmap by Steffen Xonna aka Lossy eX (2003-2008)
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
@@ -230,7 +234,7 @@ unit glBitmap;
{.$DEFINE GLB_NATIVE_OGL_DYNAMIC}

// activate to enable the support for SDL_surfaces
{$DEFINE GLB_SDL}
{.$DEFINE GLB_SDL}

// activate to enable the support for TBitmap from Delphi (not lazarus)
{.$DEFINE GLB_DELPHI}
@@ -239,7 +243,7 @@ unit glBitmap;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// activate to enable the support of SDL_image to load files. (READ ONLY)
// If you enable SDL_image all other libraries will be ignored!
{$DEFINE GLB_SDL_IMAGE}
{.$DEFINE GLB_SDL_IMAGE}

// activate to enable png support with the unit pngimage. You can download it from http://pngdelphi.sourceforge.net/
// if you enable pngimage the libPNG will be ignored
@@ -248,7 +252,7 @@ unit glBitmap;
// activate to use the libPNG http://www.libpng.org/
// You will need an aditional header.
// http://www.opengl24.de/index.php?cat=header&file=libpng
{.$DEFINE GLB_LIB_PNG}
{$DEFINE GLB_LIB_PNG}

// if you enable delphi jpegs the libJPEG will be ignored
{.$DEFINE GLB_DELPHI_JPEG}
@@ -260,7 +264,7 @@ unit glBitmap;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PRIVATE: DO not change anything! //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PRIVATE: do not change anything! //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Delphi Versions
{$IFDEF fpc}
@@ -677,12 +681,6 @@ var
{$ENDIF}

type
////////////////////////////////////////////////////////////////////////////////////////////////////
EglBitmapException = class(Exception);
EglBitmapSizeToLargeException = class(EglBitmapException);
EglBitmapNonPowerOfTwoException = class(EglBitmapException);
EglBitmapUnsupportedFormat = class(EglBitmapException);

////////////////////////////////////////////////////////////////////////////////////////////////////
TglBitmapFormat = (
tfEmpty = 0, //must be smallest value!
@@ -765,6 +763,14 @@ type
nm3x3,
nm5x5);

////////////////////////////////////////////////////////////////////////////////////////////////////
EglBitmapException = class(Exception);
EglBitmapSizeToLargeException = class(EglBitmapException);
EglBitmapNonPowerOfTwoException = class(EglBitmapException);
EglBitmapUnsupportedFormat = class(EglBitmapException)
constructor Create(const aFormat: TglBitmapFormat);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
TglBitmapColorRec = packed record
case Integer of
@@ -1126,7 +1132,7 @@ implementation
*)

uses
Math, syncobjs;
Math, syncobjs, typinfo;

type
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1651,6 +1657,12 @@ var
FormatDescriptorCS: TCriticalSection;
FormatDescriptors: array[TglBitmapFormat] of TFormatDescriptor;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor EglBitmapUnsupportedFormat.Create(const aFormat: TglBitmapFormat);
begin
inherited Create(GetEnumName(TypeInfo(TglBitmapFormat), Integer(aFormat)));
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function glBitmapPosition(X, Y: Integer): TglBitmapPixelPosition;
begin
@@ -1757,19 +1769,15 @@ begin
tfS3tcDtx1RGBA, tfS3tcDtx3RGBA, tfS3tcDtx5RGBA]) then
result := result + [ftDDS];

(* TODO
{$IFDEF GLB_SUPPORT_PNG_WRITE}
if aFormat in [
tfAlpha4, tfAlpha8, tfAlpha12, tfAlpha16,
tfLuminance4, tfLuminance8, tfLuminance12, tfLuminance16,
tfuminance4Alpha4, tfLuminance6Alpha2, tfLuminance8Alpha8, tfLuminance12Alpha4, tfLuminance12Alpha12, tfLuminance16Alpha16,
tfR3G3B2, tfRGB4, tfRGB5, tfRGB8, tfRGB10, tfRGB12, tfRGB16,
tfRGBA2, tfRGBA4, tfRGB5A1, tfRGBA8, tfRGB10A2, tfRGBA12, tfRGBA16,
tfDepth16, tfDepth24, tfDepth32]
then
tfAlpha8, tfLuminance8, tfLuminance8Alpha8,
tfRGB8, tfRGBA8,
tfBGR8, tfBGRA8] then
result := result + [ftPNG];
{$ENDIF}

(* TODO
{$IFDEF GLB_SUPPORT_JPEG_WRITE}
if Format in [
tfAlpha4, tfAlpha8, tfAlpha12, tfAlpha16,
@@ -1779,16 +1787,6 @@ begin
then
result := result + [ftJPEG];
{$ENDIF}

if aFormat in [
tfAlpha4, tfAlpha8, tfAlpha12, tfAlpha16,
tfLuminance4, tfLuminance8, tfLuminance12, tfLuminance16,
tfuminance4Alpha4, tfLuminance6Alpha2, tfLuminance8Alpha8, tfLuminance12Alpha4, tfLuminance12Alpha12, tfLuminance16Alpha16,
tfR3G3B2, tfRGB4, tfRGB5, tfRGB8, tfRGB10, tfRGB12, tfRGB16,
tfRGBA2, tfRGBA4, tfRGB5A1, tfRGBA8, tfRGB10A2, tfRGBA12, tfRGBA16,
tfDepth16, tfDepth24, tfDepth32]
then
result := result + [ftDDS, ftTGA, ftBMP];
*)
end;

@@ -4220,7 +4218,7 @@ begin
if fFormat = aValue then
exit;
if TFormatDescriptor.Get(Format).PixelSize <> TFormatDescriptor.Get(aValue).PixelSize then
raise EglBitmapUnsupportedFormat.Create('SetFormat');
raise EglBitmapUnsupportedFormat.Create(Format);
SetDataPointer(Data, aValue, Width, Height);
end;

@@ -4491,7 +4489,7 @@ procedure TglBitmap.SaveToStream(const aStream: TStream; const aFileType: TglBit
begin
case aFileType of
{$IFDEF GLB_SUPPORT_PNG_WRITE}
ftPNG: SavePng(aStream);
ftPNG: SavePNG(aStream);
{$ENDIF}
{$IFDEF GLB_SUPPORT_JPEG_WRITE}
ftJPEG: SaveJPEG(aStream);
@@ -4609,7 +4607,7 @@ begin

FormatDesc := TFormatDescriptor.Get(Format);
if FormatDesc.IsCompressed then
raise EglBitmapUnsupportedFormat.Create('AssignToSurface');
raise EglBitmapUnsupportedFormat.Create(Format);

if Assigned(Data) then begin
case Trunc(FormatDesc.PixelSize) of
@@ -4618,7 +4616,7 @@ begin
3: TempDepth := 24;
4: TempDepth := 32;
else
raise EglBitmapUnsupportedFormat.Create('AssignToSurface');
raise EglBitmapUnsupportedFormat.Create(Format);
end;

aSurface := SDL_CreateRGBSurface(SDL_SWSURFACE, Width, Height, TempDepth,
@@ -4952,10 +4950,8 @@ end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TglBitmap.AddAlphaFromFunc(const aFunc: TglBitmapFunction; const aArgs: Pointer): Boolean;
begin
(* TODO
if not FormatIsUncompressed(InternalFormat) then
raise EglBitmapUnsupportedFormatFormat.Create('AddAlphaFromFunc - ' + UNSUPPORTED_FORMAT);
*)
if TFormatDescriptor.Get(Format).IsCompressed then
raise EglBitmapUnsupportedFormat.Create(Format);
result := AddFunc(Self, aFunc, false, TFormatDescriptor.Get(Format).WithAlpha, aArgs);
end;

@@ -5132,7 +5128,7 @@ begin
FormatDesc := TFormatDescriptor.Get(Format);
if Assigned(Data) then begin
if FormatDesc.IsCompressed or not FormatDesc.HasAlpha then
raise EglBitmapUnsupportedFormat.Create('RemoveAlpha');
raise EglBitmapUnsupportedFormat.Create(Format);
result := ConvertTo(FormatDesc.WithoutAlpha);
end;
end;
@@ -5533,7 +5529,7 @@ var
png_info: png_infop;

TempHeight, TempWidth: Integer;
Format: TglBitmapInternalFormat;
Format: TglBitmapFormat;

png_data: pByte;
png_rows: array of pByte;
@@ -5546,9 +5542,9 @@ begin

try
// signature
StreamPos := Stream.Position;
Stream.Read(signature, 8);
Stream.Position := StreamPos;
StreamPos := aStream.Position;
aStream.Read(signature, 8);
aStream.Position := StreamPos;

if png_check_sig(@signature, 8) <> 0 then begin
// png read struct
@@ -5564,7 +5560,7 @@ begin
end;

// set read callback
png_set_read_fn(png, stream, glBitmap_libPNG_read_func);
png_set_read_fn(png, aStream, glBitmap_libPNG_read_func);

// read informations
png_read_info(png, png_info);
@@ -5742,27 +5738,30 @@ var
LineSize: Integer;
ColorType: Integer;
Row: Integer;
FormatDesc: TFormatDescriptor;
begin
if not (ftPNG in FormatGetSupportedFiles (InternalFormat)) then
raise EglBitmapUnsupportedInternalFormat.Create('SavePng - ' + UNSUPPORTED_INTERNAL_FORMAT);
if not (ftPNG in FormatGetSupportedFiles(Format)) then
raise EglBitmapUnsupportedFormat.Create(Format);

if not init_libPNG then
raise Exception.Create('SavePNG - unable to initialize libPNG.');
raise Exception.Create('unable to initialize libPNG.');

try
case FInternalFormat of
ifAlpha, ifLuminance, ifDepth8:
case Format of
tfAlpha8, tfLuminance8:
ColorType := PNG_COLOR_TYPE_GRAY;
ifLuminanceAlpha:
tfLuminance8Alpha8:
ColorType := PNG_COLOR_TYPE_GRAY_ALPHA;
ifBGR8, ifRGB8:
tfBGR8, tfRGB8:
ColorType := PNG_COLOR_TYPE_RGB;
ifBGRA8, ifRGBA8:
tfBGRA8, tfRGBA8:
ColorType := PNG_COLOR_TYPE_RGBA;
else
raise EglBitmapUnsupportedInternalFormat.Create('SavePng - ' + UNSUPPORTED_INTERNAL_FORMAT);
raise EglBitmapUnsupportedFormat.Create(Format);
end;
LineSize := Trunc(FormatGetSize(FInternalFormat) * Width);

FormatDesc := TFormatDescriptor.Get(Format);
LineSize := FormatDesc.GetSize(Width, 1);

// creating array for scanline
SetLength(png_rows, Height);
@@ -5785,12 +5784,12 @@ begin
end;

// set read callback
png_set_write_fn(png, stream, glBitmap_libPNG_write_func, nil);
png_set_write_fn(png, aStream, glBitmap_libPNG_write_func, nil);

// set compression
png_set_compression_level(png, 6);

if InternalFormat in [ifBGR8, ifBGRA8] then
if Format in [tfBGR8, tfBGRA8] then
png_set_bgr(png);

png_set_IHDR(png, png_info, Width, Height, 8, ColorType, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
@@ -6559,7 +6558,7 @@ var

begin
if not (ftBMP in FormatGetSupportedFiles(Format)) then
raise EglBitmapUnsupportedFormat.Create('SaveBMP');
raise EglBitmapUnsupportedFormat.Create(Format);

Converter := nil;
FormatDesc := TFormatDescriptor.Get(Format);
@@ -6624,7 +6623,7 @@ begin
Info.biCompression := BMP_COMP_BITFIELDS;
end;
else
raise EglBitmapUnsupportedFormat.Create('SaveBMP - ' + UNSUPPORTED_FORMAT);
raise EglBitmapUnsupportedFormat.Create(Format);
end;
Info.biXPelsPerMeter := 2835;
Info.biYPelsPerMeter := 2835;
@@ -7020,7 +7019,7 @@ var
Converter: TFormatDescriptor;
begin
if not (ftTGA in FormatGetSupportedFiles(Format)) then
raise EglBitmapUnsupportedFormat.Create('SaveTGA');
raise EglBitmapUnsupportedFormat.Create(Format);

//prepare header
FillChar(Header{%H-}, SizeOf(Header), 0);
@@ -7336,7 +7335,7 @@ var
FormatDesc: TFormatDescriptor;
begin
if not (ftDDS in FormatGetSupportedFiles(Format)) then
raise EglBitmapUnsupportedFormat.Create('SaveDDS');
raise EglBitmapUnsupportedFormat.Create(Format);

FormatDesc := TFormatDescriptor.Get(Format);

@@ -7479,7 +7478,7 @@ var
begin
FormatDesc := TFormatDescriptor.Get(Format);
if FormatDesc.IsCompressed then
raise EglBitmapUnsupportedFormat.Create('TglBitmap2D.GrabScreen');
raise EglBitmapUnsupportedFormat.Create(Format);

w := aRight - aLeft;
h := aBottom - aTop;
@@ -7729,10 +7728,8 @@ var
end;

begin
(* TODO Compression
if not FormatIsUncompressed(InternalFormat) then
raise EglBitmapUnsupportedFormatFormat.Create('TglBitmap2D.ToNormalMap - ' + UNSUPPORTED_FORMAT);
*)
if TFormatDescriptor.Get(Format).IsCompressed then
raise EglBitmapUnsupportedFormat.Create(Format);

if aScale > 100 then
Rec.Scale := 100


Loading…
Cancel
Save