Commit 3c0bac29 authored by Bergmann89's avatar Bergmann89

* implemented RAW file format

parent 8b8a4ade
......@@ -859,7 +859,8 @@ type
{$IFDEF GLB_SUPPORT_JPEG_WRITE}ftJPEG, {$ENDIF}
ftDDS,
ftTGA,
ftBMP);
ftBMP,
ftRAW);
TglBitmapFileTypes = set of TglBitmapFileType;
TglBitmapMipMap = (
......@@ -1201,14 +1202,17 @@ type
{$IFDEF GLB_SUPPORT_JPEG_READ} function LoadJPEG(const aStream: TStream): Boolean; virtual; {$ENDIF}
{$IFDEF GLB_SUPPORT_JPEG_WRITE} procedure SaveJPEG(const aStream: TStream); virtual; {$ENDIF}
function LoadBMP(const aStream: TStream): Boolean; virtual;
procedure SaveBMP(const aStream: TStream); virtual;
function LoadRAW(const aStream: TStream): Boolean;
procedure SaveRAW(const aStream: TStream);
function LoadTGA(const aStream: TStream): Boolean; virtual;
procedure SaveTGA(const aStream: TStream); virtual;
function LoadBMP(const aStream: TStream): Boolean;
procedure SaveBMP(const aStream: TStream);
function LoadDDS(const aStream: TStream): Boolean; virtual;
procedure SaveDDS(const aStream: TStream); virtual;
function LoadTGA(const aStream: TStream): Boolean;
procedure SaveTGA(const aStream: TStream);
function LoadDDS(const aStream: TStream): Boolean;
procedure SaveDDS(const aStream: TStream);
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
......@@ -1293,6 +1297,7 @@ function glBitmapPosition(X: Integer = -1; Y: Integer = -1): TglBitmapPixelPosit
function glBitmapRec4ub(const r, g, b, a: Byte): TglBitmapRec4ub;
function glBitmapRec4ui(const r, g, b, a: Cardinal): TglBitmapRec4ui;
function glBitmapRec4ul(const r, g, b, a: QWord): TglBitmapRec4ul;
function glBitmapRec4ubCompare(const r1, r2: TglBitmapRec4ub): Boolean;
function glBitmapRec4uiCompare(const r1, r2: TglBitmapRec4ui): Boolean;
function glBitmapCreateTestTexture(const aFormat: TglBitmapFormat): TglBitmap2D;
......@@ -1344,11 +1349,14 @@ type
function MaskMatch(const aMask: TglBitmapRec4ul): Boolean; virtual;
procedure PreparePixel(out aPixel: TglBitmapPixelData); virtual;
constructor Create; virtual;
public
class procedure Init;
class function Get(const aFormat: TglBitmapFormat): TFormatDescriptor;
class function GetAlpha(const aFormat: TglBitmapFormat): TFormatDescriptor;
class function GetFromMask(const aMask: TglBitmapRec4ul; const aBitCount: Integer = 0): TFormatDescriptor;
class function GetFromPrecShift(const aPrec, aShift: TglBitmapRec4ub; const aBitCount: Integer): TFormatDescriptor;
class procedure Clear;
class procedure Finalize;
end;
......@@ -1889,6 +1897,18 @@ begin
result.a := a;
end;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function glBitmapRec4ubCompare(const r1, r2: TglBitmapRec4ub): Boolean;
var
i: Integer;
begin
result := false;
for i := 0 to high(r1.arr) do
if (r1.arr[i] <> r2.arr[i]) then
exit;
result := true;
end;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function glBitmapRec4uiCompare(const r1, r2: TglBitmapRec4ui): Boolean;
var
......@@ -2493,6 +2513,12 @@ begin
aPixel.Range := Range;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TFormatDescriptor.Create;
begin
inherited Create;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TfdAlpha_UB1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
......@@ -3869,7 +3895,7 @@ end;
procedure TfdS3tcDtx5RGBA.SetValues;
begin
inherited Create;
inherited SetValues;
fFormat := tfS3tcDtx3RGBA;
fWithAlpha := tfS3tcDtx3RGBA;
fOpenGLFormat := tfS3tcDtx3RGBA;
......@@ -4022,7 +4048,36 @@ begin
exit;
end;
result := FormatDescriptors[tfEmpty];
result := TFormatDescriptor.Get(tfEmpty);
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class function TFormatDescriptor.GetFromPrecShift(const aPrec, aShift: TglBitmapRec4ub; const aBitCount: Integer): TFormatDescriptor;
var
ft: TglBitmapFormat;
begin
// find matching format with OpenGL support
for ft := High(TglBitmapFormat) downto Low(TglBitmapFormat) do begin
result := Get(ft);
if glBitmapRec4ubCompare(result.Shift, aShift) and
glBitmapRec4ubCompare(result.Precision, aPrec) and
(result.glFormat <> 0) and
(result.glInternalFormat <> 0) and
((aBitCount = 0) or (aBitCount = result.BitsPerPixel))
then
exit;
end;
// find matching format without OpenGL Support
for ft := High(TglBitmapFormat) downto Low(TglBitmapFormat) do begin
result := Get(ft);
if glBitmapRec4ubCompare(result.Shift, aShift) and
glBitmapRec4ubCompare(result.Precision, aPrec) and
((aBitCount = 0) or (aBitCount = result.BitsPerPixel)) then
exit;
end;
result := TFormatDescriptor.Get(tfEmpty);
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
......@@ -4653,6 +4708,7 @@ begin
if not LoadDDS(aStream) then
if not LoadTGA(aStream) then
if not LoadBMP(aStream) then
if not LoadRAW(aStream) then
raise EglBitmap.Create('LoadFromStream - Couldn''t load Stream. It''s possible to be an unknow Streamtype.');
end;
......@@ -4730,6 +4786,7 @@ begin
ftDDS: SaveDDS(aStream);
ftTGA: SaveTGA(aStream);
ftBMP: SaveBMP(aStream);
ftRAW: SaveRAW(aStream);
end;
end;
......@@ -6977,6 +7034,65 @@ end;
{$IFEND}
{$ENDIF}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//RAW/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type
RawHeader = packed record
Magic: String[5];
Version: Byte;
Width: Integer;
Height: Integer;
DataSize: Integer;
BitsPerPixel: Integer;
Precision: TglBitmapRec4ub;
Shift: TglBitmapRec4ub;
end;
function TglBitmap.LoadRAW(const aStream: TStream): Boolean;
var
header: RawHeader;
StartPos: Int64;
fd: TFormatDescriptor;
buf: PByte;
begin
result := false;
StartPos := aStream.Position;
aStream.Read(header{%H-}, SizeOf(header));
if (header.Magic <> 'glBMP') then begin
aStream.Position := StartPos;
exit;
end;
fd := TFormatDescriptor.GetFromPrecShift(header.Precision, header.Shift, header.BitsPerPixel);
if (fd.Format = tfEmpty) then
raise EglBitmapUnsupportedFormat.Create('no supported format found');
buf := GetMem(header.DataSize);
aStream.Read(buf^, header.DataSize);
SetDataPointer(buf, fd.Format, header.Width, header.Height);
result := true;
end;
procedure TglBitmap.SaveRAW(const aStream: TStream);
var
header: RawHeader;
fd: TFormatDescriptor;
begin
fd := TFormatDescriptor.Get(Format);
header.Magic := 'glBMP';
header.Version := 1;
header.Width := Width;
header.Height := Height;
header.DataSize := fd.GetSize(fDimension);
header.BitsPerPixel := fd.BitsPerPixel;
header.Precision := fd.Precision;
header.Shift := fd.Shift;
aStream.Write(header, SizeOf(header));
aStream.Write(Data^, header.DataSize);
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//BMP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment