Subversion Repositories spacemission

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 daniel-mar 1
unit DXDIBEffectEdit;
2
//(c)2007 Jaro Benes
3
//All Rights Reserved
4
 
5
{
6
Complex application for users of unDelphiX as component editor:
7
 
8
Supported:
9
 a) create effect for store into dximagelist.
10
 
11
}
12
interface
13
 
14
{$INCLUDE DelphiXcfg.inc}
15
 
16
uses
17
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
18
  StdCtrls, DIB, ExtCtrls, Math, ComCtrls, Buttons, ExtDlgs, Spin;
19
 
20
type
21
  {injected class}
22
  EInvalidTypeConvert = class(Exception);
23
  TEdit = class(StdCtrls.TEdit)
24
  private
25
    procedure SetAsInteger(Value: Integer);
26
    function GetAsInteger: Integer;
27
  public
28
    property AsInteger: Integer read GetAsInteger write SetAsInteger;
29
  end;
30
  TTDelphiXDIBEffectEditForm = class(TForm)
31
    Button1: TButton;
32
    Image1: TImage;
33
    LSpokes: TLabel;
34
    LRaHUE: TLabel;
35
    LCentr: TLabel;
36
    eR: TEdit;
37
    eG: TEdit;
38
    eB: TEdit;
39
    Label4: TLabel;
40
    Label5: TLabel;
41
    Label6: TLabel;
42
    randSpok: TEdit;
43
    Label7: TLabel;
44
    RandGauss: TEdit;
45
    Label8: TLabel;
46
    rS_max: TSpeedButton;
47
    rG_max: TSpeedButton;
48
    Bevel1: TBevel;
49
    PictSize: TRadioGroup;
50
    SavePictureDialog1: TSavePictureDialog;
51
    Bevel2: TBevel;
52
    R_updown: TSpinButton;
53
    G_updown: TSpinButton;
54
    B_updown: TSpinButton;
55
    btnOK: TButton;
56
    btnCancel: TButton;
57
    Panel1: TPanel;
58
    Bevel3: TBevel;
59
    Spokes: TProgressBar;
60
    RaHUE: TProgressBar;
61
    Centr: TProgressBar;
62
    SpokesPlus: TSpeedButton;
63
    SpokesMinus: TSpeedButton;
64
    RaHUEPlus: TSpeedButton;
65
    RaHUEMinus: TSpeedButton;
66
    CentrPlus: TSpeedButton;
67
    CentrMinus: TSpeedButton;
68
    LName: TLabel;
69
    eName: TEdit;
70
    procedure CentrMinusClick(Sender: TObject);
71
    procedure CentrPlusClick(Sender: TObject);
72
    procedure RaHUEMinusClick(Sender: TObject);
73
    procedure RaHUEPlusClick(Sender: TObject);
74
    procedure SpokesMinusClick(Sender: TObject);
75
    procedure SpokesPlusClick(Sender: TObject);
76
    procedure CentrMouseMove(Sender: TObject; Shift: TShiftState; X,
77
      Y: Integer);
78
    procedure RaHUEMouseMove(Sender: TObject; Shift: TShiftState; X,
79
      Y: Integer);
80
    procedure SpokesMouseMove(Sender: TObject; Shift: TShiftState; X,
81
      Y: Integer);
82
    procedure FormDestroy(Sender: TObject);
83
    procedure btnOKClick(Sender: TObject);
84
    procedure btnCancelClick(Sender: TObject);
85
    procedure Button1Click(Sender: TObject);
86
    procedure ImageChange(Sender: TObject);
87
    procedure FormCreate(Sender: TObject);
88
    procedure rS_maxClick(Sender: TObject);
89
    procedure rG_maxClick(Sender: TObject);
90
    procedure R_updownUpClick(Sender: TObject);
91
    procedure R_updownDownClick(Sender: TObject);
92
    procedure G_updownUpClick(Sender: TObject);
93
    procedure G_updownDownClick(Sender: TObject);
94
    procedure B_updownUpClick(Sender: TObject);
95
    procedure B_updownDownClick(Sender: TObject);
96
  private
97
    { Private declarations }
98
    FSpokes: Integer;
99
    FRaHUE: Integer;
100
    FCentr: Integer;
101
    procedure Calculate;
102
  public
103
    { Public declarations }
104
    ResultDIB: TDIB;
105
  end;
106
 
107
var
108
  DelphiXDIBEffectEditForm: TTDelphiXDIBEffectEditForm;
109
 
110
implementation
111
 
112
{$R *.DFM}
113
 
114
{ TEdit }
115
 
116
{injected class functionality like in jbEdit.TPubEdit component}
117
 
118
procedure TEdit.SetAsInteger(Value: Integer);
119
begin
120
  Text := IntToStr(Value)
121
end;
122
 
123
function TEdit.GetAsInteger: Integer;
124
begin
125
  Result := 0;
126
  if Text = '' then
127
    Exit;
128
  try
129
    Result := StrToInt(Text);
130
  except
