445 lines
12 KiB
ObjectPascal
445 lines
12 KiB
ObjectPascal
|
unit ScrMain;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||
|
Dialogs, Gauges, Render64, ControlPoint;
|
||
|
|
||
|
type
|
||
|
TfrmMain = class(TForm)
|
||
|
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
|
||
|
Shift: TShiftState; X, Y: Integer);
|
||
|
procedure FormKeyDown(Sender: TObject; var Key: Word;
|
||
|
Shift: TShiftState);
|
||
|
procedure FormActivate(Sender: TObject);
|
||
|
procedure FormCreate(Sender: TObject);
|
||
|
procedure FormDestroy(Sender: TObject);
|
||
|
procedure FormPaint(Sender: TObject);
|
||
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
||
|
private
|
||
|
cp : TControlPoint;
|
||
|
Render: TRenderer64;
|
||
|
bStop : boolean;
|
||
|
bm: TBitmap;
|
||
|
|
||
|
Quality: integer;
|
||
|
bSave: boolean;
|
||
|
bShowOtherImages: boolean;
|
||
|
Oversample: Integer;
|
||
|
FilterSize: double;
|
||
|
Density: double;
|
||
|
|
||
|
SaveIndex: integer;
|
||
|
SavePath: string;
|
||
|
ImageList: TStringList;
|
||
|
ShowNextImage: TDateTime;
|
||
|
StartTime: TDateTime;
|
||
|
Remainder: TDateTime;
|
||
|
|
||
|
procedure ReadSettings;
|
||
|
procedure PrePareSave;
|
||
|
procedure Save;
|
||
|
public
|
||
|
procedure Onprogress(prog: double);
|
||
|
end;
|
||
|
|
||
|
var
|
||
|
frmMain: TfrmMain;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
{$R *.dfm}
|
||
|
|
||
|
uses
|
||
|
math, jpeg, registry, FlameIO,
|
||
|
rndFlame, regstry, global;
|
||
|
|
||
|
procedure TfrmMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
|
||
|
Shift: TShiftState; X, Y: Integer);
|
||
|
begin
|
||
|
Close;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
|
||
|
Shift: TShiftState);
|
||
|
begin
|
||
|
Close;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.FormActivate(Sender: TObject);
|
||
|
begin
|
||
|
DecimalSeparator := '.';
|
||
|
|
||
|
OnActivate := nil;
|
||
|
|
||
|
ShowCursor(False);
|
||
|
|
||
|
ReadSettings;
|
||
|
|
||
|
Remainder := 1;
|
||
|
|
||
|
// first one quickly
|
||
|
cp.ParseString( 'pixels_per_unit 277.456647 center -1.0982659 0 gamma 2 spatial_filter_radius' +
|
||
|
' 0.5 contrast 1 brightness 1.5 zoom 0 spatial_oversample 1 sample_density 1 nbatches' +
|
||
|
' 1 white_level 200 cmap_inter 0 time 0 cmap 33 xform 0 density 1 color 0 var 0 0 0 1 0' +
|
||
|
' 0 0 coefs 0.466381997 -0.0618700013 0.0792416036 0.610638022 -0.475656986 -0.28115499'+
|
||
|
' xform 1 density 1 color 1 var 0 0 0 0 1 0 0 coefs -0.513867021 0.271649003 -0.254521996' +
|
||
|
' -0.550984025 -0.674094975 -0.600323975');
|
||
|
(*
|
||
|
'center 0.01 1.96 pixels_per_unit 145.24' +
|
||
|
'spatial_oversample 3 spatial_filter_radius 0.30' +
|
||
|
'sample_density 200.00' +
|
||
|
'nbatches 1 white_level 200 background 0.00 0.00 0.00' +
|
||
|
'brightness 4.00 gamma 4.00 vibrancy 1.00 hue_rotation 0.68 cmap_inter 0' +
|
||
|
'xform 0 density 0.17 color 1.00' +
|
||
|
'var 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00' +
|
||
|
'coefs 0.94 0.69 -0.27 0.75 1.67 0.29' +
|
||
|
'xform 1 density 0.17 color 0.00' +
|
||
|
'var 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00' +
|
||
|
'coefs -0.07 -0.94 0.69 -0.15 1.93 -1.57' +
|
||
|
'xform 2 density 0.17 color 0.00' +
|
||
|
'var 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00' +
|
||
|
'coefs 0.42 -0.37 -0.88 -0.25 -0.65 0.22' +
|
||
|
'xform 3 density 0.17 color 0.00' +
|
||
|
'var 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00' +
|
||
|
'coefs 0.61 0.99 0.06 0.51 -1.59 -1.58' +
|
||
|
'xform 4 density 0.17 color 0.00' +
|
||
|
'var 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00' +
|
||
|
'coefs -0.77 0.12 -0.36 -0.69 -0.74 1.53' +
|
||
|
'xform 5 density 0.17 color 0.00 ' +
|
||
|
'var 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00' +
|
||
|
'coefs 0.58 -0.20 -0.92 0.60 -0.29 1.30');
|
||
|
*)
|
||
|
cp.sample_density := 2;
|
||
|
cp.Width := ClientWidth;
|
||
|
cp.Height := ClientHeight;
|
||
|
cp.spatial_oversample := 1;
|
||
|
cp.spatial_filter_radius := 0.3;
|
||
|
cp.Gamma := 4;
|
||
|
cp.brightness := 4;
|
||
|
cp.CalcBoundbox;
|
||
|
Render.SetCP(cp);
|
||
|
|
||
|
StartTime := Now;
|
||
|
Render.Render;
|
||
|
if bstop then
|
||
|
Exit;
|
||
|
BM.Assign(Render.GetImage);
|
||
|
Canvas.StretchDraw(Rect(0,0,ClientWidth, ClientHeight),bm);
|
||
|
|
||
|
PrepareSave;
|
||
|
if bstop then
|
||
|
Exit;
|
||
|
|
||
|
ShowNextImage := Now + EncodeTime(0,0,5,0);
|
||
|
|
||
|
cp.Width := ClientWidth;
|
||
|
cp.Height := ClientHeight;
|
||
|
cp.spatial_filter_radius := 0.2;
|
||
|
cp.Gamma := 4;
|
||
|
cp.brightness := 4;
|
||
|
cp.spatial_oversample := 1;
|
||
|
|
||
|
Case Quality of
|
||
|
0:
|
||
|
begin
|
||
|
cp.sample_density := 10;
|
||
|
end;
|
||
|
1:
|
||
|
begin
|
||
|
cp.sample_density := 100;
|
||
|
end;
|
||
|
2:
|
||
|
begin
|
||
|
cp.sample_density := 1000;
|
||
|
end;
|
||
|
else
|
||
|
begin
|
||
|
cp.sample_density := Density;
|
||
|
cp.spatial_oversample := Oversample;
|
||
|
cp.spatial_filter_radius := FilterSize;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
// APO setting for randomflame
|
||
|
regstry.ReadSettings;
|
||
|
Global.MainSeed := Round(Random(100000));
|
||
|
|
||
|
while true do begin
|
||
|
Remainder := 0;
|
||
|
// cp.RandomCP;
|
||
|
(*
|
||
|
cp2 := cp.Clone;
|
||
|
cp2.pixels_per_unit := (cp.pixels_per_unit * 128)/cp.Width;
|
||
|
cp2.width := 256;
|
||
|
cp2.height := 256;
|
||
|
cp2.spatial_oversample := 1;
|
||
|
cp2.spatial_filter_radius := 0.1;
|
||
|
cp2.sample_density := 1;
|
||
|
cp2.gamma := 2;
|
||
|
cp2.brightness := 1;
|
||
|
cp2.contrast := 1;
|
||
|
|
||
|
Render.SetCP(cp2);
|
||
|
Render.Test(fracBlack, fracWhite, avgColor);
|
||
|
cp2.Free;
|
||
|
*)
|
||
|
// Canvas.Draw(0,100,Render.GetImage);
|
||
|
|
||
|
// if (fracBlack > 0.990) or ((avgColor/(fracBlack + 1E-6)) < 0.35) then
|
||
|
// Continue;
|
||
|
|
||
|
cp := RandomFlame(cp,0);
|
||
|
cp.Width := ClientWidth;
|
||
|
cp.Height := ClientHeight;
|
||
|
cp.spatial_filter_radius := 0.2;
|
||
|
cp.Gamma := 4;
|
||
|
cp.brightness := 4;
|
||
|
cp.spatial_oversample := 1;
|
||
|
|
||
|
Case Quality of
|
||
|
0:
|
||
|
begin
|
||
|
cp.sample_density := 10;
|
||
|
end;
|
||
|
1:
|
||
|
begin
|
||
|
cp.sample_density := 100;
|
||
|
end;
|
||
|
2:
|
||
|
begin
|
||
|
cp.sample_density := 1000;
|
||
|
end;
|
||
|
else
|
||
|
begin
|
||
|
cp.sample_density := Density;
|
||
|
cp.spatial_oversample := Oversample;
|
||
|
cp.spatial_filter_radius := FilterSize;
|
||
|
end;
|
||
|
end;
|
||
|
cp.CalcBoundbox;
|
||
|
|
||
|
Remainder := 1;
|
||
|
Render.SetCP(cp);
|
||
|
StartTime := Now;
|
||
|
|
||
|
Render.Render;
|
||
|
|
||
|
if bstop then
|
||
|
Exit;
|
||
|
|
||
|
bm.assign(Render.GetImage);
|
||
|
// bm.Canvas.Font.Color := ClWhite;
|
||
|
// bm.Canvas.Brush.Color := CLBlack;
|
||
|
// bm.Canvas.TextOut(10,10, Format('fracBlack : %.4f',[fracBlack] ));
|
||
|
// bm.Canvas.TextOut(10,26, Format('fracWhite : %.4f',[fracWhite] ));
|
||
|
// bm.Canvas.TextOut(10,42, Format('avgColor : %.4f',[avgColor] ));
|
||
|
// bm.Canvas.TextOut(10,58, Format('ColorValue: %.4f',[avgColor/fracBlack] ));
|
||
|
|
||
|
Canvas.Draw(0,0,bm);
|
||
|
Save;
|
||
|
ShowNextImage := Now + EncodeTime(0,0,30,0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.Onprogress(prog: double);
|
||
|
var
|
||
|
JPeg: TJPEGImage;
|
||
|
NewIndex: Integer;
|
||
|
Elapsed: TDateTime;
|
||
|
begin
|
||
|
if bstop then
|
||
|
Exit;
|
||
|
|
||
|
if bShowOtherImages and (Now > ShowNextImage) and (ImageList.Count > 0) then begin
|
||
|
NewIndex := Random(ImageList.Count);
|
||
|
|
||
|
JPeg := TJPEGImage.Create;
|
||
|
JPeg.LoadFromFile(SavePath + ImageList[NewIndex]);
|
||
|
|
||
|
bm.Assign(JPeg);
|
||
|
JPeg.Free;
|
||
|
|
||
|
repaint;
|
||
|
|
||
|
SetbkMode(Canvas.Handle, TRANSPARENT);
|
||
|
Canvas.TextOut(ClientWidth - 150, 10, ImageList[NewIndex]);
|
||
|
ShowNextImage := Now + EncodeTime(0,0,10,0);
|
||
|
end;
|
||
|
|
||
|
prog := (Render.Slice + Prog)/Render.NrSlices;
|
||
|
|
||
|
// Canvas.Brush.Color := clBlack;
|
||
|
// Canvas.Fillrect(Rect(7, ClientHeight - 13, ClientWidth - 7, ClientHeight - 7));
|
||
|
|
||
|
// Canvas.Brush.Color := clBlack;
|
||
|
// Canvas.Fillrect(Rect(5, ClientHeight - 15, ClientWidth - 5, ClientHeight - 5));
|
||
|
|
||
|
|
||
|
Canvas.Brush.Color := clYellow;
|
||
|
Canvas.FrameRect(Rect(5, ClientHeight - 15, ClientWidth - 5, ClientHeight - 5));
|
||
|
Canvas.Brush.Color := clYellow;
|
||
|
Canvas.Fillrect(Rect(7, ClientHeight - 13, 7 + Round(prog * (ClientWidth - 14)), ClientHeight - 7));
|
||
|
Canvas.Brush.Color := clBlack;
|
||
|
Canvas.Fillrect(Rect(7 + Round(prog * (ClientWidth - 14)), ClientHeight - 13, ClientWidth - 7, ClientHeight - 7));
|
||
|
|
||
|
Elapsed := Now - StartTime;
|
||
|
Canvas.Brush.Color := clBlack;
|
||
|
Canvas.TextOut(5, ClientHeight - 25 - 2 * Canvas.TextHeight('X'), Format('Elapsed %2.2d:%2.2d:%2.2d.%2.2d',
|
||
|
[Trunc(Elapsed * 24),
|
||
|
Trunc((Elapsed * 24 - Trunc(Elapsed * 24)) * 60),
|
||
|
Trunc((Elapsed * 24 * 60 - Trunc(Elapsed * 24 * 60)) * 60),
|
||
|
Trunc((Elapsed * 24 * 60 * 60 - Trunc(Elapsed * 24 * 60 * 60)) * 100)]));
|
||
|
|
||
|
if prog > 0 then
|
||
|
Remainder := Min(Remainder, Elapsed * (power(1/prog, 1.2) - 1));
|
||
|
|
||
|
Canvas.TextOut(5, ClientHeight - 20 - Canvas.TextHeight('X'), Format('Remainder %2.2d:%2.2d:%2.2d.%2.2d',
|
||
|
[Trunc(Remainder * 24),
|
||
|
Trunc((Remainder * 24 - Trunc(Remainder * 24)) * 60),
|
||
|
Trunc((Remainder * 24 * 60 - Trunc(Remainder * 24 * 60)) * 60),
|
||
|
Trunc((Remainder * 24 * 60 * 60 - Trunc(Remainder * 24 * 60 * 60)) * 100)]));
|
||
|
|
||
|
Canvas.TextOut(5, ClientHeight - 50 - Canvas.TextHeight('X'), IncludeTrailingPathDelimiter(ExtractFileDir(paramstr(0))) + 'images');
|
||
|
|
||
|
Application.ProcessMessages;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.FormCreate(Sender: TObject);
|
||
|
begin
|
||
|
bm:= TBitmap.create;
|
||
|
randomize;
|
||
|
cp := TControlPoint.Create;
|
||
|
Render := TRenderer64.Create;
|
||
|
Render.OnProgress := Onprogress;
|
||
|
ImageList := TStringList.Create;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.FormDestroy(Sender: TObject);
|
||
|
begin
|
||
|
ShowCursor(true);
|
||
|
cp.Free;
|
||
|
render.Free;
|
||
|
ImageList.Free;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.FormPaint(Sender: TObject);
|
||
|
begin
|
||
|
if assigned(bm) then
|
||
|
Canvas.Draw(0,0,bm);
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
||
|
begin
|
||
|
bm.Free;
|
||
|
Render.Stop;
|
||
|
bStop := True;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.ReadSettings;
|
||
|
var
|
||
|
Registry: TRegistry;
|
||
|
begin
|
||
|
Registry := TRegistry.Create;
|
||
|
try
|
||
|
Registry.RootKey := HKEY_CURRENT_USER;
|
||
|
if Registry.OpenKey('\Software\BobsFreubels\FlameSS', False) then begin
|
||
|
if Registry.ValueExists('SaveImage') then begin
|
||
|
bSave := Registry.ReadBool('SaveImage');
|
||
|
end else begin
|
||
|
bSave := False;
|
||
|
end;
|
||
|
if Registry.ValueExists('ShowOtherImages') then begin
|
||
|
bShowOtherImages := Registry.ReadBool('ShowOtherImages');
|
||
|
end else begin
|
||
|
bShowOtherImages := False;
|
||
|
end;
|
||
|
if Registry.ValueExists('Quality') then begin
|
||
|
Quality := Registry.ReadInteger('Quality');
|
||
|
end else begin
|
||
|
Quality := 1;
|
||
|
end;
|
||
|
if Registry.ValueExists('Oversample') then begin
|
||
|
Oversample := Registry.ReadInteger('Oversample');
|
||
|
end else begin
|
||
|
Oversample := 1;
|
||
|
end;
|
||
|
if Registry.ValueExists('Filter') then begin
|
||
|
Filtersize := Registry.ReadFloat('Filter');
|
||
|
end else begin
|
||
|
Filtersize := 0.1;
|
||
|
end;
|
||
|
if Registry.ValueExists('Density') then begin
|
||
|
Density := Registry.ReadFloat('Density');
|
||
|
end else begin
|
||
|
Density := 100;
|
||
|
end;
|
||
|
|
||
|
end else begin
|
||
|
bSave := False;
|
||
|
Quality := 1;
|
||
|
end;
|
||
|
finally
|
||
|
Registry.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.PrePareSave;
|
||
|
var
|
||
|
sr: TSearchRec;
|
||
|
begin
|
||
|
// if not bSave then
|
||
|
// Exit;
|
||
|
|
||
|
SaveIndex := 1;
|
||
|
|
||
|
SavePath := IncludeTrailingPathDelimiter(ExtractFileDir(paramstr(0))) + 'images';
|
||
|
SavePath := IncludeTrailingPathDelimiter(SavePath);
|
||
|
|
||
|
ForceDirectories(SavePath);
|
||
|
|
||
|
if FindFirst(SavePath + '*.jpg', faAnyFile, sr) = 0 then begin
|
||
|
repeat
|
||
|
ImageList.Add(UpperCase(sr.Name));
|
||
|
until FindNext(sr) <> 0;
|
||
|
FindClose(sr);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmMain.Save;
|
||
|
var
|
||
|
sl: TStringlist;
|
||
|
ImageName: string;
|
||
|
jpeg : TJPegImage;
|
||
|
begin
|
||
|
if not bSave then
|
||
|
Exit;
|
||
|
|
||
|
repeat
|
||
|
ImageName := Format('FL_%5.5d.JPG',[SaveIndex]);
|
||
|
Inc(SaveIndex);
|
||
|
until (ImageList.IndexOf(ImageName) < 0);
|
||
|
|
||
|
jpeg := TJPegImage.Create;
|
||
|
jpeg.assign(bm);
|
||
|
jpeg.CompressionQuality := 80;
|
||
|
jpeg.SaveToFile(SavePath+ImageName);
|
||
|
jpeg.free;
|
||
|
|
||
|
ImageList.Add(ImageName);
|
||
|
|
||
|
sl := TStringlist.Create;
|
||
|
|
||
|
Cp.name := ChangeFileExt(ImageName,'');
|
||
|
sl.add(FlameToXML(cp,False, True));
|
||
|
|
||
|
sl.SaveToFile(ChangeFileExt(SavePath+ImageName,'.flame'));
|
||
|
sl.Free;
|
||
|
|
||
|
// cp.SaveToFile(ChangeFileExt(SavePath+ImageName,'.TXT'));
|
||
|
end;
|
||
|
|
||
|
end.
|
||
|
|