summaryrefslogtreecommitdiff
path: root/img
diff options
context:
space:
mode:
Diffstat (limited to 'img')
-rw-r--r--img/bmpreader.pas102
-rw-r--r--img/fpimg.pas12
-rw-r--r--img/imageio.pas79
3 files changed, 100 insertions, 93 deletions
diff --git a/img/bmpreader.pas b/img/bmpreader.pas
index 9d03bafb..c2693792 100644
--- a/img/bmpreader.pas
+++ b/img/bmpreader.pas
@@ -23,12 +23,17 @@ unit BMPReader;
interface
-uses Classes, GFXBase, ImageIO;
+uses
+ Classes
+ ,GFXBase
+ ,ImageIO
+ ;
type
DWORD = LongWord;
LONG = LongInt;
+
TBitmapFileHeader = packed record
bfType: WORD;
bfSize: DWORD;
@@ -37,6 +42,7 @@ type
bfOffBits: DWORD;
end;
+
TBitmapInfoHeader = packed record
biSize: DWORD;
biWidth: LONG;
@@ -51,6 +57,7 @@ type
biClrImportant: DWORD;
end;
+
PRGBQuad = ^TRGBQuad;
TRGBQuad = packed record
rgbBlue, rgbGreen, rgbRed, rgbReserved: BYTE;
@@ -63,26 +70,23 @@ type
FInfoHeader: TBitmapInfoHeader;
FBMPPalette: PRGBQuad;
FFileStride: LongWord;
-
HeaderBytesRead, PalBytesRead: Integer;
ScanlinesLeft: Integer;
ThisSegmentHeight: Integer;
ScanlinesLeftInSegment: Integer;
ScanlineBytesDone: LongWord;
CurScanline: Pointer;
-
- procedure DoProcessHeaderData(AStream: TStream); override;
- function DoGetImageSegmentStartY(ASegmentHeight: Integer): Integer;
- override;
- procedure InitImageReading; override;
- procedure InitSegmentReading;
- procedure DoProcessImageData(AStream: TStream); override;
+ procedure DoProcessHeaderData(AStream: TStream); override;
+ function DoGetImageSegmentStartY(ASegmentHeight: Integer): Integer; override;
+ procedure InitImageReading; override;
+ procedure InitSegmentReading;
+ procedure DoProcessImageData(AStream: TStream); override;
public
- destructor Destroy; override;
- property FileHeader: TBitmapFileHeader read FFileHeader;
- property InfoHeader: TBitmapInfoHeader read FInfoHeader;
- property BMPPalette: PRGBQuad read FBMPPalette;
- property FileStride: LongWord read FFileStride;
+ destructor Destroy; override;
+ property FileHeader: TBitmapFileHeader read FFileHeader;
+ property InfoHeader: TBitmapInfoHeader read FInfoHeader;
+ property BMPPalette: PRGBQuad read FBMPPalette;
+ property FileStride: LongWord read FFileStride;
end;
@@ -113,7 +117,8 @@ begin
raise EImgOutOfData.Create;
Inc(HeaderBytesRead, HaveRead);
IsFirstRead := False;
- end else
+ end
+ else
IsFirstRead := True;
if HeaderBytesRead < SizeOf(FileHeader) + SizeOf(InfoHeader) then
@@ -154,10 +159,10 @@ begin
BytesToSkip := SizeOf(SkipBuffer);
HaveRead := AStream.Read(SkipBuffer, BytesToSkip);
if HaveRead = 0 then
- if IsFirstRead then
- raise EImgOutOfData.Create
- else
- exit;
+ if IsFirstRead then
+ raise EImgOutOfData.Create
+ else
+ exit; //==>
IsFirstRead := False;
Inc(HeaderBytesRead, HaveRead);
if PalBytesRead < PaletteSize * SizeOf(TGfxPixel) then
@@ -165,7 +170,7 @@ begin
Move(SkipBuffer, PByte(FBMPPalette)[PalBytesRead], HaveRead);
Inc(PalBytesRead, HaveRead);
end;
- end;
+ end; { if }
if HeaderBytesRead = DataOffset then
begin
@@ -174,41 +179,41 @@ begin
if PaletteSize > 0 then
for i := 0 to PaletteSize - 1 do
- begin
- Palette[i].Red := BMPPalette[i].rgbRed * 257;
- Palette[i].Green := BMPPalette[i].rgbGreen * 257;
- Palette[i].Blue := BMPPalette[i].rgbBlue * 257;
- Palette[i].Alpha := 0;
- end;
+ begin
+ Palette[i].Red := BMPPalette[i].rgbRed * 257;
+ Palette[i].Green := BMPPalette[i].rgbGreen * 257;
+ Palette[i].Blue := BMPPalette[i].rgbBlue * 257;
+ Palette[i].Alpha := 0;
+ end;
case InfoHeader.biBitCount of
- 1:
+ 1:
begin
- FFileStride := ((Width + 31) shr 3) and not 3;
- FPixelFormat.FormatType := ftMono;
- end;
- 4:
+ FFileStride := ((Width + 31) shr 3) and not 3;
+ FPixelFormat.FormatType := ftMono;
+ end;
+ 4:
begin
- FFileStride := ((Width + 7) shr 1) and not 3;
- FPixelFormat.FormatType := ftPal4;
- end;
- 8:
+ FFileStride := ((Width + 7) shr 1) and not 3;
+ FPixelFormat.FormatType := ftPal4;
+ end;
+ 8:
begin
- FFileStride := (Width + 3) and not 3;
- FPixelFormat.FormatType := ftPal8;
- end;
+ FFileStride := (Width + 3) and not 3;
+ FPixelFormat.FormatType := ftPal8;
+ end;
24:
begin
FFileStride := (Width * 3 + 3) and not 3;
- FPixelFormat := PixelFormatBGR24;
+ FPixelFormat := PixelFormatBGR24;
end;
else
raise EImgUnsupportedPixelFormat.Create;
- end;
- end;
+ end; { case }
+ end; { if }
HeaderFinished;
- end;
+ end; { if }
end;
function TBMPReader.DoGetImageSegmentStartY(ASegmentHeight: Integer): Integer;
@@ -248,7 +253,8 @@ procedure TBMPReader.DoProcessImageData(AStream: TStream);
ImageFinished
else
InitSegmentReading;
- end else
+ end
+ else
Dec(CurScanline, SegmentStride);
end;
@@ -269,13 +275,15 @@ begin
begin
ScanlineBytesDone := 0;
ScanlineDone
- end else
+ end
+ else
begin
Inc(ScanlineBytesDone, HaveRead);
exit;
end;
ReadMayFail := True;
- end else
+ end
+ else
ReadMayFail := False;
while ScanlinesLeft > 0 do
@@ -288,7 +296,7 @@ begin
if HaveRead = 0 then
if ReadMayFail then
- exit
+ exit //==>
else
raise EImgOutOfData.Create;
@@ -303,7 +311,7 @@ begin
AStream.Position := AStream.Position + FileStride - ToRead;
ReadMayFail := True;
ScanlineDone;
- end;
+ end; { while }
end;
end.
diff --git a/img/fpimg.pas b/img/fpimg.pas
index 87707a97..9c782a04 100644
--- a/img/fpimg.pas
+++ b/img/fpimg.pas
@@ -24,7 +24,11 @@ unit fpImg;
interface
-uses Classes, GFXBase, ImageIO;
+uses
+ Classes
+ ,GFXBase
+ ,ImageIO
+ ;
function CreateImageFromFile(AScreen: TGfxScreen; AReader: TImageReaderClass;
@@ -63,12 +67,10 @@ begin
Reader := AReader.Create;
try
Reader.ProcessHeaderData(AStream);
- Result := AScreen.Display.CreateImage(Reader.Width, Reader.Height,
- Reader.PixelFormat);
+ Result := AScreen.Display.CreateImage(Reader.Width, Reader.Height, Reader.PixelFormat);
if Reader.PaletteSize > 0 then
begin
- Palette := AScreen.CreatePalette(Reader.PaletteSize,
- Reader.Palette);
+ Palette := AScreen.CreatePalette(Reader.PaletteSize, Reader.Palette);
try
Result.Palette := Palette;
finally
diff --git a/img/imageio.pas b/img/imageio.pas
index ffe79cc8..d28c9267 100644
--- a/img/imageio.pas
+++ b/img/imageio.pas
@@ -23,7 +23,11 @@ unit ImageIO;
interface
-uses SysUtils, Classes, GFXBase;
+uses
+ SysUtils
+ ,Classes
+ ,GFXBase
+ ;
resourcestring
SImgOutOfData = 'No more data available for image';
@@ -56,7 +60,6 @@ type
TImageReader = class
private
FState: TImageReaderState;
-
{ Needed for reading of image data. These values must be initialized by
the user via SetImageSegmentBuffer }
FSegmentData: Pointer;
@@ -69,48 +72,43 @@ type
FOnImage: TNotifyEvent;
protected
// Image properties, only available after OnHeaderRead event
- FWidth, FHeight: Integer;
+ FWidth: Integer;
+ FHeight: Integer;
FPixelFormat: TGfxPixelFormat;
FPaletteSize: Integer;
FPalette: PGfxColor;
-
- procedure HeaderFinished;
- procedure SegmentFinished(AStartY, AHeight: Integer);
- procedure ImageFinished;
-
- procedure DoProcessHeaderData(AStream: TStream); virtual; abstract;
- function DoGetImageSegmentStartY(ASegmentHeight: Integer): Integer;
- virtual; abstract;
- procedure InitImageReading; virtual;
- procedure DoProcessImageData(AStream: TStream); virtual; abstract;
-
+ procedure HeaderFinished;
+ procedure SegmentFinished(AStartY, AHeight: Integer);
+ procedure ImageFinished;
+ procedure DoProcessHeaderData(AStream: TStream); virtual; abstract;
+ function DoGetImageSegmentStartY(ASegmentHeight: Integer): Integer; virtual; abstract;
+ procedure InitImageReading; virtual;
+ procedure DoProcessImageData(AStream: TStream); virtual; abstract;
public
constructor Create; virtual;
- procedure ProcessHeaderData(AStream: TStream);
- function GetImageSegmentStartY(ASegmentHeight: Integer): Integer;
- procedure SetImageSegmentBuffer(AData: Pointer; AStride: LongWord;
- ASegmentHeight: Integer);
- procedure ProcessImageData(AStream: TStream);
-
- property State: TImageReaderState read FState;
- property Width: Integer read FWidth;
- property Height: Integer read FHeight;
- property PixelFormat: TGfxPixelFormat read FPixelFormat;
- property PaletteSize: Integer read FPaletteSize;
- property Palette: PGfxColor read FPalette;
- property SegmentData: Pointer read FSegmentData;
- property SegmentStride: LongWord read FSegmentStride;
- property SegmentHeight: Integer read FSegmentHeight;
- property SegmentSize: LongWord read FSegmentSize;
-
- property OnHeader: TNotifyEvent read FOnHeader write FOnHeader;
- property OnSegment: TSegmentEvent read FOnSegment write FOnSegment;
- property OnImage: TNotifyEvent read FOnImage write FOnImage;
+ procedure ProcessHeaderData(AStream: TStream);
+ function GetImageSegmentStartY(ASegmentHeight: Integer): Integer;
+ procedure SetImageSegmentBuffer(AData: Pointer; AStride: LongWord; ASegmentHeight: Integer);
+ procedure ProcessImageData(AStream: TStream);
+ property State: TImageReaderState read FState;
+ property Width: Integer read FWidth;
+ property Height: Integer read FHeight;
+ property PixelFormat: TGfxPixelFormat read FPixelFormat;
+ property PaletteSize: Integer read FPaletteSize;
+ property Palette: PGfxColor read FPalette;
+ property SegmentData: Pointer read FSegmentData;
+ property SegmentStride: LongWord read FSegmentStride;
+ property SegmentHeight: Integer read FSegmentHeight;
+ property SegmentSize: LongWord read FSegmentSize;
+ property OnHeader: TNotifyEvent read FOnHeader write FOnHeader;
+ property OnSegment: TSegmentEvent read FOnSegment write FOnSegment;
+ property OnImage: TNotifyEvent read FOnImage write FOnImage;
end;
implementation
+
constructor EImgOutOfData.Create;
begin
inherited Create(SImgOutOfData);
@@ -121,8 +119,7 @@ begin
inherited Create(SImgUnsupportedPixelFormat);
end;
-
-// TImageReader
+{ TImageReader }
constructor TImageReader.Create;
begin
@@ -147,10 +144,10 @@ procedure TImageReader.SetImageSegmentBuffer(AData: Pointer; AStride: LongWord;
ASegmentHeight: Integer);
begin
ASSERT(State in [irsHeaderRead, irsInImage]);
- FSegmentData := AData;
- FSegmentStride := AStride;
- FSegmentHeight := ASegmentHeight;
- FSegmentSize := SegmentStride * SegmentHeight;
+ FSegmentData := AData;
+ FSegmentStride := AStride;
+ FSegmentHeight := ASegmentHeight;
+ FSegmentSize := SegmentStride * SegmentHeight;
end;
procedure TImageReader.ProcessImageData(AStream: TStream);
@@ -196,5 +193,5 @@ begin
// Do nothing
end;
-
end.
+