2869 lines
103 KiB
Plaintext
2869 lines
103 KiB
Plaintext
unit umain;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
Menus, ExtCtrls, StdCtrls, Buttons, ComCtrls, ImgList, ToolWin,
|
|
IEView, IEOpenSaveDlg, ImageEnView, ImageEnIO, ImageEnProc, HYIEutils, HYIEdefs,
|
|
StdActns, ActnList, iexBitmaps, iesettings, iexLayers, iexRulers;
|
|
|
|
type
|
|
TMainForm = class ( TForm )
|
|
MainMenu1: TMainMenu;
|
|
File1: TMenuItem;
|
|
FileOpen1: TMenuItem;
|
|
N1: TMenuItem;
|
|
FileExit1: TMenuItem;
|
|
ColorDialog1: TColorDialog;
|
|
CheckBox1: TCheckBox;
|
|
PaintPoint: TSpeedButton;
|
|
PaintLine: TSpeedButton;
|
|
PaintEllipse: TSpeedButton;
|
|
PaintRect: TSpeedButton;
|
|
GroupBox1: TGroupBox;
|
|
SidePanel1: TPanel;
|
|
Preview: TImageEnView;
|
|
ListViewFrames: TListView;
|
|
OpenImageEnDialog1: TOpenImageEnDialog;
|
|
SaveImageEnDialog1: TSaveImageEnDialog;
|
|
ProgressBar1: TProgressBar;
|
|
StatusBar1: TStatusBar;
|
|
FileSave1: TMenuItem;
|
|
FileSaveAs1: TMenuItem;
|
|
PageControl1: TPageControl;
|
|
FileClose1: TMenuItem;
|
|
N2: TMenuItem;
|
|
Edit1: TMenuItem;
|
|
EditCut1: TMenuItem;
|
|
EditCopy1: TMenuItem;
|
|
EditPaste1: TMenuItem;
|
|
EditPaste2: TMenuItem;
|
|
EditPasteIntoSelection1: TMenuItem;
|
|
Select1: TMenuItem;
|
|
SelectNone1: TMenuItem;
|
|
SelectRectangle1: TMenuItem;
|
|
SelectEllipse1: TMenuItem;
|
|
SelectZoom1: TMenuItem;
|
|
SelectMagicWand1: TMenuItem;
|
|
SelectPolygon1: TMenuItem;
|
|
SelectLasso1: TMenuItem;
|
|
SelectInvertSelection1: TMenuItem;
|
|
SelectMagicWandOptions1: TMenuItem;
|
|
EditUndo1: TMenuItem;
|
|
EditRedo1: TMenuItem;
|
|
N3: TMenuItem;
|
|
MakeXPIcon1: TButton;
|
|
FillAdjacentForeground: TSpeedButton;
|
|
FillAdjacentBackground: TSpeedButton;
|
|
PickAlpha: TSpeedButton;
|
|
PickColor: TSpeedButton;
|
|
AddSoftShadow1: TButton;
|
|
AddInsideShadow1: TButton;
|
|
ImageList2: TImageList;
|
|
SelectIcon1: TMenuItem;
|
|
Options1: TMenuItem;
|
|
MarkOuter1: TMenuItem;
|
|
PopupMenu1: TPopupMenu;
|
|
FileClose2: TMenuItem;
|
|
N4: TMenuItem;
|
|
FileSave2: TMenuItem;
|
|
FileSaveAs2: TMenuItem;
|
|
N5: TMenuItem;
|
|
EditUndo2: TMenuItem;
|
|
EditRedo2: TMenuItem;
|
|
N6: TMenuItem;
|
|
EditCut2: TMenuItem;
|
|
EditCopy2: TMenuItem;
|
|
EditPaste3: TMenuItem;
|
|
EditPaste4: TMenuItem;
|
|
EditPasteIntoSelection2: TMenuItem;
|
|
Select2: TMenuItem;
|
|
SelectNone2: TMenuItem;
|
|
SelectRectangle2: TMenuItem;
|
|
SelectEllipse2: TMenuItem;
|
|
SelectZoom2: TMenuItem;
|
|
SelectMagicWand2: TMenuItem;
|
|
SelectPolygon2: TMenuItem;
|
|
SelectLasso2: TMenuItem;
|
|
SelectMagicWandOptions2: TMenuItem;
|
|
SelectIcon2: TMenuItem;
|
|
SelectInvertSelection2: TMenuItem;
|
|
MarkOuter2: TMenuItem;
|
|
PaintAlpha: TSpeedButton;
|
|
Panel6: TPanel;
|
|
Up1: TSpeedButton;
|
|
Down1: TSpeedButton;
|
|
N7: TMenuItem;
|
|
N9: TMenuItem;
|
|
N8: TMenuItem;
|
|
EditCrop1: TMenuItem;
|
|
N10: TMenuItem;
|
|
Resize1: TMenuItem;
|
|
Resample1: TMenuItem;
|
|
Crop2: TMenuItem;
|
|
Resize2: TMenuItem;
|
|
Resample2: TMenuItem;
|
|
ImageList3: TImageList;
|
|
CoolBar2: TCoolBar;
|
|
ToolBar1: TToolBar;
|
|
NewButton1: TToolButton;
|
|
OpenButton1: TToolButton;
|
|
ToolButton3: TToolButton;
|
|
SaveButton1: TToolButton;
|
|
SaveAsButton1: TToolButton;
|
|
ToolButton8: TToolButton;
|
|
CloseButton1: TToolButton;
|
|
CutButton1: TToolButton;
|
|
CopyButton1: TToolButton;
|
|
PasteButton1: TToolButton;
|
|
UndoButton1: TToolButton;
|
|
ToolButton16: TToolButton;
|
|
RedoButton1: TToolButton;
|
|
ToolButton19: TToolButton;
|
|
CropButton1: TToolButton;
|
|
ToolButton21: TToolButton;
|
|
ExitButton1: TToolButton;
|
|
GroupBox2: TGroupBox;
|
|
TrackBarZoom: TTrackBar;
|
|
Delete1: TButton;
|
|
Import1: TButton;
|
|
Export1: TButton;
|
|
PaintTransparency: TEdit;
|
|
UpDownAlpha: TUpDown;
|
|
TrackBar1: TTrackBar;
|
|
Label2: TLabel;
|
|
EditFillTolerance: TEdit;
|
|
UpDownFillTolerance: TUpDown;
|
|
LabelAlpha: TLabel;
|
|
CheckBoxEnableAlpha: TCheckBox;
|
|
LabelPenWidth: TLabel;
|
|
EditPenWidth: TEdit;
|
|
UpDownPenWidth: TUpDown;
|
|
PaintFilledRect: TSpeedButton;
|
|
PaintFilledEllipse: TSpeedButton;
|
|
PaintRoundRect: TSpeedButton;
|
|
PaintFilledRoundRect: TSpeedButton;
|
|
Panel7: TPanel;
|
|
Fit1: TSpeedButton;
|
|
Extent1: TSpeedButton;
|
|
Help1: TMenuItem;
|
|
About1: TMenuItem;
|
|
ImageList1: TImageList;
|
|
GrayScale1: TButton;
|
|
Negative1: TButton;
|
|
PopupMenu2: TPopupMenu;
|
|
Paste1: TMenuItem;
|
|
PasteIntoSelection1: TMenuItem;
|
|
Paste2: TMenuItem;
|
|
SelectButton1: TToolButton;
|
|
ToolButton2: TToolButton;
|
|
PopupMenu3: TPopupMenu;
|
|
Select3: TMenuItem;
|
|
InvertSelection1: TMenuItem;
|
|
Icon3: TMenuItem;
|
|
MagicWandOptions1: TMenuItem;
|
|
Lasso1: TMenuItem;
|
|
Polygon1: TMenuItem;
|
|
MagicWand1: TMenuItem;
|
|
Zoom1: TMenuItem;
|
|
Ellipse1: TMenuItem;
|
|
Rectangle1: TMenuItem;
|
|
None1: TMenuItem;
|
|
SetAlpha: TBitBtn;
|
|
OpacityLabel: TLabel;
|
|
PaintOpacity: TEdit;
|
|
UpDownOpacity: TUpDown;
|
|
N11: TMenuItem;
|
|
N12: TMenuItem;
|
|
N13: TMenuItem;
|
|
ActionList1: TActionList;
|
|
FileExit: TFileExit;
|
|
EditCut: TEditCut;
|
|
EditCopy: TEditCopy;
|
|
EditPaste: TEditPaste;
|
|
EditUndo: TEditUndo;
|
|
FileNew: TAction;
|
|
FileSave: TAction;
|
|
SelectRect: TAction;
|
|
SelectEllipse: TAction;
|
|
SelectMagicwand: TAction;
|
|
SelectIcon: TAction;
|
|
SelectNone: TAction;
|
|
SelectZoom: TAction;
|
|
SelectPolygon: TAction;
|
|
SelectLasso: TAction;
|
|
FileSaveAs: TAction;
|
|
FileClose: TAction;
|
|
EditRedo: TAction;
|
|
EditCrop: TAction;
|
|
EditPasteIntoSelection: TAction;
|
|
EditResize: TAction;
|
|
EditResample: TAction;
|
|
FileOpen: TAction;
|
|
New1: TMenuItem;
|
|
SelectMagicWandOptions: TAction;
|
|
SelectInvertSelection: TAction;
|
|
PickAlphaColor: TSpeedButton;
|
|
ForeColor: TShape;
|
|
BackColor: TShape;
|
|
CurrentFore: TShape;
|
|
CurrentBack: TShape;
|
|
LabelAlpha1: TLabel;
|
|
Sort1: TButton;
|
|
GroupBox3: TGroupBox;
|
|
GroupBox4: TGroupBox;
|
|
GroupBox5: TGroupBox;
|
|
About: TAction;
|
|
Help: TAction;
|
|
Help2: TMenuItem;
|
|
procedure FileExit1Click ( Sender: TObject );
|
|
procedure TrackBarZoomChange ( Sender: TObject );
|
|
procedure FormCreate ( Sender: TObject );
|
|
procedure CheckBox1Click ( Sender: TObject );
|
|
procedure ListViewFramesSelectItem ( Sender: TObject; Item: TListItem;
|
|
Selected: Boolean );
|
|
procedure FileSaveAs1Click ( Sender: TObject );
|
|
procedure PageControl1Change ( Sender: TObject );
|
|
procedure Delete1Click ( Sender: TObject );
|
|
procedure Import1Click ( Sender: TObject );
|
|
procedure SetAlphaClick ( Sender: TObject );
|
|
procedure MakeXPIcon1Click ( Sender: TObject );
|
|
procedure CheckBoxEnableAlphaClick ( Sender: TObject );
|
|
procedure FillAdjacentForegroundClick ( Sender: TObject );
|
|
procedure UpDownAlphaClick ( Sender: TObject; Button: TUDBtnType );
|
|
procedure TrackBar1Change ( Sender: TObject );
|
|
procedure PickAlphaClick ( Sender: TObject );
|
|
procedure PickColorClick ( Sender: TObject );
|
|
procedure Export1Click ( Sender: TObject );
|
|
procedure AddSoftShadow1Click ( Sender: TObject );
|
|
procedure AddInsideShadow1Click ( Sender: TObject );
|
|
procedure FillAdjacentBackgroundClick ( Sender: TObject );
|
|
procedure MarkOuter2Click ( Sender: TObject );
|
|
procedure Up1Click ( Sender: TObject );
|
|
procedure Down1Click ( Sender: TObject );
|
|
procedure PageControl1MouseDown ( Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer );
|
|
procedure PageControl1DragDrop ( Sender, Source: TObject; X, Y: Integer );
|
|
procedure PageControl1DragOver ( Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean );
|
|
procedure ListViewFramesClick ( Sender: TObject );
|
|
procedure Fit1Click ( Sender: TObject );
|
|
procedure Extent1Click ( Sender: TObject );
|
|
procedure GrayScale1Click ( Sender: TObject );
|
|
procedure Negative1Click ( Sender: TObject );
|
|
procedure Select1Click ( Sender: TObject );
|
|
procedure PaintPointClick ( Sender: TObject );
|
|
procedure PaintLineClick ( Sender: TObject );
|
|
procedure PaintRectClick ( Sender: TObject );
|
|
procedure PaintRoundRectClick ( Sender: TObject );
|
|
procedure PaintEllipseClick ( Sender: TObject );
|
|
procedure PaintFilledRectClick ( Sender: TObject );
|
|
procedure PaintFilledRoundRectClick ( Sender: TObject );
|
|
procedure PaintFilledEllipseClick ( Sender: TObject );
|
|
procedure PaintAlphaClick ( Sender: TObject );
|
|
procedure UpDownPenWidthClick ( Sender: TObject; Button: TUDBtnType );
|
|
procedure UpDownOpacityChanging ( Sender: TObject;
|
|
var AllowChange: Boolean );
|
|
procedure SelectNoneExecute ( Sender: TObject );
|
|
procedure SelectRectExecute ( Sender: TObject );
|
|
procedure SelectEllipseExecute ( Sender: TObject );
|
|
procedure SelectZoomExecute ( Sender: TObject );
|
|
procedure SelectMagicwandExecute ( Sender: TObject );
|
|
procedure SelectPolygonExecute ( Sender: TObject );
|
|
procedure SelectLassoExecute ( Sender: TObject );
|
|
procedure SelectIconExecute ( Sender: TObject );
|
|
procedure FileNewExecute ( Sender: TObject );
|
|
procedure FileOpenBeforeExecute ( Sender: TObject );
|
|
procedure FileSaveExecute ( Sender: TObject );
|
|
procedure FileSaveAsBeforeExecute ( Sender: TObject );
|
|
procedure FileSaveAsExecute ( Sender: TObject );
|
|
procedure FileCloseExecute ( Sender: TObject );
|
|
procedure EditCutExecute ( Sender: TObject );
|
|
procedure EditCopyExecute ( Sender: TObject );
|
|
procedure EditPasteExecute ( Sender: TObject );
|
|
procedure EditUndoExecute ( Sender: TObject );
|
|
procedure EditRedoExecute ( Sender: TObject );
|
|
procedure EditCropExecute ( Sender: TObject );
|
|
procedure EditPasteIntoSelectionExecute ( Sender: TObject );
|
|
procedure FileOpenExecute ( Sender: TObject );
|
|
procedure SelectMagicWandOptionsExecute ( Sender: TObject );
|
|
procedure SelectInvertSelectionExecute ( Sender: TObject );
|
|
procedure PickAlphaColorClick ( Sender: TObject );
|
|
procedure ForeColorMouseDown ( Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer );
|
|
procedure BackColorMouseDown ( Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
|
|
procedure Sort1Click ( Sender: TObject );
|
|
procedure AboutExecute(Sender: TObject);
|
|
procedure HelpExecute(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
TabSheet: TTabSheet;
|
|
Image: TImageEnView;
|
|
startX, startY: integer;
|
|
lastX, lastY: integer;
|
|
AlphaChanging: boolean;
|
|
OpacityChanging: boolean;
|
|
Loading: boolean;
|
|
Moving: boolean;
|
|
procedure AddTabsheet;
|
|
procedure UpdateMenu;
|
|
procedure ClearStatusbar;
|
|
procedure ImageEnViewMouseMove ( Sender: TObject; Shift: TShiftState; X,
|
|
Y: Integer );
|
|
procedure ImageEnViewMouseDown ( Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer );
|
|
procedure ImageEnViewMouseUp ( Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer );
|
|
procedure ImageEnViewSelectionChange ( Sender: TObject );
|
|
procedure ImageEnViewMouseInSel ( Sender: TObject );
|
|
procedure ImageEnViewProgress(Sender: TObject; per: Integer);
|
|
protected
|
|
procedure WMDropFiles ( var Msg: TMessage ); message wm_DropFiles;
|
|
procedure AppOnMsg ( var Msg: TMsg; var Handled: Boolean );
|
|
procedure MyUndo(ie:TImageEnView); // fdv
|
|
public
|
|
{ Public declarations }
|
|
FilePath: string;
|
|
ImageEnView: TImageEnView;
|
|
end;
|
|
|
|
{ Commands to pass to HtmlHelp() }
|
|
|
|
const
|
|
HH_DISPLAY_TOPIC = $0000;
|
|
HH_HELP_FINDER = $0000; // WinHelp equivalent
|
|
HH_DISPLAY_TOC = $0001; // not currently implemented
|
|
HH_DISPLAY_INDEX = $0002; // not currently implemented
|
|
HH_DISPLAY_SEARCH = $0003; // not currently implemented
|
|
HH_SET_WIN_TYPE = $0004;
|
|
HH_GET_WIN_TYPE = $0005;
|
|
HH_GET_WIN_HANDLE = $0006;
|
|
HH_ENUM_INFO_TYPE = $0007; // Get Info type name, call repeatedly to enumerate, -1 at end
|
|
HH_SET_INFO_TYPE = $0008; // Add Info type to filter.
|
|
HH_SYNC = $0009;
|
|
HH_RESERVED1 = $000A;
|
|
HH_RESERVED2 = $000B;
|
|
HH_RESERVED3 = $000C;
|
|
HH_KEYWORD_LOOKUP = $000D;
|
|
HH_DISPLAY_TEXT_POPUP = $000E; // display string resource id or text in a popup window
|
|
HH_HELP_CONTEXT = $000F; // display mapped numeric value in dwData
|
|
HH_TP_HELP_CONTEXTMENU = $0010; // text popup help, same as WinHelp HELP_CONTEXTMENU
|
|
HH_TP_HELP_WM_HELP = $0011; // text popup help, same as WinHelp HELP_WM_HELP
|
|
HH_CLOSE_ALL = $0012; // close all windows opened directly or indirectly by the caller
|
|
HH_ALINK_LOOKUP = $0013; // ALink version of HH_KEYWORD_LOOKUP
|
|
HH_GET_LAST_ERROR = $0014; // not currently implemented // See HHERROR.h
|
|
HH_ENUM_CATEGORY = $0015; // Get category name, call repeatedly to enumerate, -1 at end
|
|
HH_ENUM_CATEGORY_IT = $0016; // Get category info type members, call repeatedly to enumerate, -1 at end
|
|
HH_RESET_IT_FILTER = $0017; // Clear the info type filter of all info types.
|
|
HH_SET_INCLUSIVE_FILTER = $0018; // set inclusive filtering method for untyped topics to be included in display
|
|
HH_SET_EXCLUSIVE_FILTER = $0019; // set exclusive filtering method for untyped topics to be excluded from display
|
|
HH_INITIALIZE = $001C; // Initializes the help system.
|
|
HH_UNINITIALIZE = $001D; // Uninitializes the help system.
|
|
HH_PRETRANSLATEMESSAGE = $00fd; // Pumps messages. (NULL, NULL, MSG*).
|
|
HH_SET_GLOBAL_PROPERTY = $00fc; // Set a global property. (NULL, NULL, HH_GPROP)
|
|
|
|
var
|
|
MainForm: TMainForm;
|
|
|
|
implementation
|
|
|
|
uses Clipbrd, ShellAPI, uSelectionProperties, uImport, uAbout, uSplash;
|
|
|
|
{$R *.DFM}
|
|
{$R WindowsTheme.res}
|
|
|
|
// global
|
|
function GetTempFile ( const Extension: string ): string;
|
|
var
|
|
Buffer: array [ 0..MAX_PATH ] of Char;
|
|
begin
|
|
repeat
|
|
GetTempPath ( SizeOf ( Buffer ) - 1, Buffer );
|
|
GetTempFileName ( Buffer, '', 0, Buffer );
|
|
Result := ChangeFileExt ( Buffer, Extension );
|
|
until not FileExists ( Result );
|
|
end;
|
|
|
|
function ColorToHex ( Color: TColor ): string;
|
|
begin
|
|
Result := IntToHex ( GetRValue ( Color ), 2 ) + IntToHex ( GetGValue ( Color ), 2 ) + IntToHex ( GetBValue ( Color ), 2 );
|
|
end;
|
|
|
|
procedure TMainForm.WMDropFiles ( var Msg: TMessage );
|
|
var
|
|
Filename: array [ 0..256 ] of Char;
|
|
i: integer;
|
|
w, h: integer;
|
|
Frames: integer;
|
|
ListItem: TListItem;
|
|
fBitCount: integer;
|
|
fBitsPerSample: integer;
|
|
fSamplesPerPixel: integer;
|
|
Filter: TResampleFilter;
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
DragQueryFile ( THandle ( Msg.WParam ), 0, Filename, Sizeof ( Filename ) );
|
|
FilePath := Filename;
|
|
PageControl1.Visible := False;
|
|
// close all pages
|
|
if PageControl1.PageCount > 0 then
|
|
for i := PageControl1.PageCount - 1 downto 0 do
|
|
PageControl1.Pages [ i ].Free;
|
|
FilePath := FileName;
|
|
Frames := IEGetFileFramesCount ( FilePath );
|
|
if Frames > 1 then
|
|
begin
|
|
ListViewFrames.Clear;
|
|
Preview.Clear;
|
|
ProgressBar1.Max := Frames;
|
|
Loading := True;
|
|
for i := 0 to Frames - 1 do
|
|
begin
|
|
AddTabsheet;
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
with ImageEnView do
|
|
begin
|
|
LegacyBitmap := false;
|
|
Cursor := crIECross;
|
|
IO.Params.ICO_ImageIndex := i;
|
|
IO.LoadFromFile ( FilePath );
|
|
ListItem := ListViewFrames.Items.Add;
|
|
ListItem.Caption := IntToStr ( i + 1 );
|
|
ListItem.SubItems.Add ( IntToStr ( IEBitmap.Width ) + ' pixels x ' + IntToStr ( IEBitmap.Height ) + ' pixels' );
|
|
ListItem.SubItems.Add ( IntToStr ( IO.Params.SamplesPerPixel * IO.Params.BitsPerSample ) + ' bit' );
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( i + 1 ) + ' ' + IntToStr ( IEBitmap.Width ) + ' pixels x ' + IntToStr ( IEBitmap.Height ) + ' pixels' + ' ' + IntToStr ( IO.Params.SamplesPerPixel * IO.Params.BitsPerSample ) + ' bit';
|
|
ListItem.Selected := True;
|
|
ListViewFrames.ItemIndex := i;
|
|
ProgressBar1.Position := i;
|
|
Bitmap.Modified := False;
|
|
end;
|
|
end;
|
|
ImageEnView.Proc.ClearAllUndo;
|
|
ImageEnView.Proc.ClearAllRedo;
|
|
StatusBar1.Panels [ 0 ].Text := ExtractFilePath ( FilePath );
|
|
StatusBar1.Panels [ 1 ].Text := ExtractFileName ( FilePath );
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
StatusBar1.Panels [ 5 ].Text := IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
BackColor.Brush.Color := TRGB2TColor ( ImageEnView.AlphaChannel.Pixels [ 0, ImageEnView.IEBitmap.Height - 1 ] );
|
|
CheckBoxEnableAlpha.Checked := ImageEnView.HasAlphaChannel;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
ProgressBar1.Position := 0;
|
|
PageControl1.Visible := True;
|
|
UpdateMenu;
|
|
Loading := False;
|
|
end
|
|
else // load single frame image
|
|
begin
|
|
ListViewFrames.Clear;
|
|
Preview.Clear;
|
|
ProgressBar1.Max := Frames;
|
|
Loading := True;
|
|
AddTabsheet;
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ 0 ].Controls [ 0 ] );
|
|
ImageEnView.IO.LoadFromFile ( FilePath );
|
|
ImageEnView.Proc.ClearAllUndo;
|
|
ImageEnView.Proc.ClearAllRedo;
|
|
if ( MessageDlg ( 'Resample the image?', mtConfirmation, [ mbYes, mbNo ], 0 ) = mrYes ) then
|
|
begin
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndoCaptioned ( 'Resample ' + IntToStr ( UndoCount ) );
|
|
ClearAllRedo;
|
|
ClearUndo;
|
|
end;
|
|
frmImport := TfrmImport.Create ( Self );
|
|
try
|
|
if frmImport.ShowModal = mrOk then
|
|
begin
|
|
w := frmImport.fIconWidth;
|
|
h := frmImport.fIconHeight;
|
|
fBitCount := frmImport.fBitCount;
|
|
fBitsPerSample := frmImport.fBitsPerSample;
|
|
fSamplesPerPixel := frmImport.fSamplesPerPixel;
|
|
Filter := TResampleFilter ( frmImport.ComboBox1.ItemIndex );
|
|
ImageEnView.Proc.Resample ( w, h, Filter );
|
|
ImageEnView.IO.Params.Width := w;
|
|
ImageEnView.IO.Params.Height := h;
|
|
ImageEnView.IO.Params.ICO_BitCount [ PageControl1.ActivePageIndex ] := fBitCount;
|
|
ImageEnView.IO.Params.BitsPerSample := fBitsPerSample;
|
|
ImageEnView.IO.Params.SamplesPerPixel := fSamplesPerPixel;
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( PageControl1.ActivePageIndex + 1 ) + ' ' + IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels ' + IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
ListItem := ListViewFrames.Items.Add;
|
|
ListItem.Caption := IntToStr ( PageControl1.ActivePageIndex + 1 );
|
|
ListItem.SubItems.Add ( IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels' );
|
|
ListItem.SubItems.Add ( IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit' );
|
|
ImageEnView.IEBitmap.Modified := True;
|
|
end;
|
|
finally; frmImport.Free; end;
|
|
end
|
|
else
|
|
begin
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( PageControl1.ActivePageIndex + 1 ) + ' ' + IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels ' + IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
ListItem := ListViewFrames.Items.Add;
|
|
ListItem.Caption := IntToStr ( PageControl1.ActivePageIndex + 1 );
|
|
ListItem.SubItems.Add ( IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels' );
|
|
ListItem.SubItems.Add ( IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit' );
|
|
ImageEnView.IEBitmap.Modified := True;
|
|
end;
|
|
end;
|
|
StatusBar1.Panels [ 0 ].Text := ExtractFilePath ( FilePath );
|
|
StatusBar1.Panels [ 1 ].Text := ExtractFileName ( FilePath );
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
StatusBar1.Panels [ 5 ].Text := IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
BackColor.Brush.Color := TRGB2TColor ( ImageEnView.AlphaChannel.Pixels [ 0, ImageEnView.IEBitmap.Height - 1 ] );
|
|
CheckBoxEnableAlpha.Checked := ImageEnView.HasAlphaChannel;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
ImageEnView.Fit;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
ProgressBar1.Position := 0;
|
|
PageControl1.Visible := True;
|
|
UpdateMenu;
|
|
ListViewFrames.Items.Item [ ListViewFrames.Items.Count - 1 ].Selected := True;
|
|
Loading := False;
|
|
finally; Screen.Cursor := crDefault; end;
|
|
end;
|
|
|
|
procedure TMainForm.AppOnMsg ( var Msg: TMsg; var Handled: Boolean );
|
|
var
|
|
Filename: array [ 0..256 ] of Char;
|
|
begin
|
|
with Application do
|
|
if ( Msg.Message = wm_DropFiles ) and ( IsIconic ( Handle ) ) then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
Loading := True;
|
|
PageControl1.Visible := False;
|
|
DragQueryFile ( THandle ( Msg.WParam ), 0, Filename, Sizeof ( Filename ) );
|
|
AddTabsheet;
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.Cursor := crIECross;
|
|
FilePath := FileName;
|
|
PageControl1.ActivePage.Caption := FilePath;
|
|
ImageEnView.IO.LoadFromFile ( FilePath );
|
|
PageControl1.ActivePageIndex := PageControl1.PageCount - 1;
|
|
TrackBarZoom.Hint := 'Zoom: ' + FloatToStrF ( ImageEnView.Zoom, ffFixed, 10, 1 ) + '%';
|
|
ImageEnView.Fit;
|
|
UpdateMenu;
|
|
ImageEnView.Proc.ClearAllUndo;
|
|
ImageEnView.Proc.ClearAllRedo;
|
|
StatusBar1.Panels [ 0 ].Text := ExtractFilePath ( FilePath );
|
|
StatusBar1.Panels [ 1 ].Text := ExtractFileName ( FilePath );
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
StatusBar1.Panels [ 5 ].Text := IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
BackColor.Brush.Color := TRGB2TColor ( ImageEnView.AlphaChannel.Pixels [ 0, ImageEnView.IEBitmap.Height - 1 ] );
|
|
CheckBoxEnableAlpha.Checked := ImageEnView.HasAlphaChannel;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
ImageEnView.Fit;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
DragFinish ( THandle ( Msg.WParam ) );
|
|
PageControl1.Visible := True;
|
|
ListViewFrames.Items.Item [ ListViewFrames.Items.Count - 1 ].Selected := True;
|
|
Loading := False;
|
|
finally; Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FormCreate ( Sender: TObject );
|
|
begin
|
|
frmSplash.Progress := 20;
|
|
Sleep ( 150 );
|
|
DragAcceptFiles ( Handle, True );
|
|
Application.OnMessage := AppOnMsg;
|
|
frmSplash.Progress := 40;
|
|
Sleep ( 150 );
|
|
ForeColor.Brush.Color := clRed;
|
|
Preview.SetChessboardStyle ( 6, bsSolid );
|
|
frmSplash.Progress := 60;
|
|
Sleep ( 150 );
|
|
UpdateMenu;
|
|
Loading := False;
|
|
Moving := False;
|
|
frmSplash.Progress := 80;
|
|
Sleep ( 150 );
|
|
OpacityChanging := False;
|
|
AlphaChanging := False;
|
|
frmSplash.Progress := 100;
|
|
Application.HelpFile := ExtractFilePath(Application.ExeName) + 'plainiconeditor.chm';
|
|
Sleep ( 300 );
|
|
end;
|
|
|
|
procedure TMainForm.AddTabsheet;
|
|
begin
|
|
// create a new tabsheet
|
|
with PageControl1 do
|
|
TabSheet := TTabSheet.Create ( Self );
|
|
// set the tabsheet.pagecontrol to PageControl1
|
|
TabSheet.PageControl := PageControl1;
|
|
// set the activepage to tabsheet
|
|
PageControl1.ActivePage := TabSheet;
|
|
with Tabsheet do
|
|
begin
|
|
// create an ImageEnView component
|
|
Image := TImageEnView.Create ( Self );
|
|
Image.Parent := Tabsheet;
|
|
Image.Align := alClient;
|
|
Image.Visible := True;
|
|
Image.ZoomFilter := rfNone;
|
|
Image.SetChessboardStyle ( 6, bsSolid );
|
|
Image.SetSelectionGripStyle ( clwhite, clred, bsSolid, 3, true );
|
|
Image.DelayDisplaySelection := True;
|
|
Image.IEBitmap.AlphaChannel.Location := ieTBitmap; // handle the alpha channel as TBitmap
|
|
Image.SelectionBase := iesbBitmap;
|
|
Image.Proc.AutoUndo := False;
|
|
Image.Proc.UndoLimit := 15;
|
|
Image.Background := $00FFF4F4;
|
|
Image.Zoom := 1000;
|
|
Image.AutoFit := False;
|
|
Image.DisplayGrid := True;
|
|
Image.BorderStyle := bsSingle;
|
|
Image.MouseInteract := [ ];
|
|
Image.Cursor := crIECross;
|
|
Image.OnProgress := ImageEnViewProgress;
|
|
Image.OnMouseDown := ImageEnViewMouseDown;
|
|
Image.OnMouseMove := ImageEnViewMouseMove;
|
|
Image.OnMouseUp := ImageEnViewMouseUp;
|
|
//Image.OnImageChange := ImageEnViewImageChange;
|
|
Image.OnSelectionChange := ImageEnViewSelectionChange;
|
|
Image.OnMouseInSel := ImageEnViewMouseInSel;
|
|
Image.Tag := 0;
|
|
Image.SelColor1 := clRed;
|
|
Image.SelColor2 := clWhite;
|
|
Image.BackgroundStyle := iebsChessboard;
|
|
Image.EnableAlphaChannel := True;
|
|
Image.Proc.AttachedImageEn := Image;
|
|
// mouse wheel will scroll image of 15 % of component height
|
|
Image.MouseWheelParams.Action := iemwVScroll;
|
|
Image.MouseWheelParams.Variation := iemwPercentage;
|
|
Image.MouseWheelParams.Value := 15;
|
|
// set scrollbar params to match wheel
|
|
Image.HScrollBarParams.LineStep := 15;
|
|
Image.VScrollBarParams.LineStep := 15;
|
|
// the folowing two lines are the key to referencing the components later
|
|
// set tag to monitor image change - 0 = false, 1 = true
|
|
TabSheet.Tag := Integer ( Image );
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.UpdateMenu;
|
|
var
|
|
e: boolean;
|
|
begin
|
|
e := PageControl1.PageCount >= 1;
|
|
FileClose1.Enabled := e;
|
|
FileSave1.Enabled := e;
|
|
FileSaveAs1.Enabled := e;
|
|
SelectButton1.Enabled := e;
|
|
Edit1.Enabled := e;
|
|
EditFillTolerance.Enabled := e;
|
|
EditCopy1.Enabled := e;
|
|
EditPaste1.Enabled := ( Clipboard.HasFormat ( CF_PICTURE ) ) and ( e );
|
|
EditPasteIntoSelection1.Enabled := ( Clipboard.HasFormat ( CF_PICTURE ) ) and ( e );
|
|
Select1.Enabled := e;
|
|
SelectNone1.Enabled := e;
|
|
SelectRectangle1.Enabled := e;
|
|
SelectEllipse1.Enabled := e;
|
|
SelectZoom1.Enabled := e;
|
|
SelectMagicWand1.Enabled := e;
|
|
SelectPolygon1.Enabled := e;
|
|
SelectLasso1.Enabled := e;
|
|
SelectMagicWandOptions1.Enabled := e;
|
|
SelectInvertSelection1.Enabled := e;
|
|
SidePanel1.Enabled := e;
|
|
ListViewFrames.Enabled := e;
|
|
GroupBox1.Enabled := e;
|
|
ForeColor.Enabled := e;
|
|
CurrentFore.Enabled := e;
|
|
CurrentBack.Enabled := e;
|
|
PaintTransparency.Enabled := e;
|
|
UpDownAlpha.Enabled := e;
|
|
UpDownFillTolerance.Enabled := e;
|
|
Label2.Enabled := e;
|
|
LabelAlpha.Enabled := e;
|
|
OpacityLabel.Enabled := e;
|
|
PaintOpacity.Enabled := e;
|
|
UpDownOpacity.Enabled := e;
|
|
LabelPenWidth.Enabled := e;
|
|
EditPenWidth.Enabled := e;
|
|
UpDownPenWidth.Enabled := e;
|
|
TrackBarZoom.Enabled := e;
|
|
Up1.Enabled := e;
|
|
Down1.Enabled := e;
|
|
Delete1.Enabled := e;
|
|
Sort1.Enabled := e;
|
|
Import1.Enabled := e;
|
|
Export1.Enabled := e;
|
|
PaintPoint.Enabled := e;
|
|
PaintRect.Enabled := e;
|
|
PaintRoundRect.Enabled := e;
|
|
PaintEllipse.Enabled := e;
|
|
PaintFilledRect.Enabled := e;
|
|
PaintFilledRoundRect.Enabled := e;
|
|
PaintFilledEllipse.Enabled := e;
|
|
PaintLine.Enabled := e;
|
|
PickAlpha.Enabled := e;
|
|
PaintAlpha.Enabled := e;
|
|
PickColor.Enabled := e;
|
|
PickAlphaColor.Enabled := e;
|
|
FillAdjacentForeground.Enabled := e;
|
|
FillAdjacentBackground.Enabled := e;
|
|
SetAlpha.Enabled := e;
|
|
MakeXPIcon1.Enabled := e;
|
|
AddSoftShadow1.Enabled := e;
|
|
AddInsideShadow1.Enabled := e;
|
|
CheckBoxEnableAlpha.Enabled := e;
|
|
CheckBox1.Enabled := e;
|
|
ProgressBar1.Enabled := e;
|
|
TrackBar1.Enabled := e;
|
|
SaveButton1.Enabled := e;
|
|
SaveAsButton1.Enabled := e;
|
|
CloseButton1.Enabled := e;
|
|
CopyButton1.Enabled := e;
|
|
EditCut1.Enabled := e;
|
|
CutButton1.Enabled := e;
|
|
EditCrop1.Enabled := e;
|
|
CropButton1.Enabled := e;
|
|
EditUndo1.Enabled := e;
|
|
EditUndo2.Enabled := e;
|
|
UndoButton1.Enabled := e;
|
|
EditRedo1.Enabled := e;
|
|
EditRedo2.Enabled := e;
|
|
RedoButton1.Enabled := e;
|
|
GrayScale1.Enabled := e;
|
|
Negative1.Enabled := e;
|
|
Fit1.Enabled := e;
|
|
Extent1.Enabled := e;
|
|
if ListViewFrames.Items.Count > 0 then
|
|
begin
|
|
if assigned(ListViewFrames.Selected) then // fdv
|
|
begin
|
|
Down1.Enabled := ListViewFrames.Selected.Index < ListViewFrames.Items.Count-1;
|
|
Up1.Enabled := ListViewFrames.Selected.Index > 0;
|
|
end;
|
|
end;
|
|
PasteButton1.Enabled := ( Clipboard.HasFormat ( CF_PICTURE ) );
|
|
if PageControl1.PageCount <> 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
EditCut1.Enabled := ( e ) and ( ImageEnView.Selected );
|
|
CutButton1.Enabled := ( e ) and ( ImageEnView.Selected );
|
|
EditCrop1.Enabled := ( e ) and ( ImageEnView.Selected );
|
|
CropButton1.Enabled := ( e ) and ( ImageEnView.Selected );
|
|
EditUndo1.Enabled := ( e ) and ( ImageEnView.Proc.CanUndo );
|
|
EditUndo2.Enabled := ( e ) and ( ImageEnView.Proc.CanUndo );
|
|
UndoButton1.Enabled := ( e ) and ( ImageEnView.Proc.CanUndo );
|
|
EditRedo1.Enabled := ( e ) and ( ImageEnView.Proc.CanRedo );
|
|
EditRedo2.Enabled := ( e ) and ( ImageEnView.Proc.CanRedo );
|
|
RedoButton1.Enabled := ( e ) and ( ImageEnView.Proc.CanRedo );
|
|
end
|
|
end;
|
|
|
|
procedure TMainForm.ClearStatusbar;
|
|
begin
|
|
StatusBar1.Panels [ 0 ].Text := '';
|
|
StatusBar1.Panels [ 1 ].Text := '';
|
|
StatusBar1.Panels [ 2 ].Text := '';
|
|
StatusBar1.Panels [ 3 ].Text := '';
|
|
StatusBar1.Panels [ 4 ].Text := '';
|
|
StatusBar1.Panels [ 5 ].Text := '';
|
|
StatusBar1.Panels [ 6 ].Text := '';
|
|
end;
|
|
|
|
procedure TMainForm.FileExit1Click ( Sender: TObject );
|
|
begin
|
|
Close;
|
|
end;
|
|
|
|
procedure TMainForm.TrackBarZoomChange ( Sender: TObject );
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.Zoom := TrackBarZoom.Position;
|
|
TrackBarZoom.Hint := 'Zoom: ' + FloatToStrF ( ImageEnView.Zoom, ffFixed, 10, 1 ) + '%';
|
|
Application.ActivateHint ( Mouse.CursorPos );
|
|
ImageEnView.Update;
|
|
end;
|
|
end;
|
|
|
|
procedure SetGrayPal ( hdc: integer );
|
|
var
|
|
pe: array [ 0..255 ] of TRGBQuad;
|
|
i: integer;
|
|
begin
|
|
for i := 0 to 255 do
|
|
with pe [ i ] do
|
|
begin
|
|
rgbRed := i;
|
|
rgbGreen := i;
|
|
rgbBlue := i;
|
|
rgbReserved := 0;
|
|
end;
|
|
SetDibColorTable ( hdc, 0, 256, pe );
|
|
end;
|
|
|
|
procedure SetSquarePen ( Canvas: TCanvas; Color: TColor; Width: integer );
|
|
var
|
|
LogBrush: TLOGBRUSH;
|
|
begin
|
|
if Width > 1 then
|
|
begin
|
|
LogBrush.lbStyle := BS_Solid;
|
|
LogBrush.lbColor := Color;
|
|
LogBrush.lbHatch := 0;
|
|
Canvas.Pen.Handle := ExtCreatePen ( PS_Geometric or PS_Solid or PS_ENDCAP_SQUARE, Width, LogBrush, 0, nil );
|
|
end
|
|
else
|
|
begin
|
|
Canvas.Pen.Color := Color;
|
|
Canvas.Pen.Width := Width;
|
|
Canvas.Pen.Style := psSolid;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ImageEnViewMouseDown ( Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
|
|
var
|
|
BX, BY: integer;
|
|
RGBColor: TRGB;
|
|
o: single;
|
|
Opacity: integer;
|
|
Transparency: integer;
|
|
P1: TPoint;
|
|
PenWidth: integer;
|
|
x1, y1, x2, y2: integer;
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
|
|
PenWidth := UpDownPenWidth.Position;
|
|
|
|
with ImageEnView do
|
|
begin
|
|
if MouseInteract <> [ miZoom ] then
|
|
if Button = mbRight then
|
|
begin
|
|
GetCursorPos ( P1 );
|
|
PopupMenu1.Popup ( P1.x, P1.y );
|
|
end;
|
|
SetFocus;
|
|
end;
|
|
|
|
// we need to draw on alphachannel using GDI (Canvas), then it must be ieTBitmap and pf8bit
|
|
with ImageEnView do
|
|
begin
|
|
BX := XScr2Bmp ( X );
|
|
BY := YScr2Bmp ( Y );
|
|
startX := XScr2Bmp ( X );
|
|
startY := YScr2Bmp ( Y );
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Location := ieTBitmap;
|
|
IEBitmap.AlphaChannel.PixelFormat := ie8g;
|
|
IEBitmap.AlphaChannel.VclBitmap.PixelFormat := pf8bit;
|
|
SetGrayPal ( IEBitmap.AlphaChannel.VclBitmap.Canvas.Handle );
|
|
end;
|
|
|
|
if PaintPoint.Down then
|
|
begin
|
|
// Paint Point- with lineto
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
SetSquarePen ( IEBitmap.Canvas, ForeColor.Brush.Color, PenWidth );
|
|
IEBitmap.Canvas.MoveTo ( startX, startY );
|
|
IEBitmap.Canvas.LineTo ( BX, BY );
|
|
IEBitmap.Canvas.LineTo ( startX, startY );
|
|
Transparency := UpDownAlpha.Position;
|
|
SetSquarePen ( IEBitmap.AlphaChannel.Canvas, $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 ), PenWidth );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.MoveTo ( startX, startY );
|
|
IEBitmap.AlphaChannel.Canvas.LineTo ( BX, BY );
|
|
IEBitmap.AlphaChannel.Canvas.LineTo ( startX, startY );
|
|
Update;
|
|
|
|
// Paint last pixel Point
|
|
with ImageEnView do
|
|
begin
|
|
BX := XScr2Bmp ( X );
|
|
BY := YScr2Bmp ( Y );
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Pixels [ BX, BY ] := ForeColor.Brush.Color;
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Pixels [ BX, BY ] := ForeColor.Brush.Color;
|
|
IEBitmap.Alpha [ BX, BY ] := UpDownAlpha.Position;
|
|
Update;
|
|
end;
|
|
end;
|
|
end
|
|
else
|
|
if PaintAlpha.Down then
|
|
begin
|
|
// Paint Alpha
|
|
with ImageEnView do
|
|
begin
|
|
Proc.SaveUndo ( ieuImage );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Pixels [ BX, BY ] := ForeColor.Brush.Color;
|
|
IEBitmap.Alpha [ BX, BY ] := UpDownAlpha.Position;
|
|
Update;
|
|
end;
|
|
UpdateMenu;
|
|
end
|
|
else
|
|
if PaintLine.Down then
|
|
begin
|
|
// Begin paint line
|
|
with ImageEnView do
|
|
begin
|
|
Proc.SaveUndo ( ieuImage );
|
|
end;
|
|
UpdateMenu;
|
|
end
|
|
else
|
|
if PaintEllipse.Down then
|
|
begin
|
|
// Begin paint ellipse
|
|
with ImageEnView do
|
|
begin
|
|
Proc.SaveUndo ( ieuImage );
|
|
end;
|
|
UpdateMenu;
|
|
end
|
|
else
|
|
if PaintRect.Down then
|
|
begin
|
|
// Begin paint rect
|
|
with ImageEnView do
|
|
begin
|
|
Proc.SaveUndo ( ieuImage );
|
|
UpdateMenu;
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Color := BackColor.Brush.Color;
|
|
IEBitmap.Canvas.Brush.Style := bsClear;
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsClear;
|
|
end;
|
|
end
|
|
else
|
|
if PaintRoundRect.Down then
|
|
begin
|
|
// Begin paint round rect
|
|
with ImageEnView do
|
|
begin
|
|
Proc.SaveUndo ( ieuImage );
|
|
UpdateMenu;
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Color := BackColor.Brush.Color;
|
|
IEBitmap.Canvas.Brush.Style := bsClear;
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsClear;
|
|
end;
|
|
end
|
|
else
|
|
if PaintFilledRect.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Begin paint filled rect
|
|
with ImageEnView do
|
|
begin
|
|
Proc.SaveUndo ( ieuImage );
|
|
UpdateMenu;
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Brush.Color := BackColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Style := bsSolid;
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
end;
|
|
end
|
|
else
|
|
if PaintFilledRoundRect.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Filled Round Rect
|
|
with ImageEnView do
|
|
begin
|
|
Proc.SaveUndo ( ieuImage );
|
|
UpdateMenu;
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Color := BackColor.Brush.Color;
|
|
IEBitmap.Canvas.Brush.Style := bsSolid;
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsSolid;
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintFilledEllipse.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Filled Ellipse
|
|
with ImageEnView do
|
|
begin
|
|
Proc.SaveUndo ( ieuImage );
|
|
UpdateMenu;
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Color := BackColor.Brush.Color;
|
|
IEBitmap.Canvas.Brush.Style := bsSolid;
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsSolid;
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if FillAdjacentForeground.Down then
|
|
begin
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo ( ieuImage );
|
|
RGBColor := TColor2TRGB ( ForeColor.Brush.Color );
|
|
CastAlpha ( BX, BY, UpDownAlpha.Position, UpDownFillTolerance.Position );
|
|
CastColor ( BX, BY, RGBColor, UpDownFillTolerance.Position );
|
|
end;
|
|
UpdateMenu;
|
|
end
|
|
else
|
|
if FillAdjacentBackground.Down then
|
|
begin
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo ( ieuImage );
|
|
RGBColor := TColor2TRGB ( BackColor.Brush.Color );
|
|
CastAlpha ( BX, BY, UpDownAlpha.Position, UpDownFillTolerance.Position );
|
|
CastColor ( BX, BY, RGBColor, UpDownFillTolerance.Position );
|
|
end;
|
|
UpdateMenu;
|
|
end
|
|
else
|
|
if PickAlpha.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
UpDownAlpha.Position := ImageEnView.IEBitmap.Alpha [ BX, BY ];
|
|
o := ( UpDownOpacity.Position / 255 ) * 100;
|
|
Opacity := Trunc ( o );
|
|
UpDownOpacity.Position := Opacity;
|
|
PickAlpha.Down := False;
|
|
ImageEnView.Cursor := crIECross;
|
|
end
|
|
else
|
|
if PickColor.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
ForeColor.Brush.Color := ImageEnView.IEBitmap.Canvas.Pixels [ BX, BY ];
|
|
PickColor.Down := False;
|
|
ImageEnView.Cursor := crIECross;
|
|
end
|
|
else
|
|
if PickAlphaColor.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
UpDownAlpha.Position := ImageEnView.IEBitmap.Alpha [ BX, BY ];
|
|
o := ( UpDownOpacity.Position / 255 ) * 100;
|
|
Opacity := Trunc ( o );
|
|
UpDownOpacity.Position := Opacity;
|
|
BackColor.Brush.Color := ImageEnView.IEBitmap.Canvas.Pixels [ BX, BY ];
|
|
PickAlphaColor.Down := False;
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ImageEnViewMouseMove ( Sender: TObject;
|
|
Shift: TShiftState; X, Y: Integer );
|
|
var
|
|
SLeft: integer;
|
|
STop: integer;
|
|
SRight: integer;
|
|
SBottom: integer;
|
|
SHeight: integer;
|
|
SWidth: integer;
|
|
Transparency: integer;
|
|
BX, BY: integer;
|
|
PenWidth: integer;
|
|
x1, y1, x2, y2: integer;
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
PenWidth:=UpDownPenWidth.Position;
|
|
with ImageEnView do
|
|
begin
|
|
BX := XScr2Bmp ( X );
|
|
BY := YScr2Bmp ( Y );
|
|
SLeft := SelX1;
|
|
STop := SelY1;
|
|
SRight := SelX2;
|
|
SBottom := SelY2;
|
|
SHeight := SBottom - STop;
|
|
SWidth := SRight - SLeft;
|
|
end;
|
|
if ( ImageEnView.Selected ) then
|
|
begin
|
|
StatusBar1.Panels [ 4 ].Text := 'Selected: ' + IntToStr ( SWidth + 1 ) + ' x ' + IntToStr ( SHeight + 1 ) + ' pixels ';
|
|
if ( not ImageEnView.IsPointInsideSelection ( X, Y ) ) and ( MarkOuter1.Checked ) then
|
|
begin
|
|
if ( iesoMarkOuter in ImageEnView.SelectionOptions ) then
|
|
ImageEnView.SelectionOptions := ImageEnView.SelectionOptions - [ iesoMarkOuter ];
|
|
end
|
|
else
|
|
begin
|
|
if not ( iesoMarkOuter in ImageEnView.SelectionOptions ) then
|
|
if MarkOuter1.Checked then
|
|
ImageEnView.SelectionOptions := ImageEnView.SelectionOptions + [ iesoMarkOuter ];
|
|
end;
|
|
end;
|
|
if ( BY + 1 <= ImageEnView.IEBitmap.Height ) and
|
|
( BY + 1 >= 1 ) then
|
|
begin
|
|
StatusBar1.Panels [ 2 ].Text := 'Row: ' + IntToStr ( BY + 1 );
|
|
StatusBar1.Panels [ 3 ].Text := 'Column: ' + IntToStr ( BX + 1 )
|
|
end
|
|
else
|
|
begin
|
|
StatusBar1.Panels [ 2 ].Text := '';
|
|
StatusBar1.Panels [ 3 ].Text := '';
|
|
end;
|
|
if ( BX + 1 >= 1 ) and
|
|
( BX + 1 <= ImageEnView.IEBitmap.Width ) then
|
|
begin
|
|
StatusBar1.Panels [ 2 ].Text := 'Row: ' + IntToStr ( BY + 1 );
|
|
StatusBar1.Panels [ 3 ].Text := 'Column: ' + IntToStr ( BX + 1 );
|
|
end
|
|
else
|
|
begin
|
|
StatusBar1.Panels [ 2 ].Text := '';
|
|
StatusBar1.Panels [ 3 ].Text := '';
|
|
end;
|
|
if ( BX + 1 > ImageEnView.IEBitmap.Width ) or
|
|
( BY + 1 > ImageEnView.IEBitmap.Height ) or
|
|
( BX + 1 <= 0 ) or ( BY + 1 <= 0 ) then
|
|
begin
|
|
StatusBar1.Panels [ 2 ].Text := '';
|
|
StatusBar1.Panels [ 3 ].Text := '';
|
|
exit;
|
|
end;
|
|
|
|
// show current color and alpha values
|
|
CurrentFore.Brush.Color := ImageEnView.IEBitmap.Canvas.Pixels [ BX, BY ];
|
|
CurrentBack.Brush.Color := ImageEnView.IEBitmap.AlphaChannel.Canvas.Pixels [ BX, BY ];
|
|
LabelAlpha1.Caption := 'Alpha: ' + IntToStr ( ImageEnView.IEBitmap.Alpha [ BX, BY ] );
|
|
|
|
if PaintPoint.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Point
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.MoveTo ( startX, startY );
|
|
IEBitmap.Canvas.LineTo ( BX, BY );
|
|
IEBitmap.Canvas.LineTo ( startX, startY );
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.MoveTo ( startX, startY );
|
|
IEBitmap.AlphaChannel.Canvas.LineTo ( BX, BY );
|
|
IEBitmap.AlphaChannel.Canvas.LineTo ( startX, startY );
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintAlpha.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Alpha
|
|
with ImageEnView do
|
|
begin
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.AlphaChannel.Canvas.Pixels [ BX, BY ] := ForeColor.Brush.Color;
|
|
IEBitmap.Alpha [ BX, BY ] := UpDownAlpha.Position;
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintLine.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Line
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
SetSquarePen ( IEBitmap.Canvas, ForeColor.Brush.Color, PenWidth );
|
|
IEBitmap.Canvas.MoveTo ( startX, startY );
|
|
IEBitmap.Canvas.LineTo ( BX, BY );
|
|
IEBitmap.Canvas.LineTo ( startX, startY );
|
|
Transparency := UpDownAlpha.Position;
|
|
SetSquarePen ( IEBitmap.AlphaChannel.Canvas, $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 ), PenWidth );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.MoveTo ( startX, startY );
|
|
IEBitmap.AlphaChannel.Canvas.LineTo ( BX, BY );
|
|
IEBitmap.AlphaChannel.Canvas.LineTo ( startX, startY );
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintEllipse.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Ellipse
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Style := bsClear;
|
|
IEBitmap.Canvas.Ellipse ( startX, startY, BX, BY );
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsClear;
|
|
IEBitmap.AlphaChannel.Canvas.Ellipse ( startX, startY, BX, BY );
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintRect.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Rect
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Style := bsClear;
|
|
IEBitmap.Canvas.Rectangle ( startX, startY, BX, BY );
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsClear;
|
|
IEBitmap.AlphaChannel.Canvas.Rectangle ( startX, startY, BX, BY );
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintRoundRect.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Round Rect
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Style := bsClear;
|
|
IEBitmap.Canvas.RoundRect ( startX, startY, BX, BY, 5, 5 );
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsClear;
|
|
IEBitmap.AlphaChannel.Canvas.RoundRect ( startX, startY, BX, BY, 5, 5 );
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintFilledRect.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Filled Rect
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Brush.Color := BackColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Style := bsSolid;
|
|
IEBitmap.Canvas.Rectangle ( startX, startY, BX, BY );
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsSolid;
|
|
IEBitmap.AlphaChannel.Canvas.Rectangle ( startX, startY, BX, BY );
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintFilledRoundRect.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Filled Round Rect
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Color := BackColor.Brush.Color;
|
|
IEBitmap.Canvas.Brush.Style := bsSolid;
|
|
IEBitmap.Canvas.RoundRect ( startX, startY, BX, BY, 5, 5 );
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsSolid;
|
|
IEBitmap.AlphaChannel.Canvas.RoundRect ( startX, startY, BX, BY, 5, 5 );
|
|
Update;
|
|
end;
|
|
end
|
|
else
|
|
if PaintFilledEllipse.Down and ImageEnView.MouseCapture then
|
|
begin
|
|
// Paint Filled Ellipse
|
|
with ImageEnView do
|
|
begin
|
|
MyUndo(ImageEnView); // fdv
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.Canvas.Brush.Color := BackColor.Brush.Color;
|
|
IEBitmap.Canvas.Brush.Style := bsSolid;
|
|
IEBitmap.Canvas.Ellipse ( startX, startY, BX, BY );
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := PenWidth;
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Brush.Style := bsSolid;
|
|
IEBitmap.AlphaChannel.Canvas.Ellipse ( startX, startY, BX, BY );
|
|
Update;
|
|
end;
|
|
end;
|
|
with ImageEnView do
|
|
begin
|
|
lastX := XScr2Bmp ( X );
|
|
lastY := YScr2Bmp ( Y );
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ImageEnViewMouseUp ( Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
|
|
var
|
|
BX, BY: integer;
|
|
Transparency: integer;
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
if PaintPoint.Down then
|
|
begin
|
|
// Paint last pixel Point
|
|
with ImageEnView do
|
|
begin
|
|
BX := XScr2Bmp ( X );
|
|
BY := YScr2Bmp ( Y );
|
|
IEBitmap.Canvas.Pen.Color := ForeColor.Brush.Color;
|
|
IEBitmap.Canvas.Pen.Width := UpDownPenWidth.Position;
|
|
IEBitmap.Canvas.Pixels [ BX, BY ] := ForeColor.Brush.Color;
|
|
Transparency := UpDownAlpha.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Color := $02000000 or ( Transparency ) or ( Transparency shl 8 ) or ( Transparency shl 16 );
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := UpDownPenWidth.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pixels [ BX, BY ] := ForeColor.Brush.Color;
|
|
IEBitmap.Alpha [ BX, BY ] := UpDownAlpha.Position;
|
|
Update;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.CheckBox1Click ( Sender: TObject );
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.DisplayGrid := CheckBox1.Checked;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ImageEnViewSelectionChange ( Sender: TObject );
|
|
begin
|
|
UpdateMenu;
|
|
end;
|
|
|
|
procedure TMainForm.ImageEnViewMouseInSel ( Sender: TObject );
|
|
var
|
|
SLeft: integer;
|
|
STop: integer;
|
|
SRight: integer;
|
|
SBottom: integer;
|
|
SHeight: integer;
|
|
SWidth: integer;
|
|
begin
|
|
with ImageEnView do
|
|
begin
|
|
SLeft := SelX1;
|
|
STop := SelY1;
|
|
SRight := SelX2;
|
|
SBottom := SelY2;
|
|
SHeight := SBottom - STop;
|
|
SWidth := SRight - SLeft;
|
|
end;
|
|
StatusBar1.Panels [ 4 ].Text := 'Selected: ' + IntToStr ( SWidth + 1 ) + ' x ' + IntToStr ( SHeight + 1 ) + ' pixels ';
|
|
end;
|
|
|
|
procedure TMainForm.ListViewFramesSelectItem ( Sender: TObject;
|
|
Item: TListItem; Selected: Boolean );
|
|
begin
|
|
if not Moving then
|
|
begin
|
|
if ( not loading ) and ( PageControl1.PageCount > 0 ) and ( PageControl1.PageCount = ListViewFrames.Items.Count ) then
|
|
begin
|
|
if PageControl1.ActivePageIndex <> Item.Index then
|
|
PageControl1.ActivePageIndex := Item.Index;
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
case ImageEnView.IEBitmap.Width of
|
|
16: ImageEnView.Zoom := 3071;
|
|
24: ImageEnView.Zoom := 2034;
|
|
32: ImageEnView.Zoom := 1510;
|
|
64: ImageEnView.Zoom := 760;
|
|
72: ImageEnView.Zoom := 679;
|
|
96: ImageEnView.Zoom := 504;
|
|
128: ImageEnView.Zoom := 510;
|
|
end; // case
|
|
CheckBoxEnableAlpha.Checked := ImageEnView.HasAlphaChannel;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
Down1.Enabled := Item.Index < ListViewFrames.Items.Count-1;
|
|
Up1.Enabled := Item.Index > 0;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FileSaveAs1Click ( Sender: TObject );
|
|
var
|
|
i: integer;
|
|
Frames: array of TObject;
|
|
FT: TIOFileType;
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
SaveImageEnDialog1.FileName := '';
|
|
SaveImageEnDialog1.FilterIndex := 5;
|
|
SaveImageEnDialog1.DefaultExt := '.bmp';
|
|
if SaveImageEnDialog1.Execute then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
FT := ImageEnView.IO.Params.FileType;
|
|
if FT = 6 then // icon
|
|
begin
|
|
SetLength ( Frames, PageControl1.PageCount );
|
|
ProgressBar1.Max := PageControl1.PageCount - 1;
|
|
for i := PageControl1.PageCount - 1 downto 0 do
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
Frames [ i ] := ImageEnView;
|
|
ImageEnView.IO.Params.ICO_ImageIndex := i;
|
|
ProgressBar1.Position := i;
|
|
end;
|
|
// save the icon
|
|
IEWriteICOImages ( SaveImageEnDialog1.FileName, Frames );
|
|
ImageEnView.IEBitmap.Modified := False;
|
|
ProgressBar1.Position := 0;
|
|
UpdateMenu;
|
|
end
|
|
else // not icon
|
|
begin
|
|
ImageEnView.IO.DoPreviews ( );
|
|
ImageEnView.IO.SaveToFile ( SaveImageEnDialog1.FileName );
|
|
ImageEnView.IEBitmap.Modified := False;
|
|
ProgressBar1.Position := 0;
|
|
UpdateMenu;
|
|
end;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PageControl1Change ( Sender: TObject );
|
|
begin
|
|
if not Moving then
|
|
ListViewFrames.ItemIndex := PageControl1.ActivePageIndex;
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.Fit;
|
|
end;
|
|
|
|
procedure TMainForm.Delete1Click ( Sender: TObject );
|
|
var
|
|
ListItem: TListItem;
|
|
begin
|
|
Moving := False;
|
|
if MessageBox ( 0, 'Delete selected frame?', 'Delete', MB_ICONQUESTION or MB_YESNO ) = mrYes then
|
|
begin
|
|
if ListViewFrames.SelCount > 0 then
|
|
begin
|
|
ListItem := ListViewFrames.Selected;
|
|
ListItem.Delete;
|
|
ListViewFrames.Invalidate;
|
|
PageControl1.ActivePage.Free;
|
|
PageControl1.SelectNextPage ( False );
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.Import1Click ( Sender: TObject );
|
|
var
|
|
fIconWidth: integer;
|
|
fIconHeight: integer;
|
|
fBitCount: integer;
|
|
fBitsPerSample: integer;
|
|
fSamplesPerPixel: integer;
|
|
ListItem: TListItem;
|
|
Filter: TResampleFilter;
|
|
begin
|
|
OpenImageEnDialog1.FileName := '';
|
|
OpenImageEnDialog1.AutoSetFilter := true;
|
|
OpenImageEnDialog1.Title := 'Import Icon...';
|
|
if OpenImageEnDialog1.Execute then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
Moving := False;
|
|
frmImport := TfrmImport.Create ( Self );
|
|
try
|
|
if frmImport.ShowModal = mrOk then
|
|
begin
|
|
AddTabsheet;
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.IO.LoadFromFile ( OpenImageEnDialog1.FileName );
|
|
fIconWidth := frmImport.fIconWidth;
|
|
fIconHeight := frmImport.fIconHeight;
|
|
fBitCount := frmImport.fBitCount;
|
|
fBitsPerSample := frmImport.fBitsPerSample;
|
|
fSamplesPerPixel := frmImport.fSamplesPerPixel;
|
|
Filter := TResampleFilter ( frmImport.ComboBox1.ItemIndex );
|
|
ImageEnView.Proc.Resample ( fIconWidth, fIconHeight, Filter );
|
|
ImageEnView.IO.Params.Width := fIconWidth;
|
|
ImageEnView.IO.Params.Height := fIconHeight;
|
|
ImageEnView.IO.Params.ICO_BitCount [ PageControl1.ActivePageIndex ] := fBitCount;
|
|
ImageEnView.IO.Params.BitsPerSample := fBitsPerSample;
|
|
ImageEnView.IO.Params.SamplesPerPixel := fSamplesPerPixel;
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( PageControl1.ActivePageIndex + 1 ) + ' ' + IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels ' + IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
ListItem := ListViewFrames.Items.Add;
|
|
ListItem.Caption := IntToStr ( PageControl1.ActivePageIndex + 1 );
|
|
ListItem.SubItems.Add ( IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels' );
|
|
ListItem.SubItems.Add ( IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit' );
|
|
ImageEnView.IEBitmap.Modified := True;
|
|
end;
|
|
finally; frmImport.Free; end;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SetAlphaClick ( Sender: TObject );
|
|
var
|
|
RGB: TRGB;
|
|
BitCount: integer;
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
BitCount := ImageEnView.IO.Params.ICO_BitCount [ 0 ];
|
|
if BitCount <> 32 then
|
|
begin
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
end;
|
|
ImageEnView.IO.Params.ICO_BitCount [ 0 ] := 32;
|
|
ImageEnView.IO.Params.BitsPerSample := 8;
|
|
ImageEnView.IO.Params.SamplesPerPixel := 4;
|
|
ImageEnView.Update;
|
|
end;
|
|
UpDownAlpha.Position := 0;
|
|
if ColorDialog1.Execute then
|
|
begin
|
|
BackColor.Brush.Color := ColorDialog1.Color;
|
|
RGB := TColor2TRGB ( BackColor.Brush.Color );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
SetTransparentColors ( rgb, rgb, UpDownAlpha.Position );
|
|
end;
|
|
ImageEnView.Update;
|
|
end;
|
|
ImageEnView.IEBitmap.Modified := True;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
UpdateMenu;
|
|
finally; Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.MakeXPIcon1Click ( Sender: TObject );
|
|
var
|
|
RGB: TRGB;
|
|
BX, BY: integer;
|
|
ListItem: TListItem;
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
ImageEnView.IO.Params.ICO_BitCount [ ListViewFrames.ItemIndex ] := 32;
|
|
ImageEnView.IO.Params.BitsPerSample := 8;
|
|
ImageEnView.IO.Params.SamplesPerPixel := 4;
|
|
ImageEnView.Update;
|
|
end;
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
BX := 0;
|
|
BY := ImageEnView.IEBitmap.Height - 1;
|
|
RGB := ImageEnView.IEBitmap.Pixels [ BX, BY ];
|
|
SetTransparentColors ( RGB, RGB, 0 );
|
|
BackColor.Brush.Color := TRGB2TColor ( RGB );
|
|
ImageEnView.Update;
|
|
ImageEnView.IEBitmap.Modified := True;
|
|
end;
|
|
if ListViewFrames.ItemIndex <> -1 then
|
|
begin
|
|
ListItem := ListViewFrames.Items.Item [ ListViewFrames.ItemIndex ];
|
|
ListItem.Caption := IntToStr ( ListViewFrames.ItemIndex + 1 );
|
|
ListItem.SubItems.Strings [ 0 ] := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
ListItem.SubItems.Strings [ 1 ] := ( IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit' );
|
|
end;
|
|
if PageControl1.ActivePageIndex <> -1 then
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( PageControl1.ActivePageIndex + 1 ) + ' ' + IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels' + ' ' + IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
CheckBoxEnableAlpha.Checked := ImageEnView.HasAlphaChannel;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
finally; Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.CheckBoxEnableAlphaClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.EnableAlphaChannel := CheckBoxEnableAlpha.Checked;
|
|
Preview.EnableAlphaChannel := CheckBoxEnableAlpha.Checked;
|
|
ImageEnView.Update;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FillAdjacentForegroundClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
end;
|
|
if FillAdjacentForeground.Down then
|
|
begin
|
|
SelectNone1.Click;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
UpdateMenu;
|
|
ImageEnView.Cursor := crIEPaintFill;
|
|
end
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.UpDownAlphaClick ( Sender: TObject; Button: TUDBtnType );
|
|
var
|
|
o: single;
|
|
Opacity: integer;
|
|
begin
|
|
o := ( UpDownAlpha.Position / 255 ) * 100;
|
|
Opacity := Trunc ( o );
|
|
UpDownOpacity.Position := Opacity;
|
|
end;
|
|
|
|
procedure TMainForm.TrackBar1Change ( Sender: TObject );
|
|
begin
|
|
UpDownAlpha.Increment := TrackBar1.Position;
|
|
TrackBar1.Hint := 'Increment: ' + FloatToStrF ( TrackBar1.Position, ffFixed, 10, 1 );
|
|
Application.ActivateHint ( Mouse.CursorPos );
|
|
end;
|
|
|
|
procedure TMainForm.PickAlphaClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
if PickAlpha.Down then
|
|
ImageEnView.Cursor := crIEEyeDropper
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PickColorClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
if PickColor.Down then
|
|
ImageEnView.Cursor := crIEEyeDropper
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.Export1Click ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
Moving := False;
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SaveImageEnDialog1.FileName := '';
|
|
SaveImageEnDialog1.Title := 'Export image...';
|
|
if SaveImageEnDialog1.Execute then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView.IO.SaveToFile ( SaveImageEnDialog1.FileName );
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.AddSoftShadow1Click ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
AddSoftShadow ( 3, 2, 2, false, clBlack );
|
|
end;
|
|
ImageEnView.IEBitmap.Modified := True;
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
UpdateMenu;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.AddInsideShadow1Click ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
AddInnerShadow ( 3, 2, 2 );
|
|
end;
|
|
ImageEnView.IEBitmap.Modified := True;
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
UpdateMenu;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FillAdjacentBackgroundClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
end;
|
|
if FillAdjacentBackground.Down then
|
|
begin
|
|
SelectNone1.Click;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
UpdateMenu;
|
|
ImageEnView.Cursor := crIEPaintFill;
|
|
end
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.MarkOuter2Click ( Sender: TObject );
|
|
begin
|
|
MarkOuter1.Checked := MarkOuter1.Checked;
|
|
end;
|
|
|
|
procedure ExchangeItems ( LV: TListView; const i, j: Integer );
|
|
var
|
|
TempLI: TListItem;
|
|
begin
|
|
LV.Items.BeginUpdate;
|
|
try
|
|
TempLI := TListItem.Create ( LV.Items );
|
|
TempLI.Assign ( LV.Items.Item [ i ] );
|
|
LV.Items.Item [ i ].Assign ( LV.Items.Item [ j ] );
|
|
LV.Items.Item [ j ].Assign ( TempLI );
|
|
TempLI.Free;
|
|
finally
|
|
LV.Items.EndUpdate
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.Up1Click ( Sender: TObject );
|
|
var
|
|
ListItem: TListItem;
|
|
i: integer;
|
|
IconName: string;
|
|
IconSize: string;
|
|
IconBitdepth: string;
|
|
begin
|
|
Moving := True;
|
|
ListItem := ListViewFrames.Selected;
|
|
if ListItem.Index <> 0 then
|
|
begin
|
|
ExchangeItems ( ListViewFrames, ListViewFrames.ItemIndex, ListItem.Index - 1 );
|
|
ListViewFrames.ItemIndex := ListViewFrames.ItemIndex - 1;
|
|
Tabsheet := PageControl1.ActivePage;
|
|
PageControl1.ActivePage.PageIndex := PageControl1.ActivePage.PageIndex - 1;
|
|
end;
|
|
for i := 0 to ListViewFrames.Items.Count - 1 do
|
|
begin
|
|
ListItem := ListViewFrames.Items.Item [ i ];
|
|
ListItem.Caption := IntToStr ( i + 1 );
|
|
PageControl1.Pages [ i ] .PageIndex := i;
|
|
IconName := 'Icon ' + IntToStr ( i + 1 ) + ' ';
|
|
IconSize := ListItem.SubItems.Strings [ 0 ] + ' ';
|
|
IconBitdepth := ListItem.SubItems.Strings [ 1 ];
|
|
PageControl1.Pages [ i ].Caption := IconName + Iconsize + IconBitdepth;
|
|
end;
|
|
Moving := False;
|
|
Down1.Enabled := ListViewFrames.Selected.Index < ListViewFrames.Items.Count-1;
|
|
Up1.Enabled := ListViewFrames.Selected.Index > 0;
|
|
end;
|
|
|
|
procedure TMainForm.Down1Click ( Sender: TObject );
|
|
var
|
|
ListItem: TListItem;
|
|
i: integer;
|
|
IconName: string;
|
|
IconSize: string;
|
|
IconBitdepth: string;
|
|
begin
|
|
Moving := True;
|
|
ListItem := ListViewFrames.Selected;
|
|
if ListItem.Index <> ListViewFrames.Items.Count - 1 then
|
|
begin
|
|
ExchangeItems ( ListViewFrames, ListViewFrames.ItemIndex, ListItem.Index + 1 );
|
|
ListViewFrames.ItemIndex := ListViewFrames.ItemIndex + 1;
|
|
Tabsheet := PageControl1.ActivePage;
|
|
PageControl1.ActivePage.PageIndex := PageControl1.ActivePage.PageIndex + 1;
|
|
end;
|
|
for i := 0 to ListViewFrames.Items.Count - 1 do
|
|
begin
|
|
ListItem := ListViewFrames.Items.Item [ i ];
|
|
ListItem.Caption := IntToStr ( i + 1 );
|
|
PageControl1.Pages [ i ] .PageIndex := i;
|
|
IconName := 'Icon ' + IntToStr ( i + 1 ) + ' ';
|
|
IconSize := ListItem.SubItems.Strings [ 0 ] + ' ';
|
|
IconBitdepth := ListItem.SubItems.Strings [ 1 ];
|
|
PageControl1.Pages [ i ].Caption := IconName + Iconsize + IconBitdepth;
|
|
end;
|
|
Moving := False;
|
|
Down1.Enabled := ListViewFrames.Selected.Index < ListViewFrames.Items.Count-1;
|
|
Up1.Enabled := ListViewFrames.Selected.Index > 0;
|
|
end;
|
|
|
|
procedure TMainForm.PageControl1MouseDown ( Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
|
|
begin
|
|
PageControl1.BeginDrag ( False );
|
|
Moving := False;
|
|
end;
|
|
|
|
procedure TMainForm.PageControl1DragDrop ( Sender, Source: TObject; X,
|
|
Y: Integer );
|
|
const
|
|
TCM_GETITEMRECT = $130A;
|
|
var
|
|
i: Integer;
|
|
r: TRect;
|
|
begin
|
|
if not ( Sender is TPageControl ) then
|
|
Exit;
|
|
with PageControl1 do
|
|
begin
|
|
for i := 0 to PageCount - 1 do
|
|
begin
|
|
Perform ( TCM_GETITEMRECT, i, lParam ( @r ) );
|
|
if PtInRect ( r, Point ( X, Y ) ) then
|
|
begin
|
|
if i <> ActivePage.PageIndex then
|
|
ActivePage.PageIndex := i;
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PageControl1DragOver ( Sender, Source: TObject; X,
|
|
Y: Integer; State: TDragState; var Accept: Boolean );
|
|
begin
|
|
if Sender is TPageControl then
|
|
Accept := True;
|
|
end;
|
|
|
|
procedure TMainForm.ListViewFramesClick ( Sender: TObject );
|
|
begin
|
|
Moving := False;
|
|
if PageControl1.ActivePageIndex <> ListViewFrames.Selected.Index then
|
|
PageControl1.ActivePageIndex := ListViewFrames.Selected.Index;
|
|
ImageEnView.Fit;
|
|
end;
|
|
|
|
procedure TMainForm.Fit1Click ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
if Fit1.Down then
|
|
begin
|
|
ImageEnView.AutoFit := True;
|
|
ImageEnView.Fit;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
TrackBarZoom.Hint := 'Zoom: ' + FloatToStrF ( ImageEnView.Zoom, ffFixed, 10, 1 ) + '%';
|
|
end
|
|
else
|
|
begin
|
|
ImageEnView.AutoFit := False;
|
|
ImageEnView.Zoom := 100;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
TrackBarZoom.Hint := 'Zoom: ' + FloatToStrF ( ImageEnView.Zoom, ffFixed, 10, 1 ) + '%';
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.Extent1Click ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
if Extent1.Down then
|
|
begin
|
|
ImageEnView.AutoFit := False;
|
|
ImageEnView.Zoom := 100;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
TrackBarZoom.Hint := 'Zoom: ' + FloatToStrF ( ImageEnView.Zoom, ffFixed, 10, 1 ) + '%';
|
|
end
|
|
else
|
|
begin
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
TrackBarZoom.Hint := 'Zoom: ' + FloatToStrF ( ImageEnView.Zoom, ffFixed, 10, 1 ) + '%';
|
|
ImageEnView.Fit;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.GrayScale1Click ( Sender: TObject );
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
end;
|
|
ImageEnView.Proc.ConvertToGray;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
UpdateMenu;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
|
|
procedure TMainForm.Negative1Click ( Sender: TObject );
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
end;
|
|
ImageEnView.Proc.Negative;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
UpdateMenu;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
|
|
procedure TMainForm.Select1Click ( Sender: TObject );
|
|
begin
|
|
PaintPoint.Down := False;
|
|
PaintLine.Down := False;
|
|
PaintRect.Down := False;
|
|
PaintRoundRect.Down := False;
|
|
PaintEllipse.Down := False;
|
|
PaintFilledRect.Down := False;
|
|
PaintFilledRoundRect.Down := False;
|
|
PaintFilledEllipse.Down := False;
|
|
FillAdjacentForeground.Down := False;
|
|
FillAdjacentBackground.Down := False;
|
|
end;
|
|
|
|
procedure TMainForm.PaintPointClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SelectNone1.Click;
|
|
if PaintPoint.Down then
|
|
ImageEnView.Cursor := crIEBrush
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PaintLineClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SelectNone1.Click;
|
|
if PaintLine.Down then
|
|
ImageEnView.Cursor := crIEBrush
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PaintRectClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SelectNone1.Click;
|
|
if PaintRect.Down then
|
|
ImageEnView.Cursor := crIESelectArrow
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PaintRoundRectClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SelectNone1.Click;
|
|
if PaintRoundRect.Down then
|
|
ImageEnView.Cursor := crIESelectArrow
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PaintEllipseClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SelectNone1.Click;
|
|
if PaintEllipse.Down then
|
|
ImageEnView.Cursor := crIESelectArrow
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PaintFilledRectClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SelectNone1.Click;
|
|
if PaintFilledRect.Down then
|
|
ImageEnView.Cursor := crIESelectArrow
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
SelectNone1.Checked := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PaintFilledRoundRectClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SelectNone1.Click;
|
|
if PaintFilledRoundRect.Down then
|
|
ImageEnView.Cursor := crIESelectArrow
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PaintFilledEllipseClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
SelectNone1.Click;
|
|
if PaintFilledEllipse.Down then
|
|
ImageEnView.Cursor := crIESelectArrow
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PaintAlphaClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
if PaintAlpha.Down then
|
|
ImageEnView.Cursor := crIEBrush
|
|
else
|
|
begin
|
|
PaintAlpha.Down := False;
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.UpDownPenWidthClick ( Sender: TObject;
|
|
Button: TUDBtnType );
|
|
begin
|
|
with ImageEnView do
|
|
begin
|
|
IEBitmap.Canvas.Pen.Width := UpDownPenWidth.Position;
|
|
IEBitmap.AlphaChannel.Canvas.Pen.Width := UpDownPenWidth.Position;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.UpDownOpacityChanging ( Sender: TObject;
|
|
var AllowChange: Boolean );
|
|
var
|
|
Alpha1: integer;
|
|
Opacity1: integer;
|
|
begin
|
|
OpacityChanging := True;
|
|
if not AlphaChanging then
|
|
begin
|
|
// convert opacity value to alpha value
|
|
Opacity1 := Trunc ( UpDownOpacity.Position );
|
|
Alpha1 := Trunc ( ( Opacity1 * 255 ) / 100 );
|
|
UpDownAlpha.Position := Alpha1;
|
|
end;
|
|
OpacityChanging := False;
|
|
end;
|
|
|
|
procedure TMainForm.SelectNoneExecute ( Sender: TObject );
|
|
begin
|
|
// select none
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.MouseInteract := [ ];
|
|
ImageEnView.Cursor := crIECrossSight;
|
|
ImageEnView.DeSelect;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectRectExecute ( Sender: TObject );
|
|
begin
|
|
// select rect
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.MouseInteract := [ miSelect ];
|
|
ImageEnView.Cursor := crIESelectArrow;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectEllipseExecute ( Sender: TObject );
|
|
begin
|
|
// select circle
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.MouseInteract := [ miSelectCircle ];
|
|
ImageEnView.Cursor := crIESelectArrow;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectZoomExecute ( Sender: TObject );
|
|
begin
|
|
// select zoom
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.MouseInteract := [ miZoom ];
|
|
ImageEnView.Cursor := crIEZoomIn;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectMagicwandExecute ( Sender: TObject );
|
|
begin
|
|
// select magic wand
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
case frmSelectionProperties.cbMagicWandMode.ItemIndex of
|
|
0: ImageEnView.MagicWandMode := iewInclusive;
|
|
1: ImageEnView.MagicWandMode := iewExclusive;
|
|
2: ImageEnView.MagicWandMode := iewGlobal;
|
|
end; //case
|
|
ImageEnView.MouseInteract := [ miSelectMagicWand ];
|
|
ImageEnView.Cursor := crIECrossSmallPlus;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectPolygonExecute ( Sender: TObject );
|
|
begin
|
|
// select polygon
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.MouseInteract := [ miSelectPolygon ];
|
|
ImageEnView.Cursor := crIEMultipleArrow;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectLassoExecute ( Sender: TObject );
|
|
begin
|
|
// Select Lasso
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.MouseInteract := [ miSelectLasso ];
|
|
ImageEnView.Cursor := crIECrossSight;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectIconExecute ( Sender: TObject );
|
|
var
|
|
x, y, x2, y2: integer;
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.Cursor := crIECross;
|
|
ImageEnView.SelectCustom;
|
|
x := 0;
|
|
y := 0;
|
|
x2 := x + 32;
|
|
y2 := y + 32;
|
|
ImageEnView.Select ( x, y, x2, y2 );
|
|
ImageEnView.MouseInteract := [ miSelect ];
|
|
finally; Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FileNewExecute ( Sender: TObject );
|
|
var
|
|
fIconWidth: integer;
|
|
fIconHeight: integer;
|
|
fBitCount: integer;
|
|
fBitsPerSample: integer;
|
|
fSamplesPerPixel: integer;
|
|
ListItem: TListItem;
|
|
RGB: TRGB;
|
|
BX, BY: integer;
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
Moving := False;
|
|
frmImport := TfrmImport.Create ( Self );
|
|
try
|
|
if frmImport.ShowModal = mrOk then
|
|
begin
|
|
AddTabsheet;
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
fIconWidth := frmImport.fIconWidth;
|
|
fIconHeight := frmImport.fIconHeight;
|
|
fBitCount := frmImport.fBitCount;
|
|
fBitsPerSample := frmImport.fBitsPerSample;
|
|
fSamplesPerPixel := frmImport.fSamplesPerPixel;
|
|
ImageEnView.Proc.ImageResize ( fIconWidth, fIconHeight, iehLeft, ievTop );
|
|
ImageEnView.Clear;
|
|
BX := 0;
|
|
BY := ImageEnView.IEBitmap.Height - 1;
|
|
RGB := ImageEnView.IEBitmap.Pixels [ BX, BY ];
|
|
ImageEnView.Proc.SetTransparentColors ( RGB, RGB, 0 );
|
|
BackColor.Brush.Color := TRGB2TColor ( RGB );
|
|
ImageEnView.Update;
|
|
ImageEnView.IO.Params.Width := fIconWidth;
|
|
ImageEnView.IO.Params.Height := fIconHeight;
|
|
ImageEnView.IO.Params.ICO_BitCount [ PageControl1.ActivePageIndex ] := fBitCount;
|
|
ImageEnView.IO.Params.BitsPerSample := fBitsPerSample;
|
|
ImageEnView.IO.Params.SamplesPerPixel := fSamplesPerPixel;
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( PageControl1.ActivePageIndex + 1 ) + ' ' + IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels ' + IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
ListItem := ListViewFrames.Items.Add;
|
|
ListItem.Caption := IntToStr ( PageControl1.ActivePageIndex + 1 );
|
|
ListItem.SubItems.Add ( IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels' );
|
|
ListItem.SubItems.Add ( IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit' );
|
|
ImageEnView.IEBitmap.Modified := False;
|
|
FilePath := ExtractFilePath ( Application.ExeName ) + '\' + 'New Icon.ico';
|
|
StatusBar1.Panels [ 0 ].Text := ExtractFilePath ( Application.ExeName );
|
|
StatusBar1.Panels [ 1 ].Text := 'New Icon.ico';
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
StatusBar1.Panels [ 5 ].Text := IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
ImageEnView.IO.Params.ICO_Background := TColor2TRGB ( BackColor.Brush.Color );
|
|
CheckBoxEnableAlpha.Checked := ImageEnView.HasAlphaChannel;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
ImageEnView.Fit;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
ProgressBar1.Position := 0;
|
|
PageControl1.Visible := True;
|
|
UpdateMenu;
|
|
Loading := False;
|
|
end;
|
|
finally; frmImport.Free; end;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
|
|
procedure TMainForm.FileOpenBeforeExecute ( Sender: TObject );
|
|
var
|
|
Frames: integer;
|
|
ListItem: TListItem;
|
|
i: integer;
|
|
begin
|
|
OpenImageEnDialog1.Title := 'Open Icon...';
|
|
OpenImageEnDialog1.AutoSetFilter := False;
|
|
OpenImageEnDialog1.Filter := 'Windows Icon (ICO)|*.ico';
|
|
if OpenImageEnDialog1.Execute then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
PageControl1.Visible := False;
|
|
// close all pages
|
|
if PageControl1.PageCount > 0 then
|
|
for i := PageControl1.PageCount - 1 downto 0 do
|
|
PageControl1.Pages [ i ].Free;
|
|
FilePath := OpenImageEnDialog1.FileName;
|
|
Frames := IEGetFileFramesCount ( FilePath );
|
|
ListViewFrames.Clear;
|
|
Preview.Clear;
|
|
ProgressBar1.Max := Frames;
|
|
loading := true;
|
|
for i := 0 to Frames - 1 do
|
|
begin
|
|
AddTabsheet;
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
with ImageEnView do
|
|
begin
|
|
Cursor := crIECross;
|
|
IO.Params.ICO_ImageIndex := i;
|
|
IO.LoadFromFile ( FilePath );
|
|
ListItem := ListViewFrames.Items.Add;
|
|
ListItem.Caption := IntToStr ( i + 1 );
|
|
ListItem.SubItems.Add ( IntToStr ( IEBitmap.Width ) + ' pixels x ' + IntToStr ( IEBitmap.Height ) + ' pixels' );
|
|
ListItem.SubItems.Add ( IntToStr ( IO.Params.SamplesPerPixel * IO.Params.BitsPerSample ) + ' bit' );
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( i + 1 ) + ' ' + IntToStr ( IEBitmap.Width ) + ' pixels x ' + IntToStr ( IEBitmap.Height ) + ' pixels' + ' ' + IntToStr ( IO.Params.SamplesPerPixel * IO.Params.BitsPerSample ) + ' bit';
|
|
ListItem.Selected := True;
|
|
ListViewFrames.ItemIndex := i;
|
|
ProgressBar1.Position := i;
|
|
IEBitmap.Modified := False;
|
|
end;
|
|
end;
|
|
ImageEnView.Proc.ClearAllUndo;
|
|
ImageEnView.Proc.ClearAllRedo;
|
|
StatusBar1.Panels [ 0 ].Text := ExtractFilePath ( FilePath );
|
|
StatusBar1.Panels [ 1 ].Text := ExtractFileName ( FilePath );
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
StatusBar1.Panels [ 5 ].Text := IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
ImageEnView.IO.Params.ICO_Background := TColor2TRGB ( BackColor.Brush.Color );
|
|
CheckBoxEnableAlpha.Checked := ImageEnView.HasAlphaChannel;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
ImageEnView.Fit;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
ProgressBar1.Position := 0;
|
|
PageControl1.Visible := True;
|
|
UpdateMenu;
|
|
loading := false;
|
|
finally; Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FileSaveExecute ( Sender: TObject );
|
|
var
|
|
i: integer;
|
|
Frames: array of TObject;
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
ProgressBar1.Max := PageControl1.PageCount - 1;
|
|
try
|
|
SetLength ( Frames, PageControl1.PageCount );
|
|
for i := 0 to PageControl1.PageCount - 1 do
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
Frames [ i ] := ImageEnView;
|
|
ImageEnView.IO.Params.ICO_ImageIndex := i;
|
|
ProgressBar1.Position := i;
|
|
// saving is too fast... slow it down
|
|
Sleep(100);
|
|
end;
|
|
IEWriteICOImages ( FilePath, Frames );
|
|
ProgressBar1.Position := 0;
|
|
UpdateMenu;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FileSaveAsBeforeExecute ( Sender: TObject );
|
|
var
|
|
i: integer;
|
|
Frames: array of TObject;
|
|
FT: TIOFileType;
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
SaveImageEnDialog1.FileName := '';
|
|
SaveImageEnDialog1.FilterIndex := 5;
|
|
SaveImageEnDialog1.DefaultExt := '.bmp';
|
|
if SaveImageEnDialog1.Execute then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
FT := ImageEnView.IO.Params.FileType;
|
|
if FT = 6 then // icon
|
|
begin
|
|
SetLength ( Frames, PageControl1.PageCount );
|
|
ProgressBar1.Max := PageControl1.PageCount - 1;
|
|
for i := PageControl1.PageCount - 1 downto 0 do
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
Frames [ i ] := ImageEnView;
|
|
ImageEnView.IO.Params.ICO_ImageIndex := i;
|
|
ProgressBar1.Position := i;
|
|
end;
|
|
// save the icon
|
|
IEWriteICOImages ( SaveImageEnDialog1.FileName, Frames );
|
|
ImageEnView.IEBitmap.Modified := False;
|
|
ProgressBar1.Position := 0;
|
|
UpdateMenu;
|
|
end
|
|
else // not icon
|
|
begin
|
|
ImageEnView.IO.DoPreviews ( );
|
|
ImageEnView.IO.SaveToFile ( SaveImageEnDialog1.FileName );
|
|
ImageEnView.IEBitmap.Modified := False;
|
|
ProgressBar1.Position := 0;
|
|
UpdateMenu;
|
|
end;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FileSaveAsExecute ( Sender: TObject );
|
|
var
|
|
i: integer;
|
|
Frames: array of TObject;
|
|
FT: TIOFileType;
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
SaveImageEnDialog1.FileName := '';
|
|
SaveImageEnDialog1.FilterIndex := 5;
|
|
SaveImageEnDialog1.DefaultExt := '.bmp';
|
|
if SaveImageEnDialog1.Execute then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
FilePath := SaveImageEnDialog1.FileName;
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
FT := ImageEnView.IO.Params.FileType;
|
|
if FT = 6 then // icon
|
|
begin
|
|
SetLength ( Frames, PageControl1.PageCount );
|
|
ProgressBar1.Max := PageControl1.PageCount - 1;
|
|
for i := 0 to PageControl1.PageCount - 1 do
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
Frames [ i ] := ImageEnView;
|
|
ImageEnView.IO.Params.ICO_ImageIndex := i;
|
|
ProgressBar1.Position := i;
|
|
// saving is too fast... slow it down
|
|
Sleep(100);
|
|
end;
|
|
// save the icon
|
|
IEWriteICOImages ( FilePath, Frames );
|
|
ImageEnView.IEBitmap.Modified := False;
|
|
ProgressBar1.Position := 0;
|
|
UpdateMenu;
|
|
end
|
|
else // not icon
|
|
begin
|
|
ImageEnView.IO.PreviewsParams := [ ioppDefaultLockPreview ];
|
|
ImageEnView.IO.DoPreviews ( );
|
|
ImageEnView.IO.SaveToFile ( FilePath );
|
|
ImageEnView.IEBitmap.Modified := False;
|
|
ProgressBar1.Position := 0;
|
|
UpdateMenu;
|
|
end;
|
|
finally Screen.Cursor := crDefault; end;
|
|
end;
|
|
StatusBar1.Panels [ 0 ].Text := ExtractFilePath ( FilePath );
|
|
StatusBar1.Panels [ 1 ].Text := ExtractFileName ( FilePath );
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
StatusBar1.Panels [ 5 ].Text := IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FileCloseExecute ( Sender: TObject );
|
|
var
|
|
i: integer;
|
|
begin
|
|
// close all pages
|
|
if PageControl1.PageCount > 0 then
|
|
for i := PageControl1.PageCount - 1 downto 0 do
|
|
PageControl1.Pages [ i ].Free;
|
|
ListViewFrames.Clear;
|
|
ClearStatusbar;
|
|
Preview.Blank;
|
|
UpdateMenu;
|
|
end;
|
|
|
|
procedure TMainForm.EditCutExecute ( Sender: TObject );
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
// save undo file
|
|
ImageEnView.Proc.SaveUndo;
|
|
ImageEnView.Proc.ClearAllRedo;
|
|
// cut selection to clipboard
|
|
ImageEnView.Proc.SelCutToClip;
|
|
UpdateMenu;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.EditCopyExecute ( Sender: TObject );
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
if ImageEnView.VisibleSelection then
|
|
// copy selection to clipboard
|
|
ImageEnView.Proc.SelCopyToClip
|
|
else
|
|
ImageEnView.Proc.CopyToClipboard;
|
|
UpdateMenu;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.EditPasteExecute ( Sender: TObject );
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
if Clipboard.HasFormat ( CF_PICTURE ) then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.Proc.SaveUndo;
|
|
ImageEnView.Proc.ClearAllRedo;
|
|
// paste from clipboard
|
|
ImageEnView.Proc.PasteFromClipboard;
|
|
ImageEnView.Update;
|
|
UpdateMenu;
|
|
end
|
|
else
|
|
MessageDlg ( 'There is no image in the Clipboard.', mtInformation, [ mbOK ], 0 );
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.EditUndoExecute ( Sender: TObject );
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveRedo; // save in Redo list
|
|
Undo;
|
|
ClearUndo;
|
|
end;
|
|
UpdateMenu;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
if ImageEnView.Proc.UndoCount = 0 then
|
|
ImageEnView.IEBitmap.Modified := False;
|
|
end;
|
|
|
|
procedure TMainForm.EditRedoExecute ( Sender: TObject );
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
SaveUndo; // save in Undo List
|
|
Redo;
|
|
ClearRedo;
|
|
end;
|
|
UpdateMenu;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
end;
|
|
|
|
procedure TMainForm.EditCropExecute ( Sender: TObject );
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
with ImageEnView.Proc do
|
|
begin
|
|
if ImageEnView.Selected then
|
|
begin
|
|
SaveUndo;
|
|
ClearAllRedo;
|
|
CropSel;
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
ImageEnView.IEBitmap.Modified := True;
|
|
Update;
|
|
UpdateMenu;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
end
|
|
else
|
|
MessageDlg ( 'Please select an area of the image to crop.', mtInformation, [ mbOK ], 0 );
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.EditPasteIntoSelectionExecute ( Sender: TObject );
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
if Clipboard.HasFormat ( CF_PICTURE ) then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.Proc.SaveUndo;
|
|
ImageEnView.Proc.ClearAllRedo;
|
|
// paste from clipboard
|
|
ImageEnView.Proc.SelPasteFromClip( True, False, True );
|
|
ImageEnView.Update;
|
|
UpdateMenu;
|
|
end
|
|
else
|
|
MessageDlg ( 'There is no image in the Clipboard.', mtInformation, [ mbOK ], 0 );
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.FileOpenExecute ( Sender: TObject );
|
|
var
|
|
Frames: integer;
|
|
ListItem: TListItem;
|
|
i: integer;
|
|
begin
|
|
OpenImageEnDialog1.Title := 'Open Icon...';
|
|
OpenImageEnDialog1.AutoSetFilter := False;
|
|
OpenImageEnDialog1.Filter := 'Windows Icon (ICO)|*.ico';
|
|
if OpenImageEnDialog1.Execute then
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
try
|
|
PageControl1.Visible := False;
|
|
// close all pages
|
|
if PageControl1.PageCount > 0 then
|
|
for i := PageControl1.PageCount - 1 downto 0 do
|
|
PageControl1.Pages [ i ].Free;
|
|
FilePath := OpenImageEnDialog1.FileName;
|
|
Frames := IEGetFileFramesCount ( FilePath );
|
|
ListViewFrames.Clear;
|
|
Preview.Clear;
|
|
ProgressBar1.Max := Frames;
|
|
loading := true;
|
|
for i := 0 to Frames - 1 do
|
|
begin
|
|
AddTabsheet;
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
with ImageEnView do
|
|
begin
|
|
Cursor := crIECross;
|
|
IO.Params.ICO_ImageIndex := i;
|
|
IO.LoadFromFile ( FilePath );
|
|
ListItem := ListViewFrames.Items.Add;
|
|
ListItem.Caption := IntToStr ( i + 1 );
|
|
ListItem.SubItems.Add ( IntToStr ( IEBitmap.Width ) + ' pixels x ' + IntToStr ( IEBitmap.Height ) + ' pixels' );
|
|
ListItem.SubItems.Add ( IntToStr ( IO.Params.SamplesPerPixel * IO.Params.BitsPerSample ) + ' bit' );
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( i + 1 ) + ' ' + IntToStr ( IEBitmap.Width ) + ' pixels x ' + IntToStr ( IEBitmap.Height ) + ' pixels' + ' ' + IntToStr ( IO.Params.SamplesPerPixel * IO.Params.BitsPerSample ) + ' bit';
|
|
ListItem.Selected := True;
|
|
ListViewFrames.ItemIndex := i;
|
|
ProgressBar1.Position := i;
|
|
IEBitmap.Modified := False;
|
|
end;
|
|
end;
|
|
ImageEnView.Proc.ClearAllUndo;
|
|
ImageEnView.Proc.ClearAllRedo;
|
|
StatusBar1.Panels [ 0 ].Text := ExtractFilePath ( FilePath );
|
|
StatusBar1.Panels [ 1 ].Text := ExtractFileName ( FilePath );
|
|
StatusBar1.Panels [ 4 ].Text := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
StatusBar1.Panels [ 5 ].Text := IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
ImageEnView.IO.Params.ICO_Background := TColor2TRGB ( BackColor.Brush.Color );
|
|
CheckBoxEnableAlpha.Checked := ImageEnView.HasAlphaChannel;
|
|
TrackBarZoom.Position := Trunc ( ImageEnView.Zoom );
|
|
ImageEnView.Fit;
|
|
Preview.IEBitmap.Assign ( ImageEnView.IEBitmap );
|
|
Preview.Update;
|
|
ProgressBar1.Position := 0;
|
|
PageControl1.Visible := True;
|
|
UpdateMenu;
|
|
ListViewFrames.ItemIndex := 0;
|
|
PageControl1.ActivePageIndex := 0;
|
|
loading := false;
|
|
Fit1Click ( Sender );
|
|
finally; Screen.Cursor := crDefault; end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectMagicWandOptionsExecute ( Sender: TObject );
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
if frmSelectionProperties.Execute then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.SelectionIntensity := StrToInt ( frmSelectionProperties.SelectionIntensityEdit.Text );
|
|
ImageEnView.MagicWandTolerance := StrToInt ( frmSelectionProperties.MagicWandToleranceEdit.Text );
|
|
case frmSelectionProperties.cbMagicWandMode.ItemIndex of
|
|
0: ImageEnView.MagicWandMode := iewInclusive;
|
|
1: ImageEnView.MagicWandMode := iewExclusive;
|
|
2: ImageEnView.MagicWandMode := iewGlobal;
|
|
end; //case
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.SelectInvertSelectionExecute ( Sender: TObject );
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
ImageEnView.InvertSelection;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.PickAlphaColorClick ( Sender: TObject );
|
|
begin
|
|
if PageControl1.ActivePage <> nil then
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.ActivePage.Controls [ 0 ] );
|
|
if PickAlphaColor.Down then
|
|
ImageEnView.Cursor := crIEEyeDropper
|
|
else
|
|
ImageEnView.Cursor := crIECross;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ForeColorMouseDown ( Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
|
|
begin
|
|
ColorDialog1.Color := ForeColor.Brush.Color;
|
|
if ColorDialog1.Execute then
|
|
ForeColor.Brush.Color := ColorDialog1.Color;
|
|
end;
|
|
|
|
procedure TMainForm.BackColorMouseDown ( Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
|
|
begin
|
|
ColorDialog1.Color := BackColor.Brush.Color;
|
|
if ColorDialog1.Execute then
|
|
BackColor.Brush.Color := ColorDialog1.Color;
|
|
end;
|
|
|
|
procedure TMainForm.Sort1Click ( Sender: TObject );
|
|
var
|
|
i: integer;
|
|
ListItem: TListItem;
|
|
begin
|
|
if PageControl1.PageCount > 0 then
|
|
begin
|
|
PageControl1.ActivePageIndex := 0;
|
|
for i := PageControl1.PageCount - 1 downto 0 do
|
|
begin
|
|
PageControl1.ActivePage.PageIndex := I;
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
PageControl1.ActivePage.Caption := 'Icon ' + IntToStr ( PageControl1.ActivePageIndex + 1 ) + ' ' + IntToStr ( ImageEnView.IO.Params.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IO.Params.Height ) + ' pixels ' + IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit';
|
|
PageControl1.ActivePageIndex := 0;
|
|
end;
|
|
// sort the listview
|
|
for i := 0 to ListViewFrames.Items.Count - 1 do
|
|
begin
|
|
ImageEnView := TImageEnView ( PageControl1.Pages [ i ].Controls [ 0 ] );
|
|
ListItem := ListViewFrames.Items.Item [ I ];
|
|
ListItem.Caption := IntToStr ( I + 1 );
|
|
ListItem.SubItems.Strings [ 0 ] := IntToStr ( ImageEnView.IEBitmap.Width ) + ' pixels x ' + IntToStr ( ImageEnView.IEBitmap.Height ) + ' pixels';
|
|
ListItem.SubItems.Strings [ 1 ] := ( IntToStr ( ImageEnView.IO.Params.SamplesPerPixel * ImageEnView.IO.Params.BitsPerSample ) + ' bit' );
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ImageEnViewProgress(Sender: TObject; per: Integer);
|
|
begin
|
|
Progressbar1.Position := per;
|
|
end;
|
|
|
|
procedure TMainForm.AboutExecute(Sender: TObject);
|
|
begin
|
|
frmAbout := TfrmAbout.Create ( Self );
|
|
try
|
|
frmAbout.ShowModal;
|
|
finally; frmAbout.Free; end;
|
|
end;
|
|
|
|
function HtmlHelp(hwndCaller: THandle; pszFile: PChar; uCommand: cardinal;
|
|
dwData: longint): THandle; stdcall; external 'hhctrl.ocx' name 'HtmlHelpA';
|
|
|
|
procedure TMainForm.HelpExecute(Sender: TObject);
|
|
begin
|
|
HtmlHelp ( GetDesktopWindow, 'plainiconeditor.chm', HH_DISPLAY_TOPIC, 0 );
|
|
end;
|
|
|
|
// fdv
|
|
procedure TMainForm.MyUndo(ie:TImageEnView);
|
|
var
|
|
x1,y1,x2,y2:integer;
|
|
begin
|
|
x1 := startX; y1 := startY; x2 := lastX; y2 := lastY;
|
|
OrdCor ( x1, y1, x2, y2 );
|
|
ie.Proc.UndoRect ( x1 - UpDownPenWidth.Position, y1 - UpDownPenWidth.Position, x2 + UpDownPenWidth.Position, y2 + UpDownPenWidth.Position );
|
|
end;
|
|
|
|
|
|
end.
|
|
|