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.