mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 22:29:32 +02:00
+ Small improvements. More cosmetic in nature
This commit is contained in:
parent
213ac636c8
commit
2e410c3c8a
@ -14,7 +14,10 @@
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
}
|
}
|
||||||
{*****************************************************************************}
|
{*****************************************************************************}
|
||||||
{$mode objfpc}{$h+}
|
|
||||||
|
{$mode objfpc}
|
||||||
|
{$h+}
|
||||||
|
|
||||||
unit FPReadBMP;
|
unit FPReadBMP;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
@ -24,15 +27,17 @@ uses FPImage, classes, sysutils, BMPcomn;
|
|||||||
type
|
type
|
||||||
TFPReaderBMP = class (TFPCustomImageReader)
|
TFPReaderBMP = class (TFPCustomImageReader)
|
||||||
Private
|
Private
|
||||||
Procedure FreeBufs;
|
Procedure FreeBufs; // Free (and nil) buffers.
|
||||||
protected
|
protected
|
||||||
ReadSize:Integer;
|
ReadSize : Integer; // Size (in bytes) of 1 scanline.
|
||||||
BFI:TBitMapInfoHeader;
|
BFI : TBitMapInfoHeader; // The header as read from the stream.
|
||||||
FPalette : PFPcolor;
|
FPalette : PFPcolor; // Buffer with Palette entries.
|
||||||
LineBuf : PByte; // Byte , TColorRGB or TColorRGBA
|
LineBuf : PByte; // Buffer for 1 scanline. Can be Byte, TColorRGB or TColorRGBA
|
||||||
|
|
||||||
|
// SetupRead will allocate the needed buffers, and read the colormap if needed.
|
||||||
|
procedure SetupRead(nPalette, nRowBits: Integer; Stream : TStream); virtual;
|
||||||
procedure ReadScanLine(Row : Integer; Stream : TStream);
|
procedure ReadScanLine(Row : Integer; Stream : TStream);
|
||||||
procedure WriteScanLine(Row : Integer; Img : TFPCustomImage);
|
procedure WriteScanLine(Row : Integer; Img : TFPCustomImage);
|
||||||
procedure SetupRead(nPalette, nRowBits: Integer; Stream : TStream); virtual;
|
|
||||||
procedure InternalRead (Stream:TStream; Img:TFPCustomImage); override;
|
procedure InternalRead (Stream:TStream; Img:TFPCustomImage); override;
|
||||||
function InternalCheck (Stream:TStream) : boolean; override;
|
function InternalCheck (Stream:TStream) : boolean; override;
|
||||||
public
|
public
|
||||||
@ -43,7 +48,7 @@ type
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
|
||||||
function MakeFpColor(RGBA: TColorRGBA):TFPcolor;
|
function RGBAToFPColor(Const RGBA: TColorRGBA) : TFPcolor;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
with Result, RGBA do
|
with Result, RGBA do
|
||||||
@ -51,7 +56,19 @@ begin
|
|||||||
Red :=(R shl 8) or R;
|
Red :=(R shl 8) or R;
|
||||||
Green :=(G shl 8) or G;
|
Green :=(G shl 8) or G;
|
||||||
Blue :=(B shl 8) or B;
|
Blue :=(B shl 8) or B;
|
||||||
alpha :=AlphaOpaque;
|
alpha :=A; //!! MVC: Used to be AlphaOpaque ???
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function RGBToFPColor(Const RGB : TColorRGB) : TFPColor;
|
||||||
|
|
||||||
|
begin
|
||||||
|
with Result,RGB do
|
||||||
|
begin {Use only the high byte to convert the color}
|
||||||
|
Red := (R shl 8) + R;
|
||||||
|
Green := (G shl 8) + G;
|
||||||
|
Blue := (B shl 8) + B;
|
||||||
|
Alpha := AlphaOpaque;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -99,7 +116,7 @@ begin
|
|||||||
else // Seems to me that this is dangerous.
|
else // Seems to me that this is dangerous.
|
||||||
Stream.Read(ColInfo[0],nPalette*SizeOf(TColorRGBA));
|
Stream.Read(ColInfo[0],nPalette*SizeOf(TColorRGBA));
|
||||||
for i := 0 to High(ColInfo) do
|
for i := 0 to High(ColInfo) do
|
||||||
FPalette[i] := MakeFpColor(ColInfo[i]);
|
FPalette[i] := RGBAToFPColor(ColInfo[i]);
|
||||||
end
|
end
|
||||||
else if BFI.ClrUsed>0 then { Skip palette }
|
else if BFI.ClrUsed>0 then { Skip palette }
|
||||||
Stream.Position := Stream.Position + BFI.ClrUsed*SizeOf(TColorRGBA);
|
Stream.Position := Stream.Position + BFI.ClrUsed*SizeOf(TColorRGBA);
|
||||||
@ -118,6 +135,8 @@ begin
|
|||||||
Stream.Position:=Stream.Position-SizeOf(BFI)+BFI.Size;
|
Stream.Position:=Stream.Position-SizeOf(BFI)+BFI.Size;
|
||||||
with BFI do
|
with BFI do
|
||||||
begin
|
begin
|
||||||
|
if (Compression<>0) then
|
||||||
|
Raise FPImageException.Create('Compressed bitmaps not supported');
|
||||||
Img.Width:=Width;
|
Img.Width:=Width;
|
||||||
Img.Height:=Height;
|
Img.Height:=Height;
|
||||||
end;
|
end;
|
||||||
@ -129,23 +148,29 @@ begin
|
|||||||
8 :
|
8 :
|
||||||
SetupRead(256,Img.Width*8,Stream);
|
SetupRead(256,Img.Width*8,Stream);
|
||||||
16 :
|
16 :
|
||||||
Raise Exception.Create('16 bpp bitmaps not supported');
|
Raise FPImageException.Create('16 bpp bitmaps not supported');
|
||||||
24:
|
24:
|
||||||
SetupRead(0,Img.Width*8*3,Stream);
|
SetupRead(0,Img.Width*8*3,Stream);
|
||||||
32:
|
32:
|
||||||
SetupRead(0,Img.Width*8*4,Stream);
|
SetupRead(0,Img.Width*8*4,Stream);
|
||||||
end;
|
end;
|
||||||
|
Try
|
||||||
for Row:=Img.Height-1 downto 0 do
|
for Row:=Img.Height-1 downto 0 do
|
||||||
begin
|
begin
|
||||||
ReadScanLine(Row,Stream);
|
ReadScanLine(Row,Stream); // Scanline in LineBuf with Size ReadSize.
|
||||||
WriteScanLine(Row,Img);
|
WriteScanLine(Row,Img);
|
||||||
end;
|
end;
|
||||||
|
finally
|
||||||
|
FreeBufs;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFPReaderBMP.ReadScanLine(Row : Integer; Stream : TStream);
|
procedure TFPReaderBMP.ReadScanLine(Row : Integer; Stream : TStream);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
// Add here support for compressed lines. The 'readsize' is the same
|
{
|
||||||
|
Add here support for compressed lines. The 'readsize' is the same in the end.
|
||||||
|
}
|
||||||
Stream.Read(LineBuf[0],ReadSize);
|
Stream.Read(LineBuf[0],ReadSize);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -170,20 +195,13 @@ begin
|
|||||||
for Column:=0 to img.Width-1 do
|
for Column:=0 to img.Width-1 do
|
||||||
img.colors[Column,Row]:=FPalette[LineBuf[Column]];
|
img.colors[Column,Row]:=FPalette[LineBuf[Column]];
|
||||||
16 :
|
16 :
|
||||||
Raise Exception.Create('16 bpp bitmaps not supported');
|
Raise FPImageException.Create('16 bpp bitmaps not supported');
|
||||||
24 :
|
24 :
|
||||||
for Column:=0 to img.Width-1 do
|
for Column:=0 to img.Width-1 do
|
||||||
with PColorRGB(LineBuf)[Column],aColor do
|
img.colors[Column,Row]:=RGBToFPColor(PColorRGB(LineBuf)[Column]);
|
||||||
begin {Use only the high byte to convert the color}
|
|
||||||
Red := (R shl 8) + R;
|
|
||||||
Green := (G shl 8) + G;
|
|
||||||
Blue := (B shl 8) + B;
|
|
||||||
alpha := AlphaOpaque;
|
|
||||||
img.colors[Column,Row]:=aColor;
|
|
||||||
end;
|
|
||||||
32 :
|
32 :
|
||||||
for Column:=0 to img.Width-1 do
|
for Column:=0 to img.Width-1 do
|
||||||
img.colors[Column,Row]:=MakeFpColor(PColorRGBA(LineBuf)[Column]);
|
img.colors[Column,Row]:=RGBAToFPColor(PColorRGBA(LineBuf)[Column]);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -202,7 +220,10 @@ initialization
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.7 2004-02-20 22:42:44 michael
|
Revision 1.8 2004-02-20 23:00:35 michael
|
||||||
|
+ Small improvements. More cosmetic in nature
|
||||||
|
|
||||||
|
Revision 1.7 2004/02/20 22:42:44 michael
|
||||||
+ More modular reading of BMP for easier overriding in descendents
|
+ More modular reading of BMP for easier overriding in descendents
|
||||||
|
|
||||||
Revision 1.6 2004/02/15 20:59:06 michael
|
Revision 1.6 2004/02/15 20:59:06 michael
|
||||||
|
Loading…
Reference in New Issue
Block a user