fpc/fcl/image/fphandler.inc
fpc 790a4fe2d3 * log and id tags removed
git-svn-id: trunk@42 -
2005-05-21 09:42:41 +00:00

276 lines
6.5 KiB
PHP

{
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 := lowercase(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 := Lowercase(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 := lowercase(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.GetData (index:integer) : TIHData;
begin
if (index >= 0) and (index < FData.count) then
result := TIHData (FData[index])
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;
if FImage.UsePalette then
FImage.Palette.Clear;
if CheckContents (Str) then
begin
InternalRead (Str, result)
end
else
raise FPImageException.Create ('Wrong image format');
finally
FStream := nil;
FImage := nil;
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;