You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
5.4 KiB
213 lines
5.4 KiB
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.
|