Browse Source

* Patch from Ondrej Pokorny to implement Find(Handler|reader)FromStream (bug ID 33955)

git-svn-id: trunk@39416 -
michael 7 years ago
parent
commit
5213011bed
2 changed files with 39 additions and 0 deletions
  1. 37 0
      packages/fcl-image/src/fpimage.inc
  2. 2 0
      packages/fcl-image/src/fpimage.pp

+ 37 - 0
packages/fcl-image/src/fpimage.inc

@@ -290,6 +290,32 @@ begin
   Result := nil;
 end;
 
+class function TFPCustomImage.FindHandlerFromStream(Str: TStream): TIHData;
+var r : integer;
+    p: Int64;
+    reader: TFPCustomImageReader;
+begin
+  r := ImageHandlers.Count-1;
+  p := Str.Position;
+  while (r >= 0) do
+    begin
+    Result := ImageHandlers.GetData(r);
+    if Result.Reader<>nil then
+      begin
+      reader := Result.Reader.Create;
+      try
+        if reader.CheckContents(Str) then
+          Exit;
+      finally
+        reader.free;
+        Str.Position := p;
+      end;
+      end;
+    dec (r);
+    end;
+  Result := nil;
+end;
+
 class function TFPCustomImage.FindReaderFromExtension(const extension: String
   ): TFPCustomImageReaderClass;
 var d : TIHData;
@@ -307,6 +333,17 @@ begin
   Result := FindReaderFromExtension(ExtractFileExt(filename));
 end;
 
+class function TFPCustomImage.FindReaderFromStream(
+  Str: TStream): TFPCustomImageReaderClass;
+var d : TIHData;
+begin
+  d := FindHandlerFromStream(Str);
+  if d<>nil then
+    Result := d.FReader
+  else
+    Result := nil;
+end;
+
 class function TFPCustomImage.FindWriterFromExtension(const extension: String
   ): TFPCustomImageWriterClass;
 var d : TIHData;

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

@@ -129,6 +129,8 @@ type
       destructor destroy; override;
       procedure Assign(Source: TPersistent); override;
       // Image handlers
+      class function FindHandlerFromStream(Str:TStream): TIHData;
+      class function FindReaderFromStream(Str:TStream): TFPCustomImageReaderClass;
       class function FindHandlerFromExtension(extension:String): TIHData;
       class function FindReaderFromFileName(const filename:String): TFPCustomImageReaderClass;
       class function FindReaderFromExtension(const extension:String): TFPCustomImageReaderClass;