Getting a random gradient from a given file
This commit is contained in:
parent
ca460f2242
commit
5c8e54621a
@ -141,6 +141,7 @@ var
|
|||||||
mutantMinTransforms, mutantMaxTransforms: integer;
|
mutantMinTransforms, mutantMaxTransforms: integer;
|
||||||
KeepBackground: boolean;
|
KeepBackground: boolean;
|
||||||
randGradient: Integer;
|
randGradient: Integer;
|
||||||
|
randGradientFile: string;
|
||||||
defFlameFile: string;
|
defFlameFile: string;
|
||||||
|
|
||||||
PlaySoundOnRenderComplete: boolean;
|
PlaySoundOnRenderComplete: boolean;
|
||||||
|
@ -991,11 +991,55 @@ object OptionsForm: TOptionsForm
|
|||||||
object TabSheet1: TTabSheet
|
object TabSheet1: TTabSheet
|
||||||
Caption = 'Gradient'
|
Caption = 'Gradient'
|
||||||
ImageIndex = 5
|
ImageIndex = 5
|
||||||
|
object btnGradientsFile: TSpeedButton
|
||||||
|
Left = 120
|
||||||
|
Top = 121
|
||||||
|
Width = 24
|
||||||
|
Height = 24
|
||||||
|
Hint = 'Browse...'
|
||||||
|
Flat = True
|
||||||
|
Font.Charset = ANSI_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -11
|
||||||
|
Font.Name = 'Arial'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Glyph.Data = {
|
||||||
|
36030000424D3603000000000000360000002800000010000000100000000100
|
||||||
|
18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
|
||||||
|
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
|
||||||
|
FFFF00FFFF00FFFF00FF00000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000FF00FFFF00FFFF00FFFF00FFFF00FF000000000000
|
||||||
|
9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF000000FF00
|
||||||
|
FFFF00FFFF00FFFF00FF0000009FFFFF0000009FCFFF9FCFFF9FCFFF9FCFFF9F
|
||||||
|
CFFF9FCFFF9FCFFF9FCFFF9FCFFF000000FF00FFFF00FFFF00FF0000009FFFFF
|
||||||
|
9FFFFF0000009FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCF
|
||||||
|
FF000000FF00FFFF00FF0000009FFFFF9FFFFF9FFFFF0000009FCFFF9FCFFF9F
|
||||||
|
CFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF9FCFFF000000FF00FF0000009FFFFF
|
||||||
|
9FFFFF9FFFFF9FFFFF0000000000000000000000000000000000000000000000
|
||||||
|
00000000000000FF00FF0000009FFFFF9FFFFF9FFFFF9FFFFF9FFFFF9FFFFF9F
|
||||||
|
FFFF9FFFFF9FFFFF000000FF00FFFF00FFFF00FFFF00FFFF00FF0000009FFFFF
|
||||||
|
9FFFFF9FFFFF9FFFFF9FFFFF9FFFFF9FFFFF9FFFFF9FFFFF000000FF00FFFF00
|
||||||
|
FFFF00FFFF00FFFF00FF0000009FFFFF9FFFFF9FFFFF00000000000000000000
|
||||||
|
0000000000000000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF000000
|
||||||
|
000000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0000
|
||||||
|
00000000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
|
||||||
|
00FFFF00FFFF00FFFF00FFFF00FFFF00FF000000000000FF00FFFF00FFFF00FF
|
||||||
|
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C0C0CFF00FFFF00FFFF00FF0000
|
||||||
|
00FF00FF000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
|
||||||
|
00FFFF00FF0B0B0B020202000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
|
||||||
|
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
|
||||||
|
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
|
||||||
|
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
|
||||||
|
ParentFont = False
|
||||||
|
ParentShowHint = False
|
||||||
|
ShowHint = True
|
||||||
|
OnClick = btnGradientsFileClick
|
||||||
|
end
|
||||||
object grpGradient: TRadioGroup
|
object grpGradient: TRadioGroup
|
||||||
Left = 8
|
Left = 8
|
||||||
Top = 4
|
Top = 4
|
||||||
Width = 137
|
Width = 137
|
||||||
Height = 97
|
Height = 117
|
||||||
HelpContext = 1029
|
HelpContext = 1029
|
||||||
Caption = 'On random flame'
|
Caption = 'On random flame'
|
||||||
ItemIndex = 0
|
ItemIndex = 0
|
||||||
@ -1003,14 +1047,15 @@ object OptionsForm: TOptionsForm
|
|||||||
'Use random preset'
|
'Use random preset'
|
||||||
'Use default'
|
'Use default'
|
||||||
'Use current'
|
'Use current'
|
||||||
'Randomize')
|
'Randomize'
|
||||||
|
'Random from a file')
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
end
|
end
|
||||||
object GroupBox3: TGroupBox
|
object GroupBox3: TGroupBox
|
||||||
Left = 153
|
Left = 153
|
||||||
Top = 4
|
Top = 4
|
||||||
Width = 281
|
Width = 281
|
||||||
Height = 189
|
Height = 229
|
||||||
Caption = 'Randomize'
|
Caption = 'Randomize'
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
object Label18: TLabel
|
object Label18: TLabel
|
||||||
@ -1235,7 +1280,7 @@ object OptionsForm: TOptionsForm
|
|||||||
end
|
end
|
||||||
object GroupBox13: TGroupBox
|
object GroupBox13: TGroupBox
|
||||||
Left = 8
|
Left = 8
|
||||||
Top = 106
|
Top = 146
|
||||||
Width = 137
|
Width = 137
|
||||||
Height = 87
|
Height = 87
|
||||||
Caption = 'Smooth palette'
|
Caption = 'Smooth palette'
|
||||||
@ -1273,6 +1318,13 @@ object OptionsForm: TOptionsForm
|
|||||||
Text = '10000'
|
Text = '10000'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
object txtGradientsFile: TEdit
|
||||||
|
Left = 8
|
||||||
|
Top = 122
|
||||||
|
Width = 110
|
||||||
|
Height = 21
|
||||||
|
TabOrder = 3
|
||||||
|
end
|
||||||
end
|
end
|
||||||
object TabSheet6: TTabSheet
|
object TabSheet6: TTabSheet
|
||||||
Caption = 'UPR'
|
Caption = 'UPR'
|
||||||
|
@ -217,6 +217,8 @@ type
|
|||||||
chkOldPaletteFormat: TCheckBox;
|
chkOldPaletteFormat: TCheckBox;
|
||||||
rgZoomingMode: TRadioGroup;
|
rgZoomingMode: TRadioGroup;
|
||||||
chkShowAllXforms: TCheckBox;
|
chkShowAllXforms: TCheckBox;
|
||||||
|
txtGradientsFile: TEdit;
|
||||||
|
btnGradientsFile: TSpeedButton;
|
||||||
procedure btnCancelClick(Sender: TObject);
|
procedure btnCancelClick(Sender: TObject);
|
||||||
procedure FormShow(Sender: TObject);
|
procedure FormShow(Sender: TObject);
|
||||||
procedure btnOKClick(Sender: TObject);
|
procedure btnOKClick(Sender: TObject);
|
||||||
@ -248,6 +250,7 @@ type
|
|||||||
procedure pnlHelpersColorClick(Sender: TObject);
|
procedure pnlHelpersColorClick(Sender: TObject);
|
||||||
procedure btnBrowseSoundClick(Sender: TObject);
|
procedure btnBrowseSoundClick(Sender: TObject);
|
||||||
procedure btnPlayClick(Sender: TObject);
|
procedure btnPlayClick(Sender: TObject);
|
||||||
|
procedure btnGradientsFileClick(Sender: TObject);
|
||||||
|
|
||||||
private
|
private
|
||||||
{ Private declarations }
|
{ Private declarations }
|
||||||
@ -375,6 +378,7 @@ begin
|
|||||||
|
|
||||||
{ Gradient tab }
|
{ Gradient tab }
|
||||||
grpGradient.ItemIndex := randGradient;
|
grpGradient.ItemIndex := randGradient;
|
||||||
|
txtGradientsFile.Text := randGradientFile;
|
||||||
udMinNodes.Position := MinNodes;
|
udMinNodes.Position := MinNodes;
|
||||||
udMaxNodes.Position := MaxNodes;
|
udMaxNodes.Position := MaxNodes;
|
||||||
udMinHue.Position := MinHue;
|
udMinHue.Position := MinHue;
|
||||||
@ -507,6 +511,7 @@ begin
|
|||||||
|
|
||||||
{Gradient tab }
|
{Gradient tab }
|
||||||
randGradient := grpGradient.ItemIndex;
|
randGradient := grpGradient.ItemIndex;
|
||||||
|
randGradientFile := txtGradientsFile.Text;
|
||||||
MinNodes := udMinNodes.Position;
|
MinNodes := udMinNodes.Position;
|
||||||
MaxNodes := udMaxNodes.Position;
|
MaxNodes := udMaxNodes.Position;
|
||||||
MinHue := udMinHue.Position;
|
MinHue := udMinHue.Position;
|
||||||
@ -788,5 +793,16 @@ begin
|
|||||||
sndPlaySound(pchar(SND_ALIAS_SYSTEMASTERISK), SND_ALIAS_ID or SND_NOSTOP or SND_ASYNC);
|
sndPlaySound(pchar(SND_ALIAS_SYSTEMASTERISK), SND_ALIAS_ID or SND_NOSTOP or SND_ASYNC);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TOptionsForm.btnGradientsFileClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
OpenDialog.Filter := 'Gradient files (*.ugr)|*.ugr';
|
||||||
|
OpenDialog.InitialDir := ExtractFilePath(randGradientFile);
|
||||||
|
OpenDialog.FileName := '';
|
||||||
|
if OpenDialog.Execute then
|
||||||
|
begin
|
||||||
|
txtGradientsFile.text := OpenDialog.FileName;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -373,6 +373,14 @@ begin
|
|||||||
begin
|
begin
|
||||||
MaxSat := 100;
|
MaxSat := 100;
|
||||||
end;
|
end;
|
||||||
|
if Registry.ValueExists('RandomGradientFile') then
|
||||||
|
begin
|
||||||
|
randGradientFile := Registry.ReadString('RandomGradientFile');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
randGradientFile := ''
|
||||||
|
end;
|
||||||
if Registry.ValueExists('ReferenceMode') then
|
if Registry.ValueExists('ReferenceMode') then
|
||||||
ReferenceMode := Registry.ReadInteger('ReferenceMode')
|
ReferenceMode := Registry.ReadInteger('ReferenceMode')
|
||||||
else ReferenceMode := 0;
|
else ReferenceMode := 0;
|
||||||
@ -621,6 +629,7 @@ begin
|
|||||||
MaxHue := 600;
|
MaxHue := 600;
|
||||||
MaxSat := 100;
|
MaxSat := 100;
|
||||||
MaxLum := 100;
|
MaxLum := 100;
|
||||||
|
randGradientFile := '';
|
||||||
BatchSize := 100;
|
BatchSize := 100;
|
||||||
ScriptPath := DefaultPath + 'Scripts\';
|
ScriptPath := DefaultPath + 'Scripts\';
|
||||||
defLibrary := DefaultPath + 'Scripts\Functions.asc';
|
defLibrary := DefaultPath + 'Scripts\Functions.asc';
|
||||||
@ -1043,6 +1052,7 @@ begin
|
|||||||
Registry.WriteInteger('MaxHue', MaxHue);
|
Registry.WriteInteger('MaxHue', MaxHue);
|
||||||
Registry.WriteInteger('MaxSat', MaxSat);
|
Registry.WriteInteger('MaxSat', MaxSat);
|
||||||
Registry.WriteInteger('MaxLum', MaxLum);
|
Registry.WriteInteger('MaxLum', MaxLum);
|
||||||
|
Registry.WriteString('RandomGradientFile', randGradientFile);
|
||||||
Registry.WriteInteger('BatchSize', BatchSize);
|
Registry.WriteInteger('BatchSize', BatchSize);
|
||||||
Registry.WriteString('ScriptPath', ScriptPath);
|
Registry.WriteString('ScriptPath', ScriptPath);
|
||||||
Registry.WriteInteger('ExportFileFormat', ExportFileFormat);
|
Registry.WriteInteger('ExportFileFormat', ExportFileFormat);
|
||||||
|
@ -28,10 +28,155 @@ function RandomFlame(SourceCP: TControlPoint= nil; algorithm: integer = 0): TCon
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
SysUtils, Global, cmap, GradientHlpr, XFormMan;
|
SysUtils, Global, cmap, GradientHlpr, XFormMan, Classes;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure RGBBlend(a, b: integer; var Palette: TColorMap);
|
||||||
|
{ Linear blend between to indices of a palette }
|
||||||
|
var
|
||||||
|
c, v: real;
|
||||||
|
vrange, range: real;
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
if a = b then
|
||||||
|
begin
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
range := b - a;
|
||||||
|
vrange := Palette[b mod 256][0] - Palette[a mod 256][0];
|
||||||
|
c := Palette[a mod 256][0];
|
||||||
|
v := vrange / range;
|
||||||
|
for i := (a + 1) to (b - 1) do
|
||||||
|
begin
|
||||||
|
c := c + v;
|
||||||
|
Palette[i mod 256][0] := Round(c);
|
||||||
|
end;
|
||||||
|
vrange := Palette[b mod 256][1] - Palette[a mod 256][1];
|
||||||
|
c := Palette[a mod 256][1];
|
||||||
|
v := vrange / range;
|
||||||
|
for i := a + 1 to b - 1 do
|
||||||
|
begin
|
||||||
|
c := c + v;
|
||||||
|
Palette[i mod 256][1] := Round(c);
|
||||||
|
end;
|
||||||
|
vrange := Palette[b mod 256][2] - Palette[a mod 256][2];
|
||||||
|
c := Palette[a mod 256][2];
|
||||||
|
v := vrange / range;
|
||||||
|
for i := a + 1 to b - 1 do
|
||||||
|
begin
|
||||||
|
c := c + v;
|
||||||
|
Palette[i mod 256][2] := Round(c);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CreatePalette(strng: string): TColorMap;
|
||||||
|
{ Loads a palette from a gradient string }
|
||||||
|
var
|
||||||
|
Strings: TStringList;
|
||||||
|
index, i: integer;
|
||||||
|
Tokens: TStringList;
|
||||||
|
Indices, Colors: TStringList;
|
||||||
|
a, b: integer;
|
||||||
|
begin
|
||||||
|
Strings := TStringList.Create;
|
||||||
|
Tokens := TStringList.Create;
|
||||||
|
Indices := TStringList.Create;
|
||||||
|
Colors := TStringList.Create;
|
||||||
|
try
|
||||||
|
try
|
||||||
|
Strings.Text := strng;
|
||||||
|
if Pos('}', Strings.Text) = 0 then raise EFormatInvalid.Create('No closing brace');
|
||||||
|
if Pos('{', Strings[0]) = 0 then raise EFormatInvalid.Create('No opening brace.');
|
||||||
|
GetTokens(ReplaceTabs(strings.text), tokens);
|
||||||
|
Tokens.Text := Trim(Tokens.text);
|
||||||
|
i := 0;
|
||||||
|
while (Pos('}', Tokens[i]) = 0) and (Pos('opacity:', Lowercase(Tokens[i])) = 0) do
|
||||||
|
begin
|
||||||
|
if Pos('index=', LowerCase(Tokens[i])) <> 0 then
|
||||||
|
Indices.Add(GetVal(Tokens[i]))
|
||||||
|
else if Pos('color=', LowerCase(Tokens[i])) <> 0 then
|
||||||
|
Colors.Add(GetVal(Tokens[i]));
|
||||||
|
inc(i)
|
||||||
|
end;
|
||||||
|
for i := 0 to 255 do
|
||||||
|
begin
|
||||||
|
Result[i][0] := 0;
|
||||||
|
Result[i][1] := 0;
|
||||||
|
Result[i][2] := 0;
|
||||||
|
end;
|
||||||
|
if Indices.Count = 0 then raise EFormatInvalid.Create('No color info');
|
||||||
|
for i := 0 to Indices.Count - 1 do
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
index := StrToInt(Indices[i]);
|
||||||
|
while index < 0 do inc(index, 400);
|
||||||
|
index := Round(Index * (255 / 399));
|
||||||
|
indices[i] := IntToStr(index);
|
||||||
|
assert(index>=0);
|
||||||
|
assert(index<256);
|
||||||
|
Result[index][0] := StrToInt(Colors[i]) mod 256;
|
||||||
|
Result[index][1] := trunc(StrToInt(Colors[i]) / 256) mod 256;
|
||||||
|
Result[index][2] := trunc(StrToInt(Colors[i]) / 65536);
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
i := 1;
|
||||||
|
repeat
|
||||||
|
a := StrToInt(Trim(Indices[i - 1]));
|
||||||
|
b := StrToInt(Trim(Indices[i]));
|
||||||
|
RGBBlend(a, b, Result);
|
||||||
|
inc(i);
|
||||||
|
until i = Indices.Count;
|
||||||
|
if (Indices[0] <> '0') or (Indices[Indices.Count - 1] <> '255') then
|
||||||
|
begin
|
||||||
|
a := StrToInt(Trim(Indices[Indices.Count - 1]));
|
||||||
|
b := StrToInt(Trim(Indices[0])) + 256;
|
||||||
|
RGBBlend(a, b, Result);
|
||||||
|
end;
|
||||||
|
except on EFormatInvalid do
|
||||||
|
begin
|
||||||
|
// Result := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
Tokens.Free;
|
||||||
|
Strings.Free;
|
||||||
|
Indices.Free;
|
||||||
|
Colors.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure GetGradientFileGradientsNames(const filename: string; var NamesList: TStringList);
|
||||||
|
var
|
||||||
|
i, p: integer;
|
||||||
|
Title: string;
|
||||||
|
FStrings: TStringList;
|
||||||
|
begin
|
||||||
|
FStrings := TStringList.Create;
|
||||||
|
FStrings.LoadFromFile(filename);
|
||||||
|
try
|
||||||
|
if (Pos('{', FStrings.Text) <> 0) then
|
||||||
|
begin
|
||||||
|
for i := 0 to FStrings.Count - 1 do
|
||||||
|
begin
|
||||||
|
p := Pos('{', FStrings[i]);
|
||||||
|
if (p <> 0) and (Pos('(3D)', FStrings[i]) = 0) then
|
||||||
|
begin
|
||||||
|
Title := Trim(Copy(FStrings[i], 1, p - 1));
|
||||||
|
if Title <> '' then
|
||||||
|
NamesList.Add(Trim(Copy(FStrings[i], 1, p - 1)));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FStrings.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure RandomGradient(SourceCP, DestCP: TControlPoint);
|
procedure RandomGradient(SourceCP, DestCP: TControlPoint);
|
||||||
|
var
|
||||||
|
tmpGrad: string;
|
||||||
|
tmpGrdList: TStringList;
|
||||||
begin
|
begin
|
||||||
case randGradient of
|
case randGradient of
|
||||||
0:
|
0:
|
||||||
@ -57,6 +202,20 @@ begin
|
|||||||
end;
|
end;
|
||||||
3:
|
3:
|
||||||
DestCP.cmap := GradientHelper.RandomGradient;
|
DestCP.cmap := GradientHelper.RandomGradient;
|
||||||
|
4:
|
||||||
|
if FileExists(randGradientFile) then
|
||||||
|
begin
|
||||||
|
tmpGrdList := TStringList.Create;
|
||||||
|
GetGradientFileGradientsNames(randGradientFile, tmpGrdList);
|
||||||
|
tmpGrad := GetGradient(randGradientFile, tmpGrdList.Strings[random(tmpGrdList.Count)]);
|
||||||
|
DestCP.cmap := CreatePalette(tmpGrad);
|
||||||
|
tmpGrdList.Free;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
cmap_index := Random(NRCMAPS);
|
||||||
|
GetCMap(cmap_index, 1, DestCP.cmap);
|
||||||
|
DestCP.cmapIndex := cmap_index;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user