Browse Source

* implemented RAW file format

master
Bergmann89 10 years ago
parent
commit
3c0bac2982
1 changed files with 125 additions and 9 deletions
  1. +125
    -9
      glBitmap.pas

+ 125
- 9
glBitmap.pas View File

@@ -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/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Loading…
Cancel
Save