BSOne.SFC/EM.Lib/ImageEn_SRC/Demos/ImageEditing/Layers/main.pas

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.