diff options
Diffstat (limited to 'img')
-rw-r--r-- | img/bmpreader.pas | 102 | ||||
-rw-r--r-- | img/fpimg.pas | 12 | ||||
-rw-r--r-- | img/imageio.pas | 79 |
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. + |