Subversion Repositories spacemission

Compare Revisions

Regard whitespace Rev 3 → Rev 4

/VCL_DELPHIX_D6/DXDIBEffectEdit.pas
0,0 → 1,373
unit DXDIBEffectEdit;
//(c)2007 Jaro Benes
//All Rights Reserved
 
{
Complex application for users of unDelphiX as component editor:
 
Supported:
a) create effect for store into dximagelist.
 
}
interface
 
{$INCLUDE DelphiXcfg.inc}
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DIB, ExtCtrls, Math, ComCtrls, Buttons, ExtDlgs, Spin;
 
type
{injected class}
EInvalidTypeConvert = class(Exception);
TEdit = class(StdCtrls.TEdit)
private
procedure SetAsInteger(Value: Integer);
function GetAsInteger: Integer;
public
property AsInteger: Integer read GetAsInteger write SetAsInteger;
end;
TTDelphiXDIBEffectEditForm = class(TForm)
Button1: TButton;
Image1: TImage;
LSpokes: TLabel;
LRaHUE: TLabel;
LCentr: TLabel;
eR: TEdit;
eG: TEdit;
eB: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
randSpok: TEdit;
Label7: TLabel;
RandGauss: TEdit;
Label8: TLabel;
rS_max: TSpeedButton;
rG_max: TSpeedButton;
Bevel1: TBevel;
PictSize: TRadioGroup;
SavePictureDialog1: TSavePictureDialog;
Bevel2: TBevel;
R_updown: TSpinButton;
G_updown: TSpinButton;
B_updown: TSpinButton;
btnOK: TButton;
btnCancel: TButton;
Panel1: TPanel;
Bevel3: TBevel;
Spokes: TProgressBar;
RaHUE: TProgressBar;
Centr: TProgressBar;
SpokesPlus: TSpeedButton;
SpokesMinus: TSpeedButton;
RaHUEPlus: TSpeedButton;
RaHUEMinus: TSpeedButton;
CentrPlus: TSpeedButton;
CentrMinus: TSpeedButton;
LName: TLabel;
eName: TEdit;
procedure CentrMinusClick(Sender: TObject);
procedure CentrPlusClick(Sender: TObject);
procedure RaHUEMinusClick(Sender: TObject);
procedure RaHUEPlusClick(Sender: TObject);
procedure SpokesMinusClick(Sender: TObject);
procedure SpokesPlusClick(Sender: TObject);
procedure CentrMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure RaHUEMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure SpokesMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormDestroy(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ImageChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure rS_maxClick(Sender: TObject);
procedure rG_maxClick(Sender: TObject);
procedure R_updownUpClick(Sender: TObject);
procedure R_updownDownClick(Sender: TObject);
procedure G_updownUpClick(Sender: TObject);
procedure G_updownDownClick(Sender: TObject);
procedure B_updownUpClick(Sender: TObject);
procedure B_updownDownClick(Sender: TObject);
private
{ Private declarations }
FSpokes: Integer;
FRaHUE: Integer;
FCentr: Integer;
procedure Calculate;
public
{ Public declarations }
ResultDIB: TDIB;
end;
 
var
DelphiXDIBEffectEditForm: TTDelphiXDIBEffectEditForm;
 
implementation
 
{$R *.DFM}
 
{ TEdit }
 
{injected class functionality like in jbEdit.TPubEdit component}
 
procedure TEdit.SetAsInteger(Value: Integer);
begin
Text := IntToStr(Value)
end;
 
function TEdit.GetAsInteger: Integer;
begin
Result := 0;
if Text = '' then
Exit;
try
Result := StrToInt(Text);
except
raise EInvalidTypeConvert.Create('Expected integer value !');
end
end;
 
{ TTDelphiXDIBEffectEditForm }
 
procedure TTDelphiXDIBEffectEditForm.Calculate;
const
wSize: array[0..5] of Word = (256, 128, 64, 32, 16, 8);
begin
// call this
// cx,cy : center x and y
// radius : 1-100
// spokes : 1-1024
// randomhue : 0-360
ResultDIB.Clear;
ResultDIB.SetSize(wSize[PictSize.ItemIndex], wSize[PictSize.ItemIndex], 24);
ResultDIB.Canvas.Brush.Color := clBlack;
ResultDIB.Canvas.FillRect(ResultDIB.Canvas.ClipRect);
 
LSpokes.Caption := Format('Spokes (%d)', [FSpokes]);
LRaHUE.Caption := Format('Random HUE (%d)', [FRaHUE]);
LCentr.Caption := Format('Nova radius (%d)', [FCentr]);
 
ResultDIB.DoNovaEffect(eR.AsInteger, eG.AsInteger, eB.AsInteger, ResultDIB.Width div 2,
ResultDIB.Height div 2, FCentr, FSpokes, FRaHUE,
randSpok.AsInteger, randGauss.AsInteger, nil);
 
Image1.Picture.Assign(ResultDIB);
end;
 
procedure TTDelphiXDIBEffectEditForm.Button1Click(Sender: TObject);
begin
Calculate;
if SavePictureDialog1.Execute then
ResultDIB.SaveToFile(SavePictureDialog1.FileName);
end;
 
procedure TTDelphiXDIBEffectEditForm.FormCreate(Sender: TObject);
begin
Tag := 0;
ResultDIB := TDIB.Create;
Randomize;
randspok.AsInteger := Random(MAXSHORT);
randgauss.AsInteger := Random(MAXSHORT);
FSpokes := 255; Spokes.Position := FSpokes; {$IFDEF VER4UP} Spokes.Smooth := True; {$ENDIF}
FRaHUE := 1; RaHUE.Position := FRaHUE; {$IFDEF VER4UP} RaHUE.Smooth := True; {$ENDIF}
FCentr := 18; Centr.Position := FCentr; {$IFDEF VER4UP} Centr.Smooth := True; {$ENDIF}
LSpokes.Caption := Format('Spokes (%d)', [FSpokes]);
LRaHUE.Caption := Format('Random HUE (%d)', [FRaHUE]);
LCentr.Caption := Format('Nova radius (%d)', [FCentr]);
Calculate;
randSpok.OnChange := ImageChange;
randgauss.OnChange := ImageChange;
{$IFDEF VER4UP}
Spokes.Smooth := True;
RaHUE.Smooth := True;
Centr.Smooth := True;
{$ENDIF}
end;
 
procedure TTDelphiXDIBEffectEditForm.rS_maxClick(Sender: TObject);
begin
RandSpok.AsInteger := maxint;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.rG_maxClick(Sender: TObject);
begin
RandGauss.AsInteger := maxint;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.R_updownUpClick(Sender: TObject);
begin
if eR.AsInteger < 255 then eR.AsInteger := eR.AsInteger + 1;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.R_updownDownClick(Sender: TObject);
begin
if eR.AsInteger > 0 then eR.AsInteger := eR.AsInteger - 1;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.G_updownUpClick(Sender: TObject);
begin
if eG.AsInteger < 255 then eG.AsInteger := eG.AsInteger + 1;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.G_updownDownClick(Sender: TObject);
begin
if eG.AsInteger > 0 then eG.AsInteger := eG.AsInteger - 1;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.B_updownUpClick(Sender: TObject);
begin
if eB.AsInteger < 255 then eB.AsInteger := eB.AsInteger + 1;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.B_updownDownClick(Sender: TObject);
begin
if eB.AsInteger > 0 then eB.AsInteger := eB.AsInteger - 1;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.btnCancelClick(Sender: TObject);
begin
Close;
end;
 
procedure TTDelphiXDIBEffectEditForm.btnOKClick(Sender: TObject);
begin
if eName.Text <> '' then begin
Tag := 1;
Close;
end
else
MessageDlg('Image name required!', mtWarning, [mbOK], 0);;
end;
 
procedure TTDelphiXDIBEffectEditForm.FormDestroy(Sender: TObject);
begin
ResultDIB.Free;
end;
 
procedure TTDelphiXDIBEffectEditForm.ImageChange(Sender: TObject);
begin
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.SpokesMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
newPosition: integer;
begin
with Sender as TProgressBar do begin
if ssLeft in Shift then
begin
Cursor := crHSplit;
newPosition := Round(x * Max / ClientWidth);
Position := newPosition;
end
else
begin
Cursor := crDefault;
end;
FSpokes := Position;
LSpokes.Caption := Format('Spokes (%d)', [FSpokes]);
if ssLeft in Shift then Calculate;
end;
end;
 
procedure TTDelphiXDIBEffectEditForm.RaHUEMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
newPosition: integer;
begin
with Sender as TProgressBar do begin
if ssLeft in Shift then
begin
Cursor := crHSplit;
newPosition := Round(x * Max / ClientWidth);
Position := newPosition;
end
else
begin
Cursor := crDefault;
end;
FRaHUE := Position;
LRaHUE.Caption := Format('Random HUE (%d)', [FRaHUE]);
if ssLeft in Shift then Calculate;
end;
end;
 
procedure TTDelphiXDIBEffectEditForm.CentrMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
newPosition: integer;
begin
with Sender as TProgressBar do begin
if ssLeft in Shift then
begin
Cursor := crHSplit;
newPosition := Round(x * Max / ClientWidth);
Position := newPosition;
end
else
begin
Cursor := crDefault;
end;
FCentr := Position;
LCentr.Caption := Format('Nova radius (%d)', [FCentr]);
if ssLeft in Shift then Calculate;
end;
end;
 
procedure TTDelphiXDIBEffectEditForm.SpokesPlusClick(Sender: TObject);
begin
Inc(FSpokes); if FSpokes > 1024 then FSpokes := 1024;
Spokes.Position := FSpokes;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.SpokesMinusClick(Sender: TObject);
begin
Dec(FSpokes); if FSpokes < 1 then FSpokes := 1;
Spokes.Position := FSpokes;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.RaHUEPlusClick(Sender: TObject);
begin
Inc(FRaHUE); if FRaHUE > 360 then FRaHUE := 360;
RaHUE.Position := FRaHUE;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.RaHUEMinusClick(Sender: TObject);
begin
Dec(FRaHUE); if FRaHUE < 0 then FRaHUE := 0;
RaHUE.Position := FRaHUE;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.CentrPlusClick(Sender: TObject);
begin
Inc(FCentr); if FCentr > 100 then FCentr := 100;
Centr.Position := FCentr;
Calculate;
end;
 
procedure TTDelphiXDIBEffectEditForm.CentrMinusClick(Sender: TObject);
begin
Dec(FCentr); if FCentr < 1 then FCentr := 1;
Centr.Position := FCentr;
Calculate;
end;
 
end.