Browse Source

# revisions: 33635,33638,33639

git-svn-id: branches/fixes_3_0@33750 -
marco 9 years ago
parent
commit
8e3262edef

+ 7 - 16
packages/fcl-image/src/fphandler.inc

@@ -252,29 +252,20 @@ begin
   end;
 end;
 
-function TFPCustomImageReader.InternalSize(Str: TStream): TPoint;
+class function TFPCustomImageReader.InternalSize(Str: TStream): TPoint;
 
 begin
   Result.X:=-1;
   Result.Y:=-1;
 end;
 
-function TFPCustomImageReader.ImageSize(Str: TStream): TPoint;
-var InRead : boolean;
-    P : Int64;
+class function TFPCustomImageReader.ImageSize(Str: TStream): TPoint;
+var
+  P: Int64;
 begin
-  InRead := assigned(FStream);
-  if not assigned(Str) then
-    raise FPImageException.Create(ErrorText[StrNoStream]);
-  try
-    FStream := Str;
-    P:=Str.Position;
-    result := InternalSize (Str);
-    Str.Position:=P;
-  finally
-    if not InRead then
-      FStream := nil;
-  end;
+  P:=Str.Position;
+  result := InternalSize (Str);
+  Str.Position:=P;
 end;
 
 

+ 8 - 2
packages/fcl-image/src/fpimage.pp

@@ -208,14 +208,14 @@ type
     protected
       procedure InternalRead  (Str:TStream; Img:TFPCustomImage); virtual; abstract;
       function  InternalCheck (Str:TStream) : boolean; virtual; abstract;
-      function  InternalSize  (Str:TStream): TPoint; virtual; 
+      class function InternalSize  (Str:TStream): TPoint; virtual;
     public
       constructor Create; override;
       function ImageRead (Str:TStream; Img:TFPCustomImage) : TFPCustomImage;
       // reads image
       function CheckContents (Str:TStream) : boolean;
       // Returns true if the content is readable
-      function ImageSize(Str:TStream): TPoint;
+      class function ImageSize(Str:TStream): TPoint;
       // returns the size of image in stream without loading it completely. -1,-1 means this is not implemented.
       property DefaultImageClass : TFPCustomImageClass read FDefImageClass write FDefImageClass;
       // Image Class to create when no img is given for reading
@@ -234,6 +234,12 @@ type
       FExtension, FTypeName, FDefaultExt : string;
       FReader : TFPCustomImageReaderClass;
       FWriter : TFPCustomImageWriterClass;
+    public
+      property Extension: string read FExtension;
+      property TypeName: string read FTypeName;
+      property DefaultExt: string read FDefaultExt;
+      property Reader : TFPCustomImageReaderClass read FReader;
+      property Writer : TFPCustomImageWriterClass read FWriter;
   end;
 
   TImageHandlersManager = class

+ 2 - 2
packages/fcl-image/src/fpreadjpeg.pas

@@ -64,7 +64,7 @@ type
   protected
     procedure InternalRead(Str: TStream; Img: TFPCustomImage); override;
     function  InternalCheck(Str: TStream): boolean; override;
-    function  InternalSize(Str:TStream): TPoint; override;
+    class function InternalSize(Str:TStream): TPoint; override;
   public
     constructor Create; override;
     destructor Destroy; override;
@@ -451,7 +451,7 @@ begin
   end;
 end;
 
-function TFPReaderJPEG.InternalSize(Str: TStream): TPoint;
+class function TFPReaderJPEG.InternalSize(Str: TStream): TPoint;
 var
   JInfo: jpeg_decompress_struct;
   JError: jpeg_error_mgr;

+ 36 - 0
packages/fcl-image/src/fpreadpng.pp

@@ -87,6 +87,7 @@ Type
       function DecideSetPixel : TSetPixelProc; virtual;
       procedure InternalRead  (Str:TStream; Img:TFPCustomImage); override;
       function  InternalCheck (Str:TStream) : boolean; override;
+      class function InternalSize(Str:TStream): TPoint; override;
       //property ColorFormat : TColorformat read CFmt;
       property ConvertColor : TConvertColorProc read FConvertColor;
       property CurrentPass : byte read FCurrentPass;
@@ -836,6 +837,41 @@ begin
   end;
 end;
 
+class function TFPReaderPNG.InternalSize(Str: TStream): TPoint;
+var
+  SigCheck: array[0..7] of byte;
+  r: Integer;
+  Width, Height: Word;
+  StartPos: Int64;
+begin
+  Result.X := 0;
+  Result.Y := 0;
+
+  StartPos := Str.Position;
+  // Check Signature
+  Str.Read(SigCheck, SizeOf(SigCheck));
+  for r := Low(SigCheck) to High(SigCheck) do
+  begin
+    If SigCheck[r] <> Signature[r] then
+      Exit;
+  end;
+  if not(
+        (Str.Seek(10, soFromCurrent)=StartPos+18)
+    and (Str.Read(Width, 2)=2)
+    and (Str.Seek(2, soFromCurrent)=StartPos+22)
+    and (Str.Read(Height, 2)=2))
+  then
+    Exit;
+
+  {$IFDEF ENDIAN_LITTLE}
+  Width := Swap(Width);
+  Height := Swap(Height);
+  {$ENDIF}
+
+  Result.X := Width;
+  Result.Y := Height;
+end;
+
 function  TFPReaderPNG.InternalCheck (Str:TStream) : boolean;
 var SigCheck : array[0..7] of byte;
     r : integer;