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} {$IFDEF GLB_SUPPORT_JPEG_WRITE}ftJPEG, {$ENDIF}
ftDDS, ftDDS,
ftTGA, ftTGA,
ftBMP);
ftBMP,
ftRAW);
TglBitmapFileTypes = set of TglBitmapFileType; TglBitmapFileTypes = set of TglBitmapFileType;


TglBitmapMipMap = ( TglBitmapMipMap = (
@@ -1201,14 +1202,17 @@ type
{$IFDEF GLB_SUPPORT_JPEG_READ} function LoadJPEG(const aStream: TStream): Boolean; virtual; {$ENDIF} {$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} {$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; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1293,6 +1297,7 @@ function glBitmapPosition(X: Integer = -1; Y: Integer = -1): TglBitmapPixelPosit
function glBitmapRec4ub(const r, g, b, a: Byte): TglBitmapRec4ub; function glBitmapRec4ub(const r, g, b, a: Byte): TglBitmapRec4ub;
function glBitmapRec4ui(const r, g, b, a: Cardinal): TglBitmapRec4ui; function glBitmapRec4ui(const r, g, b, a: Cardinal): TglBitmapRec4ui;
function glBitmapRec4ul(const r, g, b, a: QWord): TglBitmapRec4ul; function glBitmapRec4ul(const r, g, b, a: QWord): TglBitmapRec4ul;
function glBitmapRec4ubCompare(const r1, r2: TglBitmapRec4ub): Boolean;
function glBitmapRec4uiCompare(const r1, r2: TglBitmapRec4ui): Boolean; function glBitmapRec4uiCompare(const r1, r2: TglBitmapRec4ui): Boolean;


function glBitmapCreateTestTexture(const aFormat: TglBitmapFormat): TglBitmap2D; function glBitmapCreateTestTexture(const aFormat: TglBitmapFormat): TglBitmap2D;
@@ -1344,11 +1349,14 @@ type
function MaskMatch(const aMask: TglBitmapRec4ul): Boolean; virtual; function MaskMatch(const aMask: TglBitmapRec4ul): Boolean; virtual;


procedure PreparePixel(out aPixel: TglBitmapPixelData); virtual; procedure PreparePixel(out aPixel: TglBitmapPixelData); virtual;

constructor Create; virtual;
public public
class procedure Init; class procedure Init;
class function Get(const aFormat: TglBitmapFormat): TFormatDescriptor; class function Get(const aFormat: TglBitmapFormat): TFormatDescriptor;
class function GetAlpha(const aFormat: TglBitmapFormat): TFormatDescriptor; class function GetAlpha(const aFormat: TglBitmapFormat): TFormatDescriptor;
class function GetFromMask(const aMask: TglBitmapRec4ul; const aBitCount: Integer = 0): 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 Clear;
class procedure Finalize; class procedure Finalize;
end; end;
@@ -1889,6 +1897,18 @@ begin
result.a := a; result.a := a;
end; 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; function glBitmapRec4uiCompare(const r1, r2: TglBitmapRec4ui): Boolean;
var var
@@ -2493,6 +2513,12 @@ begin
aPixel.Range := Range; aPixel.Range := Range;
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TFormatDescriptor.Create;
begin
inherited Create;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TfdAlpha_UB1//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TfdAlpha_UB1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -3869,7 +3895,7 @@ end;


procedure TfdS3tcDtx5RGBA.SetValues; procedure TfdS3tcDtx5RGBA.SetValues;
begin begin
inherited Create;
inherited SetValues;
fFormat := tfS3tcDtx3RGBA; fFormat := tfS3tcDtx3RGBA;
fWithAlpha := tfS3tcDtx3RGBA; fWithAlpha := tfS3tcDtx3RGBA;
fOpenGLFormat := tfS3tcDtx3RGBA; fOpenGLFormat := tfS3tcDtx3RGBA;
@@ -4022,7 +4048,36 @@ begin
exit; exit;
end; 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; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4653,6 +4708,7 @@ begin
if not LoadDDS(aStream) then if not LoadDDS(aStream) then
if not LoadTGA(aStream) then if not LoadTGA(aStream) then
if not LoadBMP(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.'); raise EglBitmap.Create('LoadFromStream - Couldn''t load Stream. It''s possible to be an unknow Streamtype.');
end; end;


@@ -4730,6 +4786,7 @@ begin
ftDDS: SaveDDS(aStream); ftDDS: SaveDDS(aStream);
ftTGA: SaveTGA(aStream); ftTGA: SaveTGA(aStream);
ftBMP: SaveBMP(aStream); ftBMP: SaveBMP(aStream);
ftRAW: SaveRAW(aStream);
end; end;
end; end;


@@ -6977,6 +7034,65 @@ end;
{$IFEND} {$IFEND}
{$ENDIF} {$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///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //BMP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Loading…
Cancel
Save