583 lines
14 KiB
Plaintext
583 lines
14 KiB
Plaintext
unit main;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, iemview, ieview, imageenview,
|
|
ExtCtrls, StdCtrls, ComCtrls, hyiedefs, hyieutils, imageenproc, ieopensavedlg, imageenio, Buttons, iexBitmaps,
|
|
iesettings, iexLayers, iexRulers;
|
|
|
|
type
|
|
Tfmain = class(TForm)
|
|
Panel1: TPanel;
|
|
MainMenu1: TMainMenu;
|
|
Panel2: TPanel;
|
|
ImageEnView1: TImageEnView;
|
|
ImageEnMView1: TImageEnMView;
|
|
File1: TMenuItem;
|
|
Open1: TMenuItem;
|
|
Save1: TMenuItem;
|
|
N1: TMenuItem;
|
|
Exit1: TMenuItem;
|
|
Button1: TButton;
|
|
Button2: TButton;
|
|
GroupBox1: TGroupBox;
|
|
btnMerge: TButton;
|
|
Button4: TButton;
|
|
Button5: TButton;
|
|
Button6: TButton;
|
|
Label2: TLabel;
|
|
TrackBar2: TTrackBar;
|
|
CheckBox2: TCheckBox;
|
|
Label3: TLabel;
|
|
Label4: TLabel;
|
|
CheckBox8: TCheckBox;
|
|
N2: TMenuItem;
|
|
Loadalllayers1: TMenuItem;
|
|
Savealllayers1: TMenuItem;
|
|
N3: TMenuItem;
|
|
Savemergedlayers1: TMenuItem;
|
|
CheckBox9: TCheckBox;
|
|
PageControl1: TPageControl;
|
|
TabSheet1: TTabSheet;
|
|
CheckBox1: TCheckBox;
|
|
CheckBox3: TCheckBox;
|
|
CheckBox5: TCheckBox;
|
|
CheckBox6: TCheckBox;
|
|
CheckBox10: TCheckBox;
|
|
TabSheet2: TTabSheet;
|
|
Label1: TLabel;
|
|
Label7: TLabel;
|
|
TrackBar1: TTrackBar;
|
|
ComboBox2: TComboBox;
|
|
TabSheet3: TTabSheet;
|
|
Label5: TLabel;
|
|
Label6: TLabel;
|
|
Label8: TLabel;
|
|
CheckBox4: TCheckBox;
|
|
TrackBar3: TTrackBar;
|
|
ComboBox1: TComboBox;
|
|
ComboBox3: TComboBox;
|
|
CheckBox11: TCheckBox;
|
|
CheckBox12: TCheckBox;
|
|
SpeedButton1: TSpeedButton;
|
|
lblPreviewQuality: TLabel;
|
|
cmbPreviewQuality: TComboBox;
|
|
dlgSaveImages: TSaveImageEnDialog;
|
|
lblFeather: TLabel;
|
|
edtEdgeFeather: TEdit;
|
|
updEdgeFeather: TUpDown;
|
|
chkMultiSelect: TCheckBox;
|
|
dlgOpenLayers: TOpenImageEnDialog;
|
|
dlgSaveLayers: TSaveImageEnDialog;
|
|
procedure Open1Click(Sender: TObject);
|
|
procedure Save1Click(Sender: TObject);
|
|
procedure Button1Click(Sender: TObject);
|
|
procedure Button2Click(Sender: TObject);
|
|
procedure TrackBar1Change(Sender: TObject);
|
|
procedure ImageEnMView1ImageSelect(Sender: TObject; idx: Integer);
|
|
procedure CheckBox1Click(Sender: TObject);
|
|
procedure FormActivate(Sender: TObject);
|
|
procedure Exit1Click(Sender: TObject);
|
|
procedure btnMergeClick(Sender: TObject);
|
|
procedure Button4Click(Sender: TObject);
|
|
procedure Button5Click(Sender: TObject);
|
|
procedure Button6Click(Sender: TObject);
|
|
procedure TrackBar2Change(Sender: TObject);
|
|
procedure CheckBox2Click(Sender: TObject);
|
|
procedure ImageEnView1LayerNotify(Sender: TObject; layer: Integer; event: TIELayerEvent);
|
|
procedure CheckBox3Click(Sender: TObject);
|
|
procedure CheckBox4Click(Sender: TObject);
|
|
procedure TrackBar3Change(Sender: TObject);
|
|
procedure ComboBox1Change(Sender: TObject);
|
|
procedure CheckBox5Click(Sender: TObject);
|
|
procedure CheckBox6Click(Sender: TObject);
|
|
procedure ComboBox2Change(Sender: TObject);
|
|
procedure CheckBox8Click(Sender: TObject);
|
|
procedure Loadalllayers1Click(Sender: TObject);
|
|
procedure Savealllayers1Click(Sender: TObject);
|
|
procedure Savemergedlayers1Click(Sender: TObject);
|
|
procedure CheckBox9Click(Sender: TObject);
|
|
procedure ComboBox3Change(Sender: TObject);
|
|
procedure CheckBox10Click(Sender: TObject);
|
|
procedure CheckBox11Click(Sender: TObject);
|
|
procedure ImageEnView1DrawLayerBox(Sender: TObject; ABitmap: TBitmap;
|
|
layer: Integer);
|
|
procedure CheckBox12Click(Sender: TObject);
|
|
procedure chkMultiSelectClick(Sender: TObject);
|
|
procedure SpeedButton1Click(Sender: TObject);
|
|
procedure cmbPreviewQualityChange(Sender: TObject);
|
|
procedure edtEdgeFeatherChange(Sender: TObject);
|
|
procedure ImageEnMView1ImageDeselect(Sender: TObject; idx: Integer);
|
|
private
|
|
{ Private declarations }
|
|
public
|
|
{ Public declarations }
|
|
procedure RefreshControls();
|
|
procedure RefreshLayerViewer();
|
|
end;
|
|
|
|
var
|
|
fmain: Tfmain;
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
{$R WindowsTheme.res}
|
|
|
|
procedure Tfmain.FormActivate(Sender: TObject);
|
|
begin
|
|
// Set colors of background
|
|
ImageEnView1.SetChessboardStyle( 16, bsSolid, clWhite, clLtGray );
|
|
|
|
ImageEnView1.SetLayersGripStyle(clBlack,clLime,bsSolid,5,iegsCircle);
|
|
ImageEnView1.ForceALTkey := true; // Lock aspect ratio
|
|
ImageEnView1.Blank;
|
|
ImageEnView1.MouseInteract := [miMoveLayers, miResizeLayers];
|
|
|
|
ImageEnMView1.SetModernStyling;
|
|
// Center thumbnails
|
|
ImageEnMView1.ThumbnailOptionsEx := ImageEnMView1.ThumbnailOptionsEx + [ietxCenterThumbnailColumn];
|
|
|
|
cmbPreviewQuality.ItemIndex := 1;
|
|
cmbPreviewQualityChange(nil);
|
|
|
|
RefreshControls;
|
|
RefreshLayerViewer;
|
|
end;
|
|
|
|
|
|
// open...
|
|
procedure Tfmain.Open1Click(Sender: TObject);
|
|
begin
|
|
if not ImageEnView1.IsEmpty and (MessageDlg('Add a layer?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
|
|
ImageEnView1.LayersAdd;
|
|
|
|
ImageEnView1.IO.Params.PSD_LoadLayers:=true;
|
|
with ImageEnView1.IO do
|
|
LoadFromFile(ExecuteOpenDialog('', '', false, 1, ''));
|
|
|
|
RefreshControls;
|
|
RefreshLayerViewer
|
|
end;
|
|
|
|
// save...
|
|
procedure Tfmain.Save1Click(Sender: TObject);
|
|
begin
|
|
with ImageenView1.IO do
|
|
SaveToFile(ExecuteSaveDialog('', '', false, 1, ''));
|
|
end;
|
|
|
|
// add new layer
|
|
procedure Tfmain.Button1Click(Sender: TObject);
|
|
begin
|
|
ImageEnView1.LayersAdd;
|
|
RefreshControls;
|
|
RefreshLayerViewer
|
|
end;
|
|
|
|
// insert new layer
|
|
procedure Tfmain.Button6Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
LayersInsert(LayersCurrent);
|
|
RefreshControls;
|
|
RefreshLayerViewer
|
|
end;
|
|
|
|
// remove selected layer
|
|
procedure Tfmain.Button2Click(Sender: TObject);
|
|
begin
|
|
ImageEnView1.LayersRemove();
|
|
RefreshControls;
|
|
RefreshLayerViewer
|
|
end;
|
|
|
|
// selected layer transparency
|
|
procedure Tfmain.TrackBar1Change(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
Layers[LayersCurrent].Opacity := TrackBar1.Position / 100;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// select an image (layer) in ImageEnMView1
|
|
procedure Tfmain.ImageEnMView1ImageSelect(Sender: TObject; idx: Integer);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
LayersCurrent := idx;
|
|
RefreshControls;
|
|
end;
|
|
end;
|
|
|
|
procedure Tfmain.ImageEnMView1ImageDeselect(Sender: TObject; idx: Integer);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
Layers[ idx ].Selected := False;
|
|
RefreshControls;
|
|
end;
|
|
end;
|
|
|
|
|
|
// "Visible" checkbox
|
|
procedure Tfmain.CheckBox1Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
Layers[LayersCurrent].Visible := CheckBox1.checked;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// refresh controls with the layer content
|
|
procedure Tfmain.RefreshControls;
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
with CurrentLayer do
|
|
label4.Caption := '(x=' + IntToStr(PosX) + ',y=' + IntToStr(PosY) + ',w=' + IntToStr(Width) + ',h=' + IntToStr(Height) + ')';
|
|
TrackBar1.Position := trunc(CurrentLayer.Opacity * 100);
|
|
CheckBox1.Checked := CurrentLayer.Visible;
|
|
CheckBox3.Checked := CurrentLayer.Cropped;
|
|
CheckBox4.Checked := CurrentLayer.Magnify.Enabled;
|
|
CheckBox5.Checked := CurrentLayer.VisibleBox;
|
|
CheckBox6.Checked := CurrentLayer.Locked;
|
|
CheckBox10.Checked := CurrentLayer.IsMask;
|
|
TrackBar3.Position := trunc(CurrentLayer.Magnify.Rate * 10);
|
|
ComboBox1.ItemIndex := integer(CurrentLayer.Magnify.Style);
|
|
ComboBox2.ItemIndex := integer(CurrentLayer.Operation);
|
|
ComboBox3.ItemIndex := integer(CurrentLayer.Magnify.Source);
|
|
CheckBox11.Checked := CurrentLayer.Selectable;
|
|
updEdgeFeather.Position := CurrentLayer.AlphaEdgeFeathering;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure Tfmain.RefreshLayerViewer();
|
|
begin
|
|
// update ImageEnMView1 with the contents of ImageEnView1
|
|
ImageEnMView1.AssignLayers( ImageEnView1, True );
|
|
end;
|
|
|
|
|
|
// exit
|
|
procedure Tfmain.Exit1Click(Sender: TObject);
|
|
begin
|
|
close;
|
|
end;
|
|
|
|
// merge selected layers
|
|
procedure Tfmain.btnMergeClick(Sender: TObject);
|
|
begin
|
|
ImageEnView1.LayersMerge();
|
|
RefreshControls();
|
|
RefreshLayerViewer();
|
|
end;
|
|
|
|
// move up
|
|
procedure Tfmain.Button4Click(Sender: TObject);
|
|
begin
|
|
ImageEnView1.LayersMove( LYR_SELECTED_LAYERS, IEN_Send_Backward );
|
|
RefreshControls;
|
|
RefreshLayerViewer;
|
|
end;
|
|
|
|
// move down
|
|
procedure Tfmain.Button5Click(Sender: TObject);
|
|
begin
|
|
ImageEnView1.LayersMove( LYR_SELECTED_LAYERS, IEN_Bring_Forward );
|
|
RefreshControls;
|
|
RefreshLayerViewer;
|
|
end;
|
|
|
|
// zoom
|
|
procedure Tfmain.TrackBar2Change(Sender: TObject);
|
|
begin
|
|
ImageEnView1.Zoom := TrackBar2.Position;
|
|
end;
|
|
|
|
// Show Layers Box
|
|
procedure Tfmain.CheckBox2Click(Sender: TObject);
|
|
begin
|
|
ImageEnView1.LayersDrawBox := CheckBox2.Checked;
|
|
end;
|
|
|
|
// layer change by user action
|
|
procedure Tfmain.ImageEnView1LayerNotify(Sender: TObject; layer: Integer;
|
|
event: TIELayerEvent);
|
|
begin
|
|
with ImageEnView1.Layers[layer] do
|
|
label4.Caption := '(x=' + IntToStr(PosX) + ',y=' + IntToStr(PosY) + ',w=' + IntToStr(Width) + ',h=' + IntToStr(Height) + ')';
|
|
if event in [ ielSelected, ielDeselected, ielMoved, ielResized, ielRotated, ielCreated, ielAction, ielEdited ] then
|
|
begin
|
|
RefreshLayerViewer;
|
|
RefreshControls;
|
|
end;
|
|
end;
|
|
|
|
// Cropped button
|
|
procedure Tfmain.CheckBox3Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.Cropped := CheckBox3.checked;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Magnify layer
|
|
procedure Tfmain.CheckBox4Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.Magnify.Enabled := CheckBox4.checked;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Magnification
|
|
procedure Tfmain.TrackBar3Change(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.Magnify.Rate := TrackBar3.Position / 10;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// set magnify style
|
|
procedure Tfmain.ComboBox1Change(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.Magnify.Style := TIEMagnifyStyle(ComboBox1.ItemIndex);
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Operation
|
|
procedure Tfmain.ComboBox2Change(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.Operation := TIERenderOperation(ComboBox2.ItemIndex);
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Visible Box
|
|
procedure Tfmain.CheckBox5Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.VisibleBox := CheckBox5.Checked;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Locked
|
|
procedure Tfmain.CheckBox6Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.Locked := CheckBox6.Checked;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Alpha channel
|
|
procedure Tfmain.CheckBox8Click(Sender: TObject);
|
|
begin
|
|
ImageEnView1.EnableAlphaChannel := CheckBox8.Checked;
|
|
end;
|
|
|
|
// load all layers
|
|
procedure Tfmain.Loadalllayers1Click(Sender: TObject);
|
|
begin
|
|
if dlgOpenLayers.Execute then
|
|
begin
|
|
ImageEnView1.IO.LoadFromFileIEN( dlgOpenLayers.FileName );
|
|
RefreshControls;
|
|
RefreshLayerViewer;
|
|
end;
|
|
end;
|
|
|
|
procedure Tfmain.Savealllayers1Click(Sender: TObject);
|
|
begin
|
|
if dlgSaveLayers.Execute then
|
|
ImageEnView1.IO.SaveToFileIEN( dlgSaveLayers.FileName );
|
|
end;
|
|
|
|
// save layers merged
|
|
procedure Tfmain.Savemergedlayers1Click(Sender: TObject);
|
|
begin
|
|
if dlgSaveImages.Execute then
|
|
ImageEnView1.LayersSaveMergedTo( dlgSaveImages.Filename );
|
|
end;
|
|
|
|
// Aspect Ratio
|
|
procedure Tfmain.CheckBox9Click(Sender: TObject);
|
|
begin
|
|
ImageEnView1.ForceALTkey := CheckBox9.Checked;
|
|
end;
|
|
|
|
|
|
// Changes "Magnify Source"
|
|
procedure Tfmain.ComboBox3Change(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.Magnify.Source := TIEMagnifySource(ComboBox3.ItemIndex);
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Is Layer Mask
|
|
procedure Tfmain.CheckBox10Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.IsMask := CheckBox10.Checked;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Selectable
|
|
procedure Tfmain.CheckBox11Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.Selectable := CheckBox11.Checked;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
// Draw Outer
|
|
procedure Tfmain.CheckBox12Click(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.DrawOuter := CheckBox12.Checked;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
procedure Tfmain.chkMultiSelectClick(Sender: TObject);
|
|
begin
|
|
if chkMultiSelect.checked then
|
|
ImageEnView1.LayerOptions := ImageEnView1.LayerOptions + [ loAllowMultiSelect ]
|
|
else
|
|
ImageEnView1.LayerOptions := ImageEnView1.LayerOptions - [ loAllowMultiSelect ];
|
|
end;
|
|
|
|
procedure Tfmain.ImageEnView1DrawLayerBox(Sender: TObject;
|
|
ABitmap: TBitmap; layer: Integer);
|
|
begin
|
|
// a green line
|
|
with ABitmap.Canvas do
|
|
begin
|
|
Pen.Style := psSolid;
|
|
Pen.Width := 1;
|
|
Pen.mode := pmCopy;
|
|
Pen.Color := clGreen;
|
|
Brush.Style := bsClear;
|
|
with TIELayer(ImageEnView1.Layers[layer]).ClientAreaBox do
|
|
Rectangle(Left-1, Top-1, Right+1, Bottom+1);
|
|
end;
|
|
end;
|
|
|
|
|
|
// Rotate button
|
|
procedure Tfmain.SpeedButton1Click(Sender: TObject);
|
|
begin
|
|
if SpeedButton1.Down then
|
|
ImageEnView1.MouseInteract := [miRotateLayers]
|
|
else
|
|
ImageEnView1.MouseInteract := [miMoveLayers, miResizeLayers];
|
|
end;
|
|
|
|
|
|
procedure Tfmain.cmbPreviewQualityChange(Sender: TObject);
|
|
const
|
|
_cmbPreviewQuality_Fast = 0;
|
|
_cmbPreviewQuality_Delayed_Best = 1;
|
|
_cmbPreviewQuality_Best = 2;
|
|
begin
|
|
// Seperate code to make it easier to understand
|
|
|
|
if cmbPreviewQuality.ItemIndex = _cmbPreviewQuality_Fast then
|
|
begin
|
|
// FASTEST DISPLAY
|
|
|
|
// Zoom filter
|
|
ImageEnView1.ZoomFilter := rfNone;
|
|
ImageEnView1.DelayZoomFilter := False;
|
|
|
|
// Rotation anti-alias
|
|
ImageEnView1.LayersRotationFilter := ierBicubic;
|
|
ImageEnView1.LayersRotationAntialias := true;
|
|
ImageEnView1.LayersRotationUseFilterOnPreview := False;
|
|
|
|
// Fast drawing
|
|
ImageEnView1.LayersFastDrawing := iefFast;
|
|
end
|
|
else
|
|
if cmbPreviewQuality.ItemIndex = _cmbPreviewQuality_Delayed_Best then
|
|
begin
|
|
// DELAYED HIGH QUALITY
|
|
|
|
// Zoom filter
|
|
ImageEnView1.ZoomFilter := rfLanczos3;
|
|
ImageEnView1.DelayZoomFilter := True;
|
|
|
|
// Rotation anti-alias
|
|
ImageEnView1.LayersRotationFilter := ierBicubic;
|
|
ImageEnView1.LayersRotationAntialias := True;
|
|
ImageEnView1.LayersRotationUseFilterOnPreview := True;
|
|
|
|
// Fast drawing
|
|
ImageEnView1.LayersFastDrawing := iefDelayed;
|
|
end
|
|
else
|
|
begin
|
|
// HIGH QUALITY
|
|
|
|
// Zoom filter
|
|
ImageEnView1.ZoomFilter := rfLanczos3;
|
|
ImageEnView1.DelayZoomFilter := False;
|
|
|
|
// Rotation anti-alias
|
|
ImageEnView1.LayersRotationFilter := ierBicubic;
|
|
ImageEnView1.LayersRotationAntialias := True;
|
|
ImageEnView1.LayersRotationUseFilterOnPreview := True;
|
|
|
|
// Fast drawing
|
|
ImageEnView1.LayersFastDrawing := iefNormal;
|
|
end;
|
|
|
|
ImageEnView1.Update();
|
|
end;
|
|
|
|
|
|
procedure Tfmain.edtEdgeFeatherChange(Sender: TObject);
|
|
begin
|
|
with ImageEnView1 do
|
|
begin
|
|
CurrentLayer.AlphaEdgeFeathering := updEdgeFeather.Position;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|