2
0
Эх сурвалжийг харах

* Fix from Werner Pamler to implement missing method. Fixes issue #40685

Michaël Van Canneyt 1 жил өмнө
parent
commit
6c11f048d1

+ 29 - 2
packages/fcl-image/src/fpreadbmp.pp

@@ -33,9 +33,9 @@ unit FPReadBMP;
 interface
 interface
 
 
 {$IFDEF FPC_DOTTEDUNITS}
 {$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}
 {$ELSE FPC_DOTTEDUNITS}
-uses FpImage, classes, sysutils, BMPcomn;
+uses FpImage, types, classes, sysutils, BMPcomn;
 {$ENDIF FPC_DOTTEDUNITS}
 {$ENDIF FPC_DOTTEDUNITS}
 
 
 type
 type
@@ -68,6 +68,7 @@ type
       // required by TFPCustomImageReader
       // required by TFPCustomImageReader
       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;
+      class function  InternalSize  (Stream:TStream) : TPoint; override;
     public
     public
       constructor Create; override;
       constructor Create; override;
       destructor Destroy; override;
       destructor Destroy; override;
@@ -516,6 +517,32 @@ begin
     end;
     end;
 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
 initialization
   ImageHandlers.RegisterImageReader ('BMP Format', 'bmp', TFPReaderBMP);
   ImageHandlers.RegisterImageReader ('BMP Format', 'bmp', TFPReaderBMP);
 end.
 end.