mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-05 17:40:04 +02:00
276 lines
6.5 KiB
PHP
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;
|
|
|
|
|