Subversion Repositories spacemission

Rev

Blame | Last modification | View Log | RSS feed

  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.