131
    raise EInvalidTypeConvert.Create('Expected integer value !');
132
  end
133
end;
134
 
135
{  TTDelphiXDIBEffectEditForm  }
136
 
137
procedure TTDelphiXDIBEffectEditForm.Calculate;
138
const
139
  wSize: array[0..5] of Word = (256, 128, 64, 32, 16, 8);
140
begin
141
// call this
142
// cx,cy : center x and y
143
// radius : 1-100
144
// spokes : 1-1024
145
// randomhue : 0-360
146
  ResultDIB.Clear;
147
  ResultDIB.SetSize(wSize[PictSize.ItemIndex], wSize[PictSize.ItemIndex], 24);
148
  ResultDIB.Canvas.Brush.Color := clBlack;
149
  ResultDIB.Canvas.FillRect(ResultDIB.Canvas.ClipRect);
150
 
151
  LSpokes.Caption := Format('Spokes (%d)', [FSpokes]);
152
  LRaHUE.Caption := Format('Random HUE (%d)', [FRaHUE]);
153
  LCentr.Caption := Format('Nova radius (%d)', [FCentr]);
154
 
155
  ResultDIB.DoNovaEffect(eR.AsInteger, eG.AsInteger, eB.AsInteger, ResultDIB.Width div 2,
156
    ResultDIB.Height div 2, FCentr, FSpokes, FRaHUE,
157
    randSpok.AsInteger, randGauss.AsInteger, nil);
158
 
159
  Image1.Picture.Assign(ResultDIB);
160
end;
161
 
162
procedure TTDelphiXDIBEffectEditForm.Button1Click(Sender: TObject);
163
begin
164
  Calculate;
165
  if SavePictureDialog1.Execute then
166
    ResultDIB.SaveToFile(SavePictureDialog1.FileName);
167
end;
168
 
169
procedure TTDelphiXDIBEffectEditForm.FormCreate(Sender: TObject);
170
begin
171
  Tag := 0;
172
  ResultDIB := TDIB.Create;
173
  Randomize;
174
  randspok.AsInteger := Random(MAXSHORT);
175
  randgauss.AsInteger := Random(MAXSHORT);
176
  FSpokes := 255; Spokes.Position := FSpokes; {$IFDEF VER4UP} Spokes.Smooth := True; {$ENDIF}
177
  FRaHUE := 1; RaHUE.Position := FRaHUE; {$IFDEF VER4UP} RaHUE.Smooth := True; {$ENDIF}
178
  FCentr := 18; Centr.Position := FCentr; {$IFDEF VER4UP} Centr.Smooth := True; {$ENDIF}
179
  LSpokes.Caption := Format('Spokes (%d)', [FSpokes]);
180
  LRaHUE.Caption := Format('Random HUE (%d)', [FRaHUE]);
181
  LCentr.Caption := Format('Nova radius (%d)', [FCentr]);
182
  Calculate;
183
  randSpok.OnChange := ImageChange;
184
  randgauss.OnChange := ImageChange;
185
  {$IFDEF VER4UP}
186
  Spokes.Smooth := True;
187
  RaHUE.Smooth := True;
188
  Centr.Smooth := True;
189
  {$ENDIF}
190
end;
191
 
192
procedure TTDelphiXDIBEffectEditForm.rS_maxClick(Sender: TObject);
193
begin
194
  RandSpok.AsInteger := maxint;
195
  Calculate;
196
end;
197
 
198
procedure TTDelphiXDIBEffectEditForm.rG_maxClick(Sender: TObject);
199
begin
200
  RandGauss.AsInteger := maxint;
201
  Calculate;
202
end;
203
 
204
procedure TTDelphiXDIBEffectEditForm.R_updownUpClick(Sender: TObject);
205
begin
206
  if eR.AsInteger < 255 then eR.AsInteger := eR.AsInteger + 1;
207
  Calculate;
208
end;
209
 
210
procedure TTDelphiXDIBEffectEditForm.R_updownDownClick(Sender: TObject);
211
begin
212
  if eR.AsInteger > 0 then eR.AsInteger := eR.AsInteger - 1;
213
  Calculate;
214
end;
215
 
216
procedure TTDelphiXDIBEffectEditForm.G_updownUpClick(Sender: TObject);
217
begin
218
  if eG.AsInteger < 255 then eG.AsInteger := eG.AsInteger + 1;
219
  Calculate;
220
end;
221
 
222
procedure TTDelphiXDIBEffectEditForm.G_updownDownClick(Sender: TObject);
223
begin
224
  if eG.AsInteger > 0 then eG.AsInteger := eG.AsInteger - 1;
225
  Calculate;
226
end;
227
 
228
procedure TTDelphiXDIBEffectEditForm.B_updownUpClick(Sender: TObject);
229
begin
230
  if eB.AsInteger < 255 then eB.AsInteger := eB.AsInteger + 1;
231
  Calculate;
232
end;
233
 
