{ Apophysis Copyright (C) 2001-2004 Mark Townsend Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit Template; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Translation, Dialogs, StdCtrls, ComCtrls, ImgList, ControlPoint, cmap, RenderingInterface, Main, Global, Adjust; type TTemplateForm = class(TForm) TemplateList: TListView; btnCancel: TButton; btnOK: TButton; UsedThumbnails: TImageList; Files: TListBox; lblFile: TLabel; procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); procedure TemplateListChange(Sender: TObject; Item: TListItem; Change: TItemChange); procedure btnOKClick(Sender: TObject); procedure btnCancelClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var TemplateForm: TTemplateForm; const blankFlameXML1 = ''; blankFlameXML2 = ''; blankFlameXML3 = ''; procedure ListTemplateByFileName(filename:string); implementation {$R *.dfm} function LoadUserTemplates2(mask:string): integer; var FindResult: integer; SearchRec : TSearchRec; Path : string; begin Path:=AppPath + templatePath + '\'; result := 0; FindResult := FindFirst(Path + Mask, faAnyFile - faDirectory, SearchRec); while FindResult = 0 do begin ListTemplateByFileName(Path + SearchRec.Name); result := result + 1; FindResult := FindNext(SearchRec); end; { free memory } FindClose(SearchRec); end; function LoadUserTemplates:integer; begin LoadUserTemplates2('*.flame'); LoadUserTemplates2('*.template'); Result := 0; // make RTL happy end; function BlankXML:string; var i:integer; s:string; const break = ' '; begin s:=blankFlameXML1 + break + blankFlameXML2 + break + blankFlameXML3 + break; for i:=1 to 256 do begin s := s + '000000'; if (i mod 32 = 0) then s := s + break; end; s := s + ''; Result := s; end; procedure DropBlank(); var flameXML: string; cp: TControlPoint; bm: TBitmap; cmap: TColorMap; zoom: double; center: array[0..1] of double; brightness, gamma, vibrancy: double; Render: TRenderer; ListItem: TListItem; index: integer; begin cp := TControlPoint.Create; Render := TRenderer.Create; bm := TBitmap.Create; cp.Clear; flameXML := BlankXML; MainForm.ParseXML(cp, PCHAR(flameXML), true); cp.AdjustScale(TemplateForm.UsedThumbnails.Width, TemplateForm.UsedThumbnails.Height); //Clipboard.SetTextBuf(PChar(Trim(flameXML))); // start preview cp.Width := TemplateForm.UsedThumbnails.Width; cp.Height := TemplateForm.UsedThumbnails.Height; cp.spatial_oversample := 1; cp.spatial_filter_radius := 0.1; cp.sample_density := 3; // Render.Compatibility := compatibility; try Render.SetCP(cp); Render.Render; finally BM.Assign(Render.GetImage); cp.Free; Render.free; end; // Thumbnails TemplateForm.UsedThumbnails.Add(bm, nil); ListItem := TemplateForm.TemplateList.Items.Add; ListItem.Caption := 'Blank Flame'; ListItem.ImageIndex := 0; TemplateForm.Files.Items.Add('n/a'); //end preview // Application.ProcessMessages; end; procedure DropListItem(FileName: string; FlameName: string); var flameXML: string; cp: TControlPoint; bm: TBitmap; cmap: TColorMap; zoom: double; center: array[0..1] of double; brightness, gamma, vibrancy: double; Render: TRenderer; ListItem: TListItem; index: integer; begin cp := TControlPoint.Create; Render := TRenderer.Create; bm := TBitmap.Create; cp.Clear; flameXML := LoadXMLFlameText(filename, FlameName); MainForm.ParseXML(cp, PCHAR(flameXML), true); cp.AdjustScale(TemplateForm.UsedThumbnails.Width, TemplateForm.UsedThumbnails.Height); //Clipboard.SetTextBuf(PChar(Trim(flameXML))); // start preview cp.Width := TemplateForm.UsedThumbnails.Width; cp.Height := TemplateForm.UsedThumbnails.Height; cp.spatial_oversample := 1; cp.spatial_filter_radius := 0.1; cp.sample_density := 3; // Render.Compatibility := compatibility; try Render.SetCP(cp); Render.Render; finally BM.Assign(Render.GetImage); cp.Free; Render.free; end; // Thumbnails TemplateForm.UsedThumbnails.Add(bm, nil); ListItem := TemplateForm.TemplateList.Items.Add; ListItem.Caption := FlameName; ListItem.ImageIndex := TemplateForm.TemplateList.Items.Count - 1; TemplateForm.Files.Items.Add(FileName); //end preview // Application.ProcessMessages; end; procedure ListTemplateByFileName(filename:string); { List .flame file } var sel:integer; i, p, img: integer; Title: string; ListItem: TListItem; FStrings: TStringList; bm: TBitmap; begin sel := 0; if not FileExists(FileName) then exit; FStrings := TStringList.Create; FStrings.LoadFromFile(FileName); try if (Pos(' 0) then begin for i := 0 to FStrings.Count - 1 do begin p := Pos(' 0) then begin MainForm.ListXMLScanner.LoadFromBuffer(PAnsiChar(AnsiString(FSTrings[i]))); MainForm.ListXMLScanner.Execute; if Length(pname) = 0 then Title := '*untitled ' + ptime else Title := Trim(pname); if Title <> '' then begin { Otherwise bad format } //ListItem := MainForm.ListView.Items.Add; //Listitem.Caption := Title; DropListItem(FileName, Title); end; end; end; end; finally FStrings.Free; end; end; procedure ListTemplate; var i:integer; bm:TBitmap; begin TemplateForm.TemplateList.Items.BeginUpdate; TemplateForm.TemplateList.Items.Clear; TemplateForm.UsedThumbnails.Clear; // hmmm... (*for i := 0 to TemplateForm.UsedThumbnails.Count - 1 do begin TemplateForm.UsedThumbnails.GetBitmap(i, bm); bm.Free; end; *) DropBlank; ListTemplateByFileName(AppPath + templateFileName); LoadUserTemplates; TemplateForm.TemplateList.Items.EndUpdate; TemplateForm.TemplateList.Selected := TemplateForm.TemplateList.Items[0]; end; procedure TTemplateForm.FormCreate(Sender: TObject); begin self.Caption := TextByKey('template-title'); btnOK.Caption := TextByKey('common-ok'); btnCancel.Caption := TextByKey('common-cancel'); end; procedure TTemplateForm.TemplateListChange(Sender: TObject; Item: TListItem; Change: TItemChange); var fn : string; begin if (TemplateList.Selected = nil) then begin btnOK.Enabled := false; end else begin if (TemplateList.Selected.Index >= 0) then begin btnOK.Enabled := true; if (TemplateList.Selected.Index > 0) then begin fn := ChangeFileExt(ExtractFileName(Files.Items[TemplateList.Selected.Index]), ''); if (LowerCase(fn) <> 'default') then lblFile.Caption := 'Template file: ' + fn else lblFile.Caption := ''; end else begin lblFile.Caption := ''; end; end else begin btnOK.Enabled := false; end; end; end; procedure TTemplateForm.btnOKClick(Sender: TObject); var flameXML:string; fn:string; ci:integer; begin fn:=Files.Items[TemplateList.Selected.Index]; if (TemplateList.Selected.Index = 0) then flameXML := BlankXML else flameXML := LoadXMLFlameText(fn, TemplateList.Selected.Caption); MainForm.UpdateUndo; MainForm.StopThread; MainForm.InvokeLoadXML(flameXML); Transforms := MainCp.TrianglesFromCP(MainTriangles); MainForm.Statusbar.Panels[3].Text := MainCp.name; {if ResizeOnLoad then} MainForm.ResizeImage; MainForm.RedrawTimer.Enabled := True; Application.ProcessMessages; MainForm.UpdateWindows; ci := Random(256); //Random(NRCMAPS); GetCMap(ci, 1, MainCp.cmap); MainCp.cmapIndex := ci; AdjustForm.TemplateRandomizeGradient; btnCancelClick(sender); end; procedure TTemplateForm.btnCancelClick(Sender: TObject); begin Close(); end; procedure TTemplateForm.FormShow(Sender: TObject); begin ListTemplate; end; end.