408 lines
11 KiB
Plaintext
408 lines
11 KiB
Plaintext
unit uMain;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, IEMIO, StdCtrls, ImageEnView, IEMView, ImageEnIO, Buttons,
|
|
ImageEnProc, ComCtrls, ExtCtrls, IEOpenSaveDlg, ieview, iexBitmaps, hyiedefs, hyieutils;
|
|
|
|
type
|
|
TMainForm = class(TForm)
|
|
pnlGIF: TPanel;
|
|
btnFrameProps: TBitBtn;
|
|
btnInsertFrame: TBitBtn;
|
|
btnAppendFrame: TBitBtn;
|
|
btnDeleteFrame: TBitBtn;
|
|
btnPasteFrame: TBitBtn;
|
|
btnLoadFrame: TBitBtn;
|
|
IESaveDlg: TSaveImageEnDialog;
|
|
Panel3: TPanel;
|
|
pnlAnimate: TPanel;
|
|
btnAnimate: TSpeedButton;
|
|
IEMView1: TImageEnMView;
|
|
btnSaveGIF: TBitBtn;
|
|
btnLoadGIF: TBitBtn;
|
|
btnBlankGIF: TBitBtn;
|
|
chkOptimizeGIF: TCheckBox;
|
|
IEOpenDlg: TOpenImageEnDialog;
|
|
grpNewFrames: TGroupBox;
|
|
lblWidth: TLabel;
|
|
edtFrameWidth: TEdit;
|
|
updFrameWidth: TUpDown;
|
|
edtFrameHeight: TEdit;
|
|
updFrameHeight: TUpDown;
|
|
lblHeight: TLabel;
|
|
chkStretchToFrameSize: TCheckBox;
|
|
lblDelay: TLabel;
|
|
edtFrameDelay: TEdit;
|
|
updFrameDelay: TUpDown;
|
|
Label1: TLabel;
|
|
Label2: TLabel;
|
|
btnPromote: TBitBtn;
|
|
btnDemote: TBitBtn;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure btnSaveGIFClick(Sender: TObject);
|
|
procedure btnAnimateClick(Sender: TObject);
|
|
procedure btnFramePropsClick(Sender: TObject);
|
|
procedure btnInsertFrameClick(Sender: TObject);
|
|
procedure btnAppendFrameClick(Sender: TObject);
|
|
procedure btnBlankGIFClick(Sender: TObject);
|
|
procedure btnLoadGIFClick(Sender: TObject);
|
|
procedure btnDeleteFrameClick(Sender: TObject);
|
|
procedure btnDemoteClick(Sender: TObject);
|
|
procedure btnPasteFrameClick(Sender: TObject);
|
|
procedure btnLoadFrameClick(Sender: TObject);
|
|
procedure btnPromoteClick(Sender: TObject);
|
|
procedure IEMView1GetText(Sender: TObject; Index: Integer; Position: TIEMTextPos; var Text: WideString);
|
|
procedure IEMView1Resize(Sender: TObject);
|
|
|
|
private
|
|
{ Private declarations }
|
|
fFilename: string;
|
|
|
|
function CheckHasSelection: boolean;
|
|
procedure UpdateThumbnailSize;
|
|
procedure StretchFrameToDefaultSize;
|
|
function GetDefaultFrameDelay: Integer;
|
|
function GetDefaultFrameHeight: Integer;
|
|
function GetDefaultFrameWidth: Integer;
|
|
procedure SetDefaultFrameDelay(const Value: Integer);
|
|
procedure SetDefaultFrameHeight(const Value: Integer);
|
|
procedure SetDefaultFrameWidth(const Value: Integer);
|
|
|
|
public
|
|
{ Public declarations }
|
|
property Filename: string read fFilename write fFilename;
|
|
property DefaultFrameWidth : Integer read GetDefaultFrameWidth write SetDefaultFrameWidth;
|
|
property DefaultFrameHeight : Integer read GetDefaultFrameHeight write SetDefaultFrameHeight;
|
|
property DefaultFrameDelay : Integer read GetDefaultFrameDelay write SetDefaultFrameDelay;
|
|
end;
|
|
|
|
var
|
|
MainForm: TMainForm;
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
{$R WindowsTheme.res}
|
|
|
|
|
|
procedure TMainForm.FormCreate(Sender: TObject);
|
|
begin
|
|
IEMView1.SetModernStyling;
|
|
end;
|
|
|
|
|
|
function TMainForm.GetDefaultFrameDelay: Integer;
|
|
begin
|
|
Result := StrToIntDef(edtFrameDelay.Text, 1000);
|
|
end;
|
|
|
|
function TMainForm.GetDefaultFrameHeight: Integer;
|
|
begin
|
|
Result := StrToIntDef(edtFrameHeight.Text, 100);
|
|
end;
|
|
|
|
function TMainForm.GetDefaultFrameWidth: Integer;
|
|
begin
|
|
Result := StrToIntDef(edtFrameWidth .Text, 100);
|
|
end;
|
|
|
|
// SAVE
|
|
procedure TMainForm.btnSaveGIFClick(Sender: TObject);
|
|
var
|
|
sSaveFilename: string;
|
|
begin
|
|
try
|
|
IESaveDlg.AutoSetFilterFileType := ioGIF;
|
|
IESaveDlg.FileName := fFilename;
|
|
if IESaveDlg.Execute = false then
|
|
exit;
|
|
|
|
if chkOptimizeGIF.checked = False then
|
|
begin
|
|
IEMView1.MIO.SaveToFile(IESaveDlg.FileName);
|
|
end
|
|
else
|
|
begin
|
|
sSaveFilename := ChangeFileExt(IESaveDlg.FileName,'.tmp.gif');
|
|
IEMView1.MIO.SaveToFile(sSaveFilename);
|
|
IEOptimizeGIF(sSaveFilename, IESaveDlg.FileName);
|
|
DeleteFile(sSaveFilename);
|
|
end;
|
|
|
|
except
|
|
messagedlg('An error was encountered while saving the file: ' + IESaveDlg.FileName, mtError, [mbok], 0);
|
|
end;
|
|
end;
|
|
|
|
|
|
// PLAY
|
|
procedure TMainForm.btnAnimateClick(Sender: TObject);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
UpdateThumbnailSize;
|
|
IEMView1.Playing := btnAnimate.Down;
|
|
btnFrameProps.enabled := not btnAnimate.Down;
|
|
btnInsertFrame.enabled := not btnAnimate.Down;
|
|
btnAppendFrame.enabled := not btnAnimate.Down;
|
|
btnDeleteFrame.enabled := not btnAnimate.Down;
|
|
btnPasteFrame.enabled := not btnAnimate.Down;
|
|
btnLoadFrame.enabled := not btnAnimate.Down;
|
|
grpNewFrames.enabled := not btnAnimate.Down;
|
|
chkOptimizeGIF.enabled := not btnAnimate.Down;
|
|
btnBlankGIF.enabled := not btnAnimate.Down;
|
|
btnLoadGIF.enabled := not btnAnimate.Down;
|
|
btnSaveGIF.enabled := not btnAnimate.Down;
|
|
btnDemote .enabled := not btnAnimate.Down;
|
|
btnPromote.enabled := not btnAnimate.Down;
|
|
chkStretchToFrameSize.enabled := not btnAnimate.Down;
|
|
|
|
for I := 0 to grpNewFrames.ControlCount - 1 do
|
|
grpNewFrames.Controls[i].Enabled := not btnAnimate.Down;
|
|
end;
|
|
|
|
|
|
// GIF Parameters
|
|
procedure TMainForm.btnFramePropsClick(Sender: TObject);
|
|
var
|
|
idx: Integer;
|
|
begin
|
|
if not CheckHasSelection then
|
|
exit;
|
|
|
|
IEMView1.MIO.SimplifiedParamsDialogs := False;
|
|
IEMView1.MIO.DoPreviews(IEMView1.SelectedImage, [ppGIF]);
|
|
idx := IEMView1.SelectedImage;
|
|
DefaultFrameDelay := IEMView1.MIO.Params[idx].GIF_DelayTime;
|
|
IEMView1.ImageDelayTime[idx] := 10 * IEMView1.MIO.Params[idx].GIF_DelayTime;
|
|
end;
|
|
|
|
// Insert
|
|
procedure TMainForm.btnInsertFrameClick(Sender: TObject);
|
|
var
|
|
idx: integer;
|
|
begin
|
|
idx := IEMView1.SelectedImage;
|
|
if idx < 0 then
|
|
idx := 0;
|
|
IEMView1.InsertImage(idx, DefaultFrameWidth, DefaultFrameHeight);
|
|
IEMView1.MIO.Params[idx].GIF_DelayTime := DefaultFrameDelay;
|
|
end;
|
|
|
|
|
|
// Append
|
|
procedure TMainForm.btnAppendFrameClick(Sender: TObject);
|
|
var
|
|
idx: Integer;
|
|
begin
|
|
idx := IEMView1.AppendImage(DefaultFrameWidth, DefaultFrameHeight);
|
|
IEMView1.MIO.Params[idx].GIF_DelayTime := DefaultFrameDelay;
|
|
end;
|
|
|
|
|
|
// Blank GIF
|
|
procedure TMainForm.btnBlankGIFClick(Sender: TObject);
|
|
var
|
|
sCount: string;
|
|
iCount: Integer;
|
|
I: Integer;
|
|
idx: Integer;
|
|
begin
|
|
sCount := '1';
|
|
if InputQuery('Frame Count', 'Specify the number of frames', sCount) = False then
|
|
exit;
|
|
iCount := StrToIntDef(sCount, 0);
|
|
if iCount < 1 then
|
|
begin
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
Exit;
|
|
end;
|
|
|
|
IEMView1.Clear;
|
|
IEMView1.LockUpdate;
|
|
for I := 1 to iCount do
|
|
begin
|
|
idx := IEMView1.AppendImage(DefaultFrameWidth, DefaultFrameHeight);
|
|
IEMView1.MIO.Params[idx].GIF_DelayTime := DefaultFrameDelay;
|
|
end;
|
|
IEMView1.UnlockUpdate;
|
|
fFilename := '';
|
|
UpdateThumbnailSize;
|
|
if (IEMView1.ImageCount > 0) then
|
|
IEMView1.SelectedImage := 0;
|
|
end;
|
|
|
|
|
|
// LOAD
|
|
procedure TMainForm.btnLoadGIFClick(Sender: TObject);
|
|
begin
|
|
IEOpenDlg.AutoSetFilterFileType := ioGIF;
|
|
IEOpenDlg.FileName := fFilename;
|
|
if IEOpenDlg.Execute = false then
|
|
exit;
|
|
|
|
try
|
|
fFilename := IEOpenDlg.FileName;
|
|
IEMView1.Clear;
|
|
IEMView1.MIO.LoadFromFile(fFilename);
|
|
UpdateThumbnailSize;
|
|
if (IEMView1.ImageCount > 0) then
|
|
begin
|
|
IEMView1.SelectedImage := 0;
|
|
|
|
DefaultFrameWidth := IEMView1.ImageWidth[0];
|
|
DefaultFrameHeight := IEMView1.ImageHeight[0];
|
|
DefaultFrameDelay := IEMView1.MIO.Params[0].GIF_DelayTime;
|
|
end;
|
|
except
|
|
messagedlg('An error was encountered while loading the file: ' + fFileName, mtError, [mbok], 0);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
// Delete Frame
|
|
procedure TMainForm.btnDeleteFrameClick(Sender: TObject);
|
|
begin
|
|
if IEMView1.SelectedImage >= 0 then
|
|
IEMView1.DeleteImage(IEMView1.SelectedImage);
|
|
end;
|
|
|
|
procedure TMainForm.btnDemoteClick(Sender: TObject);
|
|
begin
|
|
if not CheckHasSelection then
|
|
exit;
|
|
|
|
if IEMView1.SelectedImage < 1 then
|
|
MessageBeep(MB_ICONEXCLAMATION)
|
|
else
|
|
begin
|
|
IEMView1.MoveImage(IEMView1.SelectedImage, IEMView1.SelectedImage - 1);
|
|
IEMView1.SelectedImage := IEMView1.SelectedImage - 1;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Paste
|
|
procedure TMainForm.btnPasteFrameClick(Sender: TObject);
|
|
begin
|
|
if not CheckHasSelection then
|
|
exit;
|
|
IEMView1.Proc.PasteFromClipboard;
|
|
if chkStretchToFrameSize.checked then
|
|
StretchFrameToDefaultSize;
|
|
end;
|
|
|
|
|
|
// Load image to frame
|
|
procedure TMainForm.btnLoadFrameClick(Sender: TObject);
|
|
begin
|
|
if not CheckHasSelection then
|
|
exit;
|
|
|
|
IEOpenDlg.AutoSetFilterFileType := -1;
|
|
IEOpenDlg.FileName := '';
|
|
if IEOpenDlg.Execute = false then
|
|
exit;
|
|
|
|
IEMView1.SetImageFromFile(IEMView1.SelectedImage, IEOpenDlg.FileName);
|
|
|
|
if chkStretchToFrameSize.checked then
|
|
StretchFrameToDefaultSize;
|
|
end;
|
|
|
|
procedure TMainForm.btnPromoteClick(Sender: TObject);
|
|
begin
|
|
if not CheckHasSelection then
|
|
exit;
|
|
if IEMView1.SelectedImage > IEMView1.ImageCount - 2 then
|
|
MessageBeep(MB_ICONEXCLAMATION)
|
|
else
|
|
begin
|
|
IEMView1.MoveImage(IEMView1.SelectedImage, IEMView1.SelectedImage + 1);
|
|
IEMView1.SelectedImage := IEMView1.SelectedImage + 1;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SetDefaultFrameDelay(const Value: Integer);
|
|
begin
|
|
edtFrameDelay.Text := IntToStr(Value);
|
|
end;
|
|
|
|
procedure TMainForm.SetDefaultFrameHeight(const Value: Integer);
|
|
begin
|
|
edtFrameHeight.Text := IntToStr(Value);
|
|
end;
|
|
|
|
procedure TMainForm.SetDefaultFrameWidth(const Value: Integer);
|
|
begin
|
|
edtFrameWidth.Text := IntToStr(Value);
|
|
end;
|
|
|
|
procedure TMainForm.StretchFrameToDefaultSize;
|
|
begin
|
|
// Reduce the image size while maintaining the aspect ratio
|
|
IEMView1.Proc.Resample(DefaultFrameWidth, DefaultFrameHeight, rfLanczos3, True);
|
|
IEMView1.Proc.ImageResize(DefaultFrameWidth, DefaultFrameHeight, iehCenter, ievCenter);
|
|
end;
|
|
|
|
|
|
// Display an error if the user has not selected a fraqme
|
|
function TMainForm.CheckHasSelection: boolean;
|
|
begin
|
|
result := IEMView1.SelectedImage >= 0;
|
|
if not result then
|
|
messagedlg('You have not selected a frame.', mtError, [mbok], 0);
|
|
end;
|
|
|
|
// Choose a good size for the thumbnail display
|
|
procedure TMainForm.UpdateThumbnailSize;
|
|
const
|
|
Minimum_Size = 80;
|
|
begin
|
|
IEMView1.LockPaint;
|
|
if btnAnimate.Down then
|
|
begin
|
|
IEMView1.Scrollbars := ssNone;
|
|
IEMView1.ThumbWidth := IEMView1.ClientWidth;
|
|
IEMView1.ThumbHeight := IEMView1.ClientHeight;
|
|
IEMView1.ThumbnailsBorderWidth := 0;
|
|
end
|
|
else
|
|
begin
|
|
IEMView1.Scrollbars := ssBoth;
|
|
IEMView1.ThumbWidth := imax(Minimum_Size, DefaultFrameWidth) + 2 * IEMView1.SideGap;
|
|
IEMView1.ThumbHeight := imax(Minimum_Size, DefaultFrameHeight) + IEMView1.UpperGap + IEMView1.BottomGap;
|
|
IEMView1.ThumbnailsBorderWidth := 1;
|
|
end;
|
|
IEMView1.UnlockPaint;
|
|
end;
|
|
|
|
// Display frame info
|
|
procedure TMainForm.IEMView1GetText(Sender: TObject; Index: Integer; Position: TIEMTextPos; var Text: WideString);
|
|
begin
|
|
if btnAnimate.Down then
|
|
Text := ''
|
|
else
|
|
if (Index >= 0) and (Position = iemtpTop) then
|
|
begin
|
|
if btnAnimate.Down or (IEMView1.ThumbWidth < 120) then
|
|
Text := format('Frame %d', [Index + 1])
|
|
else
|
|
Text := format('Frame %d (%d x %d)', [Index + 1, IEMView1.ImageWidth[Index], IEMView1.ImageHeight[Index]]);
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.IEMView1Resize(Sender: TObject);
|
|
begin
|
|
UpdateThumbnailSize;
|
|
end;
|
|
|
|
|
|
end.
|
|
|
|
|
|
|