// Vchira // Stephen C. Ferguson // 01/11/01 // http://www.eclectasy.com/Iterations-et-Flarium24/ // unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, JPeg, ExtDlgs, StdCtrls, G32, G32_Image, G32_Layers, G32_RangeBars, G32_Filters, G32_Transforms, TB97Ctls, TB97, TB97Tlbr, ComCtrls, Buttons, RXSpin, RxGrdCpt, RXCtrls, NewImageUnit, RGBALoaderUnit, UnitBitmapLayer, UnitMagn, ScaleUnit; type affineArray = array [1..60] of Double; type TInfo = Record cx, cy: Double; zx, zy: Double; CRMIN, CRMAX, CRMID, CIMIN, CIMAX, CIMID: Double; CRMIN_NEW, CRMAX_NEW, CRMID_NEW, CIMIN_NEW, CIMAX_NEW, CIMID_NEW: Double; CRMID_OLD, CIMID_OLD: Double; CRMID_JUL, CIMID_JUL: Double; CRMIN1, CRMAX1, CRMID1, CIMIN1, CIMAX1, CIMID1: Double; CRMIN_NEW1, CRMAX_NEW1, CRMID_NEW1, CIMIN_NEW1, CIMAX_NEW1, CIMID_NEW1: Double; CRMID_OLD1, CIMID_OLD1: Double; CRMID_JUL1, CIMID_JUL1: Double; dMag_new, dMagnification: double; dMag_new1, dMagnification1: double; Radius_x, Radius_y: Double; rx_ratio, ry_ratio: Double; xtot, ytot: Double; xsav, ysav: Double; dFactor1, dFactor2, dFactor3, dFactor4, dFactor5: Double; dStrands: Double; ti_power: Double; r, g, b: Double; dRedStep, dBluStep, dGrnStep: Double; dRedStep1, dBluStep1, dGrnStep1: Double; dRedStart, dBluStart, dGrnStart: Double; dRedSaturate, dBluSaturate, dGrnSaturate: Double; dRedOffset, dBluOffset, dGrnOffset: Double; StrTitle: pAnsiChar; StrDescription: pAnsiChar; szFormulaFile: pAnsiChar; szRenderFile: pAnsiChar; pXData: Pointer; pYData: Pointer; hDLLHandle: THandle; hDLLFormulaHandle: THandle; hDLLRenderHandle: THandle; iWidth, iHeight: Integer; iWidth1, iHeight1: Integer; Bailout, Maxit, Iteration: Integer; rb_width, rb_height, rb_left, rb_top: Integer; formula: Integer; render: Integer; formula_total: Integer; render_total: Integer; FractalType: Integer; nBlendingMethod: Integer; nColoringOrder: Integer; jul: Integer; jul_save: Integer; inverse: Integer; nRotation: Integer; RedInverse, GrnInverse, BluInverse: Integer; lmapping: Integer; derivative: Integer; nTransform: Integer; //////////////////////////////// nCoefficients: Integer; T1, nPoints: Integer; xMin, yMin, xMax, yMax: Double; RandomFactor: double; AA, BB, C, Lyapunov: double; AA_Initial: double; bNone, bLinear, bSinusoidal, bSpherical, bSwirl, bHorseshoe, bPolar, bBent, bInversion: Bool; bInvert: Bool; bInitialize: Bool; Abort_Draw, bSqrt: Bool; af, bf: affineArray; bitmap1: TBitmap; bitmap2: TBitmap; my_TList: TList; color: integer; bColorMix, bExpansion, bModulas: BOOL; bAtriatix: BOOL; end; pDataPointer = ^TInfo; var xArray: array[0..50000] of double; yArray: array[0..50000] of double; atr_width, atr_height: Integer; HelpFileName: String; const constArrayWIDTH: Integer = 1024; constArrayHEIGHT: Integer = 768; constWIDTH: Integer = 320; // 320 constHEIGHT: Integer = 240; // 240 constMANDEL: Integer = 0; constNEWTON: Integer = 1; constWARPED_MANDEL: Integer = 2; constWARPED_NEWTON: Integer = 3; constZeroTol: Double = 1e-20; constVersionNumber: String = 'Vchira'; constPI: Double = 3.14159265359; const2PI: Double = 6.28318530718; constDMax: Double = 1e24; constOverFlow = 1e12; r0Min = 0.01; r0Max = 15; type TMainForm = class(TForm) StatusBar1: TStatusBar; LeftDock97: TDock97; RightDock97: TDock97; MainMenu: TMainMenu; mnFile: TMenuItem; mnFileNew: TMenuItem; mnFileOpen: TMenuItem; SaveToFile: TMenuItem; LoadFromParameterFile1: TMenuItem; mnLayers: TMenuItem; mnNewBitmapLayer: TMenuItem; mnNewBitmapRGBA: TMenuItem; N4: TMenuItem; mnFlatten: TMenuItem; mnBringFront: TMenuItem; mnSendBack: TMenuItem; N1: TMenuItem; mnLevelUp: TMenuItem; mnLevelDown: TMenuItem; N2: TMenuItem; mnScaled: TMenuItem; mnDelete: TMenuItem; Render1: TMenuItem; Render01: TMenuItem; Render02: TMenuItem; Render03: TMenuItem; Render04: TMenuItem; Render05: TMenuItem; Render06: TMenuItem; Render07: TMenuItem; Render08: TMenuItem; Render09: TMenuItem; Render10: TMenuItem; Render11: TMenuItem; Render12: TMenuItem; Render13: TMenuItem; Render14: TMenuItem; Render15: TMenuItem; Render16: TMenuItem; Render17: TMenuItem; Render18: TMenuItem; Render21: TMenuItem; Render19: TMenuItem; Render20: TMenuItem; Render211: TMenuItem; Render22: TMenuItem; Render23: TMenuItem; Render24: TMenuItem; Render25: TMenuItem; Render26: TMenuItem; Render27: TMenuItem; Blend1: TMenuItem; Blend01: TMenuItem; Blend02: TMenuItem; Blend03: TMenuItem; Blend04: TMenuItem; Blend05: TMenuItem; Blend06: TMenuItem; RGBMenu: TMenuItem; RGB01: TMenuItem; RGB02: TMenuItem; RGB03: TMenuItem; RGB04: TMenuItem; RGB05: TMenuItem; RGB06: TMenuItem; Transform1: TMenuItem; Transform00: TMenuItem; Transform01: TMenuItem; Transform02: TMenuItem; Transform03: TMenuItem; Transform04: TMenuItem; Image1: TMenuItem; Zoom1: TMenuItem; StopDrawing1: TMenuItem; InsideOut1: TMenuItem; JuliaMode1: TMenuItem; Draw1: TMenuItem; N3: TMenuItem; Rotate00: TMenuItem; Rotate01: TMenuItem; Rotate02: TMenuItem; Rotate03: TMenuItem; Dialogs1: TMenuItem; Formulas1: TMenuItem; Parameters1: TMenuItem; Colors1: TMenuItem; XYSizeMenu: TMenuItem; JPEGOptions1: TMenuItem; ScaleImage1: TMenuItem; ZoomMagnification: TMenuItem; Help1: TMenuItem; Help2: TMenuItem; About1: TMenuItem; OpenPictureDialog1: TOpenPictureDialog; SaveDialog1: TSaveDialog; Timer1: TTimer; Timer2: TTimer; Timer3UpdateFractal: TTimer; PopupMenu1: TPopupMenu; ZoomIn1: TMenuItem; ClearRectangle1: TMenuItem; JuliaMode2: TMenuItem; InsideOut2: TMenuItem; SavePictureDialog1: TSavePictureDialog; OpenDialog1: TOpenDialog; Timer4: TTimer; Timer5: TTimer; StopDrawing2: TMenuItem; RxGradientCaption1: TRxGradientCaption; Render28: TMenuItem; TransformationToolbar1: TMenuItem; TopToolbar2: TMenuItem; Render29: TMenuItem; Render30: TMenuItem; Render31: TMenuItem; Render32: TMenuItem; N5: TMenuItem; N6: TMenuItem; Exit1: TMenuItem; Size1: TMenuItem; SizeBtn80x60: TMenuItem; SizeBtn160x120: TMenuItem; SizeBtn256x256: TMenuItem; SizeBtn320x240: TMenuItem; SizeBtn640x480: TMenuItem; SizeBtn800x600: TMenuItem; N7: TMenuItem; Custom1: TMenuItem; Dock971: TDock97; Transformation: TToolbar97; GroupBox4: TGroupBox; C01Btn: TToolbarButton97; C02Btn: TToolbarButton97; C03Btn: TToolbarButton97; C04Btn: TToolbarButton97; C05Btn: TToolbarButton97; C06Btn: TToolbarButton97; GroupBox5: TGroupBox; T00Btn: TToolbarButton97; T01Btn: TToolbarButton97; T02Btn: TToolbarButton97; T03Btn: TToolbarButton97; T04Btn: TToolbarButton97; GroupBox6: TGroupBox; RGB01Btn: TToolbarButton97; RGB02Btn: TToolbarButton97; RGB03Btn: TToolbarButton97; RGB04Btn: TToolbarButton97; RGB05Btn: TToolbarButton97; RGB06Btn: TToolbarButton97; GroupBox8: TGroupBox; MagnMagnification: TGaugeBar; GroupBox3: TGroupBox; DetailsSpinEdit: TRxSpinEdit; IntensityRxSpinEdit: TRxSpinEdit; ImgView: TImgView32; TopToolbar1: TToolbar97; AbortButton: TToolbarButton97; ResetButton: TToolbarButton97; OpenBtn: TToolbarButton97; ToolbarSep971: TToolbarSep97; LoadParameterFile: TToolbarButton97; SaveBtn: TToolbarButton97; ParamsButton: TToolbarButton97; XYSizeButton: TToolbarButton97; FormulaButtom: TToolbarButton97; ColorsButton: TToolbarButton97; HelpButton: TToolbarButton97; ToolbarSep972: TToolbarSep97; ZoomButton1: TToolbarButton97; JuliaButton: TToolbarButton97; ToolbarSep973: TToolbarSep97; FlattenLayers1: TMenuItem; N8: TMenuItem; DeleteLayer1: TMenuItem; procedure mnFileNewClick(Sender: TObject); procedure mnFileOpenClick(Sender: TObject); procedure mnNewBitmapLayerClick(Sender: TObject); procedure mnDeleteClick(Sender: TObject); procedure ScaleComboChange(Sender: TObject); procedure mnLayersClick(Sender: TObject); procedure ImageInterpolateClick(Sender: TObject); procedure LayerOpacityChange(Sender: TObject); procedure LayerInterpolateClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure mnNewBitmapRGBAClick(Sender: TObject); procedure LayerRescaleClick(Sender: TObject); procedure LayerResetScaleClick(Sender: TObject); procedure CroppedClick(Sender: TObject); procedure mnMagnifierClick(Sender: TObject); procedure MagnChange(Sender: TObject); procedure mnArrangeClick(Sender: TObject); procedure mnScaledClick(Sender: TObject); procedure mnReorder(Sender: TObject); procedure ImgViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); procedure ImgViewPaintStage(Sender: TObject; Buffer: TBitmap32; StageNum: Cardinal); procedure mnFlattenClick(Sender: TObject); procedure ResetButtonClick(Sender: TObject); procedure Help2Click(Sender: TObject); procedure About1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Render01Click(Sender: TObject); procedure Render02Click(Sender: TObject); procedure Render03Click(Sender: TObject); procedure Render04Click(Sender: TObject); procedure Formulas1Click(Sender: TObject); procedure Parameters1Click(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Colors1Click(Sender: TObject); procedure Blend01Click(Sender: TObject); procedure Blend02Click(Sender: TObject); procedure Blend03Click(Sender: TObject); procedure Blend04Click(Sender: TObject); procedure Blend05Click(Sender: TObject); procedure Blend06Click(Sender: TObject); procedure Timer3UpdateFractalTimer(Sender: TObject); procedure XYSizeMenuClick(Sender: TObject); procedure Zoom1Click(Sender: TObject); procedure ImgViewMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); procedure SaveToFileClick(Sender: TObject); procedure JPEGOptions1Click(Sender: TObject); procedure LoadFromParameterFile1Click(Sender: TObject); procedure StopDrawing1Click(Sender: TObject); procedure Render05Click(Sender: TObject); procedure Transform01Click(Sender: TObject); procedure Transform02Click(Sender: TObject); procedure Transform03Click(Sender: TObject); procedure Transform04Click(Sender: TObject); procedure Transform00Click(Sender: TObject); procedure InsideOut1Click(Sender: TObject); procedure Render06Click(Sender: TObject); procedure Render07Click(Sender: TObject); procedure AbortButtonClick(Sender: TObject); procedure JuliaButtonClick(Sender: TObject); procedure ImgViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ScaleImage1Click(Sender: TObject); procedure ZoomMagnificationClick(Sender: TObject); procedure Draw1Click(Sender: TObject); procedure exitBitBtnClick(Sender: TObject); procedure R160x120Click(Sender: TObject); procedure R256x256Click(Sender: TObject); procedure R320x240Click(Sender: TObject); procedure R640x480Click(Sender: TObject); procedure R800x600Click(Sender: TObject); procedure R1024x768Click(Sender: TObject); procedure RGB01Click(Sender: TObject); procedure RGB02Click(Sender: TObject); procedure RGB03Click(Sender: TObject); procedure RGB04Click(Sender: TObject); procedure RGB05Click(Sender: TObject); procedure RGB06Click(Sender: TObject); procedure DetailsSpinEditChange(Sender: TObject); procedure F01BtnClick(Sender: TObject); procedure F02BtnClick(Sender: TObject); procedure F03BtnClick(Sender: TObject); procedure F05BtnClick(Sender: TObject); procedure F06BtnClick(Sender: TObject); procedure F07BtnClick(Sender: TObject); procedure F08BtnClick(Sender: TObject); procedure F09BtnClick(Sender: TObject); procedure F10BtnClick(Sender: TObject); procedure F11BtnClick(Sender: TObject); procedure F12BtnClick(Sender: TObject); procedure F04BtnClick(Sender: TObject); procedure Timer4Timer(Sender: TObject); procedure IntensityRxSpinEditChange(Sender: TObject); procedure Timer5Timer(Sender: TObject); procedure Rotate00Click(Sender: TObject); procedure Rotate01Click(Sender: TObject); procedure Rotate02Click(Sender: TObject); procedure Rotate03Click(Sender: TObject); procedure Render08Click(Sender: TObject); procedure Render09Click(Sender: TObject); procedure Render10Click(Sender: TObject); procedure Render11Click(Sender: TObject); procedure Render12Click(Sender: TObject); procedure Render13Click(Sender: TObject); procedure Render14Click(Sender: TObject); procedure Render15Click(Sender: TObject); procedure Render16Click(Sender: TObject); procedure Render17Click(Sender: TObject); procedure Render18Click(Sender: TObject); procedure Render19Click(Sender: TObject); procedure Render20Click(Sender: TObject); procedure Render211Click(Sender: TObject); procedure Render22Click(Sender: TObject); procedure Render23Click(Sender: TObject); procedure Render24Click(Sender: TObject); procedure Render25Click(Sender: TObject); procedure Render26Click(Sender: TObject); procedure Render27Click(Sender: TObject); procedure mandelClick(Sender: TObject); procedure juliaClick(Sender: TObject); procedure TransformationToolbar1Click(Sender: TObject); procedure TopToolbar2Click(Sender: TObject); procedure Render28Click(Sender: TObject); procedure Render29Click(Sender: TObject); procedure Render30Click(Sender: TObject); procedure Render31Click(Sender: TObject); procedure Render32Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure SizeBtn80x60Click(Sender: TObject); procedure SizeBtn160x120Click(Sender: TObject); procedure SizeBtn256x256Click(Sender: TObject); procedure SizeBtn320x240Click(Sender: TObject); procedure SizeBtn640x480Click(Sender: TObject); procedure SizeBtn800x600Click(Sender: TObject); private pData: Pointer; FSelection: TPositionedLayer; pxmin, pymin, pxmax, pymax: Integer; Magnification: Single; strParamName: String; R: TRect; P: TPoint; OutFile: TextFile; bRectangleMode: Bool; Shift_Sav: TShiftState; cxp, cyp: Double; P32, PBits: PColor32; red, grn, blu: Integer; //TmpBmp: TBitmap32; procedure SetSelection(Value: TPositionedLayer); procedure WMEraseBkgnd(var Msg: TMessage); message WM_ERASEBKGND; procedure ShowHint(Sender: TObject); protected RBLayer: TRubberbandLayer; function CreatePositionedLayer: TPositionedLayer; function CreateNewPositionedLayer: TPositionedLayer; procedure LayerMouseDown(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure RBResizing(Sender: TObject; const OldLocation: TFloatRect; var NewLocation: TFloatRect; DragState: TDragState; Shift: TShiftState); procedure PaintMagnifierHandler(Sender: TObject; Buffer: TBitmap32); public v: TInfo; // All Public Variables Image1_SelectionWidth, Image1_SelectionHeight: Integer; Image1_SelectionLeft, Image1_SelectionTop: Integer; compress_ratio: Integer; bProgressive: bool; xO, yO, xI, yI: Double; ldx, ldy: Double; bug: Integer; tc: TColor; icolor: Integer; bValid: Bool; PYGlobal: Integer; bStartup: Bool; SrcRect, DstRect: TFloatRect; SrcTRect, DstTRect: TRect; Top, Bottom, Left, Right: double; procedure DrawDefaultImage; procedure CreateNewImage(AWidth, AHeight: Integer; FillColor: TColor32); procedure OpenImage(const FileName: string); property Selection: TPositionedLayer read FSelection write SetSelection; procedure ClearRectangle; procedure draw_fractal; procedure AdjustCoords; procedure UpdateMenus; end; var MainForm: TMainForm; gFillColor: Integer; implementation uses Math, ktaza, Registry, ShellApi, About, ListZon, params, ColorControl, XYSize, JpegParams; {$R *.DFM} { TForm1 } procedure TMainForm.FormCreate(Sender: TObject); begin // by default, PST_CLEAR_BACKGND is executed at this stage, // which, in turn, calls ExecClearBackgnd method of ImgView. // Here I substitute PST_CLEAR_BACKGND with PST_CUSTOM, so force ImgView // to call the OnPaintStage event instead of performing default action. with ImgView.PaintStages[0]^ do begin if Stage = PST_CLEAR_BACKGND then Stage := PST_CUSTOM; end; Application.Title := 'NEW'; Application.OnHint := ShowHint; // Initialize v.dRedStep := 1; v.dGrnStep := 1; v.dBluStep := 1; v.dRedStart := 0; v.dGrnStart := 0; v.dBluStart := 0; v.dRedSaturate := 127; v.dGrnSaturate := 127; v.dBluSaturate := 127; v.dRedOffset := 127; v.dGrnOffset := 127; v.dBluOffset := 127; v.Maxit := 32; DetailsSpinEdit.Value := v.Maxit; v.Bailout := 1000000000; v.dStrands := 0.15; v.iHeight := constHEIGHT; v.iWidth := constWIDTH; v.formula := 1; v.render := 3; v.lmapping := 1; v.derivative := 1; v.nTransform := 0; v.ti_power := 2; v.FractalType := constNEWTON; v.nBlendingMethod := 1; v.nColoringOrder := 1; v.dFactor3 := 1; IntensityRxSpinEdit.Value := v.dFactor3; v.dFactor4 := 1; v.dFactor5 := 1; v.jul := 0; v.jul_save := 0; v.inverse := 0; v.nRotation := 0; v.AA := 0; v.BB := 0; v.Abort_Draw := True; v.bAtriatix := False; compress_ratio := 85; bProgressive := True; v.iWidth := constWidth; v.iHeight := constHeight; Application.Title := 'NEW'; bRectangleMode := True; bStartup := False; MagnMagnification.Enabled := False; end; procedure TMainForm.mnFileNewClick(Sender: TObject); begin with NewImageForm do begin ShowModal; if ModalResult = mrOK then CreateNewImage(UpDown1.Position, UpDown2.Position, Color32(Panel1.Color)); v.iWidth := UpDown1.Position; v.iHeight := UpDown2.Position; end; //Application.Title := 'NEW'; //Timer1.Enabled := True; end; procedure TMainForm.Timer1Timer(Sender: TObject); begin if Timer2.Enabled = True then // Show the About Box like a startup screen AboutBox.Visible := True; //if menu = nil then //WindowState := wsMaximized; Timer1.Enabled := False; ktaza.FormPaint; end; procedure TMainForm.ClearRectangle; begin mnDeleteClick(Self); end; procedure TMainForm.DrawDefaultImage; begin with ImgView do begin Selection := nil; RBLayer := nil; Layers.Clear; Scale := 1; Bitmap.SetSize(v.iWidth, v.iHeight); Bitmap.Clear(gFillColor); //ScaleImage.Visible := not Bitmap.Empty; end; //ImgView.Bitmap.Pixel[j,i] := RGB(0,0,0); end; procedure TMainForm.draw_fractal; begin ktaza.draw_fractal; end; procedure TMainForm.AdjustCoords; begin MainForm.v.Radius_x := 2/MainForm.v.dMagnification; MainForm.v.Radius_y := 2/MainForm.v.dMagnification; v.CRMAX := v.CRMID + v.Radius_x; v.CRMIN := v.CRMID - v.Radius_x; v.CIMAX := v.CIMID + v.Radius_y; v.CIMIN := v.CIMID - v.Radius_y; v.rx_ratio := v.iWidth/v.iHeight; v.ry_ratio := v.iHeight/v.iWidth; v.rx_ratio := v.rx_ratio + (1-v.rx_ratio)/2; v.ry_ratio := v.ry_ratio + (1-v.ry_ratio)/2; v.CRMAX := v.CRMAX + (v.Radius_x * (v.rx_ratio) - v.Radius_x); v.CRMIN := v.CRMIN - (v.Radius_x * (v.rx_ratio) - v.Radius_x); v.CIMAX := v.CIMAX + (v.Radius_x * (v.ry_ratio) - v.Radius_y); v.CIMIN := v.CIMIN - (v.Radius_x * (v.ry_ratio) - v.Radius_y); end; ///////////////////////////////////////////////////////////////////// procedure TMainForm.CreateNewImage(AWidth, AHeight: Integer; FillColor: TColor32); begin gFillColor := FillColor; with ImgView do begin Selection := nil; RBLayer := nil; Layers.Clear; Scale := 1; Bitmap.SetSize(AWidth, AHeight); Bitmap.Clear(FillColor); //ScaleImage.Visible := not Bitmap.Empty; end; end; function TMainForm.CreatePositionedLayer: TPositionedLayer; var //P: TPoint; ALayer: TPositionedLayer; begin if Selection <> nil then begin ALayer := Selection; Selection := nil; ALayer.Free; end; // get coordinates of the center of viewport //with ImgView.GetViewportRect do //P := ImgView.ControlToBitmap(Point((Right + Left) div 2, (Top + Bottom) div 2)); R := ImgView.GetViewportRect; P.X := P.X - Round((R.Right - v.iWidth)*0.5); P.Y := P.Y - Round((R.Bottom - v.iHeight)*0.5); Result := TPositionedLayer.Create(ImgView.Layers); //Result.Location := FloatRect(P.X - 32, P.Y - 32, P.X + 32, P.Y + 32); Result.Location := FloatRect(P.X - v.iWidth/5, P.Y - v.iHeight/5, P.X + v.iWidth/5, P.Y + v.iHeight/5); Result.Scaled := True; Result.MouseEvents := True; Result.OnMouseDown := LayerMouseDown; end; function TMainForm.CreateNewPositionedLayer: TPositionedLayer; var P: TPoint; ALayer: TPositionedLayer; begin if Selection <> nil then begin ALayer := Selection; Selection := nil; ALayer.Free; end; // get coordinates of the center of viewport with ImgView.GetViewportRect do P := ImgView.ControlToBitmap(Point((Right + Left) div 2, (Top + Bottom) div 2)); Result := TPositionedLayer.Create(ImgView.Layers); //Result.Location := FloatRect(P.X - 64, P.Y - 64, P.X + 64, P.Y + 64); Result.Location := FloatRect(pxmin, pymin, pxmax, pymax); Result.Scaled := True; Result.MouseEvents := True; Result.OnMouseDown := LayerMouseDown; end; procedure TMainForm.CroppedClick(Sender: TObject); begin if Selection is TBitmapLayer then TBitmapLayer(Selection).Cropped := FormBitmapLayer.Cropped.Checked; end; procedure TMainForm.ShowHint(Sender: TObject); begin StatusBar1.SimpleText := Application.Hint; end; procedure TMainForm.UpdateMenus; begin mnLayersClick(Self); mnArrangeClick(Self); // Update scroll bars R := ImgView.GetViewportRect; if (v.iWidth > R.Right) or (v.iHeight > R.Bottom) then begin // show the scroll bars ImgView.ScrollBars.Size := 0; end else begin // hide the scroll bars ImgView.ScrollBars.Size := 1; end; if v.jul = 1 then begin JuliaMode1.Checked := True; JuliaMode2.Checked := True; JuliaButton.Down := True; end else begin JuliaMode1.Checked := False; JuliaMode2.Checked := False; JuliaButton.Down := False; end; if v.inverse = 0 then begin InsideOut1.Checked := False; InsideOut2.Checked := False; end else begin InsideOut1.Checked := True; InsideOut2.Checked := True; end; if Selection <> nil then begin ZoomButton1.Enabled := True; Zoom1.Enabled := True; ZoomIn1.Enabled := True; end else begin ZoomButton1.Enabled := False; Zoom1.Enabled := False; ZoomIn1.Enabled := False; end; Transform00.Checked := False; Transform01.Checked := False; Transform02.Checked := False; Transform03.Checked := False; Transform04.Checked := False; case v.nTransform of 0: Transform00.Checked := True; 1: Transform01.Checked := True; 2: Transform02.Checked := True; 3: Transform03.Checked := True; 4: Transform04.Checked := True; end; case v.nTransform of 0: Transform00.Checked := True; 1: Transform01.Checked := True; 2: Transform02.Checked := True; 3: Transform03.Checked := True; 4: Transform04.Checked := True; end; Render01.Checked := False; Render02.Checked := False; Render03.Checked := False; Render04.Checked := False; Render05.Checked := False; Render06.Checked := False; Render07.Checked := False; Render08.Checked := False; Render09.Checked := False; Render10.Checked := False; Render11.Checked := False; Render12.Checked := False; Render13.Checked := False; Render14.Checked := False; Render15.Checked := False; Render16.Checked := False; Render17.Checked := False; Render18.Checked := False; Render19.Checked := False; Render20.Checked := False; Render211.Checked := False; Render22.Checked := False; Render23.Checked := False; Render24.Checked := False; Render25.Checked := False; Render26.Checked := False; Render27.Checked := False; Render28.Checked := False; Render29.Checked := False; Render30.Checked := False; Render31.Checked := False; Render32.Checked := False; case v.render of 1: Render01.Checked := True; 2: Render02.Checked := True; 3: Render03.Checked := True; 4: Render04.Checked := True; 5: Render05.Checked := True; 6: Render06.Checked := True; 7: Render07.Checked := True; 8: Render08.Checked := True; 9: Render09.Checked := True; 10: Render10.Checked := True; 11: Render11.Checked := True; 12: Render12.Checked := True; 13: Render13.Checked := True; 14: Render14.Checked := True; 15: Render15.Checked := True; 16: Render16.Checked := True; 17: Render17.Checked := True; 18: Render18.Checked := True; 19: Render19.Checked := True; 20: Render20.Checked := True; 21: Render211.Checked := True; 22: Render22.Checked := True; 23: Render23.Checked := True; 24: Render24.Checked := True; 25: Render25.Checked := True; 26: Render26.Checked := True; 27: Render27.Checked := True; 28: Render28.Checked := True; 29: Render29.Checked := True; 30: Render30.Checked := True; 31: Render31.Checked := True; 32: Render32.Checked := True; end; Blend01.Checked := False; Blend02.Checked := False; Blend03.Checked := False; Blend04.Checked := False; Blend05.Checked := False; Blend06.Checked := False; case v.nBlendingMethod of 1: Blend01.Checked := True; 2: Blend02.Checked := True; 3: Blend03.Checked := True; 4: Blend04.Checked := True; 5: Blend05.Checked := True; 6: Blend06.Checked := True; end; RGB01Btn.Down := False; RGB02Btn.Down := False; RGB03Btn.Down := False; RGB04Btn.Down := False; RGB05Btn.Down := False; RGB06Btn.Down := False; case v.nColoringOrder of 1: RGB01Btn.Down := True; 2: RGB02Btn.Down := True; 3: RGB03Btn.Down := True; 4: RGB04Btn.Down := True; 5: RGB05Btn.Down := True; 6: RGB06Btn.Down := True; end; RGB01.Checked := False; RGB02.Checked := False; RGB03.Checked := False; RGB04.Checked := False; RGB05.Checked := False; RGB06.Checked := False; case v.nColoringOrder of 1: RGB01.Checked := True; 2: RGB02.Checked := True; 3: RGB03.Checked := True; 4: RGB04.Checked := True; 5: RGB05.Checked := True; 6: RGB06.Checked := True; end; T00Btn.Down := False; T01Btn.Down := False; T02Btn.Down := False; T03Btn.Down := False; T04Btn.Down := False; case v.nTransform of 0: T00Btn.Down := True; 1: T01Btn.Down := True; 2: T02Btn.Down := True; 3: T03Btn.Down := True; 4: T04Btn.Down := True; end; C01Btn.Down := False; C02Btn.Down := False; C03Btn.Down := False; C04Btn.Down := False; C05Btn.Down := False; C06Btn.Down := False; case v.nBlendingMethod of 1: C01Btn.Down := True; 2: C02Btn.Down := True; 3: C03Btn.Down := True; 4: C04Btn.Down := True; 5: C05Btn.Down := True; 6: C06Btn.Down := True; end; Rotate00.Checked := False; Rotate01.Checked := False; Rotate02.Checked := False; Rotate03.Checked := False; case MainForm.v.nRotation of 0: Rotate00.Checked := True; 1: Rotate01.Checked := True; 2: Rotate02.Checked := True; 3: Rotate03.Checked := True; end; end; procedure TMainForm.ImageInterpolateClick(Sender: TObject); const STRETCH_FILTER: array [Boolean] of TStretchFilter = (sfNearest, sfLinear); begin ImgView.Bitmap.StretchFilter := STRETCH_FILTER[ScaleImage.ImageInterpolate.Checked]; end; procedure TMainForm.LayerInterpolateClick(Sender: TObject); const STRETCH_FILTER: array [Boolean] of TStretchFilter = (sfNearest, sfLinear); begin if Selection is TBitmapLayer then begin TBitmapLayer(Selection).Bitmap.StretchFilter := STRETCH_FILTER[FormBitmapLayer.LayerInterpolate.Checked]; end; end; procedure TMainForm.LayerMouseDown(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Sender <> nil then Selection := TPositionedLayer(Sender); end; procedure TMainForm.LayerOpacityChange(Sender: TObject); begin if Selection is TBitmapLayer then TBitmapLayer(Selection).Bitmap.MasterAlpha := FormBitmapLayer.LayerOpacity.Position; end; procedure TMainForm.LayerRescaleClick(Sender: TObject); var T: TBitmap32; begin // resize the layer's bitmap to the size of the layer if Selection is TBitmapLayer then with TBitmapLayer(Selection) do begin T := TBitmap32.Create; T.Assign(Bitmap); with Rect(Location) do Bitmap.SetSize(Right - Left, Bottom - Top); T.StretchFilter := sfLinear; T.DrawMode := dmOpaque; T.DrawTo(Bitmap, Rect(0, 0, Bitmap.Width, Bitmap.Height)); T.Free; LayerResetScaleClick(Self); end; end; procedure TMainForm.LayerResetScaleClick(Sender: TObject); var L: TFloatRect; begin // resize the layer to the size of its bitmap if Selection is TBitmapLayer then with RBLayer, TBitmapLayer(Selection).Bitmap do begin L := Location; L.Right := L.Left + Width; L.Bottom := L.Top + Height; Location := L; Changed; end; end; procedure TMainForm.MagnChange(Sender: TObject); begin ImgView.Invalidate; end; procedure TMainForm.mnArrangeClick(Sender: TObject); var B: Boolean; begin B := Selection <> nil; mnBringFront.Enabled := B and (Selection.Index < ImgView.Layers.Count - 2); mnSendBack.Enabled := B and (Selection.Index > 0); mnLevelUp.Enabled := B and (Selection.Index < ImgView.Layers.Count - 2); mnLevelDown.Enabled := B and (Selection.Index > 0); mnScaled.Enabled := B; mnScaled.Checked := B and Selection.Scaled; mnDelete.Enabled := B; end; procedure TMainForm.mnDeleteClick(Sender: TObject); var ALayer: TPositionedLayer; begin if Selection <> nil then begin ALayer := Selection; Selection := nil; ALayer.Free; MagnMagnification.Enabled := False; end; // FormBitmapLayer.Visible := False; UpdateMenus; end; procedure TMainForm.mnFileOpenClick(Sender: TObject); begin with OpenPictureDialog1 do if Execute then OpenImage(FileName); end; procedure TMainForm.mnLayersClick(Sender: TObject); var B: Boolean; begin B := not ImgView.Bitmap.Empty; mnNewBitmapLayer.Enabled := B; mnNewBitmapRGBA.Enabled := B; //mnNewCustomLayer.Enabled := B; mnFlatten.Enabled := B and (ImgView.Layers.Count > 0); FlattenLayers1.Enabled := B and (ImgView.Layers.Count > 0); end; procedure TMainForm.mnMagnifierClick(Sender: TObject); var L: TPositionedLayer; begin if Selection = nil then begin L := CreatePositionedLayer; L.OnPaint := PaintMagnifierHandler; L.Tag := 2; Selection := L; end; end; procedure TMainForm.mnNewBitmapLayerClick(Sender: TObject); var B: TBitmapLayer; P: TPoint; W, H: Single; begin with OpenPictureDialog1 do if Execute then begin B := TBitmapLayer.Create(ImgView.Layers); with B do try Bitmap.LoadFromFile(FileName); Bitmap.DrawMode := dmBlend; with ImgView.GetViewportRect do P := ImgView.ControlToBitmap(Point((Right + Left) div 2, (Top + Bottom) div 2)); W := Bitmap.Width / 2; H := Bitmap.Height / 2; with ImgView.Bitmap do Location := FloatRect(P.X - W, P.Y - H, P.X + W, P.Y + H); Scaled := True; OnMouseDown := LayerMouseDown; except Free; raise; end; Selection := B; end; UpdateMenus; end; procedure TMainForm.mnNewBitmapRGBAClick(Sender: TObject); var B: TBitmapLayer; P: TPoint; Tmp: TBitmap32; W, H: Single; begin with RGBALoaderForm do begin ImgRGB.Bitmap.Delete; ImgRGB.Scale := 1; ImgAlpha.Bitmap.Delete; ImgAlpha.Scale := 1; ShowModal; if (ModalResult = mrOK) and not ImgRGB.Bitmap.Empty then begin B := TBitmapLayer.Create(ImgView.Layers); B.Bitmap := ImgRGB.Bitmap; B.Bitmap.DrawMode := dmBlend; if not ImgAlpha.Bitmap.Empty then begin Tmp := TBitmap32.Create; try Tmp.SetSize(B.Bitmap.Width, B.Bitmap.Height); ImgAlpha.Bitmap.DrawTo(Tmp, Rect(0, 0, Tmp.Width, Tmp.Height)); // combine Alpha into already loaded RGB colors IntensityToAlpha(B.Bitmap, Tmp); finally Tmp.Free; end; end; with ImgView.GetViewportRect do P := ImgView.ControlToBitmap(Point((Right + Left) div 2, (Top + Bottom) div 2)); with B do begin W := Bitmap.Width / 2; H := Bitmap.Height / 2; with ImgView.Bitmap do Location := FloatRect(P.X - W, P.Y - H, P.X + W, P.Y + H); Scaled := True; OnMouseDown := LayerMouseDown; end; Selection := B; end; end; UpdateMenus; end; procedure TMainForm.mnReorder(Sender: TObject); begin // note that the top-most layer is occupied with the rubber-banding layer if Selection <> nil then case TMenuItem(Sender).Tag of 1: // Bring to front, do not use BringToFront here, see note above Selection.Index := ImgView.Layers.Count - 2; 2: Selection.SendToBack; 3: Selection.Index := Selection.Index + 1; // up one level 4: Selection.Index := Selection.Index - 1; // down one level end; end; (* procedure TMainForm.mnSimpleDrawingClick(Sender: TObject); var L: TPositionedLayer; begin L := CreatePositionedLayer; L.OnPaint := PaintSimpleDrawingHandler; L.Tag := 1; Selection := L; end; *) procedure TMainForm.PaintMagnifierHandler(Sender: TObject; Buffer: TBitmap32); var Rotation: Single; R: TRect; T: TAffineTransformation; B: TBitmap32; W2, H2: Single; //I: Integer; begin if Sender is TPositionedLayer then with TPositionedLayer(Sender) do begin Magnification := Power(10, (MagnMagnification.Position / 50)); Rotation := -FormMagn.MagnRotation.Position; DstRect := GetAdjustedLocation; R := Rect(DstRect); B := TBitmap32.Create; try with R do begin B.SetSize(Right - Left, Bottom - Top); W2 := (Right - Left) / 2; H2 := (Bottom - Top) / 2; end; SrcRect := DstRect; with SrcRect do begin Left := Left - H2; Right := Right + H2; Top := Top - W2; Bottom := Bottom + W2; end; T := TAffineTransformation.Create; try T.SrcRect := SrcRect; T.Translate(-R.Left, -R.Top); T.Translate(-W2, -H2); T.Scale(Magnification, Magnification); T.Rotate(0, 0, Rotation); T.Translate(W2, H2); if FormMagn.MagnInterpolate.Checked then begin Buffer.BeginUpdate; Buffer.StretchFilter := sfLinear; Transform(B, Buffer, T); Buffer.StretchFilter := sfNearest; Buffer.EndUpdate; end else Transform(B, Buffer, T); B.ResetAlpha; B.DrawMode := dmBlend; B.MasterAlpha := FormMagn.MagnOpacity.Position; B.DrawTo(Buffer, R); //ImgView.Bitmap.DrawTo(Buffer, Rect(0, 0, 320-1, 240-1)); // draw frame (* for I := 0 to 4 do begin with R do Buffer.RaiseRectTS(Left, Top, Right, Bottom, 35 - I * 8); InflateRect(R, -1, -1); end; *) finally T.Free; end; finally B.Free; end; end; end; (* procedure TMainForm.PaintSimpleDrawingHandler(Sender: TObject; Buffer: TBitmap32); var Cx, Cy: Single; W2, H2: Single; I: Integer; begin if Sender is TPositionedLayer then with TPositionedLayer(Sender).GetAdjustedLocation do begin W2 := (Right - Left) / 2; H2 := (Bottom - Top) / 2; Cx := Left + W2; Cy := Top + H2; Buffer.PenColor := clRed32; Buffer.MoveToF(Cx,Cy); for I := 0 to 240 do begin Buffer.LineToFS(Cx + W2 * I / 200 * Cos(I / 8), Cy + H2 * I / 200 * Sin(I / 8)); end; end; end; *) procedure TMainForm.ScaleComboChange(Sender: TObject); var Str: string; I: Integer; begin Str := ScaleImage.ScaleCombo.Text; Str := StringReplace(Str, '%', '', [rfReplaceAll]); Str := StringReplace(Str, ' ', '', [rfReplaceAll]); if Str = '' then Exit; I := StrToIntDef(Str, -1); if (I < 1) or (I > 2000) then I := Round(ImgView.Scale * 100) else ImgView.Scale := I / 100; ScaleImage.ScaleCombo.Text := IntToStr(I) + '%'; ScaleImage.ScaleCombo.SelStart := Length(ScaleImage.ScaleCombo.Text) - 1; end; procedure TMainForm.SetSelection(Value: TPositionedLayer); begin if Value <> FSelection then begin if RBLayer <> nil then begin RBLayer.ChildLayer := nil; RBLayer.LayerOptions := LOB_NO_UPDATE; //pnlBitmapLayer.Visible := False; //FormBitmapLayer.Visible := False; //pnlMagn.Visible := False; ImgView.Invalidate; end; FSelection := Value; if Value <> nil then begin if RBLayer = nil then begin RBLayer := TRubberBandLayer.Create(ImgView.Layers); RBLayer.MinHeight := 1; RBLayer.MinWidth := 1; end else RBLayer.BringToFront; RBLayer.ChildLayer := Value; RBLayer.LayerOptions := LOB_VISIBLE or LOB_MOUSE_EVENTS or LOB_NO_UPDATE; RBLayer.OnResizing := RBResizing; if Value is TBitmapLayer then with TBitmapLayer(Value) do begin FormBitmapLayer.Visible := True; FormBitmapLayer.LayerOpacity.Position := Bitmap.MasterAlpha; FormBitmapLayer.LayerInterpolate.Checked := Bitmap.StretchFilter = sfLinear; end else if Value.Tag = 2 then begin // tag = 2 for magnifiers //FormMagn.Visible := True; end; end; end; end; procedure TMainForm.WMEraseBkgnd(var Msg: TMessage); begin // disable form background cleaning Msg.Result := 1; end; procedure TMainForm.mnScaledClick(Sender: TObject); begin if Selection <> nil then Selection.Scaled := not Selection.Scaled; RBLayer.Scaled := Selection.Scaled; end; procedure TMainForm.ImgViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); begin Shift_Sav := Shift; if Button = mbLeft then begin if (MainForm.v.jul = 1) and (MainForm.v.jul_save = 0) then begin MainForm.v.CRMID_JUL := cxp; MainForm.v.CIMID_JUL := cyp; (* if Form4.Visible = True then begin Form4.JuliaX.Value := MainForm.v.CRMID_JUL; Form4.JuliaY.Value := MainForm.v.CIMID_JUL; end; *) ClearRectangle; ResetCoordinates; end else begin R := ImgView.GetViewportRect; P := Point(X, Y); if (Selection = nil) and ((Selection is TBitmapLayer) = False) then begin MagnMagnification.Position := 10; MagnMagnification.Enabled := True; mnMagnifierClick(Self); end; end; end; end; procedure TMainForm.ImgViewPaintStage(Sender: TObject; Buffer: TBitmap32; StageNum: Cardinal); const Colors: array [Boolean] of TColor32 = ($00000000, $FF404060); //Colors: array [Boolean] of TColor32 = ($FFFFFFFF, $FFB0B0B0); var //W: Integer; I, J: Integer; OddY: Integer; begin with ImgView.Buffer do begin Clear; P32 := PixelPtr[0, 0]; for J := 0 to Height - 1 do begin OddY := (J shr 3) and $1; for I := 0 to Width - 1 do begin P32^ := Colors[(I shr 3) and $1 = OddY]; Inc(P32); end; end; end; end; procedure TMainForm.RBResizing(Sender: TObject; const OldLocation: TFloatRect; var NewLocation: TFloatRect; DragState: TDragState; Shift: TShiftState); var w, h, cx, cy: Single; nw, nh: Single; begin if DragState = dsMove then Exit; // we are interested only in scale operations if Shift = [] then Exit; // special processing is not required if ssCtrl in Shift then begin { make changes symmetrical } with OldLocation do begin cx := (Left + Right) / 2; cy := (Top + Bottom) / 2; w := Right - Left; h := Bottom - Top; end; with NewLocation do begin nw := w / 2; nh := h / 2; case DragState of dsSizeL: nw := cx - Left; dsSizeT: nh := cy - Top; dsSizeR: nw := Right - cx; dsSizeB: nh := Bottom - cy; dsSizeTL: begin nw := cx - Left; nh := cy - Top; end; dsSizeTR: begin nw := Right - cx; nh := cy - Top; end; dsSizeBL: begin nw := cx - Left; nh := Bottom - cy; end; dsSizeBR: begin nw := Right - cx; nh := Bottom - cy; end; end; if nw < 2 then nw := 2; if nh < 2 then nh := 2; Left := cx - nw; Right := cx + nw; Top := cy - nh; Bottom := cy + nh; end; end; end; procedure TMainForm.mnFlattenClick(Sender: TObject); var B: TBitmap32; W, H: Integer; i, j: Integer; begin { deselect everything } Selection := nil; W := ImgView.Bitmap.Width; H := ImgView.Bitmap.Height; { Create a new bitmap to store a flattened image } B := TBitmap32.Create; try B.SetSize(W, H); ImgView.PaintTo(B, Rect(0, 0, W, H)); { destroy all the layers of the original image... } ImgView.Layers.Clear; RBLayer := nil; // note that RBLayer reference is destroyed here as well. // The rubber band will be recreated during the next // SetSelection call. Alternatively, you can delete // all the layers except the rubber band. { ...and overwrite it with the flattened one } ImgView.Bitmap := B; { ...remove the layer window... } FormBitmapLayer.Visible := False; finally B.Free; end; PBits := ImgView.Bitmap.PixelPtr[0,0]; for i := 0 to v.iHeight - 1 do begin for j := 0 to v.iWidth - 1 do begin tc := PBits^ and $FFFFFF; red := (tc shr 16) and $FF; grn := (tc shr 8) and $FF; blu := tc and $FF; //red := 255; //grn := 0; //blu := 0; //tc := RGB(red, grn, blu); Inc(PBits); ImgView.Bitmap.Pixel[j, i] := RGB(blu,grn,red) and $FFFFFF; end; end; end; //////////////////////////////////////////////////////////////////////// procedure TMainForm.ResetButtonClick(Sender: TObject); begin ktaza.Reset1Click(Self); end; procedure TMainForm.Help2Click(Sender: TObject); var ex: String; p_: Integer; R: TRegistry; Begin HelpFileName := ExtractFilePath(Application.ExeName) + 'help\index.html'; if FileExists(HelpFileName) then begin R:=TRegistry.Create; try R.RootKey:=HKEY_CLASSES_ROOT; R.OpenKey('http\shell\open\command', False); ex:=R.ReadString(''); // p_:=Pos('%1',ex); If p_>0 Then ex:=Copy(ex,1,p_-1); WinExec(PChar(ex+' '+ HelpFileName), SW_SHOWNORMAL); finally R.Free; ReleaseCapture; end; end else Showmessage('file does not exist: ' + HelpFileName); end; procedure TMainForm.About1Click(Sender: TObject); begin if AboutBox.Visible = True then AboutBox.Visible := False else AboutBox.Visible := True; end; procedure TMainForm.Timer3UpdateFractalTimer(Sender: TObject); begin ImgView.Invalidate; if bValid = True then StatusBar1.SimpleText := 'Busy... ' + Format ('%d', [PYGlobal]); end; procedure TMainForm.XYSizeMenuClick(Sender: TObject); begin if XYSize1.Visible = False then begin XYSize1.SpinWidth.Value := v.iWidth; XYSize1.SpinHeight.Value := v.iHeight; XYSize1.Visible := True; end else begin XYSize1.Visible := False; end; end; procedure TMainForm.Zoom1Click(Sender: TObject); begin v.CRMIN := v.CRMIN_NEW; v.CRMAX := v.CRMAX_NEW; v.CIMIN := v.CIMIN_NEW; v.CIMAX := v.CIMAX_NEW; v.CRMID := ((v.CRMAX - v.CRMIN) / 2.0) + v.CRMIN; v.CIMID := ((v.CIMAX - v.CIMIN) / 2.0) + v.CIMIN; v.dMagnification := v.dMag_new; //if Selection <> nil then //Selection.Bi //Selection.Bitmap.DrawTo(ImgView, Rect(0, 0, ImgView.Width, ImgView.Height)); if Selection <> nil then SrcRect := Selection.GetAdjustedLocation; with SrcTRect do begin Left := Round(SrcRect.Left)+2; Right := Round(SrcRect.Right)-2; Top := Round(SrcRect.Top); Bottom := Round(SrcRect.Bottom-2); end; with DstTRect do begin Left := 0; Right := v.iWidth; Top := 0; Bottom := v.iHeight; end; R := ImgView.GetViewportRect; with SrcTRect do begin if (Left > R.Left) and (Right < R.Right) and (Top > R.Top) and (Bottom < R.Bottom) then StretchTransfer(ImgView.Bitmap, DstTRect, ImgView.Buffer, SrcTRect, sfSpline, dmBlend, nil) end; //StretchTransfer(ImgView.Bitmap, DstTRect, ImgView.Buffer, SrcTRect, sfSpline, dmBlend, nil); UpdateFractal; end; procedure TMainForm.ImgViewMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); var rb_center_x, rb_center_y: Double; rb_avg, dim_avg: Double; dim_width, dim_height: Double; sxmin, sxmax, symin, symax: Double; x_size, y_size: Double; begin if Button = mbLeft then begin if not ((v.jul = 1) and (v.jul_save = 0)) then begin if (Selection <> nil) and (not (Selection is TBitmapLayer)) then begin Image1_SelectionLeft := Round(Selection.Location.Left); Image1_SelectionTop := Round(Selection.Location.Top); Image1_SelectionWidth := Round(Selection.Location.Right - Selection.Location.Left); Image1_SelectionHeight := Round(Selection.Location.Bottom - Selection.Location.Top); rb_center_x := (Image1_SelectionWidth / 2) + Image1_SelectionLeft; rb_center_y := (Image1_SelectionHeight / 2) + Image1_SelectionTop; // calculate the average width & height rb_avg := (Image1_SelectionWidth + Image1_SelectionHeight) / 2; dim_width := v.iWidth; dim_height := v.iHeight; dim_avg := (v.iWidth + v.iHeight) / 2; // Calculate transformed points Image1_SelectionWidth := Round(rb_avg * (dim_width / dim_avg)); Image1_SelectionLeft := Round(rb_center_x - rb_avg * (dim_width / dim_avg) / 2.0); Image1_SelectionHeight := Round(rb_avg * (dim_height / dim_avg)); Image1_SelectionTop := Round(rb_center_y - rb_avg * (dim_height / dim_avg) / 2.0); pxmin := Image1_SelectionLeft; pymin := Image1_SelectionTop; pxmax := Image1_SelectionLeft + Image1_SelectionWidth; pymax := Image1_SelectionTop + Image1_SelectionHeight; Selection := CreateNewPositionedLayer; Selection.OnPaint := PaintMagnifierHandler; Selection.Tag := 2; ////////////////////////////////////////////////////// // scale the screen coordinates sxmin := Image1_SelectionLeft / dim_width; sxmax := (Image1_SelectionLeft + Image1_SelectionWidth) / dim_width; symin := Image1_SelectionTop / dim_height; symax := (Image1_SelectionTop + Image1_SelectionHeight) / dim_height; x_size := v.CRMAX - v.CRMIN; y_size := v.CIMAX - v.CIMIN; v.CRMIN_NEW := x_size * sxmin + v.CRMIN; v.CRMAX_NEW := x_size * sxmax + v.CRMIN; v.CIMIN_NEW := y_size * symin + v.CIMIN; v.CIMAX_NEW := y_size * symax + v.CIMIN; v.CRMID_OLD := v.CRMID; v.CIMID_OLD := v.CIMID; v.CRMID_NEW := ((v.CRMAX_NEW - v.CRMIN_NEW) / 2.0) + v.CRMIN_NEW; v.CIMID_NEW := ((v.CIMAX_NEW - v.CIMIN_NEW) / 2.0) + v.CIMIN_NEW; // Calculate the Magnification (2 / average of width & length) v.dMag_new := ((Abs(v.CRMAX_NEW - v.CRMIN_NEW) / 2) + (Abs(v.CIMAX_NEW - v.CIMIN_NEW) / 2)) / 2; if v.dMag_new <> 0 then v.dMag_new := (1 / v.dMag_new) * 2 else ShowMessage('why is dMag_New = 0 ?'); if Magnification = 0 then ShowMessage('why is Magnification = 0 ?'); // Multiply by the Zoom Rectangle Magnification v.dMag_new := v.dMag_new * Magnification; end; end; if (not bRectangleMode) or ((MainForm.v.jul = 1) and (MainForm.v.jul_save = 0)) then begin Zoom1Click(Self); bRectangleMode := True; JuliaButton.Caption := 'M'; JuliaButton.Hint := 'Mandel Mode'; end; end; UpdateMenus; end; procedure TMainForm.OpenImage(const FileName: string); var i, j: Integer; begin with ImgView do try Selection := nil; RBLayer := nil; Layers.Clear; Scale := 1; Bitmap.LoadFromFile(FileName); finally //ScaleImage.Visible := not Bitmap.Empty; end; PBits := ImgView.Bitmap.PixelPtr[0,0]; for i := 0 to v.iHeight - 1 do begin for j := 0 to v.iWidth - 1 do begin tc := PBits^ and $FFFFFF; Inc(PBits); end; end; end; procedure TMainForm.SaveToFileClick(Sender: TObject); var FileExt: string[4]; jp: TJpegImage; //Requires the "jpeg" unit added to "uses" clause. i,j: Integer; begin SavePictureDialog1.FileName := ExtractFileName(Caption); if SavePictureDialog1.Execute then begin // Transfer the ImgView.Bitmap to v.bitmap1 v.bitmap1 := Graphics.TBitmap.Create; v.bitmap1.PixelFormat := pf24bit; v.bitmap1.Height := v.iHeight; v.bitmap1.Width := v.iWidth; PBits := ImgView.Bitmap.PixelPtr[0,0]; for i := 0 to v.iHeight - 1 do begin for j := 0 to v.iWidth - 1 do begin tc := PBits^; red := (tc shr 16) and $FF; grn := (tc shr 8) and $FF; blu := tc and $FF; v.bitmap1.Canvas.Pixels[j,i] := RGB(red, grn, blu) and $FFFFFF; Inc(PBits); end; end; v.bitmap1.FreeImage; //////////////////////////////////////////////////////////// FileExt := AnsiUpperCase(ExtractFileExt(SavePictureDialog1.Filename)); if (FileExt = '.JPG') then begin jp := TJpegImage.Create; jp.CompressionQuality := compress_ratio; jp.ProgressiveEncoding := bProgressive; try with jp do begin Assign(v.bitmap1); SaveToFile(SavePictureDialog1.FileName) end; finally jp.Free; end; end else begin if (fileExt = '.BMP') then begin v.bitmap1.SaveToFile(SavePictureDialog1.FileName); end else ShowMessage('Unkown File extension: = ' + FileExt); end; Caption := ExtractFileName(SavePictureDialog1.FileName); // create a parameter file strParamName := ExtractFileName(Caption); Delete(strParamName, Length(strParamName)-2, 3); // created the parameter filename strParamName := strParamName + 'vra'; //Identify the filename and type as OutFile AssignFile(OutFile, strParamName); // Open and create the param file Rewrite(OutFile); // Write the parameter info // Write the DLL filenames WriteLn(OutFile, constVersionNumber); // Write the formula, render, and filter numbers WriteLn(OutFile, IntToStr(v.formula)); WriteLn(OutFile, IntToStr(v.render)); WriteLn(OutFile, IntToStr(0)); // Write the Titles WriteLn(OutFile, v.StrTitle); WriteLn(OutFile, v.StrDescription); WriteLn(OutFile, 'reservedtitle'); // Write the magnification WriteLn(OutFile, FloatToStr(v.dMagnification)); // Write CRMID, and CRMAX WriteLn(OutFile, FloatToStr(v.CRMID)); WriteLn(OutFile, FloatToStr(v.CRMAX)); // Write CIMID, and CIMAX WriteLn(OutFile, FloatToStr(v.CIMID)); WriteLn(OutFile, FloatToStr(v.CIMAX)); // Write color parameters WriteLn(OutFile, FloatToStr(v.dRedStart)); WriteLn(OutFile, FloatToStr(v.dGrnStart)); WriteLn(OutFile, FloatToStr(v.dBluStart)); WriteLn(OutFile, FloatToStr(v.dRedStep)); WriteLn(OutFile, FloatToStr(v.dGrnStep)); WriteLn(OutFile, FloatToStr(v.dBluStep)); // Write the Fractal Type WriteLn(OutFile, IntToStr(v.FractalType)); // Write the Max Iterations WriteLn(OutFile, IntToStr(v.Maxit)); // Write the Blending Method WriteLn(OutFile, IntToStr(v.nBlendingMethod)); // Write the Coloring Order WriteLn(OutFile, IntToStr(v.nColoringOrder)); // Write dFactor3, 4 and 5 WriteLn(OutFile, FloatToStr(v.dFactor3)); WriteLn(OutFile, FloatToStr(v.dFactor4)); WriteLn(OutFile, FloatToStr(v.dFactor5)); // write dStrands WriteLn(OutFile, FloatToStr(v.dStrands)); // Write the Bailout WriteLn(OutFile, IntToStr(v.Bailout)); // Write the jul variable WriteLn(OutFile, IntToStr(v.jul)); // Write the jul_save variable WriteLn(OutFile, IntToStr(v.jul_save)); // Write the inverse variable WriteLn(OutFile, IntToStr(v.inverse)); // write CRMID_JUL WriteLn(OutFile, FloatToStr(v.CRMID_JUL)); // write CIMID_JUL WriteLn(OutFile, FloatToStr(v.CIMID_JUL)); // Write the nRotation variable WriteLn(OutFile, IntToStr(v.nRotation)); // Write color extra parameters WriteLn(OutFile, FloatToStr(v.dRedSaturate)); WriteLn(OutFile, FloatToStr(v.dGrnSaturate)); WriteLn(OutFile, FloatToStr(v.dBluSaturate)); WriteLn(OutFile, FloatToStr(v.dRedOffset)); WriteLn(OutFile, FloatToStr(v.dGrnOffset)); WriteLn(OutFile, FloatToStr(v.dBluOffset)); // Write the lmapping variable WriteLn(OutFile, IntToStr(v.lmapping)); // Write the derivative variable WriteLn(OutFile, IntToStr(v.derivative)); // Write the transform variable WriteLn(OutFile, IntToStr(v.nTransform)); // Write the ti_power variable WriteLn(OutFile, FloatToStr(v.ti_power)); //////////////////////////////////////////////////////// // additional parameters for atriatix // Write the magnification1 WriteLn(OutFile, FloatToStr(v.dMagnification1)); // Write CRMID, and CRMAX WriteLn(OutFile, FloatToStr(v.CRMID1)); WriteLn(OutFile, FloatToStr(v.CRMAX1)); // Write CIMID, and CIMAX WriteLn(OutFile, FloatToStr(v.CIMID1)); WriteLn(OutFile, FloatToStr(v.CIMAX1)); // Write dFactor1, 2 and RandomFactor WriteLn(OutFile, FloatToStr(v.dFactor1)); WriteLn(OutFile, FloatToStr(v.dFactor2)); WriteLn(OutFile, FloatToStr(v.RandomFactor)); // Write the bool variables if v.bSqrt then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); // write out the coefficiants i := 1; while (i <= 60) do begin WriteLn(OutFile, FloatToStr(v.af[i])); WriteLn(OutFile, FloatToStr(v.bf[i])); inc(i); end; // Write Gumowski - Mira variables WriteLn(OutFile, FloatToStr(v.AA_Initial)); WriteLn(OutFile, FloatToStr(v.BB)); // Write the bool variables if v.bColorMix then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); // Write the bool variables if v.bExpansion then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); // Write the bool variables if v.bModulas then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); // write the X and Y parameters //WriteLn(OutFile, FloatToStr(v.cx)); //WriteLn(OutFile, FloatToStr(v.cy)); if v.bNone then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bLinear then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bSinusoidal then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bSpherical then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bSwirl then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bHorseshoe then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bPolar then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bBent then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bInversion then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); if v.bAtriatix then WriteLn(OutFile, IntToStr(1)) else WriteLn(OutFile, IntToStr(0)); // Write Atriatix color parameters WriteLn(OutFile, FloatToStr(v.dRedStep1)); WriteLn(OutFile, FloatToStr(v.dGrnStep1)); WriteLn(OutFile, FloatToStr(v.dBluStep1)); CloseFile(OutFile); //ShowMessage('Parameter filename = ' + strParamName + ' len= ' + IntToStr(Length(strParamName))); end; end; procedure TMainForm.JPEGOptions1Click(Sender: TObject); begin if JPGUnit.Visible = True then begin JPGUnit.Visible := False; end else begin JPGUnit.Visible := True; JPGUnit.JpegQuality.Value := MainForm.compress_ratio; JPGUnit.ProgressiveBox.Checked := MainForm.bProgressive; end; end; procedure TMainForm.LoadFromParameterFile1Click(Sender: TObject); begin if OpenDialog1.Execute then begin Application.Title := 'PARAM'; Caption := OpenDialog1.FileName; Timer1.Enabled := True; end; end; procedure TMainForm.StopDrawing1Click(Sender: TObject); begin v.Abort_Draw := True; end; procedure TMainForm.Formulas1Click(Sender: TObject); begin if ListForm.Visible = True then begin ListForm.Visible := False; end else begin pData := @MainForm.v; ListForm.UpdateListView(pData); ListForm.Visible := True; end; end; procedure TMainForm.Parameters1Click(Sender: TObject); begin if Params1.Visible = True then begin Params1.Visible := False; end else begin Params1.SpinMaxIteration.Value := v.Maxit; Params1.SpinPower.Value := v.ti_power; Params1.dFactor4.Value := v.dFactor4; Params1.dFactor5.Value := v.dFactor5; Params1.dStrands.Value := v.dStrands; Params1.Visible := True; end; end; procedure TMainForm.Timer2Timer(Sender: TObject); begin // initialize timer to about 6000 Timer2.Enabled := False; AboutBox.Visible := False; //WindowState := wsMaximized; //Invalidate; end; procedure TMainForm.Colors1Click(Sender: TObject); begin if ColorForm.Visible = True then begin ColorForm.Visible := False; end else begin ColorForm.RedStep.Value := v.dRedStep; ColorForm.GrnStep.Value := v.dGrnStep; ColorForm.BluStep.Value := v.dBluStep; ColorForm.RedStart.Value := v.dRedStart; ColorForm.GrnStart.Value := v.dGrnStart; ColorForm.BluStart.Value := v.dBluStart; ColorForm.RedSaturate.Value := v.dRedSaturate; ColorForm.GrnSaturate.Value := v.dGrnSaturate; ColorForm.BluSaturate.Value := v.dBluSaturate; ColorForm.RedOffset.Value := v.dRedOffset; ColorForm.GrnOffset.Value := v.dGrnOffset; ColorForm.BluOffset.Value := v.dBluOffset; ColorForm.dFactor3.Value := v.dFactor3; ColorForm.RedBar1.Position := round(ColorForm.RedStart.Value); ColorForm.GreenBar1.Position := round(ColorForm.GrnStart.Value); ColorForm.BlueBar1.Position := round(ColorForm.BluStart.Value); ColorForm.RedBarSaturate.Position := round(ColorForm.RedSaturate.Value); ColorForm.GrnBarSaturate.Position := round(ColorForm.GrnSaturate.Value); ColorForm.BluBarSaturate.Position := round(ColorForm.BluSaturate.Value); ColorForm.Visible := True; ColorForm.ColorTimer.Enabled := True; end; end; procedure TMainForm.Blend01Click(Sender: TObject); begin v.nBlendingMethod := 1; ChildApplyColors(Self); end; procedure TMainForm.Blend02Click(Sender: TObject); begin v.nBlendingMethod := 2; ChildApplyColors(Self); end; procedure TMainForm.Blend03Click(Sender: TObject); begin v.nBlendingMethod := 3; ChildApplyColors(Self); end; procedure TMainForm.Blend04Click(Sender: TObject); begin v.nBlendingMethod := 4; ChildApplyColors(Self); end; procedure TMainForm.Blend05Click(Sender: TObject); begin v.nBlendingMethod := 5; ChildApplyColors(Self); end; procedure TMainForm.Blend06Click(Sender: TObject); begin v.nBlendingMethod := 6; ChildApplyColors(Self); end; /////////////////////////// procedure TMainForm.Transform00Click(Sender: TObject); begin v.nTransform := 0; UpdateFractal; end; procedure TMainForm.Transform01Click(Sender: TObject); begin v.nTransform := 1; UpdateFractal; end; procedure TMainForm.Transform02Click(Sender: TObject); begin v.nTransform := 2; UpdateFractal; end; procedure TMainForm.Transform03Click(Sender: TObject); begin v.nTransform := 3; UpdateFractal; end; procedure TMainForm.Transform04Click(Sender: TObject); begin v.nTransform := 4; UpdateFractal; end; procedure TMainForm.InsideOut1Click(Sender: TObject); begin if MainForm.v.Inverse = 0 then MainForm.v.Inverse := 1 else MainForm.v.Inverse := 0; UpdateFractal; end; procedure TMainForm.AbortButtonClick(Sender: TObject); begin v.Abort_Draw := True; bValid := False; end; procedure TMainForm.JuliaButtonClick(Sender: TObject); begin if v.jul = 0 then begin v.jul := 1; v.jul_save := 0; bRectangleMode := False; ClearRectangle; end else begin v.jul := 0; v.jul_save := 0; bRectangleMode := True; JuliaButton.Caption := 'J'; JuliaButton.Hint := 'Julia Mode'; ResetCoordinates; UpdateFractal; end; end; procedure TMainForm.ImgViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); begin //X := Round(X-Round(ClientWidth-MainForm.v.iWidth)*0.5); //Y := Round(Y-Round(ClientHeight-MainForm.v.iHeight)*0.5); if v.iWidth <> 0 then begin R := ImgView.GetViewportRect; P := Point(X, Y); P.X := P.X - Round((R.Right - v.iWidth)*0.5); P.Y := P.Y - Round((R.Bottom - v.iHeight)*0.5); ///////////////////////////////////////////////////////////// ldx := (xI - xO) / v.iWidth; // compute size of pixels ldy := (yI - yO) / v.iHeight; cxp := xO + P.X * ldx; // calculate coordinate at pixel cyp := yO + P.Y * ldy; StatusBar1.SimpleText := Format('Magnification = %f, cx=%f, cy=%f', [v.dMagnification,cxp,cyp]); end; if (v.jul = 1) and (v.jul_save = 0) then begin ImgView.Cursor := crHandPoint; end else begin ImgView.Cursor := crCross; end; if Selection <> nil then begin if Selection.HitTest(X, Y) = True then begin ImgView.Cursor := crSizeAll; end; end; end; procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if (v.Abort_Draw = True) and (bValid = False) then begin //ShowMessage('closing'); Timer1.Enabled := False; Timer2.Enabled := False; Timer3UpdateFractal.Enabled := False; if v.hDLLHandle <> 0 then FreeLibrary(MainForm.v.hDLLHandle); Selection := nil; RBLayer := nil; end else begin //ShowMessage('please stop drawing before closing'); v.Abort_Draw := True; end; end; procedure TMainForm.ScaleImage1Click(Sender: TObject); begin if ScaleImage.Visible = True then ScaleImage.Visible := False else ScaleImage.Visible := True; end; procedure TMainForm.ZoomMagnificationClick(Sender: TObject); begin if FormMagn.Visible = True then FormMagn.Visible := False else FormMagn.Visible := True; end; procedure TMainForm.Draw1Click(Sender: TObject); begin UpdateFractal; end; procedure TMainForm.exitBitBtnClick(Sender: TObject); begin end; /////////////////////////////////////////////////// procedure TMainForm.R160x120Click(Sender: TObject); begin XYSize1.Visible := False; v.iWidth := 160; v.iHeight := 120; ktaza.TP01Click(Self); end; procedure TMainForm.R256x256Click(Sender: TObject); begin XYSize1.Visible := False; v.iWidth := 256; v.iHeight := 256; ktaza.TP01Click(Self); end; procedure TMainForm.R320x240Click(Sender: TObject); begin XYSize1.Visible := False; v.iWidth := 320; v.iHeight := 240; ktaza.TP01Click(Self); end; procedure TMainForm.R640x480Click(Sender: TObject); begin XYSize1.Visible := False; v.iWidth := 640; v.iHeight := 480; ktaza.TP01Click(Self); end; procedure TMainForm.R800x600Click(Sender: TObject); begin XYSize1.Visible := False; v.iWidth := 800; v.iHeight := 600; ktaza.TP01Click(Self); end; procedure TMainForm.R1024x768Click(Sender: TObject); begin XYSize1.Visible := False; v.iWidth := 1024; v.iHeight := 768; ktaza.TP01Click(Self); end; ///////////////////////////////////////////////// procedure TMainForm.RGB01Click(Sender: TObject); begin v.nColoringOrder := 1; ChildApplyColors(Self); end; procedure TMainForm.RGB02Click(Sender: TObject); begin v.nColoringOrder := 2; ChildApplyColors(Self); end; procedure TMainForm.RGB03Click(Sender: TObject); begin v.nColoringOrder := 3; ChildApplyColors(Self); end; procedure TMainForm.RGB04Click(Sender: TObject); begin v.nColoringOrder := 4; ChildApplyColors(Self); end; procedure TMainForm.RGB05Click(Sender: TObject); begin v.nColoringOrder := 5; ChildApplyColors(Self); end; procedure TMainForm.RGB06Click(Sender: TObject); begin v.nColoringOrder := 6; ChildApplyColors(Self); end; procedure TMainForm.DetailsSpinEditChange(Sender: TObject); begin Timer4.Enabled := True; end; ///////////////////////////////////////// procedure TMainForm.F01BtnClick(Sender: TObject); begin v.Formula := 1; UpdateFractal; end; procedure TMainForm.F02BtnClick(Sender: TObject); begin v.Formula := 2; UpdateFractal; end; procedure TMainForm.F03BtnClick(Sender: TObject); begin v.Formula := 3; UpdateFractal; end; procedure TMainForm.F04BtnClick(Sender: TObject); begin v.Formula := 4; UpdateFractal; end; procedure TMainForm.F05BtnClick(Sender: TObject); begin v.Formula := 5; UpdateFractal; end; procedure TMainForm.F06BtnClick(Sender: TObject); begin v.Formula := 6; UpdateFractal; end; procedure TMainForm.F07BtnClick(Sender: TObject); begin v.Formula := 7; UpdateFractal; end; procedure TMainForm.F08BtnClick(Sender: TObject); begin v.Formula := 8; UpdateFractal; end; procedure TMainForm.F09BtnClick(Sender: TObject); begin v.Formula := 9; UpdateFractal; end; procedure TMainForm.F10BtnClick(Sender: TObject); begin v.Formula := 10; UpdateFractal; end; procedure TMainForm.F11BtnClick(Sender: TObject); begin v.Formula := 11; UpdateFractal; end; procedure TMainForm.F12BtnClick(Sender: TObject); begin v.Formula := 12; UpdateFractal; end; //////////////////////////////////////////// procedure TMainForm.Timer4Timer(Sender: TObject); begin Timer4.Enabled := False; try v.Maxit := Round(DetailsSpinEdit.Value); except v.Maxit := 32; end; UpdateFractal; end; procedure TMainForm.IntensityRxSpinEditChange(Sender: TObject); begin if (MainForm.bValid = False) and (bStartup = True) then begin Timer5.Enabled := True; end; end; procedure TMainForm.Timer5Timer(Sender: TObject); begin Timer5.Enabled := False; v.dFactor3 := IntensityRxSpinEdit.Value; ChildApplyColors(Self); end; ////////////////// procedure TMainForm.Rotate00Click(Sender: TObject); begin MainForm.v.nRotation := 0; UpdateFractal; end; procedure TMainForm.Rotate01Click(Sender: TObject); begin MainForm.v.nRotation := 1; UpdateFractal; end; procedure TMainForm.Rotate02Click(Sender: TObject); begin MainForm.v.nRotation := 2; UpdateFractal; end; procedure TMainForm.Rotate03Click(Sender: TObject); begin MainForm.v.nRotation := 3; UpdateFractal; end; ////////////////////////////// procedure TMainForm.mandelClick(Sender: TObject); begin v.jul := 1; JuliaButtonClick(Self); end; procedure TMainForm.juliaClick(Sender: TObject); begin v.jul := 0; JuliaButtonClick(Self); end; procedure TMainForm.TransformationToolbar1Click(Sender: TObject); begin if Transformation.Visible = True then Transformation.Visible := False else Transformation.Visible := True; end; procedure TMainForm.TopToolbar2Click(Sender: TObject); begin if TopToolbar1.Visible = True then TopToolbar1.Visible := False else TopToolbar1.Visible := True; end; ///////////////// procedure TMainForm.Render01Click(Sender: TObject); begin v.render := 1; UpdateFractal; end; procedure TMainForm.Render02Click(Sender: TObject); begin v.render := 2; UpdateFractal; end; procedure TMainForm.Render03Click(Sender: TObject); begin v.render := 3; UpdateFractal; end; procedure TMainForm.Render04Click(Sender: TObject); begin v.render := 4; UpdateFractal; end; procedure TMainForm.Render05Click(Sender: TObject); begin v.render := 5; UpdateFractal; end; procedure TMainForm.Render06Click(Sender: TObject); begin v.render := 6; UpdateFractal; end; procedure TMainForm.Render07Click(Sender: TObject); begin v.render := 7; UpdateFractal; end; procedure TMainForm.Render08Click(Sender: TObject); begin v.render := 8; UpdateFractal; end; procedure TMainForm.Render09Click(Sender: TObject); begin v.render := 9; UpdateFractal; end; procedure TMainForm.Render10Click(Sender: TObject); begin v.render := 10; UpdateFractal; end; procedure TMainForm.Render11Click(Sender: TObject); begin v.render := 11; UpdateFractal; end; procedure TMainForm.Render12Click(Sender: TObject); begin v.render := 12; UpdateFractal; end; procedure TMainForm.Render13Click(Sender: TObject); begin v.render := 13; UpdateFractal; end; procedure TMainForm.Render14Click(Sender: TObject); begin v.render := 14; UpdateFractal; end; procedure TMainForm.Render15Click(Sender: TObject); begin v.render := 15; UpdateFractal; end; procedure TMainForm.Render16Click(Sender: TObject); begin v.render := 16; UpdateFractal; end; procedure TMainForm.Render17Click(Sender: TObject); begin v.render := 17; UpdateFractal; end; procedure TMainForm.Render18Click(Sender: TObject); begin v.render := 18; UpdateFractal; end; procedure TMainForm.Render19Click(Sender: TObject); begin v.render := 19; UpdateFractal; end; procedure TMainForm.Render20Click(Sender: TObject); begin v.render := 20; UpdateFractal; end; procedure TMainForm.Render211Click(Sender: TObject); begin v.render := 21; UpdateFractal; end; procedure TMainForm.Render22Click(Sender: TObject); begin v.render := 22; UpdateFractal; end; procedure TMainForm.Render23Click(Sender: TObject); begin v.render := 23; UpdateFractal; end; procedure TMainForm.Render24Click(Sender: TObject); begin v.render := 24; UpdateFractal; end; procedure TMainForm.Render25Click(Sender: TObject); begin v.render := 25; UpdateFractal; end; procedure TMainForm.Render26Click(Sender: TObject); begin v.render := 26; UpdateFractal; end; procedure TMainForm.Render27Click(Sender: TObject); begin v.render := 27; UpdateFractal; end; procedure TMainForm.Render28Click(Sender: TObject); begin v.render := 28; UpdateFractal; end; procedure TMainForm.Render29Click(Sender: TObject); begin v.render := 29; UpdateFractal; end; procedure TMainForm.Render30Click(Sender: TObject); begin v.render := 30; UpdateFractal; end; procedure TMainForm.Render31Click(Sender: TObject); begin v.render := 31; UpdateFractal; end; procedure TMainForm.Render32Click(Sender: TObject); begin v.render := 32; UpdateFractal; end; procedure TMainForm.Exit1Click(Sender: TObject); begin Close; end; /////////////////////// procedure TMainForm.SizeBtn80x60Click(Sender: TObject); begin MainForm.v.iWidth := 80; MainForm.v.iHeight := 60; XYSize1.SpinWidth.Value := MainForm.v.iWidth; XYSize1.SpinHeight.Value := MainForm.v.iHeight; ktaza.TP01Click(Self); end; procedure TMainForm.SizeBtn160x120Click(Sender: TObject); begin MainForm.v.iWidth := 160; MainForm.v.iHeight := 120; XYSize1.SpinWidth.Value := MainForm.v.iWidth; XYSize1.SpinHeight.Value := MainForm.v.iHeight; ktaza.TP01Click(Self); end; procedure TMainForm.SizeBtn256x256Click(Sender: TObject); begin MainForm.v.iWidth := 256; MainForm.v.iHeight := 256; XYSize1.SpinWidth.Value := MainForm.v.iWidth; XYSize1.SpinHeight.Value := MainForm.v.iHeight; ktaza.TP01Click(Self); end; procedure TMainForm.SizeBtn320x240Click(Sender: TObject); begin MainForm.v.iWidth := 320; MainForm.v.iHeight := 240; XYSize1.SpinWidth.Value := MainForm.v.iWidth; XYSize1.SpinHeight.Value := MainForm.v.iHeight; ktaza.TP01Click(Self); end; procedure TMainForm.SizeBtn640x480Click(Sender: TObject); begin MainForm.v.iWidth := 640; MainForm.v.iHeight := 480; XYSize1.SpinWidth.Value := MainForm.v.iWidth; XYSize1.SpinHeight.Value := MainForm.v.iHeight; ktaza.TP01Click(Self); end; procedure TMainForm.SizeBtn800x600Click(Sender: TObject); begin MainForm.v.iWidth := 800; MainForm.v.iHeight := 600; XYSize1.SpinWidth.Value := MainForm.v.iWidth; XYSize1.SpinHeight.Value := MainForm.v.iHeight; ktaza.TP01Click(Self); end; end.