234
procedure TTDelphiXDIBEffectEditForm.B_updownDownClick(Sender: TObject);
235
begin
236
  if eB.AsInteger > 0 then eB.AsInteger := eB.AsInteger - 1;
237
  Calculate;
238
end;
239
 
240
procedure TTDelphiXDIBEffectEditForm.btnCancelClick(Sender: TObject);
241
begin
242
  Close;
243
end;
244
 
245
procedure TTDelphiXDIBEffectEditForm.btnOKClick(Sender: TObject);
246
begin
247
  if eName.Text <> '' then begin
248
    Tag := 1;
249
    Close;
250
  end
251
  else
252
    MessageDlg('Image name required!', mtWarning, [mbOK], 0);;
253
end;
254
 
255
procedure TTDelphiXDIBEffectEditForm.FormDestroy(Sender: TObject);
256
begin
257
  ResultDIB.Free;
258
end;
259
 
260
procedure TTDelphiXDIBEffectEditForm.ImageChange(Sender: TObject);
261
begin
262
  Calculate;
263
end;
264
 
265
procedure TTDelphiXDIBEffectEditForm.SpokesMouseMove(Sender: TObject;
266
  Shift: TShiftState; X, Y: Integer);
267
var
268
  newPosition: integer;
269
begin
270
  with Sender as TProgressBar do begin
271
    if ssLeft in Shift then
272
    begin
273
      Cursor := crHSplit;
274
      newPosition := Round(x * Max / ClientWidth);
275
      Position := newPosition;
276
    end
277
    else
278
    begin
279
      Cursor := crDefault;
280
    end;
281
    FSpokes := Position;
282
    LSpokes.Caption := Format('Spokes (%d)', [FSpokes]);
283
    if ssLeft in Shift then Calculate;
284
  end;
285
end;
286
 
287
procedure TTDelphiXDIBEffectEditForm.RaHUEMouseMove(Sender: TObject;
288
  Shift: TShiftState; X, Y: Integer);
289
var
290
  newPosition: integer;
291
begin
292
  with Sender as TProgressBar do begin
293
    if ssLeft in Shift then
294
    begin
295
      Cursor := crHSplit;
296
      newPosition := Round(x * Max / ClientWidth);
297
      Position := newPosition;
298
    end
299
    else
300
    begin
301
      Cursor := crDefault;
302
    end;
303
    FRaHUE := Position;
304
    LRaHUE.Caption := Format('Random HUE (%d)', [FRaHUE]);
305
    if ssLeft in Shift then Calculate;
306
  end;
307
end;
308
 
309
procedure TTDelphiXDIBEffectEditForm.CentrMouseMove(Sender: TObject;
310
  Shift: TShiftState; X, Y: Integer);
311
var
312
  newPosition: integer;
313
begin
314
  with Sender as TProgressBar do begin
315
    if ssLeft in Shift then
316
    begin
317
      Cursor := crHSplit;
318
      newPosition := Round(x * Max / ClientWidth);
319
      Position := newPosition;
320
    end
321
    else
322
    begin
323
      Cursor := crDefault;
324
    end;
325
    FCentr := Position;
326
    LCentr.Caption := Format('Nova radius (%d)', [FCentr]);
327
    if ssLeft in Shift then Calculate;
328
  end;
329
end;
330
 
331
procedure TTDelphiXDIBEffectEditForm.SpokesPlusClick(Sender: TObject);
332
begin
333
  Inc(FSpokes); if FSpokes > 1024 then FSpokes := 1024;
334
  Spokes.Position := FSpokes;
335
  Calculate;
336
end;
337
 
338
procedure TTDelphiXDIBEffectEditForm.SpokesMinusClick(Sender: TObject);
339
begin
340
  Dec(FSpokes); if FSpokes < 1 then FSpokes := 1;
341
  Spokes.Position := FSpokes;
342
  Calculate;
343
end;
344
 
345
procedure TTDelphiXDIBEffectEditForm.RaHUEPlusClick(Sender: TObject);
346
begin
347
  Inc(FRaHUE); if FRaHUE > 360 then FRaHUE := 360;
348
  RaHUE.Position := FRaHUE;
349
  Calculate;
350
end;
351
 
352
procedure TTDelphiXDIBEffectEditForm.RaHUEMinusClick(Sender: TObject);
353
begin
354
  Dec(FRaHUE); if FRaHUE < 0 then FRaHUE := 0;
355
  RaHUE.Position := FRaHUE;
356
  Calculate;
357
end;
358
 
359
procedure TTDelphiXDIBEffectEditForm.CentrPlusClick(Sender: TObject);
360
begin
361
  Inc(FCentr); if FCentr > 100 then FCentr := 100;
362
  Centr.Position := FCentr;
363
  Calculate;
364
end;
365
 
366
procedure TTDelphiXDIBEffectEditForm.CentrMinusClick(Sender: TObject);
367
begin
368
  Dec(FCentr); if FCentr < 1 then FCentr := 1;
369
  Centr.Position := FCentr;
370
  Calculate;
371
end;
372
 
373
end.