diff --git a/2.10/Source/Adjust.dfm b/2.10/Source/Adjust.dfm index 9012a08..470aaf6 100644 --- a/2.10/Source/Adjust.dfm +++ b/2.10/Source/Adjust.dfm @@ -708,9 +708,11 @@ object AdjustForm: TAdjustForm end object cmbPalette: TComboBox Left = 72 - Top = 79 + Top = 78 Width = 206 - Height = 19 + Height = 21 + BevelInner = bvLowered + BevelOuter = bvRaised Style = csOwnerDrawFixed Color = clBlack DropDownCount = 20 @@ -719,7 +721,7 @@ object AdjustForm: TAdjustForm Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] - ItemHeight = 13 + ItemHeight = 15 ParentFont = False ParentShowHint = False ShowHint = False @@ -816,105 +818,114 @@ object AdjustForm: TAdjustForm object TabSheet4: TTabSheet Caption = 'Image Size' ImageIndex = 3 + object Bevel2: TBevel + Left = 4 + Top = 4 + Width = 137 + Height = 93 + Shape = bsFrame + end + object Bevel1: TBevel + Left = 148 + Top = 4 + Width = 148 + Height = 93 + Shape = bsFrame + end object Label2: TLabel - Left = 58 + Left = 14 Top = 15 Width = 28 Height = 13 Caption = 'Width' end object Label3: TLabel - Left = 58 - Top = 39 + Left = 14 + Top = 41 Width = 31 Height = 13 Caption = 'Height' end - object Bevel1: TBevel - Left = 48 - Top = 4 - Width = 137 - Height = 93 - Shape = bsFrame - end - object Bevel2: TBevel - Left = 192 - Top = 4 - Width = 148 - Height = 93 - Shape = bsFrame - end - object chkMaintain: TCheckBox - Left = 56 - Top = 68 - Width = 121 - Height = 17 - Caption = 'Maintain aspect ratio' - TabOrder = 0 - OnClick = chkMaintainClick - end object btnPreset1: TButton - Left = 200 + Left = 156 Top = 12 Width = 105 Height = 25 Caption = 'Preset 1' - TabOrder = 1 + TabOrder = 0 OnClick = btnPreset1Click end object btnPreset2: TButton - Left = 200 + Left = 156 Top = 38 Width = 105 Height = 25 Caption = 'Preset 2' - TabOrder = 2 + TabOrder = 1 OnClick = btnPreset2Click end object btnPreset3: TButton - Left = 200 + Left = 156 Top = 64 Width = 105 Height = 25 Caption = 'Preset 3' - TabOrder = 3 + TabOrder = 2 OnClick = btnPreset3Click end object btnSet1: TButton - Left = 304 + Left = 260 Top = 12 Width = 27 Height = 25 Caption = 'Set' - TabOrder = 4 + TabOrder = 3 OnClick = btnSet1Click end object btnSet2: TButton - Left = 304 + Left = 260 Top = 38 Width = 27 Height = 25 Caption = 'Set' - TabOrder = 5 + TabOrder = 4 OnClick = btnSet2Click end object btnSet3: TButton - Left = 304 + Left = 260 Top = 64 Width = 27 Height = 25 Caption = 'Set' - TabOrder = 6 + TabOrder = 5 OnClick = btnSet3Click end + object btnApplySize: TBitBtn + Left = 302 + Top = 72 + Width = 75 + Height = 25 + Caption = 'Apply' + TabOrder = 6 + OnClick = btnApplySizeClick + end + object chkMaintain: TCheckBox + Left = 14 + Top = 70 + Width = 121 + Height = 19 + Caption = 'Maintain aspect ratio' + TabOrder = 7 + OnClick = chkMaintainClick + end object txtWidth: TComboBox - Left = 104 + Left = 60 Top = 12 Width = 73 Height = 21 ItemHeight = 13 ItemIndex = 0 - TabOrder = 7 + TabOrder = 8 Text = '512' OnChange = txtWidthChange OnKeyPress = txtSizeKeyPress @@ -926,13 +937,13 @@ object AdjustForm: TAdjustForm '1280') end object txtHeight: TComboBox - Left = 104 - Top = 36 + Left = 60 + Top = 38 Width = 73 Height = 21 ItemHeight = 13 ItemIndex = 0 - TabOrder = 8 + TabOrder = 9 Text = '384' OnChange = txtHeightChange OnKeyPress = txtSizeKeyPress diff --git a/2.10/Source/Adjust.pas b/2.10/Source/Adjust.pas index 286811f..a8a1422 100644 --- a/2.10/Source/Adjust.pas +++ b/2.10/Source/Adjust.pas @@ -111,23 +111,24 @@ type ApplicationEvents: TApplicationEvents; lblOffset: TLabel; TabSheet4: TTabSheet; - Label2: TLabel; - Label3: TLabel; - chkMaintain: TCheckBox; btnPreset1: TButton; btnPreset2: TButton; btnPreset3: TButton; btnSet1: TButton; btnSet2: TButton; btnSet3: TButton; - txtWidth: TComboBox; - txtHeight: TComboBox; - Bevel1: TBevel; - Bevel2: TBevel; btnUndo: TSpeedButton; btnRedo: TSpeedButton; chkTransparent: TCheckBox; btnColorPreset: TSpeedButton; + Bevel1: TBevel; + btnApplySize: TBitBtn; + Label2: TLabel; + Label3: TLabel; + chkMaintain: TCheckBox; + txtWidth: TComboBox; + txtHeight: TComboBox; + Bevel2: TBevel; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormDestroy(Sender: TObject); @@ -194,7 +195,7 @@ type // --Z-- // gradient functions procedure cmbPaletteChange(Sender: TObject); - procedure DrawPalette; +// procedure DrawPalette; procedure mnuReverseClick(Sender: TObject); procedure mnuInvertClick(Sender: TObject); procedure btnMenuClick(Sender: TObject); @@ -243,6 +244,7 @@ type procedure btnRedoClick(Sender: TObject); procedure GradientImageDblClick(Sender: TObject); procedure btnColorPresetClick(Sender: TObject); + procedure btnApplySizeClick(Sender: TObject); private Resetting: boolean; @@ -320,7 +322,6 @@ begin pw := PrevPnl.Width - 2; ph := PrevPnl.Height - 2; cp.copy(MainCp); -// --Z-- actually this isn not correct: // if cp.width > cp.height then if (cp.width / cp.height) > (PrevPnl.Width / PrevPnl.Height) then begin PreviewImage.Width := pw; @@ -361,16 +362,17 @@ begin GetMainWindowSize; - Resetting := False; - DrawPreview; - // gradient if cp.cmapindex >= 0 then cmbPalette.ItemIndex := cp.cmapindex; - ScrollBar.Position := 0; +// ScrollBar.Position := 0; Palette := cp.cmap; BackupPal := cp.cmap; - DrawPalette; + + Resetting := False; + DrawPreview; + + //DrawPalette; end; procedure TAdjustForm.UpdateFlame; @@ -388,6 +390,10 @@ begin end; procedure TAdjustForm.DrawPreview; +var + i: integer; + Row: pRGBTripleArray; + BitMap: TBitMap; begin if not Resetting then begin Render.Stop; @@ -406,7 +412,30 @@ begin PreviewImage.Refresh; // --Z-- why was commented out? ;-) - DrawPalette; // (?) +//--begin DrawPalette + BitMap := TBitMap.Create; + try + Bitmap.PixelFormat := pf24bit; + BitMap.Width := 256; + BitMap.Height := 1; + + Row := Bitmap.Scanline[0]; + for i := 0 to 255 do + begin + with Row[i] do + begin + rgbtRed := Palette[i][0]; + rgbtGreen := Palette[i][1]; + rgbtBlue := Palette[i][2]; + end; + end; + + GradientImage.Picture.Graphic := Bitmap; + GradientImage.Refresh; + finally + BitMap.Free; + end; +//--end DrawPalette end; end; @@ -1004,7 +1033,7 @@ begin MainCp.CmapIndex := cmbPalette.ItemIndex; MainCp.cmap := Palette; - BackupPal := Palette; +// BackupPal := Palette; if EditForm.visible then EditForm.UpdateDisplay; if MutateForm.Visible then MutateForm.UpdateDisplay; @@ -1046,10 +1075,10 @@ begin Palette := Pal; BackupPal := Pal; - DrawPalette; +// DrawPalette; cp.copy(MainCp); -//? DrawPreview; +{//?} DrawPreview; end; procedure HSVToRGB(H, S, V: real; var Rb, Gb, Bb: integer); @@ -1204,6 +1233,7 @@ begin end; end; +{ procedure TAdjustForm.DrawPalette; var i: integer; @@ -1235,16 +1265,19 @@ begin BitMap.Free; end; end; +} procedure TAdjustForm.cmbPaletteChange(Sender: TObject); var i: integer; begin + if Resetting then exit; + i := cmbPalette.ItemIndex; GetCmap(i, 1, Palette); BackupPal := Palette; ScrollBar.Position := 0; - DrawPalette; + //DrawPalette; // MainForm.UpdateUndo; Apply; end; @@ -1393,7 +1426,7 @@ begin if ScrollCode = scEndScroll then begin GradientChanged:=false; - //Apply; + Apply; end; end; @@ -1680,9 +1713,9 @@ begin for i := 0 to 255 do begin - Palette[i][0] := BackupPal[(255 + i - offset) and $FF][0]; - Palette[i][1] := BackupPal[(255 + i - offset) and $FF][1]; - Palette[i][2] := BackupPal[(255 + i - offset) and $FF][2]; + Palette[i][0] := BackupPal[(256 + i - offset) and $FF][0]; + Palette[i][1] := BackupPal[(256 + i - offset) and $FF][1]; + Palette[i][2] := BackupPal[(256 + i - offset) and $FF][2]; end; cp.CmapIndex := cmbPalette.ItemIndex; cp.cmap := Palette; @@ -1773,9 +1806,6 @@ procedure TAdjustForm.SetMainWindowSize; var xtot, ytot: integer; begin -// xdif := MainForm.Width - MainForm.Image.Width; -// ydif := MainForm.Height - MainForm.Image.Height; - xtot := ImageWidth + (MainForm.Width - MainForm.Image.Width); ytot := ImageHeight + (MainForm.Height - MainForm.Image.Height); if xtot > Screen.Width then @@ -1878,5 +1908,10 @@ begin cmbPaletteChange(Sender); end; +procedure TAdjustForm.btnApplySizeClick(Sender: TObject); +begin + SetMainWindowSize; +end; + end. diff --git a/2.10/Source/Browser.pas b/2.10/Source/Browser.pas index d2bffd4..d22c3f2 100644 --- a/2.10/Source/Browser.pas +++ b/2.10/Source/Browser.pas @@ -470,6 +470,7 @@ begin MainForm.StopThread; MainForm.UpdateUndo; MainCp.cmap := Palette; + MainCP.cmapindex := -1; if EditForm.Visible then EditForm.UpdateDisplay; if AdjustForm.Visible then AdjustForm.UpdateDisplay; if MutateForm.Visible then MutateForm.UpdateDisplay; diff --git a/2.10/Source/ControlPoint.pas b/2.10/Source/ControlPoint.pas index fc87e53..a139841 100644 --- a/2.10/Source/ControlPoint.pas +++ b/2.10/Source/ControlPoint.pas @@ -21,17 +21,48 @@ unit ControlPoint; interface uses - Classes, Windows, Cmap, Xform, XFormMan; + Classes, Windows, Cmap, XForm, XFormMan; const EPS = 1E-10; + NXFORMS = 100; // --Z-- I don't like limitations! 8-[] + SUB_BATCH_SIZE = 10000; PREFILTER_WHITE = (1 shl 26); FILTER_CUTOFF = 1.8; BRIGHT_ADJUST = 2.3; FUSE = 15; +// ---- MyTypes ---- + +type + TTriangle = record + x: array[0..2] of double; + y: array[0..2] of double; + end; + TTriangles = array[-1..NXFORMS] of TTriangle; + TSPoint = record + x: double; + y: double; + end; + TMapPalette = record + Red: array[0..255] of byte; + Green: array[0..255] of byte; + Blue: array[0..255] of byte; + end; + TColorMaps = record + Identifier: string; + UGRFile: string; + end; + pPixArray = ^TPixArray; + TPixArray = array[0..1279, 0..1023, 0..3] of integer; + pPreviewPixArray = ^TPreviewPixArray; + TPreviewPixArray = array[0..159, 0..119, 0..3] of integer; + TFileType = (ftIfs, ftFla, ftXML); + +// ----- + type //? PLongintArray = ^TLongintArray; TLongintArray = array[0..8192] of Longint; @@ -121,6 +152,15 @@ type function HasNewVariants: boolean; + // CP-specific functions moved from unit Main + function NumXForms: integer; + function TrianglesFromCP(var Triangles: TTriangles): integer; + procedure EqualizeWeights; + procedure NormalizeWeights; + procedure RandomizeWeights; + procedure ComputeWeights(Triangles: TTriangles; t: integer); + procedure GetFromTriangles(const Triangles: TTriangles; const t: integer); + constructor Create; destructor Destroy; override; @@ -1783,5 +1823,185 @@ begin end; /////////////////////////////////////////////////////////////////////////////// +// +// --Z-- cp-specific functions moved here from MainForm +// + +function TControlPoint.NumXForms: integer; +var + i: integer; +begin +//... + Result := NXFORMS; + for i := 0 to NXFORMS - 1 do + begin + if xform[i].density = 0 then + begin + Result := i; + Break; + end; + end; + Result := i; +end; + +function TControlPoint.TrianglesFromCP(var Triangles: TTriangles): integer; +{ Sets up the triangles from the IFS code } +var + i, j: integer; + temp_x, temp_y, xset, yset: double; + left, top, bottom, right: double; + a, b, c, d, e, f: double; +begin + top := 0; bottom := 0; right := 0; left := 0; + Result := NumXForms; + if ReferenceMode > 0 then + begin + for i := 0 to Result-1 do + begin + a := xform[i].c[0][0]; + b := xform[i].c[0][1]; + c := xform[i].c[1][0]; + d := xform[i].c[1][1]; + e := xform[i].c[2][0]; + f := xform[i].c[2][1]; + xset := 1.0; + yset := 1.0; + for j := 0 to 5 do + begin + temp_x := xset * a + yset * c + e; + temp_y := xset * b + yset * d + f; + xset := temp_x; + yset := temp_y; + end; + if (i = 0) then + begin + left := xset; + right := xset; + top := yset; + bottom := yset; + end + else + begin + if (xset < left) then left := xset; + if (xset > right) then right := xset; + if (yset > top) then top := yset; + if (yset < bottom) then bottom := yset; + end; + end; + + if ReferenceMode = 1 then + begin + Triangles[-1].x[0] := right-left; + Triangles[-1].y[0] := 0; + Triangles[-1].x[1] := 0; + Triangles[-1].y[1] := 0; + Triangles[-1].x[2] := 0; + Triangles[-1].y[2] := -(top-bottom); + end + else begin + Triangles[-1].x[0] := right; + Triangles[-1].y[0] := -bottom; + Triangles[-1].x[1] := left; + Triangles[-1].y[1] := -bottom; + Triangles[-1].x[2] := left; + Triangles[-1].y[2] := -top; + end; + end + else + begin + Triangles[-1].x[0] := 1; Triangles[-1].y[0] := 0; // "x" + Triangles[-1].x[1] := 0; Triangles[-1].y[1] := 0; // "0" + Triangles[-1].x[2] := 0; Triangles[-1].y[2] := -1; // "y" + end; + + for j := 0 to Result-1 do + begin + a := xform[j].c[0][0]; + b := xform[j].c[0][1]; + c := xform[j].c[1][0]; + d := xform[j].c[1][1]; + e := xform[j].c[2][0]; + f := xform[j].c[2][1]; + for i := 0 to 2 do + begin + triangles[j].x[i] := Triangles[-1].x[i] * a + Triangles[-1].y[i] * c + e; + triangles[j].y[i] := Triangles[-1].x[i] * b + Triangles[-1].y[i] * d + f; + end; + end; + + for j := -1 to Result-1 do + for i := 0 to 2 do + triangles[j].y[i] := -triangles[j].y[i]; +end; + +procedure TControlPoint.EqualizeWeights; +var + t, i: integer; +begin + t := NumXForms; + for i := 0 to t - 1 do + xform[i].density := 0.5; +end; + +procedure TControlPoint.NormalizeWeights; +var + i: integer; + td: double; +begin + td := 0.0; + for i := 0 to NumXForms - 1 do + td := td + xform[i].Density; + if (td < 0.001) then + EqualizeWeights + else + for i := 0 to NumXForms - 1 do + xform[i].Density := xform[i].Density / td; +end; + +procedure TControlPoint.RandomizeWeights; +var + i: integer; +begin + for i := 0 to Transforms - 1 do + xform[i].Density := Random; +end; + +procedure TControlPoint.ComputeWeights(Triangles: TTriangles; t: integer); +// Caclulate transform weight from triangle areas +var + i: integer; + total_area: double; +begin + total_area := 0; + for i := 0 to t - 1 do + begin + xform[i].Density := triangle_area(Triangles[i]); + total_area := total_area + xform[i].Density; + end; + for i := 0 to t - 1 do + begin + xform[i].Density := xform[i].Density / total_area; + end; + //? cp1.NormalizeWeights; +end; + +procedure TControlPoint.GetFromTriangles(const Triangles: TTriangles; const t: integer); +var + i: integer; +begin + for i := 0 to t-1 do + begin + solve3(Triangles[-1].x[0], -Triangles[-1].y[0], Triangles[i].x[0], + Triangles[-1].x[1], -Triangles[-1].y[1], Triangles[i].x[1], + Triangles[-1].x[2], -Triangles[-1].y[2], Triangles[i].x[2], + xform[i].c[0][0], xform[i].c[1][0], xform[i].c[2][0]); + + solve3(Triangles[-1].x[0], -Triangles[-1].y[0], -Triangles[i].y[0], + Triangles[-1].x[1], -Triangles[-1].y[1], -Triangles[i].y[1], + Triangles[-1].x[2], -Triangles[-1].y[2], -Triangles[i].y[2], + xform[i].c[0][1], xform[i].c[1][1], xform[i].c[2][1]); + end; +end; + end. diff --git a/2.10/Source/Editor.pas b/2.10/Source/Editor.pas index 22ce708..6a306c4 100644 --- a/2.10/Source/Editor.pas +++ b/2.10/Source/Editor.pas @@ -335,7 +335,7 @@ type // --Z-- functions moved from outside (?) procedure ShowSelectedInfo; procedure Scale(var fx, fy: double; x, y: integer); - procedure ReadjustWeights(var cp: TControlPoint); +// procedure ReadjustWeights(var cp: TControlPoint); public cp: TControlPoint; @@ -620,8 +620,10 @@ begin PreviewImage.refresh; end; +(* procedure TEditForm.ReadjustWeights(var cp: TControlPoint); -{ Thanks to Rudy...code from Chaos} +{ Thanks to Rudy...code from Chaos } +// --Z-- and thanks to me for removing this! ;-) var total, othertotals, excess: double; t, i: integer; @@ -645,6 +647,7 @@ begin //z cp.xform[i].density := cp.xform[i].density - cp.xform[i].density / othertotals * excess; cp.xform[i].density := cp.xform[i].density * excess; // --Z-- end; +*) procedure TEditForm.ShowSelectedInfo; var @@ -783,8 +786,8 @@ begin cp.xform[i].c[0][1], cp.xform[i].c[1][1], cp.xform[i].c[2][1]); end; - GetXForms(cp, MainTriangles, transforms); - if not chkPreserve.checked then ComputeWeights(cp, MainTriangles, transforms); + cp.GetFromTriangles(MainTriangles, transforms); +// if not chkPreserve.checked then ComputeWeights(cp, MainTriangles, transforms); DrawPreview; ShowSelectedInfo; TriangleView.Refresh;; @@ -794,8 +797,8 @@ procedure TEditForm.UpdateFlame(DrawMain: boolean); begin //; MainForm.StopThread; StatusBar.Panels[2].Text := Format('Zoom: %f', [GraphZoom]); - GetXForms(cp, MainTriangles, transforms); - if not chkPreserve.Checked then ComputeWeights(cp, MainTriangles, transforms); + cp.GetFromTriangles(MainTriangles, transforms); +// if not chkPreserve.Checked then ComputeWeights(cp, MainTriangles, transforms); DrawPreview; ShowSelectedInfo; TriangleView.Refresh; @@ -970,7 +973,6 @@ begin end; // draw axis Pen.Color := GridColor1; -// Pen.Style := psSolid; ax := integer(round(ix - gCenterX*sc)); ay := integer(round(iy + gCentery*sc)); MoveTo(ax, 0); @@ -981,15 +983,17 @@ begin {Reference Triangle} Pen.Style := psDot; Pen.color := pnlReference.Color; + brush.Color := gridColor1 shr 1 and $7f7f7f; a := ToScreen(MainTriangles[-1].x[0], MainTriangles[-1].y[0]); b := ToScreen(MainTriangles[-1].x[1], MainTriangles[-1].y[1]); c := ToScreen(MainTriangles[-1].x[2], MainTriangles[-1].y[2]); Polyline([a, b, c, a]); + brush.Color := pnlBackColor.Color; Font.color := Pen.color; + TextOut(c.x-9, c.y-12, 'C'); + TextOut(b.x-8, b.y+1, 'B'); TextOut(a.x+2, a.y+1, 'A'); - TextOut(b.x+2, b.y+1, 'B'); - TextOut(c.x+2, c.y+1, 'C'); Pen.Style := psSolid; @@ -1036,24 +1040,17 @@ begin dx := MainTriangles[SelectedTriangle].x[SelectedCorner] - Pivot.x; dy := MainTriangles[SelectedTriangle].y[SelectedCorner] - Pivot.y; d := Hypot(dx, dy); -// d := dist(Pivot.x, Pivot.y, -// MainTriangles[SelectedTriangle].x[SelectedCorner], MainTriangles[SelectedTriangle].y[SelectedCorner]); end else begin -// d := MinDouble; dx := MainTriangles[SelectedTriangle].x[0] - Pivot.x; dy := MainTriangles[SelectedTriangle].y[0] - Pivot.y; d := Hypot(dx, dy); for i := 1 to 2 do begin -// tx := MainTriangles[SelectedTriangle].x[i] - Pivot.x; -// ty := MainTriangles[SelectedTriangle].y[i] - Pivot.y; d1 := Hypot(tx, ty); d1 := dist(Pivot.x, Pivot.y, MainTriangles[SelectedTriangle].x[i], MainTriangles[SelectedTriangle].y[i]); if d1 > d then begin d := d1; -// dx := tx; -// dy := ty; end; end; d1 := Hypot(dx, dy); @@ -1705,7 +1702,8 @@ begin Transforms := Transforms + 1; MainTriangles[Transforms - 1] := MainTriangles[-1]; SelectedTriangle := Transforms - 1; - ComputeWeights(cp, MainTriangles, transforms); +// ComputeWeights(cp, MainTriangles, transforms); + cp.xform[Transforms - 1].density := 0.5; cp.xform[Transforms - 1].vars[0] := 1; for i := 1 to NRVAR - 1 do cp.xform[Transforms - 1].vars[i] := 0; @@ -1725,7 +1723,8 @@ begin MainForm.UpdateUndo; Transforms := Transforms + 1; MainTriangles[Transforms - 1] := MainTriangles[SelectedTriangle]; - ComputeWeights(cp, MainTriangles, transforms); +// ComputeWeights(cp, MainTriangles, transforms); + cp.xform[Transforms - 1].density := cp.xform[SelectedTriangle].density; for i := 0 to NRVAR - 1 do cp.xform[Transforms - 1].vars[i] := cp.xform[SelectedTriangle].vars[i]; SelectedTriangle := Transforms - 1; @@ -1802,7 +1801,7 @@ begin else if Sender = txtP then begin cp.xform[SelectedTriangle].density := StrToFloat(TEdit(Sender).Text); - ReadjustWeights(cp); + //ReadjustWeights(cp); TEdit(Sender).Text := Format('%.6g', [cp.xform[SelectedTriangle].density]); end; MainForm.UpdateUndo; @@ -1864,7 +1863,7 @@ begin else if Sender = txtP then begin cp.xform[SelectedTriangle].density := StrToFloat(TEdit(Sender).Text); - ReadjustWeights(cp); + //ReadjustWeights(cp); TEdit(Sender).Text := Format('%.6g', [cp.xform[SelectedTriangle].density]); end; MainForm.UpdateUndo; @@ -1905,7 +1904,7 @@ begin begin MainForm.UpdateUndo; cp.xform[SelectedTriangle].density := NewVal; - ReadjustWeights(cp); + //ReadjustWeights(cp); UpdateFlame(True); end; end; @@ -1937,7 +1936,7 @@ begin begin MainForm.UpdateUndo; cp.xform[SelectedTriangle].density := NewVal; - ReadjustWeights(cp); + //ReadjustWeights(cp); UpdateFlame(True); end; end; @@ -2195,7 +2194,7 @@ begin 4: cp.xform[SelectedTriangle].c[2][0] := NewVal; //e 5: cp.xform[SelectedTriangle].c[2][1] := NewVal; //f end; - MainForm.TrianglesFromCP(cp, MainTriangles); + cp.TrianglesFromCP(MainTriangles); ShowSelectedInfo; UpdateFlame(true); end; @@ -2256,7 +2255,7 @@ begin 4: cp.xform[SelectedTriangle].c[2][0] := NewVal; //e 5: cp.xform[SelectedTriangle].c[2][1] := NewVal; //f end; - MainForm.TrianglesFromCP(cp, MainTriangles); + cp.TrianglesFromCP(MainTriangles); ShowSelectedInfo; UpdateFlame(true); end; @@ -2356,7 +2355,7 @@ begin v := StrToFloat(txtXFormColor.Text); except on EConvertError do begin - txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]);//FLoatToStr(cp.xform[SelectedTriangle].color); + txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]); exit; end; end; @@ -2380,7 +2379,7 @@ begin v := StrToFloat(txtXFormColor.Text); except on EConvertError do begin - txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]);//FLoattoStr(cp.xform[SelectedTriangle].color); + txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]); exit; end; end; diff --git a/2.10/Source/Global.pas b/2.10/Source/Global.pas index 504f339..2047366 100644 --- a/2.10/Source/Global.pas +++ b/2.10/Source/Global.pas @@ -111,7 +111,7 @@ var VariationOptions: int64; { For random gradients } MinNodes, MaxNodes, MinHue, MaxHue, MinSat, MaxSat, MinLum, MaxLum: integer; - FixedReference: boolean; + ReferenceMode: integer;//FixedReference: boolean; BatchSize: Integer; Compatibility: integer; //0 = original, 1 = Drave's Favorites: TStringList; @@ -183,6 +183,7 @@ function dist(x1, y1, x2, y2: double): double; var d2: double; begin +(* { From FDesign source { float pt_pt_distance(float x1, float y1, float x2, float y2) } d2 := (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); @@ -193,6 +194,12 @@ begin end else Result := sqrt(d2); +*) + + // --Z-- This is just amazing... :-\ + // Someone needed an 'FDesign source' - to compute distance between two points??!? + + Result := Hypot(x2-x1, y2-y1); end; function line_dist(x, y, x1, y1, x2, y2: double): double; diff --git a/2.10/Source/Main.pas b/2.10/Source/Main.pas index b026118..a86a8f5 100644 --- a/2.10/Source/Main.pas +++ b/2.10/Source/Main.pas @@ -319,7 +319,7 @@ type procedure ParseXML(var cp1: TControlPoint; const params: PCHAR); function SaveFlame(cp1: TControlPoint; title, filename: string): boolean; function SaveXMLFlame(const cp1: TControlPoint; title, filename: string): boolean; - function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer; + //function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer; procedure DisplayHint(Sender: TObject); procedure OnProgress(prog: double); procedure DrawFlame; @@ -345,17 +345,16 @@ type procedure ListXML(FileName: string; sel: integer); function EntryExists(En, Fl: string): boolean; function XMLEntryExists(title, filename: string): boolean; -procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer); +//procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer); function DeleteEntry(Entry, FileName: string): boolean; function CleanIdentifier(ident: string): string; function CleanUPRTitle(ident: string): string; -procedure GetXForms(var cp1: TControlPoint; const Triangles: TTriangles; const t: integer); function GradientString(c: TColorMap): string; function PackVariations: cardinal; procedure UnpackVariations(v: integer); function NumXForms(const cp: TControlPoint): integer; -procedure NormalizeWeights(var cp: TControlPoint); -procedure EqualizeWeights(var cp: TControlPoint); +//procedure NormalizeWeights(var cp: TControlPoint); +//procedure EqualizeWeights(var cp: TControlPoint); procedure MultMatrix(var s: TMatrix; const m: TMatrix); procedure ListFlames(FileName: string; sel: integer); procedure ListIFS(FileName: string; sel: integer); @@ -473,6 +472,7 @@ begin end; end; +{ procedure EqualizeWeights(var cp: TControlPoint); var t, i: integer; @@ -496,6 +496,7 @@ begin for i := 0 to NumXForms(cp) - 1 do cp.xform[i].Density := cp.xform[i].Density / td; end; +} function PackVariations: cardinal; { Packs the variation options into an integer with Linear as lowest bit } @@ -1365,7 +1366,7 @@ begin pal := ''; hue := ''; // if sheep then // begin - pal := 'palette="' + IntToStr(cp1.cmapindex) + '" '; + if cp1.cmapindex >= 0 then pal := 'palette="' + IntToStr(cp1.cmapindex) + '" '; hue := 'hue="' + format('%g', [cp1.hue_rotation]) + '" '; // end; if Trim(SheepNick) <> '' then nick := 'nick="' + Trim(SheepNick) + '"'; @@ -1832,113 +1833,9 @@ end; { ************************** IFS and triangle stuff ************************* } -procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer); -{ Caclulates transform weight from triangles } -var - i: integer; - total_area: double; -begin - total_area := 0.0; - for i := 0 to t - 1 do - begin - cp1.xform[i].Density := triangle_area(Triangles[i]); - total_area := total_area + cp1.xform[i].Density; - end; - for i := 0 to t - 1 do - begin - cp1.xform[i].Density := cp1.xform[i].Density / total_area; - end; - NormalizeWeights(cp1); -end; + { ---Z--- moved to ControlPoint ---Z--- } -procedure RandomWeights(var cp1: TControlPoint); -{ Randomizes xform weights } -var - i: integer; -begin - for i := 0 to Transforms - 1 do - cp1.xform[i].Density := random; - NormalizeWeights(cp1); -end; - -function TMainForm.TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer; -{ Sets up the triangles from the IFS code } -var - xforms: integer; - i, j: integer; - temp_x, temp_y, xset, yset: double; - left, top, bottom, right: double; - a, b, c, d, e, f: double; -begin - top := 0; bottom := 0; right := 0; left := 0; - xforms := NumXForms(cp1); - Result := xforms; - if not FixedReference then - begin - for i := 0 to xforms - 1 do - begin - a := cp1.xform[i].c[0][0]; - b := cp1.xform[i].c[0][1]; - c := cp1.xform[i].c[1][0]; - d := cp1.xform[i].c[1][1]; - e := cp1.xform[i].c[2][0]; - f := cp1.xform[i].c[2][1]; - xset := 1.0; - yset := 1.0; - for j := 0 to 5 do - begin - temp_x := xset * a + yset * c + e; - temp_y := xset * b + yset * d + f; - xset := temp_x; - yset := temp_y; - end; - if (i = 0) then - begin - left := xset; - right := xset; - top := yset; - bottom := yset; - end - else - begin - if (xset < left) then left := xset; - if (xset > right) then right := xset; - if (yset < top) then top := yset; - if (yset > bottom) then bottom := yset; - end; - end; - Triangles[-1].x[0] := left; - Triangles[-1].x[1] := right; - Triangles[-1].x[2] := right; - Triangles[-1].y[0] := bottom; - Triangles[-1].y[1] := bottom; - Triangles[-1].y[2] := top; - end - else - begin - Triangles[-1].x[0] := 1; Triangles[-1].y[0] := 0; // "x" - Triangles[-1].x[1] := 0; Triangles[-1].y[1] := 0; // "0" - Triangles[-1].x[2] := 0; Triangles[-1].y[2] := -1; // "y" - end; - - for j := 0 to xforms - 1 do - begin - a := cp1.xform[j].c[0][0]; - b := cp1.xform[j].c[0][1]; - c := cp1.xform[j].c[1][0]; - d := cp1.xform[j].c[1][1]; - e := cp1.xform[j].c[2][0]; - f := cp1.xform[j].c[2][1]; - for i := 0 to 2 do - begin - triangles[j].x[i] := Triangles[-1].x[i] * a + Triangles[-1].y[i] * c + e; - triangles[j].y[i] := Triangles[-1].x[i] * b + Triangles[-1].y[i] * d + f; - end; - end; - for i := -1 to xforms - 1 do - for j := 0 to 2 do - triangles[i].y[j] := -triangles[i].y[j]; -end; +{ // unused function, hmmm... procedure CP_compute(var cp1: TControlPoint; t1, t0: TTriangle; const i: integer); begin @@ -1952,25 +1849,7 @@ begin t0.x[2], t0.y[2], t1.y[2], cp1.xform[i].c[0][1], cp1.xform[i].c[1][1], cp1.xform[i].c[2][1]); end; - -procedure GetXForms(var cp1: TControlPoint; const Triangles: TTriangles; const t: integer); -var - i: integer; -begin - for i := 0 to t - 1 do - begin - solve3(Triangles[-1].x[0], -Triangles[-1].y[0], Triangles[i].x[0], - Triangles[-1].x[1], -Triangles[-1].y[1], Triangles[i].x[1], - Triangles[-1].x[2], -Triangles[-1].y[2], Triangles[i].x[2], - cp1.xform[i].c[0][0], cp1.xform[i].c[1][0], cp1.xform[i].c[2][0]); - - solve3(Triangles[-1].x[0], -Triangles[-1].y[0], -Triangles[i].y[0], - Triangles[-1].x[1], -Triangles[-1].y[1], -Triangles[i].y[1], - Triangles[-1].x[2], -Triangles[-1].y[2], -Triangles[i].y[2], - cp1.xform[i].c[0][1], cp1.xform[i].c[1][1], cp1.xform[i].c[2][1]); - end; - -end; +} function FlameToString(Title: string): string; { Creates a string containing the formated flame parameter set } @@ -2200,7 +2079,8 @@ procedure TMainForm.mnuNormalWeightsClick(Sender: TObject); begin StopThread; UpdateUndo; - ComputeWeights(MainCp, MainTriangles, transforms); +// TODO: ...something +// ComputeWeights(MainCp, MainTriangles, transforms); RedrawTimer.Enabled := True; UpdateWindows; end; @@ -2211,7 +2091,7 @@ begin UpdateUndo; inc(MainSeed); RandSeed := MainSeed; - RandomWeights(MainCp); + MainCp.RandomizeWeights; RedrawTimer.Enabled := True; UpdateWindows; end; @@ -2338,7 +2218,7 @@ begin inc(RandomIndex); MainCp.name := RandomPrefix + RandomDate + '-' + IntToStr(RandomIndex); - Transforms := TrianglesFromCP(MainCp, MainTriangles); + Transforms := MainCp.TrianglesFromCP(MainTriangles); if AdjustForm.visible then AdjustForm.UpdateDisplay; @@ -2353,7 +2233,7 @@ procedure TMainForm.mnuEqualizeClick(Sender: TObject); begin StopThread; UpdateUndo; - EqualizeWeights(maincp); + MainCP.EqualizeWeights; RedrawTimer.Enabled := True; UpdateWindows; end; @@ -2817,7 +2697,7 @@ begin btnUndo.Enabled := false; btnRedo.enabled := false; - Transforms := TrianglesFromCP(MainCp, MainTriangles); + Transforms := MainCp.TrianglesFromCP(MainTriangles); UndoIndex := 0; UndoMax := 0; @@ -2942,7 +2822,7 @@ begin // Zoom := maincp.zoom; Center[0] := maincp.Center[0]; Center[1] := maincp.Center[1]; - NormalizeWeights(maincp); + MainCP.NormalizeWeights; mnuSaveUndo.Enabled := false; mnuUndo.Enabled := False; mnuPopUndo.Enabled := False; @@ -2956,7 +2836,7 @@ begin AdjustForm.btnRedo.enabled := false; btnUndo.Enabled := false; btnRedo.enabled := false; - Transforms := TrianglesFromCP(maincp, MainTriangles); + Transforms := MainCp.TrianglesFromCP(MainTriangles); // Fix Apophysis 1.0 parameters with negative color parameteres! for i := 0 to Transforms - 1 do if maincp.xform[i].color < 0 then maincp.xform[i].color := 0; @@ -3054,8 +2934,8 @@ begin Center[0] := maincp.Center[0]; Center[1] := maincp.Center[1]; // cp.CalcBoundbox; - NormalizeWeights(maincp); - Transforms := TrianglesFromCP(maincp, MainTriangles); + MainCP.NormalizeWeights; + Transforms := MainCp.TrianglesFromCP(MainTriangles); // Trim undo index from title maincp.name := Copy(Fstrings[0], 6, length(Fstrings[0]) - 7); @@ -3306,6 +3186,7 @@ begin StopThread; UpdateUndo; maincp.cmap := Pal; + maincp.cmapindex := -1; AdjustForm.UpdateDisplay; if EditForm.Visible then EditForm.UpdateDisplay; @@ -3613,7 +3494,7 @@ begin center[1] := maincp.center[1]; RedrawTimer.Enabled := True; Application.ProcessMessages; - Transforms := TrianglesFromCP(maincp, MainTriangles); + Transforms := MainCp.TrianglesFromCP(MainTriangles); UpdateWindows; end; finally @@ -3752,7 +3633,7 @@ begin if nxform < NXFORMS then for i := nxform to NXFORMS - 1 do cp1.xform[i].density := 0; - NormalizeWeights(cp1); + cp1.NormalizeWeights; // Check for symmetry parameter if ParseCp.symmetry <> 0 then begin @@ -3766,7 +3647,7 @@ begin if Clipboard.HasFormat(CF_TEXT) then begin UpdateUndo; ParseXML(MainCP, PCHAR(Clipboard.AsText)); - Transforms := TrianglesFromCP(MainCp, MainTriangles); + Transforms := MainCp.TrianglesFromCP(MainTriangles); Statusbar.Panels[2].Text := MainCp.name; if ResizeOnLoad then ResizeWindow; RedrawTimer.Enabled := True; @@ -3782,10 +3663,7 @@ begin txt := Trim(FlameToXML(Maincp, false, true)); Clipboard.SetTextBuf(PChar(txt)); mnuPaste.enabled := true; -//z btnPaste.enabled := true; -// GradientForm.mnuPaste.enabled := False; -// GradientForm.btnPaste.enabled := False; AdjustForm.mnuPaste.enabled := False; AdjustForm.btnPaste.enabled := False; end; diff --git a/2.10/Source/Mutate.pas b/2.10/Source/Mutate.pas index a4636fb..0f3c5e4 100644 --- a/2.10/Source/Mutate.pas +++ b/2.10/Source/Mutate.pas @@ -119,7 +119,7 @@ begin MainForm.StopThread; MainForm.UpdateUndo; MainCp.Copy(cps[0]); - Transforms := MainForm.TrianglesFromCP(MainCp, MainTriangles); + Transforms := MainCp.TrianglesFromCP(MainTriangles); MainCp.cmap := cmap; MainCp.name := name; MainCp.nick := nick; diff --git a/2.10/Source/MyTypes.pas b/2.10/Source/MyTypes.pas index c689585..f135548 100644 --- a/2.10/Source/MyTypes.pas +++ b/2.10/Source/MyTypes.pas @@ -17,9 +17,9 @@ } unit MyTypes; - interface -uses ControlPoint; + +{uses ControlPoint; type TTriangle = record @@ -45,7 +45,7 @@ type pPreviewPixArray = ^TPreviewPixArray; TPreviewPixArray = array[0..159, 0..119, 0..3] of integer; TFileType = (ftIfs, ftFla, ftXML); - +} implementation end. diff --git a/2.10/Source/Options.dfm b/2.10/Source/Options.dfm index 1556970..743311d 100644 --- a/2.10/Source/Options.dfm +++ b/2.10/Source/Options.dfm @@ -5,7 +5,7 @@ object OptionsForm: TOptionsForm BorderStyle = bsDialog Caption = 'Options' ClientHeight = 296 - ClientWidth = 470 + ClientWidth = 467 Color = clBtnFace Font.Charset = ANSI_CHARSET Font.Color = clWindowText @@ -42,7 +42,7 @@ object OptionsForm: TOptionsForm object Tabs: TPageControl Left = 8 Top = 8 - Width = 449 + Width = 451 Height = 249 ActivePage = GeneralPage TabOrder = 0 @@ -51,86 +51,44 @@ object OptionsForm: TOptionsForm HelpContext = 1 Caption = 'General' object chkConfirmDel: TCheckBox - Left = 208 - Top = 8 + Left = 144 + Top = 139 Width = 97 Height = 17 HelpContext = 1005 Caption = 'Confirm delete' - TabOrder = 2 - end - object GroupBox13: TGroupBox - Left = 8 - Top = 2 - Width = 193 - Height = 71 - Caption = 'Smooth palette' - TabOrder = 0 - object Label8: TLabel - Left = 10 - Top = 18 - Width = 78 - Height = 13 - Caption = 'Number of tries:' - end - object Label10: TLabel - Left = 26 - Top = 42 - Width = 53 - Height = 13 - Caption = 'Try length:' - end - object txtNumtries: TEdit - Left = 96 - Top = 16 - Width = 73 - Height = 21 - HelpContext = 1002 - TabOrder = 0 - Text = '50' - end - object txtTryLength: TEdit - Left = 96 - Top = 40 - Width = 73 - Height = 21 - HelpContext = 1003 - TabOrder = 1 - Text = '10000' - end + TabOrder = 1 end object JPEG: TGroupBox Left = 8 - Top = 74 + Top = 72 Width = 121 Height = 57 Caption = 'JPEG Quality' - TabOrder = 1 - object txtJPEGQuality: TEdit + TabOrder = 0 + object txtJPEGquality: TComboBox Left = 16 Top = 24 - Width = 73 + Width = 89 Height = 21 - HelpContext = 1004 + ItemHeight = 13 + ItemIndex = 2 TabOrder = 0 - Text = '80' + Text = '100' + Items.Strings = ( + '60' + '80' + '100' + '120') end end - object chkFixedReference: TCheckBox - Left = 208 - Top = 24 - Width = 145 - Height = 17 - Caption = 'Fixed reference triangle' - TabOrder = 3 - end object GroupBox1: TGroupBox - Left = 136 - Top = 74 + Left = 8 + Top = 4 Width = 121 Height = 57 Caption = 'Batch size' - TabOrder = 4 + TabOrder = 2 object txtBatchSize: TEdit Left = 16 Top = 24 @@ -154,60 +112,29 @@ object OptionsForm: TOptionsForm end end object chkResize: TCheckBox - Left = 208 - Top = 40 + Left = 144 + Top = 157 Width = 169 Height = 17 Caption = 'Resize on load' - TabOrder = 5 - end - object GroupBox15: TGroupBox - Left = 8 - Top = 134 - Width = 129 - Height = 83 - Caption = 'PNG Transparency' - TabOrder = 6 - object RadioButton1: TRadioButton - Left = 12 - Top = 16 - Width = 113 - Height = 17 - Caption = 'No transparency' - TabOrder = 0 - end - object RadioButton2: TRadioButton - Left = 12 - Top = 32 - Width = 113 - Height = 17 - Caption = 'Like Flame3' - TabOrder = 1 - end - object RadioButton3: TRadioButton - Left = 12 - Top = 48 - Width = 113 - Height = 17 - Caption = 'Like Flamesong' - TabOrder = 2 - end + TabOrder = 3 end object GroupBox16: TGroupBox - Left = 140 + Left = 8 Top = 134 - Width = 117 - Height = 51 + Width = 121 + Height = 59 Caption = 'Nr processors' - TabOrder = 7 + TabOrder = 4 object cbNrTheads: TComboBox - Left = 12 - Top = 20 + Left = 16 + Top = 24 Width = 89 Height = 21 ItemHeight = 13 + ItemIndex = 0 TabOrder = 0 - Text = '200' + Text = 'Off' Items.Strings = ( 'Off' '2' @@ -215,21 +142,46 @@ object OptionsForm: TOptionsForm '8') end end - object cbShowTransparancy: TCheckBox + object chkShowTransparency: TCheckBox Left = 144 - Top = 196 + Top = 175 Width = 169 Height = 17 - Caption = 'Show Transparancy' - TabOrder = 8 + Caption = 'Show Transparency' + TabOrder = 5 + end + object rgReferenceMode: TRadioGroup + Left = 280 + Top = 4 + Width = 153 + Height = 69 + Caption = 'Reference Triangle' + ItemIndex = 0 + Items.Strings = ( + 'Normal' + 'Proportional' + 'Wandering (old-style)') + TabOrder = 6 + end + object rgTransparency: TRadioGroup + Left = 136 + Top = 4 + Width = 137 + Height = 69 + Caption = 'PNG Transparency' + Items.Strings = ( + 'No transparency' + 'Flam3-style' + 'Flamesong-style') + TabOrder = 7 end end object DisplayPage: TTabSheet Caption = 'Display' object GroupBox2: TGroupBox Left = 184 - Top = 8 - Width = 250 + Top = 4 + Width = 193 Height = 97 Caption = 'Preview density' TabOrder = 1 @@ -257,34 +209,31 @@ object OptionsForm: TOptionsForm object txtLowQuality: TEdit Left = 112 Top = 16 - Width = 121 + Width = 65 Height = 21 HelpContext = 1012 TabOrder = 0 - Text = 'txtLowQuality' end object txtMediumQuality: TEdit Left = 112 Top = 40 - Width = 121 + Width = 65 Height = 21 HelpContext = 1013 TabOrder = 1 - Text = 'txtMediumQuality' end object txtHighQuality: TEdit Left = 112 Top = 64 - Width = 121 + Width = 65 Height = 21 HelpContext = 1014 TabOrder = 2 - Text = 'txtHighQuality' end end object grpRendering: TGroupBox Left = 8 - Top = 6 + Top = 4 Width = 169 Height = 169 Caption = 'Rendering' @@ -648,9 +597,9 @@ object OptionsForm: TOptionsForm ImageIndex = 5 object grpGradient: TRadioGroup Left = 8 - Top = 8 + Top = 4 Width = 137 - Height = 121 + Height = 97 HelpContext = 1029 Caption = 'On random flame' ItemIndex = 0 @@ -662,28 +611,28 @@ object OptionsForm: TOptionsForm TabOrder = 0 end object GroupBox3: TGroupBox - Left = 152 - Top = 8 + Left = 153 + Top = 4 Width = 281 - Height = 193 + Height = 189 Caption = 'Randomize' TabOrder = 1 object Label18: TLabel - Left = 8 + Left = 16 Top = 24 Width = 128 Height = 13 Caption = 'Minimum number of nodes:' end object Label19: TLabel - Left = 8 + Left = 16 Top = 56 Width = 128 Height = 13 Caption = 'Maximum number of nodes' end object Label31: TLabel - Left = 8 + Left = 16 Top = 88 Width = 64 Height = 13 @@ -697,7 +646,7 @@ object OptionsForm: TOptionsForm Caption = 'and' end object Label33: TLabel - Left = 8 + Left = 16 Top = 120 Width = 95 Height = 13 @@ -711,7 +660,7 @@ object OptionsForm: TOptionsForm Caption = 'and' end object Label35: TLabel - Left = 8 + Left = 16 Top = 152 Width = 95 Height = 13 @@ -745,8 +694,8 @@ object OptionsForm: TOptionsForm OnChange = txtMaxNodesChange end object txtMinHue: TEdit - Left = 112 - Top = 88 + Left = 117 + Top = 85 Width = 49 Height = 21 HelpContext = 1032 @@ -756,7 +705,7 @@ object OptionsForm: TOptionsForm end object txtMaxHue: TEdit Left = 208 - Top = 88 + Top = 85 Width = 49 Height = 21 HelpContext = 1033 @@ -765,8 +714,8 @@ object OptionsForm: TOptionsForm OnChange = txtMaxHueChange end object txtMinSat: TEdit - Left = 112 - Top = 120 + Left = 117 + Top = 117 Width = 49 Height = 21 HelpContext = 1034 @@ -776,7 +725,7 @@ object OptionsForm: TOptionsForm end object txtMaxSat: TEdit Left = 208 - Top = 120 + Top = 117 Width = 49 Height = 21 HelpContext = 1035 @@ -785,8 +734,8 @@ object OptionsForm: TOptionsForm OnChange = txtMaxSatChange end object txtMinLum: TEdit - Left = 112 - Top = 152 + Left = 117 + Top = 149 Width = 49 Height = 21 HelpContext = 1036 @@ -796,7 +745,7 @@ object OptionsForm: TOptionsForm end object txtMaxLum: TEdit Left = 208 - Top = 152 + Top = 149 Width = 49 Height = 21 HelpContext = 1037 @@ -829,8 +778,8 @@ object OptionsForm: TOptionsForm TabOrder = 9 end object udMinHue: TUpDown - Left = 161 - Top = 88 + Left = 166 + Top = 85 Width = 12 Height = 21 HelpContext = 1032 @@ -840,7 +789,7 @@ object OptionsForm: TOptionsForm end object udMaxHue: TUpDown Left = 257 - Top = 88 + Top = 85 Width = 12 Height = 21 HelpContext = 1033 @@ -850,8 +799,8 @@ object OptionsForm: TOptionsForm TabOrder = 11 end object udMinSat: TUpDown - Left = 161 - Top = 120 + Left = 166 + Top = 117 Width = 12 Height = 21 HelpContext = 1034 @@ -860,7 +809,7 @@ object OptionsForm: TOptionsForm end object udmaxSat: TUpDown Left = 257 - Top = 120 + Top = 117 Width = 12 Height = 21 HelpContext = 1035 @@ -869,8 +818,8 @@ object OptionsForm: TOptionsForm TabOrder = 13 end object udMinLum: TUpDown - Left = 161 - Top = 152 + Left = 166 + Top = 149 Width = 12 Height = 21 HelpContext = 1036 @@ -879,7 +828,7 @@ object OptionsForm: TOptionsForm end object udMaxLum: TUpDown Left = 257 - Top = 152 + Top = 149 Width = 12 Height = 21 HelpContext = 1037 @@ -888,6 +837,46 @@ object OptionsForm: TOptionsForm TabOrder = 15 end end + object GroupBox13: TGroupBox + Left = 8 + Top = 106 + Width = 137 + Height = 87 + Caption = 'Smooth palette' + TabOrder = 2 + object Label8: TLabel + Left = 10 + Top = 18 + Width = 49 + Height = 13 + Caption = '# of tries:' + end + object Label10: TLabel + Left = 10 + Top = 50 + Width = 53 + Height = 13 + Caption = 'Try length:' + end + object txtNumtries: TEdit + Left = 80 + Top = 16 + Width = 49 + Height = 21 + HelpContext = 1002 + TabOrder = 0 + Text = '50' + end + object txtTryLength: TEdit + Left = 80 + Top = 48 + Width = 49 + Height = 21 + HelpContext = 1003 + TabOrder = 1 + Text = '10000' + end + end end object TabSheet6: TTabSheet Caption = 'UPR' diff --git a/2.10/Source/Options.pas b/2.10/Source/Options.pas index 3f6120a..3fb1955 100644 --- a/2.10/Source/Options.pas +++ b/2.10/Source/Options.pas @@ -32,9 +32,7 @@ type Tabs: TPageControl; GeneralPage: TTabSheet; chkConfirmDel: TCheckBox; - GroupBox13: TGroupBox; JPEG: TGroupBox; - txtJPEGQuality: TEdit; DisplayPage: TTabSheet; GroupBox2: TGroupBox; Label4: TLabel; @@ -86,10 +84,6 @@ type GroupBox17: TGroupBox; btnSetAll: TButton; btnClearAll: TButton; - Label8: TLabel; - txtNumtries: TEdit; - Label10: TLabel; - txtTryLength: TEdit; TabSheet1: TTabSheet; grpGradient: TRadioGroup; GroupBox3: TGroupBox; @@ -122,7 +116,6 @@ type udMinMutate: TUpDown; udMaxMutate: TUpDown; udSymOrder: TUpDown; - chkFixedReference: TCheckBox; GroupBox1: TGroupBox; txtBatchSize: TEdit; udBatchSize: TUpDown; @@ -174,13 +167,17 @@ type Label37: TLabel; txtLibrary: TEdit; clbVarEnabled: TCheckListBox; - GroupBox15: TGroupBox; - RadioButton1: TRadioButton; - RadioButton2: TRadioButton; - RadioButton3: TRadioButton; GroupBox16: TGroupBox; cbNrTheads: TComboBox; - cbShowTransparancy: TCheckBox; + chkShowTransparency: TCheckBox; + rgReferenceMode: TRadioGroup; + GroupBox13: TGroupBox; + Label8: TLabel; + Label10: TLabel; + txtNumtries: TEdit; + txtTryLength: TEdit; + txtJPEGquality: TComboBox; + rgTransparency: TRadioGroup; procedure btnCancelClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure btnOKClick(Sender: TObject); @@ -254,20 +251,15 @@ begin txtTryLength.text := IntToStr(Trylength); chkConfirmDel.Checked := ConfirmDelete; txtJPEGQuality.text := IntToStr(JPEGQuality); - chkFixedReference.Checked := FixedReference; + rgReferenceMode.IteMindex := ReferenceMode; udBatchSize.Position := BatchSize; chkResize.checked := ResizeOnLoad; - case PNGTransparency of - 0: RadioButton1.Checked := True; - 1: RadioButton2.Checked := True; - 2: RadioButton3.Checked := True; - else - end; + rgTransparency.ItemIndex := PNGTransparency; + chkShowTransparency.Checked := ShowTransparency; if NrTreads <= 1 then cbNrTheads.ItemIndex := 0 else cbNrTheads.text := intTostr(NrTreads); - cbShowTransparancy.Checked := ShowTransparency; { Display tab } txtSampleDensity.Text := FloatToStr(defSampleDensity); @@ -363,18 +355,12 @@ begin if BatchSize < 1 then BatchSize := 1; if BatchSize > 300 then BatchSize := 300; - if RadioButton1.Checked then - PNGTransparency := 0 - else if RadioButton2.Checked then - PNGTransparency := 1 - else if RadioButton3.Checked then - PNGTransparency := 2; - - ShowTransparency := cbShowTransparancy.Checked; + PNGTransparency := rgTransparency.ItemIndex; + ShowTransparency := chkShowTransparency.Checked; NrTreads := StrToIntDef(cbNrTheads.text, 0); ConfirmDelete := chkConfirmDel.Checked; - FixedReference := chkFixedReference.Checked; + ReferenceMode := rgReferenceMode.ItemIndex; ResizeOnLoad := chkResize.checked; { Display tab } defSampleDensity := StrToFloat(txtSampleDensity.Text); diff --git a/2.10/Source/Regstry.pas b/2.10/Source/Regstry.pas index 98cd999..a8179ed 100644 --- a/2.10/Source/Regstry.pas +++ b/2.10/Source/Regstry.pas @@ -333,14 +333,16 @@ begin begin MaxSat := 100; end; +{ if Registry.ValueExists('FixedReference') then begin FixedReference := Registry.ReadBool('FixedReference'); end - else - begin - FixedReference := False; - end; + else FixedReference := False; +} + if Registry.ValueExists('ReferenceMode') then + ReferenceMode := Registry.ReadInteger('ReferenceMode') + else ReferenceMode := 0; if Registry.ValueExists('MaxLum') then begin MaxLum := Registry.ReadInteger('MaxLum'); @@ -506,7 +508,7 @@ begin end else begin - FixedReference := false; + ReferenceMode := 0; EditPrevQual := 1; MutatePrevQual := 1; AdjustPrevQual := 1; @@ -871,7 +873,7 @@ begin Registry.WriteInteger('SymmetryType', SymmetryType); Registry.WriteInteger('SymmetryOrder', SymmetryOrder); Registry.WriteInteger('VariationOptions', VariationOptions); - Registry.WriteBool('FixedReference', FixedReference); + Registry.WriteInteger('ReferenceMode', ReferenceMode); Registry.WriteInteger('MinNodes', MinNodes); Registry.WriteInteger('MinHue', MinHue); Registry.WriteInteger('MinSat', MinSat); diff --git a/2.10/Source/RndFlame.pas b/2.10/Source/RndFlame.pas index 80a137b..4e57a1c 100644 --- a/2.10/Source/RndFlame.pas +++ b/2.10/Source/RndFlame.pas @@ -133,6 +133,8 @@ begin end; /////////////////////////////////////////////////////////////////////////////// +(* --Z-- hmm, exactly the same function exists in module Main + function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer; { Sets up the triangles from the IFS code } var @@ -213,6 +215,7 @@ begin for j := 0 to 2 do triangles[i].y[j] := -triangles[i].y[j]; end; +*) /////////////////////////////////////////////////////////////////////////////// procedure EqualizeWeights(var cp: TControlPoint); @@ -377,7 +380,7 @@ begin Result.xform[i].density := 1 / Transforms; end; end; // case - TrianglesFromCp(Result, Triangles); + Result.TrianglesFromCp(Triangles); if Random(2) > 0 then ComputeWeights(Result, Triangles, transforms) else diff --git a/2.10/Source/ScriptForm.pas b/2.10/Source/ScriptForm.pas index 2446ac5..2c44d7f 100644 --- a/2.10/Source/ScriptForm.pas +++ b/2.10/Source/ScriptForm.pas @@ -310,7 +310,7 @@ var FileList: TStringList; function Mul33(M1, M2: TMatrix): TMatrix; -procedure Normalize(var cp: TControlPoint); +//procedure Normalize(var cp: TControlPoint); implementation @@ -493,13 +493,14 @@ end; procedure TScriptEditor.GetFixedReference(AMachine: TatVirtualMachine); begin with AMachine do - ReturnOutPutArg(FixedReference); + ReturnOutPutArg(ReferenceMode = 0); end; procedure TScriptEditor.SetFixedReference(AMachine: TatVirtualMachine); begin with AMachine do - FixedReference := GetInputArgAsBoolean(0); + if GetInputArgAsBoolean(0) then ReferenceMode := 0 + else ReferenceMode := 1; end; procedure TScriptEditor.GetSampleDensity(AMachine: TatVirtualMachine); @@ -1474,7 +1475,7 @@ begin if nxform < NXFORMS then for i := nxform to NXFORMS - 1 do cp1.xform[i].density := 0; - NormalizeWeights(cp1); + cp1.NormalizeWeights; // Check for symmetry parameter if cp1.symmetry <> 0 then begin @@ -1516,7 +1517,7 @@ begin for i := 0 to NXFORMS - 1 do if ScriptEditor.cp.xform[i].density = 0 then break; NumTransforms := i; - NormalizeWeights(ScriptEditor.cp); + ScriptEditor.cp.NormalizeWeights; // FlameName := FileList[index]; finally IFSStrings.Free; @@ -1588,7 +1589,7 @@ begin for i := 0 to NXFORMS - 1 do if ScriptEditor.cp.xform[i].density = 0 then break; NumTransforms := i; - NormalizeWeights(ScriptEditor.cp); + ScriptEditor.cp.NormalizeWeights; if SavedPal then ScriptEditor.cp.cmap := Palette; ScriptEditor.cp.name := FileList[index]; finally @@ -1620,13 +1621,13 @@ var i: integer; r: double; begin - MainForm.TrianglesFromCp(ScriptEditor.cp, Triangles); + ScriptEditor.cp.TrianglesFromCp(Triangles); r := AMachine.GetInputArgAsFloat(0) * pi / 180; for i := -1 to NumTransforms - 1 do begin Triangles[i] := RotateTriangle(Triangles[i], r); end; - GetXForms(ScriptEditor.cp, Triangles, NumTransforms); + ScriptEditor.cp.GetFromTriangles(Triangles, NumTransforms); end; procedure TOperationLibrary.AddSymmetryProc(AMachine: TatVirtualMachine); @@ -1644,10 +1645,10 @@ var Triangles: TTriangles; r: double; begin - MainForm.TrianglesFromCp(ScriptEditor.cp, Triangles); + ScriptEditor.cp.TrianglesFromCp(Triangles); r := AMachine.GetInputArgAsFloat(0) * pi / 180; Triangles[-1] := RotateTriangle(Triangles[-1], r); - GetXForms(ScriptEditor.cp, Triangles, NumTransforms); + ScriptEditor.cp.GetFromTriangles(Triangles, NumTransforms); end; procedure TOperationLibrary.ScaleProc(AMachine: TatVirtualMachine); @@ -1748,7 +1749,7 @@ begin if NumTransforms > 1 then begin AMachine.Paused := True; - Normalize(ScriptEditor.cp); + ScriptEditor.cp.NormalizeWeights; PreviewForm.cp.Copy(ScriptEditor.cp); AdjustScale(PreviewForm.cp, PreviewForm.Image.Width, PreviewForm.Image.Height); PreviewForm.Show; @@ -1763,7 +1764,7 @@ procedure TOperationLibrary.RenderProc(AMachine: TatVirtualMachine); begin if NumTransforms > 1 then begin - Normalize(ScriptEditor.cp); + ScriptEditor.cp.NormalizeWeights; ScriptRenderForm.cp.Copy(ScriptEditor.cp); ScriptRenderForm.Caption := 'Rendering ' + ScriptEditor.Renderer.Filename; ; ScriptRenderForm.Show; @@ -2912,7 +2913,7 @@ begin else if (LastError = '') and UpdateIt then begin - Normalize(cp); + cp.NormalizeWeights; MainForm.UpdateUndo; MainCp.Copy(cp); UpdateFlame; @@ -2944,10 +2945,10 @@ procedure TScriptEditor.UpdateFlame; begin MainForm.StopThread; MainForm.UpdateUndo; - Normalize(cp); + cp.NormalizeWeights; MainCp.Copy(cp); // MainCp.name := FlameName; - Transforms := MainForm.TrianglesFromCP(MainCp, MainTriangles); + Transforms := MainCp.TrianglesFromCP(MainTriangles); AdjustScale(MainCp, MainForm.Image.Width, MainForm.Image.Height); if ResetLocation then MainCp.CalcBoundBox else begin; @@ -2967,21 +2968,6 @@ end; { ******************************* Parseing *********************************** } -procedure Normalize(var cp: TControlPoint); -var - i: integer; - td: double; -begin - td := 0.0; - for i := 0 to NumTransforms - 1 do - td := td + cp.xform[i].Density; - if (td < 0.001) then - EqualizeWeights(cp) - else - for i := 0 to NumTransforms - 1 do - cp.xform[i].Density := cp.xform[i].Density / td; -end; - procedure copyxform(var dest: Txform; const source: TXform); var i: integer;