123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 2003 by the Free Pascal development team
- TImageHandlers implementations
-
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- { TImageHandlersManager }
- constructor TImageHandlersManager.Create;
- begin
- inherited create;
- FData := Tlist.Create;
- end;
- destructor TImageHandlersManager.Destroy;
- var r : integer;
- begin
- for r := FData.count-1 downto 0 do
- TIHData(FData[r]).Free;
- FData.Free;
- inherited Destroy;
- end;
- function CalcDefExt (TheExtentions:string) : string;
- var p : integer;
- begin
- p := pos (';',TheExtentions);
- if p = 0 then
- result := TheExtentions
- else
- result := copy(TheExtentions, 1, p-1);
- end;
- procedure TImageHandlersManager.RegisterImageHandlers (const ATypeName,TheExtentions:string;
- AReader:TFPCustomImageReaderClass; AWriter:TFPCustomImageWriterClass);
- var ih : TIHData;
- begin
- ih := GetData (ATypeName);
- if assigned (ih) then
- FPImgError (StrTypeAlreadyExist,[ATypeName]);
- ih := TIHData.Create;
- with ih do
- begin
- FTypeName := ATypeName;
- FExtention := TheExtentions;
- FDefaultExt := CalcDefExt (TheExtentions);
- FReader := AReader;
- FWriter := AWriter;
- end;
- FData.Add (ih);
- end;
- procedure TImageHandlersManager.RegisterImageReader (const ATypeName,TheExtentions:string;
- AReader:TFPCustomImageReaderClass);
- var ih : TIHData;
- begin
- ih := GetData (ATypeName);
- if assigned (ih) then
- begin
- if assigned (ih.FReader) then
- FPImgError (StrTypeReaderAlreadyExist,[ATypeName])
- else
- ih.FReader := AReader;
- end
- else
- begin
- ih := TIHData.Create;
- with ih do
- begin
- FTypeName := ATypeName;
- FExtention := TheExtentions;
- FDefaultExt := CalcDefExt (TheExtentions);
- FReader := AReader;
- FWriter := nil;
- end;
- FData.Add (ih);
- end;
- end;
- procedure TImageHandlersManager.RegisterImageWriter (const ATypeName,TheExtentions:string;
- AWriter:TFPCustomImageWriterClass);
- var ih : TIHData;
- begin
- ih := GetData (ATypeName);
- if assigned (ih) then
- begin
- if assigned (ih.FWriter) then
- FPImgError (StrTypeWriterAlreadyExist,[ATypeName])
- else
- ih.FWriter := AWriter;
- end
- else
- begin
- ih := TIHData.Create;
- with ih do
- begin
- FTypeName := ATypeName;
- FExtention := TheExtentions;
- FDefaultExt := CalcDefExt (TheExtentions);
- FReader := nil;
- FWriter := AWriter;
- end;
- FData.Add (ih);
- end;
- end;
- function TImageHandlersManager.GetCount : integer;
- begin
- result := FData.Count;
- end;
- function TImageHandlersManager.GetData (const ATypeName:string) : TIHData;
- var r : integer;
- begin
- r := FData.count;
- repeat
- dec (r);
- until (r < 0) or (compareText (TIHData(FData[r]).FTypeName, ATypeName) = 0);
- if r >= 0 then
- result := TIHData(FData[r])
- else
- result := nil;
- end;
- function TImageHandlersManager.GetTypeName (index:integer) : string;
- var ih : TIHData;
- begin
- ih := TIHData (FData[index]);
- result := ih.FTypeName;
- end;
- function TImageHandlersManager.GetReader (const TypeName:string) : TFPCustomImageReaderClass;
- var ih : TIHData;
- begin
- ih := GetData (TypeName);
- if assigned(ih) then
- result := ih.FReader
- else
- result := nil;
- end;
- function TImageHandlersManager.GetWriter (const TypeName:string) : TFPCustomImageWriterClass;
- var ih : TIHData;
- begin
- ih := GetData (TypeName);
- if assigned(ih) then
- result := ih.FWriter
- else
- result := nil;
- end;
- function TImageHandlersManager.GetExt (const TypeName:string) : string;
- var ih : TIHData;
- begin
- ih := GetData (TypeName);
- if assigned(ih) then
- result := ih.FExtention
- else
- result := '';
- end;
- function TImageHandlersManager.GetDefExt (const TypeName:string) : string;
- var ih : TIHData;
- begin
- ih := GetData (TypeName);
- if assigned(ih) then
- result := ih.FDefaultExt
- else
- result := '';
- end;
- { TFPCustomImageHandler }
- constructor TFPCustomImageHandler.create;
- begin
- inherited create;
- end;
- procedure TFPCustomImageHandler.Progress(Stage: TProgressStage;
- PercentDone: Byte; RedrawNow: Boolean; const R: TRect;
- const Msg: AnsiString; var Continue: Boolean);
- begin
- If Assigned(FOnProgress) then
- FOnProgress(Self,Stage,PercentDone,RedrawNow,R,Msg,Continue)
- else If Assigned(FImage) then
- // It is debatable whether we should pass ourselves or the image ?
- FImage.Progress(Self,Stage,PercentDone,RedrawNow,R,Msg,Continue);
- end;
- { TFPCustomImageReader }
- constructor TFPCustomImageReader.Create;
- begin
- inherited create;
- FDefImageClass := TFPMemoryImage;
- end;
- function TFPCustomImageReader.ImageRead (Str:TStream; Img:TFPCustomImage) : TFPCustomImage;
- begin
- try
- if not assigned(Str) then
- raise FPImageException.Create(ErrorText[StrNoStream]);
- FStream := Str;
- if not assigned(img) then
- result := FDefImageClass.Create(0,0)
- else
- result := Img;
- FImage := result;
- writeln ('Checking contents');
- if CheckContents (Str) then
- begin
- writeln ('Correct header(s), reading image');
- InternalRead (Str, result)
- end
- else
- raise FPImageException.Create ('Wrong image format');
- finally
- writeln ('ImageRead finally');
- FStream := nil;
- FImage := nil;
- end;
- writeln ('ImageRead end.');
- end;
- function TFPCustomImageReader.CheckContents (Str:TStream) : boolean;
- var InRead : boolean;
- begin
- InRead := assigned(FStream);
- if not assigned(Str) then
- raise FPImageException.Create(ErrorText[StrNoStream]);
- try
- FSTream := Str;
- result := InternalCheck (Str);
- finally
- if not InRead then
- FStream := nil;
- end;
- end;
- { TFPCustomImageWriter }
- procedure TFPCustomImageWriter.ImageWrite (Str:TStream; Img:TFPCustomImage);
- begin
- if not assigned(img) then
- raise FPImageException.Create(ErrorText[StrNoImageToWrite]);
- if not assigned(Str) then
- raise FPImageException.Create(ErrorText[StrNoStream]);
- try
- FStream := str;
- FImage := img;
- Str.position := 0;
- Str.Size := 0;
- InternalWrite(Str, Img);
- finally
- FStream := nil;
- FImage := nil;
- end;
- end;
|