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