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