3079 lines
91 KiB
Plaintext
3079 lines
91 KiB
Plaintext
(* ImageEn Build 7.0.0.06.2637 @ 7-4-17 14:58:42.679 *)
|
|
(*
|
|
Copyright (c) 1998-2017 by Carlotta Calandra. All rights reserved.
|
|
Copyright (c) 2011-2017 by Xequte Software.
|
|
|
|
This software comes without express or implied warranty.
|
|
In no case shall the author be liable for any damage or unwanted behavior of any
|
|
computer hardware and/or software.
|
|
|
|
Author grants you the right to include the component
|
|
in your application, whether COMMERCIAL, SHAREWARE, or FREEWARE.
|
|
|
|
ImageEn, IEvolution and ImageEn ActiveX may not be included in any
|
|
commercial, shareware or freeware libraries or components.
|
|
|
|
www.ImageEn.com
|
|
*)
|
|
|
|
(*
|
|
File version 1015
|
|
*)
|
|
|
|
unit previews;
|
|
|
|
{$R-}
|
|
{$Q-}
|
|
|
|
{$I ie.inc}
|
|
|
|
{$IFDEF IEINCLUDEDIALOGIP}
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
|
|
{$ifdef IEHASTYPES} Types, {$endif}
|
|
StdCtrls, ComCtrls, ExtCtrls, HSVBox, ImageEnProc, ImageEnView,
|
|
checklst, HistogramBox, RulerBox, Buttons, ImageEnIO, hyiedefs, iefft,
|
|
ieview, Dialogs, hyieutils, iexBitmaps, iesettings, iexRulers, iexLayers;
|
|
|
|
const
|
|
Previews_Tab_Count = 18;
|
|
|
|
|
|
type
|
|
TfPreviews = class(TForm)
|
|
Label1: TLabel;
|
|
Label2: TLabel;
|
|
OkButton: TBitBtn;
|
|
CancelButton: TBitBtn;
|
|
PageControl1: TPageControl;
|
|
tabContrast: TTabSheet;
|
|
tabHSL: TTabSheet;
|
|
tabRGB: TTabSheet;
|
|
tabFilters: TTabSheet;
|
|
Label3: TLabel;
|
|
Edit1: TEdit;
|
|
TrackBar1: TTrackBar;
|
|
Label4: TLabel;
|
|
Label5: TLabel;
|
|
Label6: TLabel;
|
|
Edit3: TEdit;
|
|
Edit2: TEdit;
|
|
Edit4: TEdit;
|
|
TrackBar2: TTrackBar;
|
|
TrackBar3: TTrackBar;
|
|
TrackBar5: TTrackBar;
|
|
Label7: TLabel;
|
|
Label8: TLabel;
|
|
Label9: TLabel;
|
|
Edit5: TEdit;
|
|
Edit6: TEdit;
|
|
Edit7: TEdit;
|
|
TrackBar6: TTrackBar;
|
|
TrackBar7: TTrackBar;
|
|
TrackBar8: TTrackBar;
|
|
GroupBox1: TGroupBox;
|
|
Edit8: TEdit;
|
|
Edit9: TEdit;
|
|
Edit10: TEdit;
|
|
Edit11: TEdit;
|
|
Edit12: TEdit;
|
|
Edit13: TEdit;
|
|
Edit14: TEdit;
|
|
Edit15: TEdit;
|
|
Edit16: TEdit;
|
|
UpDown1: TUpDown;
|
|
UpDown2: TUpDown;
|
|
UpDown3: TUpDown;
|
|
UpDown4: TUpDown;
|
|
UpDown5: TUpDown;
|
|
UpDown6: TUpDown;
|
|
UpDown7: TUpDown;
|
|
UpDown8: TUpDown;
|
|
UpDown9: TUpDown;
|
|
GroupBox3: TGroupBox;
|
|
ListBox1: TListBox;
|
|
ResultToSourceButton: TBitBtn;
|
|
tabHSV: TTabSheet;
|
|
Label10: TLabel;
|
|
Label11: TLabel;
|
|
Label12: TLabel;
|
|
Edit17: TEdit;
|
|
Edit18: TEdit;
|
|
Edit19: TEdit;
|
|
TrackBar9: TTrackBar;
|
|
TrackBar10: TTrackBar;
|
|
TrackBar11: TTrackBar;
|
|
Label13: TLabel;
|
|
Label14: TLabel;
|
|
Panel3: TPanel;
|
|
Panel4: TPanel;
|
|
Button4: TButton;
|
|
Button5: TButton;
|
|
OpenDialog1: TOpenDialog;
|
|
SaveDialog1: TSaveDialog;
|
|
Edit20: TEdit;
|
|
UpDown10: TUpDown;
|
|
Label15: TLabel;
|
|
tabEqualization: TTabSheet;
|
|
Panel5: TPanel;
|
|
GroupBox4: TGroupBox;
|
|
Label16: TLabel;
|
|
Label17: TLabel;
|
|
Label18: TLabel;
|
|
Label19: TLabel;
|
|
Label20: TLabel;
|
|
Label21: TLabel;
|
|
SpeedButton3: TSpeedButton;
|
|
Label22: TLabel;
|
|
Edit21: TEdit;
|
|
TrackBar12: TTrackBar;
|
|
HSVBox3: THSVBox;
|
|
HSVBox1: THSVBox;
|
|
RulerBox2: TRulerBox;
|
|
RulerBox1: TRulerBox;
|
|
HistogramBox1: THistogramBox;
|
|
PreviewButton: TBitBtn;
|
|
ImageEn1: TImageEnView;
|
|
ImageEn2: TImageEnView;
|
|
tabBumpMap: TTabSheet;
|
|
GroupBox2: TGroupBox;
|
|
Label23: TLabel;
|
|
Label24: TLabel;
|
|
Label26: TLabel;
|
|
Panel1: TPanel;
|
|
HSVBox2: THSVBox;
|
|
Label27: TLabel;
|
|
Label28: TLabel;
|
|
Label25: TLabel;
|
|
Edit22: TEdit;
|
|
UpDown11: TUpDown;
|
|
UpDown12: TUpDown;
|
|
Edit23: TEdit;
|
|
Edit24: TEdit;
|
|
UpDown13: TUpDown;
|
|
Edit25: TEdit;
|
|
UpDown14: TUpDown;
|
|
Edit26: TEdit;
|
|
UpDown15: TUpDown;
|
|
tabLens: TTabSheet;
|
|
GroupBox5: TGroupBox;
|
|
Label29: TLabel;
|
|
Label30: TLabel;
|
|
Label32: TLabel;
|
|
Label33: TLabel;
|
|
Edit27: TEdit;
|
|
UpDown16: TUpDown;
|
|
UpDown17: TUpDown;
|
|
Edit28: TEdit;
|
|
Edit29: TEdit;
|
|
UpDown18: TUpDown;
|
|
Edit30: TEdit;
|
|
UpDown19: TUpDown;
|
|
Label31: TLabel;
|
|
UpDown20: TUpDown;
|
|
Edit31: TEdit;
|
|
tabWave: TTabSheet;
|
|
tabMorph: TTabSheet;
|
|
GroupBox6: TGroupBox;
|
|
Label34: TLabel;
|
|
Edit32: TEdit;
|
|
UpDown21: TUpDown;
|
|
UpDown22: TUpDown;
|
|
Edit33: TEdit;
|
|
Label35: TLabel;
|
|
Label36: TLabel;
|
|
Edit34: TEdit;
|
|
UpDown23: TUpDown;
|
|
CheckBox2: TCheckBox;
|
|
GroupBox7: TGroupBox;
|
|
Label37: TLabel;
|
|
ListBox2: TListBox;
|
|
Label38: TLabel;
|
|
Edit35: TEdit;
|
|
UpDown24: TUpDown;
|
|
tabRotate: TTabSheet;
|
|
TrackBarRotate: TTrackBar;
|
|
edtRotate: TEdit;
|
|
lblRotate: TLabel;
|
|
tabFFT: TTabSheet;
|
|
GroupBox8: TGroupBox;
|
|
ienFFT: TImageEnView;
|
|
iepFFT: TImageEnProc;
|
|
Clear: TButton;
|
|
Button7: TButton;
|
|
pbrFFT: TProgressBar;
|
|
CheckBox1: TCheckBox;
|
|
tabGamma: TTabSheet;
|
|
GroupBox9: TGroupBox;
|
|
lblGammaHeading: TLabel;
|
|
edtGamma: TEdit;
|
|
trkGamma: TTrackBar;
|
|
ImageEnView2: TImageEnView;
|
|
Label41: TLabel;
|
|
Label42: TLabel;
|
|
Label40: TLabel;
|
|
Label43: TLabel;
|
|
tabSharpen: TTabSheet;
|
|
Label44: TLabel;
|
|
Edit36: TEdit;
|
|
TrackBar4: TTrackBar;
|
|
Label45: TLabel;
|
|
Edit37: TEdit;
|
|
UpDown25: TUpDown;
|
|
chkLockPreview: TCheckBox;
|
|
chkFlipHorz: TCheckBox;
|
|
chkFlipVert: TCheckBox;
|
|
lblFlip: TLabel;
|
|
Image1: TImage;
|
|
ResetButton: TBitBtn;
|
|
tmrUpdatePreview: TTimer;
|
|
tabResize: TTabSheet;
|
|
lblResize: TLabel;
|
|
lblWidth: TLabel;
|
|
lblHeight: TLabel;
|
|
lblCurrentSize: TLabel;
|
|
lblNewSize: TLabel;
|
|
lblNewScale: TLabel;
|
|
edtOldWidth: TEdit;
|
|
lblP1: TLabel;
|
|
lblP2: TLabel;
|
|
edtOldHeight: TEdit;
|
|
chkMaintainAR: TCheckBox;
|
|
updNewWidth: TUpDown;
|
|
edtNewWidth: TEdit;
|
|
updNewHeight: TUpDown;
|
|
edtNewHeight: TEdit;
|
|
edtNewWidthPercent: TEdit;
|
|
updNewWidthPercent: TUpDown;
|
|
edtNewHeightPercent: TEdit;
|
|
updNewHeightPercent: TUpDown;
|
|
lblRotateBackground: TLabel;
|
|
pnlRotateBackground: TPanel;
|
|
tabSoftShadow: TTabSheet;
|
|
lblShadowRadius: TLabel;
|
|
edtShadowRadius: TEdit;
|
|
updShadowRadius: TUpDown;
|
|
lblShadowOffset: TLabel;
|
|
edtShadowOffset: TEdit;
|
|
updShadowOffset: TUpDown;
|
|
lblShadowColor: TLabel;
|
|
pnlShadowColor: TPanel;
|
|
lblAddSoftShadow: TLabel;
|
|
lblShadowPosition: TLabel;
|
|
cmbShadowPosition: TComboBox;
|
|
tabAutoEnhance: TTabSheet;
|
|
cmbAutoEnhance: TComboBox;
|
|
lblAutoEnhance: TLabel;
|
|
pnlAutoEnhance1: TPanel;
|
|
lblAutoEnhance1Slope: TLabel;
|
|
edtAutoEnhance1Slope: TEdit;
|
|
updAutoEnhance1Slope: TUpDown;
|
|
lblAutoEnhance1Range: TLabel;
|
|
edtAutoEnhance1Range: TEdit;
|
|
updAutoEnhance1Range: TUpDown;
|
|
lblAutoEnhance1Quality: TLabel;
|
|
edtAutoEnhance1Quality: TEdit;
|
|
updAutoEnhance1Quality: TUpDown;
|
|
pnlAutoEnhance3: TPanel;
|
|
lblAutoEnhance3Gamma: TLabel;
|
|
updAutoEnhance3Gamma: TUpDown;
|
|
edtAutoEnhance3Gamma: TEdit;
|
|
updAutoEnhance3Saturation: TUpDown;
|
|
edtAutoEnhance3Saturation: TEdit;
|
|
lblAutoEnhance3Saturation: TLabel;
|
|
tabCrop: TTabSheet;
|
|
lblCropLeft: TLabel;
|
|
edtCropLeft: TEdit;
|
|
updCropLeft: TUpDown;
|
|
lblCropTop: TLabel;
|
|
edtCropTop: TEdit;
|
|
updCropTop: TUpDown;
|
|
edtCropRight: TEdit;
|
|
updCropRight: TUpDown;
|
|
lblCropBottom: TLabel;
|
|
edtCropBottom: TEdit;
|
|
updCropBottom: TUpDown;
|
|
lblCropImage: TLabel;
|
|
lblCropBackground: TLabel;
|
|
pnlCropBackground: TPanel;
|
|
lblCropRight: TLabel;
|
|
chkGammaRed: TCheckBox;
|
|
chkGammaGreen: TCheckBox;
|
|
chkGammaBlue: TCheckBox;
|
|
chkEqualRed: TCheckBox;
|
|
chkEqualGreen: TCheckBox;
|
|
chkEqualBlue: TCheckBox;
|
|
chkEqualGray: TCheckBox;
|
|
Label39: TLabel;
|
|
ComboBox1: TComboBox;
|
|
procedure AutoEnhanceControlChange(Sender: TObject);
|
|
procedure FormActivate(Sender: TObject);
|
|
procedure TrackBar1Change(Sender: TObject);
|
|
procedure Edit1Change(Sender: TObject);
|
|
procedure TrackBar2Change(Sender: TObject);
|
|
procedure Edit4Change(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure PageControl1Change(Sender: TObject);
|
|
procedure Button4Click(Sender: TObject);
|
|
procedure ResultToSourceButtonClick(Sender: TObject);
|
|
procedure ImageEn1ViewChange(Sender: TObject; Change: Integer);
|
|
procedure TrackBar6Change(Sender: TObject);
|
|
procedure Edit7Change(Sender: TObject);
|
|
procedure Edit8Change(Sender: TObject);
|
|
procedure ListBox1Click(Sender: TObject);
|
|
procedure Button5Click(Sender: TObject);
|
|
procedure OkButtonClick(Sender: TObject);
|
|
procedure TrackBar9Change(Sender: TObject);
|
|
procedure Edit19Change(Sender: TObject);
|
|
procedure HSVBox3Change(Sender: TObject);
|
|
procedure ImageEn2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
procedure chkEqualClick(Sender: TObject);
|
|
procedure RulerBox2RulerPosChange(Sender: TObject; RulerDir: TRulerDir; Grip: integer; NewPos: Double);
|
|
procedure RulerBox1RulerPosChange(Sender: TObject; RulerDir: TRulerDir; Grip: integer; NewPos: Double);
|
|
procedure SpeedButton3Click(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure PreviewButtonClick(Sender: TObject);
|
|
procedure chkLockPreviewClick(Sender: TObject);
|
|
procedure Edit22Change(Sender: TObject);
|
|
procedure HSVBox2Change(Sender: TObject);
|
|
procedure Edit27Change(Sender: TObject);
|
|
procedure Edit32Change(Sender: TObject);
|
|
procedure Edit35Change(Sender: TObject);
|
|
procedure TrackBarRotateChange(Sender: TObject);
|
|
procedure edtRotateChange(Sender: TObject);
|
|
procedure chkFlipHorzClick(Sender: TObject);
|
|
procedure ClearClick(Sender: TObject);
|
|
procedure Button7Click(Sender: TObject);
|
|
procedure iepFFTProgress(Sender: TObject; per: Integer);
|
|
procedure CheckBox1Click(Sender: TObject);
|
|
procedure trkGammaChange(Sender: TObject);
|
|
procedure chkGammaClick(Sender: TObject);
|
|
procedure CropControlChange(Sender: TObject);
|
|
procedure TrackBar4Change(Sender: TObject);
|
|
procedure Edit36Change(Sender: TObject);
|
|
procedure FormResize(Sender: TObject);
|
|
procedure ResetButtonClick(Sender: TObject);
|
|
procedure edtNewHeightChange(Sender: TObject);
|
|
procedure edtNewWidthChange(Sender: TObject);
|
|
procedure edtNewWidthPercentChange(Sender: TObject);
|
|
procedure tmrUpdatePreviewTimer(Sender: TObject);
|
|
procedure edtNewHeightPercentChange(Sender: TObject);
|
|
procedure ImageEn1SelectionChange(Sender: TObject);
|
|
procedure pnlRotateBackgroundClick(Sender: TObject);
|
|
procedure SoftShadowControlChange(Sender: TObject);
|
|
procedure updAutoEnhance3GammaClick(Sender: TObject; Button: TUDBtnType);
|
|
procedure ComboBox1Change(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
fHaveActivated: Boolean;
|
|
fMedR, fMedG, fMedB: integer; // contrast: median values
|
|
fDoFilters: boolean; // used by user filters
|
|
fDoChange: boolean; // if true, controls can change their status
|
|
fDoProgress: boolean;
|
|
fResized: boolean;
|
|
fUpdatingSize : Boolean;
|
|
fDoSelecting : Boolean; // True when programatically selecting a region
|
|
|
|
procedure ApplyAct(im: TImageEnView; bPreview: Boolean = True);
|
|
procedure CopyOrg;
|
|
procedure CopyModToOrg;
|
|
procedure LoadFilt;
|
|
procedure ResetParameters(rs: boolean);
|
|
procedure UpdatePreviewZoom;
|
|
procedure UpdatePreview(bForce : Boolean = False);
|
|
procedure DrawGammaGraph(g: double);
|
|
procedure GetIPParams;
|
|
procedure WMEXITSIZEMOVE(var Message: TMessage); message WM_EXITSIZEMOVE;
|
|
public
|
|
{ Public declarations }
|
|
Contrast: integer; // contrast (output)
|
|
Brightness: integer; // Brightness (output) = luminosity
|
|
Hue, Sat, Lum: integer; // Hue/Sat/Lum (output)
|
|
bHue, bSat, bVal: integer; // Hue/Sat/Val (output)
|
|
Red, Green, Blue: integer; // RGB (output)
|
|
Filter: TGraphFilter; // Filter (output)
|
|
DownLimit, UpLimit: TRGB; // threshold
|
|
EDownLimit, EUpLimit: TRGB; // equalize
|
|
AutoEqualize: boolean; // autoequalize
|
|
BumpLeft, BumpTop, BumpWidth, BumpHeight: integer; // bump map
|
|
BumpCol: TRGB; // bump map light color
|
|
BumpSrc: integer; // bump map % image
|
|
LensLeft, LensTop, LensWidth, LensHeight: integer; // Lens
|
|
LensRef: double; // Lens reflection
|
|
WaveAmplitude: integer;
|
|
WaveWaveLength: integer;
|
|
WavePhase: integer;
|
|
WaveReflect: boolean;
|
|
MorphFilter: integer;
|
|
MorphWinSize: integer;
|
|
RotationAngle: double; // rotate
|
|
FlipHorz, FlipVert : Boolean;
|
|
Sharpen: integer;
|
|
SharpenSize: integer;
|
|
ResizePercent: Integer;
|
|
ShadowRadius : Integer;
|
|
ShadowOffset : Integer;
|
|
AutoEnhance1Slope : Integer; // For AutoImageEnhance1
|
|
AutoEnhance1Range : Integer; // For AutoImageEnhance1
|
|
AutoEnhance3Gamma : double; // For AutoImageEnhance3
|
|
AutoEnhance3Saturation: Integer; // For AutoImageEnhance3
|
|
CropLeft : Integer;
|
|
CropTop : Integer;
|
|
CropRight : Integer;
|
|
CropBottom : Integer;
|
|
|
|
// FFT
|
|
{$ifdef IEINCLUDEFFT}
|
|
FFTProgressPos: integer;
|
|
FTImage: TIEFtImage;
|
|
{$endif}
|
|
|
|
pe: TPreviewEffects;
|
|
Progress: TProgressRec;
|
|
DefaultLockPreview: boolean;
|
|
ars : array[0 .. Previews_Tab_Count - 1] of boolean;
|
|
undos : array[0 .. Previews_Tab_Count - 1] of string;
|
|
InitialPage: TTabSheet;
|
|
UndoCaption: string;
|
|
|
|
fIPDialogParams: TIPDialogParams;
|
|
|
|
ShowReset: boolean;
|
|
HardReset: boolean;
|
|
ResetAllTabs: boolean;
|
|
|
|
OpList: TStringList; // list of operations done (NOT CREATED HERE!)
|
|
CurrentOp: string;
|
|
|
|
procedure UpdateLanguage();
|
|
|
|
{$IFDEF UNIT_TESTING}
|
|
procedure SetNextLanguage;
|
|
{$ENDIF}
|
|
|
|
end;
|
|
|
|
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
ResourceString
|
|
IERS_ContrastBrightness = 'Contrast/Brightness';
|
|
IERS_HSLAdjust = 'HSL adjust';
|
|
IERS_RGBAdjust = 'RGB adjust';
|
|
IERS_ConvolutionFilter = 'Convolution Filter';
|
|
IERS_HSVAdjust = 'HSV adjust';
|
|
IERS_HistogramAdjust = 'Histogram adjust';
|
|
IERS_BumpMap = 'Bump Map';
|
|
IERS_LensEffect = 'Lens effect';
|
|
IERS_WaveEffect = 'Wave effect';
|
|
IERS_Morph = 'Morph';
|
|
IERS_Rotate = 'Rotate';
|
|
IERS_FFT = 'FFT';
|
|
IERS_GammaCorrection = 'Gamma Correction';
|
|
IERS_Sharpen = 'Sharpen';
|
|
IERS_Resize = 'Resize';
|
|
IERS_AddSoftShadow = 'Add Soft Shadow';
|
|
IERS_AutoImageEnhance1 = 'Auto-Enhancement';
|
|
IERS_AutoImageEnhance3 = 'Tone Mapping Enhancement';
|
|
IERS_Crop = 'Crop';
|
|
{$ENDIF}
|
|
|
|
const
|
|
Min_Preview_Dialog_Width = 548;
|
|
Min_Preview_Dialog_Height = 454;
|
|
Default_Preview_Dialog_ClientWidth = 554;
|
|
Default_Preview_Dialog_ClientHeight = 422;
|
|
|
|
implementation
|
|
|
|
uses
|
|
iexThemes, Math, iegdiplus, iexCanvasUtils;
|
|
|
|
{$R *.DFM}
|
|
|
|
const
|
|
_tabContrast = 0 ;
|
|
_tabHSL = 1 ;
|
|
_tabRGB = 2 ;
|
|
_tabUserFilter = 3 ;
|
|
_tabHSV = 4 ;
|
|
_tabEqualize = 5 ;
|
|
_tabBumpMap = 6 ;
|
|
_tabLens = 7 ;
|
|
_tabWave = 8 ;
|
|
_tabMorph = 9 ;
|
|
_tabRotate = 10;
|
|
_tabFFT = 11;
|
|
_tabGamma = 12;
|
|
_tabSharpen = 13;
|
|
_tabResize = 14;
|
|
_tabSoftShadow = 15;
|
|
_tabAutoEnhance = 16;
|
|
_tabCrop = 17;
|
|
|
|
Preview_Update_Interval_MS = 250;
|
|
|
|
// Items of cmbShadowPosition
|
|
_cmbShadowPosition_TopLeft = 0;
|
|
_cmbShadowPosition_TopRight = 1;
|
|
_cmbShadowPosition_BottomLeft = 2;
|
|
_cmbShadowPosition_BottomRight = 3;
|
|
_cmbShadowPosition_All = 4;
|
|
|
|
|
|
{$IFDEF UNIT_TESTING}
|
|
procedure TfPreviews.SetNextLanguage;
|
|
begin
|
|
Self.Tag := Self.Tag + 1;
|
|
if Self.tag >= ord( msUser ) then
|
|
Self.Tag := 0;
|
|
IEGlobalSettings().MsgLanguage := TMsgLanguage(Self.Tag);
|
|
UpdateLanguage();
|
|
end;
|
|
{$ENDIF}
|
|
|
|
procedure TfPreviews.FormDestroy(Sender: TObject);
|
|
begin
|
|
{$ifdef IEINCLUDEFFT}
|
|
if assigned(FTImage) then
|
|
FreeAndNil(FTImage);
|
|
{$endif}
|
|
end;
|
|
|
|
|
|
|
|
procedure TfPreviews.FormCreate(Sender: TObject);
|
|
var
|
|
q: integer;
|
|
begin
|
|
fHaveActivated := False;
|
|
CurrentOp := '';
|
|
|
|
ImageEn1.IO.PreviewFont.Assign(IEGetDefaultDialogFont);
|
|
ImageEn2.IO.PreviewFont.Assign(IEGetDefaultDialogFont);
|
|
|
|
ImageEn2.Proc.AutoUndo := False;
|
|
|
|
for q := 0 to ComponentCount - 1 do
|
|
if (Components[q] is TTrackBar) then
|
|
(Components[q] as TTrackBar).ThumbLength := Trackbar_Thumb_Length;
|
|
|
|
{$ifdef IEINCLUDEFFT}
|
|
FTImage := nil;
|
|
{$endif}
|
|
PageControl1.ActivePage := tabContrast;
|
|
ImageEn2.Proc.UndoLocation := ieMemory;
|
|
UndoCaption := '';
|
|
ImageEn1.ZoomFilter := IEGlobalSettings().DefaultPreviewsZoomFilter;
|
|
ImageEn2.ZoomFilter := IEGlobalSettings().DefaultPreviewsZoomFilter;
|
|
tmrUpdatePreview.Interval := Preview_Update_Interval_MS;
|
|
fUpdatingSize := False;
|
|
end;
|
|
|
|
|
|
// if rs is True initialize all
|
|
procedure TfPreviews.ResetParameters(rs: boolean);
|
|
var
|
|
x: integer;
|
|
{$ifdef IEINCLUDEFFT}
|
|
w, h, ww: integer;
|
|
{$endif}
|
|
bEnabled: boolean;
|
|
begin
|
|
if rs then
|
|
for x := 0 to high(ars) do
|
|
ars[x] := false;
|
|
//
|
|
fDoChange := false;
|
|
|
|
// CONTRAST AND BRIGHTNESS
|
|
if (PageControl1.ActivePage = tabContrast) and not ars[_tabContrast] then
|
|
begin
|
|
_getmediacontrastRGB(imageen1.IEBitmap, fMedR, fMedG, fMedB);
|
|
Contrast := fIPDialogParams.CONTRAST_Contrast;
|
|
Brightness := fIPDialogParams.CONTRAST_Brightness;
|
|
edit1.text := IntToStr(Contrast);
|
|
edit21.text := IntToStr(Brightness);
|
|
trackbar1.position := Contrast;
|
|
trackbar12.position := Brightness;
|
|
ars[_tabContrast] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabContrast ] := IERS_ContrastBrightness;
|
|
{$ELSE}
|
|
undos[ _tabContrast ] := IEMsg( IEMSG_Contrast ) + '/' + IEMsg( IEMSG_Brightness );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// HSL
|
|
if (PageControl1.ActivePage = tabHSL) and not ars[_tabHSL] then
|
|
begin
|
|
Hue := fIPDialogParams.HSL_H;
|
|
Sat := fIPDialogParams.HSL_S;
|
|
Lum := fIPDialogParams.HSL_L;
|
|
trackbar2.Position := Hue;
|
|
trackbar3.Position := Sat;
|
|
trackbar5.Position := Lum;
|
|
edit4.text := IntToStr(Hue);
|
|
edit2.text := IntToStr(Sat);
|
|
edit3.text := IntToStr(Lum);
|
|
ars[_tabHSL] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabHSL ] := IERS_HSLAdjust;
|
|
{$ELSE}
|
|
undos[ _tabHSL ] := IEMsg( IEMSG_AdjustHSL );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// RGB
|
|
if (PageControl1.ActivePage = tabRGB) and not ars[_tabRGB] then
|
|
begin
|
|
red := fIPDialogParams.RGB_R;
|
|
green := fIPDialogParams.RGB_G;
|
|
blue := fIPDialogParams.RGB_B;
|
|
trackbar6.Position := red;
|
|
trackbar7.Position := green;
|
|
trackbar8.Position := blue;
|
|
edit7.text := IntToStr(red);
|
|
edit6.text := IntToStr(green);
|
|
edit5.texT := IntToStr(blue);
|
|
ars[_tabRGB] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabRGB ] := IERS_RGBAdjust;
|
|
{$ELSE}
|
|
undos[ _tabRGB ] := IEMsg( IEMSG_AdjustRGB );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// USER FILTER
|
|
if (PageControl1.ActivePage = tabFilters) and not ars[_tabUserFilter] then
|
|
begin
|
|
Filter := fIPDialogParams.USERFILTER_Values;
|
|
listbox1.itemindex := 0;
|
|
LoadFilt;
|
|
ars[_tabUserFilter] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabUserFilter ] := IERS_ConvolutionFilter;
|
|
{$ELSE}
|
|
undos[ _tabUserFilter ] := IEMsg( IEMSG_ConvolutionFilter );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// HSV
|
|
if (PageControl1.ActivePage = tabHSV) and not ars[_tabHSV] then
|
|
begin
|
|
bHue := fIPDialogParams.HSV_H;
|
|
bSat := fIPDialogParams.HSV_S;
|
|
bVal := fIPDialogParams.HSV_V;
|
|
trackbar9.Position := bHue;
|
|
trackbar10.Position := bSat;
|
|
trackbar11.Position := bVal;
|
|
edit19.text := IntToStr(bHue);
|
|
edit18.text := IntToStr(bSat);
|
|
edit17.text := IntToStr(bVal);
|
|
ars[_tabHSV] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabHSV ] := IERS_HSVAdjust;
|
|
{$ELSE}
|
|
undos[ _tabHSV ] := IEMsg( IEMSG_AdjustHSV );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// EQUALIZATION (HISTOGRAM)
|
|
if (PageControl1.ActivePage = tabEqualization) and not ars[_tabEqualize] then
|
|
begin
|
|
DownLimit := fIPDialogParams.EQUALIZATION_ThresholdDown;
|
|
UpLimit := fIPDialogParams.EQUALIZATION_ThresholdUp;
|
|
EDownLimit := fIPDialogParams.EQUALIZATION_EqDown;
|
|
EUpLimit := fIPDialogParams.EQUALIZATION_EqUp;
|
|
AutoEqualize := fIPDialogParams.EQUALIZATION_EqualizeButton;
|
|
chkEqualRed .Checked := false;
|
|
chkEqualGreen.Checked := false;
|
|
chkEqualBlue .Checked := false;
|
|
chkEqualGray .Checked := true;
|
|
HistogramBox1.HistogramKind := [hkGray];
|
|
HistogramBox1.Scale := IEGlobalSettings().DefaultPreviewHistogramScale;
|
|
ComboBox1.ItemIndex := ord(IEGlobalSettings().DefaultPreviewHistogramScale);
|
|
with RulerBox1 do
|
|
begin
|
|
GripsPos[0] := DownLimit.r;
|
|
GripsColor[0] := clGray;
|
|
GripsKind[0] := gkArrow2;
|
|
GripsPos[1] := UpLimit.r;
|
|
GripsColor[1] := clGray;
|
|
GripsKind[1] := gkArrow2;
|
|
end;
|
|
with RulerBox2 do
|
|
begin
|
|
GripsPos[0] := EDownLimit.r;
|
|
GripsColor[0] := clGray;
|
|
GripsPos[1] := EUpLimit.r;
|
|
GripsColor[1] := clGray;
|
|
end;
|
|
speedbutton3.down := AutoEqualize;
|
|
ars[_tabEqualize] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabEqualize ] := IERS_HistogramAdjust;
|
|
{$ELSE}
|
|
undos[ _tabEqualize ] := IEMsg( IEMsg_AdjustHistogram );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// BUMP MAP
|
|
if (PageControl1.ActivePage = tabBumpMap) and not ars[_tabBumpMap] then
|
|
begin
|
|
if fIPDialogParams.BUMPMAP_Auto then
|
|
begin
|
|
BumpLeft := ImageEn1.IEBitmap.Width div 2;
|
|
BumpTop := ImageEn1.IEBitmap.Height div 2;
|
|
BumpWidth := imax(ImageEn1.IEBitmap.Width, ImageEn1.IEBitmap.Height) div 2;
|
|
BumpHeight := BumpWidth;
|
|
end
|
|
else
|
|
begin
|
|
BumpLeft := fIPDialogParams.BUMPMAP_Left;
|
|
BumpTop := fIPDialogParams.BUMPMAP_Top;
|
|
BumpWidth := fIPDialogParams.BUMPMAP_Width;
|
|
BumpHeight := fIPDialogParams.BUMPMAP_Height;
|
|
end;
|
|
BumpCol := fIPDialogParams.BUMPMAP_Col;
|
|
BumpSrc := fIPDialogParams.BUMPMAP_Src;
|
|
edit22.text := IntToStr(BumpLeft);
|
|
edit23.text := IntToStr(BumpTop);
|
|
edit24.text := IntToStr(BumpWidth);
|
|
edit25.text := IntToStr(BumpHeight);
|
|
edit26.text := IntToStr(BumpSrc);
|
|
HsvBox2.SetRGB(BumpCol.R, BumpCol.G, BumpCol.B);
|
|
ars[_tabBumpMap] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabBumpMap ] := IERS_BumpMap;
|
|
{$ELSE}
|
|
undos[ _tabBumpMap ] := IEMsg( IEMSG_BumpMap );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// LENS
|
|
if (PageControl1.ActivePage = tabLens) and not ars[_tabLens] then
|
|
begin
|
|
if fIPDialogParams.LENS_Auto then
|
|
begin
|
|
LensLeft := ImageEn1.IEBitmap.Width div 2;
|
|
LensTop := ImageEn1.IEBitmap.Height div 2;
|
|
LensWidth := imax(ImageEn1.IEBitmap.Width, ImageEn1.IEBitmap.Height) div 2;
|
|
LensHeight := LensWidth;
|
|
end
|
|
else
|
|
begin
|
|
LensLeft := fIPDialogParams.LENS_Left;
|
|
LensTop := fIPDialogParams.LENS_Top;
|
|
LensWidth := fIPDialogParams.LENS_Width;
|
|
LensHeight := fIPDialogParams.LENS_Height;
|
|
end;
|
|
LensRef := fIPDialogParams.LENS_Ref;
|
|
edit27.text := IntToStr(LensLeft);
|
|
edit28.text := IntToStr(LensTop);
|
|
edit29.text := IntToStr(LensWidth);
|
|
edit30.text := IntToStr(LensHeight);
|
|
edit31.text := IntToStr(trunc(LensRef * 10 - 10));
|
|
ars[_tabLens] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabLens ] := IERS_LensEffect;
|
|
{$ELSE}
|
|
undos[ _tabLens ] := IEMsg( IEMSG_Lens );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// WAVE
|
|
if (PageControl1.ActivePage = tabWave) and not ars[_tabWave] then
|
|
begin
|
|
WaveAmplitude := fIPDialogParams.WAVE_Amplitude;
|
|
WaveWaveLength := fIPDialogParams.WAVE_WaveLength;
|
|
WavePhase := fIPDialogParams.WAVE_Phase;
|
|
WaveReflect := fIPDialogParams.WAVE_Reflect;
|
|
edit32.text := IntToStr(WaveAmplitude);
|
|
edit33.text := IntToStr(WaveWaveLength);
|
|
edit34.text := IntToStr(WavePhase);
|
|
checkbox2.checked := WaveReflect;
|
|
ars[_tabWave] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabWave ] := IERS_WaveEffect;
|
|
{$ELSE}
|
|
undos[ _tabWave ] := IEMsg( IEMSG_Wave );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// MORPH FILTERS
|
|
if (PageControl1.ActivePage = tabMorph) and not ars[_tabMorph] then
|
|
begin
|
|
MorphFilter := fIPDialogParams.MORPH_Filter;
|
|
MorphWinSize := fIPDialogParams.MORPH_WinSize;
|
|
ListBox2.ItemIndex := MorphFilter;
|
|
Edit35.Text := IntToStr(MorphWinSize);
|
|
ars[_tabMorph] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabMorph ] := IERS_Morph;
|
|
{$ELSE}
|
|
undos[ _tabMorph ] := IEMsg( IEMSG_MORPHFILTER );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// ROTATE
|
|
if (PageControl1.ActivePage = tabRotate) and not ars[_tabRotate] then
|
|
begin
|
|
RotationAngle := fIPDialogParams.ROTATE_Angle;
|
|
FlipHorz := fIPDialogParams.FLIP_Horz;
|
|
FlipVert := fIPDialogParams.FLIP_Vert;
|
|
edtRotate.Text := floattostr(RotationAngle);
|
|
pnlRotateBackground.Color := fIPDialogParams.BackgroundColor;
|
|
TrackBarRotate.Position := trunc(RotationAngle * 100);
|
|
chkFlipHorz.checked := FlipHorz;
|
|
chkFlipVert.checked := FlipVert;
|
|
ars[_tabRotate] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabRotate ] := IERS_Rotate;
|
|
{$ELSE}
|
|
undos[ _tabRotate ] := IEMsg( IEMSG_Rotate );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// FFT
|
|
if (PageControl1.ActivePage = tabFFT) and not ars[_tabFFT] then
|
|
begin
|
|
{$ifdef IEINCLUDEFFT}
|
|
CheckBox1.Checked := fIPDialogParams.FFT_GrayScale;
|
|
TIEFtImage.CalcSuitableSourceSize(ImageEn1.IEBitmap.Width, ImageEn1.IEBitmap.Height, w, h);
|
|
TIEFtImage.CalcFFTImageSize(w, h, ww);
|
|
ienFFT.Proc.ImageResize(ww, ww);
|
|
if fIPDialogParams.FFT_Selection.Size>0 then
|
|
begin
|
|
fIPDialogParams.FFT_Selection.Position := 0;
|
|
ienFFT.LoadSelectionFromStream(fIPDialogParams.FFT_Selection);
|
|
end
|
|
else
|
|
if fIPDialogParams.FFT_Left>-1 then
|
|
ienFFT.Select( fIPDialogParams.FFT_Left, fIPDialogParams.FFT_Top, fIPDialogParams.FFT_Right, fIPDialogParams.FFT_Bottom, iespReplace );
|
|
ars[_tabFFT] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabFFT ] := IERS_FFT;
|
|
{$ELSE}
|
|
undos[ _tabFFT ] := IEMsg( IEMSG_FFT );
|
|
{$ENDIF}
|
|
{$endif}
|
|
end;
|
|
|
|
// GAMMA CORRECTION
|
|
if (PageControl1.ActivePage = tabGamma) and not ars[_tabGamma] then
|
|
begin
|
|
trkGamma.Position := trunc(fIPDialogParams.GAMMACORRECTION_Value*10);
|
|
trkGammaChange(nil);
|
|
// Check all the gamma boxes
|
|
chkGammaRed .checked := true;
|
|
chkGammaGreen.checked := true;
|
|
chkGammaBlue .checked := true;
|
|
ars[_tabGamma] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabGamma ] := IERS_GammaCorrection;
|
|
{$ELSE}
|
|
undos[ _tabGamma ] := IEMsg( IEMSG_GammaCorrection );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// SHARPEN
|
|
if (PageControl1.ActivePage = tabSharpen) and not ars[_tabSharpen] then
|
|
begin
|
|
Sharpen := fIPDialogParams.SHARPEN_Sharpen;
|
|
SharpenSize := fIPDialogParams.SHARPEN_Size;
|
|
edit36.text := IntToStr(Sharpen);
|
|
edit37.text := IntToStr(SharpenSize);
|
|
trackbar4.position := Sharpen;
|
|
ars[_tabSharpen] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabSharpen ] := IERS_Sharpen;
|
|
{$ELSE}
|
|
undos[ _tabSharpen ] := IEMsg( IEMSG_Sharpen );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// RESIZE (RESAMPLE)
|
|
if (PageControl1.ActivePage = tabResize) and not ars[_tabResize] then
|
|
begin
|
|
ResizePercent := fIPDialogParams.Resize_Percent;
|
|
|
|
edtOldWidth .Text := IntToStr(ImageEn1.IEBitmap.Width);
|
|
edtOldHeight.Text := IntToStr(ImageEn1.IEBitmap.Height);
|
|
edtNewWidthPercent .Text := IntToStr(ResizePercent);
|
|
edtNewHeightPercent.Text := IntToStr(ResizePercent);
|
|
chkMaintainAR.checked := True;
|
|
ars[_tabResize] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabResize ] := IERS_Resize;
|
|
{$ELSE}
|
|
undos[ _tabResize ] := IEMsg( IEMSG_Resize );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// SOFT SHADOW
|
|
if (PageControl1.ActivePage = tabSoftShadow) and not ars[_tabSoftShadow] then
|
|
begin
|
|
ShadowRadius := fIPDialogParams.Shadow_Radius;
|
|
ShadowOffset := fIPDialogParams.Shadow_Offset;
|
|
|
|
edtShadowRadius.Text := IntToStr(ShadowRadius);
|
|
if ShadowOffset = 0 then
|
|
begin
|
|
edtShadowOffset.Text := IntToStr(3);
|
|
cmbShadowPosition.ItemIndex := _cmbShadowPosition_All;
|
|
end
|
|
else
|
|
begin
|
|
edtShadowOffset.Text := IntToStr(ShadowOffset);
|
|
cmbShadowPosition.ItemIndex := _cmbShadowPosition_BottomRight;
|
|
end;
|
|
|
|
bEnabled := ImageEn1.EnableAlphaChannel;
|
|
lblAddSoftShadow .Enabled := bEnabled;
|
|
edtShadowRadius .Enabled := bEnabled;
|
|
updShadowRadius .Enabled := bEnabled;
|
|
lblShadowRadius .Enabled := bEnabled;
|
|
lblShadowColor .Enabled := bEnabled;
|
|
pnlShadowColor .Enabled := bEnabled;
|
|
lblShadowPosition.Enabled := bEnabled;
|
|
cmbShadowPosition.Enabled := bEnabled;
|
|
if bEnabled then
|
|
pnlShadowColor.Color := clBlack
|
|
else
|
|
pnlShadowColor.Color := clbtnFace;
|
|
SoftShadowControlChange(nil);
|
|
ars[_tabSoftShadow] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabSoftShadow ] := IERS_AddSoftShadow;
|
|
{$ELSE}
|
|
undos[ _tabSoftShadow ] := IEMsg( IEMSG_AddSoftShadow );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// AUTO-ENHANCE
|
|
if (PageControl1.ActivePage = tabAutoEnhance) and not ars[_tabAutoEnhance] then
|
|
begin
|
|
AutoEnhance1Slope := fIPDialogParams.AutoEnhance1_Slope;
|
|
AutoEnhance1Range := fIPDialogParams.AutoEnhance1_Range;
|
|
AutoEnhance3Gamma := fIPDialogParams.AutoEnhance3_Gamma;
|
|
AutoEnhance3Saturation := fIPDialogParams.AutoEnhance3_Saturation;
|
|
if ( AutoEnhance3Gamma = 0 ) and ( AutoEnhance1Range = 0 ) and ( AutoEnhance1Slope = 0 ) then
|
|
begin
|
|
// Default values
|
|
AutoEnhance1Slope := 20;
|
|
AutoEnhance1Range := 25;
|
|
end;
|
|
|
|
// IF AutoEnhance3Gamma > 0 then AutoEnhance3 is being used
|
|
if AutoEnhance3Gamma > 0 then
|
|
begin
|
|
cmbAutoEnhance.ItemIndex := 1;
|
|
edtAutoEnhance1Slope.Text := IntToStr( 20 );
|
|
edtAutoEnhance1Range.Text := IntToStr( 25 );
|
|
edtAutoEnhance3Gamma.Text := FloatToStr( AutoEnhance3Gamma );
|
|
edtAutoEnhance3Saturation.Text := IntToStr( AutoEnhance3Saturation);
|
|
end
|
|
else
|
|
begin
|
|
cmbAutoEnhance.ItemIndex := 0;
|
|
edtAutoEnhance1Slope.Text := IntToStr( AutoEnhance1Slope );
|
|
edtAutoEnhance1Range.Text := IntToStr( AutoEnhance1Range );
|
|
edtAutoEnhance3Gamma.Text := FloatToStr( 0.35 );
|
|
edtAutoEnhance3Saturation.Text := IntToStr( 80 );
|
|
end;
|
|
|
|
// Ensure it initializes
|
|
AutoEnhanceControlChange( nil );
|
|
ars[_tabAutoEnhance] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
if AutoEnhance3Gamma > 0 then
|
|
undos[ _tabAutoEnhance ] := IERS_AutoImageEnhance3
|
|
else
|
|
undos[ _tabAutoEnhance ] := IERS_AutoImageEnhance1;
|
|
{$ELSE}
|
|
undos[ _tabAutoEnhance ] := IEMsg( IEMSG_AutoEnhance );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// CROP
|
|
if ( PageControl1.ActivePage = tabCrop ) and not ars[ _tabCrop ] then
|
|
begin
|
|
CropLeft := fIPDialogParams.Crop_Left ;
|
|
CropTop := fIPDialogParams.Crop_Top ;
|
|
CropRight := fIPDialogParams.Crop_Right ;
|
|
CropBottom := fIPDialogParams.Crop_Bottom;
|
|
|
|
edtCropLeft .Text := IntToStr( CropLeft );
|
|
edtCropTop .Text := IntToStr( CropTop );
|
|
edtCropRight .Text := IntToStr( CropRight );
|
|
edtCropBottom.Text := IntToStr( CropBottom );
|
|
pnlCropBackground.Color := fIPDialogParams.BackgroundColor;
|
|
|
|
updCropLeft .Max := ImageEn1.IEBitmap.Width - 1;
|
|
updCropRight .Max := ImageEn1.IEBitmap.Width - 1;
|
|
updCropTop .Max := ImageEn1.IEBitmap.Height - 1;
|
|
updCropBottom .Max := ImageEn1.IEBitmap.Height - 1;
|
|
|
|
ars[ _tabCrop ] := true;
|
|
{$IFDEF IEUseLegacyUndoCaptions}
|
|
undos[ _tabCrop ] := IERS_Crop;
|
|
{$ELSE}
|
|
undos[ _tabCrop ] := IEMsg( IEMSG_Crop );
|
|
{$ENDIF}
|
|
end;
|
|
|
|
//
|
|
fDoChange := true;
|
|
end;
|
|
|
|
|
|
procedure TfPreviews.FormActivate(Sender: TObject);
|
|
|
|
function _HaveMultipleVisibleTabs : Boolean;
|
|
var
|
|
iTabs: Integer;
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
iTabs := 0;
|
|
for I := 0 to PageControl1.PageCount - 1 do
|
|
if PageControl1.Pages[I].TabVisible then
|
|
begin
|
|
inc(iTabs);
|
|
Result := iTabs > 1;
|
|
if Result then
|
|
exit;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
i : integer;
|
|
PageToShow : TTabSheet;
|
|
begin
|
|
// Prevent double calls to FormActivate
|
|
if fHaveActivated then
|
|
exit;
|
|
fHaveActivated := True;
|
|
|
|
fResized := false;
|
|
OpList.Clear;
|
|
fDoProgress := false;
|
|
fDoChange := true;
|
|
ResetParameters(true); // reset all
|
|
if IEGlobalSettings().UseButtonGlyphsInDialogs = False then
|
|
begin
|
|
OkButton.Glyph := nil;
|
|
CancelButton.Glyph := nil;
|
|
end;
|
|
chkLockPreview.checked := DefaultLockPreview;
|
|
PreviewButton.Enabled := not chkLockPreview.checked;
|
|
PreviewButton.Visible := not chkLockPreview.checked;
|
|
ResetButton.Visible := ShowReset;
|
|
HistogramBox1.AttachedImageEnProc := ImageEn2.Proc;
|
|
PageControl1.Visible := false;
|
|
tabContrast.TabVisible := (peAll in pe) or (peContrast in pe);
|
|
tabContrast.tag := _tabContrast;
|
|
tabHSL.TabVisible := (peAll in pe) or (peHSL in pe);
|
|
tabHSL.tag := _tabHSL;
|
|
tabRGB.TabVisible := (peAll in pe) or (peRGB in pe);
|
|
tabRGB.tag := _tabRGB;
|
|
tabFilters.TabVisible := (peAll in pe) or (peUserFilt in pe);
|
|
tabFilters.tag := _tabUserFilter;
|
|
tabHSV.TabVisible := (peAll in pe) or (peHSV in pe);
|
|
tabHSV.tag := _tabHSV;
|
|
tabEqualization.TabVisible := (peAll in pe) or (peEqualize in pe);
|
|
tabEqualization.tag := _tabEqualize;
|
|
tabBumpMap.TabVisible := (peAll in pe) or (peBumpMap in pe);
|
|
tabBumpMap.tag := _tabBumpMap;
|
|
tabLens.TabVisible := (peAll in pe) or (peLens in pe);
|
|
tabLens.tag := _tabLens;
|
|
tabWave.TabVisible := (peAll in pe) or (peWave in pe);
|
|
tabWave.tag := _tabWave;
|
|
tabMorph.TabVisible := (peAll in pe) or (peMorph in pe);
|
|
tabMorph.tag := _tabMorph;
|
|
tabRotate.TabVisible := (peAll in pe) or (peRotate in pe);
|
|
tabRotate.tag := _tabRotate;
|
|
tabFFT.TabVisible := {$ifdef IEINCLUDEFFT} (peAll in pe) or (peFFT in pe); {$ELSE} False; {$ENDIF}
|
|
tabFFT.tag := _tabFFT;
|
|
TabGamma.TabVisible := (peAll in pe) or (peGamma in pe);
|
|
TabGamma.tag := _tabGamma;
|
|
tabSharpen.TabVisible := (peAll in pe) or (peSharpen in pe);
|
|
tabSharpen.tag := _tabSharpen;
|
|
tabResize.TabVisible := (peAll in pe) or (peResize in pe);
|
|
tabResize.tag := _tabResize;
|
|
tabSoftShadow.TabVisible := (peAll in pe) or (peSoftShadow in pe);
|
|
tabSoftShadow.tag := _tabSoftShadow;
|
|
tabAutoEnhance.TabVisible := (peAll in pe) or (peAutoEnhance in pe);
|
|
tabAutoEnhance.tag := _tabAutoEnhance;
|
|
tabCrop.TabVisible := (peAll in pe) or (peCrop in pe);
|
|
tabCrop.tag := _tabCrop;
|
|
|
|
if InitialPage <> nil then
|
|
PageToShow := InitialPage
|
|
else
|
|
PageToShow := PageControl1.FindNextPage(nil, true, true);
|
|
|
|
if ((peAll in pe) = False) and (_HaveMultipleVisibleTabs = False) then
|
|
begin
|
|
// Improve styling for single use dialog
|
|
for I := 0 to PageControl1.PageCount - 1 do
|
|
PageControl1.Pages[I].TabVisible := False;
|
|
PageControl1.Style := tsFlatButtons;
|
|
Caption := PageToShow.Caption;
|
|
end;
|
|
|
|
PageControl1.ActivePage := PageToShow;
|
|
PageControl1.Visible := true;
|
|
|
|
imageen1.SetChessboardStyle(12, bsSolid);
|
|
imageen1.Background := IEGlobalSettings().PreviewImageBackgroundColor;
|
|
imageen1.BackgroundStyle := IEGlobalSettings().PreviewImageBackgroundStyle;
|
|
|
|
imageen2.SetChessboardStyle(12, bsSolid);
|
|
imageen2.Background := IEGlobalSettings().PreviewImageBackgroundColor;
|
|
imageen2.BackgroundStyle := IEGlobalSettings().PreviewImageBackgroundStyle;
|
|
|
|
// fit
|
|
ImageEn1.Fit;
|
|
// load filters
|
|
ListBox1.Items.Clear;
|
|
for i := 0 to IEGetFiltersCount-1 do
|
|
ListBox1.Items.Add( string(IEGetFilterName(i)) );
|
|
|
|
if assigned(application) then
|
|
application.processmessages;
|
|
PageControl1Change(self); // calls CopyOrg
|
|
end;
|
|
|
|
|
|
// applies current effect only
|
|
procedure TfPreviews.ApplyAct(im: TImageEnView; bPreview: Boolean = True);
|
|
var
|
|
gamChannels: TIEChannels;
|
|
v1: TIEProgressEvent;
|
|
v2: TObject;
|
|
xProgress: TProgressRec;
|
|
xLeft, xTop, xWidth, xHeight, x1, x2: integer;
|
|
xz: double;
|
|
{$ifdef IEINCLUDEFFT}
|
|
tmpft: TIEFtImage;
|
|
tempmask: TIEMask;
|
|
{$endif}
|
|
iNewWidth, iNewHeight : Integer;
|
|
iNewWidthPercent, iNewHeightPercent : Integer;
|
|
iOffSetX, iOffSetY : integer;
|
|
iSubsampleSize: Integer;
|
|
iNeighbour: Integer;
|
|
iQuality: Integer;
|
|
WasBackground: TColor;
|
|
begin
|
|
if fDoProgress then
|
|
xProgress := Progress
|
|
else
|
|
fillchar(xProgress, sizeof(xProgress), 0);
|
|
CurrentOp := '';
|
|
v1 := xProgress.fOnProgress;
|
|
v2 := xProgress.Sender;
|
|
|
|
// CONTRAST AND BRIGHTNESS
|
|
if PageControl1.ActivePage = tabContrast then
|
|
begin
|
|
_ContrastRGB(im.IEBitmap, Contrast, fMedR, fMedG, fMedB, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
_IntensityRGBall(im.IEBitmap, Brightness, Brightness, Brightness, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
CurrentOp := 'Contrast '+IntToStr(Contrast)+' Brightness '+IntToStr(Brightness);
|
|
end;
|
|
|
|
// HSL
|
|
if PageControl1.ActivePage = tabHSL then
|
|
begin
|
|
_HSLvar(im.IEBitmap, Hue, Sat, Lum, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
CurrentOp := 'HSL '+IntToStr(Hue)+' '+IntToStr(Sat)+' '+IntToStr(Lum);
|
|
end;
|
|
|
|
// RGB
|
|
if PageControl1.ActivePage = tabRGB then
|
|
begin
|
|
_IntensityRGBall(im.IEBitmap, red, green, blue, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
CurrentOp := 'RGB '+IntToStr(red)+' '+IntToStr(green)+' '+IntToStr(blue);
|
|
end;
|
|
|
|
// FILTERS
|
|
if PageControl1.ActivePage = tabFilters then
|
|
begin
|
|
_ApplyFilter(im.IEBitmap, Filter, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, xProgress);
|
|
CurrentOp := 'Filter '+string(IEGraphFilterToString(Filter));
|
|
end;
|
|
|
|
// HSV
|
|
if PageControl1.ActivePage = tabHSV then
|
|
begin
|
|
_HSVvar(im.IEBitmap, bHue, bSat, bVal, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
CurrentOp := 'HSV '+IntToStr(bHue)+' '+IntToStr(bSat)+' '+IntToStr(bVal);
|
|
end;
|
|
|
|
// EQUALIZATION
|
|
if PageControl1.ActivePage = tabEqualization then
|
|
begin
|
|
IEApplyThreshold(im.IEBitmap, DownLimit, UpLimit, CreateRGB(0, 0, 0), CreateRGB(255, 255, 255), 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
IEHistEqualize(im.IEBitmap, EDownLimit, EUpLimit, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
CurrentOp := string('Threshold '+IERGBToStr(DownLimit)+' '+IERGBToStr(UpLimit)+' HistEqualize '+IERGBToStr(EDownLimit)+' '+IERGBToStr(EUpLimit));
|
|
if AutoEqualize then
|
|
begin
|
|
_HistAutoEqualize(im.IEBitmap, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
CurrentOp := CurrentOp +' (Equalize)';
|
|
end;
|
|
end;
|
|
|
|
// BUMP MAP
|
|
if PageControl1.ActivePage = tabBumpMap then
|
|
begin
|
|
if im <> ImageEn1 then
|
|
begin
|
|
xz := ImageEn1.Zoom / 100;
|
|
xLeft := trunc(BumpLeft * xz - ImageEn1.ViewX);
|
|
xTop := trunc(BumpTop * xz - ImageEn1.ViewY);
|
|
xWidth := trunc(BumpWidth * xz);
|
|
xHeight := trunc(BumpHeight * xz);
|
|
_BumpMapping(im.IEBitmap, xLeft, xTop, xWidth, xHeight, BumpSrc, BumpCol, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, xProgress);
|
|
end
|
|
else
|
|
_BumpMapping(im.IEBitmap, BumpLeft, BumpTop, BumpWidth, BumpHeight, BumpSrc, BumpCol, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, xProgress);
|
|
CurrentOp := string('Bumpmap '+IEIntToStr(BumpLeft)+' '+IEIntToStr(BumpTop)+' '+IEIntToStr(BumpWidth)+' '+IEIntToStr(BumpHeight)+' '+IEIntToStr(BumpSrc)+' '+IERGBToStr(BumpCol));
|
|
end;
|
|
|
|
// LENS
|
|
if PageControl1.ActivePage = tabLens then
|
|
begin
|
|
if im <> ImageEn1 then
|
|
begin
|
|
xz := ImageEn1.Zoom / 100;
|
|
xLeft := trunc(LensLeft * xz - ImageEn1.ViewX);
|
|
xTop := trunc(LensTop * xz - ImageEn1.ViewY);
|
|
xWidth := trunc(LensWidth * xz);
|
|
xHeight := trunc(LensHeight * xz);
|
|
_Lens(im.IEBitmap, xLeft, xTop, xWidth, xHeight, LensRef, xProgress);
|
|
end
|
|
else
|
|
_Lens(im.IEBitmap, LensLeft, LensTop, LensWidth, LensHeight, LensRef, xProgress);
|
|
CurrentOp := 'Lens '+IntToStr(LensLeft)+' '+IntToStr(LensTop)+' '+IntToStr(LensWidth)+' '+IntToStr(LensHeight)+' '+IEFloatToStrS(LensRef);
|
|
end;
|
|
|
|
// WAVE
|
|
if PageControl1.ActivePage = tabWave then
|
|
begin
|
|
if im <> ImageEn1 then
|
|
begin
|
|
xz := ImageEn1.Zoom / 100;
|
|
x1 := trunc(WaveAmplitude * xz);
|
|
x2 := trunc(WaveWaveLength * xz);
|
|
IEWave(im.IEBitmap, x1, x2, WavePhase, WaveReflect, xProgress);
|
|
end
|
|
else
|
|
IEWave(im.IEBitmap, WaveAmplitude, WaveWaveLength, WavePhase, WaveReflect, xProgress);
|
|
CurrentOp := string('Wave '+IEIntToStr(WaveAmplitude)+' '+IEIntToStr(WaveWaveLength)+' '+IEIntToStr(WavePhase)+' '+IEIntToStr(integer(WaveReflect)));
|
|
end;
|
|
|
|
// MORPH
|
|
if PageControl1.ActivePage = tabMorph then
|
|
begin
|
|
IEMorphFilter(im.IEBitmap, MorphWinSize, MorphFilter, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, v1, v2);
|
|
CurrentOp := string('Morph '+IEIntToStr(MorphWinSize)+' '+IEIntToStr(MorphFilter));
|
|
end;
|
|
|
|
// ROTATE
|
|
if PageControl1.ActivePage = tabRotate then
|
|
begin
|
|
CurrentOp := 'Rotate '+FloatToStr(RotationAngle);
|
|
if FlipHorz then
|
|
begin
|
|
im.Proc.Flip(fdHorizontal);
|
|
CurrentOp := CurrentOp+' Flip Horizontal';
|
|
end;
|
|
if FlipVert then
|
|
begin
|
|
im.Proc.Flip(fdVertical);
|
|
CurrentOp := CurrentOp+' Flip Vertical';
|
|
end;
|
|
if (RotationAngle <> 0) then
|
|
begin
|
|
if bPreview then
|
|
im.Proc.Rotate(RotationAngle, ierFast, pnlRotateBackground.Color)
|
|
else
|
|
im.Proc.Rotate(RotationAngle, IEGlobalSettings().DefaultRotateAntiAlias, pnlRotateBackground.Color);
|
|
end;
|
|
end;
|
|
|
|
// FFT
|
|
if PageControl1.ActivePage = tabFFT then
|
|
begin
|
|
{$ifdef IEINCLUDEFFT}
|
|
CurrentOp := 'FFT ';
|
|
if checkbox1.checked then
|
|
CurrentOp := CurrentOp+' GRAYSCALE '
|
|
else
|
|
CurrentOp := CurrentOp+' RGB ';
|
|
with ienFFT.SelectionMask do
|
|
CurrentOp := CurrentOp+string(' ('+IEIntToStr(X1)+','+IEIntToStr(Y1)+','+IEIntToStr(X2)+','+IEIntToStr(Y2)+')');
|
|
if im <> ImageEn2 then
|
|
begin
|
|
// final image (full size)
|
|
FFTProgressPos := 0;
|
|
if checkbox1.Checked then
|
|
FTImage.BuildFT(im.IEBitmap, ieitGRAYSCALE)
|
|
else
|
|
FTImage.BuildFT(im.IEBitmap, ieitRGB);
|
|
tempmask := ienFFT.SelectionMask.CreateResampledMask(FTImage.ComplexWidth, FTImage.ComplexHeight);
|
|
FTImage.ClearZone(tempmask);
|
|
tempmask.free;
|
|
FFTProgressPos := 0;
|
|
im.Proc.FTConvertFrom(FTImage);
|
|
pbrFFT.Position := 0;
|
|
pbrFFT.Visible := False;
|
|
end
|
|
else
|
|
begin
|
|
// preview
|
|
FFTProgressPos := 0;
|
|
tmpft := TIEFtImage.Create;
|
|
tmpft.assign(FTImage);
|
|
ienFFT.SaveSelection; // because the selection was removed by FTDisplayFrom
|
|
FTImage.ClearZone( ienFFT.SelectionMask );
|
|
iepFFT.FTDisplayFrom(FTImage);
|
|
ienFFT.Fit;
|
|
ienFFT.RestoreSelection;
|
|
FFTProgressPos := 0;
|
|
ImageEn2.Proc.FTConvertFrom(FTImage);
|
|
pbrFFT.Position := 0;
|
|
pbrFFT.Visible := False;
|
|
FTImage.assign(tmpft);
|
|
FreeAndNil(tmpft);
|
|
end;
|
|
{$endif}
|
|
end;
|
|
|
|
// GAMMA CORRECTION
|
|
if PageControl1.ActivePage = tabGamma then
|
|
begin
|
|
CurrentOp := 'GammaCorrection '+FloatToStr(trkGamma.position / 10)+' ';
|
|
gamChannels := [];
|
|
if chkGammaRed.checked then
|
|
begin
|
|
gamChannels := gamChannels + [iecRed];
|
|
CurrentOp := CurrentOp+'R';
|
|
end;
|
|
if chkGammaGreen.checked then
|
|
begin
|
|
gamChannels := gamChannels + [iecGreen];
|
|
CurrentOp := CurrentOp+'G';
|
|
end;
|
|
if chkGammaBlue.checked then
|
|
begin
|
|
gamChannels := gamChannels + [iecBlue];
|
|
CurrentOp := CurrentOp+'B';
|
|
end;
|
|
im.Proc.GammaCorrect(trkGamma.position / 10, gamChannels);
|
|
end;
|
|
|
|
// SHARPEN
|
|
if PageControl1.ActivePage = tabSharpen then
|
|
begin
|
|
_Sharpen(im.IEBitmap, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, Sharpen, SharpenSize, v1, v2);
|
|
CurrentOp := string('Sharpen '+IEIntToStr(Sharpen)+' '+IEIntToStr(SharpenSize));
|
|
end;
|
|
|
|
// RESIZE
|
|
if PageControl1.ActivePage = tabResize then
|
|
begin
|
|
iNewWidth := StrToIntDef(edtNewWidth.Text, -1);
|
|
iNewHeight := StrToIntDef(edtNewHeight.Text, -1);
|
|
if bPreview or (iNewWidth <> ImageEn1.IEBitmap.Width) or (iNewHeight <> ImageEn1.IEBitmap.Height) then
|
|
begin
|
|
iNewWidthPercent := StrToIntDef(edtNewWidthPercent.Text, 100);
|
|
iNewHeightPercent := StrToIntDef(edtNewHeightPercent.Text, 100);
|
|
|
|
iNewWidth := StrToIntDef(edtNewWidth.Text, -1);
|
|
if chkMaintainAR.checked then
|
|
begin
|
|
iNewHeight := -1;
|
|
CurrentOp := 'Resize ' + IntToStr(iNewWidthPercent) + '%';
|
|
end
|
|
else
|
|
begin
|
|
CurrentOp := 'Resize ' + IntToStr(iNewWidthPercent) + '% / ' + IntToStr(iNewHeightPercent) + '%';
|
|
end;
|
|
if bPreview then
|
|
im.Proc.Resample(iNewWidth, iNewHeight, IEGlobalSettings().DefaultPreviewsZoomFilter)
|
|
else
|
|
im.Proc.Resample(iNewWidth, iNewHeight, IEGlobalSettings().DefaultResampleFilter);
|
|
end;
|
|
end;
|
|
|
|
// SOFT SHADOW
|
|
if (PageControl1.ActivePage = tabSoftShadow) and im.EnableAlphaChannel then
|
|
begin
|
|
if cmbShadowPosition.ItemIndex = _cmbShadowPosition_All then
|
|
iOffSetX := 0
|
|
else
|
|
if cmbShadowPosition.ItemIndex in [_cmbShadowPosition_TopLeft, _cmbShadowPosition_BottomLeft] then
|
|
iOffSetX := -1 * ShadowOffset
|
|
else
|
|
iOffSetX := ShadowOffset;
|
|
|
|
if cmbShadowPosition.ItemIndex = _cmbShadowPosition_All then
|
|
iOffSetY := 0
|
|
else
|
|
if cmbShadowPosition.ItemIndex in [_cmbShadowPosition_TopLeft, _cmbShadowPosition_TopRight] then
|
|
iOffSetY := -1 * ShadowOffset
|
|
else
|
|
iOffSetY := ShadowOffset;
|
|
im.Proc.AddSoftShadow(ShadowRadius, iOffSetX, iOffSetY, true, pnlShadowColor.Color);
|
|
CurrentOp := string('Add Soft Shadow '+IEIntToStr(ShadowRadius)+' '+IEIntToStr(ShadowOffset));
|
|
end;
|
|
|
|
// AUTO-ENHANCE
|
|
if PageControl1.ActivePage = tabAutoEnhance then
|
|
begin
|
|
// IF AutoEnhance3Gamma > 0 then AutoEnhance3 is being used
|
|
if AutoEnhance3Gamma > 0 then
|
|
begin
|
|
CurrentOp := 'Tone Mapping Enhancement';
|
|
im.Proc.AutoImageEnhance3( AutoEnhance3Gamma, AutoEnhance3Saturation );
|
|
end
|
|
else
|
|
begin
|
|
CurrentOp := 'Auto-Enhancement';
|
|
|
|
// Convert quality to Subsample size and Neighbour values
|
|
iQuality := iMax( 1, StrToIntDef( edtAutoEnhance1Quality.Text, 5)); // Range 1 to 10
|
|
iSubsampleSize := Sqr( iQuality + 3 ); // Range 16 - 169. Average: 64
|
|
iNeighbour := iMax( 1, iQuality div 2 ); // Range 1 - 5. Average: 2
|
|
|
|
if bPreview then
|
|
im.Proc.AutoImageEnhance1( iSubsampleSize div 2, AutoEnhance1Slope, AutoEnhance1Range, iMax( 1, iNeighbour div 2 ))
|
|
else
|
|
im.Proc.AutoImageEnhance1( iSubsampleSize, AutoEnhance1Slope, AutoEnhance1Range, iNeighbour );
|
|
end;
|
|
end;
|
|
|
|
// CROP
|
|
if PageControl1.ActivePage = tabCrop then
|
|
begin
|
|
CurrentOp := Format( 'Crop %d,%d,%d,%d', [ CropLeft, CropTop, CropRight, CropBottom ]);
|
|
WasBackground := im.Proc.Background;
|
|
im.Proc.Background := pnlCropBackground.Color;
|
|
if bPreview then
|
|
ImageEn2.IEBitmap.assign( ImageEn1.IEBitmap );
|
|
|
|
// Cropping
|
|
im.Proc.Crop( iMax( 0, CropLeft ),
|
|
iMax( 0, CropTop ),
|
|
im.IEBitmap.Width - iMax( 0, CropRight ) - 1,
|
|
im.IEBitmap.Height - iMax( 0, CropBottom ) - 1 );
|
|
|
|
// Resize image
|
|
im.Proc.ImageResize( -1 * iMin( 0, CropLeft ),
|
|
-1 * iMin( 0, CropTop ),
|
|
-1 * iMin( 0, CropRight ),
|
|
-1 * iMin( 0, CropBottom ));
|
|
|
|
im.Proc.Background := WasBackground;
|
|
end;
|
|
|
|
if bPreview then
|
|
case PageControl1.ActivePageIndex of
|
|
_tabResize : im.Zoom := 100;
|
|
else im.Fit;
|
|
end;
|
|
|
|
UpdatePreviewZoom;
|
|
end;
|
|
|
|
procedure TfPreviews.AutoEnhanceControlChange(Sender: TObject);
|
|
var
|
|
dGamma: Double;
|
|
iSaturation: Integer;
|
|
iSlope: Integer;
|
|
iRange: Integer;
|
|
bAutoEnhance1: Boolean;
|
|
begin
|
|
bAutoEnhance1 := cmbAutoEnhance.ItemIndex = 0;
|
|
pnlAutoEnhance3.Left := pnlAutoEnhance1.Left;
|
|
pnlAutoEnhance3.Top := pnlAutoEnhance1.Top ;
|
|
pnlAutoEnhance1.Visible := bAutoEnhance1;
|
|
pnlAutoEnhance3.Visible := not bAutoEnhance1;
|
|
|
|
if not fDoChange then
|
|
exit;
|
|
|
|
if bAutoEnhance1 then
|
|
try
|
|
// AutoEnhance1
|
|
iSlope := StrToInt( edtAutoEnhance1Slope.Text );
|
|
iRange := StrToInt( edtAutoEnhance1Range.Text );
|
|
if ( iSlope <> AutoEnhance1Slope ) or ( iRange <> AutoEnhance1Range ) then
|
|
begin
|
|
AutoEnhance1Slope := iSlope;
|
|
AutoEnhance1Range := iRange;
|
|
AutoEnhance3Gamma := 0;
|
|
AutoEnhance3Saturation := 0;
|
|
UpdatePreview;
|
|
end;
|
|
except
|
|
edtAutoEnhance1Slope.Text := IntToStr( 20 );
|
|
edtAutoEnhance1Range.Text := IntToStr( 25 );
|
|
end
|
|
else
|
|
try
|
|
// AutoEnhance3
|
|
dGamma := StrToFloat( edtAutoEnhance3Gamma.Text );
|
|
iSaturation := StrToInt( edtAutoEnhance3Saturation.Text );
|
|
if ( dGamma <> AutoEnhance3Gamma ) or ( iSaturation <> AutoEnhance3Saturation ) then
|
|
begin
|
|
AutoEnhance3Gamma := dGamma;
|
|
AutoEnhance3Saturation := iSaturation;
|
|
AutoEnhance1Slope := 0;
|
|
AutoEnhance1Range := 0;
|
|
UpdatePreview;
|
|
end;
|
|
except
|
|
edtAutoEnhance3Gamma.Text := FloatToStr( 0.35 );
|
|
edtAutoEnhance3Saturation.Text := IntToStr( 80 );
|
|
end;
|
|
end;
|
|
|
|
procedure TfPreviews.UpdatePreviewZoom;
|
|
begin
|
|
// Crop requires selection
|
|
if PageControl1.ActivePage = tabCrop then
|
|
begin
|
|
ImageEn1.MouseInteract := ImageEn1.MouseInteract + [miSelect];
|
|
CropControlChange( nil );
|
|
end
|
|
else
|
|
begin
|
|
ImageEn1.MouseInteract := ImageEn1.MouseInteract - [miZoom, miScroll];
|
|
ImageEn1.Deselect;
|
|
end;
|
|
|
|
// pages that disables the zoom
|
|
case PageControl1.ActivePage.tag of
|
|
_tabBumpMap, _tabLens, _tabWave, _tabRotate, _tabFFT, _tabResize, _tabSoftShadow, _tabCrop :
|
|
begin
|
|
ImageEn1.MouseInteract := ImageEn1.MouseInteract - [miZoom];
|
|
ImageEn1.MouseWheelParams.Action := iemwNone;
|
|
ImageEn1.Fit;
|
|
end;
|
|
else
|
|
begin
|
|
ImageEn1.MouseInteract := ImageEn1.MouseInteract + [miZoom];
|
|
ImageEn1.MouseWheelParams.Action := iemwZoom;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// copies original area to processed and applies current effect
|
|
procedure TfPreviews.CopyOrg;
|
|
var
|
|
{$ifdef IEINCLUDEFFT}
|
|
ie: TImageEnView;
|
|
NewWidth, NewHeight: integer;
|
|
{$endif}
|
|
xDst, yDst, dxDst, dyDst: integer;
|
|
xSrc, ySrc, dxSrc, dySrc: integer;
|
|
begin
|
|
ImageEn2.LockPaint;
|
|
|
|
try
|
|
try
|
|
ImageEn2.IEBitmap.Width := ImageEn1.ExtentX;
|
|
ImageEn2.IEBitmap.Height := ImageEn1.ExtentY;
|
|
ImageEn1.GetRenderRectangles(xDst, yDst, dxDst, dyDst, xSrc, ySrc, dxSrc, dySrc);
|
|
ImageEn1.IEBitmap.StretchRectTo(ImageEn2.IEBitmap, 0, 0, ImageEn2.IEBitmap.Width, ImageEn2.IEBitmap.Height, xSrc, ySrc, dxSrc, dySrc, IEGlobalSettings().DefaultPreviewsZoomFilter, 255); // 4.0.1 changed from rfNone
|
|
ImageEn2.IEBitmap.AlphaChannel.Full := ImageEn1.IEBitmap.AlphaChannel.Full;
|
|
ImageEn2.Update;
|
|
|
|
ImageEn2.Proc.SaveUndo(ieuImage);
|
|
|
|
// FFT
|
|
{$ifdef IEINCLUDEFFT}
|
|
if not assigned(FTImage) then
|
|
begin
|
|
FTImage := TIEFtImage.Create;
|
|
FTImage.OnProgress := iepFFT.OnProgress;
|
|
end;
|
|
TIEFtImage.CalcSuitableSourceSize(ImageEn1.IEBitmap.Width, ImageEn1.IEBitmap.Height, NewWidth, NewHeight);
|
|
|
|
if PageControl1.ActivePage = tabFFT then
|
|
begin
|
|
ie := TImageEnView.Create(nil);
|
|
ie.LegacyBitmap := False;
|
|
ImageEn1.Proc.ResampleTo(ie.IEBitmap, NewWidth, NewHeight, IEGlobalSettings().DefaultResampleFilter);
|
|
FFTProgressPos := 0;
|
|
if CheckBox1.Checked then
|
|
FTImage.BuildFT(ie.IEBitmap, ieitGRAYSCALE)
|
|
else
|
|
FTImage.BuildFT(ie.IEBitmap, ieitRGB);
|
|
pbrFFT.Position := 0;
|
|
pbrFFT.Visible := False;
|
|
ie.Free;
|
|
end;
|
|
{$endif}
|
|
|
|
ApplyAct(ImageEn2);
|
|
|
|
except
|
|
// Cope with Div by Zero due to Excessive zoom
|
|
end;
|
|
finally
|
|
ImageEn2.UnLockPaint;
|
|
end;
|
|
if PageControl1.ActivePage = tabEqualization then
|
|
HistogramBox1.Update;
|
|
end;
|
|
|
|
|
|
|
|
// Copies modified image to original (applies current effect to ImageEn1)
|
|
procedure TfPreviews.CopyModToOrg;
|
|
begin
|
|
ApplyAct(imageen1, False);
|
|
ImageEn1.Update;
|
|
ImageEn1.Paint; // <- needed
|
|
CopyOrg;
|
|
end;
|
|
|
|
|
|
|
|
// changes HSL (trackbars 2/3/5)
|
|
procedure TfPreviews.TrackBar2Change(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
if (Hue <> trackbar2.position) or (Sat <> trackbar3.position) or (Lum <> trackbar5.position) then
|
|
begin
|
|
Hue := trackbar2.position;
|
|
Sat := trackbar3.position;
|
|
Lum := trackbar5.position;
|
|
edit4.text := IntToStr(Hue);
|
|
edit2.text := IntToStr(Sat);
|
|
edit3.text := IntToStr(Lum);
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
|
|
// changes HSL (edits 4/2/3)
|
|
procedure TfPreviews.Edit4Change(Sender: TObject);
|
|
var
|
|
h, s, l: integer;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
h := StrToIntDef(edit4.text, 0);
|
|
s := StrToIntDef(edit2.text, 0);
|
|
l := StrToIntDef(edit3.text, 0);
|
|
if (Hue <> h) or (Sat <> s) or (Lum <> l) then
|
|
begin
|
|
trackbar2.position := h;
|
|
trackbar3.position := s;
|
|
trackbar5.position := l;
|
|
trackbar2change(self);
|
|
end;
|
|
end;
|
|
|
|
|
|
// change effect (pagecontrol1)
|
|
procedure TfPreviews.PageControl1Change(Sender: TObject);
|
|
begin
|
|
ResetParameters(false);
|
|
CopyOrg;
|
|
end;
|
|
|
|
|
|
// Copies modified image to original (applies current effect to ImageEn1)
|
|
procedure TfPreviews.ResultToSourceButtonClick(Sender: TObject);
|
|
begin
|
|
if CurrentOp<>'' then
|
|
OpList.Add( CurrentOp );
|
|
CopyModToOrg;
|
|
ResetParameters(true); // reset all
|
|
CopyOrg;
|
|
if UndoCaption <> '' then
|
|
UndoCaption := UndoCaption + ', ';
|
|
UndoCaption := UndoCaption + undos[ PageControl1.ActivePage.tag ];
|
|
end;
|
|
|
|
|
|
// changes zoom/view of ImageEn1 (original image)
|
|
procedure TfPreviews.ImageEn1ViewChange(Sender: TObject; Change: Integer);
|
|
begin
|
|
CopyOrg;
|
|
end;
|
|
|
|
|
|
// changes RGB (trackbars6/7/8)
|
|
procedure TfPreviews.TrackBar6Change(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
if (red <> trackbar6.position) or (green <> trackbar7.position) or (blue <> trackbar8.position) then
|
|
begin
|
|
red := trackbar6.position;
|
|
green := trackbar7.position;
|
|
blue := trackbar8.position;
|
|
edit7.text := IntToStr(red);
|
|
edit6.text := IntToStr(green);
|
|
edit5.text := IntToStr(blue);
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
|
|
// changes RGB (edit7-6-5)
|
|
procedure TfPreviews.Edit7Change(Sender: TObject);
|
|
var
|
|
rr, gg, bb: integer;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
rr := StrToIntDef(edit7.text, 0);
|
|
gg := StrToIntDef(edit6.text, 0);
|
|
bb := StrToIntDef(edit5.text, 0);
|
|
if (red <> rr) or (green <> gg) or (blue <> bb) then
|
|
begin
|
|
trackbar6.position := rr;
|
|
trackbar7.position := gg;
|
|
trackbar8.position := bb;
|
|
trackbar6change(self);
|
|
end;
|
|
end;
|
|
|
|
|
|
// change filter values (edit8...16)
|
|
procedure TfPreviews.Edit8Change(Sender: TObject);
|
|
begin
|
|
if fDoFilters then
|
|
begin
|
|
filter.Divisor := StrToIntDef(edit20.text, 1);
|
|
with TEdit(sender) do
|
|
filter.Values[(tag div 3), tag - (tag div 3) * 3] := StrToIntDef(text, 0);
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Select value in the list box - preset filter values
|
|
procedure TfPreviews.ListBox1Click(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
filter := IEGetFilter( listbox1.itemindex )^;
|
|
LoadFilt;
|
|
UpdatePreview;
|
|
end;
|
|
|
|
|
|
|
|
procedure TfPreviews.LoadFilt;
|
|
begin
|
|
fDoFilters := false;
|
|
edit8.text := IntToStr(filter.Values[0, 0]);
|
|
edit9.text := IntToStr(filter.Values[1, 0]);
|
|
edit10.text := IntToStr(filter.Values[2, 0]);
|
|
edit11.text := IntToStr(filter.Values[0, 1]);
|
|
edit12.text := IntToStr(filter.Values[1, 1]);
|
|
edit13.text := IntToStr(filter.Values[2, 1]);
|
|
edit14.text := IntToStr(filter.Values[0, 2]);
|
|
edit15.text := IntToStr(filter.Values[1, 2]);
|
|
edit16.text := IntToStr(filter.Values[2, 2]);
|
|
edit20.text := IntToStr(filter.divisor);
|
|
fDoFilters := true;
|
|
end;
|
|
|
|
// applies current effect and close
|
|
procedure TfPreviews.OkButtonClick(Sender: TObject);
|
|
var
|
|
OldCursor: TCursor;
|
|
begin
|
|
OldCursor := Screen.Cursor;
|
|
Screen.Cursor := crHourGlass;
|
|
try
|
|
fDoProgress := true;
|
|
ApplyAct(imageen1, False);
|
|
imageen1.Update;
|
|
if UndoCaption <> '' then
|
|
UndoCaption := UndoCaption + ', ';
|
|
UndoCaption := UndoCaption + undos[ PageControl1.ActivePage.tag ];
|
|
GetIPParams;
|
|
DefaultLockPreview := chkLockPreview.checked;
|
|
if CurrentOp<>'' then
|
|
OpList.Add( CurrentOp );
|
|
finally
|
|
Screen.Cursor := OldCursor;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
// load filter
|
|
procedure TfPreviews.Button4Click(Sender: TObject);
|
|
begin
|
|
if OpenDialog1.execute then
|
|
begin
|
|
filter := LoadFilterFromFile(OpenDialog1.filename);
|
|
LoadFilt;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
|
|
// save filter
|
|
procedure TfPreviews.Button5Click(Sender: TObject);
|
|
begin
|
|
if SaveDialog1.execute then
|
|
SaveFilterToFile(SaveDialog1.filename, Filter);
|
|
end;
|
|
|
|
|
|
// Channels
|
|
procedure TfPreviews.chkEqualClick(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
HistogramBox1.HistogramKind := [];
|
|
if chkEqualRed.Checked then
|
|
HistogramBox1.HistogramKind := HistogramBox1.HistogramKind + [hkRed];
|
|
if chkEqualGreen.Checked then
|
|
HistogramBox1.HistogramKind := HistogramBox1.HistogramKind + [hkGreen];
|
|
if chkEqualBlue.Checked then
|
|
HistogramBox1.HistogramKind := HistogramBox1.HistogramKind + [hkBlue];
|
|
if chkEqualGray.Checked then
|
|
HistogramBox1.HistogramKind := HistogramBox1.HistogramKind + [hkGray];
|
|
RulerBox1.Left := HistogramBox1.Left + HistogramBox1.HistogramAbsXPos;
|
|
RulerBox1.Width := HistogramBox1.Width - RulerBox1.Left;
|
|
end;
|
|
|
|
|
|
// Changes RulerBox1 position
|
|
procedure TfPreviews.RulerBox1RulerPosChange(Sender: TObject; RulerDir: TRulerDir; Grip: integer; NewPos: Double);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
|
|
// Update labels
|
|
if RulerBox1.GripsPos[0] > RulerBox1.GripsPos[1] then
|
|
if Grip = 0 then
|
|
RulerBox1[1] := RulerBox1[0]
|
|
else
|
|
RulerBox1[0] := RulerBox1[1];
|
|
if Grip = 0 then
|
|
Label16.Caption := IntToStr(trunc(RulerBox1.GripsPos[0]))
|
|
else
|
|
if Grip = 1 then
|
|
Label17.Caption := IntToStr(trunc(RulerBox1.GripsPos[1]));
|
|
|
|
if chkEqualRed.Checked or chkEqualGray.Checked then
|
|
begin
|
|
// RED
|
|
DownLimit.r := trunc(RulerBox1.GripsPos[0]);
|
|
UpLimit.r := trunc(RulerBox1.GripsPos[1]);
|
|
end;
|
|
if chkEqualGreen.Checked or chkEqualGray.Checked then
|
|
begin
|
|
// GREEN
|
|
DownLimit.g := trunc(RulerBox1.GripsPos[0]);
|
|
UpLimit.g := trunc(RulerBox1.GripsPos[1]);
|
|
end;
|
|
if chkEqualBlue.Checked or chkEqualGray.Checked then
|
|
begin
|
|
// BLUE
|
|
DownLimit.b := trunc(RulerBox1.GripsPos[0]);
|
|
UpLimit.b := trunc(RulerBox1.GripsPos[1]);
|
|
end;
|
|
UpdatePreview;
|
|
end;
|
|
|
|
|
|
|
|
procedure TfPreviews.RulerBox2RulerPosChange(Sender: TObject; RulerDir: TRulerDir; Grip: integer; NewPos: Double);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
|
|
// Update labels
|
|
if RulerBox2.GripsPos[0] > RulerBox2.GripsPos[1] then
|
|
if Grip = 0 then
|
|
RulerBox2[1] := RulerBox2[0]
|
|
else
|
|
RulerBox2[0] := RulerBox2[1];
|
|
if Grip = 0 then
|
|
Label20.Caption := IntToStr(trunc(RulerBox2.GripsPos[0]))
|
|
else
|
|
if Grip = 1 then
|
|
Label21.Caption := IntToStr(trunc(RulerBox2.GripsPos[1]));
|
|
|
|
if chkEqualRed.Checked or chkEqualGray.Checked then
|
|
begin
|
|
// RED
|
|
EDownLimit.r := trunc(RulerBox2.GripsPos[0]);
|
|
EUpLimit.r := trunc(RulerBox2.GripsPos[1]);
|
|
end;
|
|
if chkEqualGreen.Checked or chkEqualGray.Checked then
|
|
begin
|
|
// GREEN
|
|
EDownLimit.g := trunc(RulerBox2.GripsPos[0]);
|
|
EUpLimit.g := trunc(RulerBox2.GripsPos[1]);
|
|
end;
|
|
if chkEqualBlue.Checked or chkEqualGray.Checked then
|
|
begin
|
|
// BLUE
|
|
EDownLimit.b := trunc(RulerBox2.GripsPos[0]);
|
|
EUpLimit.b := trunc(RulerBox2.GripsPos[1]);
|
|
end;
|
|
UpdatePreview;
|
|
end;
|
|
|
|
|
|
// BUTTON - AUTOEQUALIZE
|
|
procedure TfPreviews.SpeedButton3Click(Sender: TObject);
|
|
begin
|
|
AutoEqualize := SpeedButton3.Down;
|
|
UpdatePreview;
|
|
end;
|
|
|
|
// change contrast (trackbar1) or brightness (trackbar12)
|
|
procedure TfPreviews.TrackBar1Change(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
if (Contrast <> trackbar1.position) or (Brightness <> trackbar12.position) then
|
|
begin
|
|
Contrast := trackbar1.position;
|
|
edit1.text := IntToStr(Contrast);
|
|
Brightness := trackbar12.position;
|
|
edit21.text := IntToStr(Brightness);
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
// change contrast (edit1) or brightness (edit21)
|
|
procedure TfPreviews.Edit1Change(Sender: TObject);
|
|
var
|
|
v, b: integer;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
v := StrToIntDef(edit1.text, 0);
|
|
b := StrToIntDef(edit21.text, 0);
|
|
if (v <> Contrast) or (b <> Brightness) then
|
|
begin
|
|
trackbar1.position := v;
|
|
trackbar12.position := b;
|
|
trackbar1change(self);
|
|
end;
|
|
end;
|
|
|
|
|
|
// Set language
|
|
procedure TfPreviews.UpdateLanguage();
|
|
var
|
|
bEnglish : Boolean;
|
|
begin
|
|
fDoChange := False;
|
|
|
|
bEnglish := (IEGlobalSettings().MsgLanguage = msEnglish) or
|
|
((IEGlobalSettings().MsgLanguage = msSystem) and (syslocale.PriLangID = LANG_ENGLISH));
|
|
Font.Charset := IELANGUAGECHARINFO[IEGlobalSettings().MsgLanguage].CharSet;
|
|
Font.Name := IELANGUAGECHARINFO[IEGlobalSettings().MsgLanguage].FontName;
|
|
Caption := iemsg(IEMSG_PREVIEW);
|
|
Label1.Caption := iemsg(IEMSG_SOURCE) + ':';
|
|
Label2.Caption := iemsg(IEMSG_RESULT) + ':';
|
|
OkButton.Caption := iemsg(IEMSG_OK);
|
|
CancelButton.Caption := iemsg(IEMSG_CANCEL);
|
|
chkLockPreview.Caption := iemsg(IEMSG_LOCKPREVIEW);
|
|
chkLockPreview.Hint := iemsg(IEMSG_LOCKPREVIEWHINT);
|
|
ResultToSourceButton.Hint := iemsg(IEMSG_COPYRESULTTOSOURCE);
|
|
PreviewButton.Caption := iemsg(IEMSG_PREVIEW);
|
|
ResetButton.Caption := iemsg(IEMSG_RESET);
|
|
|
|
// Contrast
|
|
tabContrast.Caption := iemsg(IEMSG_CONTRAST);
|
|
Label3.Caption := iemsg(IEMSG_CONTRAST) + ':';
|
|
Label22.Caption := iemsg(IEMSG_BRIGHTNESS) + ':';
|
|
|
|
// HSV
|
|
tabHSV.Caption := iemsg(IEMSG_HSV);
|
|
if bEnglish then
|
|
begin
|
|
Label10.Caption := iemsg(IEMSG_HUE) + ':';
|
|
Label11.Caption := iemsg(IEMSG_SATURATION) + ':';
|
|
Label12.Caption := iemsg(IEMSG_VALUE) + ':';
|
|
end
|
|
else
|
|
begin
|
|
Label10.Caption := iemsg(IEMSG_HUE) + ' (H):';
|
|
Label11.Caption := iemsg(IEMSG_SATURATION) + ' (S):';
|
|
Label12.Caption := iemsg(IEMSG_VALUE) + ' (V):';
|
|
end;
|
|
Label13.Caption := iemsg(IEMSG_BASECOLOR) + ':';
|
|
Label14.Caption := iemsg(IEMSG_NEWCOLOR) + ':';
|
|
|
|
// HSL
|
|
tabHSL.Caption := iemsg(IEMSG_HSL);
|
|
if bEnglish then
|
|
begin
|
|
Label4.Caption := iemsg(IEMSG_HUE) + ':';
|
|
Label5.Caption := iemsg(IEMSG_SATURATION) + ':';
|
|
Label6.Caption := iemsg(IEMSG_LUMINOSITY) + ':';
|
|
end
|
|
else
|
|
begin
|
|
Label4.Caption := iemsg(IEMSG_HUE) + ' (H):';
|
|
Label5.Caption := iemsg(IEMSG_SATURATION) + ' (S):';
|
|
Label6.Caption := iemsg(IEMSG_LUMINOSITY) + ' (L):';
|
|
end;
|
|
|
|
// RGB
|
|
tabRGB.Caption := iemsg(IEMSG_RGB);
|
|
if bEnglish then
|
|
begin
|
|
Label7.Caption := iemsg(IEMSG_RED) + ':';
|
|
Label8.Caption := iemsg(IEMSG_GREEN) + ':';
|
|
Label9.Caption := iemsg(IEMSG_BLUE) + ':';
|
|
end
|
|
else
|
|
begin
|
|
Label7.Caption := iemsg(IEMSG_RED) + ' (R):';
|
|
Label8.Caption := iemsg(IEMSG_GREEN) + ' (G):';
|
|
Label9.Caption := iemsg(IEMSG_BLUE) + ' (B):';
|
|
end;
|
|
|
|
// Filters
|
|
tabFilters.Caption := iemsg(IEMSG_USERFILTER);
|
|
GroupBox1.Caption := ' ' + iemsg(IEMSG_FILTERVALUES) + ' ';
|
|
GroupBox3.Caption := ' ' + iemsg(IEMSG_PRESETS) + ' ';
|
|
Label15.Caption := iemsg(IEMSG_DIVISOR);
|
|
Button4.Caption := iemsg(IEMSG_LOAD);
|
|
Button5.Caption := iemsg(IEMSG_SAVE);
|
|
SaveDialog1.Title := iemsg(IEMSG_SAVEFILTER);
|
|
OpenDialog1.Title := iemsg(IEMSG_LOADFILTER);
|
|
|
|
// Equalization
|
|
tabEqualization.Caption := iemsg(IEMSG_EQUALIZATION);
|
|
Label19.Caption := iemsg(IEMSG_EQUALIZATION);
|
|
Label18.Caption := iemsg(IEMSG_THRESHOLD);
|
|
SpeedButton3.Caption := iemsg(IEMSG_EQUALIZE);
|
|
GroupBox4.Caption := ' ' + iemsg(IEMSG_HISTOGRAM) + ' ';
|
|
chkEqualRed .Caption := iemsg(IEMSG_RED);
|
|
chkEqualGreen.Caption := iemsg(IEMSG_GREEN);
|
|
chkEqualBlue .Caption := iemsg(IEMSG_BLUE);
|
|
chkEqualGray .Caption := iemsg(IEMSG_GRAY);
|
|
Label39.Caption := iemsg(IEMsg_SCALE);
|
|
ComboBox1.Items[0] := iemsg(IEMsg_Linear);
|
|
ComboBox1.Items[1] := iemsg(IEMsg_LinearClipped);
|
|
ComboBox1.Items[2] := iemsg(IEMsg_Logarithmic);
|
|
|
|
// Bump map
|
|
tabBumpMap.Caption := iemsg(IEMSG_BUMPMAP);
|
|
GroupBox2.Caption := ' ' + iemsg(IEMSG_LIGHT) + ' ';
|
|
label27.Caption := iemsg(IEMSG_LEFT) + ':';
|
|
label28.caption := iemsg(IEMSG_TOP) + ':';
|
|
label23.caption := iemsg(IEMSG_WIDTH) + ':';
|
|
label24.caption := iemsg(IEMSG_HEIGHT) + ':';
|
|
label26.caption := iemsg(IEMSG_COLOR) + ':';
|
|
label25.caption := iemsg(IEMSG_SOURCEIMAGEQUANTITY) + ' (%):';
|
|
|
|
// Lens
|
|
tabLens.Caption := iemsg(IEMSG_LENS);
|
|
GroupBox5.Caption := ' ' + iemsg(IEMSG_LENS) + ' ';
|
|
label32.Caption := iemsg(IEMSG_LEFT) + ':';
|
|
label33.caption := iemsg(IEMSG_TOP) + ':';
|
|
label29.caption := iemsg(IEMSG_WIDTH) + ':';
|
|
label30.caption := iemsg(IEMSG_HEIGHT) + ':';
|
|
label31.caption := iemsg(IEMSG_REFRACTION) + ':';
|
|
|
|
// Wave
|
|
tabWave.Caption := iemsg(IEMSG_WAVE);
|
|
GroupBox6.Caption := ' ' + iemsg(IEMSG_WAVE) + ' ';
|
|
label34.caption := iemsg(IEMSG_AMPLITUDE) + ':';
|
|
label35.caption := iemsg(IEMSG_WAVELENGTH) + ':';
|
|
label36.caption := iemsg(IEMSG_PHASE) + ':';
|
|
checkbox2.Caption := iemsg(IEMSG_REFLECTIVE) + ':';
|
|
|
|
// Morph filter
|
|
tabMorph.Caption := iemsg(IEMSG_MORPHFILTER);
|
|
GroupBox7.Caption := ' ' + iemsg(IEMSG_MORPHFILTER) + ' ';
|
|
Label37.Caption := iemsg(IEMSG_FILTER) + ':';
|
|
Label38.Caption := iemsg(IEMSG_WINDOWSIZE) + ':';
|
|
ListBox2.Clear;
|
|
ListBox2.Items.Add(iemsg(IEMSG_MAXIMUM));
|
|
ListBox2.Items.Add(iemsg(IEMSG_MINIMUM));
|
|
ListBox2.Items.Add(iemsg(IEMSG_OPEN));
|
|
ListBox2.Items.Add(iemsg(IEMSG_CLOSE));
|
|
|
|
// Rotate
|
|
tabRotate.Caption := iemsg(IEMSG_ROTATE);
|
|
lblRotate.Caption := iemsg(IEMSG_ROTATE) + ':';
|
|
lblFlip.Caption := ' ' + iemsg(IEMSG_FLIP) + ':';
|
|
lblRotateBackground.Caption := ' ' + iemsg(IEMSG_BACKGROUND) + ':';
|
|
chkFlipHorz.Caption := iemsg(IEMSG_FLIPHOR);
|
|
chkFlipVert.Caption := iemsg(IEMSG_FLIPVER);
|
|
|
|
// FFT
|
|
tabFFT.Caption := iemsg(IEMSG_FFT);
|
|
GroupBox8.Caption := ' ' + iemsg(IEMSG_SELECTTHEREGIONTOCLEAR) + ' ';
|
|
Clear.Caption := iemsg(IEMSG_CLEAR);
|
|
Button7.Caption := iemsg(IEMSG_RESET);
|
|
CheckBox1.Caption := iemsg(IEMSG_GRAYSCALE);
|
|
|
|
// Gamma
|
|
GroupBox9.Caption := ' '+iemsg(IEMSG_CHANNELS)+' ';
|
|
tabGamma.Caption := iemsg(IEMSG_GAMMA);
|
|
lblGammaHeading.caption := iemsg(IEMSG_GAMMACORRECTION) + ':';
|
|
chkGammaRed .Caption := iemsg(IEMSG_RED);
|
|
chkGammaGreen.Caption := iemsg(IEMSG_GREEN);
|
|
chkGammaBlue .Caption := iemsg(IEMSG_BLUE);
|
|
|
|
// Sharpen
|
|
tabSharpen.Caption := iemsg(IEMSG_SHARPEN);
|
|
Label44.Caption := iemsg(IEMSG_AMPLITUDE) + ':';
|
|
Label45.Caption := iemsg(IEMSG_WINDOWSIZE) + ':';
|
|
|
|
// Resize
|
|
tabResize .Caption := iemsg(IEMSG_RESIZE);
|
|
lblResize .Caption := iemsg(IEMSG_ResizeImage) + ':';
|
|
lblWidth .Caption := format('%s (%s):', [iemsg(IEMSG_WIDTH), iemsg(IEMSG_PIXELS)]);
|
|
lblHeight .Caption := format('%s (%s):', [iemsg(IEMSG_HEIGHT), iemsg(IEMSG_PIXELS)]);
|
|
lblCurrentSize .Caption := iemsg(IEMSG_CURRENT);
|
|
lblNewSize .Caption := iemsg(IEMSG_NEW);
|
|
lblNewScale .Caption := iemsg(IEMSG_SCALE);
|
|
chkMaintainAR .Caption := iemsg(IEMSG_MAINTAINASPECTRATIO);
|
|
|
|
// Soft Shadow
|
|
tabSoftShadow .Caption := iemsg(IEMSG_SOFTSHADOW);
|
|
lblAddSoftShadow .Caption := iemsg(IEMSG_ADDSOFTSHADOW) + ':';
|
|
lblShadowRadius .Caption := iemsg(IEMSG_RADIUS) + ':';
|
|
lblShadowOffset .Caption := iemsg(IEMSG_OFFSET) + ':';
|
|
lblShadowColor .Caption := iemsg(IEMSG_COLOR) + ':';
|
|
lblShadowPosition .Caption := iemsg(IEMSG_POSITION) + ':';
|
|
cmbShadowPosition.Items[_cmbShadowPosition_TopLeft ] := iemsg(IEMSG_TOPLEFT);
|
|
cmbShadowPosition.Items[_cmbShadowPosition_TopRight ] := iemsg(IEMSG_TOPRIGHT);
|
|
cmbShadowPosition.Items[_cmbShadowPosition_BottomLeft ] := iemsg(IEMSG_BOTTOMLEFT);
|
|
cmbShadowPosition.Items[_cmbShadowPosition_BottomRight] := iemsg(IEMSG_BOTTOMRIGHT);
|
|
cmbShadowPosition.Items[_cmbShadowPosition_All ] := iemsg(IEMSG_ALL_GLOW);
|
|
|
|
// Auto-Enhance
|
|
tabAutoEnhance .Caption := iemsg( IEMSG_AutoEnhance );
|
|
lblAutoEnhance .Caption := iemsg( IEMsg_AutoEnhanceMethod ) + ':';
|
|
cmbAutoEnhance .Items[ 0 ] := iemsg( IEMsg_General );
|
|
cmbAutoEnhance .Items[ 1 ] := iemsg( IEMsg_ToneMapping );
|
|
lblAutoEnhance1Slope.Caption := iemsg( IEMsg_Slope ) + ':';
|
|
lblAutoEnhance1Range.Caption := iemsg( IEMsg_Range ) + ':';
|
|
lblAutoEnhance1Quality.Caption := iemsg( IEMSG_Quality ) + ':';
|
|
lblAutoEnhance3Gamma.Caption := iemsg( IEMsg_Gamma ) + ':';
|
|
lblAutoEnhance3Saturation.Caption := iemsg( IEMsg_Saturation ) + ':';
|
|
|
|
// Crop
|
|
tabCrop .Caption := iemsg(IEMSG_Crop);
|
|
lblCropImage .Caption := iemsg(IEMSG_CropImage) + ':';
|
|
lblCropLeft .Caption := iemsg(IEMSG_Left) + ':';
|
|
lblCropTop .Caption := iemsg(IEMSG_Top) + ':';
|
|
lblCropRight .Caption := iemsg(IEMSG_Right) + ':';
|
|
lblCropBottom .Caption := iemsg(IEMSG_Bottom) + ':';
|
|
lblCropBackground .Caption := ' ' + iemsg(IEMSG_BACKGROUND) + ':';
|
|
|
|
fDoChange := True;
|
|
end;
|
|
|
|
// preview
|
|
procedure TfPreviews.PreviewButtonClick(Sender: TObject);
|
|
begin
|
|
UpdatePreview(True);
|
|
end;
|
|
|
|
// preview-lock
|
|
procedure TfPreviews.chkLockPreviewClick(Sender: TObject);
|
|
begin
|
|
UpdatePreview(True);
|
|
PreviewButton.Enabled := not chkLockPreview.checked; // enable/disable preview button
|
|
PreviewButton.Visible := not chkLockPreview.checked; // enable/disable preview button
|
|
end;
|
|
|
|
// changes HSV (trackbar9-10-11)
|
|
procedure TfPreviews.TrackBar9Change(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
if (bHue <> trackbar9.position) or (bSat <> trackbar10.position) or (bVal <> trackbar11.position) then
|
|
begin
|
|
bHue := trackbar9.position;
|
|
bSat := trackbar10.position;
|
|
bVal := trackbar11.position;
|
|
edit19.text := IntToStr(bHue);
|
|
edit18.text := IntToStr(bSat);
|
|
edit17.text := IntToStr(bVal);
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
// changes HSV (edit19-18-17)
|
|
procedure TfPreviews.Edit19Change(Sender: TObject);
|
|
var
|
|
h, s, v: integer;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
h := StrToIntDef(edit19.text, 0);
|
|
s := StrToIntDef(edit18.text, 0);
|
|
v := StrToIntDef(edit17.text, 0);
|
|
if (bHue <> h) or (bSat <> s) or (bVal <> v) then
|
|
begin
|
|
trackbar9.position := h;
|
|
trackbar10.position := s;
|
|
trackbar11.position := v;
|
|
trackbar2change(self);
|
|
end;
|
|
end;
|
|
|
|
// changes HSVBox
|
|
// 3=org 1=dest
|
|
procedure TfPreviews.HSVBox3Change(Sender: TObject);
|
|
begin
|
|
trackbar9.Position := HSVBox1.Hue - HSVBox3.Hue;
|
|
trackbar10.Position := HSVBox1.Sat - HSVBox3.Sat;
|
|
trackbar11.Position := HSVBox1.Val - HSVBox3.Val;
|
|
TrackBar9Change(Self);
|
|
end;
|
|
|
|
// changes BumpLeft, BumpTop, BumpWidth, BumpHeight (edit22-25)
|
|
procedure TfPreviews.Edit22Change(Sender: TObject);
|
|
var
|
|
bleft, btop, bwidth, bheight: integer;
|
|
bsrc: integer;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
bleft := StrToIntDef(edit22.text, 0);
|
|
btop := StrToIntDef(edit23.text, 0);
|
|
bwidth := StrToIntDef(edit24.text, 0);
|
|
bheight := StrToIntDef(edit25.text, 0);
|
|
bsrc := StrToIntDef(edit26.text, 0);
|
|
if (bleft <> BumpLeft) or (btop <> BumpTop) or (bwidth <> BumpWidth) or (bheight <> BumpHeight) or
|
|
(bsrc <> BumpSrc) then
|
|
begin
|
|
BumpLeft := bleft;
|
|
BumpTop := btop;
|
|
BumpWidth := bwidth;
|
|
BumpHeight := bheight;
|
|
BumpSrc := bsrc;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Changes BumpCol (HSVBox2)
|
|
procedure TfPreviews.HSVBox2Change(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
BumpCol := CreateRGB(HSVBox2.Red, HSVBox2.Green, HSVBox2.Blue);
|
|
UpdatePreview;
|
|
end;
|
|
|
|
|
|
// click on the image, read color if we are on HSV changing
|
|
// Moves light if we are in BumpMap
|
|
// Moves Lens if we are in Lens
|
|
procedure TfPreviews.ImageEn2MouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
h, s, v: integer;
|
|
c: TColor;
|
|
rgb: TRGB;
|
|
begin
|
|
if (PageControl1.ActivePage = tabHSV) and (Button = mbLeft) then
|
|
begin
|
|
// HSV
|
|
c := imageen2.GetCanvas.pixels[x, y];
|
|
rgb := TColor2TRGB(c);
|
|
RGB2HSV(rgb, h, s, v);
|
|
HSVBox3.Hue := h;
|
|
HSVBox3.Sat := s;
|
|
HSVBox3.Val := v;
|
|
end;
|
|
|
|
if PageControl1.ActivePage = tabBumpMap then
|
|
begin
|
|
// Bump map
|
|
BumpLeft := trunc((X - ImageEn1.OffSetX) * (100 / ImageEn1.Zoom)) + ImageEn1.ViewX;
|
|
BumpTop := trunc((Y - ImageEn1.OffSetY) * (100 / ImageEn1.zoom)) + ImageEn1.ViewY;
|
|
fDoChange := false;
|
|
edit22.text := IntToStr(BumpLeft);
|
|
edit23.text := IntToStr(BumpTop);
|
|
fDoChange := true;
|
|
UpdatePreview;
|
|
end;
|
|
|
|
if PageControl1.ActivePage = tabLens then
|
|
begin
|
|
// Lens
|
|
LensLeft := trunc((X - ImageEn1.OffSetX) * (100 / ImageEn1.Zoom)) + ImageEn1.ViewX;
|
|
LensTop := trunc((Y - ImageEn1.OffSetY) * (100 / ImageEn1.zoom)) + ImageEn1.ViewY;
|
|
fDoChange := false;
|
|
edit27.text := IntToStr(LensLeft);
|
|
edit28.text := IntToStr(LensTop);
|
|
fDoChange := true;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Changes Lens controls
|
|
procedure TfPreviews.Edit27Change(Sender: TObject);
|
|
var
|
|
lleft, ltop, lwidth, lheight: integer;
|
|
lref: double;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
lleft := StrToIntDef(edit27.text, 0);
|
|
ltop := StrToIntDef(edit28.text, 0);
|
|
lwidth := StrToIntDef(edit29.text, 0);
|
|
lheight := StrToIntDef(edit30.text, 0);
|
|
lref := StrToIntDef(edit31.text, 0) / 10 + 1;
|
|
if (lleft <> LensLeft) or (ltop <> LensTop) or (lwidth <> LensWidth) or (lheight <> LensHeight) or
|
|
(lref <> LensRef) then
|
|
begin
|
|
LensLeft := lleft;
|
|
LensTop := ltop;
|
|
LensWidth := lwidth;
|
|
LensHeight := lheight;
|
|
LensRef := lref;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Changes Wave controls
|
|
procedure TfPreviews.Edit32Change(Sender: TObject);
|
|
var
|
|
lWaveAmplitude: integer;
|
|
lWaveWaveLength: integer;
|
|
lWavePhase: integer;
|
|
lWaveReflect: boolean;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
lWaveAmplitude := StrToIntDef(edit32.text, 0);
|
|
lWaveWaveLength := StrToIntDef(edit33.text, 0);
|
|
lWavePhase := StrToIntDef(edit34.text, 0);
|
|
lWaveReflect := checkbox2.checked;
|
|
if (lWaveAmplitude <> WaveAmplitude) or (lWaveWaveLength <> WaveWaveLength) or
|
|
(lWavePhase <> WavePhase) or (lWaveReflect <> WaveReflect) then
|
|
begin
|
|
WaveAmplitude := lWaveAmplitude;
|
|
WaveWaveLength := lWaveWaveLength;
|
|
WavePhase := lWavePhase;
|
|
WaveReflect := lWaveReflect;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
// changing controls for Morph filter
|
|
procedure TfPreviews.Edit35Change(Sender: TObject);
|
|
var
|
|
lMorphFilter: integer;
|
|
lMorphWinSize: integer;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
lMorphFilter := ListBox2.ItemIndex;
|
|
lMorphWinSize := StrToIntDef(edit35.text, 1);
|
|
if (lMorphFilter <> MorphFilter) or (lMorphWinSize <> MorphWinSize) then
|
|
begin
|
|
MorphFilter := lMorphFilter;
|
|
MorphWinSize := lMorphWinSize;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
// change rotate track bar
|
|
procedure TfPreviews.TrackBarRotateChange(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
if (TrackBarRotate.Position / 100) <> RotationAngle then
|
|
begin
|
|
RotationAngle := Round(TrackBarRotate.Position / 100);
|
|
edtRotate.Text := FloatToStr(RotationAngle);
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
// change rotate edit
|
|
procedure TfPreviews.edtRotateChange(Sender: TObject);
|
|
var
|
|
r: double;
|
|
bIrregularRotate: Boolean;
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
r := IEStrToFloatDefS(edtRotate.text, 0);
|
|
if (r <> RotationAngle) then
|
|
begin
|
|
trackbarRotate.position := trunc(r * 100);
|
|
trackbarRotateChange(self);
|
|
end;
|
|
|
|
if (ImageEn1.EnableAlphaChannel and ImageEn1.IEBitmap.HasAlphaChannel) = False then
|
|
begin
|
|
bIrregularRotate := round(r) mod 90 <> 0;
|
|
pnlRotateBackground.Visible := bIrregularRotate;
|
|
lblRotateBackground.Visible := bIrregularRotate;
|
|
end;
|
|
end;
|
|
|
|
// flip hor/ver
|
|
procedure TfPreviews.chkFlipHorzClick(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
|
|
if (chkFlipHorz.checked <> FlipHorz) or
|
|
(chkFlipVert.checked <> FlipVert) then
|
|
begin
|
|
FlipHorz := chkFlipHorz.checked;
|
|
FlipVert := chkFlipVert.checked;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
// Clear button (FFT)
|
|
procedure TfPreviews.ClearClick(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
UpdatePreview(True);
|
|
end;
|
|
|
|
// Reset (FFT)
|
|
procedure TfPreviews.Button7Click(Sender: TObject);
|
|
begin
|
|
ienFFT.DeSelect;
|
|
CopyOrg;
|
|
end;
|
|
|
|
// FFT progress
|
|
procedure TfPreviews.iepFFTProgress(Sender: TObject; per: Integer);
|
|
begin
|
|
{$ifdef IEINCLUDEFFT}
|
|
pbrFFT.Position := FFTProgressPos + per;
|
|
pbrFFT.Visible := True;
|
|
{$endif}
|
|
end;
|
|
|
|
// FFT gray scale
|
|
procedure TfPreviews.CheckBox1Click(Sender: TObject);
|
|
begin
|
|
CopyOrg;
|
|
end;
|
|
|
|
procedure TfPreviews.UpdatePreview(bForce : Boolean = False);
|
|
begin
|
|
tmrUpdatePreview.Enabled := False;
|
|
|
|
if (bForce = False) and chkLockPreview.checked then
|
|
begin
|
|
// Delay the update
|
|
tmrUpdatePreview.Enabled := True;
|
|
end
|
|
else
|
|
if bForce or chkLockPreview.checked then
|
|
begin
|
|
// Update it now
|
|
imageen2.Proc.undo;
|
|
ApplyAct(imageen2);
|
|
imageen2.paint;
|
|
end;
|
|
end;
|
|
|
|
// Gamma Change Start
|
|
procedure TfPreviews.trkGammaChange(Sender: TObject);
|
|
begin
|
|
edtGamma.Text := FloatToStr(trkGamma.position / 10);
|
|
DrawGammaGraph(trkGamma.position / 10);
|
|
UpdatePreview;
|
|
end;
|
|
|
|
procedure TfPreviews.chkGammaClick(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
DrawGammaGraph(trkGamma.position / 10);
|
|
UpdatePreview;
|
|
end;
|
|
|
|
procedure TfPreviews.CropControlChange(Sender: TObject);
|
|
var
|
|
iLeft : Integer;
|
|
iTop : Integer;
|
|
iRight : Integer;
|
|
iBottom : Integer;
|
|
bAddBorder: Boolean;
|
|
begin
|
|
if PageControl1.ActivePage = tabCrop then
|
|
try
|
|
iLeft := StrToInt( edtCropLeft .Text );
|
|
iTop := StrToInt( edtCropTop .Text );
|
|
iRight := StrToInt( edtCropRight .Text );
|
|
iBottom := StrToInt( edtCropBottom.Text );
|
|
|
|
bAddBorder := ( iLeft < 0 ) or ( iTop < 0 ) or ( iRight < 0 ) or ( iBottom < 0 );
|
|
pnlCropBackground.Visible := bAddBorder;
|
|
lblCropBackground.Visible := bAddBorder;
|
|
|
|
if Sender <> ImageEn1 then // i.e. was called by onSelectionChnange
|
|
if fDoChange or ( Sender = nil ) then
|
|
begin
|
|
fDoSelecting := True;
|
|
ImageEn1.SelectionBase := iesbBitmap;
|
|
ImageEn1.Select( iLeft, iTop, ImageEn1.IEBitmap.Width - iRight - 1, ImageEn1.IEBitmap.Height - iBottom - 1 );
|
|
fDoSelecting := False;
|
|
end;
|
|
|
|
if fDoChange then
|
|
if ( iLeft <> CropLeft ) or ( iTop <> CropTop ) or
|
|
( iRight <> CropRight ) or ( iBottom <> CropBottom ) then
|
|
begin
|
|
CropLeft := iLeft;
|
|
CropTop := iTop;
|
|
CropRight := iRight;
|
|
CropBottom := iBottom;
|
|
UpdatePreview();
|
|
end;
|
|
|
|
except
|
|
edtCropLeft .Text := '0';
|
|
edtCropTop .Text := '0';
|
|
edtCropRight .Text := '0';
|
|
edtCropBottom.Text := '0';
|
|
end;
|
|
end;
|
|
|
|
procedure TfPreviews.DrawGammaGraph(g: double);
|
|
var
|
|
c, y, x, ww, hh: integer;
|
|
iec: TIECanvas;
|
|
poly: array [0..255] of TPoint;
|
|
begin
|
|
ww := ImageEnView2.Width;
|
|
hh := ImageEnView2.Height;
|
|
ImageEnView2.IEBitmap.Width := ww;
|
|
ImageEnView2.IEBitmap.Height := hh;
|
|
ImageEnView2.IEBitmap.Fill($00D0D0D0);
|
|
iec := TIECanvas.Create(ImageEnView2.IEBitmap.Canvas, true, true);
|
|
iec.Pen.Color := clBlack;
|
|
iec.Pen.Style := psSolid;
|
|
iec.Pen.width := 1;
|
|
for c := 0 to 255 do
|
|
begin
|
|
y := ilimit(trunc((255 - blimit(Round(Power(c / 255, 1 / g) * 255))) / 255 * hh), 0, hh - 1);
|
|
x := ilimit(trunc(c / 255 * ww), 0, ww - 1);
|
|
poly[c] := Point(x, y);
|
|
end;
|
|
iec.Polyline(poly);
|
|
iec.Free;
|
|
ImageEnView2.Update;
|
|
end;
|
|
|
|
// Sharpen Amplitude or Sharpen window size
|
|
procedure TfPreviews.TrackBar4Change(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
if (Sharpen <> trackbar4.position) or (SharpenSize <> StrToIntDef(Edit37.Text, 2)) then
|
|
begin
|
|
Sharpen := trackbar4.position;
|
|
edit36.text := IntToStr(Sharpen);
|
|
SharpenSize := StrToIntDef(Edit37.Text, 2);
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
procedure TfPreviews.Edit36Change(Sender: TObject);
|
|
begin
|
|
if not fDoChange then
|
|
exit;
|
|
if Sharpen <> StrToIntDef(Edit36.Text, 1) then
|
|
begin
|
|
trackbar4.position := StrToIntDef(Edit36.Text, 1);
|
|
trackbar4change(self);
|
|
end;
|
|
end;
|
|
|
|
procedure TfPreviews.GetIPParams;
|
|
begin
|
|
// contrast and brightness
|
|
if ars[_tabContrast] then
|
|
begin
|
|
fIPDialogParams.CONTRAST_Contrast := Contrast;
|
|
fIPDialogParams.CONTRAST_Brightness := Brightness;
|
|
end;
|
|
|
|
// HSL
|
|
if ars[_tabHSL] then
|
|
begin
|
|
fIPDialogParams.HSL_H := Hue;
|
|
fIPDialogParams.HSL_S := Sat;
|
|
fIPDialogParams.HSL_L := Lum;
|
|
end;
|
|
|
|
// rgb
|
|
if ars[_tabRGB] then
|
|
begin
|
|
fIPDialogParams.RGB_R := red;
|
|
fIPDialogParams.RGB_G := green;
|
|
fIPDialogParams.RGB_B := blue;
|
|
end;
|
|
|
|
// user filter
|
|
if ars[_tabUserFilter] then
|
|
begin
|
|
fIPDialogParams.USERFILTER_Values := Filter;
|
|
end;
|
|
|
|
// HSV
|
|
if ars[_tabHSV] then
|
|
begin
|
|
fIPDialogParams.HSV_H := bHue;
|
|
fIPDialogParams.HSV_S := bSat;
|
|
fIPDialogParams.HSV_V := bVal;
|
|
end;
|
|
|
|
// threshold (histogram)
|
|
if ars[_tabEqualize] then
|
|
begin
|
|
fIPDialogParams.EQUALIZATION_ThresholdDown := DownLimit;
|
|
fIPDialogParams.EQUALIZATION_ThresholdUp := UpLimit;
|
|
fIPDialogParams.EQUALIZATION_EqDown := EDownLimit;
|
|
fIPDialogParams.EQUALIZATION_EqUp := EUpLimit;
|
|
fIPDialogParams.EQUALIZATION_EqualizeButton := AutoEqualize;
|
|
end;
|
|
|
|
// bump map
|
|
if ars[_tabBumpMap] then
|
|
begin
|
|
fIPDialogParams.BUMPMAP_Left := BumpLeft;
|
|
fIPDialogParams.BUMPMAP_Top := BumpTop;
|
|
fIPDialogParams.BUMPMAP_Width := BumpWidth;
|
|
fIPDialogParams.BUMPMAP_Height := BumpHeight;
|
|
fIPDialogParams.BUMPMAP_Col := BumpCol;
|
|
fIPDialogParams.BUMPMAP_Src := BumpSrc;
|
|
end;
|
|
|
|
// Lens
|
|
if ars[_tabLens] then
|
|
begin
|
|
fIPDialogParams.LENS_Left := LensLeft;
|
|
fIPDialogParams.LENS_Top := LensTop;
|
|
fIPDialogParams.LENS_Width := LensWidth;
|
|
fIPDialogParams.LENS_Height := LensHeight;
|
|
fIPDialogParams.LENS_Ref := LensRef;
|
|
end;
|
|
|
|
// Wave
|
|
if ars[_tabWave] then
|
|
begin
|
|
fIPDialogParams.WAVE_Amplitude := WaveAmplitude;
|
|
fIPDialogParams.WAVE_WaveLength := WaveWaveLength;
|
|
fIPDialogParams.WAVE_Phase := WavePhase;
|
|
fIPDialogParams.WAVE_Reflect := WaveReflect;
|
|
end;
|
|
|
|
// Morph filters
|
|
if ars[_tabMorph] then
|
|
begin
|
|
fIPDialogParams.MORPH_Filter := MorphFilter;
|
|
fIPDialogParams.MORPH_WinSize := MorphWinSize;
|
|
end;
|
|
|
|
// Rotate
|
|
if ars[_tabRotate] then
|
|
begin
|
|
fIPDialogParams.ROTATE_Angle := RotationAngle;
|
|
fIPDialogParams.FLIP_Horz := FlipHorz;
|
|
fIPDialogParams.FLIP_Vert := FlipVert;
|
|
fIPDialogParams.BackgroundColor := pnlRotateBackground.Color;
|
|
end;
|
|
|
|
// FFT
|
|
if ars[_tabFFT] then
|
|
begin
|
|
fIPDialogParams.FFT_Selection.Clear;
|
|
if ienFFT.Selected then
|
|
begin
|
|
fIPDialogParams.FFT_Left := ienFFT.SelX1;
|
|
fIPDialogParams.FFT_Top := ienFFT.SelY1;
|
|
fIPDialogParams.FFT_Right := ienFFT.SelX2;
|
|
fIPDialogParams.FFT_Bottom := ienFFT.SelY2;
|
|
ienFFT.SaveSelectionToStream( fIPDialogParams.FFT_Selection );
|
|
ienFFT.Deselect;
|
|
end
|
|
else
|
|
begin
|
|
fIPDialogParams.FFT_Left := -1;
|
|
fIPDialogParams.FFT_Top := -1;
|
|
fIPDialogParams.FFT_Right := -1;
|
|
fIPDialogParams.FFT_Bottom := -1;
|
|
end;
|
|
fIPDialogParams.FFT_GrayScale := CheckBox1.Checked;
|
|
end;
|
|
|
|
// Gamma Correction
|
|
if ars[_tabGamma] then
|
|
begin
|
|
fIPDialogParams.GAMMACORRECTION_Value := trkGamma.Position/10;
|
|
end;
|
|
|
|
// Sharpen
|
|
if ars[_tabSharpen] then
|
|
begin
|
|
fIPDialogParams.SHARPEN_Sharpen := Sharpen;
|
|
fIPDialogParams.SHARPEN_Size := SharpenSize;
|
|
end;
|
|
|
|
// Rotate
|
|
if ars[_tabResize] then
|
|
begin
|
|
fIPDialogParams.Resize_Percent := ResizePercent;
|
|
end;
|
|
|
|
// Auto-Enhance
|
|
if ars[_tabAutoEnhance] then
|
|
begin
|
|
fIPDialogParams.AutoEnhance1_Slope := AutoEnhance1Slope;
|
|
fIPDialogParams.AutoEnhance1_Range := AutoEnhance1Range;
|
|
fIPDialogParams.AutoEnhance3_Gamma := AutoEnhance3Gamma;
|
|
fIPDialogParams.AutoEnhance3_Saturation := AutoEnhance3Saturation;
|
|
end;
|
|
|
|
// Crop
|
|
if ars[_tabCrop] then
|
|
begin
|
|
fIPDialogParams.Crop_Left := CropLeft;
|
|
fIPDialogParams.Crop_Top := CropTop;
|
|
fIPDialogParams.Crop_Right := CropRight;
|
|
fIPDialogParams.Crop_Bottom := CropBottom;
|
|
fIPDialogParams.BackgroundColor := pnlCropBackground.Color;
|
|
end;
|
|
|
|
end;
|
|
|
|
// Resize preview form
|
|
procedure TfPreviews.FormResize(Sender: TObject);
|
|
const
|
|
IE_Base_Width = 200;
|
|
IE_Base_Height = 150;
|
|
IE2_Base_Left = 244;
|
|
RBtn_Base_Left = 218;
|
|
RBtn_Base_Top = 84;
|
|
PageC_Top_Spacing = 10;
|
|
PageC_Bottom_Spacing = 7;
|
|
LockChk_Bottom_Offset = 11;
|
|
Btn_Right_Offset = 12;
|
|
var
|
|
ow, oh : integer;
|
|
z : double;
|
|
begin
|
|
fResized := true;
|
|
z := PixelsPerInch / 96;
|
|
|
|
Constraints.MinWidth := trunc( Min_Preview_Dialog_Width * z );
|
|
Constraints.MinHeight := trunc( Min_Preview_Dialog_Height * z );
|
|
|
|
ow := trunc((ClientWidth {+ 8} - Default_Preview_Dialog_ClientWidth * z) / 2);
|
|
oh := trunc(ClientHeight {+ 34} - Default_Preview_Dialog_ClientHeight * z);
|
|
ImageEn1.Width := trunc( IE_Base_Width * z + ow );
|
|
ImageEn1.Height := trunc( IE_Base_Height * z + oh );
|
|
ImageEn2.Left := trunc( IE2_Base_Left * z + ow);
|
|
ImageEn2.Width := ImageEn1.Width;
|
|
ImageEn2.height := ImageEn1.Height;
|
|
|
|
ResetButton.Top := ImageEn2.Top + ImageEn2.Height - ResetButton.Height;
|
|
PreviewButton.Top := ResetButton.Top - PreviewButton.Height - trunc(6 * z);
|
|
|
|
if not IEIsLeftMouseButtonPressed then
|
|
ImageEn1.Fit;
|
|
ResultToSourceButton.Left := trunc(RBtn_Base_Left * z + ow);
|
|
ResultToSourceButton.Top := trunc( RBtn_Base_Top * z + oh div 2 );
|
|
Label2.left := trunc( IE2_Base_Left * z + ow );
|
|
chkLockPreview.Top := ClientHeight - chkLockPreview.Height - trunc( LockChk_Bottom_Offset * z );
|
|
PageControl1.Top := trunc( ImageEn1.Top + ImageEn1.Height + PageC_Top_Spacing * z );
|
|
PageControl1.Left := ImageEn1.Left;
|
|
PageControl1.Width := trunc(ClientWidth - PageControl1.Left - Btn_Right_Offset * z );
|
|
PageControl1.Height := trunc(chkLockPreview.Top - PageC_Bottom_Spacing * z - PageControl1.Top);
|
|
OkButton.Left := ClientWidth-OkButton.Width-trunc( Btn_Right_Offset * z );
|
|
CancelButton.Left := OkButton.Left;
|
|
PreviewButton.Left := OkButton.Left;
|
|
ResetButton.Left := OkButton.Left;
|
|
|
|
case IEGlobalSettings().DialogBackgroundStyle of
|
|
iedbPaper:
|
|
begin
|
|
IECreateOSXBackgroundPaper( Image1.Picture.Bitmap, Image1.Width, Image1.Height );
|
|
Image1.Update;
|
|
end;
|
|
iedbMetal:
|
|
begin
|
|
IECreateOSXBackgroundMetal(Image1.Picture.Bitmap, Image1.Width, Image1.Height);
|
|
Image1.Update;
|
|
chkLockPreview.Invalidate;
|
|
end;
|
|
iedbCustom:
|
|
begin
|
|
Image1.Picture.Bitmap.Width := Image1.Width;
|
|
Image1.Picture.Bitmap.Height := Image1.Height;
|
|
TileBitmapOntoCanvas( Image1.Picture.Bitmap.Canvas, Image1.Width, Image1.Height, IEGlobalSettings().DialogBackgroundImage );
|
|
Image1.Update;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// Reset button
|
|
procedure TfPreviews.ResetButtonClick(Sender: TObject);
|
|
begin
|
|
if HardReset then
|
|
fIPDialogParams.SetDefaultParams;
|
|
if not ResetAllTabs then
|
|
ars[PageControl1.ActivePage.Tag] := false;
|
|
ResetParameters(ResetAllTabs);
|
|
UpdatePreview(True);
|
|
end;
|
|
|
|
procedure TfPreviews.edtNewHeightChange(Sender: TObject);
|
|
var
|
|
dResizePercent : double;
|
|
begin
|
|
if fUpdatingSize then
|
|
exit;
|
|
fUpdatingSize := true;
|
|
dResizePercent := 100;
|
|
try
|
|
try
|
|
dResizePercent := StrToInt(edtNewHeight.Text) / ImageEn1.IEBitmap.Height * 100;
|
|
if dResizePercent < 0 then
|
|
raise EConvertError.create('Invalid Number');
|
|
except
|
|
edtNewHeight.Text := IntToStr(ImageEn1.IEBitmap.Height);
|
|
dResizePercent := 100;
|
|
end;
|
|
edtNewHeightPercent.Text := IntToStr(Round(dResizePercent));
|
|
if chkMaintainAR.checked then
|
|
begin
|
|
edtNewWidthPercent.Text := IntToStr(Round(dResizePercent));
|
|
edtNewWidth.Text := IntToStr(Round(ImageEn1.IEBitmap.Width * dResizePercent / 100));
|
|
end;
|
|
finally
|
|
ResizePercent := Round(dResizePercent);
|
|
fUpdatingSize := false;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
procedure TfPreviews.edtNewHeightPercentChange(Sender: TObject);
|
|
var
|
|
iNewHeightPercent: Integer;
|
|
begin
|
|
if fUpdatingSize then
|
|
exit;
|
|
fUpdatingSize := true;
|
|
iNewHeightPercent := 100;
|
|
try
|
|
try
|
|
iNewHeightPercent := StrToInt(edtNewHeightPercent.Text);
|
|
if iNewHeightPercent < 0 then
|
|
raise EConvertError.create('Invalid Number');
|
|
except
|
|
edtNewHeightPercent.Text := IntToStr(100);
|
|
iNewHeightPercent := 100;
|
|
end;
|
|
|
|
edtNewHeight.Text := IntToStr(Round(ImageEn1.IEBitmap.Height * iNewHeightPercent / 100));
|
|
if chkMaintainAR.checked then
|
|
begin
|
|
edtNewWidthPercent.Text := IntToStr(iNewHeightPercent);
|
|
edtNewWidth.Text := IntToStr(Round(ImageEn1.IEBitmap.Width * iNewHeightPercent / 100));
|
|
end;
|
|
finally
|
|
ResizePercent := iNewHeightPercent;
|
|
fUpdatingSize := false;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
procedure TfPreviews.edtNewWidthChange(Sender: TObject);
|
|
var
|
|
dResizePercent : double;
|
|
begin
|
|
if fUpdatingSize then
|
|
exit;
|
|
fUpdatingSize := true;
|
|
dResizePercent := 100;
|
|
try
|
|
try
|
|
dResizePercent := StrToInt(edtNewWidth.Text) / ImageEn1.IEBitmap.Width * 100;
|
|
if dResizePercent < 0 then
|
|
raise EConvertError.create('Invalid Number');
|
|
except
|
|
edtNewWidth.Text := IntToStr(ImageEn1.IEBitmap.Width);
|
|
dResizePercent := 100;
|
|
end;
|
|
edtNewWidthPercent.Text := IntToStr(Round(dResizePercent));
|
|
if chkMaintainAR.checked then
|
|
begin
|
|
edtNewHeightPercent.Text := IntToStr(Round(dResizePercent));
|
|
edtNewHeight.Text := IntToStr(Round(ImageEn1.IEBitmap.Height * dResizePercent / 100));
|
|
end;
|
|
finally
|
|
ResizePercent := Round(dResizePercent);
|
|
fUpdatingSize := false;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TfPreviews.edtNewWidthPercentChange(Sender: TObject);
|
|
var
|
|
iNewWidthPercent: Integer;
|
|
begin
|
|
if fUpdatingSize then
|
|
exit;
|
|
fUpdatingSize := true;
|
|
iNewWidthPercent := 100;
|
|
try
|
|
try
|
|
iNewWidthPercent := StrToInt(edtNewWidthPercent.Text);
|
|
if iNewWidthPercent < 0 then
|
|
raise EConvertError.create('Invalid Number');
|
|
except
|
|
edtNewWidthPercent.Text := IntToStr(100);
|
|
iNewWidthPercent := 100;
|
|
end;
|
|
|
|
edtNewWidth.Text := IntToStr(Round(ImageEn1.IEBitmap.Width * iNewWidthPercent / 100));
|
|
if chkMaintainAR.checked then
|
|
begin
|
|
edtNewHeightPercent.Text := IntToStr(iNewWidthPercent);
|
|
edtNewHeight.Text := IntToStr(Round(ImageEn1.IEBitmap.Height * iNewWidthPercent / 100));
|
|
end;
|
|
finally
|
|
ResizePercent := iNewWidthPercent;
|
|
fUpdatingSize := false;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
procedure TfPreviews.ImageEn1SelectionChange(Sender: TObject);
|
|
begin
|
|
if fDoSelecting then
|
|
exit;
|
|
|
|
fDoChange := False;
|
|
|
|
edtCropLeft .Text := IntToStr( ImageEn1.SelX1 );
|
|
edtCropTop .Text := IntToStr( ImageEn1.SelY1 );
|
|
edtCropRight .Text := IntToStr( ImageEn1.IEBitmap.Width - ImageEn1.SelX2 - 1 );
|
|
edtCropBottom.Text := IntToStr( ImageEn1.IEBitmap.Height - ImageEn1.SelY2 - 1 );
|
|
|
|
fDoChange := True;
|
|
CropControlChange( ImageEn1 );
|
|
end;
|
|
|
|
procedure TfPreviews.pnlRotateBackgroundClick(Sender: TObject);
|
|
var
|
|
aColor: TColor;
|
|
begin
|
|
aColor := TPanel(Sender).color;
|
|
if PromptForColor(aColor) then
|
|
TPanel(Sender).color := aColor;
|
|
UpdatePreview;
|
|
end;
|
|
|
|
procedure TfPreviews.SoftShadowControlChange(Sender: TObject);
|
|
var
|
|
iShadowRadius : integer;
|
|
iShadowOffset : integer;
|
|
bEnabled: boolean;
|
|
begin
|
|
bEnabled := cmbShadowPosition.Enabled and (cmbShadowPosition.ItemIndex <> _cmbShadowPosition_All);
|
|
updShadowOffset .Enabled := bEnabled;
|
|
edtShadowOffset .Enabled := bEnabled;
|
|
lblShadowOffset .Enabled := bEnabled;
|
|
|
|
if not fDoChange then
|
|
exit;
|
|
|
|
iShadowRadius := StrToIntDef(edtShadowRadius.text, 3);
|
|
if cmbShadowPosition.ItemIndex = _cmbShadowPosition_All then
|
|
iShadowOffset := 0
|
|
else
|
|
iShadowOffset := StrToIntDef(edtShadowOffset.text, 3);
|
|
if (Sender = cmbShadowPosition) or (iShadowRadius <> ShadowRadius) or (iShadowOffset <> ShadowOffset) then
|
|
begin
|
|
ShadowRadius := iShadowRadius;
|
|
ShadowOffset := iShadowOffset;
|
|
UpdatePreview;
|
|
end;
|
|
end;
|
|
|
|
procedure TfPreviews.tmrUpdatePreviewTimer(Sender: TObject);
|
|
begin
|
|
UpdatePreview(True);
|
|
end;
|
|
|
|
procedure TfPreviews.updAutoEnhance3GammaClick(Sender: TObject; Button: TUDBtnType);
|
|
var
|
|
dValue: Double;
|
|
begin
|
|
dValue := IEStrToFloatDefS( edtAutoEnhance3Gamma.Text, 0.01 );
|
|
case button of
|
|
btNext: dValue := dValue + 0.01;
|
|
btPrev: dValue := dValue - 0.01;
|
|
end;
|
|
dValue := dMax( dMin( dValue, 1 ), 0.01 );
|
|
edtAutoEnhance3Gamma.Text := FloatToStrF( dValue , ffGeneral, 4, 4 );
|
|
end;
|
|
|
|
procedure TfPreviews.WMEXITSIZEMOVE(var Message: TMessage);
|
|
begin
|
|
if fResized then
|
|
ImageEn1.Fit;
|
|
fResized := false;
|
|
end;
|
|
|
|
// changed Histogram scale type
|
|
procedure TfPreviews.ComboBox1Change(Sender: TObject);
|
|
const
|
|
IDXtoHSCALE: array [0..2] of THistogramScale = (iehsLinear, iehsLinearClipped, iehsLogarithmic);
|
|
begin
|
|
HistogramBox1.Scale := IDXtoHSCALE[ComboBox1.ItemIndex];
|
|
end;
|
|
|
|
|
|
{$ELSE} // {$ifdef IEINCLUDEDIALOGIP}
|
|
|
|
interface
|
|
implementation
|
|
|
|
{$ENDIF}
|
|
|
|
|
|
|
|
end.
|
|
|