blob: 798748d3ae36014e90d25dbe3d99e8c4b512e8b8 [file] [log] [blame]
unit TargaImage;
// ==========================================================
//
// This file is part of FreeImage 3
//
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
// THIS DISCLAIMER.
//
// Use at your own risk!
//
// ==========================================================
interface
uses
Windows,
Classes,
FreeImage,
Graphics,
Types;
type
TTargaImage = class(TGraphic)
private
fImage: PFIBITMAP;
fWidth: Integer;
fHeight: Integer;
protected
procedure Draw(ACanvas: TCanvas; const ARect: TRect); override;
function GetEmpty: Boolean; override;
function GetHeight: Integer; override;
function GetWidth: Integer; override;
procedure SetHeight(Value: Integer); override;
procedure SetWidth(Value: Integer); override;
public
constructor Create; override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette: HPALETTE); override;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE); override;
procedure SaveToStream(Stream: TStream); override;
end;
procedure Register;
implementation
{ Design-time registration }
procedure Register;
begin
TPicture.RegisterFileFormat('tga', 'TARGA Files', TTargaImage);
end;
{ IO functions }
function FI_ReadProc(buffer : pointer; size : Cardinal; count : Cardinal; handle : fi_handle) : UInt; stdcall;
var
stream: TStream;
bytesToRead: Cardinal;
begin
stream := TStream(handle);
bytesToRead := size*count;
Result := stream.Read(buffer^, bytesToRead);
end;
function FI_WriteProc(buffer : pointer; size, count : Cardinal; handle : fi_handle) : UInt; stdcall;
var
stream: TStream;
bytesToWrite: Cardinal;
begin
stream := TStream(handle);
bytesToWrite := size*count;
Result := stream.Write(buffer^, bytesToWrite);
end;
function FI_SeekProc(handle : fi_handle; offset : longint; origin : integer) : Integer; stdcall;
begin
TStream(handle).Seek(offset, origin);
Result := 0;
end;
function FI_TellProc(handle : fi_handle) : LongInt; stdcall;
begin
Result := TStream(handle).Position;
end;
{ TTargaImage }
constructor TTargaImage.Create;
begin
fImage := nil;
fWidth := 0;
fHeight := 0;
inherited;
end;
destructor TTargaImage.Destroy;
begin
if Assigned(fImage) then
FreeImage_Unload(fImage);
inherited;
end;
procedure TTargaImage.Assign(Source: TPersistent);
begin
if Source is TTargaImage then begin
fImage := FreeImage_Clone(TTargaImage(Source).fImage);
fWidth := FreeImage_GetWidth(fImage);
fHeight := FreeImage_GetHeight(fImage);
Changed(Self);
end else
inherited;
end;
procedure TTargaImage.Draw(ACanvas: TCanvas; const ARect: TRect);
var
pbi: PBitmapInfo;
begin
if Assigned(fImage) then begin
pbi := FreeImage_GetInfo(fImage^);
SetStretchBltMode(ACanvas.Handle, COLORONCOLOR);
StretchDIBits(ACanvas.Handle, ARect.left, ARect.top,
ARect.right-ARect.left, ARect.bottom-ARect.top,
0, 0, fWidth, fHeight,
FreeImage_GetBits(fImage), pbi^, DIB_RGB_COLORS, SRCCOPY);
end;
end;
function TTargaImage.GetEmpty: Boolean;
begin
Result := Assigned(fImage);
end;
function TTargaImage.GetHeight: Integer;
begin
Result := fHeight;
end;
function TTargaImage.GetWidth: Integer;
begin
Result := fWidth;
end;
procedure TTargaImage.LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette: HPALETTE);
begin
if Assigned(fImage) then begin
end;
end;
procedure TTargaImage.LoadFromStream(Stream: TStream);
var
io: FreeImageIO;
begin
with io do begin
read_proc := FI_ReadProc;
write_proc := FI_WriteProc;
seek_proc := FI_SeekProc;
tell_proc := FI_TellProc;
end;
fImage := FreeImage_LoadFromHandle(FIF_TARGA, @io, Stream);
if Assigned(fImage) then begin
fWidth := FreeImage_GetWidth(fImage);
fHeight := FreeImage_GetHeight(fImage);
end;
end;
procedure TTargaImage.SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE);
begin
end;
procedure TTargaImage.SaveToStream(Stream: TStream);
var
io: FreeImageIO;
begin
with io do begin
read_proc := FI_ReadProc;
write_proc := FI_WriteProc;
seek_proc := FI_SeekProc;
tell_proc := FI_TellProc;
end;
FreeImage_SaveToHandle(FIF_TARGA, fImage, @io, Stream);
end;
procedure TTargaImage.SetHeight(Value: Integer);
begin
if Assigned(fImage) then begin
fHeight := Value;
FreeImage_Rescale(fImage, fWidth, fHeight, FILTER_BICUBIC);
end;
end;
procedure TTargaImage.SetWidth(Value: Integer);
begin
if Assigned(fImage) then begin
fWidth := Value;
FreeImage_Rescale(fImage, fWidth, fHeight, FILTER_BICUBIC);
end;
end;
initialization
TPicture.RegisterFileFormat('tga', 'TARGA Files', TTargaImage);
end.