From 6c11f048d17747a59bb947d9cdbe73b7523fc034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Van=20Canneyt?= Date: Thu, 7 Mar 2024 22:22:57 +0100 Subject: [PATCH] * Fix from Werner Pamler to implement missing method. Fixes issue #40685 --- packages/fcl-image/src/fpreadbmp.pp | 31 +++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/packages/fcl-image/src/fpreadbmp.pp b/packages/fcl-image/src/fpreadbmp.pp index 49ec462ff7..e948103228 100644 --- a/packages/fcl-image/src/fpreadbmp.pp +++ b/packages/fcl-image/src/fpreadbmp.pp @@ -33,9 +33,9 @@ unit FPReadBMP; interface {$IFDEF FPC_DOTTEDUNITS} -uses FpImage, System.Classes, System.SysUtils, FpImage.Common.Bitmap; +uses FpImage, System.Types, System.Classes, System.SysUtils, FpImage.Common.Bitmap; {$ELSE FPC_DOTTEDUNITS} -uses FpImage, classes, sysutils, BMPcomn; +uses FpImage, types, classes, sysutils, BMPcomn; {$ENDIF FPC_DOTTEDUNITS} type @@ -68,6 +68,7 @@ type // required by TFPCustomImageReader procedure InternalRead (Stream:TStream; Img:TFPCustomImage); override; function InternalCheck (Stream:TStream) : boolean; override; + class function InternalSize (Stream:TStream) : TPoint; override; public constructor Create; override; destructor Destroy; override; @@ -516,6 +517,32 @@ begin end; end; +class function TFPReaderBMP.InternalSize (Stream: TStream): TPoint; +var + fileHdr: TBitmapFileHeader; + infoHdr: TBitmapInfoHeader; + n: Int64; + StartPos: Int64; +begin + Result := Point(0, 0); + + StartPos := Stream.Position; + try + n := Stream.Read(fileHdr, SizeOf(fileHdr)); + if n <> SizeOf(fileHdr) then exit; + if {$IFDEF ENDIAN_BIG}swap(fileHdr.bfType){$ELSE}fileHdr.bfType{$ENDIF} <> BMmagic then exit; + n := Stream.Read(infoHdr, SizeOf(infoHdr)); + if n <> SizeOf(infoHdr) then exit; + {$IFDEF ENDIAN_BIG} + Result := Point(swap(infoHdr.Width), swap(infoHdr.Height)); + {$ELSE} + Result := Point(infoHdr.Width, infoHdr.Height); + {$ENDIF} + finally + Stream.Position := StartPos; + end; +end; + initialization ImageHandlers.RegisterImageReader ('BMP Format', 'bmp', TFPReaderBMP); end.