ADMIN: migration complete

git-svn-id: https://svn.code.sf.net/p/apophysis7x/svn/trunk@1 a5d1c0f9-a0e9-45c6-87dd-9d276e40c949
This commit is contained in:
xyrus02 2013-07-28 08:58:33 +00:00
commit 95a2f54683
258 changed files with 175238 additions and 0 deletions

222
Apophysis7X.dpr Normal file
View File

@ -0,0 +1,222 @@
{
Apophysis Copyright (C) 2001-2004 Mark Townsend
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov
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.
}
program Apophysis7X;
{%ToDo 'Assets\Apophysis7X.todo'}
{$R 'Resources\Apophysis7X.res'}
{$SetPEFlags $20}
{$ifdef VER240}
// we need to update TMS Scripter to the XE3 version...
{$ifndef DisableScripting}
{$Define DisableScripting}
{$endif}
{$endif}
uses
{-- BASIC --}
FastMM4 in 'System\FastMM4.pas',
FastMM4Messages in 'System\FastMM4Messages.pas',
Forms, Dialogs, SysUtils,
Binary in 'IO\Binary.pas',
Base64 in 'IO\Base64.pas',
sdStringTable in 'System\sdStringTable.pas',
CustomDrawControl in 'System\CustomDrawControl.pas',
LibXmlComps in 'System\LibXmlComps.pas',
LibXmlParser in 'System\LibXmlParser.pas',
Windows7 in 'System\Windows7.pas',
RegexHelper in 'System\RegexHelper.pas',
CurvesControl in 'System\CurvesControl.pas',
{$ifdef Apo7X64}
// if on x64, we don't use assembler
{$else}
AsmRandom in 'System\AsmRandom.pas',
{$endif}
{-- CORE --}
Global in 'Core\Global.pas',
CommandLine in 'IO\CommandLine.pas',
MissingPlugin in 'IO\MissingPlugin.pas',
Settings in 'IO\Settings.pas',
Translation in 'Core\Translation.pas',
ParameterIO in 'IO\ParameterIO.pas',
Bezier in 'Core\Bezier.pas',
{-- FLAME --}
RndFlame in 'Flame\RndFlame.pas',
ControlPoint in 'Flame\ControlPoint.pas',
cmapdata in 'ColorMap\cmapdata.pas',
cmap in 'ColorMap\cmap.pas',
GradientHlpr in 'ColorMap\GradientHlpr.pas',
XFormMan in 'Core\XFormMan.pas',
XForm in 'Flame\XForm.pas',
BaseVariation in 'Core\BaseVariation.pas',
{-- RENDERER --}
RenderingCommon in 'Rendering\RenderingCommon.pas',
RenderingInterface in 'Rendering\RenderingInterface.pas',
RenderingImplementation in 'Rendering\RenderingImplementation.pas',
BucketFillerThread in 'Rendering\BucketFillerThread.pas',
RenderThread in 'Rendering\RenderThread.pas',
ImageMaker in 'Rendering\ImageMaker.pas',
{-- VARIATIONS --}
varHemisphere in 'Variations\varHemisphere.pas',
varLog in 'Variations\varLog.pas',
varPolar2 in 'Variations\varPolar2.pas',
varRings2 in 'Variations\varRings2.pas',
varFan2 in 'Variations\varFan2.pas',
varCross in 'Variations\varCross.pas',
varWedge in 'Variations\varWedge.pas',
varEpispiral in 'Variations\varEpispiral.pas',
varBwraps in 'Variations\varBwraps.pas',
varPDJ in 'Variations\varPDJ.pas',
varJuliaN in 'Variations\varJuliaN.pas',
varJuliaScope in 'Variations\varJuliaScope.pas',
varJulia3Djf in 'Variations\varJulia3Djf.pas',
varJulia3Dz in 'Variations\varJulia3Dz.pas',
varCurl in 'Variations\varCurl.pas',
varCurl3D in 'Variations\varCurl3D.pas',
varRadialBlur in 'Variations\varRadialBlur.pas',
varBlurCircle in 'Variations\varBlurCircle.pas',
varBlurZoom in 'Variations\varBlurZoom.pas',
varBlurPixelize in 'Variations\varBlurPixelize.pas',
varFalloff2 in 'Variations\varFalloff2.pas',
varRectangles in 'Variations\varRectangles.pas',
varSplits in 'Variations\varSplits.pas',
varSeparation in 'Variations\varSeparation.pas',
varBipolar in 'Variations\varBipolar.pas',
varLoonie in 'Variations\varLoonie.pas',
varEscher in 'Variations\varEscher.pas',
varScry in 'Variations\varScry.pas',
varNGon in 'Variations\varNGon.pas',
varFoci in 'Variations\varFoci.pas',
varLazysusan in 'Variations\varLazysusan.pas',
varMobius in 'Variations\varMobius.pas',
varCrop in 'Variations\varCrop.pas',
// circlecrop
varElliptic in 'Variations\varElliptic.pas',
varWaves2 in 'Variations\varWaves2.pas',
varAuger in 'Variations\varAuger.pas',
// glynnsim2
// flux
// boarders2
varPreSpherical in 'Variations\varPreSpherical.pas',
varPreSinusoidal in 'Variations\varPreSinusoidal.pas',
varPreDisc in 'Variations\varPreDisc.pas',
// pre_boarders2
varPreBwraps in 'Variations\varPreBwraps.pas',
varPreCrop in 'Variations\varPreCrop.pas',
// pre_circlecrop
varPreFalloff2 in 'Variations\varPreFalloff2.pas',
// post_boarders2
varPostBwraps in 'Variations\varPostBwraps.pas',
varPostCurl in 'Variations\varPostCurl.pas',
varPostCurl3D in 'Variations\varPostCurl3D.pas',
varPostCrop in 'Variations\varPostCrop.pas',
// post_circlecrop
varPostFalloff2 in 'Variations\varPostFalloff2.pas',
varGenericPlugin in 'Variations\varGenericPlugin.pas',
{-- GUI --}
Main in 'Forms\Main.pas' {MainForm},
Tracer in 'Forms\Tracer.pas' {TraceForm},
About in 'Forms\About.pas' {AboutForm},
Adjust in 'Forms\Adjust.pas' {AdjustForm},
Browser in 'Forms\Browser.pas' {GradientBrowser},
Editor in 'Forms\Editor.pas' {EditForm},
FormExport in 'Forms\FormExport.pas' {ExportDialog},
formPostProcess in 'Forms\formPostProcess.pas' {frmPostProcess},
FormRender in 'Forms\FormRender.pas' {RenderForm},
Fullscreen in 'Forms\Fullscreen.pas' {FullscreenForm},
ImageColoring in 'Forms\ImageColoring.pas' {frmImageColoring},
LoadTracker in 'Forms\LoadTracker.pas' {LoadForm},
Mutate in 'Forms\Mutate.pas' {MutateForm},
Options in 'Forms\Options.pas' {OptionsForm},
Save in 'Forms\Save.pas' {SaveForm},
SavePreset in 'Forms\SavePreset.pas' {SavePresetForm},
SplashForm in 'Forms\SplashForm.pas' {SplashWindow},
Template in 'Forms\Template.pas' {TemplateForm},
Curves in 'Forms\Curves.pas' {CurvesForm}
{$ifdef DisableScripting};
// if scripting is disabled, don't import the scripting form units
{$else},
Preview in 'Forms\Preview.pas' {PreviewForm},
FormFavorites in 'Forms\FormFavorites.pas' {FavoritesForm},
ScriptForm in 'Forms\ScriptForm.pas' {ScriptEditor},
ScriptRender in 'Forms\ScriptRender.pas'; {ScriptRenderForm}
{$endif}
begin
InitializePlugins;
SplashWindow := TSplashWindow.Create(Application);
SplashWindow.Show;
Application.Initialize;
SplashWindow.Update;
{$ifdef Apo7X64}
Application.Title := 'Apophysis 7x (32 bit)';
{$else}
Application.Title := 'Apophysis 7x (64 bit)';
{$endif}
Application.HelpFile := 'Apophysis7x.chm';
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TTraceForm, TraceForm);
Application.CreateForm(TAboutForm, AboutForm);
Application.CreateForm(TAdjustForm, AdjustForm);
Application.CreateForm(TGradientBrowser, GradientBrowser);
Application.CreateForm(TEditForm, EditForm);
Application.CreateForm(TExportDialog, ExportDialog);
Application.CreateForm(TfrmPostProcess, frmPostProcess);
Application.CreateForm(TRenderForm, RenderForm);
Application.CreateForm(TFullscreenForm, FullscreenForm);
Application.CreateForm(TfrmImageColoring, frmImageColoring);
Application.CreateForm(TLoadForm, LoadForm);
Application.CreateForm(TMutateForm, MutateForm);
Application.CreateForm(TOptionsForm, OptionsForm);
Application.CreateForm(TSaveForm, SaveForm);
Application.CreateForm(TSavePresetForm, SavePresetForm);
Application.CreateForm(TTemplateForm, TemplateForm);
Application.CreateForm(TCurvesForm, CurvesForm);
{$ifdef DisableScripting}
// if scripting is disabled, don't create the scripting forms
{$else}
Application.CreateForm(TPreviewForm, PreviewForm);
Application.CreateForm(TFavoritesForm, FavoritesForm);
Application.CreateForm(TScriptEditor, ScriptEditor);
Application.CreateForm(TScriptRenderForm, ScriptRenderForm);
{$endif}
Application.UpdateFormatSettings := False;
{$ifdef VER240}
FormatSettings.DecimalSeparator := '.';
{$else}
DecimalSeparator := '.';
{$endif}
Application.Run;
end.

360
Apophysis7X.dproj Normal file
View File

@ -0,0 +1,360 @@
 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{AC01F3AB-4101-4C09-A648-1CC8E2C412D5}</ProjectGuid>
<MainSource>Apophysis7X.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Release</Config>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Application</AppType>
<FrameworkType>VCL</FrameworkType>
<ProjectVersion>14.3</ProjectVersion>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
<Cfg_1_Win64>true</Cfg_1_Win64>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
<Cfg_2_Win64>true</Cfg_2_Win64>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_Define>DisableScripting;$(DCC_Define)</DCC_Define>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0</VerInfo_Keys>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<Icon_MainIcon>Apophysis7X_Icon.ico</Icon_MainIcon>
<DCC_IOChecking>false</DCC_IOChecking>
<VerInfo_Build>1325</VerInfo_Build>
<DCC_COMBINING_SIGNED_UNSIGNED>false</DCC_COMBINING_SIGNED_UNSIGNED>
<DCC_UsePackage>vcl;rtl;dbrtl;adortl;vcldb;vclx;bdertl;vcldbx;dsnap;cds;bdecds;teeui;teedb;tee;dss;visualclx;visualdbclx;dsnapcrba;dsnapcon;VclSmp;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;nmfast;webdsnap;websnap;soaprtl;dbexpress;dbxcds;dclOffice2k;FlatStyle_D6;S303_R60;RzLPDB60;RzLPND60;vclshlctrls;B302vr60;VirtualTreesD6;o403_r60;ibxpress;CSP20I60;Rz30Ctls60;Rz30DBCtls60;indy;Indy60;vclactnband;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_ImageBase>00400000</DCC_ImageBase>
<DCC_Hints>false</DCC_Hints>
<DCC_COMPARING_SIGNED_UNSIGNED>false</DCC_COMPARING_SIGNED_UNSIGNED>
<VerInfo_MajorVer>2</VerInfo_MajorVer>
<DCC_UNIT_DEPRECATED>false</DCC_UNIT_DEPRECATED>
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace)</DCC_Namespace>
<DCC_SYMBOL_PLATFORM>false</DCC_SYMBOL_PLATFORM>
<DCC_ExeOutput>..\..\out</DCC_ExeOutput>
<DCC_UnitSearchPath>$(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10;$(DELPHI)\Lib\Debug;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_S>false</DCC_S>
<DCC_N>true</DCC_N>
<DCC_K>false</DCC_K>
<DCC_SYMBOL_DEPRECATED>false</DCC_SYMBOL_DEPRECATED>
<VerInfo_Release>9</VerInfo_Release>
<DCC_UNIT_PLATFORM>false</DCC_UNIT_PLATFORM>
<DCC_F>false</DCC_F>
<DCC_DcuOutput>..\..\out\dcu</DCC_DcuOutput>
<DCC_COMPARISON_TRUE>false</DCC_COMPARISON_TRUE>
<DCC_E>false</DCC_E>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_COMPARISON_FALSE>false</DCC_COMPARISON_FALSE>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<PreBuildEvent><![CDATA[DEL /Q "$(OUTPUTDIR)*$(OUTPUTEXT)"
$(PreBuildEvent)]]></PreBuildEvent>
<PostBuildEvent><![CDATA[COPY /Y "$(OUTPUTDIR)$(OUTPUTFILENAME)" "$(OUTPUTDIR)Apophysis7X64$(OUTPUTEXT)"
DEL /Q "$(OUTPUTDIR)$(OUTPUTFILENAME)"
$(PostBuildEvent)]]></PostBuildEvent>
<VerInfo_Build>0</VerInfo_Build>
<VerInfo_MajorVer>1</VerInfo_MajorVer>
<VerInfo_Release>0</VerInfo_Release>
<DCC_ExeOutput>..\..\Out\x64\</DCC_ExeOutput>
<DCC_DcuOutput>..\..\Out\x64\dcu\</DCC_DcuOutput>
<DCC_Define>Apo7X64;$(DCC_Define)</DCC_Define>
<DCC_Namespace>Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_ExeOutput>..\..\Out\x86\</DCC_ExeOutput>
<DCC_DcuOutput>..\..\Out\x86\dcu\</DCC_DcuOutput>
<DCC_Namespace>Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_DebugInformation>false</DCC_DebugInformation>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_MajorVer>1</VerInfo_MajorVer>
<VerInfo_Release>0</VerInfo_Release>
<VerInfo_Build>0</VerInfo_Build>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<VerInfo_MajorVer>1</VerInfo_MajorVer>
<VerInfo_Build>0</VerInfo_Build>
<VerInfo_Release>0</VerInfo_Release>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<Icon_MainIcon>Resources\MAINICON.ico</Icon_MainIcon>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_IMPLICIT_STRING_CAST>false</DCC_IMPLICIT_STRING_CAST>
<DCC_RemoteDebug>true</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<VerInfo_Build>1590</VerInfo_Build>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_MinorVer>1</VerInfo_MinorVer>
<VerInfo_Release>15</VerInfo_Release>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=2.1.15.1590;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0</VerInfo_Keys>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="System\FastMM4.pas"/>
<DCCReference Include="System\FastMM4Messages.pas"/>
<DCCReference Include="IO\Binary.pas"/>
<DCCReference Include="IO\Base64.pas"/>
<DCCReference Include="System\sdStringTable.pas"/>
<DCCReference Include="System\CustomDrawControl.pas"/>
<DCCReference Include="System\LibXmlComps.pas"/>
<DCCReference Include="System\LibXmlParser.pas"/>
<DCCReference Include="System\Windows7.pas"/>
<DCCReference Include="System\RegexHelper.pas"/>
<DCCReference Include="System\CurvesControl.pas"/>
<DCCReference Include="System\AsmRandom.pas"/>
<DCCReference Include="Core\Global.pas"/>
<DCCReference Include="IO\CommandLine.pas"/>
<DCCReference Include="IO\MissingPlugin.pas"/>
<DCCReference Include="IO\Settings.pas"/>
<DCCReference Include="Core\Translation.pas"/>
<DCCReference Include="IO\ParameterIO.pas"/>
<DCCReference Include="Core\Bezier.pas"/>
<DCCReference Include="Flame\RndFlame.pas"/>
<DCCReference Include="Flame\ControlPoint.pas"/>
<DCCReference Include="ColorMap\cmapdata.pas"/>
<DCCReference Include="ColorMap\cmap.pas"/>
<DCCReference Include="ColorMap\GradientHlpr.pas"/>
<DCCReference Include="Core\XFormMan.pas"/>
<DCCReference Include="Flame\XForm.pas"/>
<DCCReference Include="Core\BaseVariation.pas"/>
<DCCReference Include="Rendering\RenderingCommon.pas"/>
<DCCReference Include="Rendering\RenderingInterface.pas"/>
<DCCReference Include="Rendering\RenderingImplementation.pas"/>
<DCCReference Include="Rendering\BucketFillerThread.pas"/>
<DCCReference Include="Rendering\RenderThread.pas"/>
<DCCReference Include="Rendering\ImageMaker.pas"/>
<DCCReference Include="Variations\varHemisphere.pas"/>
<DCCReference Include="Variations\varLog.pas"/>
<DCCReference Include="Variations\varPolar2.pas"/>
<DCCReference Include="Variations\varRings2.pas"/>
<DCCReference Include="Variations\varFan2.pas"/>
<DCCReference Include="Variations\varCross.pas"/>
<DCCReference Include="Variations\varWedge.pas"/>
<DCCReference Include="Variations\varEpispiral.pas"/>
<DCCReference Include="Variations\varBwraps.pas"/>
<DCCReference Include="Variations\varPDJ.pas"/>
<DCCReference Include="Variations\varJuliaN.pas"/>
<DCCReference Include="Variations\varJuliaScope.pas"/>
<DCCReference Include="Variations\varJulia3Djf.pas"/>
<DCCReference Include="Variations\varJulia3Dz.pas"/>
<DCCReference Include="Variations\varCurl.pas"/>
<DCCReference Include="Variations\varCurl3D.pas"/>
<DCCReference Include="Variations\varRadialBlur.pas"/>
<DCCReference Include="Variations\varBlurCircle.pas"/>
<DCCReference Include="Variations\varBlurZoom.pas"/>
<DCCReference Include="Variations\varBlurPixelize.pas"/>
<DCCReference Include="Variations\varFalloff2.pas"/>
<DCCReference Include="Variations\varRectangles.pas"/>
<DCCReference Include="Variations\varSplits.pas"/>
<DCCReference Include="Variations\varSeparation.pas"/>
<DCCReference Include="Variations\varBipolar.pas"/>
<DCCReference Include="Variations\varLoonie.pas"/>
<DCCReference Include="Variations\varEscher.pas"/>
<DCCReference Include="Variations\varScry.pas"/>
<DCCReference Include="Variations\varNGon.pas"/>
<DCCReference Include="Variations\varFoci.pas"/>
<DCCReference Include="Variations\varLazysusan.pas"/>
<DCCReference Include="Variations\varMobius.pas"/>
<DCCReference Include="Variations\varCrop.pas"/>
<DCCReference Include="Variations\varElliptic.pas"/>
<DCCReference Include="Variations\varWaves2.pas"/>
<DCCReference Include="Variations\varAuger.pas"/>
<DCCReference Include="Variations\varPreSpherical.pas"/>
<DCCReference Include="Variations\varPreSinusoidal.pas"/>
<DCCReference Include="Variations\varPreDisc.pas"/>
<DCCReference Include="Variations\varPreBwraps.pas"/>
<DCCReference Include="Variations\varPreCrop.pas"/>
<DCCReference Include="Variations\varPreFalloff2.pas"/>
<DCCReference Include="Variations\varPostBwraps.pas"/>
<DCCReference Include="Variations\varPostCurl.pas"/>
<DCCReference Include="Variations\varPostCurl3D.pas"/>
<DCCReference Include="Variations\varPostCrop.pas"/>
<DCCReference Include="Variations\varPostFalloff2.pas"/>
<DCCReference Include="Variations\varGenericPlugin.pas"/>
<DCCReference Include="Forms\Main.pas">
<Form>MainForm</Form>
</DCCReference>
<DCCReference Include="Forms\Tracer.pas">
<Form>TraceForm</Form>
</DCCReference>
<DCCReference Include="Forms\About.pas">
<Form>AboutForm</Form>
</DCCReference>
<DCCReference Include="Forms\Adjust.pas">
<Form>AdjustForm</Form>
</DCCReference>
<DCCReference Include="Forms\Browser.pas">
<Form>GradientBrowser</Form>
</DCCReference>
<DCCReference Include="Forms\Editor.pas">
<Form>EditForm</Form>
</DCCReference>
<DCCReference Include="Forms\FormExport.pas">
<Form>ExportDialog</Form>
</DCCReference>
<DCCReference Include="Forms\formPostProcess.pas">
<Form>frmPostProcess</Form>
</DCCReference>
<DCCReference Include="Forms\FormRender.pas">
<Form>RenderForm</Form>
</DCCReference>
<DCCReference Include="Forms\Fullscreen.pas">
<Form>FullscreenForm</Form>
</DCCReference>
<DCCReference Include="Forms\ImageColoring.pas">
<Form>frmImageColoring</Form>
</DCCReference>
<DCCReference Include="Forms\LoadTracker.pas">
<Form>LoadForm</Form>
</DCCReference>
<DCCReference Include="Forms\Mutate.pas">
<Form>MutateForm</Form>
</DCCReference>
<DCCReference Include="Forms\Options.pas">
<Form>OptionsForm</Form>
</DCCReference>
<DCCReference Include="Forms\Save.pas">
<Form>SaveForm</Form>
</DCCReference>
<DCCReference Include="Forms\SavePreset.pas">
<Form>SavePresetForm</Form>
</DCCReference>
<DCCReference Include="Forms\SplashForm.pas">
<Form>SplashWindow</Form>
</DCCReference>
<DCCReference Include="Forms\Template.pas">
<Form>TemplateForm</Form>
</DCCReference>
<DCCReference Include="Forms\Curves.pas">
<Form>CurvesForm</Form>
</DCCReference>
<None Include="Apophysis7X.todo"/>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">Apophysis7X.dpr</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k160.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp160.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1031</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription"/>
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName"/>
<VersionInfoKeys Name="LegalCopyright"/>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename"/>
<VersionInfoKeys Name="ProductName"/>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
</Delphi.Personality>
<Platforms>
<Platform value="Win64">True</Platform>
<Platform value="Win32">True</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
<PropertyGroup Condition="'$(Config)'=='Release' And '$(Platform)'=='Win64'">
<PreBuildEvent>DEL /Q &quot;$(OUTPUTDIR)*$(OUTPUTEXT)&quot;</PreBuildEvent>
<PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
<PreLinkEvent/>
<PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
<PostBuildEvent>COPY /Y &quot;$(OUTPUTDIR)$(OUTPUTFILENAME)&quot; &quot;$(OUTPUTDIR)Apophysis7X64$(OUTPUTEXT)&quot;&amp;&amp;DEL /Q &quot;$(OUTPUTDIR)$(OUTPUTFILENAME)&quot;</PostBuildEvent>
<PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' And '$(Platform)'=='Win64'">
<PreBuildEvent>DEL /Q &quot;$(OUTPUTDIR)*$(OUTPUTEXT)&quot;</PreBuildEvent>
<PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
<PreLinkEvent/>
<PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
<PostBuildEvent>COPY /Y &quot;$(OUTPUTDIR)$(OUTPUTFILENAME)&quot; &quot;$(OUTPUTDIR)Apophysis7X64$(OUTPUTEXT)&quot;&amp;&amp;DEL /Q &quot;$(OUTPUTDIR)$(OUTPUTFILENAME)&quot;</PostBuildEvent>
<PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
</PropertyGroup>
</Project>

36
Apophysis7X.groupproj Normal file
View File

@ -0,0 +1,36 @@
 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{2C89F2DE-83E1-4164-B84E-1D0509F8AB8C}</ProjectGuid>
</PropertyGroup>
<ItemGroup>
<Projects Include="Apophysis7X.dproj">
<Dependencies/>
</Projects>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Default.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Default.Personality/>
</BorlandProject>
</ProjectExtensions>
<Target Name="Apophysis7X">
<MSBuild Projects="Apophysis7X.dproj"/>
</Target>
<Target Name="Apophysis7X:Clean">
<MSBuild Projects="Apophysis7X.dproj" Targets="Clean"/>
</Target>
<Target Name="Apophysis7X:Make">
<MSBuild Projects="Apophysis7X.dproj" Targets="Make"/>
</Target>
<Target Name="Build">
<CallTarget Targets="Apophysis7X"/>
</Target>
<Target Name="Clean">
<CallTarget Targets="Apophysis7X:Clean"/>
</Target>
<Target Name="Make">
<CallTarget Targets="Apophysis7X:Make"/>
</Target>
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')" Project="$(BDS)\Bin\CodeGear.Group.Targets"/>
</Project>

BIN
Apophysis7X.res Normal file

Binary file not shown.

0
Apophysis7X.todo Normal file
View File

BIN
Apophysis7X_Icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

167
ColorMap/GradientHlpr.pas Normal file
View File

@ -0,0 +1,167 @@
{
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 GradientHlpr;
interface
uses
windows, Graphics, Cmap;
const
PixelCountMax = 32768;
type
pRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = array[0..PixelCountMax - 1] of TRGBTriple;
type
TGradientHelper = class
private
procedure RGBBlend(a, b: integer; var Palette: TColorMap);
public
function GetGradientBitmap(Index: integer; const hue_rotation: double): TBitmap;
function RandomGradient: TColorMap;
end;
var
GradientHelper: TGradientHelper;
implementation
uses
Global;
{ TGradientHelper }
function TGradientHelper.GetGradientBitmap(Index: integer; const hue_rotation: double): TBitmap;
var
BitMap: TBitMap;
i, j: integer;
Row: pRGBTripleArray;
pal: TColorMap;
begin
GetCMap(index, hue_rotation, pal);
BitMap := TBitMap.create;
Bitmap.PixelFormat := pf24bit;
BitMap.Width := 256;
BitMap.Height := 2;
for j := 0 to Bitmap.Height - 1 do begin
Row := Bitmap.Scanline[j];
for i := 0 to Bitmap.Width - 1 do begin
Row[i].rgbtRed := Pal[i][0];
Row[i].rgbtGreen := Pal[i][1];
Row[i].rgbtBlue := Pal[i][2];
end
end;
Result := BitMap;
end;
///////////////////////////////////////////////////////////////////////////////
function TGradientHelper.RandomGradient: TColorMap;
var
a, b, n, nodes: integer;
rgb: array[0..2] of double;
hsv: array[0..2] of double;
pal: TColorMap;
begin
rgb[0] := 0;
rgb[1] := 0;
rgb[2] := 0;
inc(MainSeed);
RandSeed := Mainseed;
nodes := random((MaxNodes - 1) - (MinNodes - 2)) + (MinNodes - 1);
n := 256 div nodes;
b := 0;
hsv[0] := 0.01 * (random(MaxHue - (MinHue - 1)) + MinHue);
hsv[1] := 0.01 * (random(MaxSat - (MinSat - 1)) + MinSat);
hsv[2] := 0.01 * (random(MaxLum - (MinLum - 1)) + MinLum);
hsv2rgb(hsv, rgb);
Pal[0][0] := Round(rgb[0] * 255);
Pal[0][1] := Round(rgb[1] * 255);
Pal[0][2] := Round(rgb[2] * 255);
repeat
a := b;
b := b + n;
hsv[0] := 0.01 * (random(MaxHue - (MinHue - 1)) + MinHue);
hsv[1] := 0.01 * (random(MaxSat - (MinSat - 1)) + MinSat);
hsv[2] := 0.01 * (random(MaxLum - (MinLum - 1)) + MinLum);
hsv2rgb(hsv, rgb);
if b > 255 then b := 255;
Pal[b][0] := Round(rgb[0] * 255);
Pal[b][1] := Round(rgb[1] * 255);
Pal[b][2] := Round(rgb[2] * 255);
RGBBlend(a, b, pal);
until b = 255;
Result := Pal;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TGradientHelper.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;
///////////////////////////////////////////////////////////////////////////////
initialization
GradientHelper := TGradientHelper.create;
finalization
GradientHelper.Free;
end.

374
ColorMap/cmap.pas Normal file
View File

@ -0,0 +1,374 @@
{
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 Cmap;
interface
uses sysutils, classes;
type
TColorMap = array[0..255, 0..3] of integer;
type
EFormatInvalid = class(Exception);
const
RANDOMCMAP = -1;
NRCMAPS = 701;
procedure GetCmap(var Index: integer; const hue_rotation: double; out cmap: TColorMap);
procedure GetCmapName(var Index: integer; out Name: string);
procedure rgb2hsv(const rgb: array of double; out hsv: array of double);
procedure hsv2rgb(const hsv: array of double; out rgb: array of double);
function GetGradient(FileName, Entry: string): string;
function GetPalette(strng: string; var Palette: TColorMap): boolean;
procedure GetTokens(s: string; var mlist: TStringList);
implementation
uses
cmapdata, Math;
procedure rgb2hsv(const rgb: array of double; out hsv: array of double);
var
maxval, minval: double;
del: double;
begin
Maxval := Max(rgb[0], Max(rgb[1], rgb[2]));
Minval := Min(rgb[0], Min(rgb[1], rgb[2]));
hsv[2] := maxval; // v
if (Maxval > 0) and (maxval <> minval) then begin
del := maxval - minval;
hsv[1] := del / Maxval; //s
hsv[0] := 0;
if (rgb[0] > rgb[1]) and (rgb[0] > rgb[2]) then begin
hsv[0] := (rgb[1] - rgb[2]) / del;
end else if (rgb[1] > rgb[2]) then begin
hsv[0] := 2 + (rgb[2] - rgb[0]) / del;
end else begin
hsv[0] := 4 + (rgb[0] - rgb[1]) / del;
end;
if hsv[0] < 0 then
hsv[0] := hsv[0] + 6;
end else begin
hsv[0] := 0;
hsv[1] := 0;
end;
end;
procedure hsv2rgb(const hsv: array of double; out rgb: array of double);
var
j: integer;
f, p, q, t, v: double;
begin
try
// rgb[0] := 0;
// rgb[1] := 0;
// rgb[2] := 0;
j := floor(hsv[0]);
f := hsv[0] - j;
v := hsv[2];
p := hsv[2] * (1 - hsv[1]);
q := hsv[2] * (1 - hsv[1] * f);
t := hsv[2] * (1 - hsv[1] * (1 - f));
case j of
0: begin rgb[0] := v; rgb[1] := t; rgb[2] := p; end;
1: begin rgb[0] := q; rgb[1] := v; rgb[2] := p; end;
2: begin rgb[0] := p; rgb[1] := v; rgb[2] := t; end;
3: begin rgb[0] := p; rgb[1] := q; rgb[2] := v; end;
4: begin rgb[0] := t; rgb[1] := p; rgb[2] := v; end;
5: begin rgb[0] := v; rgb[1] := p; rgb[2] := q; end;
end;
except on EMathError do
end;
end;
procedure GetCmap(var Index: integer; const hue_rotation: double; out cmap: TColorMap);
var
i: Integer;
rgb: array[0..2] of double;
hsv: array[0..2] of double;
begin
if Index = RANDOMCMAP then
Index := Random(NRCMAPS);
if (Index < 0) or (Index >= NRCMAPS) then
Index := 0;
for i := 0 to 255 do begin
rgb[0] := cmaps[Index][i][0] / 255.0;
rgb[1] := cmaps[Index][i][1] / 255.0;
rgb[2] := cmaps[Index][i][2] / 255.0;
rgb2hsv(rgb, hsv);
hsv[0] := hsv[0] + hue_rotation * 6;
hsv2rgb(hsv, rgb);
cmap[i][0] := Round(rgb[0] * 255);
cmap[i][1] := Round(rgb[1] * 255);
cmap[i][2] := Round(rgb[2] * 255);
end;
end;
procedure GetCmapName(var Index: integer; out Name: string);
begin
if Index = RANDOMCMAP then
Index := Random(NRCMAPS);
if (Index < 0) or (Index >= NRCMAPS) then
Index := 0;
Name := CMapNames[Index];
end;
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 GetVal(token: string): string;
var
p: integer;
begin
p := Pos('=', token);
Delete(Token, 1, p);
Result := Token;
end;
function ReplaceTabs(str: string): string;
{Changes tab characters in a string to spaces}
var
i: integer;
begin
for i := 1 to Length(str) do
begin
if str[i] = #9 then
begin
Delete(str, i, 1);
Insert(#32, str, i);
end;
end;
Result := str;
end;
procedure GetTokens(s: string; var mlist: TStringList);
var
test, token: string;
begin
mlist.clear;
test := s;
while (Length(Test) > 0) do
begin
while (Length(Test) > 0) and CharInSet(test[1],[#32]) do
Delete(test, 1, 1);
if (Length(Test) = 0) then
exit;
token := '';
while (Length(Test) > 0) and (not CharInSet(test[1],[#32])) do
begin
token := token + test[1];
Delete(test, 1, 1);
end;
mlist.add(token);
end;
end;
function GetPalette(strng: string; var Palette: TColorMap): boolean;
{ Loads a palette from a gradient string }
var
Strings: TStringList;
index, i: integer;
Tokens: TStringList;
Indices, Colors: TStringList;
a, b: integer;
begin
GetPalette := True;
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);
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
Palette[i][0] := 0;
Palette[i][1] := 0;
Palette[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);
Palette[index][0] := StrToInt(Colors[i]) mod 256;
Palette[index][1] := trunc(StrToInt(Colors[i]) / 256) mod 256;
Palette[index][2] := trunc(StrToInt(Colors[i]) / 65536);
except
end;
end;
i := 1;
repeat
a := StrToInt(Indices[i - 1]);
b := StrToInt(Indices[i]);
RGBBlend(a, b, Palette);
inc(i);
until i = Indices.Count;
if (Indices[0] <> '0') or (Indices[Indices.Count - 1] <> '255') then
begin
a := StrToInt(Indices[Indices.Count - 1]);
b := StrToInt(Indices[0]) + 256;
RGBBlend(a, b, Palette);
end;
except on EFormatInvalid do
begin
Result := False;
end;
end;
finally
Tokens.Free;
Strings.Free;
Indices.Free;
Colors.Free;
end;
end;
function GetGradient(FileName, Entry: string): string;
var
FileStrings: TStringList;
GradStrings: TStringList;
i: integer;
begin
FileStrings := TStringList.Create;
GradStrings := TStringList.Create;
try
try
FileStrings.LoadFromFile(FileName);
for i := 0 to FileStrings.count - 1 do
if Pos(Entry + ' ', Trim(FileStrings[i])) = 1 then break;
GradStrings.Add(FileStrings[i]);
repeat
inc(i);
GradStrings.Add(FileStrings[i]);
until Pos('}', FileStrings[i]) <> 0;
GetGradient := GradStrings.Text;
except on exception do
Result := '';
end;
finally
GradStrings.Free;
FileStrings.Free;
end;
end;
function LoadGradient(FileName, Entry: string; var gString: string; var Pal: TColorMap): boolean;
var
FileStrings: TStringList;
GradStrings: TStringList;
i: integer;
begin
FileStrings := TStringList.Create;
GradStrings := TStringList.Create;
try
try
FileStrings.LoadFromFile(FileName);
for i := 0 to FileStrings.count - 1 do
if Pos(Entry + ' ', Trim(FileStrings[i])) = 1 then break;
GradStrings.Add(FileStrings[i]);
repeat
inc(i);
GradStrings.Add(FileStrings[i]);
until Pos('}', FileStrings[i]) <> 0;
gString := GradStrings.Text;
Result := GetPalette(GradStrings.Text, Pal);
except on exception do
Result := False;
end;
finally
GradStrings.Free;
FileStrings.Free;
end;
end;
end.

47741
ColorMap/cmapdata.pas Normal file

File diff suppressed because it is too large Load Diff

210
Core/BaseVariation.pas Normal file
View File

@ -0,0 +1,210 @@
{
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 BaseVariation;
interface
type
TCalcFunction = procedure of object;
type
TBaseVariation = class
protected
procedure CalcFunction; virtual; abstract;
public
vvar: double;
FTx, FTy: ^double;
FPx, FPy: ^double;
FTz, FPz: ^double;
// more params :)
color : ^double;
a, b, c, d, e, f : double;
class function GetName: string; virtual; abstract;
class function GetInstance: TBaseVariation; virtual; abstract;
function GetNrVariables: integer; virtual;
function GetVariableNameAt(const Index: integer): string; virtual;
function GetVariable(const Name: string; var Value: double): boolean; virtual;
function SetVariable(const Name: string; var Value: double): boolean; virtual;
function ResetVariable(const Name: string): boolean; virtual;
function GetVariableStr(const Name: string): string; virtual;
function SetVariableStr(const Name: string; var strValue: string): boolean; virtual;
procedure Prepare; virtual;
procedure GetCalcFunction(var Delphi_Suxx: TCalcFunction); virtual;
end;
TBaseVariationClass = class of TBaseVariation;
type
TVariationLoader = class
public
Supports3D, SupportsDC : boolean;
function GetName: string; virtual; abstract;
function GetInstance: TBaseVariation; virtual; abstract;
function GetNrVariables: integer; virtual; abstract;
function GetVariableNameAt(const Index: integer): string; virtual; abstract;
end;
type
TVariationClassLoader = class (TVariationLoader)
public
constructor Create(varClass : TBaseVariationClass);
function GetName: string; override;
function GetInstance: TBaseVariation; override;
function GetNrVariables: integer; override;
function GetVariableNameAt(const Index: integer): string; override;
private
VariationClass : TBaseVariationClass;
end;
function fmod(x, y: double) : double;
implementation
uses SysUtils;
function fmod(x, y: double) : double;
begin
Result := frac(x / y) * y;
end;
{ TBaseVariation }
///////////////////////////////////////////////////////////////////////////////
function TBaseVariation.GetNrVariables: integer;
begin
Result := 0;
end;
///////////////////////////////////////////////////////////////////////////////
function TBaseVariation.GetVariable(const Name: string; var value: double): boolean;
begin
Result := False;
end;
function TBaseVariation.SetVariable(const Name: string; var value: double): boolean;
begin
Result := False;
end;
function TBaseVariation.ResetVariable(const Name: string): boolean;
var
zero: double;
begin
zero := 0;
Result := SetVariable(Name, zero);
end;
///////////////////////////////////////////////////////////////////////////////
function TBaseVariation.GetVariableStr(const Name: string): string;
var
value: double;
begin
if GetVariable(Name, value) then
Result := Format('%.6g', [value])
else
Result := '';
end;
function TBaseVariation.SetVariableStr(const Name: string; var strValue: string): boolean;
var
v, oldv: double;
begin
if GetVariable(Name, oldv) then begin
try
v := StrToFloat(strValue);
SetVariable(Name, v);
except
v := oldv;
end;
strValue := Format('%.6g', [v]);
Result := true;
end
else Result := false;
end;
///////////////////////////////////////////////////////////////////////////////
function TBaseVariation.GetVariableNameAt(const Index: integer): string;
begin
Result := ''
end;
///////////////////////////////////////////////////////////////////////////////
procedure TBaseVariation.Prepare;
begin
end;
///////////////////////////////////////////////////////////////////////////////
procedure TBaseVariation.GetCalcFunction(var Delphi_Suxx: TCalcFunction);
begin
Delphi_Suxx := CalcFunction; // -X- lol
end;
///////////////////////////////////////////////////////////////////////////////
{ TVariationClassLoader }
constructor TVariationClassLoader.Create(varClass : TBaseVariationClass);
begin
VariationClass := varClass;
end;
function TVariationClassLoader.GetName: string;
begin
Result := VariationClass.GetName();
end;
function TVariationClassLoader.GetInstance: TBaseVariation;
begin
Result := VariationClass.GetInstance();
end;
function TVariationClassLoader.GetNrVariables: integer;
var
hack : TBaseVariation;
begin
hack := GetInstance();
Result := hack.GetNrVariables();
hack.Free();
end;
function TVariationClassLoader.GetVariableNameAt(const Index: integer): string;
var
hack : TBaseVariation;
begin
hack := GetInstance();
Result := hack.GetVariableNameAt(Index);
hack.Free();
end;
end.

94
Core/Bezier.pas Normal file
View File

@ -0,0 +1,94 @@
unit Bezier;
interface
uses Math;
type
BezierPoint = record
x, y: double;
end;
BezierRect = record
x0, y0, x1, y1: double;
end;
BezierPoints = array [0..3] of BezierPoint;
BezierWeights = array [0..3] of double;
procedure BezierCopy(src: BezierPoints; var tgt: BezierPoints);
procedure BezierSetRect(var points: BezierPoints; flip: boolean; rect: BezierRect);
procedure BezierUnsetRect(var points: BezierPoints; flip: boolean; rect: BezierRect);
procedure BezierSolve(t: double; src: BezierPoints; w: BezierWeights; var solution: BezierPoint);
function BezierFunc(t: double; src: BezierPoints; w: BezierWeights): double;
implementation
procedure BezierCopy(src: BezierPoints; var tgt: BezierPoints);
var
i, n: integer;
begin
n := Length(src);
for i := 0 to n - 1 do
tgt[i] := src[i];
end;
procedure BezierSetRect(var points: BezierPoints; flip: boolean; rect: BezierRect);
var
i, n: integer;
f: double;
begin
n := Length(points);
for i := 0 to n - 1 do
begin
if (flip) then f := 1 - points[i].y
else f := points[i].y;
points[i].x := points[i].x * (rect.x1 - rect.x0) + rect.x0;
points[i].y := f * (rect.y1 - rect.y0) + rect.y0;
end;
end;
procedure BezierUnsetRect(var points: BezierPoints; flip: boolean; rect: BezierRect);
var
i, n: integer;
f: double;
begin
if ((rect.x1 - rect.x0) = 0) or ((rect.y1 - rect.y0) = 0) then Exit;
n := Length(points);
for i := 0 to n - 1 do
begin
points[i].x := (points[i].x - rect.x0) / (rect.x1 - rect.x0);
points[i].y := (points[i].y - rect.y0) / (rect.y1 - rect.y0);
if (flip) then points[i].y := 1 - points[i].y;
end;
end;
procedure BezierSolve(t: double; src: BezierPoints; w: BezierWeights; var solution: BezierPoint);
var
s, s2, s3, t2, t3, nom_x, nom_y, denom: double;
begin
s := 1 - t;
s2 := s * s; s3 := s * s * s;
t2 := t * t; t3 := t * t * t;
nom_x := w[0] * s3 * src[0].x + w[1] * s2 * 3 * t * src[1].x +
w[2] * s * 3 * t2 * src[2].x + w[3] * t3 * src[3].x;
nom_y := w[0] * s3 * src[0].y + w[1] * s2 * 3 * t * src[1].y +
w[2] * s * 3 * t2 * src[2].y + w[3] * t3 * src[3].y;
denom := w[0] * s3 + w[1] * s2 * 3 * t + w[2] * s * 3 * t2 + w[3] * t3;
if (IsNaN(nom_x)) or (IsNaN(nom_y)) or (IsNaN(denom)) then Exit;
if denom = 0 then Exit;
solution.x := nom_x / denom;
solution.y := nom_y / denom;
end;
function BezierFunc(t: double; src: BezierPoints; w: BezierWeights): double;
var
p: BezierPoint;
begin
BezierSolve(t, src, w, p);
Result := p.y;
end;
end.

268
Core/Chaotica.pas Normal file
View File

@ -0,0 +1,268 @@
unit Chaotica;
interface
uses Global, RegularExpressionsCore, RegexHelper, Classes, SysUtils, XFormMan, Windows,
ShellAPI, Forms, ControlPoint, Translation;
function C_GetPathOf(filename: string; usex64: boolean): string;
function C_SupportsDllPlugins(usex64: boolean): boolean;
function C_IsDllPluginBlacklisted(filename: string; usex64: boolean): boolean;
function C_IsVariationNative(name: string; usex64: boolean): boolean;
function C_IsDllPluginInstalled(filename: string): boolean;
procedure C_SyncDllPlugins;
procedure C_InstallVariation(name: string);
procedure C_ExecuteChaotica(flamexml: string; plugins: TStringList; usex64: boolean);
implementation
uses Main;
function CheckX64: Boolean;
var
SEInfo: TShellExecuteInfo;
ExitCode: DWORD;
ExecuteFile, ParamString, StartInString: string;
begin
{$ifdef Apo7X64}
Result := true;
exit;
{$endif}
ExecuteFile:=ExtractFilePath(Application.ExeName)+'chk64.exe';
FillChar(SEInfo, SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpFile := PChar(ExecuteFile) ;
nShow := SW_SHOWNORMAL;
end;
if ShellExecuteEx(@SEInfo) then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess, ExitCode);
until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
Result := (ExitCode = 0);
end else begin
Result := false;
end;
end;
function C_GetPathOf(filename: string; usex64: boolean): string;
var
subf: string;
begin
if usex64 then subf := '64bit'
else subf := '32bit';
Result := ChaoticaPath + '\' + subf + '\' + filename;
end;
function C_SupportsDllPlugins(usex64: boolean): boolean;
const
re_root : string = '<variation_compatibility\s+(.*?)>.*?</variation_compatibility>';
re_attrib : string = 'supports_dll_plugins="(.*?)"';
var
xml_file : TStringList;
xml_text, attrib, value : string;
begin
if usex64 then begin
Result := false;
Exit;
end;
xml_file := TStringList.Create;
xml_file.LoadFromFile(C_GetPathOf('variation_compatibility.xml', false));
xml_text := xml_file.Text;
xml_file.Destroy;
attrib := GetStringPart(xml_text, re_root, 1, 'supports_dll_plugins="false"');
value := GetStringPart(attrib, re_attrib, 1, 'false');
Result := (value = 'true');
end;
function C_IsDllPluginBlacklisted(filename: string; usex64: boolean): boolean;
var
i: integer;
blacklist: TStringList;
begin
blacklist := TStringList.Create;
blacklist.LoadFromFile(C_GetPathOf('plugin_dll_blacklist.txt', usex64));
for i := 0 to blacklist.Count - 1 do begin
if LowerCase(filename) = LowerCase(blacklist.Strings[i]) then begin
Result := true;
blacklist.Destroy;
Exit;
end;
end;
blacklist.Destroy;
Result := false;
end;
function C_IsVariationNative(name: string; usex64: boolean): boolean;
const
re_root : string = '<variation_compatibility.*?>(.*?)</variation_compatibility>';
re_var : string = '<variation name="(.*?)".*?/>';
var
xml, var_name : string;
xml_file : TStringList;
find_var : TPerlRegEx;
found_var : boolean;
begin
xml_file := TStringList.Create;
xml_file.LoadFromFile(C_GetPathOf('variation_compatibility.xml', false));
xml := xml_file.Text;
xml_file.Destroy;
find_var := TPerlRegEx.Create;
find_var.RegEx := Utf8String(re_var);
find_var.Options := [preSingleLine, preCaseless];
find_var.Subject := Utf8String(GetStringPart(xml, re_root, 1, ''));
found_var := find_var.Match;
while found_var do begin
var_name := String(find_var.Groups[1]);
found_var := find_var.MatchAgain;
if LowerCase(name) = var_name then begin
find_var.Destroy;
Result := true;
Exit;
end;
end;
find_var.Destroy;
Result := false;
end;
function C_IsDllPluginInstalled(filename: string): boolean;
var
path : string;
begin
path := C_GetPathOf('plugins\' + filename, false);
Result := FileExists(path);
end;
////////////////////////////////////////////////////////////////////
procedure C_InstallVariation(name: string);
var
filename: string;
begin
filename := GetFileNameOfVariation(name);
if (filename = '') then Exit;
if C_IsDllPluginInstalled(filename) then Exit;
CopyFile(PCHAR(filename), PCHAR(C_GetPathOf('plugins\' +
ExtractFileName(filename), false)), false);
end;
procedure C_SyncDllPlugins;
var
src_dir: string;
tgt_dir: string;
searchResult: TSearchRec;
begin
src_dir := PluginPath;
tgt_dir := C_GetPathOf('Plugins', false);
if (not DirectoryExists(src_dir)) then Exit;
if (not DirectoryExists(tgt_dir)) then Exit;
// First clear all plugins on Chaotica side
if FindFirst(tgt_dir + '\*.dll', faAnyFile, searchResult) = 0 then
begin
repeat
DeleteFile(PCHAR(tgt_dir + '\' + searchResult.Name)) ;
until (FindNext(searchResult) <> 0);
SysUtils.FindClose(searchResult);
end;
// Then copy all plugins from Apophysis to Chaotica
if FindFirst(src_dir + '*.dll', faAnyFile, searchResult) = 0 then
begin
repeat
if not C_IsDllPluginBlacklisted(searchResult.Name, false)
then CopyFile(
PCHAR(src_dir + '\' + searchResult.Name),
PCHAR(tgt_dir + '\' + searchResult.Name),
false);
until (FindNext(searchResult) <> 0);
SysUtils.FindClose(searchResult);
end;
end;
procedure C_ExecuteChaotica(flamexml: string; plugins: TStringList; usex64: boolean);
var
i: integer;
name, fname: string;
fails: TStringList;
txt: TStringList;
fin_usex64: boolean;
begin
fails := TStringList.Create;
{$ifdef Apo7X64}
fin_usex64 := true;
{$else}
fin_usex64 := usex64 and CheckX64;
for i := 0 to plugins.Count - 1 do begin
name := GetFileNameOfVariation(plugins.Strings[i]);
if (name = '') then name := plugins.Strings[i];
fin_usex64 := fin_usex64 and C_IsVariationNative(name, usex64);
end;
for i := 0 to plugins.Count - 1 do begin
name := GetFileNameOfVariation(plugins.Strings[i]);
if (name = '') then name := plugins.Strings[i]; // assume built-in
if not C_IsVariationNative(name, fin_usex64) then begin // not native -> try install
if C_SupportsDllPlugins(fin_usex64) then // dll unsupported -> fail
fails.Add(plugins.Strings[i])
else if C_IsDllPluginBlacklisted(name, fin_usex64) then // dll supported and blacklisted -> fail
fails.Add(plugins.Strings[i])
;//else C_InstallVariation(plugins.Strings[i]); // dll supported and not blacklisted -> install
// ^^^ this is done on Apophysis startup now!
end;
end;
{$endif}
name := C_GetPathOf('chaotica.exe', fin_usex64);
if (not FileExists(name)) then begin
messagebox(0, PCHAR(TextByKey('main-status-nochaotica')),
PCHAR('Apophysis 7X'), MB_ICONHAND);
Exit;
end;
if (fails.Count > 0) then begin
messagebox(0, PCHAR(TextByKey('main-status-oldchaotica')),
PCHAR('Apophysis 7X'), MB_ICONHAND or MB_OK);
end;
fname := GetEnvironmentVariable('TEMP') + '\chaotica_export.flame';
txt := TStringList.Create;
txt.Text := flamexml;
txt.SaveToFile(fname);
txt.Destroy;
fails.Destroy;
//if fin_usex64 then MessageBox(0, PCHAR('DBG:x64'), PCHAR(''), MB_OK)
//else MessageBox(0, PCHAR('DBG:x86'), PCHAR(''), MB_OK) ;
ShellExecute(application.handle, PChar('open'), pchar(name),
PChar('"' + fname + '"'), PChar(ExtractFilePath(name)), SW_SHOWNORMAL);
end;
end.

689
Core/Global.pas Normal file
View File

@ -0,0 +1,689 @@
{
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 Global;
interface
uses
Windows, SysUtils, Classes, SyncObjs, Controls, Graphics, Math,
cmap, ControlPoint, Xform, CommDlg;
type
EFormatInvalid = class(Exception);
{ Weight manipulation }
{ Triangle transformations }
function triangle_area(t: TTriangle): double;
function transform_affine(const t: TTriangle; const Triangles: TTriangles): boolean;
function line_dist(x, y, x1, y1, x2, y2: double): double;
function dist(x1, y1, x2, y2: double): double;
{ Parsing functions }
function GetVal(token: string): string;
function ReplaceTabs(str: string): string;
{ Palette and gradient functions }
//function GetGradient(FileName, Entry: string): string;
{ Misc }
function det(a, b, c, d: double): double;
function solve3(x1, x2, x1h, y1, y2, y1h, z1, z2, z1h: double;
var a, b, e: double): double;
function OpenSaveFileDialog(Parent: TWinControl;
const DefExt,
Filter,
InitialDir,
Title: string;
var FileName: string;
MustExist,
OverwritePrompt,
NoChangeDir,
DoOpen: Boolean): Boolean;
procedure LoadThumbnailPlaceholder(ThumbnailSize : integer);
function GetEnvVarValue(const VarName: string): string;
const
APP_NAME: string = 'Apophysis 7x';
{$ifdef Apo7X64}
APP_BUILD: string = '64 bit';
{$else}
APP_BUILD: string = '32 bit';
{$endif}
MAX_TRANSFORMS: integer = 100;
prefilter_white: integer = 1024;
eps: double = 1E-10;
White_level = 200;
clyellow1 = TColor($17FCFF);
clplum2 = TColor($ECA9E6);
clSlateGray = TColor($837365);
FT_BMP = 1; FT_PNG = 2; FT_JPG = 3;
const
crEditArrow = 20;
crEditMove = 21;
crEditRotate = 22;
crEditScale = 23;
const
SingleBuffer : boolean =
{$ifdef Apo7X64}
false
{$else}
true
{$endif};
var
MainSeed: integer;
MainTriangles: TTriangles;
Transforms: integer; // Count of Tranforms
EnableFinalXform: boolean;
AppPath: string; // Path of applicatio file
OpenFile: string; // Name of currently open file
CanDrawOnResize: boolean;
PreserveWeights: boolean;
AlwaysCreateBlankFlame : boolean;
StartupCheckForUpdates : boolean;
TBWidth1 : integer;
TBWidth2 : integer;
TBWidth3 : integer;
TBWidth4 : integer;
TBWidth5 : integer;
ThumbnailPlaceholder : TBitmap;
WarnOnMissingPlugin : boolean;
EmbedThumbnails : boolean;
LanguageFile : string;
AvailableLanguages : TStringList;
PluginPath : string;
{ UPR Options }
UPRSampleDensity: integer;
UPRFilterRadius: double;
UPROversample: integer;
UPRAdjustDensity: boolean;
UPRColoringIdent: string;
UPRColoringFile: string;
UPRFormulaIdent: string;
UPRFormulaFile: string;
UPRWidth: Integer;
UPRHeight: Integer;
ImageFolder: string;
UPRPath: string; // Name and folder of last UPR file
cmap_index: integer; // Index to current gradient
Variation: TVariation; // Current variation
NumTries, TryLength: integer; // Settings for smooth palette
SmoothPaletteFile: string;
{ Editor }
UseFlameBackground, UseTransformColors: boolean;
HelpersEnabled: boolean;
EditorBkgColor, ReferenceTriangleColor: integer;
GridColor1, GridColor2, HelpersColor: integer;
ExtEditEnabled, TransformAxisLock, RebuildXaosLinks: boolean;
ShowAllXforms: boolean;
EditorPreviewTransparency: integer;
EnableEditorPreview: boolean;
{ Display }
defSampleDensity, defPreviewDensity: Double;
defGamma, defBrightness, defVibrancy,
defFilterRadius, defGammaThreshold: Double;
defOversample: integer;
{ Render }
renderDensity, renderFilterRadius: double;
renderOversample, renderWidth, renderHeight: integer;
renderBitsPerSample: integer;
renderPath: string;
JPEGQuality: integer;
renderFileFormat: integer;
InternalBitsPerSample: integer;
NrTreads: Integer;
UseNrThreads: integer;
PNGTransparency: integer;
ShowTransparency: boolean;
MainPreviewScale: double;
ExtendMainPreview: boolean;
StoreEXIF : boolean;
StoreParamsEXIF : boolean;
ExifAuthor : string;
{ Defaults }
LastOpenFile: string;
LastOpenFileEntry: integer;
RememberLastOpenFile: boolean;
UseSmallThumbnails: boolean;
ClassicListMode: boolean;
ConfirmDelete: boolean; // Flag confirmation of entry deletion
OldPaletteFormat: boolean;
ConfirmExit: boolean;
ConfirmStopRender: boolean;
SavePath, SmoothPalettePath: string;
RandomPrefix, RandomDate: string;
RandomIndex: integer;
FlameFile, GradientFile, GradientEntry, FlameEntry: string;
ParamFolder: string;
prevLowQuality, prevMediumQuality, prevHighQuality: double;
defSmoothPaletteFile: string;
BrowserPath: string; // Stored path of browser open dialog
EditPrevQual, MutatePrevQual, AdjustPrevQual: Integer;
randMinTransforms, randMaxTransforms: integer;
mutantMinTransforms, mutantMaxTransforms: integer;
KeepBackground: boolean;
randGradient: Integer;
randGradientFile: string;
defFlameFile: string;
PlaySoundOnRenderComplete: boolean;
RenderCompleteSoundFile: string;
SaveIncompleteRenders: boolean;
ShowRenderStats: boolean;
LowerRenderPriority: boolean;
SymmetryType: integer;
SymmetryOrder: integer;
SymmetryNVars: integer;
Variations: array of boolean;
//VariationOptions: int64;
MainForm_RotationMode: integer;
PreserveQuality: boolean;
{ For random gradients }
MinNodes, MaxNodes, MinHue, MaxHue, MinSat, MaxSat, MinLum, MaxLum: integer;
//ReferenceMode: integer;
BatchSize: Integer;
Compatibility: integer; //0 = original, 1 = Drave's
Favorites: TStringList;
Script: string;
ScriptPath: string;
SheepServer, SheepNick, SheepURL, SheepPW, flam3Path, helpPath: string;
ExportBatches, ExportOversample, ExportWidth, ExportHeight, ExportFileFormat: Integer;
ExportFilter, ExportDensity: Double;
ExportEstimator, ExportEstimatorMin, ExportEstimatorCurve: double;
ExportJitters: integer;
ExportGammaTreshold: double;
OpenFileType: TFileType;
// ResizeOnLoad: Boolean;
ShowProgress: Boolean;
defLibrary: string;
LimitVibrancy: Boolean;
DefaultPalette: TColorMap;
AutoOpenLog: Boolean;
AutoSaveEnabled: Boolean;
AutoSaveFreq: integer;
AutoSavePath: string;
LineCenterColor : integer;
LineThirdsColor : integer;
LineGRColor : integer;
EnableGuides : boolean;
function Round6(x: double): double;
implementation
function GetEnvVarValue(const VarName: string): string;
var
BufSize: Integer; // buffer size required for value
begin
// Get required buffer size (inc. terminal #0)
BufSize := GetEnvironmentVariable(
PChar(VarName), nil, 0);
if BufSize > 0 then
begin
// Read env var value into result string
SetLength(Result, BufSize - 1);
GetEnvironmentVariable(PChar(VarName),
PChar(Result), BufSize);
end
else
// No such environment variable
Result := '';
end;
procedure LoadThumbnailPlaceholder(ThumbnailSize : integer);
var
placeholder: TBitmap;
placeholderIcon: TBitmap;
const
pi_width = 48;
pi_height = 48;
begin
placeholder := TBitmap.Create;
placeholderIcon := TBitmap.Create;
placeholderIcon.Handle := LoadBitmap(hInstance, 'THUMB_PLACEHOLDER');
placeholder.PixelFormat := pf32bit;
placeholder.HandleType := bmDIB;
placeholder.Width := ThumbnailSize;
placeholder.Height := ThumbnailSize;
with placeholder.Canvas do begin
Brush.Color := $000000;
FillRect(Rect(0, 0, placeholder.Width, placeholder.Height));
Draw(round(ThumbnailSize / 2 - pi_width / 2), round(ThumbnailSize / 2 - pi_height / 2), placeholderIcon);
end;
placeholderIcon.Free;
ThumbnailPlaceholder := placeholder;
end;
{ IFS }
function det(a, b, c, d: double): double;
begin
Result := (a * d - b * c);
end;
function Round6(x: double): double;
// Really ugly, but it works
begin
// --Z-- this is ridiculous:
// Result := StrToFloat(Format('%.6f', [x]));
// and yes, this is REALLY ugly :-\
Result := RoundTo(x, -6);
end;
function solve3(x1, x2, x1h, y1, y2, y1h, z1, z2, z1h: double;
var a, b, e: double): double;
var
det1: double;
begin
det1 := x1 * det(y2, 1.0, z2, 1.0) - x2 * det(y1, 1.0, z1, 1.0)
+ 1 * det(y1, y2, z1, z2);
if (det1 = 0.0) then
begin
Result := det1;
EXIT;
end
else
begin
a := (x1h * det(y2, 1.0, z2, 1.0) - x2 * det(y1h, 1.0, z1h, 1.0)
+ 1 * det(y1h, y2, z1h, z2)) / det1;
b := (x1 * det(y1h, 1.0, z1h, 1.0) - x1h * det(y1, 1.0, z1, 1.0)
+ 1 * det(y1, y1h, z1, z1h)) / det1;
e := (x1 * det(y2, y1h, z2, z1h) - x2 * det(y1, y1h, z1, z1h)
+ x1h * det(y1, y2, z1, z2)) / det1;
a := Round6(a);
b := Round6(b);
e := Round6(e);
Result := det1;
end;
end;
function dist(x1, y1, x2, y2: double): double;
//var
// d2: double;
begin
(*
{ From FDesign source
{ float pt_pt_distance(float x1, float y1, float x2, float y2) }
d2 := (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
if (d2 = 0.0) then
begin
Result := 0.0;
exit;
end
else
Result := sqrt(d2);
*)
// --Z-- This is just amazing... :-\
// Someone needed an 'FDesign source' - to compute distance between two points??!?
Result := Hypot(x2-x1, y2-y1);
end;
function line_dist(x, y, x1, y1, x2, y2: double): double;
var
a, b, e, c: double;
begin
if ((x = x1) and (y = y1)) then
a := 0.0
else
a := sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
if ((x = x2) and (y = y2)) then
b := 0.0
else
b := sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
if ((x1 = x2) and (y1 = y2)) then
e := 0.0
else
e := sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
if ((a * a + e * e) < (b * b)) then
Result := a
else if ((b * b + e * e) < (a * a)) then
Result := b
else if (e <> 0.0) then
begin
c := (b * b - a * a - e * e) / (-2 * e);
if ((a * a - c * c) < 0.0) then
Result := 0.0
else
Result := sqrt(a * a - c * c);
end
else
Result := a;
end;
function transform_affine(const t: TTriangle; const Triangles: TTriangles): boolean;
var
ra, rb, rc, a, b, c: double;
begin
Result := True;
ra := dist(Triangles[-1].y[0], Triangles[-1].x[0],
Triangles[-1].y[1], Triangles[-1].x[1]);
rb := dist(Triangles[-1].y[1], Triangles[-1].x[1],
Triangles[-1].y[2], Triangles[-1].x[2]);
rc := dist(Triangles[-1].y[2], Triangles[-1].x[2],
Triangles[-1].y[0], Triangles[-1].x[0]);
a := dist(t.y[0], t.x[0], t.y[1], t.x[1]);
b := dist(t.y[1], t.x[1], t.y[2], t.x[2]);
c := dist(t.y[2], t.x[2], t.y[0], t.x[0]);
if (a > ra) then
Result := False
else if (b > rb) then
Result := False
else if (c > rc) then
Result := False
else if ((a = ra) and (b = rb) and (c = rc)) then
Result := False;
end;
function triangle_area(t: TTriangle): double;
var
base, height: double;
begin
try
base := dist(t.x[0], t.y[0], t.x[1], t.y[1]);
height := line_dist(t.x[2], t.y[2], t.x[1], t.y[1],
t.x[0], t.y[0]);
if (base < 1.0) then
Result := height
else if (height < 1.0) then
Result := base
else
Result := 0.5 * base * height;
except on E: EMathError do
Result := 0;
end;
end;
{ Parse }
function GetVal(token: string): string;
var
p: integer;
begin
p := Pos('=', token);
Delete(Token, 1, p);
Result := Token;
end;
function ReplaceTabs(str: string): string;
{Changes tab characters in a string to spaces}
var
i: integer;
begin
for i := 1 to Length(str) do
begin
if str[i] = #9 then
begin
Delete(str, i, 1);
Insert(#32, str, i);
end;
end;
Result := str;
end;
(*
{ Palette and gradient functions }
function RGBToColor(Pal: TMapPalette; index: integer): Tcolor;
begin
{ Converts the RGB values from a palette index to the TColor type ...
could maybe change it to SHLs }
Result := (Pal.Blue[index] * 65536) + (Pal.Green[index] * 256)
+ Pal.Red[index];
end;
procedure rgb2hsv(const rgb: array of double; out hsv: array of double);
var
maxval, minval: double;
del: double;
begin
Maxval := Max(rgb[0], Max(rgb[1], rgb[2]));
Minval := Min(rgb[0], Min(rgb[1], rgb[2]));
hsv[2] := maxval; // v
if (Maxval > 0) and (maxval <> minval) then begin
del := maxval - minval;
hsv[1] := del / Maxval; //s
hsv[0] := 0;
if (rgb[0] > rgb[1]) and (rgb[0] > rgb[2]) then begin
hsv[0] := (rgb[1] - rgb[2]) / del;
end else if (rgb[1] > rgb[2]) then begin
hsv[0] := 2 + (rgb[2] - rgb[0]) / del;
end else begin
hsv[0] := 4 + (rgb[0] - rgb[1]) / del;
end;
if hsv[0] < 0 then
hsv[0] := hsv[0] + 6;
end else begin
hsv[0] := 0;
hsv[1] := 0;
end;
end;
procedure hsv2rgb(const hsv: array of double; out rgb: array of double);
var
j: integer;
f, p, q, t, v: double;
begin
j := floor(hsv[0]);
f := hsv[0] - j;
v := hsv[2];
p := hsv[2] * (1 - hsv[1]);
q := hsv[2] * (1 - hsv[1] * f);
t := hsv[2] * (1 - hsv[1] * (1 - f));
case j of
0: begin rgb[0] := v; rgb[1] := t; rgb[2] := p; end;
1: begin rgb[0] := q; rgb[1] := v; rgb[2] := p; end;
2: begin rgb[0] := p; rgb[1] := v; rgb[2] := t; end;
3: begin rgb[0] := p; rgb[1] := q; rgb[2] := v; end;
4: begin rgb[0] := t; rgb[1] := p; rgb[2] := v; end;
5: begin rgb[0] := v; rgb[1] := p; rgb[2] := t; end;
end;
end;
function GetGradient(FileName, Entry: string): string;
var
FileStrings: TStringList;
GradStrings: TStringList;
i: integer;
begin
FileStrings := TStringList.Create;
GradStrings := TStringList.Create;
try
try
FileStrings.LoadFromFile(FileName);
for i := 0 to FileStrings.count - 1 do
if Pos(Entry + ' ', Trim(FileStrings[i])) = 1 then break;
GradStrings.Add(FileStrings[i]);
repeat
inc(i);
GradStrings.Add(FileStrings[i]);
until Pos('}', FileStrings[i]) <> 0;
GetGradient := GradStrings.Text;
except on exception do
Result := '';
end;
finally
GradStrings.Free;
FileStrings.Free;
end;
end;
*)
function ReplaceStr(Str, SearchStr, ReplaceStr: string): string;
begin
while Pos(SearchStr, Str) <> 0 do
begin
Insert(ReplaceStr, Str, Pos(SearchStr, Str));
system.Delete(Str, Pos(SearchStr, Str), Length(SearchStr));
end;
Result := Str;
end;
function SplitFilter(const fText: String; const fSep: Char; fTrim: Boolean=false; fQuotes: Boolean=false):TStringList;
var vI: Integer;
vBuffer: String;
vOn: Boolean;
begin
Result:=TStringList.Create;
vBuffer:='';
vOn:=true;
for vI:=1 to Length(fText) do
begin
if (fQuotes and(fText[vI]=fSep)and vOn)or(Not(fQuotes) and (fText[vI]=fSep)) then
begin
if fTrim then vBuffer:=Trim(vBuffer);
if vBuffer='' then vBuffer:=fSep; // !!! e.g. split(',**',',')...
if vBuffer[1]=fSep then
vBuffer:=Copy(vBuffer,2,Length(vBuffer));
Result.Add(vBuffer);
vBuffer:='';
end;
if fQuotes then
begin
if fText[vI]='"' then
begin
vOn:=Not(vOn);
Continue;
end;
if (fText[vI]<>fSep)or((fText[vI]=fSep)and(vOn=false)) then
vBuffer:=vBuffer+fText[vI];
end else
if fText[vI]<>fSep then
vBuffer:=vBuffer+fText[vI];
end;
if vBuffer<>'' then
begin
if fTrim then vBuffer:=Trim(vBuffer);
Result.Add(vBuffer);
end;
end;
function OpenSaveFileDialog(Parent: TWinControl;
const DefExt,
Filter,
InitialDir,
Title: string;
var FileName: string;
MustExist,
OverwritePrompt,
NoChangeDir,
DoOpen: Boolean): Boolean;
// uses commdlg
var
ofn: TOpenFileName;
szFile: array[0..260] of Char;
fa, fa2: TStringList;
h,i,j,k,c : integer;
cs, s : string;
begin
Result := False;
FillChar(ofn, SizeOf(TOpenFileName), 0);
with ofn do
begin
lStructSize := SizeOf(TOpenFileName);
hwndOwner := Parent.Handle;
lpstrFile := szFile;
nMaxFile := SizeOf(szFile);
if (Title <> '') then
lpstrTitle := PChar(Title);
if (InitialDir <> '') then
lpstrInitialDir := PChar(InitialDir);
StrPCopy(lpstrFile, FileName);
lpstrFilter := PChar(ReplaceStr(Filter, '|', #0)+#0#0);
fa := splitFilter(Filter, '|');
k := 0;
c := (fa.Count div 2);
for i := 0 to c - 1 do begin
j := 2 * i + 1;
cs := LowerCase(fa.Strings[j]);
fa2 := splitFilter(cs, ';');
for h := 0 to fa2.Count - 1 do begin
cs := fa2.Strings[h];
s := '*.' + LowerCase(DefExt);
if (cs = s) then k := i;
end;
end;
nFilterIndex := k + 1;
if DefExt <> '' then
lpstrDefExt := PChar(DefExt);
end;
if MustExist then ofn.Flags := ofn.Flags or OFN_FILEMUSTEXIST;
if OverwritePrompt then ofn.Flags := ofn.Flags or OFN_OVERWRITEPROMPT;
if NoChangeDir then ofn.Flags := ofn.Flags or OFN_NOCHANGEDIR;
if DoOpen then
begin
if GetOpenFileName(ofn) then
begin
Result := True;
FileName := StrPas(szFile);
end;
end
else
begin
if GetSaveFileName(ofn) then
begin
Result := True;
FileName := StrPas(szFile);
end;
end
end; // function OpenSaveFileDialog
end.

754
Core/Translation.pas Normal file
View File

@ -0,0 +1,754 @@
unit Translation;
interface
uses Global, Classes, Forms, LibXmlParser, LibXmlComps, SysUtils, RegexHelper;
procedure ListLanguages;
procedure LanguageInfo(path: string; var name, localName: string);
function LanguageAuthor(path: string): string;
procedure Add(key, value: string);
procedure LoadLanguage(path:string);
procedure LoadEnglish();
function TextByKey(key:string):string;
type
TParser = class
public
constructor Create;
procedure ListXmlScannerStartTag(Sender: TObject; TagName: string; Attributes: TAttrList);
procedure ListXmlScannerEndTag(Sender: TObject; TagName: string);
procedure ListXmlScannerEmptyTag(Sender: TObject; TagName: string; Attributes: TAttrList);
procedure ListXmlScannerContent(Sender: TObject; Content: string);
private
currentTagname: string;
parentTagnames: TStringList;
end;
TKeyValuePair = class
public
key: string;
value: string;
end;
TDictionary = array of TKeyValuePair;
var
language: TDictionary;
defaultlanguage: TDictionary;
tokenCount: integer;
ListXmlScanner: TEasyXmlScanner;
parser: TParser;
implementation
procedure ListLanguages;
var
searchResult: TSearchRec;
begin
if FindFirst(ExtractFilePath(Application.ExeName) + 'Languages\*.xml', faAnyFile, searchResult) = 0 then
begin
repeat
AvailableLanguages.Add(ExtractFilePath(Application.ExeName) + 'Languages\' + searchResult.Name);
until (FindNext(searchResult) <> 0);
SysUtils.FindClose(searchResult);
end;
end;
procedure LanguageInfo(path: string; var name, localName: string);
const
exp1 = '\stitle="([^"]*)"';
exp2 = '\slocalized-title="([^"]*)"';
var
langxml : string;
sl: TStringList;
begin
sl := TStringList.Create;
sl.LoadFromFile(path);
langxml := sl.Text;
sl.Destroy;
name := GetStringPart(langxml, exp1, 1, '');
localname := GetStringPart(langxml, exp2, 1, '');
end;
function LanguageAuthor(path: string): string;
const
exp = '\sauthor="([^"]*)"';
var
langxml : string;
sl: TStringList;
begin
sl := TStringList.Create;
sl.LoadFromFile(path);
langxml := sl.Text;
sl.Destroy;
Result := GetStringPart(langxml, exp, 1, '');
end;
procedure LoadEnglish();
begin
//TODO:
//render-status-renderhibernated
Add('common-ok', 'OK');
Add('common-cancel', 'Cancel');
Add('common-apply', 'Apply');
Add('common-yes', 'Yes');
Add('common-no', 'No');
Add('common-lowquality', 'Low Quality');
Add('common-mediumquality', 'Medium Quality');
Add('common-highquality', 'High Quality');
Add('common-copy', 'Copy');
Add('common-paste', 'Paste');
Add('common-delete', 'Delete');
Add('common-rename', 'Rename');
Add('common-undo', 'Undo');
Add('common-redo', 'Redo');
Add('common-width', 'Width');
Add('common-height', 'Height');
Add('common-size', 'Size');
Add('common-pixels', 'Pixels');
Add('common-keepaspect', 'Maintain aspect ratio');
Add('common-destination', 'Destination');
Add('common-filename', 'File name');
Add('common-browse', 'Browse...');
Add('common-quality', 'Quality');
Add('common-filterradius', 'Filter Radius');
Add('common-density', 'Density');
Add('common-oversample', 'Oversample');
Add('common-gamma', 'Gamma');
Add('common-brightness', 'Brightness');
Add('common-contrast', 'Contrast');
Add('common-vibrancy', 'Vibrancy');
Add('common-background', 'Background');
Add('common-gammathreshold', 'Gamma Threshold');
Add('common-start', 'Start');
Add('common-pause', 'Pause');
Add('common-resume', 'Resume');
Add('common-close', 'Close');
Add('common-clear', 'Clear');
Add('common-enabled', 'Enabled');
Add('common-disabled', 'Disabled');
Add('common-minimum', 'Minimum');
Add('common-maximum', 'Maximum');
Add('common-resetlocation', 'Reset location');
Add('common-genericopenfailure', 'Unable to open "%s".');
Add('common-genericsavefailure', 'Unable to save "%s".');
Add('common-invalidformat', 'Invalid format.');
Add('common-confirmexit', 'Do you really want to exit? All unsaved data will be lost!');
Add('common-confirmdelete', 'Are you sure you want to permanently delete "%s"?');
Add('common-dragpanelhint', 'Click and drag to change value');
Add('common-trace-pausing', 'Pausing render');
Add('common-trace-resuming', 'Resuming render');
Add('common-trace-terminating', 'Terminating render');
Add('common-trace-stopping', 'Stopping render');
Add('common-trace-saving', 'Saving image...');
Add('common-trace-creating-simple', 'Creating image...');
Add('common-trace-creating-detailed', 'Creating image with quality: %f...');
Add('common-trace-rendering-oneslice', 'Rendering...');
Add('common-trace-rendering-multipleslices', 'Rendering slice %d of %d...');
Add('common-trace-allocating', 'Allocating %n Mb of memory...');
Add('common-trace-notenoughmemory', 'ERROR: Not enough memory for this render!');
Add('common-statistics-title-oneslice', 'Render Statistics:');
Add('common-statistics-title-multipleslices', 'Render Statistics for the last slice:');
Add('common-statistics-maxpossiblebits', 'Max possible bits: %2.3f');
Add('common-statistics-maxred', 'Max Red: %2.3f bits');
Add('common-statistics-maxgreen', 'Max Green: %2.3f bits');
Add('common-statistics-maxblue', 'Max Blue: %2.3f bits');
Add('common-statistics-maxcounter', 'Max Count: %2.3f bits');
Add('common-statistics-pointhitratio', 'Point hit ratio: %2.2f%%');
Add('common-statistics-averagespeed', 'Average speed: %n iterations per second');
Add('common-statistics-purerenderingtime', 'Pure rendering time:');
Add('common-seconds', 'second(s)');
Add('common-minutes', 'minute(s)');
Add('common-hours', 'hour(s)');
Add('common-days', 'day(s)');
Add('common-suspendtodisk', 'Suspend to disk');
Add('common-resumefromdisk', 'Resume from disk');
Add('common-filter-flamefiles', 'Apophysis Flame Library (*.flame;*.xml)');
Add('common-filter-gradientfiles', 'Gradient files (*.gradient;*.ugr)');
Add('common-filter-fractintfiles', 'Fractint maps (*.map)');
Add('common-filter-uprfiles', 'UltraFractal parameters (*.upr)');
Add('common-filter-script', 'Apophysis Script (*.aposcript;*.asc)');
Add('common-filter-allimages', 'All images (*.bmp;*.dib;*.jpg;*.jpeg)');
Add('common-filter-bitmap', 'Windows Bitmap (*.bmp;*.dib)');
Add('common-filter-jpeg', 'JPEG (*.jpg;*.jpeg)');
Add('common-filter-png', 'Portable Network Graphics (*.png)');
Add('common-filter-allfiles', 'All files (*.*)');
Add('splash-loadingui', 'Loading user interface...');
Add('splash-loadingsettings', 'Loading settings...');
Add('splash-loadingplugins', 'Loading plugins...');
Add('splash-initrenderer', 'Initializing renderer...');
Add('splash-initcolormap', 'Initializing gradients...');
Add('splash-initbatch', 'Creating random batch...');
Add('splash-execstartupscript', 'Executing "autoexec.asc"...');
Add('adjustment-title', 'Adjustment');
Add('adjustment-common-depthblur', 'Depth Blur');
Add('adjustment-common-pitch', 'Pitch');
Add('adjustment-common-yaw', 'Yaw');
Add('adjustment-common-height', 'Height');
Add('adjustment-common-perspective', 'Perspective');
Add('adjustment-common-scale', 'Scale');
Add('adjustment-tab-camera-title', 'Camera');
Add('adjustment-tab-camera-zoom', 'Zoom');
Add('adjustment-tab-camera-xpos', 'X-Position');
Add('adjustment-tab-camera-ypos', 'Y-Position');
Add('adjustment-tab-camera-rotation', 'Rotation');
Add('adjustment-tab-rendering-title', 'Rendering');
Add('adjustment-tab-rendering-istransparent', 'Transparent');
Add('adjustment-tab-gradient-title', 'Gradient');
Add('adjustment-tab-gradient-moderotate', 'Rotate');
Add('adjustment-tab-gradient-modehue', 'Hue');
Add('adjustment-tab-gradient-modesaturation', 'Saturation');
Add('adjustment-tab-gradient-modebrightness', 'Brightness');
Add('adjustment-tab-gradient-modecontrast', 'Contrast');
Add('adjustment-tab-gradient-modeblur', 'Blur');
Add('adjustment-tab-gradient-modefrequency', 'Frequency');
Add('adjustment-tab-gradient-preset', 'Preset');
Add('adjustment-tab-gradient-reset', 'Reset');
Add('adjustment-tab-gradient-modehint', 'Click for menu');
Add('adjustment-tab-gradient-presethint', 'Click to choose random preset');
Add('adjustment-tab-size-title', 'Image size');
Add('adjustment-tab-size-preset', 'Empty preset');
Add('adjustment-tab-size-resizemain', 'Resize main window');
Add('adjustment-tab-curves-title', 'Curves');
Add('adjustment-tab-curves-reset', 'Reset');
Add('adjustment-tab-curves-selected', 'Selected curve:');
Add('adjustment-tab-curves-overall', 'Overall');
Add('adjustment-tab-curves-red', 'Red');
Add('adjustment-tab-curves-green', 'Green');
Add('adjustment-tab-curves-blue', 'Blue');
Add('adjustment-popup-quality-instantpreview', 'Instant preview');
Add('adjustment-popup-gradient-randomize', 'Randomize');
Add('adjustment-popup-gradient-invert', 'Invert');
Add('adjustment-popup-gradient-reverse', 'Reverse');
Add('adjustment-popup-gradient-smooth', 'Smooth Palette...');
Add('adjustment-popup-gradient-browser', 'Gradient Browser...');
Add('adjustment-popup-gradient-saveasugr', 'Save Gradient...');
Add('adjustment-popup-gradient-saveasmap', 'Save as Map File...');
Add('adjustment-popup-gradient-saveasdefault', 'Save as default');
Add('editor-title', 'Editor');
Add('editor-common-transform', 'Transform:');
Add('editor-common-name', 'Name:');
Add('editor-common-weight', 'Weight:');
Add('editor-common-finalxformlistitem', 'Final');
Add('editor-common-fromprefix', 'from %d');
Add('editor-common-toprefix', 'to %d');
Add('editor-tab-variations-title', 'Variations');
Add('editor-tab-variations-name', 'Name');
Add('editor-tab-variations-value', 'Value');
Add('editor-tab-variations-togglehideunused', 'Hide unused variations');
Add('editor-tab-variables-title', 'Variables');
Add('editor-tab-variables-name', 'Name');
Add('editor-tab-variables-value', 'Value');
Add('editor-tab-variables-toggleshowall', 'Show all variables');
Add('editor-tab-chaos-title', 'Xaos');
Add('editor-tab-chaos-path', 'Path');
Add('editor-tab-chaos-modifier', 'Weight modifier');
Add('editor-tab-chaos-viewasto', 'View as "to"');
Add('editor-tab-chaos-viewasfrom', 'View as "from"');
Add('editor-tab-triangle-title', 'Triangle');
Add('editor-tab-triangle-pivot', 'Pivot');
Add('editor-tab-triangle-modelocal', 'Local');
Add('editor-tab-triangle-modeworld', 'World');
Add('editor-tab-triangle-resetpivot', 'Reset pivot point');
Add('editor-tab-triangle-pickpivot', 'Pick pivot point');
Add('editor-tab-triangle-rotateleft', 'Rotate triangle counter-clockwise');
Add('editor-tab-triangle-rotateright', 'Rotate triangle clockwise');
Add('editor-tab-triangle-moveup', 'Move triangle up');
Add('editor-tab-triangle-movedown', 'Move triangle down');
Add('editor-tab-triangle-moveleft', 'Move triangle left');
Add('editor-tab-triangle-moveright', 'Move triangle right');
Add('editor-tab-triangle-scaledown', 'Scale triangle down');
Add('editor-tab-triangle-scaleup', 'Scale triangle up');
Add('editor-tab-triangle-autoweight', 'Auto-balance weights');
Add('editor-tab-transform-title', 'Transform');
Add('editor-tab-transform-reset', 'Reset transform');
Add('editor-tab-transform-resethint', 'Reset all vectors to default position');
Add('editor-tab-transform-rectangular', 'Rectangular');
Add('editor-tab-transform-rectangularhint', 'Show vectors in rectangular (cartesian) corrdinates');
Add('editor-tab-transform-polar', 'Polar (deg)');
Add('editor-tab-transform-polarhint', 'Show vector in polar coordinates');
Add('editor-tab-transform-resetpost', 'Reset post transform');
Add('editor-tab-transform-resetposthint', 'Reset all post-transform vectors to default position');
Add('editor-tab-transform-autozscale', 'Auto-calculate pre_zscale');
Add('editor-tab-transform-resetxhint', 'Reset vector X');
Add('editor-tab-transform-resetyhint', 'Reset vector Y');
Add('editor-tab-transform-resetohint', 'Reset vector O');
Add('editor-tab-color-title', 'Colors');
Add('editor-tab-color-transformcolor', 'Transform color');
Add('editor-tab-color-colorspeed', 'Color speed');
Add('editor-tab-color-opacity', 'Opacity');
Add('editor-tab-color-directcolor', 'Direct color');
Add('editor-tab-color-togglesolo', 'Solo');
Add('editor-tab-color-togglesoloformat', 'Solo transform #%d');
Add('editor-tab-color-varpreview', 'Variation preview');
Add('editor-tab-color-previewrange', 'Range');
Add('editor-tab-color-previewdepth', 'Depth');
Add('editor-tab-color-previewdensity', 'Density');
Add('editor-tab-color-preview', 'Preview');
Add('editor-toolbar-newflame', 'New flame');
Add('editor-toolbar-newtransform', 'New transform');
Add('editor-toolbar-addlinkedtransform', 'Add linked transform');
Add('editor-toolbar-duplicatetransform', 'Duplicate transform');
Add('editor-toolbar-removetransform', 'Remove transform');
Add('editor-toolbar-modeselect', 'Selection mode');
Add('editor-toolbar-modemove', 'Movement mode');
Add('editor-toolbar-moderotate', 'Rotation mode');
Add('editor-toolbar-modescale', 'Scale mode');
Add('editor-toolbar-toggleworldpivot', 'Toggle world pivot');
Add('editor-toolbar-rotate90ccw', 'Rotate 90° counter-clockwise');
Add('editor-toolbar-rotate90cw', 'Rotate 90° clockwise');
Add('editor-toolbar-fliph', 'Flip horizontal');
Add('editor-toolbar-flipv', 'Flip vertical');
Add('editor-toolbar-togglevarpreview', 'Show variation preview');
Add('editor-toolbar-toggleposttransform', 'Enable/edit post-transform');
Add('editor-toolbar-togglefinaltransform', 'Enable final transform');
Add('editor-popup-panel-autozoom', 'Zoom automatically');
Add('editor-popup-panel-toggleextendededit', 'Toggle extended edit mode');
Add('editor-popup-panel-locktransformaxes', 'Lock transform axes');
Add('editor-popup-panel-allfliph', 'Flip all horizontally');
Add('editor-popup-panel-allflipv', 'Flip all vertically');
Add('editor-popup-quality-autoreset', 'Auto-reset location');
Add('editor-popup-transform-resetposition', 'Reset position');
Add('editor-popup-transform-resetrotation', 'Reset rotation');
Add('editor-popup-transform-resetscale', 'Reset scale');
Add('editor-popup-transform-copycoords', 'Copy triangle coordinates');
Add('editor-popup-transform-pastecoords', 'Paste triangle coordinates');
Add('editor-popup-transform-resetentiretriangle', 'Reset triangle');
Add('editor-popup-chaos-rebuildlinks', 'Rebuild links');
Add('editor-popup-chaos-clearall', 'Clear all');
Add('editor-popup-chaos-setall', 'Set all');
Add('editor-status-zoomformat', 'Zoom: %f');
Add('editor-status-xformat', 'X: %f');
Add('editor-status-yformat', 'Y: %f');
Add('editor-status-rotateformat', 'Rotate: %3.2f° Inner angle: %3.2f°');
Add('editor-status-rotateformat2', 'Rotate: %3.2f° Local axis: %3.2f°');
Add('editor-status-rotateformat3', 'Rotate: %3.2f°');
Add('editor-status-scaleformat', 'Distance: %3.3f Scale: %3.2f%%');
Add('editor-status-scaleformat2', 'Scale: %3.2f%%');
Add('editor-status-moveformat', 'Move: %3.3f ; %3.3f');
Add('editor-status-moveformat2', 'Move: %3.3f ; %3.3f');
Add('editor-status-transformformat', 'Transform #%d');
Add('editor-status-zoomformat', 'Zoom: %f');
Add('editor-status-selecton', 'Select ON');
Add('editor-status-selectoff', 'Select OFF');
Add('export-title', 'Export to flam3');
Add('export-paramoptions-title', 'Parameter options');
Add('export-paramoptions-bufferdepth', 'Buffer depth');
Add('export-paramoptions-strips', 'Strips');
Add('export-paramoptions-estimatorradius', 'DE radius');
Add('export-paramoptions-estimatorcurve', 'DE curve');
Add('export-paramoptions-estimatormin', 'DE minimum');
Add('export-paramoptions-dorender', 'Render');
Add('export-paramoptions-warningtitle', 'WARNING');
Add('export-paramoptions-warningtext', 'Fractals created with this version of Apophysis are not supported by flam3! To render 2D-only fractals, download the latest version of flam3 from http://www.flam3.com');
Add('favscripts-title', 'Favorite scripts');
Add('favscripts-add', 'Add');
Add('favscripts-remove', 'Remove');
Add('favscripts-moveup', 'Move up');
Add('favscripts-movedown', 'Move down');
Add('fullscreen-popup-rendermore', 'Render more');
Add('fullscreen-popup-stoprender', 'Stop render');
Add('gradientbrowser-title', 'Gradient Browser');
Add('postprocess-title', 'Post-process render');
Add('postprocess-save', 'Save');
Add('postprocess-fittowindow', 'Fit to window');
Add('render-title', 'Render flame');
Add('render-common-gotofolder', 'Open target folder...');
Add('render-tab-settings-title', 'Settings');
Add('render-tab-output-title', 'Output');
Add('render-resourceusage-title', 'Resource usage');
Add('render-resourceusage-infotext', 'The render process will use %u MB of %u MB available physical memory');
Add('render-resourceusage-infotext2', 'Apophysis will try to use %u processor cores (%u available) - change this in the options');
Add('render-resourceusage-limit', 'Memory limit');
Add('render-resourceusage-nolimit', 'No limit');
Add('render-resourceusage-bufferdepth', 'Buffer depth');
Add('render-output-title', 'Output options');
Add('render-output-saveparams', 'Save parameters');
Add('render-completion-title', 'Completion options');
Add('render-completion-postprocess', 'Post-process after rendering');
Add('render-completion-shutdown', 'Shut down after rendering');
Add('render-completion-saveincomplete', 'Save incomplete renders');
Add('render-status-rendererror-log', 'Rendering failed!');
Add('render-status-rendererror-message', 'Error while rendering!');
Add('render-status-saveerror-log', 'Error saving image!');
Add('render-status-saveerror-message1', 'An error occured while saving the image:');
Add('render-status-saveerror-message2', 'Check your free disk space and try again.');
Add('render-status-totaltime', 'Total time:');
Add('render-status-renderterminated', 'Rendering terminated!');
Add('render-status-renderhibernated', 'Rendering paused and progress saved!');
Add('render-status-elapsed', 'Elapsed');
Add('render-status-remaining', 'Remaining');
Add('render-status-slicestatus', 'Slice %d of %d');
Add('render-status-notenoughmemory1', 'You do not have enough memory for this render. Do you want to continue anyway?');
Add('render-status-notenoughmemory2', 'You do not have enough memory for this render. Please use a lower Maximum memory setting. Do you want to ignore this problem and continue?');
Add('render-status-nofilename', 'Please enter a file name.');
Add('render-status-fileexists-message1', '"%s" already exists');
Add('render-status-fileexists-message2', 'Do you want to replace it?');
Add('render-status-pathdoesnotexist', 'The directory does not exist.');
Add('render-status-invaliddensity', 'Invalid Sample Density value');
Add('render-status-invalidfilterradius', 'Invalid Filter Radius value');
Add('render-status-invalidoversample', 'Invalid Oversample value');
Add('render-status-invalidwidth', 'Invalid image width');
Add('render-status-invalidheight', 'Invalid image height');
Add('render-status-maxmemorytoosmall', 'Maximum memory value is too small. Do you want to continue anyway?');
Add('render-status-shuttingdownrender', 'Shutting down previous render...');
Add('render-status-log-title', 'Rendering "%s"');
Add('render-status-log-size', 'Size: %dx%d');
Add('render-status-log-quality', 'Quality: %g');
Add('render-status-log-oversampling', 'Oversample: %d, Filter: %g');
Add('render-status-log-bufferdepth', 'Buffer depth: %s');
Add('render-status-log-memorylimit', 'Memory limit: %d MB');
Add('render-status-log-largepng-message1', '*** WARNING *** You have selected PNG format and an image size which exceeds 20 megapixels');
Add('render-status-log-largepng-message2', 'PNG format with extreme high-resolution images is not recommended!');
Add('render-status-log-largepng-message3', 'To avoid slowdown (and possible memory problems) use BMP file format instead.');
Add('render-status-confirmstop', 'Do you want to stop the current render?');
Add('imagecoloring-title', 'Image coloring');
Add('imagecoloring-enable', 'Enable');
Add('imagecoloring-firstpalette', 'First palette');
Add('imagecoloring-secondpalette', 'Second palette');
Add('imagecoloring-preset', 'Preset');
Add('imagecoloring-image', 'Image');
Add('messages-title', 'Messages');
Add('messages-openautomatically', 'Automatically open this window');
Add('mutation-title', 'Mutation');
Add('mutation-directions', 'Directions');
Add('mutation-speed', 'Speed');
Add('mutation-trend', 'Trend');
Add('mutation-keepnumberoftransforms', 'Keep transform count');
Add('mutation-randomtrend', 'Random');
Add('mutation-maintainsymmetry', 'Maintain symmetry');
Add('mutation-previous', 'Previous');
Add('options-title', 'Settings ');
Add('options-restartnotice', 'You must restart Apophysis 7x to make your changes have effect');
Add('options-tab-general-title', 'General ');
Add('options-tab-general-language', 'Language file');
Add('options-tab-general-multithreading', 'Multithreading ');
Add('options-tab-general-multithreading-off', 'Off ');
Add('options-tab-general-bufferdepth', 'Buffer depth ');
Add('options-tab-general-jpegquality', 'JPEG quality ');
Add('options-tab-general-pngtransparency', 'PNG transparency ');
Add('options-tab-general-showextendedstatistics', 'Show extended render statistics ');
Add('options-tab-general-confirmdelete', 'Confirm delete ');
Add('options-tab-general-confirmexit', 'Confirm exit ');
Add('options-tab-general-confirmrenderstop', 'Confirm stop rendering ');
Add('options-tab-general-oldgradientformat', 'Use old gradient format ');
Add('options-tab-general-alwaysblankflame', 'Disable templates ');
Add('options-tab-general-enablemissingpluginswarning', 'Warn on missing plugins ');
Add('options-tab-general-enablethumbnailembedding', 'Enable thumbnail embedding ');
Add('options-tab-general-rotatemode', 'Rotate mode ');
Add('options-tab-general-rotateimage', 'Rotate image ');
Add('options-tab-general-rotateframe', 'Rotate frame ');
Add('options-tab-general-zoommode', 'Zoom mode ');
Add('options-tab-general-preservequality', 'Preserve quality ');
Add('options-tab-general-preservespeed', 'Preserve speed ');
Add('options-tab-general-guides', 'Guidelines ');
Add('options-tab-general-enableguides', 'Enable guides ');
Add('options-tab-general-guidecentercolor', 'Center ');
Add('options-tab-general-guidethirdscolor', 'Thirds ');
Add('options-tab-general-guidegoldenratiocolor', 'Golden ratio ');
Add('options-tab-general-singleprecision', 'Use single-precision buffers ');
Add('options-tab-general-pluginpath', 'Plugin folder ');
Add('options-tab-editor-title', 'Editor ');
Add('options-tab-editor-editorgraph', 'Graph ');
Add('options-tab-editor-editordefaults', 'Defaults ');
Add('options-tab-editor-referencetriangle', 'Reference triangle ');
Add('options-tab-editor-usetransformcolor', 'Use transform color ');
Add('options-tab-editor-helperlines', 'Show helper lines ');
Add('options-tab-editor-alwaysshowbothtransformtypes', 'Always show both transform types ');
Add('options-tab-editor-backgroundcolor', 'Background ');
Add('options-tab-editor-gridcolors', 'Grid ');
Add('options-tab-editor-referencecolor', 'Reference ');
Add('options-tab-editor-helpercolors', 'Helpers ');
Add('options-tab-editor-extendededit', 'Extended edit mode ');
Add('options-tab-editor-locktransformaxes', 'Lock transform axes ');
Add('options-tab-editor-rebuildxaoslinks', 'Rebuild links ');
Add('options-tab-editor-normalreference', 'Normal ');
Add('options-tab-editor-proportionalreference', 'Proportional ');
Add('options-tab-editor-wanderingreference', 'Wandering (old style) ');
Add('options-tab-editor-enablepreview', 'Enable editor preview');
Add('options-tab-editor-previewtransparency', 'Transparency');
Add('options-tab-display-title', 'Display ');
Add('options-tab-display-rendering', 'Rendering ');
Add('options-tab-display-previewdensity', 'Preview density ');
Add('options-tab-display-mainpreview', 'Main window preview ');
Add('options-tab-display-extendpreviewbuffer', 'Extend preview buffer ');
Add('options-tab-display-extenspreviewbufferlabel', 'Buffer extension ');
Add('options-tab-display-showtransparency', 'Show transparency ');
Add('options-tab-display-usesmallthumbs', 'Use small thumbnails (like Apophysis 2.09) ');
Add('options-tab-random-title', 'Random ');
Add('options-tab-random-numberoftransforms', 'Number of transforms ');
Add('options-tab-random-mutationtransforms', 'Mutation transforms ');
Add('options-tab-random-randombatch', 'Random batch ');
Add('options-tab-random-forcedsymmetry', 'Forced symmetry ');
Add('options-tab-random-batchsize', 'Batch size ');
Add('options-tab-random-titleprefix', 'Title prefix ');
Add('options-tab-random-keepbackground', 'Keep background color ');
Add('options-tab-random-symtype', 'Type ');
Add('options-tab-random-symorder', 'Order ');
Add('options-tab-random-symlimit', 'Limit ');
Add('options-tab-random-type-none', 'None ');
Add('options-tab-random-type-bilateral', 'Bilateral ');
Add('options-tab-random-type-rotational', 'Rotational ');
Add('options-tab-random-type-dihedral', 'Dihedral ');
Add('options-tab-random-onrandom', 'On random flame use... ');
Add('options-tab-random-userandom', 'Random preset ');
Add('options-tab-random-usedefault', 'Default gradient ');
Add('options-tab-random-usecurrent', 'Current gradient ');
Add('options-tab-random-randomcalculated', 'Random gradient ');
Add('options-tab-random-randomfromfile', 'Random from file ');
Add('options-tab-random-filetouse', 'Random file to use ');
Add('options-tab-variations-title', 'Variations ');
Add('options-tab-variations-setall', 'Set all ');
Add('options-tab-variations-clearall', 'Clear all ');
Add('options-tab-gradient-title', 'Gradient ');
Add('options-tab-gradient-numberofnodes', 'Number of nodes ');
Add('options-tab-gradient-smoothpalette', 'Smooth palette ');
Add('options-tab-gradient-huebetween', 'Hue range ');
Add('options-tab-gradient-satbetween', 'Saturation range ');
Add('options-tab-gradient-lumbetween', 'Luminance range ');
Add('options-tab-gradient-numtries', 'Number of tries ');
Add('options-tab-gradient-trylength', 'Try length ');
Add('options-tab-upr-title', 'UltraFractal ');
Add('options-tab-upr-paramdefaults', 'Parameter defaults ');
Add('options-tab-upr-coloralgorithm', 'Coloring algorithm ');
Add('options-tab-upr-uprsize', 'Image size ');
Add('options-tab-upr-formula', 'Formula ');
Add('options-tab-upr-identifier', 'Identifier ');
Add('options-tab-upr-adjustdensity', 'Adjust sample density ');
Add('options-tab-environment-title', 'Environment');
Add('options-tab-environment-defaultparams', 'Default parameters ');
Add('options-tab-environment-smoothpalette', 'Smooth palette ');
Add('options-tab-environment-functionlib', 'Scripting function library ');
Add('options-tab-environment-exportrenderer', 'Export renderer ');
Add('options-tab-environment-helpfile', 'Help file ');
Add('options-tab-environment-rememberlastopen', 'Remember last open parameters ');
Add('options-tab-environment-autosave', 'Enable autosave ');
Add('options-tab-environment-savefrequency', 'Save frequency ');
Add('preview-title', 'Preview');
Add('save-title', 'Save');
Add('save-name', 'Name');
Add('save-oldformat', 'Use old format');
Add('save-newformat', 'Use new format');
Add('save-type-parameters', 'Save Parameters');
Add('save-type-allparameters', 'Save All Parameters');
Add('save-type-gradient', 'Save Gradient');
Add('save-type-exportupr', 'Export UPR');
Add('save-status-notitle', 'No item name given.');
Add('save-status-invalidfilename', 'Invalid file name.');
Add('save-status-alreadyexists', '"%s" in "%s" already exists. Do you want to replace it?');
Add('save-status-alreadyexists2', '"%s" already exists. Do you want to replace it?');
Add('savepreset-title', 'Save preset');
Add('savepreset-name', 'Name');
Add('savepreset-notitle', 'No preset name given.');
Add('script-title', 'Script');
Add('script-rendering', 'Rendering...');
Add('script-break', 'Break');
Add('script-new', 'New');
Add('script-open', 'Open');
Add('script-save', 'Save');
Add('script-run', 'Run');
Add('script-stop', 'Stop');
Add('splash-loadingtext', 'Loading');
Add('template-title', 'Templates');
Add('main-common-title-lite', 'Lite Version');
Add('main-common-title-t500', 'High-Memory Version');
Add('main-common-randombatch', 'Random Batch');
Add('main-menu-file-title', 'File');
Add('main-menu-file-new', 'New');
Add('main-menu-file-open', 'Open...');
Add('main-menu-file-restoreautosave', 'Restore last autosave');
Add('main-menu-file-saveparams', 'Save parameters...');
Add('main-menu-file-saveallparams', 'Save all parameters...');
Add('main-menu-file-smoothpalette', 'Smooth palette...');
Add('main-menu-file-gradientbrowser', 'Gradient browser...');
Add('main-menu-file-exportupr', 'Export UPR...');
Add('main-menu-file-exportflame', 'Export to flam3...');
Add('main-menu-file-importgimp', 'Import GIMP parameters...');
Add('main-menu-file-submitsheep', 'Submit sheep');
Add('main-menu-file-randombatch', 'Random batch');
Add('main-menu-file-exit', 'Exit');
Add('main-menu-edit-title', 'Edit');
Add('main-menu-edit-saveundo', 'Save undo stack...');
Add('main-menu-edit-copyasupr', 'Copy as UPR');
Add('main-menu-view-title', 'View');
Add('main-menu-view-fullscreen', 'Full screen');
Add('main-menu-view-editor', 'Editor');
Add('main-menu-view-adjustment', 'Adjustment');
Add('main-menu-view-gradient', 'Gradient');
Add('main-menu-view-mutation', 'Mutation');
Add('main-menu-view-imagesize', 'Image size');
Add('main-menu-view-messages', 'Messages');
Add('main-menu-view-curves', 'Curves');
Add('main-menu-flame-title', 'Flame');
Add('main-menu-flame-reset', 'Reset location');
Add('main-menu-flame-randomize', 'Randomize');
Add('main-menu-flame-randomweights', 'Randomize weights');
Add('main-menu-flame-equalweights', 'Equalize weights');
Add('main-menu-flame-computeweights', 'Normalize weights');
Add('main-menu-flame-calculatecolors', 'Calculate colors');
Add('main-menu-flame-randomizecolors', 'Randomize colors');
Add('main-menu-flame-rendertodisk', 'Render flame...');
Add('main-menu-flame-renderallflames', 'Render all flames...');
Add('main-menu-flame-resumeunfinished', 'Resume unfinished render process...');
Add('main-menu-flame-generatereport', 'Summarize flame...');
Add('main-menu-variation-title', 'Variation');
Add('main-menu-variation-random', 'Random');
Add('main-menu-variation-builtin', 'Built-in');
Add('main-menu-variation-plugins', 'Plugins');
Add('main-menu-script-title', 'Script');
Add('main-menu-script-run', 'Run script');
Add('main-menu-script-run2', 'Run "%s"');
Add('main-menu-script-directory', 'Directory');
Add('main-menu-script-more', 'More');
Add('main-menu-script-stop', 'Stop script');
Add('main-menu-script-open', 'Open...');
Add('main-menu-script-edit', 'Edit script');
Add('main-menu-script-managefaves', 'Manage favorites...');
Add('main-menu-script-flametoscript', 'Generate script from flame');
Add('main-menu-options-title', 'Tools');
Add('main-menu-options-togglemaintoolbar', 'Show toolbar');
Add('main-menu-options-togglestatusbar', 'Show status bar');
Add('main-menu-options-togglefilelist', 'Show parameter list');
Add('main-menu-options-resetfilelistwidth', 'Reset layout');
Add('main-menu-options-showoptions', 'Settings...');
Add('main-menu-help-title', '?');
Add('main-menu-help-contents', 'Contents');
Add('main-menu-help-aboutalgorithm', 'About fractal flames...');
Add('main-menu-help-aboutapophysis', 'About Apophysis 7x...');
Add('main-toolbar-listviewmode-classic', 'Classic view');
Add('main-toolbar-listviewmode-icons', 'Thumbnail view');
Add('main-toolbar-togglealpha', 'Show transparency');
Add('main-toolbar-toggleguides', 'Show guidelines');
Add('main-toolbar-modemove', 'Pan camera');
Add('main-toolbar-moderotate', 'Rotate camera');
Add('main-toolbar-modezoomin', 'Zoom in');
Add('main-toolbar-modezoomout', 'Zoom out');
Add('main-status-batchgenerate', 'Generating %d of %s...');
Add('main-status-batcherror', 'Error creating batch.');
Add('main-status-calculatingpalette', 'Calculating palette (%d%)...');
Add('main-status-noflam3', 'Unable to find flam3 executable. Please verify your settings.');
Add('main-status-nohelpfile', 'Please specify a help file path in the options dialog first.');
Add('main-status-variationsorvariables', 'variations or variables');
Add('main-status-plugins', 'plugins');
Add('main-status-pluginpath-ioerror', 'Failed to write the setting for the plugin directory. Apophysis will use the default setting.');
Add('main-status-noloadingerrors', 'Flame loaded without errors');
Add('main-status-loadingerrorcount', '%d errors in flame');
Add('main-status-morepluginsneeded', 'The flame "%s" requires the following additional %s:');
Add('main-status-noautosave', 'No autosave present.');
Add('main-report-transformcount', 'Transform count: %d');
Add('main-report-finaltransform', 'Has final transform: %s');
Add('main-report-usedplugins', 'Used plugins:');
Add('main-report-noplugins', '(none)');
end;
procedure Add(key, value: string);
var entry : TKeyValuePair;
begin
Inc(tokenCount);
SetLength(language, tokenCount);
SetLength(defaultlanguage, tokenCount);
entry := TKeyValuePair.Create;
entry.key := key;
entry.value := value;
language[tokenCount - 1] := entry;
defaultlanguage[tokenCount - 1] := entry;
end;
procedure AddNoDefault(key, value: string);
var entry : TKeyValuePair;
begin
Inc(tokenCount);
SetLength(language, tokenCount);
entry := TKeyValuePair.Create;
entry.key := key;
entry.value := value;
language[tokenCount - 1] := entry;
end;
procedure LoadLanguage(path:string);
begin
if (path = '') or (not FileExists(path)) then LoadEnglish()
else begin
tokenCount := 0;
if true then begin
parser := TParser.Create;
ListXmlScanner := TEasyXmlScanner.Create(nil);
ListXmlScanner.OnStartTag := parser.ListXmlScannerStartTag;
ListXmlScanner.OnEndTag := parser.ListXmlScannerEndTag;
ListXmlScanner.OnEmptyTag := parser.ListXmlScannerEmptyTag;
ListXmlScanner.OnContent := parser.ListXmlScannerContent;
ListXmlScanner.Filename := path;
ListXmlScanner.Execute;
ListXmlScanner.Destroy;
parser.Destroy;
end;
end;
end;
function TextByKey(key:string):string;
var i: integer;
begin
Result := '#ERR_NO_TEXT#';
for i:=0 to tokenCount - 1 do begin
if LowerCase(language[i].key) = LowerCase(key) then begin
Result := language[i].value;
exit;
end;
end;
// maybe try default language?
for i:=0 to tokenCount - 1 do begin
if LowerCase(defaultlanguage[i].key) = LowerCase(key) then begin
Result := defaultlanguage[i].value;
exit;
end;
end;
end;
constructor TParser.Create;
begin
self.parentTagnames := TStringList.Create;
end;
procedure TParser.ListXmlScannerStartTag(Sender: TObject; TagName: string; Attributes: TAttrList);
begin
self.parentTagnames.Add(self.currentTagname);
self.currentTagname := TagName;
end;
procedure TParser.ListXmlScannerEndTag(Sender: TObject; TagName: string);
var lastIndex : integer;
begin
lastIndex := self.parentTagnames.Count - 1;
self.currentTagname := self.parentTagnames.Strings[lastIndex];
self.parentTagnames.Delete(lastIndex);
end;
procedure TParser.ListXmlScannerEmptyTag(Sender: TObject; TagName: string; Attributes: TAttrList);
var lastIndex : integer;
begin
self.parentTagnames.Add(self.currentTagname);
self.currentTagname := TagName;
self.ListXmlScannerContent(Sender, '');
lastIndex := self.parentTagnames.Count - 1;
self.currentTagname := self.parentTagnames.Strings[lastIndex];
self.parentTagnames.Delete(lastIndex);
end;
procedure TParser.ListXmlScannerContent(Sender: TObject; Content: string);
const root: string = 'stringtable';
var key, tn: string; i: integer;
begin
for i:=0 to self.parentTagnames.Count - 1 do begin
tn := self.parentTagnames.Strings[i];
if not (tn = '') and not (tn = root) then key := key + tn + '-';
end;
key := key + self.currentTagname;
Add(key, Content);
end;
end.

340
Core/XFormMan.pas Normal file
View File

@ -0,0 +1,340 @@
{
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 XFormMan;
interface
uses
BaseVariation, SysUtils, Forms, Windows;
const
NRLOCVAR = 29;
var
NumBuiltinVars: integer;
type
TFNToVN = record
FileName: string;
VarName: string;
end;
function NrVar: integer;
function Varnames(const index: integer): String;
procedure RegisterVariation(Variation: TVariationLoader; supports3D, supportsDC : boolean);
function GetNrRegisteredVariations: integer;
function GetRegisteredVariation(const Index: integer): TVariationLoader;
function GetNrVariableNames: integer;
function GetVariableNameAt(const Index: integer): string;
function GetVariationIndex(const str: string): integer;
function GetVariationIndexFromVariableNameIndex(const Index: integer): integer;
procedure VarSupports(index : integer; var supports3D : boolean; var supportsDC : boolean);
procedure InitializeXFormMan;
procedure DestroyXFormMan;
procedure RegisterVariationFile(filename, name: string);
function GetFileNameOfVariation(name: string): string;
implementation
uses
Classes;
var
VariationList: TList;
VariableNames: TStringlist;
loaderNum : integer;
Variable2VariationIndex : array of integer;
FNToVNList : array of TFNToVN;
FNToVNCount: integer;
procedure InitializeXFormMan;
begin
VariationList := TList.Create;
VariableNames := TStringlist.create;
SetLength(Variable2VariationIndex,0);
SetLength(FNToVNList, 0);
FNToVNCount := 0;
end;
procedure VarSupports(index : integer; var supports3D : boolean; var supportsDC : boolean);
const
supports3D_arr: array[0..NRLOCVAR-1] of boolean = (
true, //'linear',
true, //'flatten',
true, //'sinusoidal',
true, //'spherical',
true, //'swirl',
true, //'horseshoe',
true, //'polar',
true, //'disc',
true, //'spiral',
true, //'hyperbolic',
true, //'diamond',
true, //'eyefish',
true, //'bubble',
true, //'cylinder',
true, //'noise',
true, //'blur',
true, //'gaussian_blur',
true, //'zblur',
true, //'blur3D',
true, //'pre_blur',
true, //'pre_zscale',
true, //'pre_ztranslate',
true, //'pre_rotate_x',
true, //'pre_rotate_y',
true, //'zscale',
true, //'ztranslate',
true, //'zcone',
true, //'post_rotate_x',
true //'post_rotate_y',
);
supportsDC_arr: array[0..NRLOCVAR-1] of boolean = (
false, //'linear3D',
false, //'linear',
false, //'sinusoidal',
false, //'spherical',
false, //'swirl',
false, //'horseshoe',
false, //'polar',
// false, // 'handkerchief',
// false, // 'heart',
false, //'disc',
false, //'spiral',
false, //'hyperbolic',
false, //'diamond',
// false, // 'ex',
// false, // 'julia',
// false, // 'bent',
// false, // 'waves',
// false, // 'fisheye',
// false, // 'popcorn',
// false, // 'exponential',
// false, // 'power',
// false, // 'cosine',
// false, // 'rings',
// false, // 'fan',
false, //'eyefish',
false, //'bubble',
false, //'cylinder',
false, //'noise',
false, //'blur',
false, //'gaussian_blur',
false, //'zblur',
false, //'blur3D',
false, //'pre_blur',
false, //'pre_zscale',
false, //'pre_ztranslate',
false, //'pre_rotate_x',
false, //'pre_rotate_y',
false, //'zscale',
false, //'ztranslate',
false, //'zcone',
false, //'post_rotate_x',
false //'post_rotate_y'
);
var
varl : TVariationLoader;
begin
if (index >= NRLOCVAR) then begin
supports3D := TVariationLoader(VariationList.Items[index - NRLOCVAR]).supports3D;
supportsDC := TVariationLoader(VariationList.Items[index - NRLOCVAR]).supportsDC;
end else begin
supports3D := supports3D_arr[index];
supportsDC := supportsDC_arr[index];
end;
end;
procedure DestroyXFormMan;
var i: integer;
begin
VariableNames.Free;
// The registered variation loaders are owned here, so we must free them.
for i := 0 to VariationList.Count-1 do
TVariationLoader(VariationList[i]).Free;
VariationList.Free;
Finalize(Variable2VariationIndex);
Finalize(FNToVNList);
end;
///////////////////////////////////////////////////////////////////////////////
function NrVar: integer;
begin
Result := NRLOCVAR + VariationList.Count;
end;
///////////////////////////////////////////////////////////////////////////////
function GetVariationIndexFromVariableNameIndex(const Index: integer): integer;
begin
if (Index<0) or (Index > High(Variable2VariationIndex)) then
Result := -1
else
Result := Variable2VariationIndex[Index];
end;
function Varnames(const index: integer): String;
const
cvarnames: array[0..NRLOCVAR-1] of string = (
'linear',
'flatten',
'sinusoidal',
'spherical',
'swirl',
'horseshoe',
'polar',
// 'handkerchief',
// 'heart',
'disc',
'spiral',
'hyperbolic',
'diamond',
// 'ex',
// 'julia',
// 'bent',
// 'waves',
// 'fisheye',
// 'popcorn',
// 'exponential',
// 'power',
// 'cosine',
// 'rings',
// 'fan',
'eyefish',
'bubble',
'cylinder',
'noise',
'blur',
'gaussian_blur',
'zblur',
'blur3D',
'pre_blur',
'pre_zscale',
'pre_ztranslate',
'pre_rotate_x',
'pre_rotate_y',
'zscale',
'ztranslate',
'zcone',
'post_rotate_x',
'post_rotate_y'
);
begin
if Index < NRLOCVAR then
Result := cvarnames[Index]
else
Result := TVariationLoader(VariationList[Index - NRLOCVAR]).GetName;
end;
///////////////////////////////////////////////////////////////////////////////
function GetVariationIndex(const str: string): integer;
var
i: integer;
begin
i := NRVAR-1;
while (i >= 0) and (Varnames(i) <> str) do Dec(i);
Result := i;
end;
///////////////////////////////////////////////////////////////////////////////
procedure RegisterVariationFile(filename, name: string);
begin
FNToVNCount := FNToVNCount + 1;
SetLength(FNToVNList, FNToVNCount);
FNToVNList[FNToVNCount - 1].FileName := filename;
FNToVNList[FNToVNCount - 1].VarName := name;
end;
function GetFileNameOfVariation(name: string): string;
var i: integer;
begin
for i := 0 to FNToVNCount - 1 do begin
if FNToVNList[i].VarName = name then begin
Result := FNToVNList[i].FileName;
Exit;
end;
end;
Result := '';
end;
procedure RegisterVariation(Variation: TVariationLoader; supports3D, supportsDC : boolean);
var
i: integer;
prevNumVariables:integer;
begin
OutputDebugString(PChar(Variation.GetName));
VariationList.Add(Variation);
Variation.Supports3D := supports3D;
Variation.SupportsDC := supportsDC;
prevNumVariables := GetNrVariableNames;
setLength(Variable2VariationIndex, prevNumVariables + Variation.GetNrVariables);
for i := 0 to Variation.GetNrVariables - 1 do begin
VariableNames.Add(Variation.GetVariableNameAt(i));
Variable2VariationIndex[prevNumVariables + i] := NrVar-1;
end;
end;
///////////////////////////////////////////////////////////////////////////////
function GetNrRegisteredVariations: integer;
begin
Result := VariationList.count;
end;
///////////////////////////////////////////////////////////////////////////////
function GetRegisteredVariation(const Index: integer): TVariationLoader;
begin
Result := TVariationLoader(VariationList[Index]);
end;
///////////////////////////////////////////////////////////////////////////////
function GetNrVariableNames: integer;
begin
Result := VariableNames.Count;
end;
///////////////////////////////////////////////////////////////////////////////
function GetVariableNameAt(const Index: integer): string;
begin
Result := VariableNames[Index];
end;
///////////////////////////////////////////////////////////////////////////////
initialization
InitializeXFormMan;
finalization
DestroyXFormMan;
end.

2833
Flame/ControlPoint.pas Normal file

File diff suppressed because it is too large Load Diff

589
Flame/RndFlame.pas Normal file
View File

@ -0,0 +1,589 @@
{
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 RndFlame;
interface
uses
ControlPoint, Xform;
function RandomFlame(SourceCP: TControlPoint= nil; algorithm: integer = 0): TControlPoint;
implementation
uses
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);
var
tmpGrad: string;
tmpGrdList: TStringList;
begin
case randGradient of
0:
begin
cmap_index := Random(NRCMAPS);
GetCMap(cmap_index, 1, DestCP.cmap);
// cmap_index := DestCP.cmapindex;
DestCP.cmapIndex := cmap_index;
end;
1:
begin
DestCP.cmap := DefaultPalette;
DestCP.cmapIndex := cmap_index;
end;
2:
if assigned(SourceCP) then begin
DestCP.cmap := SourceCP.cmap;
DestCP.cmapIndex := SourceCP.cmapIndex;
end else begin
cmap_index := Random(NRCMAPS);
GetCMap(cmap_index, 1, DestCP.cmap);
DestCP.cmapIndex := cmap_index;
end;
3:
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;
///////////////////////////////////////////////////////////////////////////////
procedure RandomVariation(cp: TControlPoint);
{ Randomise variation parameters }
var
a, b, i, j: integer;
VarPossible: boolean;
begin
inc(MainSeed);
RandSeed := MainSeed;
VarPossible := false;
for j := 0 to NRVAR - 1 do begin
VarPossible := VarPossible or Variations[j];
end;
for i := 0 to cp.NumXForms - 1 do begin
for j := 0 to NRVAR - 1 do
cp.xform[i].SetVariation(j, 0);
if VarPossible then begin
repeat
a := random(NRVAR);
until Variations[a];
repeat
b := random(NRVAR);
until Variations[b];
end else begin
a := 0;
b := 0;
end;
if (a = b) then begin
cp.xform[i].SetVariation(a, 1);
end else begin
cp.xform[i].SetVariation(a, random);
cp.xform[i].SetVariation(b, 1 - cp.xform[i].GetVariation(a));
end;
end;
end;
///////////////////////////////////////////////////////////////////////////////
procedure SetVariation(cp: TControlPoint);
{ Set the current Variation }
var
i, j: integer;
begin
if Variation = vRandom then begin
RandomVariation(cp);
end else
for i := 0 to cp.NumXForms - 1 do begin
for j := 0 to NRVAR - 1 do
cp.xform[i].SetVariation(j, 0);
cp.xform[i].SetVariation(integer(Variation), 1);
end;
end;
///////////////////////////////////////////////////////////////////////////////
(* --Z-- hmm, exactly the same function exists in module Main
function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer;
{ Sets up the triangles from the IFS code }
var
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] := 0; Triangles[-1].y[0] := 0;
Triangles[-1].x[1] := 1; Triangles[-1].y[1] := 0;
Triangles[-1].x[2] := 1; Triangles[-1].y[2] := 1.5;
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 EqualizeWeights(var cp: TControlPoint);
var
t, i: integer;
begin
t := cp.NumXForms;
for i := 0 to t - 1 do
cp.xform[i].density := 1.0 / t;
end;
///////////////////////////////////////////////////////////////////////////////
procedure NormalizeWeights(var cp: TControlPoint);
var
i: integer;
td: double;
begin
td := 0.0;
for i := 0 to cp.NumXForms - 1 do
td := td + cp.xform[i].Density;
if (td < 0.001) then
EqualizeWeights(cp)
else
for i := 0 to cp.NumXForms - 1 do
cp.xform[i].Density := cp.xform[i].Density / td;
end;
///////////////////////////////////////////////////////////////////////////////
procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer);
{ Caclulates transform weight from triangles }
var
i: integer;
total_area: double;
begin
total_area := 0.0;
for i := 0 to t - 1 do
begin
cp1.xform[i].Density := triangle_area(Triangles[i]);
total_area := total_area + cp1.xform[i].Density;
end;
for i := 0 to t - 1 do
begin
cp1.xform[i].Density := cp1.xform[i].Density / total_area;
end;
NormalizeWeights(cp1);
end;
///////////////////////////////////////////////////////////////////////////////
procedure RandomWeights(var cp1: TControlPoint);
{ Randomizes xform weights }
var
i: integer;
begin
for i := 0 to Transforms - 1 do
cp1.xform[i].Density := random;
NormalizeWeights(cp1);
end;
///////////////////////////////////////////////////////////////////////////////
function RandomFlame(SourceCP: TControlPoint; algorithm: integer): TControlPoint;
var
Min, Max, i, j, rnd: integer;
Triangles: TTriangles;
r, s, theta, phi: double;
skip: boolean;
begin
if Assigned(SourceCP) then
Result := SourceCP.clone
else
Result := TControlPoint.Create;
Min := randMinTransforms;
Max := randMaxTransforms;
inc(MainSeed);
RandSeed := MainSeed;
transforms := random(Max - (Min - 1)) + Min;
repeat
try
inc(MainSeed);
RandSeed := MainSeed;
Result.clear;
Result.RandomCP(transforms, transforms, false);
Result.SetVariation(Variation);
inc(MainSeed);
RandSeed := MainSeed;
case algorithm of
1: rnd := 0;
2: rnd := 7;
3: rnd := 9;
else
if (Variation = vLinear) or (Variation = vRandom) then
rnd := random(10)
else
rnd := 9;
end;
case rnd of
0..6:
begin
for i := 0 to Transforms - 1 do
begin
if Random(10) < 9 then
Result.xform[i].c[0, 0] := 1
else
Result.xform[i].c[0, 0] := -1;
Result.xform[i].c[0, 1] := 0;
Result.xform[i].c[1, 0] := 0;
Result.xform[i].c[1, 1] := 1;
Result.xform[i].c[2, 0] := 0;
Result.xform[i].c[2, 1] := 0;
Result.xform[i].color := 0;
Result.xform[i].symmetry := 0;
Result.xform[i].SetVariation(0, 1);
for j := 1 to NRVAR - 1 do
Result.xform[i].SetVariation(j, 0);
Result.xform[i].Translate(random * 2 - 1, random * 2 - 1);
Result.xform[i].Rotate(random * 360);
if i > 0 then
Result.xform[i].Scale(random * 0.8 + 0.2)
else
Result.xform[i].Scale(random * 0.4 + 0.6);
if Random(2) = 0 then
Result.xform[i].Multiply(1, random - 0.5, random - 0.5, 1);
end;
SetVariation(Result);
end;
7, 8:
begin
{ From the source to Chaos: The Software }
for i := 0 to Transforms - 1 do begin
r := random * 2 - 1;
if ((0 <= r) and (r < 0.2)) then
r := r + 0.2;
if ((r > -0.2) and (r <= 0)) then
r := r - 0.2;
s := random * 2 - 1;
if ((0 <= s) and (s < 0.2)) then
s := s + 0.2;
if ((s > -0.2) and (s <= 0)) then
s := s - -0.2;
theta := PI * random;
phi := (2 + random) * PI / 4;
Result.xform[i].c[0][0] := r * cos(theta);
Result.xform[i].c[1][0] := s * (cos(theta) * cos(phi) - sin(theta));
Result.xform[i].c[0][1] := r * sin(theta);
Result.xform[i].c[1][1] := s * (sin(theta) * cos(phi) + cos(theta));
{ the next bit didn't translate so well, so I fudge it}
Result.xform[i].c[2][0] := random * 2 - 1;
Result.xform[i].c[2][1] := random * 2 - 1;
end;
for i := 0 to NXFORMS-1 do //NXFORMS - 1 do
Result.xform[i].density := 0;
for i := 0 to Transforms - 1 do
Result.xform[i].density := 1 / Transforms;
SetVariation(Result);
end;
9: begin
for i := 0 to NXFORMS-1 do //NXFORMS - 1 do
Result.xform[i].density := 0;
for i := 0 to Transforms - 1 do
Result.xform[i].density := 1 / Transforms;
end;
end; // case
Result.TrianglesFromCp(Triangles);
if Random(2) > 0 then
ComputeWeights(Result, Triangles, transforms)
else
EqualizeWeights(Result);
except on E: EmathError do
begin
Continue;
end;
end;
for i := 0 to Transforms - 1 do
Result.xform[i].color := i / (transforms - 1);
if Result.xform[0].density = 1 then
Continue;
case SymmetryType of
{ Bilateral }
1: add_symmetry_to_control_point(Result, -1);
{ Rotational }
2: add_symmetry_to_control_point(Result, SymmetryOrder);
{ Rotational and Reflective }
3: add_symmetry_to_control_point(Result, -SymmetryOrder);
end;
{ elimate flames with transforms that aren't affine }
skip := false;
for i := 0 to Transforms - 1 do begin
if not transform_affine(Triangles[i], Triangles) then
skip := True;
end;
if skip then
continue;
until not Result.BlowsUP(5000) and (Result.xform[0].density <> 0);
RandomGradient(SourceCP, Result);
Result.brightness := defBrightness;
Result.gamma := defGamma;
Result.gamma_threshold := defGammaThreshold;
Result.vibrancy := defVibrancy;
Result.sample_density := defSampleDensity;
Result.spatial_oversample := defOversample;
Result.spatial_filter_radius := defFilterRadius;
if KeepBackground and assigned(SourceCP) then begin
Result.background[0] := SourceCP.background[0];
Result.background[1] := SourceCP.background[1];
Result.background[2] := SourceCP.background[2];
end else begin
Result.background[0] := 0;
Result.background[1] := 0;
Result.background[2] := 0;
end;
Result.zoom := 0;
Result.Nick := SheepNick;
Result.URl := SheepURL;
Result.xform[Result.NumXForms].Clear;
Result.xform[Result.NumXForms].symmetry := 1;
end;
end.

1525
Flame/XForm.pas Normal file

File diff suppressed because it is too large Load Diff

1756
Forms/About.dfm Normal file

File diff suppressed because it is too large Load Diff

113
Forms/About.pas Normal file
View File

@ -0,0 +1,113 @@
{
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 About;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Global, Translation;
type
TAboutForm = class(TForm)
btnOK: TButton;
Label3: TLabel;
Label4: TLabel;
Label10: TLabel;
Label11: TLabel;
lblFlamecom: TLabel;
Bevel1: TBevel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Bevel3: TBevel;
Label17: TLabel;
Label16: TLabel;
Label2: TLabel;
Bevel2: TBevel;
Label19: TLabel;
Label5: TLabel;
Image1: TImage;
procedure btnOKClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure lblCreditClick(Sender: TObject);
procedure DevelopersClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
URL :String;
public
{ Public declarations }
end;
var
AboutForm: TAboutForm;
implementation
uses Main, ShellAPI;
{$R *.DFM}
procedure TAboutForm.btnOKClick(Sender: TObject);
begin
ModalResult := mrOK;
end;
procedure TAboutForm.FormShow(Sender: TObject);
begin
//lblCredit.Caption := MainCp.Nick;
//URL := MainCp.URL;
//if URL <> '' then lblCredit.Font.color := clBlue else lblCredit.Font.color := clBlack;
end;
procedure TAboutForm.lblCreditClick(Sender: TObject);
begin
if URL <> '' then
ShellExecute(ValidParentForm(Self).Handle, 'open', PChar(URL),
nil, nil, SW_SHOWNORMAL);
end;
procedure TAboutForm.DevelopersClick(Sender: TObject);
begin
ShellExecute(ValidParentForm(Self).Handle, 'open', PChar(TLabel(Sender).Hint),
nil, nil, SW_SHOWNORMAL);
end;
procedure TAboutForm.FormCreate(Sender: TObject);
var s1, s2, s3:string;
begin
btnOK.Caption := TextByKey('common-close');
if (LanguageFile <> AvailableLanguages.Strings[0]) and (LanguageFile <> '') then
begin
LanguageInfo(LanguageFile, s1, s2);
s3 := LanguageAuthor(LanguageFile);
Label5.Visible := (s1 <> '') and (s3 <> '');
Label5.Caption := s1 + ' translation contributed by: ' + s3;
end;
end;
end.

1765
Forms/Adjust.dfm Normal file

File diff suppressed because it is too large Load Diff

2733
Forms/Adjust.pas Normal file

File diff suppressed because it is too large Load Diff

872
Forms/Browser.dfm Normal file
View File

@ -0,0 +1,872 @@
object GradientBrowser: TGradientBrowser
Left = 494
Top = 299
Width = 544
Height = 335
BorderIcons = [biSystemMenu, biMinimize]
Caption = 'Gradient Browser'
Color = clBtnFace
Constraints.MinHeight = 120
Constraints.MinWidth = 380
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Icon.Data = {
0000010001001010000001002000680400001600000028000000100000002000
0000010020000000000040040000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000045C6F00100000000000000002DA5D654247EACE51F89B8FD1F7D
A8FC2385AFFA209DD2A01DA9DF53000000000000000000000000000000000000
00000000000000000000000000003AB6E247228CC1F143C2EAFF48C3E7FF4EC9
ECFF44C1E2F538A3C7FB1A7CABF9199BD1830000000000000000000000000000
000063D2F201000000000000000020B5E9FF34B0DBCE59D2F0FF5CD4F0FF5CD7
F2FF5AD6F2FD51CFECFB37AED7F4187BA9FD1A94C98F00000000000000000000
000070D8F302000000000000000022B3E7FE1C97C9E751CAE9FF5FD7F2FF0AB3
67FF006F00FF008825FF53D1EEFA2E9FCCEE187DACFE0B87BD020000000082DF
F4027CDCF40700000000000000006AD4F36C1181B2FD52CAE8FE62DAF3FF23D9
71FF00912BFF006000FF62D9F3FF49C3E5EF1280B0FE1B9BCE73000000000000
000089E2F42084DFF4421D99C2FD37A4C9FF46C2EBFF65D4F0FB66DAF3FE3EDB
8CFF00BA50FF00AB67FF63D9F3FF51CBEBF41E8BB9F81D95C8A7000000000000
000076DCF4693BB4DCF78BE2F4B59AE7F7E895E6F6FE95E8F6FE8CE3F5FF85E3
F4FF70DEF4FF68DCF4FF6ADBF4FF5CD4EFF4208BB9F72297C9AB000000000000
000054CBF3F98EE3F5CFB6F1F8FFB6F1F8FF9EEAF6FE93E9F6FF94E8F6FFB359
23FFB30F00FFAB2B00FF73DEF4FB63D7EFEE1D84B4F8279DCE94000000000000
000070D4F5FFA4EDF6E6B6F1F8FF2959F3FF00007AFF001FDBFF93E9F6FFB08C
64FFB03A00FF610000FF73DEF4F45CC3E3DE2781AEEF64D3F23E000000000000
000070D4F5FFACF0F7EBB6F1F8FF5490FFFF0022D9FF000058FFB2F0F8FFB4B6
97FFB38D64FFB6AB8CFF78D3ECE8359AC9EC51B6DB8F00000000000000000000
00007AD8F5F89EEAF6E6B6F1F8FF6DAFFFFF5590FFFF6DB0FFFFB6F1F8FFA5EC
F7FEA7ECF7FE98E7F5F14DB0D9F55DBBDDAB84DFF44000000000000000000000
0000A9EFF7786BD4F4FB9DEAF6EEAFF1F7F4B6F1F8FFB6F1F8FFB6F1F8FFA6EE
F6F9A0EAF6EF70D2EDE354C6EDF895E7F5580000000000000000000000000000
000000000000AAEFF78F5ACFF3F998E8F6E0B6F1F8FFB6F1F8FFB6F1F8FF92E7
F6E46CD4F4FA65D2F4E984D4E874000000000000000000000000000000000000
00000000000000000000A9EFF7737CD9F6F476D6F5FA72D4F5FD75D6F5FB5ECF
F4F190E6F5930000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000FFFF
0000D80F0000F0070000B0030000B00100003001000080010000800100008001
000080010000800300008003000080070000C00F0000E03F0000FFFF0000}
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnResize = FormResize
OnShow = FormShow
DesignSize = (
536
306)
PixelsPerInch = 96
TextHeight = 13
object btnDefGradient: TSpeedButton
Left = 411
Top = 7
Width = 23
Height = 21
Hint = 'Open...'
Anchors = [akTop, akRight]
Flat = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Arial'
Font.Style = [fsBold]
Glyph.Data = {
36030000424D3603000000000000360000002800000010000000100000000100
18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F
607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13
18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708
88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3
8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367
805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51
C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF
7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC
EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67
D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2
98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8
FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788
A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6
A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788
93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89
9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA
ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
ParentFont = False
ParentShowHint = False
ShowHint = True
OnClick = btnDefGradientClick
end
object ListView: TListView
Left = 7
Top = 7
Width = 398
Height = 234
Anchors = [akLeft, akTop, akRight, akBottom]
Columns = <
item
Caption = 'Title'
Width = 150
end>
HideSelection = False
LargeImages = LargeImages
ReadOnly = True
RowSelect = True
ParentShowHint = False
PopupMenu = PopupMenu
ShowHint = True
SmallImages = SmallImages
SortType = stText
TabOrder = 1
ViewStyle = vsList
OnChange = ListViewChange
OnDblClick = SpeedButton1Click
OnEdited = ListViewEdited
OnInfoTip = ListViewInfoTip
OnKeyPress = ListViewKeyPress
end
object pnlMain: TPanel
Left = 0
Top = 0
Width = 536
Height = 4
Align = alTop
BevelOuter = bvNone
TabOrder = 0
end
object pnlPreview: TPanel
Left = 0
Top = 268
Width = 487
Height = 25
Anchors = [akLeft, akRight, akBottom]
BevelOuter = bvLowered
TabOrder = 2
object Image: TImage
Left = 1
Top = 1
Width = 485
Height = 23
Align = alClient
Stretch = True
end
end
object SmallImages: TImageList
Left = 8
Top = 16
Bitmap = {
494C010101000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000001000000001002000000000000010
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00808080008080
8000808080008080800080808000FFFFFF000000000000808000008080000080
8000000000007F7F7F0000000000000000007F7F7F0000000000000000007F7F
7F000000000000000000BBCCD500BBCCD5000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000007F7F
7F0000000000000000007F7F7F00000000000080800000808000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFF5F000FFF1
E900FFEFE600FFEFE600FFF0E700FFF1E800FFF1E900FFF3EB00FFF3EC00FFF4
ED00FFF6F0000000000000000000000000000000000000808000008080000080
8000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFF4ED00FFEE
E400FFEBDF00FFEBDF00FFEBE000FFECE200FFEDE200FFEEE400FFEFE500FFEF
E600FFF1EA00000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFF1E900CD52
0800CD520800CD520800CD520800CD520800CD520800CD520800CD520800CD52
0800FFEDE300000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00000000007F7F
7F000000000000000000BBCCD500BBCCD5000000000000000000FFEFE600CD52
0800E2651800EB7A3700FFA77200FFD1B200FFF7ED00C2E9FF0042ADF700CD52
0800FFE9DC00000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFEDE200CD52
0800E1651900E9783500FFA77000FFD1B200FFF7EC00C2E9FF0040ADF700CD52
0800FFE5D6000000000000000000000000000000000000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF000000000000000000688DA200688D
A200688DA200688DA200688DA200688DA200FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFEBDF00CD52
0800E1651800EB783600FFA77000FFD1B200FFF7EC00C2E9FF0042ADF700CD52
0800FFE1D000000000000000000000000000FFF1EA0000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF000000000000000000000000000000
000000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF0000000000FFF5F000FFF1E900FFEFE600FFEFE600FFF0E700FFF1
E800FFF1E900FFF3EB00FFF3EC00FFF4ED00FFF6F00000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF000000000000000000000000000000
0000000000000000000000000000000000000000000000000000FFE9DB00CD52
0800E1651900EC793500FFA77000FFD0B200FFF7EC00C2E9FF0040AEF700CD52
0800FFDFCD00000000000000000000000000FFE9DC0000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF0000000000FFF1E900CD520800CD520800CD520800CD520800CD52
0800CD520800CD520800CD520800CD520800FFEDE30000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00688DA200688DA200688D
A200688DA200688DA200688DA200688DA2000000000000000000FFE7D800CD52
0800E1651900EB793500FFA57000FFD1B200FFF7EC00C2E9FF0040ADF700CD52
0800FFE1D000000000000000000000000000FFE1D00000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00688D
A200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF0000000000FFEDE200CD520800E1651900E9783500FFA77000FFD1
B200FFF7EC00C2E9FF0040ADF700CD520800FFE5D60000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00BBCCD500000000000000
0000000000000000000000000000000000000000000000000000FFE4D500CD52
0800E3651A00EB7A3900FFA87400FFD1B300FFF7EC00C4E9FF0044AEF700CD52
0800FFE9DC00000000000000000000000000FFE1D00000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF0000000000FFE9DB00CD520800E1651900EC793500FFA77000FFD0
B200FFF7EC00C2E9FF0040AEF700CD520800FFDFCD0000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD5000000000000000000FFE3D100CD52
0800ED793500F9945700FFBC8D00FFE1C500FFFFF90000000000000000000000
0000000000000000000000000000000000000000000000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00688D
A200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF0000000000FFE4D500CD520800E3651A00EB7A3900FFA87400FFD1
B300FFF7EC00C4E9FF0044AEF700CD520800FFE9DC0000000000FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD5000000000000000000FFE1CF00CD52
0800CD520800CD520800CD520800CD520800CD52080000000000E17D4100EB92
5E0000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF0000000000FFE1CF00CD520800CD520800CD520800CD520800CD52
0800CD52080000000000E17D4100EB925E0000000000FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00BBCCD500BBCCD5000000000000000000FFE2D100FFD7
BF00FFD0B400FFCEB100FFCFB300FFD0B400FFD3B80000000000F5A779000000
000000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF0000000000FFE7DA00FFE2D000FFDECB00FFDECA00FFDDC900FFDE
CA00FFDFCD000000000000000000FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFE7DA00FFE2
D000FFDECB00FFDECA00FFDDC900FFDECA00FFDFCD0000000000000000000000
000000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
FF00FF00FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00BBCCD500BBCCD500424D3E000000000000003E000000
2800000040000000100000000100010000000000800000000000000000000000
000000000000000000000000FFFFFF00FFFFCD00000000008003C900FFDECA00
8003CB00FFDECA008003DA00FFE2D0008003EA00000000008003EA00DDE6EA00
8003EA00DDE6EA008003EA00DDE6EA0080030000000000008003000000000000
800300000000000080030000000000008007EA0000000000800F000000000000
801F000020000000803F8F1F0000000000000000000000000000000000000000
000000000000}
end
object PopupMenu: TPopupMenu
Left = 40
Top = 16
object DeleteItem: TMenuItem
Caption = 'Delete'
ShortCut = 16430
OnClick = DeleteItemClick
end
object RenameItem: TMenuItem
Caption = 'Rename'
ShortCut = 113
OnClick = RenameItemClick
end
end
object OpenDialog: TOpenDialog
DefaultExt = 'ugr'
Filter = 'Gradient files (*.ugr)|*.ugr|Fractint map files (*.map)|*.map'
Left = 72
Top = 16
end
object LargeImages: TImageList
Height = 32
Width = 32
Left = 104
Top = 16
Bitmap = {
494C010101000400040020002000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000800000002000000001002000000000000040
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000DDE6EA00DDE6EA0000000000FDEB
E000FDE2D300FCCFB300B3644B00C06D5300BB695000BC6A4F00BC6A5100BC6A
5100A35B4500B9886F00FCC8A800FCC9AA00FCCAAC00FCD0B600FDD6BC00FDD9
C100FEDFCC0000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FDEB
E000FDE2D300FCCFB300FBC8AA00FAC6A500FAC5A400FBC5A400FBC5A400FBC6
A500FBC7A600FBC7A600FCC8A800FCC9AA00FCCAAC00FCD0B600FDD6BC00FDD9
C100FEDFCC0000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000F4DA
CA00F2D2BD00ECBC9F00EAB59400E9B29000E8AF8D00E9AF8D00E9B08C00E9AF
8D00E8AF8D00E9B08D00E8B08D00E8B18E00EAB28F00EAB79900EDBDA000EDC1
A600F0C8B00000000000DDE6EA00DDE6EA0023232300BAEBFF00B3EAFF00B0E8
FF00ACE7FF00A8E6FF00A5E6FF00A4E4FF009FE1FF009DE1FF009BE2FF0097E0
FF0095DFFF0092DDFF008FDDFF008DDDFF008BDBFF0087D9FF0084D8FF0083D8
FF007ED6FF007ED3FF0078D1FF00262626000000000000000000000000000000
0000FFFEFB00FFFEFA00FFFEF800FFFEF700FFFDF700FFFDF600FFFEF600FFFE
F700FFFFF700FFFFF800FFFFF900FFFFF900FFFFFA00FFFFFA00FFFFFB00FFFF
FC00FFFFFC00FFFFFC00FFFFFD00FFFFFE000000000000000000000000000000
000000000000000000000000000000000000E7A88300EBB69600EDC1A700F0C9
B300F3D4C10000000000DDE6EA00DDE6EA002323230023232300232323002323
2300232323002323230023232300232323002323230023232300232323002323
2300232323002323230023232300232323002323230023232300232323002323
2300232323002323230023232300DDE6EA00DDE6EA00DDE6EA0000000000FDEA
DF00FCE1D000FBCCB000ED886800F38C6B00E8856500E9856600E9856600EB86
6600D97C5F00DCA18300FBC5A400FBC7A700FBC9AA00FCD3B800FDDAC400FDDF
CD00FEE7D80000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FDEA
DF00FCE1D000FBCCB000FAC6A700F9C3A200FAC19F00FAC2A000FBC3A100FBC3
A300FAC4A300FBC4A300FBC5A400FBC7A700FBC9AA00FCD3B800FDDAC400FDDF
CD00FEE7D80000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000F4D7
C600F1CDB800EBB69600E8AE8C00E7AB8600E7A98200E6A88300E7A98300E7A8
8300E6A98200E7A88300E7A98300E7AA86000000000000000000000000000000
0000FFFDFA00FFFCF800FFFBF500FFFBF400FFFBF300FFFAF200FFFBF300FFFB
F300FFFCF400FFFCF400FFFDF500FFFEF500FFFDF500FFFEF600FFFEF600FFFF
F700FFFFF800FFFFF800FFFFF900FFFFF900FFFFFA00FFFFFB00FFFFFC00FFFF
FC0000000000000000000000000000000000F9BE9D00F8BF9E00F9C09E00F9C0
9F00F9C19F00F9C1A000F9C2A200F9C5A500F9C8AB00F9833C00FF985A00FFAC
770000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000F1CF
BB00EEC5AB00E8AA8500E6A37B00E49F7400E39B7000E39C7100E49B7000E39C
7100E39C7100E39B7000E39C7200E49F7500E5A37A00F9833C00FF985A00FFAC
770000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00BAEEFC00B7ED
FD00B6ECFC00B2E9FB00B0E8FC00ADE8FB00AAE7FC00A7E6FC00A6E5FC003740
4500DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FDE9
DE00FCE0CF00FACAAD00FAC3A400F9C09E00F9BF9C00F9C09D00F9C09D00FAC1
A000FAC1A000F9C1A100FAC3A200FAC5A500FBC7A900FCD4BC00FDDDCA00FDE4
D500FEECE20000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FDE9
DE00FCE0CF00FACAAD00FAC3A400F9C09E000000000000000000000000000000
0000FFFCF800FFFBF600FFFAF200FFF9F000FFF8EF00FFF7EE00FFF9EE00FFF9
EF00FFF9EF00FFF9F000FFFAF000FFFAF200FFFBF200FFFCF300FFFCF300FFFC
F400FFFCF400FFFDF500FFFEF500FFFFF600FFFFF700FFFFF700FFFFF700FFFF
FA0000000000000000000000000000000000DDE6EA00DDE6EA0000000000FCEA
DF00FBE2D200F9CEB400F8C8AB00F9C6A700F9C5A500F9C5A500F9C6A500F8C6
A700F9C6A800F9C6A700F9C8A900FAC9AC00FACDB100FF9F6400FFB38100FFC8
9F00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FCEA
DF00FBE2D200F9CEB400F8C8AB00F9C6A700F9C5A500F9C5A500F9C6A500F8C6
A700F9C6A800F9C6A700F9C8A900FAC9AC00FACDB100FF9F6400FFB38100FFC8
9F00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000F1CE
B900EEC4AB00E7AC8800E5A57F00E4A17900E49F7600E49F7600E49F7500E59F
7600E49F7700E49F7600E49F7700E5A17900E5A57E00FF9F6400FFB38100FFC8
9F00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0023232300C1F1
FD00BFEFFD00BAEEFC00B9EDFC00B6ECFC00B2EAFB00AFE9FB00ADE8FB00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000000000000000000000000000
0000FFFBF700FFFAF300FFF8EF00FFF6EC00FFF6EB00FFF5EB00FFF5EA00FFF6
EB00FFF6EB00FFF7EB00FFF7ED00FFF8ED00FFF8EE00FFF9EE00FFF9F000FFFA
F000FFFAF000FFFAF200FFFBF200FFFBF200FFFCF300FFFCF300FFFDF400FFFD
F60000000000000000000000000000000000EEC3A90000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FDEB
E200FCE5D700FAD5BF00F9D1B800F9CEB400F9CDB300F9CDB300F9CEB300F9CF
B500F9CFB500FACFB500F9D0B600FAD1B800FAD4BC00FFBA8B00FFCFA9000000
0000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FDEB
E200FCE5D700FAD5BF00F9D1B800F9CEB400F9CDB300F9CDB300F9CEB300F9CF
B500F9CFB500FACFB500F9D0B600FAD1B800FAD4BC00FFBA8B00FFCFA9000000
0000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000F1CE
B900EEC6AE00E9B29200E7AD8800E6A98400E6A78100E7A88100E6A78100E7A7
8200E7A78200E6A78200E6A78200E6A984000000000000000000000000000000
0000FFFAF600FFF8F200FFF6ED00FFF4E900FFF4E600FFF3E600FFF3E600FFF4
E700FFF4E700FFF5E800FFF5E800FFF5E900FFF5E900FFF5EB00FFF6EB00FFF7
EB00FFF7EC00FFF8ED00FFF8EE00FFF8EE00FFF9EF00FFF9F000FFFAF000FFFA
F200000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FDF1
E900FDEEE500FCE8DC00FCE6D900FCE5D800FCE5D700FCE5D700FCE5D700FCE6
D800FCE6D800FCE6D900FCE6D900FCE7DA00FCE8DC0000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FDF1
E900FDEEE500FCE8DC00FCE6D900FCE5D8000000000000000000000000000000
0000FFFAF400FFF7F000FFF4EA00FFF2E600FFF1E300FFF0E200FFF0E200FFF1
E200FFF2E300FFF2E400FFF2E500FFF3E500FFF3E500FFF4E600FFF5E700FFF4
E700FFF5E800FFF5E900FFF5E900FFF5EA00FFF5EA00FFF6EB00FFF7ED00FFF8
EF0000000000000000000000000000000000DDE6EA00DDE6EA00000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000DDE6EA00DDE6EA00000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000DDE6EA00DDE6EA000000000000000000000000000000
0000FFF9F300FFF6EE00FFF2E800FFF0E300FFEEE000FFEEDF00FFEEDE00FFEE
DF00FFEEE000FFEFE000FFEFE000FFEFE100FFF0E100FFF1E200FFF1E200FFF2
E400FFF2E400FFF2E400FFF3E600FFF3E600FFF4E600FFF5E700FFF5E900FFF6
EB0000000000000000000000000000000000FFFFF000FFFFF200FFFFF200FFFF
F400FFFFF500FFFFF500FFFFF60000000000DDE6EA00DDE6EA0000000000FFFC
F800FFFBF600FFF9F000FFF8EF00FFF7EE00FFF9EF00FFF9EF00FFF9F000FFFA
F200FFFBF200FFFCF300FFFCF400FFFCF400FFFDF500FFFFF600FFFFF700FFFF
F700FFFFFA0000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FFFD
FA00FFFCF800FFFBF400FFFBF300FFFAF200FFFBF300FFFCF400FFFCF400FFFE
F500FFFDF500FFFEF600FFFFF700FFFFF800FFFFF800FFFFF900FFFFFA00FFFF
FB00FFFFFC0000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA0000000000FFFD
FA00FFFCF800FFFBF400FFFBF300FFFAF200FFFBF300FFFCF400FFFCF400FFFE
F500FFFDF500FFFEF600FFFFF700FFFFF800FFFFF800FFFFF900FFFFFA00FFFF
FB00FFFFFC0000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFF800FFFEF600FFFFF400FFFF
F200FFFFF300FFFFF300FFFFF400FFFFF4000000000000000000000000000000
0000FFF8F200FFF5EC00FFF0E500FFEDDF00CD520800CD520800CD520800CD52
0800CD520800CD520800CD520800CD520800CD520800CD520800CD520800CD52
0800CD520800CD520800CD520800CD520800FFF1E300FFF2E300FFF2E400FFF3
E60000000000000000000000000000000000DDE6EA00DDE6EA00DDE6EA000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000000000000000000000000000
0000FFF7F100FFF3EA00FFEEE300FFECDD00CD520800DA804A00DC7E4400E285
4C00EB956200F5AA7D00FEBE9700FFCCB000FFDCC800FFEFE300F7F8F800CEEA
FD0092CEF70060B8F3003CA3F000CD520800FFEEDF00FFEEDF00FFF0E100FFF0
E30000000000000000000000000000000000DDE6EA00DDE6EA00DDE6EA000000
0000FFFEFB00FFFEFA00FFFEF800FFFEF700FFFDF700FFFDF600FFFEF600FFFE
F700FFFFF700FFFFF800FFFFF900FFFFF900FFFFFA00FFFFFA00FFFFFB00FFFF
FC00FFFFFC00FFFFFC00FFFFFD00FFFFFE00DDE6EA00DDE6EA00DDE6EA00DDE6
EA0000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000
0000BADDF900ABD5F80097CBF60089C4F5007EBFF40077BCF30076BBF30075BA
F30074BAF30075BAF20075BAF30075BAF30074BAF40075BBF40075BAF40074BB
F40074BAF40075BBF40075BAF40074BBF40074BBF40076BBF40078BCF4007EBF
F50000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000000000000000000000000000
0000FFF6EF00FFF1E900FFECDF00FFE9D900CD520800DD855200DB7C4000E282
4800EA925E00F4A77900FDBC9400FFCCAE00FFDCC700FFEFE400F7F8F900CDEA
FD008FCDF7005CB5F30038A1F000CD520800FFEBDB00FFECDC00FFEDDD00FFEF
E00000000000000000000000000000000000BBCCD500BBCCD500DDE6EA000000
0000FFFDFA00FFFCF800FFFBF500FFFBF400FFFBF300FFFAF200FFFBF300FFFB
F300FFFCF400FFFCF400FFFDF500FFFEF500FFFDF500FFFEF600FFFEF600FFFF
F700FFFFF800FFFFF800FFFFF900FFFFF900FFFFFA00FFFFFB00FFFFFC00FFFF
FC0000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000
0000C1DFF900B2D8F9009FCFF70091C8F60087C3F40080C0F4007FBFF4007EBF
F3007DBFF4007DBFF3007EBFF3007DBFF3007EBFF3007EBFF3007DBFF4007EBF
F4007EBFF4007DBFF4007DBEF3007EBFF4007DBEF3007EBFF40080C0F50086C2
F60000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00214F4A00214F4A00214F
4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F
4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F
4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F4A00214F
4A00214F4A00214F4A00214F4A00DDE6EA000000000000000000000000000000
0000FFF5EE00FFF1E700FFEADD00FFE7D600CD520800DC855000DB7B4100E180
4700EA905C00F4A67800FDBC9400FFCBAE00FFDBC700FFEFE300F7F8F800CDEA
FD008FCDF7005BB5F40037A1EF00CD520800FFE9D700FFE9D700FFEAD900FFEC
DC0000000000000000000000000000000000DDE6EA00DDE6EA00DDE6EA000000
0000FFFCF800FFFBF60000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF7F100FFF3EA00FFF3EA00FFEEE300FFEEE300FFECDD00FFECDD00CD52
0800CD520800FBE6DA00FBE6DA00FBDED100FBDED100FBD0B900FBD0B900FBD3
C000FBC4A300FBC4A300FBB99100FBB99100FBFAFB00FBFAFB00FBF6F600FBF6
F600FBE6DA00FBE6DA00FB996400FB996400FBA87B00FBA87B00FB823F00FBDC
CB00FBDCCB00F7C2A500F7C2A500CD520800CD520800FFEEDF00FFEEDF00FFEE
DF00FFEEDF00FFF0E100FFF0E100FFF0E300FFF0E30000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500DDE6
EA00BBCCD500BBCCD500BBCCD500BBCCD5000000000000000000000000000000
0000FFF4ED00FFEFE500FFE9DB00FFE5D300CD520800DC855000DB7C4100E181
4800EA905C00F4A67800FDBC9400FFCCAE00FFDCC700FFEFE300F7F8F800CDEA
FD008FCDF7005BB5F30037A1EF00CD520800FFE5D300FFE6D400FFE7D500FFE9
D80000000000000000000000000000000000DDE6EA00DDE6EA00000000000000
0000FFF6EF00FFF1E900FFF1E900FFECDF00FFECDF00FFE9D900FFE9D900CD52
0800CD520800FEE6DB00FEE6DB00FEDBC800FEDBC800FED9C200FED9C200FED1
B700FEAF8100FEAF8100FEF9F800FEF9F800FEF3EE00FEF3EE00FEFEFE00FEFE
FE00FEAB7B00FEAB7B00FEAB7A00FEAB7A00FE975F00FE975F00FE9C6200FEF3
F100FEF3F100FBB08600FBB08600CD520800CD520800FFEBDB00FFEBDB00FFEC
DC00FFECDC00FFEDDD00FFEDDD00FFEFE000FFEFE00000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6
EA00BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6EA00688DA200DDE6
EA00688DA200DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500688DA200688D
A200688DA200688DA200BBCCD500DDE6EA000000000000000000000000000000
0000FFF3EC00FFEEE300FFE7D800FFE3D000CD520800DC855000DB7C4000E281
4800EA905C00F4A67800FEBC9400FFCCAE00FFDCC700FFEFE300F7F8F800CDEA
FD008FCDF7005CB5F30037A1EF00CD520800FFE3CF00FFE3CF00FFE5D100FFE6
D50000000000000000000000000000000000FEDBC800FED9C200FED9C200FED1
B700FEAF8100FEAF8100FEF9F800FEF9F800FEF3EE00FEF3EE00FEFEFE00FEFE
FE00FEAB7B00FEAB7B00FEAB7A00FEAB7A00FE975F00FE975F00FE9C6200FEF3
F100FEF3F100FBB08600FBB08600CD520800CD520800FFEBDB00FFEBDB00FFEC
DC00FFECDC00FFEDDD00FFEDDD00FFEFE000FFEFE00000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6
EA00BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6EA00688DA200DDE6
EA00688DA200DDE6EA00BBCCD500BBCCD500BBCCD500688DA200DDE6EA00BBCC
D500BBCCD500BBCCD500688DA200BBCCD500688DA200DDE6EA00BBCCD500BBCC
D500688DA200DDE6EA00688DA200DDE6EA00688DA200DDE6EA00BBCCD500BBCC
D500688DA200DDE6EA00688DA200DDE6EA000000000000000000000000000000
0000FFF2EA00FFEDE200FFE5D500FFE0CD00CD520800DC865100DB7C4000E281
4700EA905C00F4A67800FEBC9400FFCBAE00FFDCC700FFEFE300F7F8F800CDEA
FD008FCDF7005CB5F30036A1EF00CD520800FFE0CC00FFE0CC00FFE1CE00FFE3
D10000000000000000000000000000000000FE823900FE823900FEDAC200FED8
C300FED8C300FBA27300FBA27300CD520800CD520800FFE9D700FFE9D700FFE9
D700FFE9D700FFEAD900FFEAD900FFECDC00FFECDC0000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6
EA00BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6EA00688DA200DDE6
EA00688DA200DDE6EA00BBCCD500BBCCD500BBCCD500688DA200DDE6EA00BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6EA00BBCCD500BBCC
D500688DA200DDE6EA00688DA200DDE6EA00688DA200DDE6EA00BBCCD500BBCC
D500688DA200DDE6EA00688DA200DDE6EA00BBCCD500BBCCD500BBCCD50053C7
FF0051C6FF004FC5FF004CC4FF0049C4FF0047C2FF0044C1FF0042C0FF003FC0
FF003DBDFF003AB9FF0038B6FF00214F4A000000000000000000000000000000
0000FFF1E900FFEBDF00FFE3D200FFDEC900CD520800DC865100DB7B4100E281
4800EB915C00F5A67800FEBB9400FFCCAE00FFDCC700FFEFE400F7F8F900CDEA
FD008FCDF7005CB5F40036A1EF00CD520800FFDDC700FFDEC800FFDFCB00FFE2
CE0000000000000000000000000000000000FFE9D80000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6
EA00DDE6EA00DDE6EA00DDE6EA00BBCCD500688DA200DDE6EA00688DA200DDE6
EA00688DA200DDE6EA00BBCCD500BBCCD500BBCCD500688DA200DDE6EA00BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6EA00BBCCD500BBCC
D500688DA200DDE6EA00688DA200DDE6EA00688DA200DDE6EA00BBCCD500BBCC
D500688DA200DDE6EA00688DA200DDE6EA00BBCCD500BBCCD500BBCCD5008BDB
FF0082D9FF007BD7FF0077D5FF0073D4FF0071D2FF006ED1FF006AD0FF0068CF
FF0065CFFF0063CDFF0061CDFF005FCCFF005DCAFF005AC9FF0058C9FF0055C8
FF0053C7FF0050C5FF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000000000000000000000000000
0000FFF1E800FFEADE00FFE2D000FFDBC600CD520800DC855100DB7C4100E281
4800EB915C00F5A77800FDBC9400FFCBAE00FFDBC700FFEFE300F6F8F800CCEA
FD008FCDF7005BB6F30037A1EF00CD520800FFDBC300FFDBC400FFDDC700FFDF
CA0000000000000000000000000000000000BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200688D
A200688DA200688DA200BBCCD500BBCCD500688DA200DDE6EA00688DA200DDE6
EA00688DA200DDE6EA00BBCCD500BBCCD500BBCCD500688DA200DDE6EA00BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500688DA200BBCCD500DDE6EA00DDE6
EA00688DA200BBCCD500688DA200DDE6EA00688DA200BBCCD500DDE6EA00DDE6
EA00688DA200BBCCD500688DA200DDE6EA00DDE6EA00BBCCD500DDE6EA00D9EB
FA00D9EAF900D9EAFA00D9EAFA00D9EAFA00D9EBFA00D9EBFA00DAEBF900DBEC
FA0000000000DDE6EA00DDE6EA00DDE6EA00232323009FE2FF0098E0FF008DDD
FF0084D9FF007ED6FF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF4ED00FFEFE500FFEFE500FFE9DB00FFE9DB00FFE5D300FFE5D300CD52
0800CD520800FEE1CE00FEE1CE00FEE4D8000000000000000000000000000000
0000FFF0E700FFE9DC00FFE0CD00FED9C300CD520800DC855000DB7C4100E181
4700EA915C00F5A77800FEBB9400FFCCAE00FFDCC800FFEFE300F6F8F800CCEA
FD008FCDF7005BB5F30036A1EF00CD520800FFD7BF00FFD8C000FFDAC200FFDC
C70000000000000000000000000000000000688DA200BBCCD500688DA200DDE6
EA00688DA200DDE6EA00BBCCD500BBCCD500BBCCD500688DA200DDE6EA00BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200688DA200688D
A200BBCCD500BBCCD500688DA200DDE6EA00BBCCD500688DA200688DA200688D
A200BBCCD500BBCCD500688DA200688DA200BBCCD500688DA200BBCCD5000000
0000F4F9FE00F1F8FD00EFF5FC00EBF5FC00EAF3FA00EAF2FA00E9F2FA007478
7D003A3C3F003A3D3F003A3D3F003A3D3F003A3D3F003A3D3F003A3D3F003A3D
3F003A3D3F00E9F3FB0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF4ED00FFEFE500FFEFE500FFE9DB00FFE9DB00FFE5D300FFE5D300CD52
0800CD520800FEE1CE00FEE1CE00FEE4D800FEE4D800FEB89000FEB89000FECA
A900FEFEFE00FEFEFE00FEEBE100FEEBE100FEFDFE00FEFDFE00FEB78C00FEB7
8C00FEA16D00FEA16D00FE975C00FE975C000000000000000000000000000000
0000FFEFE500FFE8DA00FEDDCB00FDD7C000CD520800DD855100DB7B4000E181
4700EB915C00F5A67700FEBB9400FFCCAE00FFDBC700FFEFE400F6F8F900CCEA
FD008FCDF7005BB5F30036A1F000CD520800FFD5BB00FFD5BD00FFD8BF00FFDA
C20000000000000000000000000000000000BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500688DA200DDE6EA00BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500100F
0E0000000000CFBEB000FFEAD900FFEBDB00FFEBDB00FFECDC00FFEDDD00FFEF
E00000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000
0000FCFDFE00FBFCFE0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF3EC00FFEEE300FFEEE300FFE7D800FFE7D800FFE3D000FFE3D000CD52
0800CD520800FEE4D300FEE4D300FEE1D100FEE1D100FEA67500FEA67500FEF6
F100FEEFE900FEEFE900FEEBE200FEEBE200FEFBFA00FEFBFA00FE945900FE94
5900FEA97C00FEA97C00FE925000FE925000FEFEFE00FEFEFE00FEB98D00FEC3
A100FEC3A100FBBC9200FBBC9200CD520800CD520800FFE3CF00FFE3CF00FFE3
CF00FFE3CF00FFE5D100FFE5D100FFE6D5000000000000000000000000000000
0000FEEEE400FEE6D800FEDDC800FDD5BC00CD520800DD865200DB7C4200E183
4900EA925F00F4A77A00FDBD9500FFCCAE00FFDCC800FFEFE400F6F8F800CDEA
FD0090CDF7005DB6F30038A1F000CD520800FFD3B800FFD3BA00FFD6BC00FFD8
C00000000000000000000000000000000000BBCCD500BBCCD500BBCCD5000000
0000FFF5EE00FFF1E700FFEADD00FFE7D600FFE4D100FFE2CF00FFE2CE00FFE2
CF00CFB8A80040393400EFD6C300FFE5D100FFE5D200FFE5D200FFE5D300EFD8
C700403A3500BFADA00000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF3EC00FFEEE300FFEEE300FFE7D800FFE7D800FFE3D000FFE3D000CD52
0800CD520800FEE4D300FEE4D300FEE1D100FEE1D100FEA67500FEA67500FEF6
F100FEEFE900FEEFE900FEEBE200FEEBE200FEFBFA00FEFBFA00FE945900FE94
5900FEA97C00FEA97C00FE925000FE925000FEFEFE00FEFEFE00FEB98D00FEC3
A100FEC3A100FBBC9200FBBC9200CD520800CD520800FFE3CF00FFE3CF00FFE3
CF00FFE3CF00FFE5D100FFE5D100FFE6D500FFE6D50000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD5000000000000000000000000000000
0000FEEDE200FEE5D600FDDBC500FDD3BA00CD520800DD885600DD804800E388
5000EB976600F5AB8100FDBF9B00FFCEB200FFDECB00FFF0E400F6F8F800CFEB
FD0096D0F70064B9F30041A6F000CD520800FED2B700FED3BB00FED5BD00FED8
C1000000000000000000000000000000000000000000FFFFFF00000000000000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF2EA00FFEDE200FFEDE200FFE5D500FFE5D500FFE0CD00FFE0CD00CD52
0800CD520800FEEADD00FEEADD00FEC7A700FEC7A700FEC09B00FEC09B00FEFB
FB00FEEAE000FEEAE000FEEFE700FEEFE700FEF0EB00FEF0EB00FE844100FE84
4100FEA97800FEA97800FEC8AA00FEC8AA00FEFAFA00FEFAFA00FEAF7F00FEBD
9A00FEBD9A00FBB07B00FBB07B00CD520800CD520800FFE0CC00FFE0CC00FFE0
CC00FFE0CC00FFE1CE00FFE1CE00FFE3D100FFE3D10000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000000000000000000000000000
0000FEECE100FDE3D500FCD9C300FCD1B500CD520800DE8A5700DF885400E593
6000EEA17400F8B38D00FEC6A500FFD3BA00FFE1D000FFF2E700F7F8F900D4ED
FE00A0D5F80073C0F50054B0F100CD520800FED2B800FDD4BC00FDD7C000FEDA
C50000000000000000000000000000000000DDE6EA00DDE6EA00000000000000
0000FFF2EA00FFEDE200FFEDE200FFE5D500FFE5D500FFE0CD00FFE0CD00CD52
0800CD520800FEEADD00FEEADD00FEC7A700FEC7A700FEC09B00FEC09B00FEFB
FB00FEEAE000FEEAE000FEEFE700FEEFE700FEF0EB00FEF0EB00FE844100FE84
4100FEA97800FEA97800FEC8AA00FEC8AA00FEFAFA00FEFAFA00FEAF7F00FEBD
9A00FEBD9A00FBB07B00FBB07B00CD520800CD520800FFE0CC00FFE0CC00FFE0
CC00FFE0CC00FFE1CE00FFE1CE00FFE3D100FFE3D10000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200688D
A200688DA200688DA200688DA200BBCCD500688DA200BBCCD500688DA200BBCC
D500688DA200BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200688D
A200688DA200688DA200BBCCD500BBCCD5000000000000000000000000000000
0000FDEBE000FDE2D300FCD7C100FCCFB300CD520800E2966A00E3976800EA9F
7000F1B28D00F8C1A100FED0B400FFD9C500FFE5D700FFF4EC00F8F6F600DBEC
F600B2DAF5008DC6EE0073BCEF00CD520800FDD6BC00FDD9C100FDDCC700FEDF
CC0000000000000000000000000000000000FEB08600FEDFCB00FEDFCB00FEF7
F300FEE7DA00FEE7DA00FEF0EA00FEF0EA00FEEBE100FEEBE100FE813A00FE81
3A00FEAD7800FEAD7800FEE4D900FEE4D900FEE3DB00FEE3DB00FED1B000EFC5
B400EFC5B400E99B7300E99B7300CD520800CD520800FFDDC700FFDDC700FFDE
C800FFDEC800FFDFCB00FFDFCB00FFE2CE00FFE2CE0000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD5000000000000000000000000000000
0000FDEADF00FCE1D000FBD5BE00FBCCB000CD520800CD520800CD520800CD52
0800CD520800CD520800CD520800CD520800CD520800CD520800CD520800CD52
0800CD520800CD520800CD520800CD520800FDDAC400FDDFCD00FDE3D300FEE7
D80000000000000000000000000000000000FEE3DB00FEE3DB00FED1B000EFC5
B400EFC5B400E99B7300E99B7300CD520800CD520800FFDDC700FFDDC700FFDE
C800FFDEC800FFDFCB00FFDFCB00FFE2CE00FFE2CE0000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD5000000
0000000000000000000000000000000000005BCAFF0058C9FF0056C7FF0053C7
FF0051C4FF004DBFFF0049BBFF00214F4A000000000000000000000000000000
0000FDE9DE00FCE0CF00FAD4BB00FACAAD00FAC3A400F9C09E00F9BF9C00F9BF
9C00F9C09D00F9C09D00FAC09F00FAC1A000FAC1A000F9C1A100F9C2A100FAC3
A200FAC5A500FBC7A900FCCCB100FCD4BC00FDDDCA00FDE4D500FDE9DC00FEEC
E20000000000000000000000000000000000FFDFCA0000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD5000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000000000000000000000000000
0000FCE9DD00FBDFCD00FAD2BB00F9C9AB00F9C2A200F8BF9D00F8BE9A00F8BD
9A00F8BE9B00F8BE9C00F9BF9D00F8C09D00F9C09E00F9C09F00F9C09F00F9C2
A100FAC4A400FBC7A80000000000000000000000000000000000000000000000
000000000000000000000000000000000000BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500FFF7
EB00FFF7EC00FFF8ED00FFF8EE00FFF8EE00FFF9EF00FFF9F000FFFAF000FFFA
F20000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000
0000FFFBF700FFFAF30000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF1E800FFEADE00FFEADE00FFE2D000FFE2D000FFDBC600FFDBC600CD52
0800CD520800FEE9DD00FEE9DD00FEA56E000000000000000000000000000000
0000FDE9DD00FCE0CF00FAD4BC00F8CAAD00F8C4A400F8C09F00F8BF9D00F9BE
9D00F8BF9E00F9C09E00F9C09F00F9C09F00F9C19F00F9C1A000F9C1A000F9C2
A200F9C5A500F9C8AB0000000000F9833C00FF985A00FFAC7700FFC195000000
000000000000000000000000000000000000BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD5000000
0000FFF7F100FFF3EA00FFEEE300FFECDD00CD520800FBE6DA00FBDED100FBD0
B900FBD3C000FBC4A300FBB99100FBFAFB00FBF6F600FBE6DA00FB996400FBA8
7B00FB823F00FBDCCB0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF1E800FFEADE00FFEADE00FFE2D000FFE2D000FFDBC600FFDBC600CD52
0800CD520800FEE9DD00FEE9DD00FEA56E00FEA56E00FEE5D900FEE5D900FEF6
F500FEE4D400FEE4D400FEEBE400FEEBE400FEEEE400FEEEE400FE7A3200FE7A
3200FEAB7500FEAB7500FED1B800FED1B8000000000000000000000000000000
0000FCEADF00FBE2D200FAD6C100F9CEB400F8C8AB00F9C6A700F8C4A500F9C5
A500F9C5A500F9C6A500F8C6A600F8C6A700F9C6A800F9C6A700F9C6A800F9C8
A900FAC9AC00FACDB10000000000FF9F6400FFB38100FFC89F00000000000000
000000000000000000000000000000000000DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FEFA
FA00FEAF7F00FEBD9A00FBB07B00CD520800FFE0CC00FFE0CC00FFE1CE00FFE3
D10000000000DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA000000
0000FFF3EC00FFEEE30000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF0E700FFE9DC00FFE9DC00FFE0CD00FFE0CD00FED9C300FED9C300CD52
0800CD520800FEE4D600FEE4D600FEA16D00FEA16D00FEE9E100FEE9E100FEF6
F300FEEBDF00FEEBDF00FEF1EB00FEF1EB00FEF9FB00FEF9FB00FE824200FE82
4200FEA96F00FEA96F00FEBC8D00FEBC8D00FEFEFE00FEFEFE00FEFDFE00FEE2
D500FEE2D500FBDED200FBDED200CD520800CD520800FFD7BF00FFD7BF00FFD8
C000FFD8C000FFDAC200FFDAC200FFDCC7000000000000000000000000000000
0000FDEBE200FCE5D700FADCC900FAD5BF00F9D1B800F9CEB400F9CEB300F9CD
B300F9CDB300F9CEB300F9CEB400F9CFB500F9CFB500FACFB500FACFB500F9D0
B600FAD1B800FAD4BC0000000000FFBA8B00FFCFA90000000000000000000000
000000000000000000000000000000000000BBCCD500BBCCD500BBCCD5000000
0000FFEFE500FFE8DA00FEDDCB00FDD7C000CD520800FEE4D700FE9F6600FEE9
DD00FEF0E900FEE7DB00FEE7DF00FEFEFE00FEA37300FE8B3D00FEC69200FEE0
D600FDFEFE00FEE2D30000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFF0E700FFE9DC00FFE9DC00FFE0CD00FFE0CD00FED9C300FED9C300CD52
0800CD520800FEE4D600FEE4D600FEA16D00FEA16D00FEE9E100FEE9E100FEF6
F300FEEBDF00FEEBDF00FEF1EB00FEF1EB00FEF9FB00FEF9FB00FE824200FE82
4200FEA96F00FEA96F00FEBC8D00FEBC8D00FEFEFE00FEFEFE00FEFDFE00FEE2
D500FEE2D500FBDED200FBDED200CD520800CD520800FFD7BF00FFD7BF00FFD8
C000FFD8C000FFDAC200FFDAC200FFDCC700FFDCC70000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD5000000000000000000000000000000
0000FDEEE600FCEADF00FCE4D600FBE0CF00FBDDCB00FADBC800FADBC700FADB
C700FADBC800FADBC800FADBC800FADCC900FBDCC900FADCC900FADCC900FADC
CA00FBDDCB00FBE0CE0000000000FFD6B3000000000000000000000000000000
000000000000000000000000000000000000DDE6EA00DDE6EA00DDE6EA000000
0000FDEBE000FDE2D30000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00000000000000
0000FFEFE500FFE8DA00FFE8DA00FEDDCB00FEDDCB00FDD7C000FDD7C000CD52
0800CD520800FEE4D700FEE4D700FE9F6600FE9F6600FEE9DD00FEE9DD00FEF0
E900FEE7DB00FEE7DB00FEE7DF00FEE7DF00FEFEFE00FEFEFE00FEA37300FEA3
7300FE8B3D00FE8B3D00FEC69200FEC69200FEE0D600FEE0D600FDFEFE00FEE2
D300FEE2D300F1A98A00F1A98A00CD520800CD520800FFD5BB00FFD5BB00FFD5
BD00FFD5BD00FFD8BF00FFD8BF00FFDAC200FFDAC20000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA200BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD5000000000000000000000000000000
0000FDF1E900FDEEE500FCEAE000FCE8DC00FCE6D900FCE5D800FCE5D700FCE5
D700FCE5D700FCE5D700FCE5D800FCE6D800FCE6D800FCE6D900FCE6D900FCE6
D900FCE7DA00FCE8DC0000000000000000000000000000000000000000000000
000000000000000000000000000000000000DDE6EA00DDE6EA00000000000000
0000FFEFE500FFE8DA00FFE8DA00FEDDCB00FEDDCB00FDD7C000FDD7C000CD52
0800CD520800FEE4D700FEE4D700FE9F6600FE9F6600FEE9DD00FEE9DD00FEF0
E900FEE7DB00FEE7DB00FEE7DF00FEE7DF00FEFEFE00FEFEFE00FEA37300FEA3
7300FE8B3D00FE8B3D00FEC69200FEC69200FEE0D600FEE0D600FDFEFE00FEE2
D300FEE2D300F1A98A00F1A98A00CD520800CD520800FFD5BB00FFD5BB00FFD5
BD00FFD5BD00FFD8BF00FFD8BF00FFDAC200FFDAC20000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA20000000000FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000FE9B6000FEDFCD00FEDFCD00FEF2
EF00FEE3D900FEE3D900FEE0D300FEE0D300FEF8F800FEF8F800FEE8E300FEE8
E300FE833B00FE833B00FEBB7300FEBB7300FEDFC000FEDFC000F9CEC200FED8
CA00FED8CA00FBD2BF00FBD2BF00CD520800CD520800FFD3B800FFD3B800FFD3
BA00FFD3BA00FFD6BC00FFD6BC00FFD8C000FFD8C00000000000DDE6EA00DDE6
EA00DDE6EA00DDE6EA00DDE6EA00DDE6EA00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00BBCCD500DDE6EA00BBCCD500BBCCD500BBCCD500BBCCD500BBCC
D500BBCCD500BBCCD500BBCCD500BBCCD500BBCCD500688DA20000000000FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00424D3E000000000000003E000000
2800000080000000200000000100010000000000000200000000000000000000
000000000000000000000000FFFFFF00E0000007000000000000000000000000
E00000F7000000000000000000000000E0000007000000000000000000000000
E0000007000000000000000000000000E0000007000000000000000000000000
E0000007000000000000000000000000E0000007FFFFFF00FFFFFF00FFFFFF00
E00000070000000000000000FFFFFF00E0000007000000000000000000000000
E0000007000000000000000000000000E0000007000000000000000000000000
E0000007000000000000000000000000E0000007000000000000000000000000
E0000007000000000000000000000000E0000007FFFFFF00FFFFFF00FFFFFF00
E00000070000000000000000FFFFFF00E0000007000000000000000000000000
E0000007000000000000000000000000E0000007000000000000000000000000
E0000007000000000000000000000000E0000007000000000000000000000000
E0000007000000000000000000000000E0000007FFFFFF00FFFFFF00FFFFFF00
E00000070000000000000000FFFFFF00E0000007000000000000000000000000
E0000007000000000000000000000000E000000F000000000000000000000000
E000001F000000000000000000000000E000003F000000000000000000000000
E000007F000000000000000000000000E00000FFFFFFFF00FFFFFF00FFFFFF00
E00001FF10022F031F022F0320FFFF0000000000000000000000000000000000
000000000000}
end
object TooltipTimer: TTimer
OnTimer = TooltipTimerTimer
Left = 8
Top = 52
end
end

621
Forms/Browser.pas Normal file
View File

@ -0,0 +1,621 @@
{
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 Browser;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, ComCtrls, ControlPoint, ToolWin, ImgList, StdCtrls,
Cmap, Menus, Global, Buttons, Translation,
RenderingInterface;
const
PixelCountMax = 32768;
PaletteTooltipTimeout = 1500;
type
TGradientBrowser = class(TForm)
SmallImages: TImageList;
pnlMain: TPanel;
PopupMenu: TPopupMenu;
DeleteItem: TMenuItem;
RenameItem: TMenuItem;
OpenDialog: TOpenDialog;
LargeImages: TImageList;
TooltipTimer: TTimer;
ListView: TListView;
pnlPreview: TPanel;
Image: TImage;
btnDefGradient: TSpeedButton;
procedure FormResize(Sender: TObject);
procedure ListViewChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure DeleteItemClick(Sender: TObject);
procedure RenameItemClick(Sender: TObject);
procedure ListViewEdited(Sender: TObject; Item: TListItem;
var S: string);
procedure btnDefGradientClick(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure ListViewKeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListViewInfoTip(Sender: TObject; Item: TListItem;
var InfoTip: String);
procedure TooltipTimerTimer(Sender: TObject);
private
procedure DrawPalette;
procedure Apply;
public
PreviewDensity: double;
FlameIndex, GradientIndex: Integer;
Extension, Identifier, Filename: string;
cp: TControlPoint;
Palette: TColorMap;
zoom: double;
Center: array[0..1] of double;
Render: TRenderer;
procedure ListFileContents;
function LoadFractintMap(filen: string): TColorMap;
end;
type
EFormatInvalid = class(Exception);
pRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = array[0..PixelCountMax - 1] of TRGBTriple;
var
GradientBrowser: TGradientBrowser;
FlameString: string;
function CreatePalette(strng: string): TColorMap;
implementation
uses Main, Options, Editor, {Gradient,} Registry, Adjust, Mutate;
{$R *.DFM}
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 GetVal(token: string): string;
var
p: integer;
begin
p := Pos('=', token);
Delete(Token, 1, p);
Result := Token;
end;
function ReplaceTabs(str: string): string;
{Changes tab characters in a string to spaces}
var
i: integer;
begin
for i := 1 to Length(str) do
begin
if str[i] = #9 then
begin
Delete(str, i, 1);
Insert(#32, str, i);
end;
end;
Result := str;
end;
function TGradientBrowser.LoadFractintMap(filen: string): TColorMap;
var
i: integer;
s: string;
pal: TColorMap;
MapFile: TextFile;
begin
{ Load a map file }
AssignFile(MapFile, Filen);
try
Reset(MapFile);
for i := 0 to 255 do
begin
Read(MapFile, Pal[i][0]);
Read(MapFile, Pal[i][1]);
Read(MapFile, Pal[i][2]);
Read(MapFile, s);
end;
CloseFile(MapFile);
Result := Pal;
except
on EInOutError do Application.MessageBox(PChar(Format(TextByKey('common-genericopenfailure'), [FileName])), PCHAR('Apophysis'), 16);
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 TGradientBrowser.DrawPalette;
var
i, j: integer;
Row: pRGBTripleArray;
BitMap: TBitMap;
begin
BitMap := TBitMap.Create;
try
Bitmap.PixelFormat := pf24bit;
BitMap.Width := 256;
BitMap.Height := 1;
for j := 0 to Bitmap.Height - 1 do
begin
Row := Bitmap.Scanline[j];
for i := 0 to Bitmap.Width - 1 do
begin
with Row[i] do
begin
rgbtRed := Palette[i][0];
rgbtGreen := Palette[i][1];
rgbtBlue := Palette[i][2];
end
end
end;
Image.Picture.Graphic := Bitmap;
Image.Refresh;
finally
BitMap.Free;
end;
end;
procedure TGradientBrowser.ListFileContents;
{ List identifiers in file }
var
i, p: integer;
Title: string;
ListItem: TListItem;
FStrings: TStringList;
begin
FStrings := TStringList.Create;
FStrings.LoadFromFile(filename);
try
ListView.Items.BeginUpdate;
ListView.Items.Clear;
if Lowercase(ExtractFileExt(filename)) = '.map' then
begin
ListItem := ListView.Items.Add;
Listitem.Caption := Trim(filename);
end
else
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
begin { Otherwise bad format }
ListItem := ListView.Items.Add;
Listitem.Caption := Trim(Copy(FStrings[i], 1, p - 1));
end;
end;
end;
end;
ListView.Items.EndUpdate;
ListView.Selected := ListView.Items[0];
finally
FStrings.Free;
end;
end;
procedure TGradientBrowser.ListViewChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
var
Tokens, FStrings: TStringList;
EntryStrings: TStringList;
i: integer;
begin
Application.ProcessMessages;
FStrings := TStringList.Create;
EntryStrings := TStringList.Create;
Tokens := TStringList.Create;
try
if Lowercase(ExtractFileExt(filename)) = '.map' then
begin
Palette := LoadFractintMap(filename);
DrawPalette;
end
else
if (ListView.SelCount <> 0) and (ListView.Selected.Caption <> Identifier) then
begin
Identifier := ListView.Selected.Caption;
FStrings.LoadFromFile(Filename);
for i := 0 to FStrings.count - 1 do
if Pos(Lowercase(ListView.Selected.Caption) + ' ', Trim(Lowercase(FStrings[i]))) = 1 then break;
EntryStrings.Add(FStrings[i]);
repeat
inc(i);
EntryStrings.Add(FStrings[i]);
until Pos('}', FStrings[i]) <> 0;
Palette := CreatePalette(EntryStrings.Text);
DrawPalette;
end;
finally
EntryStrings.Free;
FStrings.Free;
Tokens.Free;
end;
end;
procedure TGradientBrowser.FormCreate(Sender: TObject);
begin
self.Caption := TextByKey('gradientbrowser-title');
btnDefGradient.Hint := TextByKey('common-browse');
DeleteItem.Caption := TextByKey('common-delete');
RenameItem.Caption := TextByKey('common-rename');
PreviewDensity := prevMediumQuality;
cp := TControlPoint.Create;
cp.gamma := defGamma;
cp.brightness := defBrightness;
cp.vibrancy := defVibrancy;
cp.spatial_oversample := defOversample;
cp.spatial_filter_radius := defFilterRadius;
Render := TRenderer.Create;
FlameIndex := 0;
GradientIndex := 0;
end;
procedure TGradientBrowser.FormDestroy(Sender: TObject);
begin
Render.Free;
cp.Free;
end;
procedure TGradientBrowser.FormShow(Sender: TObject);
var
Registry: TRegistry;
begin
{ Read posution from registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Browser', False) then
begin
if Registry.ValueExists('Left') then
GradientBrowser.Left := Registry.ReadInteger('Left');
if Registry.ValueExists('Top') then
GradientBrowser.Top := Registry.ReadInteger('Top');
if Registry.ValueExists('Width') then
GradientBrowser.Width := Registry.ReadInteger('Width');
if Registry.ValueExists('Height') then
GradientBrowser.Height := Registry.ReadInteger('Height');
end;
Registry.CloseKey;
finally
Registry.Free;
end;
if FileExists(filename) then ListFileContents;
end;
procedure TGradientBrowser.DeleteItemClick(Sender: TObject);
var
c: boolean;
begin
if ListView.SelCount <> 0 then
begin
if ConfirmDelete then
c := Application.MessageBox(
PChar(Format(TextByKey('common-confirmdelete'), [ListView.Selected.Caption])), 'Apophysis', 36) = IDYES
else
c := True;
if c then
if ListView.Focused and (ListView.SelCount <> 0) then
begin
Application.ProcessMessages;
if DeleteEntry(ListView.Selected.Caption, Filename) then
begin
ListView.Items.Delete(ListView.Selected.Index);
ListView.Selected := ListView.ItemFocused;
end;
end;
end;
end;
procedure TGradientBrowser.RenameItemClick(Sender: TObject);
begin
if ListView.SelCount <> 0 then
ListView.Items[ListView.Selected.Index].EditCaption;
end;
procedure TGradientBrowser.ListViewEdited(Sender: TObject; Item: TListItem;
var S: string);
begin
// if s <> Item.Caption then
// if not RenameIFS(Item.Caption, s, Filename) then
// s := Item.Caption;
end;
procedure TGradientBrowser.btnDefGradientClick(Sender: TObject);
var
fn:string;
begin
OpenDialog.InitialDir := BrowserPath;
OpenDialog.Filter := Format('%s|*.gradient;*.ugr|%s|*.map|%s|*.*',
[TextByKey('common-filter-gradientfiles'),
TextByKey('common-filter-fractintfiles'),
TextByKey('common-filter-allfiles')]);
OpenDialog.FileName := '';
if OpenSaveFileDialog(GradientBrowser, OpenDialog.DefaultExt, OpenDialog.Filter, OpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then
//if OpenDialog.Execute then
begin
Filename := fn; //OpenDialog.FileName;
GradientFile := Filename;
BrowserPath := ExtractFilePath(fn); //ExtractFilePath(OpenDialog.FileName);
ListFileContents;
end;
end;
procedure TGradientBrowser.Apply;
begin
MainForm.StopThread;
MainForm.UpdateUndo;
MainCp.cmap := Palette;
MainCP.cmapindex := -1;
if EditForm.Visible then EditForm.UpdateDisplay;
if AdjustForm.Visible then AdjustForm.UpdateDisplay;
if MutateForm.Visible then MutateForm.UpdateDisplay;
MainForm.RedrawTimer.enabled := true;
end;
procedure TGradientBrowser.SpeedButton1Click(Sender: TObject);
begin
Apply;
end;
procedure TGradientBrowser.ListViewKeyPress(Sender: TObject;
var Key: Char);
begin
if Key = #13 then Apply;
end;
procedure TGradientBrowser.FormClose(Sender: TObject;
var Action: TCloseAction);
var
Registry: TRegistry;
begin
{ Write position to registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
{ Defaults }
if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Browser', True) then
begin
Registry.WriteInteger('Top', GradientBrowser.Top);
Registry.WriteInteger('Left', GradientBrowser.Left);
Registry.WriteInteger('Width', GradientBrowser.Width);
Registry.WriteInteger('Height', GradientBrowser.Height);
end;
finally
Registry.Free;
end;
end;
procedure TGradientBrowser.ListViewInfoTip(Sender: TObject;
Item: TListItem; var InfoTip: String);
var
i, j: integer;
Row: pRGBTripleArray;
Bitmap: TBitmap;
pal: TColorMap;
EntryStrings, FStrings: TStringList;
rect: TRect;
begin
BitMap := TBitMap.create;
Bitmap.PixelFormat := pf24bit;
BitMap.Width := 256;
BitMap.Height := 100;
FStrings := TStringList.Create;
EntryStrings := TStringList.Create;
try
if Lowercase(ExtractFileExt(filename)) = '.map' then
begin
pal := LoadFractintMap(filename);
end
else
begin
Identifier := Item.Caption;
FStrings.LoadFromFile(Filename);
for i := 0 to FStrings.count - 1 do
if Pos(Lowercase(Item.Caption) + ' ', Trim(Lowercase(FStrings[i]))) = 1 then break;
EntryStrings.Add(FStrings[i]);
repeat
inc(i);
EntryStrings.Add(FStrings[i]);
until Pos('}', FStrings[i]) <> 0;
pal := CreatePalette(EntryStrings.Text);
end;
finally
EntryStrings.Free;
FStrings.Free;
end;
for j := 0 to Bitmap.Height - 1 do
begin
Row := Bitmap.Scanline[j];
for i := 0 to Bitmap.Width - 1 do
begin
with Row[i] do
begin
rgbtRed := pal[i][0];
rgbtGreen := pal[i][1];
rgbtBlue := pal[i][2];
end
end
end;
rect.TopLeft := Item.Position;
rect.BottomRight.X := rect.TopLeft.X + 100;
rect.BottomRight.Y := rect.TopLeft.Y + 16;
with ListView do
begin
Canvas.Rectangle(Rect);
//Canvas.TextOut(Rect.Left, Rect.Top, Item.Caption);
//Rect.Left := (Rect.Left + rect.Right) div 3;
Canvas.StretchDraw(Rect, Bitmap);
end;
BitMap.Free;
InfoTip := '';
TooltipTimer.Interval := PaletteTooltipTimeout;
TooltipTimer.Enabled := true;
end;
procedure TGradientBrowser.TooltipTimerTimer(Sender: TObject);
begin
ListView.Repaint;
TooltipTimer.Enabled := false;
end;
procedure TGradientBrowser.FormResize(Sender: TObject);
begin
Listview.Width := self.ClientWidth - 4;
btnDefGradient.Left := self.ClientWidth - 2 - btnDefGradient.Width;
ListView.Height := self.ClientHeight - pnlPreview.Height - 6;
btnDefGradient.Top := self.ClientHeight - pnlPreview.Height - 2 + pnlPreview.Height div 2 - btnDefGradient.Height div 2;
ListView.Top := 2;
ListView.Left := 2;
pnlPreview.Top := self.ClientHeight - pnlPreview.Height - 2;
pnlPreview.Left := 2;
pnlPreview.Width := self.ClientWidth - btnDefGradient.Width - 6;
end;
end.

125
Forms/Curves.dfm Normal file
View File

@ -0,0 +1,125 @@
object CurvesForm: TCurvesForm
Left = 197
Top = 111
BorderStyle = bsDialog
Caption = 'Curves'
ClientHeight = 492
ClientWidth = 489
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'System'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 16
object Label1: TLabel
Left = 8
Top = 16
Width = 75
Height = 13
Caption = 'Selected curve:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
end
object CurvesPanel: TPanel
Left = 8
Top = 68
Width = 473
Height = 414
BevelOuter = bvNone
Color = clBlack
ParentBackground = False
TabOrder = 0
end
object cbChannel: TComboBox
Left = 8
Top = 35
Width = 185
Height = 21
Style = csDropDownList
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ItemIndex = 0
ParentFont = False
TabOrder = 1
Text = 'Overall'
OnChange = cbChannelChange
Items.Strings = (
'Overall'
'Red'
'Green'
'Blue')
end
object tbWeightLeft: TScrollBar
Left = 326
Top = 8
Width = 155
Height = 21
Max = 160
PageSize = 0
Position = 80
TabOrder = 2
OnChange = tbWeightChange
OnScroll = tbWeightScroll
end
object tbWeightRight: TScrollBar
Left = 326
Top = 35
Width = 155
Height = 21
Max = 160
PageSize = 0
Position = 80
TabOrder = 3
OnChange = tbWeightChange
OnScroll = tbWeightScroll
end
object Panel2: TPanel
Left = 199
Top = 8
Width = 121
Height = 21
Cursor = crHandPoint
BevelOuter = bvLowered
Caption = ' First CP weight:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
ParentShowHint = False
ShowHint = True
TabOrder = 4
end
object Panel1: TPanel
Left = 199
Top = 35
Width = 121
Height = 21
Cursor = crHandPoint
BevelOuter = bvLowered
Caption = ' Second CP weight:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
ParentShowHint = False
ShowHint = True
TabOrder = 5
end
end

123
Forms/Curves.pas Normal file
View File

@ -0,0 +1,123 @@
unit Curves;
interface
uses Windows, Classes, Graphics, Forms, Controls, CurvesControl, Vcl.ExtCtrls,
Vcl.StdCtrls, Vcl.ComCtrls, ControlPoint, Registry, Global;
type
TCurvesForm = class(TForm)
CurvesPanel: TPanel;
cbChannel: TComboBox;
tbWeightLeft: TScrollBar;
tbWeightRight: TScrollBar;
Panel2: TPanel;
Panel1: TPanel;
Label1: TLabel;
procedure FormShow(Sender: TObject);
procedure cbChannelChange(Sender: TObject);
procedure tbWeightChange(Sender: TObject);
procedure tbWeightScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
published
CurvesControl: TCurvesControl;
public
procedure SetCp(cp: TControlPoint);
end;
var
CurvesForm: TCurvesForm;
implementation
uses Main;
{$R *.DFM}
procedure TCurvesForm.tbWeightScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
begin
if ScrollCode = scEndScroll then
CurvesControl.UpdateFlame;
end;
procedure TCurvesForm.SetCp(cp: TControlPoint);
begin
if CurvesControl = nil then Exit;
CurvesControl.SetCp(cp);
end;
procedure TCurvesForm.cbChannelChange(Sender: TObject);
begin
if CurvesControl = nil then Exit;
CurvesControl.ActiveChannel := TCurvesChannel(cbChannel.ItemIndex);
tbWeightLeft.Position := Round(CurvesControl.WeightLeft * 10);
tbWeightRight.Position := Round(CurvesControl.WeightRight * 10);
end;
procedure TCurvesForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
Registry: TRegistry;
begin
{ Write position to registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Curves', True) then
begin
Registry.WriteInteger('Top', self.Top);
Registry.WriteInteger('Left', self.Left);
end;
finally
Registry.Free;
end;
// bStop := True;
end;
procedure TCurvesForm.FormCreate(Sender: TObject);
begin
//
end;
procedure TCurvesForm.FormShow(Sender: TObject);
var Registry: TRegistry;
begin
if not (assigned(curvesControl)) then
begin
CurvesControl := TCurvesControl.Create(self);
CurvesControl.Align := alClient;
CurvesControl.Parent := CurvesPanel;
end;
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Curves', False) then
begin
if Registry.ValueExists('Left') then
self.Left := Registry.ReadInteger('Left');
if Registry.ValueExists('Top') then
self.Top := Registry.ReadInteger('Top');
Registry.CloseKey;
end;
finally
Registry.Free;
end;
tbWeightLeft.Position := Round(CurvesControl.WeightLeft * 10);
tbWeightRight.Position := Round(CurvesControl.WeightRight * 10);
SetCp(MainCp);
end;
procedure TCurvesForm.tbWeightChange(Sender: TObject);
begin
CurvesControl.WeightLeft := tbWeightLeft.Position / 10.0;
CurvesControl.WeightRight := tbWeightRight.Position / 10.0;
end;
end.

3543
Forms/Editor.dfm Normal file

File diff suppressed because it is too large Load Diff

5995
Forms/Editor.pas Normal file

File diff suppressed because it is too large Load Diff

553
Forms/FormExport.dfm Normal file
View File

@ -0,0 +1,553 @@
object ExportDialog: TExportDialog
Left = 313
Top = 276
BorderStyle = bsDialog
Caption = 'Export Flame'
ClientHeight = 392
ClientWidth = 496
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
OnShow = FormShow
DesignSize = (
496
392)
PixelsPerInch = 96
TextHeight = 13
object btnOK: TButton
Left = 398
Top = 182
Width = 89
Height = 25
Anchors = [akTop, akRight]
Caption = '&OK'
Default = True
ModalResult = 1
TabOrder = 0
OnClick = btnOKClick
end
object btnCancel: TButton
Left = 398
Top = 210
Width = 89
Height = 25
Anchors = [akTop, akRight]
Caption = 'Cancel'
ModalResult = 2
TabOrder = 1
end
object GroupBox1: TGroupBox
Left = 8
Top = 5
Width = 481
Height = 57
Anchors = [akLeft, akTop, akRight]
Caption = ' Destination '
TabOrder = 2
DesignSize = (
481
57)
object btnBrowse: TSpeedButton
Left = 448
Top = 19
Width = 24
Height = 24
Hint = 'Browse...'
Anchors = [akTop, akRight]
Flat = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
Glyph.Data = {
36030000424D3603000000000000360000002800000010000000100000000100
18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F
607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13
18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708
88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3
8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367
805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51
C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF
7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC
EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67
D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2
98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8
FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788
A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6
A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788
93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89
9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA
ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
ParentFont = False
ParentShowHint = False
ShowHint = True
OnClick = btnBrowseClick
end
object Label10: TPanel
Left = 8
Top = 20
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'File name'
ParentShowHint = False
ShowHint = True
TabOrder = 1
end
object txtFilename: TEdit
Left = 112
Top = 20
Width = 337
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
end
end
object GroupBox3: TGroupBox
Left = 256
Top = 66
Width = 233
Height = 105
Anchors = [akTop, akRight]
Caption = ' Quality '
TabOrder = 3
DesignSize = (
233
105)
object udOversample: TUpDown
Left = 212
Top = 68
Width = 12
Height = 21
Anchors = [akTop, akRight]
Associate = txtOversample
Min = 1
Max = 4
Position = 2
TabOrder = 3
end
object Label4: TPanel
Left = 8
Top = 20
Width = 113
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Density'
ParentShowHint = False
ShowHint = True
TabOrder = 4
end
object txtDensity: TEdit
Left = 120
Top = 20
Width = 105
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
OnChange = txtDensityChange
end
object Label5: TPanel
Left = 8
Top = 44
Width = 113
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Filter radius'
ParentShowHint = False
ShowHint = True
TabOrder = 5
end
object txtFilterRadius: TEdit
Left = 120
Top = 44
Width = 105
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 1
OnChange = txtFilterRadiusChange
end
object Label3: TPanel
Left = 8
Top = 68
Width = 113
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Oversample'
ParentShowHint = False
ShowHint = True
TabOrder = 6
end
object txtOversample: TEdit
Left = 120
Top = 68
Width = 92
Height = 21
Anchors = [akLeft, akTop, akRight]
ReadOnly = True
TabOrder = 2
Text = '2'
OnChange = txtOversampleChange
end
end
object GroupBox2: TGroupBox
Left = 8
Top = 66
Width = 241
Height = 105
Anchors = [akLeft, akTop, akRight]
Caption = ' Size '
TabOrder = 4
DesignSize = (
241
105)
object Label13: TLabel
Left = 184
Top = 36
Width = 26
Height = 13
Anchors = [akLeft, akTop, akRight]
Caption = 'pixels'
Visible = False
end
object Label16: TLabel
Left = 168
Top = 22
Width = 15
Height = 36
Anchors = [akLeft, akTop, akRight]
Caption = '}'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -32
Font.Name = 'Times New Roman'
Font.Style = []
ParentFont = False
Visible = False
end
object chkMaintain: TCheckBox
Left = 8
Top = 76
Width = 225
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Maintain aspect ratio'
Checked = True
State = cbChecked
TabOrder = 0
OnClick = chkMaintainClick
end
object Label1: TPanel
Left = 8
Top = 20
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Width'
ParentShowHint = False
ShowHint = True
TabOrder = 3
end
object Label2: TPanel
Left = 8
Top = 44
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Height'
ParentShowHint = False
ShowHint = True
TabOrder = 4
end
object cbHeight: TComboBox
Left = 112
Top = 44
Width = 121
Height = 21
Anchors = [akLeft, akTop, akRight]
ItemHeight = 13
TabOrder = 2
OnChange = txtHeightChange
Items.Strings = (
'200'
'240'
'480'
'600'
'768'
'1024'
'1200'
'2048'
'2400')
end
object cbWidth: TComboBox
Left = 112
Top = 20
Width = 121
Height = 21
Anchors = [akLeft, akTop, akRight]
ItemHeight = 13
TabOrder = 1
OnChange = txtWidthChange
Items.Strings = (
'320'
'640'
'800'
'1024'
'1280'
'1600'
'1920'
'2048'
'2560'
'3200')
end
end
object GroupBox4: TGroupBox
Left = 8
Top = 176
Width = 377
Height = 113
Anchors = [akLeft, akTop, akRight]
Caption = ' Parameters '
TabOrder = 5
DesignSize = (
377
113)
object udStrips: TUpDown
Left = 172
Top = 52
Width = 12
Height = 21
Associate = txtStrips
Min = 1
Max = 512
Position = 1
TabOrder = 2
end
object Label7: TPanel
Left = 8
Top = 20
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Buffer depth'
ParentShowHint = False
ShowHint = True
TabOrder = 7
end
object Label8: TPanel
Left = 8
Top = 52
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Strips'
ParentShowHint = False
ShowHint = True
TabOrder = 8
end
object Label9: TPanel
Left = 8
Top = 84
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'DE Radius'
ParentShowHint = False
ShowHint = True
TabOrder = 9
end
object txtEstimator: TEdit
Left = 112
Top = 84
Width = 73
Height = 21
TabOrder = 3
Text = '5'
OnChange = txtEstimatorChange
end
object txtStrips: TEdit
Left = 112
Top = 52
Width = 60
Height = 21
TabOrder = 1
Text = '1'
OnChange = txtBatchesChange
end
object cmbDepth: TComboBox
Left = 112
Top = 20
Width = 73
Height = 21
Style = csDropDownList
ItemHeight = 13
TabOrder = 0
OnChange = cmbDepthChange
Items.Strings = (
'16-bit'
'32-bit'
'32-bit float'
'64-bit')
end
object Label14: TPanel
Left = 192
Top = 20
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Gamma threshold'
ParentShowHint = False
ShowHint = True
TabOrder = 10
end
object Label12: TPanel
Left = 192
Top = 52
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'DE Curve'
ParentShowHint = False
ShowHint = True
TabOrder = 11
end
object Label11: TPanel
Left = 192
Top = 84
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'DE Minimum'
ParentShowHint = False
ShowHint = True
TabOrder = 12
end
object txtGammaTreshold: TEdit
Left = 296
Top = 20
Width = 73
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 6
Text = '0.01'
OnChange = txtGammaTresholdChange
end
object txtEstimatorCurve: TEdit
Left = 296
Top = 52
Width = 73
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 5
Text = '0.6'
OnChange = txtEstimatorCurveChange
end
object txtEstimatorMin: TEdit
Left = 296
Top = 84
Width = 73
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 4
Text = '0'
OnChange = txtEstimatorMinChange
end
end
object chkRender: TCheckBox
Left = 400
Top = 246
Width = 89
Height = 43
Anchors = [akTop, akRight]
Caption = 'Render'
Checked = True
State = cbChecked
TabOrder = 6
end
object Panel1: TPanel
Left = 8
Top = 296
Width = 481
Height = 89
Anchors = [akLeft, akTop, akRight, akBottom]
BevelKind = bkSoft
BevelOuter = bvNone
Color = clInfoBk
TabOrder = 7
OnResize = Panel1Resize
DesignSize = (
477
85)
object Label6: TLabel
Left = 8
Top = 4
Width = 453
Height = 24
Alignment = taCenter
Anchors = [akLeft, akTop, akRight]
AutoSize = False
Caption = 'WARNING!'
Font.Charset = DEFAULT_CHARSET
Font.Color = clInfoText
Font.Height = -19
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object Label15: TLabel
Left = 8
Top = 25
Width = 447
Height = 26
Alignment = taCenter
Anchors = [akLeft, akRight]
Caption =
'Fractals created with this version of Apophysis are not supporte' +
'd by the external renderer! To render 2D-only fractals, download' +
' the latest version of FLAM3 from http://www.flam3.com'
Color = clInfoBk
Font.Charset = DEFAULT_CHARSET
Font.Color = clInfoText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ParentColor = False
ParentFont = False
WordWrap = True
end
end
object SaveDialog: TSaveDialog
DefaultExt = 'jpg'
Filter =
'JPEG Image (*.jpg)|*.jpg|PPM Image (*.ppm)|*.ppm|PNG Images (*.p' +
'ng)|*.png'
Left = 464
Top = 264
end
end

346
Forms/FormExport.pas Normal file
View File

@ -0,0 +1,346 @@
{
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 FormExport;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ComCtrls, ExtCtrls, Translation;
type
TExportDialog = class(TForm)
btnOK: TButton;
btnCancel: TButton;
GroupBox1: TGroupBox;
btnBrowse: TSpeedButton;
txtFilename: TEdit;
SaveDialog: TSaveDialog;
GroupBox3: TGroupBox;
txtOversample: TEdit;
txtFilterRadius: TEdit;
txtDensity: TEdit;
udOversample: TUpDown;
GroupBox2: TGroupBox;
chkMaintain: TCheckBox;
cbWidth: TComboBox;
cbHeight: TComboBox;
GroupBox4: TGroupBox;
cmbDepth: TComboBox;
chkRender: TCheckBox;
txtStrips: TEdit;
udStrips: TUpDown;
txtEstimator: TEdit;
txtEstimatorMin: TEdit;
txtEstimatorCurve: TEdit;
txtGammaTreshold: TEdit;
Panel1: TPanel;
Label6: TLabel;
Label15: TLabel;
Label13: TLabel;
Label16: TLabel;
Label4: TPanel;
Label5: TPanel;
Label3: TPanel;
Label1: TPanel;
Label2: TPanel;
Label7: TPanel;
Label8: TPanel;
Label9: TPanel;
Label14: TPanel;
Label12: TPanel;
Label11: TPanel;
Label10: TPanel;
procedure Panel1Resize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnBrowseClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure txtWidthChange(Sender: TObject);
procedure chkMaintainClick(Sender: TObject);
procedure txtHeightChange(Sender: TObject);
procedure txtDensityChange(Sender: TObject);
procedure txtFilterRadiusChange(Sender: TObject);
procedure txtOversampleChange(Sender: TObject);
procedure txtBatchesChange(Sender: TObject);
procedure cmbDepthChange(Sender: TObject);
procedure txtEstimatorChange(Sender: TObject);
procedure txtEstimatorMinChange(Sender: TObject);
procedure txtEstimatorCurveChange(Sender: TObject);
procedure txtJittersChange(Sender: TObject);
procedure txtGammaTresholdChange(Sender: TObject);
procedure lblFlam3LinkClick(Sender: TObject);
private
FloatFormatSettings: TFormatSettings;
public
Filename: string;
ImageWidth, ImageHeight, Oversample, Batches, Strips: Integer;
Sample_Density, Filter_Radius: double;
Estimator, EstimatorMin, EstimatorCurve: double;
GammaTreshold: double;
Jitters: integer;
end;
var
ExportDialog: TExportDialog;
Ratio: double;
implementation
uses Global, Main, ShellAPI;
{$R *.DFM}
procedure TExportDialog.btnBrowseClick(Sender: TObject);
begin
SaveDialog.InitialDir := ExtractFileDir(txtFilename.text);
SaveDialog.Filename := txtFilename.Text;
case ExportFileFormat of
0: SaveDialog.DefaultExt := 'jpg';
1: SaveDialog.DefaultExt := 'ppm';
end;
SaveDialog.filterIndex := ExportFileFormat;
SaveDialog.Filter := Format('Portable Pixmap (*.ppm)|*.ppm|%s|*.jpg;*.jpeg|%s|*.png|%s|*.*',
[TextByKey('common-filter-jpeg'), TextByKey('common-filter-png'),
TextByKey('common-filter-allfiles')]);
if SaveDialog.Execute then
begin
case SaveDialog.FilterIndex of
1: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.jpg');
2: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.ppm');
3: txtFilename.Text := ChangeFileExt(SaveDialog.Filename, '.png');
end;
ExportFileFormat := SaveDialog.FilterIndex;
renderPath := ExtractFilePath(SaveDialog.Filename);
end;
end;
procedure TExportDialog.FormShow(Sender: TObject);
begin
txtFilename.Text := Filename;
cbWidth.Text := IntToStr(MainCp.Width);
cbHeight.Text := IntToStr(MainCp.Height);
ImageWidth := MainCp.Width;
ImageHeight := MainCp.Height;
txtDensity.text := FloatToStr(Sample_density);
// if cmbDepth.ItemIndex <> 2 then
// txtBatches.text := IntToStr(Round(Sample_density / 4));
txtFilterRadius.text := FloatToStr(Filter_Radius);
txtOversample.text := IntToSTr(Oversample);
udOversample.Position := Oversample;
Ratio := ImageWidth / ImageHeight;
Batches := 1;
Estimator := 9.0;
EstimatorMin := 0.0;
EstimatorCurve := 0.4;
Jitters := 1;
GammaTreshold := MainCP.gamma_threshold; //0.01;
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FloatFormatSettings);
txtEstimator.Text := FloatToStr(Estimator, FloatFormatSettings);
txtEstimatorMin.Text := FloatToStr(EstimatorMin, FloatFormatSettings);
txtEstimatorCurve.Text := FloatToStr(EstimatorCurve, FloatFormatSettings);
// txtJitters.Text := IntToStr(Jitters);
txtGammaTreshold.Text := FloatToStr(GammaTreshold, FloatFormatSettings);
end;
procedure TExportDialog.btnOKClick(Sender: TObject);
begin
Filename := txtFilename.text;
ImageWidth := StrToInt(cbWidth.Text);
ImageHeight := StrToInt(cbHeight.Text);
end;
procedure TExportDialog.txtWidthChange(Sender: TObject);
begin
try
ImageWidth := StrToInt(cbWidth.Text);
if chkMaintain.checked and cbWidth.Focused then
begin
ImageHeight := Round(ImageWidth / ratio);
cbHeight.Text := IntToStr(ImageHeight)
end;
except
end;
end;
procedure TExportDialog.chkMaintainClick(Sender: TObject);
begin
Ratio := ImageWidth / ImageHeight;
end;
procedure TExportDialog.txtHeightChange(Sender: TObject);
begin
try
ImageHeight := StrToInt(cbHeight.Text);
if chkMaintain.checked and cbHeight.Focused then
begin
ImageWidth := Round(ImageHeight * ratio);
cbWidth.Text := IntToStr(ImageWidth)
end;
except
end;
end;
procedure TExportDialog.txtDensityChange(Sender: TObject);
begin
try
Sample_Density := StrToFloat(txtDensity.Text);
// if cmbDepth.ItemIndex <> 2 then
// txtBatches.text := IntToStr(Round(Sample_density / 4));
except
end;
end;
procedure TExportDialog.txtFilterRadiusChange(Sender: TObject);
begin
try
Filter_Radius := StrToFloat(txtFilterRadius.Text);
except
end;
end;
procedure TExportDialog.txtOversampleChange(Sender: TObject);
begin
if StrToInt(txtOversample.Text) > udOversample.Max then
txtOversample.Text := IntToStr(udOversample.Max);
if StrToInt(txtOversample.Text) < udOversample.Min then
txtOversample.Text := IntToStr(udOversample.Min);
try
Oversample := StrToInt(txtOversample.Text);
except
end;
end;
procedure TExportDialog.txtBatchesChange(Sender: TObject);
begin
{
if StrToInt(txtBatches.Text) > udBatches.Max then
txtBatches.Text := IntToStr(udBatches.Max);
if StrToInt(txtBatches.Text) < udBatches.Min then
txtBatches.Text := IntToStr(udBatches.Min);
try
Batches := StrToInt(txtBatches.Text);
except
end;
}
end;
procedure TExportDialog.cmbDepthChange(Sender: TObject);
begin
{
if cmbDepth.ItemIndex <> 2 then
txtBatches.text := IntToStr(Round(Sample_density / 4))
else
txtBatches.text := IntToStr(1);
}
end;
procedure TExportDialog.txtEstimatorChange(Sender: TObject);
begin
Estimator := 0;
try
Estimator := StrToFloat(txtEstimator.Text, FloatFormatSettings);
except
end;
end;
procedure TExportDialog.txtEstimatorMinChange(Sender: TObject);
begin
EstimatorMin := 0;
try
EstimatorMin := StrToFloat(txtEstimatorMin.Text, FloatFormatSettings);
except
end;
end;
procedure TExportDialog.txtEstimatorCurveChange(Sender: TObject);
begin
EstimatorCurve := 0;
try
EstimatorCurve := StrToFloat(txtEstimatorCurve.Text, FloatFormatSettings);
except
end;
end;
procedure TExportDialog.txtJittersChange(Sender: TObject);
begin
{
Jitters := 0;
try
Jitters := StrToInt(txtJitters.Text);
except
end;
}
end;
procedure TExportDialog.txtGammaTresholdChange(Sender: TObject);
begin
//GammaTreshold := 0.01;
try
GammaTreshold := StrToFloat(txtGammaTreshold.Text, FloatFormatSettings);
except
end;
end;
procedure TExportDialog.lblFlam3LinkClick(Sender: TObject);
begin
ShellExecute(ValidParentForm(Self).Handle, 'open', PChar(TLabel(Sender).Hint),
nil, nil, SW_SHOWNORMAL);
end;
procedure TExportDialog.FormCreate(Sender: TObject);
begin
btnOK.Caption := TextByKey('common-ok');
btnCancel.Caption := TextByKey('common-cancel');
Label1.Caption := TextByKey('common-width');
Label2.Caption := TextByKey('common-height');
GroupBox2.Caption := TextByKey('common-size');
Label13.Caption := TextByKey('common-pixels');
chkMaintain.Caption := TextByKey('common-keepaspect');
GroupBox1.Caption := TextByKey('common-destination');
Label10.Caption := TextByKey('common-filename');
btnBrowse.Hint := TextByKey('common-browse');
GroupBox3.Caption := TextByKey('common-quality');
Label5.Caption := TextByKey('common-filterradius');
Label4.Caption := TextByKey('common-density');
Label3.Caption := TextByKey('common-oversample');
Label14.Caption := TextByKey('common-gammathreshold');
self.Caption := TextByKey('main-menu-file-exportflame');
GroupBox4.Caption := TextByKey('export-paramoptions-title');
Label7.Caption := TextByKey('export-paramoptions-bufferdepth');
Label8.Caption := TextByKey('export-paramoptions-strips');
Label9.Caption := TextByKey('export-paramoptions-estimatorradius');
Label12.Caption := TextByKey('export-paramoptions-estimatorcurve');
Label11.Caption := TextByKey('export-paramoptions-estimatormin');
chkRender.Caption := TextByKey('export-paramoptions-dorender');
Label6.Caption := TextByKey('export-paramoptions-warningtitle');
Label15.Caption := TextByKey('export-paramoptions-warningtext');
end;
procedure TExportDialog.Panel1Resize(Sender: TObject);
begin
Label15.Top := (Panel1.Height - 30) div 2 - Label15.Height div 2 + 25;
end;
end.

553
Forms/FormExportC.dfm Normal file
View File

@ -0,0 +1,553 @@
object ExportCDialog: TExportCDialog
Left = 313
Top = 276
BorderStyle = bsDialog
Caption = 'Export Flame'
ClientHeight = 134
ClientWidth = 496
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
OnShow = FormShow
DesignSize = (
496
134)
PixelsPerInch = 96
TextHeight = 13
object btnOK: TButton
Left = 254
Top = 98
Width = 115
Height = 25
Anchors = [akTop, akRight]
Caption = '&OK'
Default = True
ModalResult = 1
TabOrder = 0
OnClick = btnOKClick
end
object btnCancel: TButton
Left = 376
Top = 98
Width = 111
Height = 25
Anchors = [akTop, akRight]
Caption = 'Cancel'
ModalResult = 2
TabOrder = 1
end
object GroupBox1: TGroupBox
Left = 8
Top = 237
Width = 481
Height = 57
Anchors = [akLeft, akTop, akRight]
Caption = ' Destination '
TabOrder = 2
Visible = False
DesignSize = (
481
57)
object btnBrowse: TSpeedButton
Left = 448
Top = 19
Width = 24
Height = 24
Hint = 'Browse...'
Anchors = [akTop, akRight]
Flat = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
Glyph.Data = {
36030000424D3603000000000000360000002800000010000000100000000100
18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F
607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13
18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708
88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3
8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367
805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51
C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF
7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC
EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67
D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2
98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8
FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788
A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6
A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788
93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89
9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA
ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
ParentFont = False
ParentShowHint = False
ShowHint = True
OnClick = btnBrowseClick
end
object Label10: TPanel
Left = 8
Top = 20
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'File name'
ParentShowHint = False
ShowHint = True
TabOrder = 1
end
object txtFilename: TEdit
Left = 112
Top = 20
Width = 337
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
end
end
object GroupBox3: TGroupBox
Left = 256
Top = 10
Width = 233
Height = 79
Anchors = [akTop, akRight]
Caption = ' Quality '
TabOrder = 3
DesignSize = (
233
79)
object udOversample: TUpDown
Left = 212
Top = 44
Width = 12
Height = 21
Anchors = [akTop, akRight]
Associate = txtOversample
Min = 1
Max = 4
Position = 2
TabOrder = 2
end
object Label5: TPanel
Left = 8
Top = 20
Width = 113
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Filter radius'
ParentShowHint = False
ShowHint = True
TabOrder = 3
end
object txtFilterRadius: TEdit
Left = 120
Top = 20
Width = 105
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
OnChange = txtFilterRadiusChange
end
object Label3: TPanel
Left = 8
Top = 44
Width = 113
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Oversample'
ParentShowHint = False
ShowHint = True
TabOrder = 4
end
object txtOversample: TEdit
Left = 120
Top = 44
Width = 92
Height = 21
Anchors = [akLeft, akTop, akRight]
ReadOnly = True
TabOrder = 1
Text = '2'
OnChange = txtOversampleChange
end
end
object GroupBox2: TGroupBox
Left = 8
Top = 10
Width = 241
Height = 111
Anchors = [akLeft, akTop, akRight]
Caption = ' Size '
TabOrder = 4
DesignSize = (
241
111)
object Label13: TLabel
Left = 184
Top = 36
Width = 26
Height = 13
Anchors = [akLeft, akTop, akRight]
Caption = 'pixels'
Visible = False
end
object Label16: TLabel
Left = 168
Top = 22
Width = 15
Height = 36
Anchors = [akLeft, akTop, akRight]
Caption = '}'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -32
Font.Name = 'Times New Roman'
Font.Style = []
ParentFont = False
Visible = False
end
object chkMaintain: TCheckBox
Left = 8
Top = 76
Width = 225
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Maintain aspect ratio'
Checked = True
State = cbChecked
TabOrder = 0
OnClick = chkMaintainClick
end
object Label1: TPanel
Left = 8
Top = 20
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Width'
ParentShowHint = False
ShowHint = True
TabOrder = 3
end
object Label2: TPanel
Left = 8
Top = 44
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Height'
ParentShowHint = False
ShowHint = True
TabOrder = 4
end
object cbHeight: TComboBox
Left = 112
Top = 44
Width = 121
Height = 21
Anchors = [akLeft, akTop, akRight]
ItemHeight = 13
TabOrder = 2
OnChange = txtHeightChange
Items.Strings = (
'200'
'240'
'480'
'600'
'768'
'1024'
'1200'
'2048'
'2400')
end
object cbWidth: TComboBox
Left = 112
Top = 20
Width = 121
Height = 21
Anchors = [akLeft, akTop, akRight]
ItemHeight = 13
TabOrder = 1
OnChange = txtWidthChange
Items.Strings = (
'320'
'640'
'800'
'1024'
'1280'
'1600'
'1920'
'2048'
'2560'
'3200')
end
end
object GroupBox4: TGroupBox
Left = 8
Top = 392
Width = 377
Height = 113
Anchors = [akLeft, akTop, akRight]
Caption = ' Parameters '
TabOrder = 5
Visible = False
DesignSize = (
377
113)
object udStrips: TUpDown
Left = 172
Top = 52
Width = 12
Height = 21
Associate = txtStrips
Min = 1
Max = 512
Position = 1
TabOrder = 2
end
object Label7: TPanel
Left = 8
Top = 20
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Buffer depth'
ParentShowHint = False
ShowHint = True
TabOrder = 7
end
object Label8: TPanel
Left = 8
Top = 52
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Strips'
ParentShowHint = False
ShowHint = True
TabOrder = 8
end
object Label9: TPanel
Left = 8
Top = 84
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'DE Radius'
ParentShowHint = False
ShowHint = True
TabOrder = 9
end
object txtEstimator: TEdit
Left = 112
Top = 84
Width = 73
Height = 21
TabOrder = 3
Text = '5'
end
object txtStrips: TEdit
Left = 112
Top = 52
Width = 60
Height = 21
TabOrder = 1
Text = '1'
end
object cmbDepth: TComboBox
Left = 112
Top = 20
Width = 73
Height = 21
Style = csDropDownList
ItemHeight = 13
TabOrder = 0
Items.Strings = (
'16-bit'
'32-bit'
'32-bit float'
'64-bit')
end
object Label14: TPanel
Left = 192
Top = 20
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Gamma threshold'
ParentShowHint = False
ShowHint = True
TabOrder = 10
end
object Label12: TPanel
Left = 192
Top = 52
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'DE Curve'
ParentShowHint = False
ShowHint = True
TabOrder = 11
end
object Label11: TPanel
Left = 192
Top = 84
Width = 105
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'DE Minimum'
ParentShowHint = False
ShowHint = True
TabOrder = 12
end
object txtGammaTreshold: TEdit
Left = 296
Top = 20
Width = 73
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 6
Text = '0.01'
OnChange = txtGammaTresholdChange
end
object txtEstimatorCurve: TEdit
Left = 296
Top = 52
Width = 73
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 5
Text = '0.6'
end
object txtEstimatorMin: TEdit
Left = 296
Top = 84
Width = 73
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 4
Text = '0'
end
end
object chkRender: TCheckBox
Left = 392
Top = 398
Width = 89
Height = 43
Anchors = [akTop, akRight]
Caption = 'Render'
Checked = True
State = cbChecked
TabOrder = 6
Visible = False
end
object Panel1: TPanel
Left = 8
Top = 296
Width = 481
Height = 89
Anchors = [akLeft, akTop, akRight]
BevelKind = bkSoft
BevelOuter = bvNone
Color = clInfoBk
TabOrder = 7
Visible = False
DesignSize = (
477
85)
object Label6: TLabel
Left = 8
Top = 4
Width = 453
Height = 24
Alignment = taCenter
Anchors = [akLeft, akTop, akRight]
AutoSize = False
Caption = 'WARNING!'
Font.Charset = DEFAULT_CHARSET
Font.Color = clInfoText
Font.Height = -19
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object Label15: TLabel
Left = 8
Top = 25
Width = 447
Height = 26
Alignment = taCenter
Anchors = [akLeft, akRight]
Caption =
'Fractals created with this version of Apophysis are not supporte' +
'd by the external renderer! To render 2D-only fractals, download' +
' the latest version of FLAM3 from http://www.flam3.com'
Color = clInfoBk
Font.Charset = DEFAULT_CHARSET
Font.Color = clInfoText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ParentColor = False
ParentFont = False
WordWrap = True
end
end
object txtDensity: TEdit
Left = 120
Top = 212
Width = 105
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 8
Visible = False
OnChange = txtDensityChange
end
object Label4: TPanel
Left = 8
Top = 212
Width = 113
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Density'
ParentShowHint = False
ShowHint = True
TabOrder = 9
Visible = False
end
object SaveDialog: TSaveDialog
DefaultExt = 'jpg'
Filter =
'JPEG Image (*.jpg)|*.jpg|PPM Image (*.ppm)|*.ppm|PNG Images (*.p' +
'ng)|*.png'
Left = 464
Top = 264
end
end

257
Forms/FormExportC.pas Normal file
View File

@ -0,0 +1,257 @@
{
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 FormExportC;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ComCtrls, ExtCtrls, Translation;
type
TExportCDialog = class(TForm)
btnOK: TButton;
btnCancel: TButton;
GroupBox1: TGroupBox;
btnBrowse: TSpeedButton;
txtFilename: TEdit;
SaveDialog: TSaveDialog;
GroupBox3: TGroupBox;
txtOversample: TEdit;
txtFilterRadius: TEdit;
udOversample: TUpDown;
GroupBox2: TGroupBox;
chkMaintain: TCheckBox;
cbWidth: TComboBox;
cbHeight: TComboBox;
GroupBox4: TGroupBox;
cmbDepth: TComboBox;
chkRender: TCheckBox;
txtStrips: TEdit;
udStrips: TUpDown;
txtEstimator: TEdit;
txtEstimatorMin: TEdit;
txtEstimatorCurve: TEdit;
txtGammaTreshold: TEdit;
Panel1: TPanel;
Label6: TLabel;
Label15: TLabel;
Label13: TLabel;
Label16: TLabel;
Label5: TPanel;
Label3: TPanel;
Label1: TPanel;
Label2: TPanel;
Label7: TPanel;
Label8: TPanel;
Label9: TPanel;
Label14: TPanel;
Label12: TPanel;
Label11: TPanel;
Label10: TPanel;
txtDensity: TEdit;
Label4: TPanel;
procedure FormCreate(Sender: TObject);
procedure btnBrowseClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure txtWidthChange(Sender: TObject);
procedure chkMaintainClick(Sender: TObject);
procedure txtHeightChange(Sender: TObject);
procedure txtDensityChange(Sender: TObject);
procedure txtFilterRadiusChange(Sender: TObject);
procedure txtOversampleChange(Sender: TObject);
procedure txtGammaTresholdChange(Sender: TObject);
private
FloatFormatSettings: TFormatSettings;
Estimator, EstimatorMin, EstimatorCurve: double;
Jitters, Batches, Strips: integer;
public
Filename: string;
ImageWidth, ImageHeight, Oversample: Integer;
Sample_Density, Filter_Radius: double;
GammaTreshold: double;
end;
var
ExportCDialog: TExportCDialog;
Ratio: double;
implementation
uses Global, Main, ShellAPI;
{$R *.DFM}
procedure TExportCDialog.btnBrowseClick(Sender: TObject);
begin
SaveDialog.InitialDir := ExtractFileDir(txtFilename.text);
SaveDialog.Filename := txtFilename.Text;
SaveDialog.DefaultExt := 'png';
SaveDialog.filterIndex := ExportFileFormat;
SaveDialog.Filter := Format('%s|*.png|%s|*.*',
[TextByKey('common-filter-png'),
TextByKey('common-filter-allfiles')]);
if SaveDialog.Execute then
begin
ExportFileFormat := SaveDialog.FilterIndex;
renderPath := ExtractFilePath(SaveDialog.Filename);
end;
end;
procedure TExportCDialog.FormShow(Sender: TObject);
begin
txtFilename.Text := Filename;
cbWidth.Text := IntToStr(MainCp.Width);
cbHeight.Text := IntToStr(MainCp.Height);
ImageWidth := MainCp.Width;
ImageHeight := MainCp.Height;
txtDensity.text := FloatToStr(Sample_density);
// if cmbDepth.ItemIndex <> 2 then
// txtBatches.text := IntToStr(Round(Sample_density / 4));
txtFilterRadius.text := FloatToStr(Filter_Radius);
txtOversample.text := IntToSTr(Oversample);
udOversample.Position := Oversample;
Ratio := ImageWidth / ImageHeight;
Batches := 1;
Estimator := 9.0;
EstimatorMin := 0.0;
EstimatorCurve := 0.4;
Jitters := 1;
GammaTreshold := MainCP.gamma_threshold; //0.01;
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FloatFormatSettings);
txtEstimator.Text := FloatToStr(Estimator, FloatFormatSettings);
txtEstimatorMin.Text := FloatToStr(EstimatorMin, FloatFormatSettings);
txtEstimatorCurve.Text := FloatToStr(EstimatorCurve, FloatFormatSettings);
// txtJitters.Text := IntToStr(Jitters);
txtGammaTreshold.Text := FloatToStr(GammaTreshold, FloatFormatSettings);
end;
procedure TExportCDialog.btnOKClick(Sender: TObject);
begin
Filename := txtFilename.text;
ImageWidth := StrToInt(cbWidth.Text);
ImageHeight := StrToInt(cbHeight.Text);
end;
procedure TExportCDialog.txtWidthChange(Sender: TObject);
begin
try
ImageWidth := StrToInt(cbWidth.Text);
if chkMaintain.checked and cbWidth.Focused then
begin
ImageHeight := Round(ImageWidth / ratio);
cbHeight.Text := IntToStr(ImageHeight)
end;
except
end;
end;
procedure TExportCDialog.chkMaintainClick(Sender: TObject);
begin
Ratio := ImageWidth / ImageHeight;
end;
procedure TExportCDialog.txtHeightChange(Sender: TObject);
begin
try
ImageHeight := StrToInt(cbHeight.Text);
if chkMaintain.checked and cbHeight.Focused then
begin
ImageWidth := Round(ImageHeight * ratio);
cbWidth.Text := IntToStr(ImageWidth)
end;
except
end;
end;
procedure TExportCDialog.txtDensityChange(Sender: TObject);
begin
try
Sample_Density := StrToFloat(txtDensity.Text);
// if cmbDepth.ItemIndex <> 2 then
// txtBatches.text := IntToStr(Round(Sample_density / 4));
except
end;
end;
procedure TExportCDialog.txtFilterRadiusChange(Sender: TObject);
begin
try
Filter_Radius := StrToFloat(txtFilterRadius.Text);
except
end;
end;
procedure TExportCDialog.txtOversampleChange(Sender: TObject);
begin
if StrToInt(txtOversample.Text) > udOversample.Max then
txtOversample.Text := IntToStr(udOversample.Max);
if StrToInt(txtOversample.Text) < udOversample.Min then
txtOversample.Text := IntToStr(udOversample.Min);
try
Oversample := StrToInt(txtOversample.Text);
except
end;
end;
procedure TExportCDialog.txtGammaTresholdChange(Sender: TObject);
begin
//GammaTreshold := 0.01;
try
GammaTreshold := StrToFloat(txtGammaTreshold.Text, FloatFormatSettings);
except
end;
end;
procedure TExportCDialog.FormCreate(Sender: TObject);
begin
btnOK.Caption := TextByKey('common-ok');
btnCancel.Caption := TextByKey('common-cancel');
Label1.Caption := TextByKey('common-width');
Label2.Caption := TextByKey('common-height');
GroupBox2.Caption := TextByKey('common-size');
Label13.Caption := TextByKey('common-pixels');
chkMaintain.Caption := TextByKey('common-keepaspect');
GroupBox1.Caption := TextByKey('common-destination');
Label10.Caption := TextByKey('common-filename');
btnBrowse.Hint := TextByKey('common-browse');
GroupBox3.Caption := TextByKey('common-quality');
Label5.Caption := TextByKey('common-filterradius');
Label4.Caption := TextByKey('common-density');
Label3.Caption := TextByKey('common-oversample');
Label14.Caption := TextByKey('common-gammathreshold');
self.Caption := TextByKey('main-menu-file-exportchaotica');
GroupBox4.Caption := TextByKey('export-paramoptions-title');
Label7.Caption := TextByKey('export-paramoptions-bufferdepth');
Label8.Caption := TextByKey('export-paramoptions-strips');
Label9.Caption := TextByKey('export-paramoptions-estimatorradius');
Label12.Caption := TextByKey('export-paramoptions-estimatorcurve');
Label11.Caption := TextByKey('export-paramoptions-estimatormin');
chkRender.Caption := TextByKey('export-paramoptions-dorender');
Label6.Caption := TextByKey('export-paramoptions-warningtitle');
Label15.Caption := TextByKey('export-paramoptions-warningtext');
end;
end.

115
Forms/FormFavorites.dfm Normal file
View File

@ -0,0 +1,115 @@
object FavoritesForm: TFavoritesForm
Left = 493
Top = 541
BorderStyle = bsDialog
Caption = 'Favorite Scripts'
ClientHeight = 275
ClientWidth = 352
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
DesignSize = (
352
275)
PixelsPerInch = 96
TextHeight = 13
object PageControl1: TPageControl
Left = 8
Top = 8
Width = 338
Height = 231
Anchors = [akLeft, akTop, akRight, akBottom]
TabOrder = 0
end
object ListView: TListView
Left = 16
Top = 16
Width = 218
Height = 215
Anchors = [akLeft, akTop, akRight, akBottom]
Columns = <
item
AutoSize = True
Caption = 'Name'
end>
HideSelection = False
ReadOnly = True
RowSelect = True
ShowColumnHeaders = False
TabOrder = 1
ViewStyle = vsReport
OnChange = ListViewChange
end
object btnAdd: TButton
Left = 241
Top = 16
Width = 99
Height = 25
Anchors = [akTop, akRight]
Caption = '&Add'
TabOrder = 2
TabStop = False
OnClick = btnAddClick
end
object btnRemove: TButton
Left = 241
Top = 48
Width = 99
Height = 25
Anchors = [akTop, akRight]
Caption = '&Remove'
TabOrder = 3
TabStop = False
OnClick = btnRemoveClick
end
object btnMoveUp: TButton
Left = 241
Top = 80
Width = 99
Height = 25
Anchors = [akTop, akRight]
Caption = 'Move &Up'
TabOrder = 4
TabStop = False
OnClick = btnMoveUpClick
end
object btnMoveDown: TButton
Left = 241
Top = 112
Width = 99
Height = 25
Anchors = [akTop, akRight]
Caption = 'Move &Down'
TabOrder = 5
TabStop = False
OnClick = btnMoveDownClick
end
object btnOK: TButton
Left = 193
Top = 246
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = '&OK'
TabOrder = 6
OnClick = btnOKClick
end
object btnCancel: TButton
Left = 273
Top = 246
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = '&Cancel'
TabOrder = 7
OnClick = btnCancelClick
end
end

224
Forms/FormFavorites.pas Normal file
View File

@ -0,0 +1,224 @@
{
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 FormFavorites;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls, Translation;
type
TFavoritesForm = class(TForm)
PageControl1: TPageControl;
ListView: TListView;
btnAdd: TButton;
btnRemove: TButton;
btnMoveUp: TButton;
btnMoveDown: TButton;
btnOK: TButton;
btnCancel: TButton;
procedure FormShow(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnAddClick(Sender: TObject);
procedure btnRemoveClick(Sender: TObject);
procedure ListViewChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
procedure btnMoveUpClick(Sender: TObject);
procedure btnMoveDownClick(Sender: TObject);
private
{ Private declarations }
public
Faves: TStringList;
{ Public declarations }
end;
var
FavoritesForm: TFavoritesForm;
implementation
uses Global, ScriptForm;
{$R *.DFM}
procedure TFavoritesForm.FormShow(Sender: TObject);
var
ListItem: TListItem;
i: integer;
s: string;
begin
Faves.Text := Favorites.text;
ListView.Items.Clear;
for i := 0 to Favorites.Count - 1 do
begin
ListItem := ListView.Items.Add;
s := ExtractFileName(Favorites[i]);
s := Copy(s, 0, length(s) - Length(ExtractFileExt(s)));
Listitem.Caption := s;
end;
if Favorites.Count <> 0 then ListView.Selected := ListView.Items[0]
else
btnRemove.Enabled := False;
if ListView.Items.Count <= 1 then
begin
btnMoveUp.Enabled := False;
btnMoveDown.Enabled := False;
end;
end;
procedure TFavoritesForm.btnCancelClick(Sender: TObject);
begin
Close
end;
procedure TFavoritesForm.btnOKClick(Sender: TObject);
begin
ModalResult := mrOK;
Faves.SaveToFile(AppPath + scriptFavsFilename);
end;
procedure TFavoritesForm.FormCreate(Sender: TObject);
begin
btnOK.Caption := TextByKey('common-ok');
btnCancel.Caption := TextByKey('common-cancel');
self.Caption := TextByKey('favscripts-title');
btnAdd.Caption := TextByKey('favscripts-add');
btnRemove.Caption := TextByKey('favscripts-remove');
btnMoveUp.Caption := TextByKey('favscripts-moveup');
btnMoveDown.Caption := TextByKey('favscripts-movedown');
Faves := TStringList.Create;
end;
procedure TFavoritesForm.FormDestroy(Sender: TObject);
begin
Faves.Free;
end;
procedure TFavoritesForm.btnAddClick(Sender: TObject);
var
ListItem: TListItem;
i : integer;
s: string;
begin
ScriptEditor.MainOpenDialog.InitialDir := ScriptPath;
ScriptEditor.MainOpenDialog.Filter := Format('%s|*.aposcript;*.asc|%s|*.*',
[TextByKey('common-filter-script'),
TextByKey('common-filter-allfiles')]);
if ScriptEditor.mainOpenDialog.Execute then
begin
for i := 0 to Faves.Count - 1 do
begin
if ScriptEditor.MainOpenDialog.Filename = Faves[i] then exit;
end;
Faves.add(ScriptEditor.MainOpenDialog.Filename);
ListItem := ListView.Items.Add;
s := ExtractFileName(ScriptEditor.MainOpenDialog.Filename);
s := Copy(s, 0, length(s) - Length(ExtractFileExt(s)));
Listitem.Caption := s;
ListView.Selected := ListView.Items[ListView.Items.Count - 1];
btnRemove.Enabled := True;
end;
if ListView.Items.Count <= 1 then
begin
btnMoveUp.Enabled := False;
btnMoveDown.Enabled := False;
end;
end;
procedure TFavoritesForm.btnRemoveClick(Sender: TObject);
var
i: integer;
begin
i := ListView.Selected.Index;
Faves.Delete(i);
ListView.Items[i].delete;
if ListView.Items.Count <> 0 then
if i < ListView.Items.Count then
ListView.Selected := ListView.Items[i]
else
ListView.Selected := ListView.Items[ListView.Items.Count - 1]
else
btnRemove.Enabled := False;
if ListView.Items.Count <= 1 then
begin
btnMoveUp.Enabled := False;
btnMoveDown.Enabled := False;
end;
end;
procedure TFavoritesForm.ListViewChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
begin
if (Item.Index = ListView.Items.Count - 1) then
btnMoveDown.Enabled := False
else
btnMoveDown.Enabled := True;
if (Item.Index = 0) then
btnMoveUp.Enabled := False
else
btnMoveUp.Enabled := True;
if (ListView.Items.Count <= 1) then
begin
btnMoveDown.Enabled := False;
btnMoveUp.Enabled := False;
end;
end;
procedure TFavoritesForm.btnMoveUpClick(Sender: TObject);
var
i: integer;
s: string;
begin
i := ListView.Selected.Index;
s := faves[i];
Faves[i] := Faves[i - 1];
Faves[i - 1] := s;
s := ListView.Selected.Caption;
ListView.Selected.Caption := Listview.Items[i - 1].Caption;
ListView.Items[i - 1].Caption := s;
ListView.Selected := ListView.Items[i - 1];
end;
procedure TFavoritesForm.btnMoveDownClick(Sender: TObject);
var
i: integer;
s: string;
begin
i := ListView.Selected.Index;
s := faves[i];
Faves[i] := Faves[i + 1];
Faves[i + 1] := s;
s := ListView.Selected.Caption;
ListView.Selected.Caption := Listview.Items[i + 1].Caption;
ListView.Items[i + 1].Caption := s;
ListView.Selected := ListView.Items[i + 1];
end;
end.

723
Forms/FormRender.dfm Normal file
View File

@ -0,0 +1,723 @@
object RenderForm: TRenderForm
Left = 851
Top = 205
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Render to Disk'
ClientHeight = 469
ClientWidth = 497
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
DesignSize = (
497
469)
PixelsPerInch = 96
TextHeight = 13
object btnRender: TButton
Left = 256
Top = 420
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Start'
Default = True
TabOrder = 0
OnClick = btnRenderClick
end
object btnCancel: TButton
Left = 416
Top = 420
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Close'
TabOrder = 1
OnClick = btnCancelClick
end
object btnPause: TButton
Left = 336
Top = 420
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Pause'
TabOrder = 2
OnClick = btnPauseClick
end
object PageCtrl: TPageControl
Left = 8
Top = 8
Width = 481
Height = 373
ActivePage = TabSettings
Anchors = [akLeft, akTop, akRight, akBottom]
Images = MainForm.Buttons
TabOrder = 3
object TabSettings: TTabSheet
Caption = 'Settings'
ImageIndex = 18
DesignSize = (
473
344)
object btnBrowse: TSpeedButton
Left = 416
Top = 11
Width = 24
Height = 24
Hint = 'Browse...'
Anchors = [akTop, akRight]
Flat = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
Glyph.Data = {
36030000424D3603000000000000360000002800000010000000100000000100
18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F
607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13
18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708
88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3
8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367
805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51
C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF
7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC
EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67
D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2
98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8
FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788
A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6
A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788
93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89
9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA
ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
ParentFont = False
ParentShowHint = False
ShowHint = True
OnClick = btnBrowseClick
end
object btnGoTo: TSpeedButton
Left = 440
Top = 11
Width = 24
Height = 24
Hint = 'Browse...'
Anchors = [akTop, akRight]
Flat = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
Glyph.Data = {
36030000424D3603000000000000360000002800000010000000100000000100
18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FF964924EADBD3FF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF9D
4D259D4E28EADBD3FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFCF835D9247239A4B25A24F27AB5429BF6A3FA0502AEADBD3FF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFD78B65FDB089F7905CEC8856DE
7F4FD17648C46E42A25631EADBD3FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFDE926CFCB997FDA578FC935EF28C59E58453D87B4CC66E41AE582BFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFE49872FBC3A6FDBE9EFEAE85FF
A87DF89D6FE58351AE582BF4E7E1FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFE89C76E29670DA8E68D1855FDB906AF79A6BAE582BF4E7E1FF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFE5
9973C5764EF3E6DFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFE89C76F8EDE8FF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
ParentFont = False
ParentShowHint = False
ShowHint = True
OnClick = btnGoToClick
end
object GroupBox5: TGroupBox
Left = 464
Top = 16
Width = 425
Height = 57
Caption = 'Preset'
TabOrder = 0
Visible = False
object btnSavePreset: TSpeedButton
Left = 368
Top = 18
Width = 24
Height = 24
Hint = 'Save Preset'
Flat = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentFont = False
ParentShowHint = False
ShowHint = True
OnClick = btnSavePresetClick
end
object btnDeletePreset: TSpeedButton
Left = 392
Top = 18
Width = 24
Height = 24
Hint = 'Delete Preset'
Flat = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentFont = False
ParentShowHint = False
ShowHint = True
OnClick = btnDeletePresetClick
end
object cmbPreset: TComboBox
Left = 10
Top = 20
Width = 351
Height = 21
Style = csDropDownList
TabOrder = 0
OnChange = cmbPresetChange
end
end
object GroupBox2: TGroupBox
Left = 8
Top = 42
Width = 233
Height = 95
Anchors = [akLeft, akTop, akRight]
Caption = 'Size'
TabOrder = 1
DesignSize = (
233
95)
object Label6: TLabel
Left = 144
Top = 22
Width = 15
Height = 36
Caption = '}'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -32
Font.Name = 'Times New Roman'
Font.Style = []
ParentFont = False
Visible = False
end
object Label7: TLabel
Left = 160
Top = 36
Width = 26
Height = 13
Caption = 'pixels'
Visible = False
end
object chkMaintain: TCheckBox
Left = 8
Top = 70
Width = 217
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Keep aspect ratio'
Checked = True
State = cbChecked
TabOrder = 0
OnClick = chkMaintainClick
end
object pnlWidth: TPanel
Left = 8
Top = 20
Width = 113
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Width'
TabOrder = 3
end
object pnlHeight: TPanel
Left = 8
Top = 44
Width = 113
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Height'
TabOrder = 4
end
object cbHeight: TComboBox
Left = 120
Top = 44
Width = 105
Height = 21
Anchors = [akLeft, akTop, akRight]
BiDiMode = bdLeftToRight
Enabled = False
ParentBiDiMode = False
TabOrder = 2
OnChange = txtHeightChange
Items.Strings = (
'200'
'240'
'480'
'600'
'768'
'1024'
'1200'
'1920'
'2048'
'2400')
end
object cbWidth: TComboBox
Left = 120
Top = 20
Width = 105
Height = 21
Anchors = [akLeft, akTop, akRight]
BiDiMode = bdLeftToRight
Enabled = False
ParentBiDiMode = False
TabOrder = 1
OnChange = txtWidthChange
Items.Strings = (
'320'
'640'
'800'
'1024'
'1280'
'1600'
'1920'
'2048'
'2560'
'3200')
end
end
object GroupBox3: TGroupBox
Left = 248
Top = 42
Width = 218
Height = 95
Anchors = [akTop, akRight]
Caption = 'Quality settings'
TabOrder = 2
DesignSize = (
218
95)
object udOversample: TUpDown
Left = 196
Top = 68
Width = 13
Height = 21
Anchors = [akTop, akRight]
Associate = txtOversample
Min = 1
Max = 16
Position = 1
TabOrder = 3
end
object pnlDensity: TPanel
Left = 8
Top = 20
Width = 121
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Density'
TabOrder = 4
end
object pnlFilter: TPanel
Left = 8
Top = 44
Width = 121
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Filter radius'
TabOrder = 5
end
object pnlOversample: TPanel
Left = 8
Top = 68
Width = 121
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Oversample'
TabOrder = 6
end
object txtDensity: TComboBox
Left = 128
Top = 20
Width = 82
Height = 21
AutoComplete = False
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
OnChange = txtDensityChange
OnCloseUp = txtDensityChange
Items.Strings = (
'200'
'500'
'1000'
'2000'
'4000')
end
object txtFilterRadius: TEdit
Left = 128
Top = 44
Width = 82
Height = 21
Anchors = [akLeft, akTop, akRight]
BiDiMode = bdRightToLeft
ParentBiDiMode = False
TabOrder = 1
Text = '0.1'
OnChange = txtFilterRadiusChange
end
object txtOversample: TEdit
Left = 128
Top = 68
Width = 68
Height = 21
Anchors = [akLeft, akTop, akRight]
BiDiMode = bdRightToLeft
Enabled = False
ParentBiDiMode = False
ReadOnly = True
TabOrder = 2
Text = '1'
OnChange = txtOversampleChange
end
end
object GroupBox4: TGroupBox
Left = 8
Top = 142
Width = 458
Height = 99
Anchors = [akLeft, akTop, akRight]
Caption = 'Resource usage'
TabOrder = 3
DesignSize = (
458
99)
object lblApproxMem: TLabel
Left = 439
Top = 100
Width = 42
Height = 13
Alignment = taRightJustify
Caption = '0000 Mb'
Visible = False
end
object lblPhysical: TLabel
Left = 439
Top = 96
Width = 42
Height = 13
Alignment = taRightJustify
Caption = '0000 Mb'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
Visible = False
end
object lblMaxbits: TLabel
Left = 440
Top = 116
Width = 33
Height = 13
Hint = '- No render stats -'
Alignment = taRightJustify
Caption = '99.999'
ParentShowHint = False
ShowHint = True
Visible = False
end
object Label9: TLabel
Left = 440
Top = 108
Width = 96
Height = 13
Hint = '- No render stats -'
Caption = 'Max bits per sample:'
ParentShowHint = False
ShowHint = True
Visible = False
end
object lblMemory: TLabel
Left = 11
Top = 18
Width = 442
Height = 24
Anchors = [akLeft, akTop, akRight]
AutoSize = False
Caption =
'The render process will use 0000 Mb of 0000MB available physical' +
' memory'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
Layout = tlCenter
WordWrap = True
end
object lblCPUCores: TLabel
Left = 11
Top = 43
Width = 442
Height = 14
Anchors = [akLeft, akTop, akRight]
AutoSize = False
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
Layout = tlCenter
WordWrap = True
end
object chkLimitMem: TCheckBox
Left = 444
Top = 134
Width = 125
Height = 17
Caption = 'Limit memory usage to:'
TabOrder = 0
Visible = False
end
object pnlLimit: TPanel
Left = 8
Top = 68
Width = 121
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Memory limit'
TabOrder = 2
end
object cbMaxMemory: TComboBox
Left = 128
Top = 68
Width = 97
Height = 21
Style = csDropDownList
BiDiMode = bdLeftToRight
ItemIndex = 0
ParentBiDiMode = False
TabOrder = 1
Text = 'No limit'
OnChange = cbMaxMemoryChange
Items.Strings = (
'No limit'
'32'
'64'
'128'
'256'
'512'
'1024'
'1536')
end
object PBMem: TProgressBar
Left = 232
Top = 68
Width = 217
Height = 21
TabOrder = 3
end
end
object GroupBox1: TGroupBox
Left = 8
Top = 253
Width = 217
Height = 81
Caption = 'Output options'
TabOrder = 5
DesignSize = (
217
81)
object chkSave: TCheckBox
Left = 8
Top = 24
Width = 201
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Save parameters'
Checked = True
State = cbChecked
TabOrder = 0
end
object chkSaveIncompleteRenders: TCheckBox
Left = 8
Top = 48
Width = 201
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Save incomplete renders'
TabOrder = 1
OnClick = chkSaveIncompleteRendersClick
end
end
object GroupBox6: TGroupBox
Left = 232
Top = 253
Width = 234
Height = 81
Anchors = [akLeft, akTop, akRight]
Caption = 'Completion options'
TabOrder = 6
DesignSize = (
234
81)
object chkPostProcess: TCheckBox
Left = 8
Top = 24
Width = 217
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Post-process after completion'
TabOrder = 0
end
object chkShutdown: TCheckBox
Left = 8
Top = 48
Width = 217
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Shut down computer when complete'
TabOrder = 1
end
end
object pnlTarget: TPanel
Left = 8
Top = 12
Width = 121
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Destination'
TabOrder = 7
end
object txtFilename: TEdit
Left = 128
Top = 12
Width = 288
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 4
OnChange = txtFilenameChange
end
object chkBinary: TCheckBox
Left = 8
Top = 349
Width = 457
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption =
'Write raw data (WARNING: this is experimental and slows down the' +
' rendering!!!)'
Enabled = False
TabOrder = 8
Visible = False
end
end
object TabOutput: TTabSheet
Caption = 'Output'
ImageIndex = 38
object Output: TMemo
Left = 0
Top = 0
Width = 473
Height = 344
Align = alClient
BorderStyle = bsNone
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clBtnText
Font.Height = -11
Font.Name = 'Courier New'
Font.Style = []
ParentFont = False
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 0
end
end
end
object StatusBar: TStatusBar
Left = 0
Top = 450
Width = 497
Height = 19
Panels = <
item
Width = 161
end
item
Width = 150
end
item
Width = 50
end>
end
object btnSaveLog: TButton
Left = 8
Top = 419
Width = 73
Height = 25
Anchors = [akLeft, akBottom]
Caption = 'Save log'
Enabled = False
TabOrder = 5
Visible = False
OnClick = btnSaveLogClick
end
object ProgressBar2: TProgressBar
Left = 8
Top = 388
Width = 481
Height = 25
Anchors = [akLeft, akRight, akBottom]
TabOrder = 6
end
object SaveDialog: TSaveDialog
Left = 168
Top = 464
end
end

1311
Forms/FormRender.pas Normal file

File diff suppressed because it is too large Load Diff

59
Forms/Fullscreen.dfm Normal file
View File

@ -0,0 +1,59 @@
object FullscreenForm: TFullscreenForm
Left = 439
Top = 325
BorderStyle = bsNone
Caption = 'FullscreenForm'
ClientHeight = 131
ClientWidth = 186
Color = clBlack
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PopupMenu = FullscreenPopup
OnClose = FormClose
OnCreate = FormCreate
OnDblClick = ImageDblClick
OnDestroy = FormDestroy
OnKeyPress = FormKeyPress
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Image: TImage
Left = 0
Top = 0
Width = 186
Height = 131
PopupMenu = FullscreenPopup
OnDblClick = ImageDblClick
end
object Timelimiter: TTimer
Enabled = False
Interval = 2000
OnTimer = TimelimiterOnTimer
Left = 8
Top = 8
end
object FullscreenPopup: TPopupMenu
Left = 40
Top = 8
object RenderStop: TMenuItem
Caption = '&Stop Render'
OnClick = RenderStopClick
end
object RenderMore: TMenuItem
Caption = 'Render &More'
ShortCut = 114
OnClick = RenderMoreClick
end
object N1: TMenuItem
Caption = '-'
end
object Exit1: TMenuItem
Caption = '&Close'
OnClick = ImageDblClick
end
end
end

343
Forms/Fullscreen.pas Normal file
View File

@ -0,0 +1,343 @@
{
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 Fullscreen;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls, ControlPoint, RenderThread, Translation;
type
TFullscreenForm = class(TForm)
Image: TImage;
Timelimiter: TTimer;
FullscreenPopup: TPopupMenu;
RenderStop: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
RenderMore: TMenuItem;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure ImageDblClick(Sender: TObject);
procedure TimelimiterOnTimer(Sender: TObject);
procedure RenderStopClick(Sender: TObject);
procedure RenderMoreClick(Sender: TObject);
private
Remainder, StartTime, t: double;
imgLeft, imgTop,
imgWidth, imgHeight: integer;
Closing: boolean;
Renderer: TRenderThread;
procedure showTaskbar;
procedure hideTaskbar;
procedure DrawFlame;
procedure OnProgress(prog: double);
procedure HandleThreadCompletion(var Message: TMessage);
message WM_THREAD_COMPLETE;
procedure HandleThreadTermination(var Message: TMessage);
message WM_THREAD_TERMINATE;
public
Calculate : boolean;
cp: TControlPoint;
Zoom: double;
center: array[0..1] of double;
ActiveForm: TForm;
end;
var
FullscreenForm: TFullscreenForm;
implementation
uses
Main, Math, Global,
Tracer;
{$R *.DFM}
procedure Trace1(const str: string);
begin
if TraceLevel >= 1 then
TraceForm.FullscreenTrace.Lines.Add('. ' + str);
end;
procedure Trace2(const str: string);
begin
if TraceLevel >= 2 then
TraceForm.FullscreenTrace.Lines.Add('. . ' + str);
end;
procedure TFullscreenForm.DrawFlame;
var
r: double;
begin
if (cp.width / cp.height) > (ClientWidth / ClientHeight) then
begin
imgWidth := ClientWidth;
r := cp.width / imgWidth;
imgHeight := round(cp.height / r);
imgLeft := 1;
imgTop := (ClientHeight - imgHeight) div 2;
end
else begin
imgHeight := ClientHeight;
r := cp.height / imgHeight;
imgWidth := round(cp.Width / r);
imgTop := 1;
imgLeft := (ClientWidth - ImgWidth) div 2;
end;
cp.AdjustScale(imgWidth, imgHeight);
// cp.Zoom := MainForm.Zoom;
// cp.center[0] := MainForm.center[0];
// cp.center[1] := MainForm.center[1];
cp.sample_density := defSampleDensity;
StartTime := Now;
t := now;
Remainder := 1;
if Assigned(Renderer) then begin // hmm...
Trace2('Killing previous RenderThread #' + inttostr(Renderer.ThreadID));
Renderer.Terminate;
Renderer.WaitFor;
while Renderer <> nil do
Application.ProcessMessages; // HandleThreadTermination kinda should be called here...(?)
end;
assert(not assigned(renderer), 'Render thread is still running!?');
Renderer := TRenderThread.Create; // Hmm... Why do we use RenderThread here, anyway? :-\
Renderer.TargetHandle := Handle;
Renderer.OnProgress := OnProgress;
Renderer.NrThreads := NrTreads;
if TraceLevel > 0 then Renderer.Output := TraceForm.FullscreenTrace.Lines;
Renderer.SetCP(cp);
Renderer.WaitForMore := true;
RenderStop.Enabled := true;
RenderMore.Enabled := false;
Renderer.Resume;
end;
procedure TFullscreenForm.HandleThreadCompletion(var Message: TMessage);
var
bm: TBitmap;
begin
Trace2(MsgComplete + IntToStr(message.LParam));
if not Assigned(Renderer) then begin
Trace2(MsgNotAssigned);
exit;
end;
if Renderer.ThreadID <> message.LParam then begin
Trace2(MsgAnotherRunning);
exit;
end;
if Assigned(Renderer) then
begin
bm := TBitmap.Create;
bm.assign(Renderer.GetImage);
Image.SetBounds(imgLeft, imgTop, imgWidth, imgHeight);
Image.Picture.Graphic := bm;
bm.Free;
end;
RenderStop.Enabled := false;
RenderMore.Enabled := true;
TimeLimiter.Enabled := false;
end;
procedure TFullscreenForm.HandleThreadTermination(var Message: TMessage);
var
bm: TBitmap;
begin
Trace2(MsgTerminated + IntToStr(message.LParam));
if not Assigned(Renderer) then begin
Trace2(MsgNotAssigned);
exit;
end;
if Renderer.ThreadID <> message.LParam then begin
Trace2(MsgAnotherRunning);
exit;
end;
RenderStop.Enabled := false;
RenderMore.Enabled := false;
TimeLimiter.Enabled := false;
end;
procedure TFullscreenForm.OnProgress(prog: double);
begin
prog := (Renderer.Slice + Prog) / Renderer.NrSlices;
Canvas.Lock;
try
if prog >= 1 then
begin
Canvas.Brush.Color := clBlack;
Canvas.FillRect(Rect(5, ClientHeight - 15, ClientWidth - 5, ClientHeight - 5));
end
else if prog >= 0 then begin
Canvas.Brush.Color := clTeal;
Canvas.FrameRect(Rect(5, ClientHeight - 15, ClientWidth - 5, ClientHeight - 5));
Canvas.Brush.Color := clTeal;
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));
end;
finally
Canvas.Unlock;
end;
//Application.ProcessMessages;
end;
procedure TFullscreenForm.hideTaskbar;
var wndHandle: THandle;
wndClass: array[0..50] of Char;
begin
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_HIDE);
end;
procedure TFullscreenForm.showTaskbar;
var wndHandle: THandle;
wndClass: array[0..50] of Char;
begin
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_RESTORE);
end;
procedure TFullscreenForm.FormShow(Sender: TObject);
begin
Trace1('--- Opening Fullscreen View ---');
if Image.Width < ClientWidth then
Image.Left := (ClientWidth - Image.Width) div 2;
if Image.Height < ClientHeight then
Image.Top := (ClientHeight - Image.Height) div 2;
Closing := false;
TimeLimiter.Enabled := false;
RenderStop.Enabled := false;
RenderMore.Enabled := false;
MainForm.mnuFullScreen.enabled := true;
HideTaskbar;
if calculate then
DrawFlame;
end;
procedure TFullscreenForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Closing := true;
if Assigned(Renderer) then begin
if Renderer.Suspended then begin
Renderer.WaitForMore := false;
Renderer.Resume;
end;
Trace2('Form closing: killing RenderThread #' + inttostr(Renderer.ThreadID));
Renderer.Terminate;
Renderer.WaitFor;
Trace2('Destroying RenderThread #' + IntToStr(Renderer.ThreadID));
Renderer.Free;
Renderer := nil;
end;
Trace1('--- Closing Fullscreen View ---');
Trace1('');
ShowTaskbar;
ActiveForm.SetFocus;
end;
procedure TFullscreenForm.FormCreate(Sender: TObject);
begin
Exit1.Caption := TextByKey('common-close');
RenderMore.Caption := TextByKey('fullscreen-popup-rendermore');
RenderStop.Caption := TextByKey('fullscreen-popup-stoprender');
cp := TControlPoint.Create;
end;
procedure TFullscreenForm.FormDestroy(Sender: TObject);
begin
if assigned(Renderer) then begin
Renderer.Terminate;
Renderer.WaitFor;
Renderer.Free;
end;
cp.Free;
end;
procedure TFullscreenForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = ' ' then begin
if RenderStop.Enabled then RenderStop.Click
else if RenderMore.Enabled then RenderMore.Click;
end
else Close;
end;
procedure TFullscreenForm.ImageDblClick(Sender: TObject);
begin
Close;
end;
procedure TFullscreenForm.TimelimiterOnTimer(Sender: TObject);
begin
//if assigned(Renderer) then Renderer.Break;
TimeLimiter.Enabled := false;
end;
procedure TFullscreenForm.RenderStopClick(Sender: TObject);
begin
if assigned(Renderer) then Renderer.BreakRender;
end;
procedure TFullscreenForm.RenderMoreClick(Sender: TObject);
begin
if assigned(Renderer) and Renderer.Suspended then begin
Renderer.Resume;
RenderStop.Enabled := true;
RenderMore.Enabled := false;
end;
end;
end.

315
Forms/ImageColoring.dfm Normal file
View File

@ -0,0 +1,315 @@
object frmImageColoring: TfrmImageColoring
Left = 419
Top = 408
Width = 581
Height = 365
Caption = 'Image coloring'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 16
Top = 40
Width = 54
Height = 13
Caption = 'First Palete'
end
object Label2: TLabel
Left = 16
Top = 168
Width = 72
Height = 13
Caption = 'Second palette'
end
object Label3: TLabel
Left = 296
Top = 36
Width = 30
Height = 13
Caption = 'Image'
end
object Label4: TLabel
Left = 16
Top = 107
Width = 57
Height = 13
Alignment = taCenter
AutoSize = False
Caption = 'Preset'
end
object Label5: TLabel
Left = 16
Top = 235
Width = 57
Height = 13
Alignment = taCenter
AutoSize = False
Caption = 'Preset'
end
object cbEnable: TCheckBox
Left = 16
Top = 8
Width = 133
Height = 17
Caption = 'Enable image coloring'
TabOrder = 0
end
object Panel1: TPanel
Left = 16
Top = 56
Width = 258
Height = 40
BevelOuter = bvLowered
TabOrder = 1
object imgPal1: TImage
Left = 1
Top = 1
Width = 256
Height = 38
Align = alClient
Stretch = True
end
end
object Panel2: TPanel
Left = 16
Top = 188
Width = 258
Height = 40
BevelOuter = bvLowered
TabOrder = 2
object imgpal2: TImage
Left = 1
Top = 1
Width = 256
Height = 38
Align = alClient
Stretch = True
end
end
object Panel3: TPanel
Left = 292
Top = 60
Width = 258
Height = 258
BevelOuter = bvLowered
TabOrder = 3
end
object cmbPalette1: TComboBox
Left = 80
Top = 106
Width = 177
Height = 19
Style = csOwnerDrawFixed
Color = clBlack
DropDownCount = 20
Font.Charset = ANSI_CHARSET
Font.Color = clWhite
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ItemHeight = 13
ParentFont = False
ParentShowHint = False
ShowHint = False
TabOrder = 4
OnChange = cmbPalette1Change
OnDrawItem = cmbPalette1DrawItem
Items.Strings = (
'south-sea-bather'
'sky-flesh'
'blue-bather'
'no-name'
'pillows'
'mauve-splat'
'facial-treescape 6'
'fasion-bug'
'leafy-face'
'mouldy-sun'
'sunny-harvest'
'peach-tree'
'fire-dragon'
'ice-dragon'
'german-landscape'
'no-name'
'living-mud-bomb'
'cars'
'unhealthy-tan'
'daffodil'
'rose'
'healthy-skin'
'orange'
'white-ivy'
'summer-makeup'
'glow-buzz'
'deep-water'
'afternoon-beach'
'dim-beach'
'cloudy-brick'
'burning-wood'
'aquatic-garden'
'no-name'
'fall-quilt'
'night-blue-sky'
'shadow-iris'
'solid-sky'
'misty-field'
'wooden-highlight'
'jet-tundra'
'pastel-lime'
'hell'
'indian-coast'
'dentist-decor'
'greenland'
'purple-dress'
'no-name'
'spring-flora'
'andi'
'gig-o835'
'rie02'
'rie05'
'rie11'
'etretat.ppm'
'the-hollow-needle-at-etretat.ppm'
'rouen-cathedral-sunset.ppm'
'the-houses-of-parliament.ppm'
'starry-night.ppm'
'water-lilies-sunset.ppm'
'gogh.chambre-arles.ppm'
'gogh.entrance.ppm'
'gogh.the-night-cafe.ppm'
'gogh.vegetable-montmartre.ppm'
'matisse.bonheur-vivre.ppm'
'matisse.flowers.ppm'
'matisse.lecon-musique.ppm'
'modigliani.nude-caryatid.ppm'
'braque.instruments.ppm'
'calcoast09.ppm'
'dodge102.ppm'
'ernst.anti-pope.ppm'
'ernst.ubu-imperator.ppm'
'fighting-forms.ppm'
'fog25.ppm'
'geyser27.ppm'
'gris.josette.ppm'
'gris.landscape-ceret.ppm'
'kandinsky.comp-9.ppm'
'kandinsky.yellow-red-blue.ppm'
'klee.insula-dulcamara.ppm'
'nile.ppm'
'picasso.jfille-chevre.ppm'
'pollock.lavender-mist.ppm'
'yngpaint.ppm')
end
object cmbPalette2: TComboBox
Left = 80
Top = 234
Width = 177
Height = 19
Style = csOwnerDrawFixed
Color = clBlack
DropDownCount = 20
Font.Charset = ANSI_CHARSET
Font.Color = clWhite
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ItemHeight = 13
ParentFont = False
ParentShowHint = False
ShowHint = False
TabOrder = 5
OnChange = cmbPalette2Change
OnDrawItem = cmbPalette1DrawItem
Items.Strings = (
'south-sea-bather'
'sky-flesh'
'blue-bather'
'no-name'
'pillows'
'mauve-splat'
'facial-treescape 6'
'fasion-bug'
'leafy-face'
'mouldy-sun'
'sunny-harvest'
'peach-tree'
'fire-dragon'
'ice-dragon'
'german-landscape'
'no-name'
'living-mud-bomb'
'cars'
'unhealthy-tan'
'daffodil'
'rose'
'healthy-skin'
'orange'
'white-ivy'
'summer-makeup'
'glow-buzz'
'deep-water'
'afternoon-beach'
'dim-beach'
'cloudy-brick'
'burning-wood'
'aquatic-garden'
'no-name'
'fall-quilt'
'night-blue-sky'
'shadow-iris'
'solid-sky'
'misty-field'
'wooden-highlight'
'jet-tundra'
'pastel-lime'
'hell'
'indian-coast'
'dentist-decor'
'greenland'
'purple-dress'
'no-name'
'spring-flora'
'andi'
'gig-o835'
'rie02'
'rie05'
'rie11'
'etretat.ppm'
'the-hollow-needle-at-etretat.ppm'
'rouen-cathedral-sunset.ppm'
'the-houses-of-parliament.ppm'
'starry-night.ppm'
'water-lilies-sunset.ppm'
'gogh.chambre-arles.ppm'
'gogh.entrance.ppm'
'gogh.the-night-cafe.ppm'
'gogh.vegetable-montmartre.ppm'
'matisse.bonheur-vivre.ppm'
'matisse.flowers.ppm'
'matisse.lecon-musique.ppm'
'modigliani.nude-caryatid.ppm'
'braque.instruments.ppm'
'calcoast09.ppm'
'dodge102.ppm'
'ernst.anti-pope.ppm'
'ernst.ubu-imperator.ppm'
'fighting-forms.ppm'
'fog25.ppm'
'geyser27.ppm'
'gris.josette.ppm'
'gris.landscape-ceret.ppm'
'kandinsky.comp-9.ppm'
'kandinsky.yellow-red-blue.ppm'
'klee.insula-dulcamara.ppm'
'nile.ppm'
'picasso.jfille-chevre.ppm'
'pollock.lavender-mist.ppm'
'yngpaint.ppm')
end
end

161
Forms/ImageColoring.pas Normal file
View File

@ -0,0 +1,161 @@
{
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 ImageColoring;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, cmap;
type
TfrmImageColoring = class(TForm)
cbEnable: TCheckBox;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
cmbPalette1: TComboBox;
Label4: TLabel;
imgPal1: TImage;
imgpal2: TImage;
Label5: TLabel;
cmbPalette2: TComboBox;
procedure cmbPalette2Change(Sender: TObject);
procedure cmbPalette1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
procedure cmbPalette1Change(Sender: TObject);
private
FPal1: TColorMap;
FPal2: TColorMap;
FBkuPal1: TColorMap;
FBkuPal2: TColorMap;
Index1: integer;
Index2: integer;
procedure DrawPalette1;
procedure DrawPalette2;
procedure Apply;
public
procedure Update; override;
end;
var
frmImageColoring: TfrmImageColoring;
implementation
{$R *.dfm}
uses
Main, Editor, Mutate, GradientHlpr;
{ TfrmImageColoring }
procedure TfrmImageColoring.Update;
begin
// FPal1 := MainCP.Pal;
FBkuPal1 := FPal1;
end;
procedure TfrmImageColoring.cmbPalette1Change(Sender: TObject);
begin
Index1 := cmbPalette1.ItemIndex;
GetCmap(Index1, 1, FPal1);
FBkuPal1 := FPal1;
// ScrollBar.Position := 0;
DrawPalette1;
Apply;
end;
procedure TfrmImageColoring.Apply;
begin
MainForm.StopThread;
MainForm.UpdateUndo;
MainCp.CmapIndex := cmbPalette1.ItemIndex;
MainCp.cmap := FPal1;
if EditForm.visible then EditForm.UpdateDisplay;
if MutateForm.Visible then MutateForm.UpdateDisplay;
MainForm.RedrawTimer.enabled := true;
end;
procedure TfrmImageColoring.cmbPalette1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
Bitmap: TBitmap;
PalName: string;
begin
BitMap := GradientHelper.GetGradientBitmap(Index, 1);
GetCmapName(index, PalName);
with Control as TComboBox do begin
Canvas.Rectangle(Rect);
Canvas.TextOut(4, Rect.Top, PalName);
Rect.Left := (Rect.Left + rect.Right) div 2;
Canvas.StretchDraw(Rect, Bitmap);
end;
BitMap.Free;
end;
procedure TfrmImageColoring.DrawPalette1;
var
Bitmap: TBitmap;
begin
BitMap := GradientHelper.GetGradientBitmap(Index1, 1);
imgPal1.Picture.Graphic := Bitmap;
imgPal1.Refresh;
BitMap.Free;
end;
procedure TfrmImageColoring.DrawPalette2;
var
Bitmap: TBitmap;
begin
BitMap := GradientHelper.GetGradientBitmap(Index2, 1);
imgPal2.Picture.Graphic := Bitmap;
imgPal2.Refresh;
BitMap.Free;
end;
procedure TfrmImageColoring.cmbPalette2Change(Sender: TObject);
begin
Index2 := cmbPalette2.ItemIndex;
GetCmap(Index2, 1, FPal2);
FBkuPal2 := FPal2;
// ScrollBar.Position := 0;
DrawPalette2;
Apply;
end;
end.

120
Forms/LoadTracker.dfm Normal file
View File

@ -0,0 +1,120 @@
object LoadForm: TLoadForm
Left = 443
Top = 274
ActiveControl = Button1
Anchors = [akLeft, akTop, akRight, akBottom]
Caption = 'Messages'
ClientHeight = 388
ClientWidth = 662
Color = clBtnFace
Constraints.MinHeight = 275
Constraints.MinWidth = 550
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
FormStyle = fsStayOnTop
Icon.Data = {
0000010001001010000001002000680400001600000028000000100000002000
0000010020000000000040040000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000006349
35146349352E927A69FF8C7563FF87705EFF6349352E7F6654FF7A624FFF755D
4AFF6349352E6E5441FF6A513EFF674E3AFF6349352E00000000000000006349
352EAE9888FFEFE3DDFFF2E7E1FFEDDFD7FF836B59FFB79B8BFFDBBDADFFD9B7
A6FF725946FFAE8B77FFD0A692FFCC9E87FF654B38FF6349352E00000000B7A2
93FFFBF8F7FFF9F4F2FFF7F0ECFFF4EBE6FFF1E5DFFF7F6754FF7A624FFF765D
4AFF735946FF6E5542FF6B523EFF674E3AFF654B38FF634935FF00000000B7A2
93FFFDFCFBFFFBF9F7FFFAF5F2FFF7EFEDFFF4EAE6FFF2E5DFFFDDDCD7FFDFD7
CEFFDECDC0FFDEC5B6FFDEBFACFFDBBAA6FFD8B5A3FF634935FF00000000B7A2
93FFFFFFFFFFB47F65FFB47F64FFEDDDD5FFB37E63FFF4EBE6FFF1E5DFFFEFDF
D7FFEBD9D1FFE8D3C9FFE5CDC1FFE1C6B9FFD6B3A1FF634A35FF00000000B9A4
95FFFFFFFFFFFFFFFFFFFDFCFCFFFCF9F7FFFAF4F2FFF6F0ECFFF4EBE5FFF2E5
DFFFEEDFD8FFEBD9D0FFE8D3C8FFE5CCC1FFDBBDADFF634A36FF00000000BDA7
98FFFFFFFFFF968E88FFEEDED7FF968E87FFEDDDD6FF968D86FF958C85FFF4EB
E6FFF2E5DFFFEFDFD8FFECD9D0FFE8D3C9FFE0C7BAFF634A35FF00000000C1AB
9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFFFBF8F7FFFAF4F2FFF7F0
ECFFF4EAE6FFF1E5DFFFEEDFD7FFEBD9D0FFE6D1C6FF634A35FF00000000C5AF
A0FFFFFFFFFFB48065FFB48065FF968E88FFC2B0A3FF968E87FF968E86FFF9F4
F2FFF7EFECFFF4EBE6FFF2E5DFFFEFDFD8FFEADBD1FF634936FF00000000C8B2
A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFFFCF8
F7FFF9F5F2FFF7F0ECFFF4EBE6FFF1E5DFFFEEE2DAFF644A36FF00000000C9B4
A5FFFFFFFFFFFFFFFFFF66A365FF66A365FF66A365FFC0B4ADFF66A365FF66A3
65FF66A264FFFAF5F2FFF7F0ECFFF4EBE6FFEEE2DAFF644A36FF00000000C8B2
A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFEFCFBFFFBF9F7FFFAF4F2FFF7F0EDFFF3EAE4FF644A36FF00000000C8B2
A3FFCAB4A5FFCBB5A6FFCAB4A5FFC9B3A4FFC7B2A3FFC6B0A1FFC3AE9FFFC1AC
9DFFBFAA9BFFBDA899FFBBA697FFB9A495FFB8A394FFB7A293FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000FFFF
0000FFFF00000003000000010000000100000001000000010000000100000001
0000000100000001000000010000000100000001000000010000FFFF0000}
OldCreateOrder = False
OnCreate = FormCreate
OnResize = FormResize
DesignSize = (
662
388)
PixelsPerInch = 96
TextHeight = 13
object Bevel1: TBevel
Left = 7
Top = 7
Width = 533
Height = 308
Anchors = [akLeft, akTop, akRight, akBottom]
Style = bsRaised
end
object Button1: TButton
Left = 527
Top = 359
Width = 112
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Close'
TabOrder = 0
OnClick = Button1Click
end
object CheckBox1: TCheckBox
Left = 8
Top = 360
Width = 384
Height = 24
Anchors = [akLeft, akRight, akBottom]
Caption = 'Automatically open this window when loading flame'
TabOrder = 1
WordWrap = True
OnClick = CheckBox1Click
end
object Button2: TButton
Left = 406
Top = 359
Width = 113
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Clear'
TabOrder = 2
OnClick = Button2Click
end
object Output: TMemo
Left = 8
Top = 8
Width = 528
Height = 303
BevelOuter = bvRaised
BorderStyle = bsNone
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clBtnText
Font.Height = -12
Font.Name = 'Courier New'
Font.Style = []
ParentFont = False
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 3
end
end

104
Forms/LoadTracker.pas Normal file
View File

@ -0,0 +1,104 @@
{
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 LoadTracker;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Global, Settings, ExtCtrls, Translation;
type
TLoadForm = class(TForm)
Button1: TButton;
CheckBox1: TCheckBox;
Button2: TButton;
Bevel1: TBevel;
Output: TMemo;
procedure FormResize(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
LoadForm: TLoadForm;
implementation
{$R *.dfm}
procedure TLoadForm.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TLoadForm.CheckBox1Click(Sender: TObject);
begin
AutoOpenLog := CheckBox1.Checked;
end;
procedure TLoadForm.FormCreate(Sender: TObject);
begin
Button2.Caption := TextByKey('common-clear');
Button1.Caption := TextByKey('common-close');
self.Caption := TextByKey('messages-title');
CheckBox1.Caption := TextByKey('messages-openautomatically');
CheckBox1.Checked := AutoOpenLog;
end;
procedure TLoadForm.Button2Click(Sender: TObject);
begin
Output.Text := '';
end;
procedure TLoadForm.FormResize(Sender: TObject);
begin
CheckBox1.Left := 2;
Checkbox1.Top := self.ClientHeight - Checkbox1.Height - 2;
CheckBox1.Width := self.ClientWidth - button1.Width - button2.Width - 8;
Button1.Left := self.ClientWidth - button1.Width - button2.Width - 4;
Button1.Top := self.ClientHeight - Checkbox1.Height - 2 + Checkbox1.Height div 2 - Button1.Height div 2;
Button2.Left := self.ClientWidth - button2.Width - 2;
Button2.Top := Button1.Top;
Bevel1.Left := 2;
Bevel1.Top := 2;
Bevel1.Width := self.ClientWidth - 4;
Bevel1.Height := self.ClientHeight - 6 - checkbox1.Height;
Output.Left := Bevel1.Left + 2;
Output.Top := Bevel1.Top + 2;
Output.Width := Bevel1.Width - 4;
Output.Height := Bevel1.Height -4;
end;
end.

5974
Forms/Main.dfm Normal file

File diff suppressed because it is too large Load Diff

7015
Forms/Main.pas Normal file

File diff suppressed because it is too large Load Diff

421
Forms/Mutate.dfm Normal file
View File

@ -0,0 +1,421 @@
object MutateForm: TMutateForm
Left = 589
Top = 326
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Mutation'
ClientHeight = 398
ClientWidth = 422
Color = clBtnFace
Constraints.MinHeight = 400
Constraints.MinWidth = 400
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Icon.Data = {
0000010001001010000001002000680400001600000028000000100000002000
0000010020000000000040040000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000003E3937FF48403BFF39322FFF28231FFF1B1714FF000000FF0000
00003E3937FF48403BFF39322FFF28231FFF1B1714FF000000FF000000000000
00000000000089766CFFFCF7F3FFFBECDDFFE5D7C8FFD3C5B6FF181412FF0000
000089766CFFFCF7F3FFFBECDDFFE5D7C8FFD3C5B6FF181412FF000000000000
000000000000898079FFFCF7F3FFE27239FFC8622FFFE5D7C8FF231E1BFF0000
0000898079FFFCF7F3FFE27239FFC8622FFFE5D7C8FF231E1BFF000000000000
00000000000089807CFFFEFBFAFFF58250FFCD6531FFFBECDDFF322C29FF0000
000089807CFFFEFBFAFFF58250FFCD6531FFFBECDDFF322C29FF000000000000
00000000000088807CFFFFFFFFFFFDFBFAFFFCF7F3FFFCF7F3FF3F3835FF0000
000088807CFFFFFFFFFFFDFBFAFFFCF7F3FFFCF7F3FF3F3835FF000000000000
000000000000887F7AFF89807CFF89807CFF898079FF89766CFF35312EFF0000
0000887F7AFF89807CFF89807CFF898079FF89766CFF35312EFF000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000003E3937FF48403BFF39322FFF28231FFF1B1714FF000000FF0000
00003E3937FF48403BFF39322FFF28231FFF1B1714FF000000FF000000000000
00000000000089766CFFFCF7F3FFFBECDDFFE5D7C8FFD3C5B6FF181412FF0000
000089766CFFFCF7F3FFFBECDDFFE5D7C8FFD3C5B6FF181412FF000000000000
000000000000898079FFFCF7F3FFE27239FFC8622FFFE5D7C8FF231E1BFF0000
0000898079FFFCF7F3FFE27239FFC8622FFFE5D7C8FF231E1BFF000000000000
00000000000089807CFFFEFBFAFFF58250FFCD6531FFFBECDDFF322C29FF0000
000089807CFFFEFBFAFFF58250FFCD6531FFFBECDDFF322C29FF000000000000
00000000000088807CFFFFFFFFFFFDFBFAFFFCF7F3FFFCF7F3FF3F3835FF0000
000088807CFFFFFFFFFFFDFBFAFFFCF7F3FFFCF7F3FF3F3835FF000000000000
000000000000887F7AFF89807CFF89807CFF898079FF89766CFF35312EFF0000
0000887F7AFF89807CFF89807CFF898079FF89766CFF35312EFF000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000FFFF
0000FFFF0000C0810000C0810000C0810000C0810000C0810000C0810000FFFF
0000C0810000C0810000C0810000C0810000C0810000C0810000FFFF0000}
OldCreateOrder = False
Position = poDefault
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
DesignSize = (
422
398)
PixelsPerInch = 96
TextHeight = 13
object GroupBox1: TGroupBox
Left = 8
Top = 8
Width = 409
Height = 273
Anchors = [akLeft, akTop, akRight, akBottom]
Caption = 'Directions'
TabOrder = 0
DesignSize = (
409
273)
object Panel10: TPanel
Left = 12
Top = 20
Width = 384
Height = 238
Anchors = [akLeft, akTop, akRight, akBottom]
BevelOuter = bvNone
TabOrder = 0
OnResize = Panel10Resize
object Panel6: TPanel
Left = 112
Top = 168
Width = 108
Height = 80
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 0
object Image6: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = MutantClick
end
end
object Panel7: TPanel
Left = 0
Top = 168
Width = 108
Height = 80
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 1
object Image7: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = MutantClick
end
end
object Panel4: TPanel
Left = 224
Top = 84
Width = 108
Height = 80
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 2
object Image4: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = MutantClick
end
end
object Panel0: TPanel
Left = 112
Top = 84
Width = 108
Height = 80
HelpContext = 2003
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 3
object Image0: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = Image0Click
end
end
object Panel8: TPanel
Left = 0
Top = 84
Width = 108
Height = 80
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 4
object Image8: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = MutantClick
end
end
object Panel3: TPanel
Left = 224
Top = 0
Width = 108
Height = 80
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 5
object Image3: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = MutantClick
end
end
object Panel2: TPanel
Left = 112
Top = 0
Width = 108
Height = 80
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 6
object Image2: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = MutantClick
end
end
object Panel1: TPanel
Left = 0
Top = 0
Width = 108
Height = 80
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 7
object Image1: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = MutantClick
end
end
object Panel5: TPanel
Left = 224
Top = 168
Width = 108
Height = 80
BevelOuter = bvLowered
Caption = 'PrevPnl3'
Color = clBlack
TabOrder = 8
object Image5: TImage
Left = 1
Top = 1
Width = 106
Height = 78
Align = alClient
PopupMenu = QualityPopup
Stretch = True
OnClick = MutantClick
end
end
end
end
object GroupBox2: TGroupBox
Left = 8
Top = 288
Width = 409
Height = 105
Anchors = [akLeft, akRight, akBottom]
TabOrder = 1
DesignSize = (
409
105)
object scrollTime: TScrollBar
Left = 120
Top = 20
Width = 202
Height = 20
Anchors = [akLeft, akTop, akRight]
LargeChange = 5
Max = 50
Min = 1
PageSize = 0
Position = 1
TabOrder = 0
OnChange = scrollTimeChange
end
object cmbTrend: TComboBox
Left = 119
Top = 48
Width = 282
Height = 21
Style = csDropDownList
Anchors = [akLeft, akTop, akRight]
DropDownCount = 16
TabOrder = 1
OnChange = cmbTrendChange
Items.Strings = (
'Random'
'Linear'
'Sinusoidal'
'Spherical'
'Swirl'
'Horseshoe'
'Polar'
'Handkerchief'
'Heart'
'Disc'
'Spiral'
'Hyperbolic'
'Diamond'
'Ex'
'Julia'
'Bent'
'Waves'
'Fisheye'
'Popcorn')
end
object chkSameNum: TCheckBox
Left = 12
Top = 78
Width = 389
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Same no. of transforms'
TabOrder = 2
OnClick = chkSameNumClick
end
object pnlSpeed: TPanel
Left = 12
Top = 20
Width = 101
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Speed'
ParentShowHint = False
ShowHint = True
TabOrder = 3
end
object txtTime: TEdit
Left = 328
Top = 20
Width = 73
Height = 21
Anchors = [akTop, akRight]
ReadOnly = True
TabOrder = 4
Text = '0'
end
object pnlTrend: TPanel
Left = 12
Top = 48
Width = 101
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Trend'
ParentShowHint = False
ShowHint = True
TabOrder = 5
end
end
object Timer: TTimer
Enabled = False
Interval = 100
OnTimer = TimerTimer
Left = 168
Top = 80
end
object QualityPopup: TPopupMenu
Images = MainForm.Buttons
Left = 144
Top = 40
object mnuLowQuality: TMenuItem
Caption = 'Low Quality'
RadioItem = True
OnClick = mnuLowQualityClick
end
object mnuMediumQuality: TMenuItem
Caption = 'Medium Quality'
Checked = True
RadioItem = True
OnClick = mnuMediumQualityClick
end
object mnuHighQuality: TMenuItem
Caption = 'High Quality'
RadioItem = True
OnClick = mnuHighQualityClick
end
object N3: TMenuItem
Caption = '-'
end
object mnuBack: TMenuItem
Caption = 'Previous'
Enabled = False
ImageIndex = 4
OnClick = mnuBackClick
end
object N1: TMenuItem
Caption = '-'
end
object mnuMaintainSym: TMenuItem
Caption = 'Maintain Symmetry'
Checked = True
OnClick = mnuMaintainSymClick
end
object N2: TMenuItem
Caption = '-'
end
object mnuResetLocation: TMenuItem
Caption = 'Reset Location'
Checked = True
OnClick = mnuResetLocationClick
end
end
end

695
Forms/Mutate.pas Normal file
View File

@ -0,0 +1,695 @@
{
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 Mutate;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ControlPoint, ComCtrls, Menus, Buttons, Cmap,
RenderingInterface, Translation, Curves;
type
TMutateForm = class(TForm)
GroupBox1: TGroupBox;
Timer: TTimer;
GroupBox2: TGroupBox;
scrollTime: TScrollBar;
cmbTrend: TComboBox;
chkSameNum: TCheckBox;
QualityPopup: TPopupMenu;
mnuLowQuality: TMenuItem;
mnuMediumQuality: TMenuItem;
mnuHighQuality: TMenuItem;
N3: TMenuItem;
mnuResetLocation: TMenuItem;
mnuBack: TMenuItem;
N1: TMenuItem;
mnuMaintainSym: TMenuItem;
N2: TMenuItem;
Panel10: TPanel;
Panel6: TPanel;
Image6: TImage;
Panel7: TPanel;
Image7: TImage;
Panel4: TPanel;
Image4: TImage;
Panel0: TPanel;
Image0: TImage;
Panel8: TPanel;
Image8: TImage;
Panel3: TPanel;
Image3: TImage;
Panel2: TPanel;
Image2: TImage;
Panel1: TPanel;
Image1: TImage;
Panel5: TPanel;
Image5: TImage;
pnlSpeed: TPanel;
txtTime: TEdit;
pnlTrend: TPanel;
procedure Panel10Resize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Image0Click(Sender: TObject);
procedure MutantClick(Sender: TObject);
procedure sbTimeChange(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure scrollTimeChange(Sender: TObject);
procedure cmbTrendChange(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure mnuHighQualityClick(Sender: TObject);
procedure mnuLowQualityClick(Sender: TObject);
procedure mnuMediumQualityClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure chkSameNumClick(Sender: TObject);
procedure mnuResetLocationClick(Sender: TObject);
procedure mnuBackClick(Sender: TObject);
procedure mnuMaintainSymClick(Sender: TObject);
private
name, nick, url: string;
bm: TBitmap;
PreviewDensity: double;
Updating: boolean;
cps: array[0..8] of TControlPoint;
Mutants: array[0..8] of TControlPoint;
Render: TRenderer;
Time: double;
bstop: boolean;
brightness, gamma, vibrancy: double;
seed, InitSeed: integer;
procedure RandomSet;
procedure ShowMain;
procedure ShowMutants;
procedure Interpolate;
public
Zoom: Double;
Center: array[0..1] of double;
cmap: TColorMap;
procedure UpdateDisplay;
procedure UpdateFlame;
end;
var
MutateForm: TMutateForm;
implementation
uses
Main, Global, Registry, Editor, Adjust, XFormMan;
{$R *.DFM}
procedure TMutateForm.UpdateFlame;
begin
MainForm.StopThread;
MainForm.UpdateUndo;
MainCp.Copy(cps[0]);
Transforms := MainCp.TrianglesFromCP(MainTriangles);
MainCp.cmap := cmap;
MainCp.name := name; // this is kinda funny,
MainCp.nick := nick; // like author's nick can change during mutation?
mainCp.url := url; // hee-heheee :-)
if mnuResetLocation.checked then
begin
MainForm.Mainzoom := cps[0].zoom;
MainForm.Center[0] := cps[0].Center[0];
MainForm.Center[1] := cps[0].Center[1];
end;
MainForm.RedrawTimer.enabled := true;
if EditForm.Visible then EditForm.UpdateDisplay;
// if AdjustForm.Visible then AdjustForm.UpdateDisplay;
end;
procedure TMutateForm.UpdateDisplay;
begin
cps[0].copy(MainCp);
cps[0].AdjustScale(Image0.Width, Image0.Height);
cps[0].cmap := MainCp.cmap;
cmap := MainCp.cmap;
name := Maincp.name;
nick := maincp.nick;
url := maincp.url;
zoom := MainCp.zoom;
center[0] := MainCp.center[0];
center[1] := MainCp.center[1];
vibrancy := cps[0].vibrancy;
gamma := cps[0].gamma;
brightness := cps[0].brightness;
Interpolate;
ShowMain;
Application.ProcessMessages;
ShowMutants;
end;
procedure TMutateForm.ShowMain;
begin
cps[0].Width := Image0.Width;
cps[0].Height := Image0.Height;
cps[0].spatial_oversample := defOversample;
cps[0].spatial_filter_radius := defFilterRadius;
cps[0].sample_density := PreviewDensity;
cps[0].brightness := brightness;
cps[0].gamma := gamma;
cps[0].vibrancy := vibrancy;
cps[0].sample_density := PreviewDensity;
cps[0].cmap := cmap;
cps[0].background := MainCp.background;
if mnuResetLocation.checked then begin
cps[0].CalcBoundbox;
zoom := 0;
center[0] := cps[0].center[0];
center[1] := cps[0].Center[1];
end;
cps[0].zoom := zoom;
cps[0].center[0] := center[0];
cps[0].center[1] := center[1];
// Render.Compatibility := compatibility;
Render.SetCP(cps[0]);
Render.Render;
BM.Assign(Render.GetImage);
Image0.Picture.Graphic := bm;
end;
procedure TMutateForm.ShowMutants;
var
i: integer;
begin
if Visible = false then exit;
Updating := true;
for i := 1 to 8 do
begin
mutants[i].Width := Image1.Width;
mutants[i].Height := Image1.Height;
mutants[i].spatial_filter_radius := defFilterRadius;
mutants[i].spatial_oversample := defOversample;
mutants[i].sample_density := PreviewDensity;
mutants[i].brightness := brightness;
mutants[i].gamma := gamma;
mutants[i].vibrancy := vibrancy;
{ mutants[i].zoom := 0;
mutants[i].CalcBoundbox;
if not mnuResetLocation.checked then begin
mutants[i].zoom := MainCp.zoom;
mutants[i].CalcBoundbox;
mutants[i].center[0] := MainCp.Center[0];
mutants[i].center[1] := MainCp.Center[1];
end;
{ if mnuResetLocation.checked then begin
mutants[i].CalcBoundbox;
zoom := 0;
center[0] := cps[0].center[0];
center[1] := cps[0].Center[1];
end;
}
if mnuResetLocation.checked then
begin
mutants[i].CalcBoundbox;
mutants[i].zoom := 0;
// center[0] := cps[0].center[0];
// center[1] := cps[0].Center[1];
end
else begin
mutants[i].zoom := zoom;
mutants[i].center[0] := center[0];
mutants[i].center[1] := center[1];
end;
// Render.Compatibility := compatibility;
Render.SetCP(mutants[i]);
Render.Render;
BM.Assign(Render.GetImage);
case i of
1: begin
Image1.Picture.Graphic := bm;
Image1.Refresh;
end;
2: begin
Image2.Picture.Graphic := bm;
Image2.Refresh;
end;
3: begin
Image3.Picture.Graphic := bm;
Image3.Refresh;
end;
4: begin
Image4.Picture.Graphic := bm;
Image4.Refresh;
end;
5: begin
Image5.Picture.Graphic := bm;
Image5.Refresh;
end;
6: begin
Image6.Picture.Graphic := bm;
Image6.Refresh;
end;
7: begin
Image7.Picture.Graphic := bm;
Image7.Refresh;
end;
8: begin
Image8.Picture.Graphic := bm;
Image8.Refresh;
end;
end;
Updating := false;
end;
end;
procedure TMutateForm.Interpolate;
var i, j, k: Integer;
begin
if MainCp = nil then Exit;
for i := 1 to 8 do
begin
if bstop then exit;
cps[0].Time := 0;
cps[i].Time := 1;
(* -X- something is not right here...
Mutants[i] may be destroyed already
Investigate? *)
Mutants[i].clear;
Mutants[i].InterpolateX(cps[0], cps[i], Time / 100);
Mutants[i].cmapindex := cps[0].cmapindex;
Mutants[i].cmap := cps[0].cmap;
Mutants[i].background := MainCp.background;
if mnuMaintainSym.Checked then // maintain symmetry
begin
for j := 0 to transforms - 1 do
begin
if cps[0].xform[j].Symmetry = 1 then
begin
mutants[i].xform[j].Assign(cps[0].xform[j]);
{
mutants[i].xform[j].Symmetry := 1;
mutants[i].xform[j].Color := cps[0].xform[j].color;
mutants[i].xform[j].Density := cps[0].xform[j].Density;
mutants[i].xform[j].c[0][0] := cps[0].xform[j].c[0][0];
mutants[i].xform[j].c[0][1] := cps[0].xform[j].c[0][1];
mutants[i].xform[j].c[1][0] := cps[0].xform[j].c[1][0];
mutants[i].xform[j].c[1][1] := cps[0].xform[j].c[1][1];
mutants[i].xform[j].c[2][0] := cps[0].xform[j].c[2][0];
mutants[i].xform[j].c[2][1] := cps[0].xform[j].c[2][1];
for k := 0 to NRVAR - 1 do
mutants[i].xform[j].vars[k] := cps[0].xform[j].vars[k];
}
end;
end;
end;
end;
end;
procedure TMutateForm.RandomSet;
var i: Integer;
begin
RandSeed := seed;
for i := 1 to 8 do
begin
cps[i].clear;
if chkSameNum.checked then
cps[i].RandomCP(transforms, transforms, false)
else
cps[i].RandomCP(mutantMinTransforms, mutantMaxTransforms, false);
cps[i].SetVariation(TVariation(cmbTrend.Items.Objects[cmbTrend.ItemIndex]));
if cps[0].HasFinalXForm = false then
begin
cps[i].xform[cps[i].NumXForms].Clear;
cps[i].xform[cps[i].NumXForms].symmetry := 1;
end;
end;
Interpolate;
end;
procedure TMutateForm.FormShow(Sender: TObject);
var
Registry: TRegistry;
begin
{ Read posution from registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Mutate', False) then
begin
if Registry.ValueExists('Left') then
MutateForm.Left := Registry.ReadInteger('Left');
if Registry.ValueExists('Top') then
MutateForm.Top := Registry.ReadInteger('Top');
end;
Registry.CloseKey;
finally
Registry.Free;
end;
if (cps[0].xform[0].density <> 0) and Assigned(MainCp) then begin // hmm...!?
Interpolate;
ShowMain;
ShowMutants;
end;
end;
procedure TMutateForm.FormCreate(Sender: TObject);
var
i: integer;
begin
self.Caption := TextByKey('mutation-title');
GroupBox1.Caption := TextByKey('mutation-directions');
pnlSpeed.Caption := TextByKey('mutation-speed');
pnlTrend.Caption := TextByKey('mutation-trend');
chkSameNum.Caption := TextByKey('mutation-keepnumberoftransforms');
mnuLowQuality.Caption := TextByKey('common-lowquality');
mnuMediumQuality.Caption := TextByKey('common-mediumquality');
mnuHighQuality.Caption := TextByKey('common-highquality');
mnuResetLocation.Caption := TextByKey('common-resetlocation');
mnuMaintainSym.Caption := TextByKey('mutation-maintainsymmetry');
mnuBack.Caption := TextByKey('mutation-previous');
cmbTrend.Items.clear;
cmbTrend.AddItem(TextByKey('mutation-randomtrend'), Tobject(vRandom));
for i:= 0 to NRVAR -1 do begin
cmbTrend.AddItem(varnames(i), Tobject(i));
end;
bm := TBitMap.Create;
case MutatePrevQual of
0: begin
mnuLowQuality.Checked := true;
PreviewDensity := prevLowQuality;
end;
1: begin
mnuMediumQuality.Checked := true;
PreviewDensity := prevMediumQuality;
end;
2: begin
mnuHighQuality.Checked := true;
PreviewDensity := prevHighQuality;
end;
end;
Render := TRenderer.Create;
for i := 0 to 8 do
begin
cps[i] := TControlPoint.Create;
Mutants[i] := TControlPoint.Create;
end;
Time := 35;
scrollTime.Position := 25;
cmbTrend.ItemIndex := 0;
InitSeed := random(1234567890);
seed := InitSeed;
RandomSet;
end;
procedure TMutateForm.FormDestroy(Sender: TObject);
var
i: integer;
begin
Render.Stop;
Render.Free;
for i := 0 to 8 do
begin
cps[i].Free;
Mutants[i].Free;
end;
bm.free;
end;
procedure TMutateForm.Image0Click(Sender: TObject);
begin
Render.Stop;
mnuBack.Enabled := true;
inc(seed);
RandomSet;
ShowMutants;
end;
procedure TMutateForm.MutantClick(Sender: TObject);
var
i, j: integer;
cpt: TControlPoint;
begin
cpt := TControlPoint.Create;
cpt.Copy(cps[0]);
bstop := true;
if sender = Image1 then
begin
cps[0].Time := 0;
cps[1].Time := 1;
cps[0].Interpolatex(cps[0], cps[1], Time / 100);
end
else if sender = Image2 then
begin
cps[0].Time := 0;
cps[2].Time := 1;
cps[0].Interpolatex(cps[0], cps[2], Time / 100);
end
else if sender = Image3 then
begin
cps[0].Time := 0;
cps[3].Time := 1;
cps[0].InterpolateX(cps[0], cps[3], Time / 100);
end
else if sender = Image4 then
begin
cps[0].Time := 0;
cps[4].Time := 1;
cps[0].Interpolatex(cps[0], cps[4], Time / 100);
end
else if sender = Image5 then
begin
cps[0].Time := 0;
cps[5].Time := 1;
cps[0].Interpolatex(cps[0], cps[5], Time / 100);
end
else if sender = Image6 then
begin
cps[0].Time := 0;
cps[6].Time := 1;
cps[0].Interpolatex(cps[0], cps[6], Time / 100);
end
else if sender = Image7 then
begin
cps[0].Time := 0;
cps[7].Time := 1;
cps[0].Interpolatex(cps[0], cps[7], Time / 100);
end
else if sender = Image8 then
begin
cps[0].Time := 0;
cps[8].Time := 1;
cps[0].Interpolatex(cps[0], cps[8], Time / 100);
end;
if mnuMaintainSym.Checked then // maintain symmetry
begin
for i := 0 to transforms - 1 do
begin
if cpt.xform[i].Symmetry = 1 then
begin
cps[0].xform[i].Assign(cpt.xform[i]);
{
cps[0].xform[i].Symmetry := 1;
cps[0].xform[i].Color := cpt.xform[i].color;
cps[0].xform[i].Density := cpt.xform[i].Density;
cps[0].xform[i].c[0][0] := cpt.xform[i].c[0][0];
cps[0].xform[i].c[0][1] := cpt.xform[i].c[0][1];
cps[0].xform[i].c[1][0] := cpt.xform[i].c[1][0];
cps[0].xform[i].c[1][1] := cpt.xform[i].c[1][1];
cps[0].xform[i].c[2][0] := cpt.xform[i].c[2][0];
cps[0].xform[i].c[2][1] := cpt.xform[i].c[2][1];
for j := 0 to NRVAR - 1 do
cps[0].xform[i].vars[j] := cpt.xform[i].vars[j];
}
end;
end;
end;
bstop := false;
ShowMain;
Interpolate;
ShowMutants;
UpdateFlame;
cpt.free;
end;
procedure TMutateForm.sbTimeChange(Sender: TObject);
begin
bstop := true;
Render.Stop;
Time := scrollTime.Position;
bstop := false;
Interpolate;
ShowMutants;
end;
procedure TMutateForm.TimerTimer(Sender: TObject);
begin
Timer.Enabled := false;
if (Time <> scrollTime.Position) and (not updating) then
begin
Time := scrollTime.Position;
Interpolate;
ShowMutants;
end;
end;
procedure TMutateForm.scrollTimeChange(Sender: TObject);
begin
Timer.Enabled := true;
txtTime.Text := FloatToStr(scrollTime.Position / 100);
end;
procedure TMutateForm.cmbTrendChange(Sender: TObject);
var
i: integer;
begin
for i := 1 to 8 do begin
cps[i].SetVariation(TVariation(cmbTrend.Items.Objects[cmbTrend.ItemIndex]));
end;
Interpolate;
ShowMutants;
end;
procedure TMutateForm.btnCancelClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TMutateForm.mnuHighQualityClick(Sender: TObject);
begin
mnuHighQuality.Checked := True;
PreviewDensity := prevHighQuality;
MutatePrevQual := 2;
ShowMain;
ShowMutants;
end;
procedure TMutateForm.mnuLowQualityClick(Sender: TObject);
begin
mnuLowQuality.Checked := True;
PreviewDensity := prevLowQuality;
MutatePrevQual := 0;
ShowMain;
ShowMutants;
end;
procedure TMutateForm.mnuMediumQualityClick(Sender: TObject);
begin
mnuMediumQuality.Checked := True;
PreviewDensity := prevMediumQuality;
MutatePrevQual := 1;
ShowMain;
ShowMutants;
end;
procedure TMutateForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
Registry: TRegistry;
begin
{ Write position to registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Mutate', True) then
begin
Registry.WriteInteger('Top', MutateForm.Top);
Registry.WriteInteger('Left', MutateForm.Left);
end;
finally
Registry.Free;
end;
end;
procedure TMutateForm.chkSameNumClick(Sender: TObject);
begin
RandomSet;
Interpolate;
ShowMutants;
end;
procedure TMutateForm.mnuResetLocationClick(Sender: TObject);
begin
mnuResetLocation.Checked := not mnuResetLocation.Checked;
if not mnuResetLocation.checked then
begin
cps[0].width := MainCp.width;
cps[0].height := MainCp.height;
cps[0].pixels_per_unit := MainCp.pixels_per_unit;
cps[0].AdjustScale(Image0.width, Image0.Height);
cps[0].zoom := MainCp.zoom;
cps[0].center[0] := MainCp.center[0];
cps[0].center[1] := MainCp.center[1];
zoom := cps[0].zoom;
center[0] := cps[0].center[0];
center[1] := cps[0].center[1];
end;
ShowMain;
ShowMutants;
end;
procedure TMutateForm.mnuBackClick(Sender: TObject);
begin
Render.Stop;
if seed > InitSeed then
dec(seed);
if seed = InitSeed then mnuBack.enabled := false;
RandomSet;
ShowMutants;
end;
procedure TMutateForm.mnuMaintainSymClick(Sender: TObject);
begin
mnuMaintainSym.Checked := not mnuMaintainSym.Checked;
Interpolate;
ShowMutants;
end;
procedure TMutateForm.Panel10Resize(Sender: TObject);
const gap:integer = 4 ;
var
w, h : integer;
begin
w := (Panel10.Width - 2*gap) div 3;
h := (Panel10.Height - 2*gap) div 3;
Panel0.Width := w; Panel1.Width := w; Panel2.Width := w;
Panel3.Width := w; Panel4.Width := w; Panel5.Width := w;
Panel6.Width := w; Panel7.Width := w; Panel8.Width := w;
Panel0.Height := h; Panel1.Height := h; Panel2.Height := h;
Panel3.Height := h; Panel4.Height := h; Panel5.Height := h;
Panel6.Height := h; Panel7.Height := h; Panel8.Height := h;
Panel2.Left := w + gap; Panel0.Left := w + gap; Panel6.Left := w + gap;
Panel3.Left := 2*(w + gap); Panel4.Left := 2*(w + gap); Panel5.Left := 2*(w + gap);
Panel8.Top := h + gap; Panel0.Top := h + gap; Panel4.Top := h + gap;
Panel7.Top := 2*(h + gap); Panel6.Top := 2*(h + gap); Panel5.Top := 2*(h + gap);
end;
end.

2848
Forms/Options.dfm Normal file

File diff suppressed because it is too large Load Diff

1398
Forms/Options.pas Normal file

File diff suppressed because it is too large Load Diff

42
Forms/Preview.dfm Normal file
View File

@ -0,0 +1,42 @@
object PreviewForm: TPreviewForm
Left = 541
Top = 357
Width = 212
Height = 181
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSizeToolWin
Caption = 'Preview'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnKeyPress = FormKeyPress
PixelsPerInch = 96
TextHeight = 13
object BackPanel: TPanel
Left = 0
Top = 0
Width = 204
Height = 152
Align = alClient
BevelInner = bvLowered
BevelOuter = bvLowered
Color = clBlack
TabOrder = 0
object Image: TImage
Left = 2
Top = 2
Width = 200
Height = 153
Align = alClient
AutoSize = True
Stretch = True
end
end
end

94
Forms/Preview.pas Normal file
View File

@ -0,0 +1,94 @@
{
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 Preview;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, ControlPoint, RenderingInterface, Translation;
type
TPreviewForm = class(TForm)
BackPanel: TPanel;
Image: TImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
cp: TControlPoint;
Render: TRenderer;
procedure DrawFlame;
end;
var
PreviewForm: TPreviewForm;
implementation
uses Main, Global, ScriptForm;
{$R *.DFM}
procedure TPreviewForm.DrawFlame;
begin
Render.Stop;
// ScriptEditor.GetCpFromFlame(cp);
cp.width := Image.width;
cp.Height := Image.Height;
// Render.Compatibility := Compatibility;
Render.SetCP(cp);
Render.Render;
Image.Picture.Bitmap.Assign(Render.GetImage);
Application.ProcessMessages;
end;
procedure TPreviewForm.FormCreate(Sender: TObject);
begin
self.Caption := TextbyKey('preview-title');
cp := TControlPoint.Create;
Render := TRenderer.Create;
end;
procedure TPreviewForm.FormDestroy(Sender: TObject);
begin
Render.Free;
cp.Free;
end;
procedure TPreviewForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
ScriptEditor.Stopped := True;
end;
procedure TPreviewForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
ScriptEditor.Stopped := True;
end;
end.

152
Forms/Save.dfm Normal file
View File

@ -0,0 +1,152 @@
object SaveForm: TSaveForm
Left = 434
Top = 432
BorderStyle = bsDialog
Caption = 'Save Parameters'
ClientHeight = 153
ClientWidth = 517
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -14
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poOwnerFormCenter
OnCreate = FormCreate
OnShow = FormShow
DesignSize = (
517
153)
PixelsPerInch = 120
TextHeight = 16
object btnDefGradient: TSpeedButton
Left = 480
Top = 9
Width = 30
Height = 29
Hint = 'Browse...'
Anchors = [akTop, akRight]
Flat = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Arial'
Font.Style = [fsBold]
Glyph.Data = {
36030000424D3603000000000000360000002800000010000000100000000100
18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF75848F66808F
607987576E7B4E626F4456613948522E3A43252E351B222914191E0E12160E13
18FF00FFFF00FFFF00FF77879289A1AB6AB2D4008FCD008FCD008FCD048CC708
88BE0F82B4157CA91B779F1F7296224B5C87A2ABFF00FFFF00FF7A8A957EBED3
8AA4AE7EDCFF5FCFFF55CBFF4CC4FA41BCF537B3F02EAAEB24A0E5138CD42367
805E696DFF00FFFF00FF7D8E9879D2EC8BA4AD89C2CE71D8FF65D3FF5CCEFF51
C9FE49C1FA3FB9F534B0EE29A8E91085CD224B5B98B2BAFF00FF80919C81D7EF
7DC5E08CA6B080DDFE68D3FF67D4FF62D1FF58CDFF4EC7FC46BEF73BB6F231AC
EC2569817A95A1FF00FF83959F89DCF18CE2FF8DA8B18CBAC774D8FF67D4FF67
D4FF67D4FF5FD0FF54CDFF4BC5FC41BBF72EA2DB51677498B2BA869AA392E1F2
98E8FD80C4DE8EA7B081DEFD84E0FF84E0FF84E0FF84E0FF81DFFF7BDDFF74D8
FF6BD6FF56A9D18F9BA4889CA59AE6F39FEBFB98E8FE8BACB98BACB98AAAB788
A6B386A3AF839FAA819AA67F95A17C919D7A8E99798B957788938BA0A8A0EAF6
A6EEF99FEBFB98E8FE7ADAFF67D4FF67D4FF67D4FF67D4FF67D4FF67D4FF7788
93FF00FFFF00FFFF00FF8EA2ABA7EEF6ABF0F7A6EEF99FEBFB98E8FD71D4FB89
9EA78699A382949F7E909A7A8C97778893FF00FFFF00FFFF00FF8FA4ACA0D2DA
ABF0F7ABF0F7A6EEF99FEBFB8DA1AAB5CBD0FF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFBDCED48FA4AC8FA4AC8FA4AC8FA4AC8FA4ACB5CBD0FF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
ParentFont = False
ParentShowHint = False
ShowHint = True
OnClick = btnDefGradientClick
end
object btnSave: TButton
Left = 322
Top = 116
Width = 93
Height = 30
Anchors = [akRight, akBottom]
Caption = '&Save'
Default = True
TabOrder = 2
OnClick = btnSaveClick
end
object btnCancel: TButton
Left = 421
Top = 116
Width = 92
Height = 30
Anchors = [akRight, akBottom]
Caption = 'Cancel'
TabOrder = 3
OnClick = btnCancelClick
end
object pnlTarget: TPanel
Left = 10
Top = 10
Width = 124
Height = 26
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Destination'
ParentShowHint = False
ShowHint = True
TabOrder = 4
end
object pnlName: TPanel
Left = 10
Top = 39
Width = 124
Height = 26
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Name'
ParentShowHint = False
ShowHint = True
TabOrder = 5
end
object txtFilename: TEdit
Left = 128
Top = 10
Width = 353
Height = 24
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
Text = 'txtFilename'
end
object txtTitle: TEdit
Left = 128
Top = 39
Width = 383
Height = 24
Anchors = [akLeft, akTop, akRight]
TabOrder = 1
Text = 'txtTitle'
end
object optUseOldFormat: TRadioButton
Left = 10
Top = 79
Width = 304
Height = 21
Anchors = [akLeft, akTop, akRight]
Caption = 'Use classic flame format'
Checked = True
TabOrder = 6
TabStop = True
end
object optUseNewFormat: TRadioButton
Left = 10
Top = 101
Width = 304
Height = 21
Anchors = [akLeft, akTop, akRight]
Caption = 'Use new flame format'
Enabled = False
TabOrder = 7
end
end

225
Forms/Save.pas Normal file
View File

@ -0,0 +1,225 @@
{
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 Save;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls, Translation;
type
ESaveType = (stSaveParameters, stSaveAllParameters, stSaveGradient, stExportUPR);
TSaveForm = class(TForm)
txtFilename: TEdit;
txtTitle: TEdit;
btnSave: TButton;
btnCancel: TButton;
btnDefGradient: TSpeedButton;
pnlTarget: TPanel;
pnlName: TPanel;
optUseOldFormat: TRadioButton;
optUseNewFormat: TRadioButton;
procedure FormCreate(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnDefGradientClick(Sender: TObject);
private
public
Title: string;
Filename: string;
SaveType : ESaveType;
end;
var
SaveForm: TSaveForm;
implementation
uses Main, Global, cmap;
{$R *.DFM}
function EntryExists(En, Fl: string): boolean;
{ Searches for existing identifier in parameter files }
var
FStrings: TStringList;
i: integer;
begin
Result := False;
if FileExists(Fl) then
begin
FStrings := TStringList.Create;
try
FStrings.LoadFromFile(Fl);
for i := 0 to FStrings.Count - 1 do
if Pos(LowerCase(En) + ' {', Lowercase(FStrings[i])) = 1 then
Result := True;
finally
FStrings.Free;
end
end
else
Result := False;
end;
function SaveTypeTextKey(st : ESaveType) : string;
begin
case st of
stSaveParameters: Result := 'save-type-parameters';
stSaveAllParameters: Result := 'save-type-allparameters';
stSaveGradient: Result := 'save-type-gradient';
stExportUPR: Result := 'save-type-exportupr';
end;
end;
function SaveDefaultExt(st : ESaveType) : string;
begin
case st of
stSaveParameters: Result := 'flame';
stSaveAllParameters: Result := 'flame';
stSaveGradient: Result := 'gradient';
stExportUPR: Result := 'upr';
end;
end;
function SaveFilter(st : ESaveType): string;
begin
case st of
stSaveParameters: Result := Format('%s|*.flame;*.xml|%s|*.*',
[TextByKey('common-filter-flamefiles'), TextByKey('common-filter-allfiles')]);
stSaveAllParameters: Result := Format('%s|*.flame;*.xml|%s|*.*',
[TextByKey('common-filter-flamefiles'), TextByKey('common-filter-allfiles')]);
stSaveGradient: Result := Format('%s|*.gradient;*.ugr|%s|*.*',
[TextByKey('common-filter-gradientfiles'), TextByKey('common-filter-allfiles')]);
stExportUPR: Result := Format('%s|*.upr|%s|*.*',
[TextByKey('common-filter-uprfiles'), TextByKey('common-filter-allfiles')]);
end;
end;
procedure TSaveForm.btnSaveClick(Sender: TObject);
var
t, f: string;
check, onestr: boolean;
begin
t := Trim(txtTitle.Text);
f := Trim(txtFilename.Text);
if ((t = '') and txtTitle.Enabled) then
begin
Application.MessageBox(PChar(TextByKey('save-status-notitle')), 'Apophysis', 48);
Exit;
end;
if f = '' then
begin
Application.MessageBox(PChar(TextByKey('save-status-invalidfilename')), 'Apophysis', 48);
Exit;
end;
if ExtractFileExt(f) = '' then
begin
Application.MessageBox(PChar(TextByKey('save-status-invalidfilename')), 'Apophysis', 48);
Exit;
end;
if SaveType = stSaveParameters then
begin
check := XMLEntryExists(t, f);
onestr := false;
end
else if SaveType = stSaveAllParameters then
begin
onestr := true;
check := FileExists(f);
end
else
begin
onestr := false;
t := CleanIdentifier(t);
check := EntryExists(t, f);
end;
if check then begin if onestr then begin
if Application.MessageBox(PChar(Format(TextByKey('save-status-alreadyexists2'), [f])),
'Apophysis', 52) = ID_NO then exit;
end else begin
if Application.MessageBox(PChar(Format(TextByKey('save-status-alreadyexists'), [t, f])),
'Apophysis', 52) = ID_NO then exit;
end end;
if (t = '*') then t := '';
Title := t;
Filename := f;
ModalResult := mrOK;
end;
procedure TSaveForm.btnCancelClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TSaveForm.FormShow(Sender: TObject);
begin
txtFilename.Text := Filename;
txtTitle.Text := Title;
//btnSave.SetFocus;
self.Caption := TextByKey(SaveTypeTextKey(SaveType));
{if (SaveType = stSaveParameters) or (SaveType = stSaveAllParameters) then
self.Height := 160
else self.Height := 120; }
if (SaveType = stSaveAllParameters) then txtTitle.Text := '';
txtTitle.Enabled := (SaveType = stSaveParameters) or (SaveType = stExportUPR) or (SaveType = stSaveGradient);
if (not txtTitle.Enabled) then pnlName.Font.Color := clGrayText
else pnlName.Font.Color := clWindowText;
optUseOldFormat.Visible := (SaveType = stSaveParameters) or (SaveType = stSaveAllParameters);
optUseNewFormat.Visible := (SaveType = stSaveParameters) or (SaveType = stSaveAllParameters);
end;
procedure TSaveForm.btnDefGradientClick(Sender: TObject);
var
fn:string;
promptOverwrite: boolean;
begin
promptOverwrite := (SaveType <> stSaveParameters);
if OpenSaveFileDialog(self, SaveDefaultExt(SaveType), SaveFilter(SaveType),
ExtractFilePath(txtFilename.Text), TextByKey('common-browse'), fn, false,
(*promptOverwrite*)false, false, false) then
txtFileName.Text := fn;
end;
procedure TSaveForm.FormCreate(Sender: TObject);
begin
btnCancel.Caption := TextByKey('common-cancel');
btnSave.Caption := TextByKey('common-ok');
btnDefGradient.Hint := TextByKey('common-browse');
pnlTarget.Caption := TextByKey('common-destination');
pnlName.Caption := TextByKey('save-name');
optUseOldFormat.Caption := TextByKey('save-oldformat');
optUseNewFormat.Caption := TextByKey('save-newformat');
end;
end.

63
Forms/SavePreset.dfm Normal file
View File

@ -0,0 +1,63 @@
object SavePresetForm: TSavePresetForm
Left = 295
Top = 331
BorderStyle = bsDialog
Caption = 'Save Preset'
ClientHeight = 66
ClientWidth = 349
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
DesignSize = (
349
66)
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 190
Top = 37
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = 'OK'
Default = True
ModalResult = 1
TabOrder = 1
OnClick = Button1Click
end
object Button2: TButton
Left = 270
Top = 37
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Cancel'
ModalResult = 2
TabOrder = 2
end
object pnlName: TPanel
Left = 8
Top = 8
Width = 101
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Name'
ParentShowHint = False
ShowHint = True
TabOrder = 3
end
object txtPresetName: TEdit
Left = 104
Top = 8
Width = 239
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
end
end

69
Forms/SavePreset.pas Normal file
View File

@ -0,0 +1,69 @@
{
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 SavePreset;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Translation;
type
TSavePresetForm = class(TForm)
txtPresetName: TEdit;
Button1: TButton;
Button2: TButton;
pnlName: TPanel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
SavePresetForm: TSavePresetForm;
implementation
{$R *.DFM}
procedure TSavePresetForm.Button1Click(Sender: TObject);
begin
if txtPresetName.Text = '' then
begin
Application.MessageBox(PChar(TextByKey('savepreset-notitle')), 'Apophysis', 48);
Exit;
end;
end;
procedure TSavePresetForm.FormCreate(Sender: TObject);
begin
self.Caption := TextBykey('savepreset-title');
button1.Caption := TextByKey('common-ok');
button2.Caption := TextByKey('common-cancel');
pnlName.Caption := TextByKey('savepreset-name');
end;
end.

625
Forms/ScriptForm.dfm Normal file
View File

@ -0,0 +1,625 @@
object ScriptEditor: TScriptEditor
Left = 312
Top = 383
Caption = 'Script Editor'
ClientHeight = 485
ClientWidth = 583
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Icon.Data = {
0000010001001010000001002000680400001600000028000000100000002000
0000010020000000000040040000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000006349
35146349352E927A69FF8C7563FF87705EFF6349352E7F6654FF7A624FFF755D
4AFF6349352E6E5441FF6A513EFF674E3AFF6349352E00000000000000006349
352EAE9888FFEFE3DDFFF2E7E1FFEDDFD7FF836B59FFB79B8BFFDBBDADFFD9B7
A6FF725946FFAE8B77FFD0A692FFCC9E87FF654B38FF6349352E00000000B7A2
93FFFBF8F7FFF9F4F2FFF7F0ECFFF4EBE6FFF1E5DFFF7F6754FF7A624FFF765D
4AFF735946FF6E5542FF6B523EFF674E3AFF654B38FF634935FF00000000B7A2
93FFFDFCFBFFFBF9F7FFFAF5F2FFF7EFEDFFF4EAE6FFF2E5DFFFDDDCD7FFDFD7
CEFFDECDC0FFDEC5B6FFDEBFACFFDBBAA6FFD8B5A3FF634935FF00000000B7A2
93FFFFFFFFFFB47F65FFB47F64FFEDDDD5FFB37E63FFF4EBE6FFF1E5DFFFEFDF
D7FFEBD9D1FFE8D3C9FFE5CDC1FFE1C6B9FFD6B3A1FF634A35FF00000000B9A4
95FFFFFFFFFFFFFFFFFFFDFCFCFFFCF9F7FFFAF4F2FFF6F0ECFFF4EBE5FFF2E5
DFFFEEDFD8FFEBD9D0FFE8D3C8FFE5CCC1FFDBBDADFF634A36FF00000000BDA7
98FFFFFFFFFF968E88FFEEDED7FF968E87FFEDDDD6FF968D86FF958C85FFF4EB
E6FFF2E5DFFFEFDFD8FFECD9D0FFE8D3C9FFE0C7BAFF634A35FF00000000C1AB
9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFFFBF8F7FFFAF4F2FFF7F0
ECFFF4EAE6FFF1E5DFFFEEDFD7FFEBD9D0FFE6D1C6FF634A35FF00000000C5AF
A0FFFFFFFFFFB48065FFB48065FF968E88FFC2B0A3FF968E87FF968E86FFF9F4
F2FFF7EFECFFF4EBE6FFF2E5DFFFEFDFD8FFEADBD1FF634936FF00000000C8B2
A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFFFCF8
F7FFF9F5F2FFF7F0ECFFF4EBE6FFF1E5DFFFEEE2DAFF644A36FF00000000C9B4
A5FFFFFFFFFFFFFFFFFF66A365FF66A365FF66A365FFC0B4ADFF66A365FF66A3
65FF66A264FFFAF5F2FFF7F0ECFFF4EBE6FFEEE2DAFF644A36FF00000000C8B2
A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFEFCFBFFFBF9F7FFFAF4F2FFF7F0EDFFF3EAE4FF644A36FF00000000C8B2
A3FFCAB4A5FFCBB5A6FFCAB4A5FFC9B3A4FFC7B2A3FFC6B0A1FFC3AE9FFFC1AC
9DFFBFAA9BFFBDA899FFBBA697FFB9A495FFB8A394FFB7A293FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000FFFF
0000FFFF00000003000000010000000100000001000000010000000100000001
0000000100000001000000010000000100000001000000010000FFFF0000}
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShortCut = FormShortCut
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Splitter1: TSplitter
Left = 0
Top = 373
Width = 583
Height = 4
Cursor = crVSplit
Align = alBottom
end
object ToolBar: TToolBar
Left = 560
Top = 0
Width = 23
Height = 373
Align = alRight
AutoSize = True
Caption = 'ToolBar'
Images = MainForm.Buttons
ParentShowHint = False
ShowHint = True
TabOrder = 0
object btnNew: TToolButton
Left = 0
Top = 0
Hint = 'New'
Caption = 'btnNew'
ImageIndex = 0
Wrap = True
OnClick = btnNewClick
end
object btnOpen: TToolButton
Left = 0
Top = 22
Hint = 'Open'
Caption = 'btnOpen'
ImageIndex = 1
Wrap = True
OnClick = btnOpenClick
end
object btnSave: TToolButton
Left = 0
Top = 44
Hint = 'Save'
Caption = 'btnSave'
ImageIndex = 2
Wrap = True
OnClick = btnSaveClick
end
object btnRun: TToolButton
Left = 0
Top = 66
Hint = 'Run'
Caption = 'btnRun'
ImageIndex = 43
Wrap = True
OnClick = btnRunClick
end
object btnStop: TToolButton
Left = 0
Top = 88
Hint = 'Stop'
Caption = 'btnStop'
Enabled = False
ImageIndex = 36
Wrap = True
OnClick = btnStopClick
end
object btnBreak: TToolButton
Left = 0
Top = 110
Hint = 'Break'
Enabled = False
ImageIndex = 37
OnClick = btnBreakClick
end
end
object StatusBar: TStatusBar
Left = 0
Top = 466
Width = 583
Height = 19
Anchors = [akLeft, akRight]
Panels = <>
end
object BackPanel: TPanel
Left = 0
Top = 0
Width = 560
Height = 373
Align = alClient
BevelInner = bvLowered
BevelOuter = bvLowered
Caption = 'BackPanel'
TabOrder = 2
object Editor: TAdvMemo
Left = 2
Top = 2
Width = 556
Height = 369
Cursor = crIBeam
PopupMenu = PopupMenu
ActiveLineSettings.ShowActiveLine = False
ActiveLineSettings.ShowActiveLineIndicator = False
Align = alClient
AutoCompletion.Font.Charset = DEFAULT_CHARSET
AutoCompletion.Font.Color = clWindowText
AutoCompletion.Font.Height = -11
AutoCompletion.Font.Name = 'MS Sans Serif'
AutoCompletion.Font.Style = []
AutoCompletion.Height = 120
AutoCompletion.StartToken = '(.'
AutoCompletion.Width = 400
AutoCorrect.Active = True
AutoHintParameterPosition = hpBelowCode
BlockShow = False
BlockColor = clWindow
BlockLineColor = clGray
BkColor = clWindow
BookmarkGlyph.Data = {
36050000424D3605000000000000360400002800000010000000100000000100
0800000000000001000000000000000000000001000000000000000000000000
80000080000000808000800000008000800080800000C0C0C000C0DCC000F0CA
A6000020400000206000002080000020A0000020C0000020E000004000000040
20000040400000406000004080000040A0000040C0000040E000006000000060
20000060400000606000006080000060A0000060C0000060E000008000000080
20000080400000806000008080000080A0000080C0000080E00000A0000000A0
200000A0400000A0600000A0800000A0A00000A0C00000A0E00000C0000000C0
200000C0400000C0600000C0800000C0A00000C0C00000C0E00000E0000000E0
200000E0400000E0600000E0800000E0A00000E0C00000E0E000400000004000
20004000400040006000400080004000A0004000C0004000E000402000004020
20004020400040206000402080004020A0004020C0004020E000404000004040
20004040400040406000404080004040A0004040C0004040E000406000004060
20004060400040606000406080004060A0004060C0004060E000408000004080
20004080400040806000408080004080A0004080C0004080E00040A0000040A0
200040A0400040A0600040A0800040A0A00040A0C00040A0E00040C0000040C0
200040C0400040C0600040C0800040C0A00040C0C00040C0E00040E0000040E0
200040E0400040E0600040E0800040E0A00040E0C00040E0E000800000008000
20008000400080006000800080008000A0008000C0008000E000802000008020
20008020400080206000802080008020A0008020C0008020E000804000008040
20008040400080406000804080008040A0008040C0008040E000806000008060
20008060400080606000806080008060A0008060C0008060E000808000008080
20008080400080806000808080008080A0008080C0008080E00080A0000080A0
200080A0400080A0600080A0800080A0A00080A0C00080A0E00080C0000080C0
200080C0400080C0600080C0800080C0A00080C0C00080C0E00080E0000080E0
200080E0400080E0600080E0800080E0A00080E0C00080E0E000C0000000C000
2000C0004000C0006000C0008000C000A000C000C000C000E000C0200000C020
2000C0204000C0206000C0208000C020A000C020C000C020E000C0400000C040
2000C0404000C0406000C0408000C040A000C040C000C040E000C0600000C060
2000C0604000C0606000C0608000C060A000C060C000C060E000C0800000C080
2000C0804000C0806000C0808000C080A000C080C000C080E000C0A00000C0A0
2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E000C0C00000C0C0
2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A000808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FDFD25252525
2525252525252525FDFDFD2E25FFFFFFFFFFFFFFFFFFFF25FDFDFD2525252525
2525252525252525FDFD9A9AB7B7B7B7B7B7B7B7B7B72525FDFDFD25B7B7B7B7
B7B7B7B7B7B72525FDFD9A9AB7B7B7B7B7B7B7B7B7B72525FDFDFD25BFB7BFBF
B7B7B7B7B7B72525FDFD9A9ABFBFBFB7BFBFB7B7B7B72525FDFDFD25BFBFBFBF
BFB7BFBFB7B72525FDFD9A9ABFBFBFB7BFBFBFB7BFB72525FDFDFD25BFBFBFBF
BFBFBFBFBFB72525FDFD9A9ABFBFBFBFBFB7BFBFB7B72525FDFDFD25BFBFBFBF
BFBFBFBFBFB72525FDFD9A9ABFBFBFBFBFBFBFBFBFB725FDFDFDFD2525252525
25252525252525FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD}
BorderStyle = bsNone
ClipboardFormats = [cfText]
CodeFolding.Enabled = False
CodeFolding.LineColor = clGray
Ctl3D = False
DelErase = True
EnhancedHomeKey = False
Gutter.DigitCount = 4
Gutter.Font.Charset = DEFAULT_CHARSET
Gutter.Font.Color = clWindowText
Gutter.Font.Height = -13
Gutter.Font.Name = 'Courier New'
Gutter.Font.Style = []
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlack
Font.Height = -13
Font.Name = 'COURIER NEW'
Font.Style = []
HiddenCaret = False
Lines.Strings = (
'{ Rotate the reference triangle continuously }'
'{ Hit any key to stop }'
'Flame.SampleDensity := 1;'
'while not Stopped do'
'begin'
' RotateReference(3.6);'
' Preview;'
'end;')
MarkerList.UseDefaultMarkerImageIndex = False
MarkerList.DefaultMarkerImageIndex = -1
MarkerList.ImageTransparentColor = 33554432
PrintOptions.MarginLeft = 0
PrintOptions.MarginRight = 0
PrintOptions.MarginTop = 0
PrintOptions.MarginBottom = 0
PrintOptions.PageNr = False
PrintOptions.PrintLineNumbers = False
RightMarginColor = 14869218
ScrollHint = False
SelColor = clWhite
SelBkColor = clHighlight
ShowRightMargin = True
SmartTabs = False
SyntaxStyles = Styler
TabOrder = 0
TabSize = 4
TabStop = True
TrimTrailingSpaces = False
UILanguage.ScrollHint = 'Row'
UILanguage.Undo = 'Undo'
UILanguage.Redo = 'Redo'
UILanguage.Copy = 'Copy'
UILanguage.Cut = 'Cut'
UILanguage.Paste = 'Paste'
UILanguage.Delete = 'Delete'
UILanguage.SelectAll = 'Select All'
UrlAware = False
UrlStyle.TextColor = clBlue
UrlStyle.BkColor = clWhite
UrlStyle.Style = [fsUnderline]
UseStyler = True
Version = '3.0.0.0'
WordWrap = wwNone
OnChange = EditorChange
end
end
object Console: TMemo
Left = 0
Top = 377
Width = 583
Height = 89
Align = alBottom
Constraints.MinHeight = 20
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 3
end
object MainOpenDialog: TOpenDialog
DefaultExt = 'asc'
Filter = 'Apophysis Script Files (*.asc)|*.asc|Text files (*.txt)|*.txt'
Options = [ofHideReadOnly, ofFileMustExist, ofEnableSizing]
Left = 472
Top = 64
end
object MainSaveDialog: TSaveDialog
DefaultExt = 'asc'
Filter = 'Apophysis Script Files (*.asc)|*.asc|Text files (*.txt)|*.txt'
Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing]
Left = 344
Top = 32
end
object PopupMenu: TPopupMenu
Images = MainForm.Buttons
Left = 280
Top = 112
object mnuUndo: TMenuItem
Caption = 'Undo'
ImageIndex = 4
OnClick = mnuUndoClick
end
object N1: TMenuItem
Caption = '-'
end
object mnuCut: TMenuItem
Caption = 'Cut'
ImageIndex = 6
ShortCut = 16472
OnClick = mnuCutClick
end
object mnuCopy: TMenuItem
Caption = 'Copy'
ImageIndex = 7
OnClick = mnuCopyClick
end
object mnuPaste: TMenuItem
Caption = 'Paste'
ImageIndex = 8
OnClick = mnuPasteClick
end
end
object Scripter: TatPascalScripter
SourceCode.Strings = (
'')
SaveCompiledCode = False
EventSupport = False
OnCompileError = ScripterCompileError
ShortBooleanEval = False
LibOptions.SearchPath.Strings = (
'$(CURDIR)'
'$(APPDIR)')
LibOptions.SourceFileExt = '.psc'
LibOptions.CompiledFileExt = '.pcu'
LibOptions.UseScriptFiles = False
CallExecHookEvent = False
Left = 480
Top = 200
end
object OpenDialog: TOpenDialog
DefaultExt = 'fla'
Filter =
'Flame files (*.flame)|*.flame|Apophysis 1.0 parameters (*.apo;*.' +
'fla)|*.apo;*.fla|All files (*.*)|*.*'
Options = [ofHideReadOnly, ofFileMustExist, ofEnableSizing]
Left = 416
Top = 200
end
object SaveDialog: TSaveDialog
DefaultExt = 'flame'
Filter = 'Flame files (*.flame)|*.flame'
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofEnableSizing]
Left = 440
Top = 128
end
object Styler: TAdvPascalMemoStyler
BlockStart = 'begin,try,case,class,record'
BlockEnd = 'end'
LineComment = '//'
MultiCommentLeft = '{'
MultiCommentRight = '}'
CommentStyle.TextColor = clNavy
CommentStyle.BkColor = clWhite
CommentStyle.Style = [fsItalic]
NumberStyle.TextColor = clFuchsia
NumberStyle.BkColor = clWhite
NumberStyle.Style = [fsBold]
HighlightStyle.TextColor = clWhite
HighlightStyle.BkColor = clRed
HighlightStyle.Style = [fsBold]
AllStyles = <
item
KeyWords.Strings = (
'absolute'
'abstract'
'and'
'array'
'as'
'asm'
'assembler'
'automated'
'begin'
'break'
'case'
'cdecl'
'class'
'class'
'const'
'constructor'
'continue'
'default'
'deprecated'
'destructor'
'dispid'
'dispinterface'
'div'
'do'
'downto'
'dynamic'
'else'
'end'
'except'
'exports'
'external'
'far'
'file'
'finalise'
'finally'
'for'
'forward'
'function'
'if'
'implementation'
'in'
'inherited'
'initialise'
'inline'
'interface'
'is'
'label'
'library'
'message'
'mod'
'near'
'nil'
'not'
'object'
'of'
'or'
'out'
'overload'
'override'
'packed'
'pascal'
'platform'
'private'
'procedure'
'program'
'program'
'property'
'protected'
'public'
'published'
'raise'
'record'
'register'
'reintroduce'
'repeat'
'resourcestring'
'safecall'
'set'
'shl'
'shr'
'stdcall'
'stored'
'string'
'then'
'threadvar'
'to'
'try'
'type'
'unit'
'until'
'uses'
'var'
'virtual'
'while'
'with'
'xor')
Font.Charset = DEFAULT_CHARSET
Font.Color = clGreen
Font.Height = -11
Font.Name = 'Courier New'
Font.Style = [fsBold]
BGColor = clWhite
StyleType = stKeyword
BracketStart = #0
BracketEnd = #0
Info = 'Pascal Standard Default'
end
item
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'Courier New'
Font.Style = []
BGColor = clWhite
StyleType = stBracket
BracketStart = #39
BracketEnd = #39
Info = 'Simple Quote'
end
item
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'Courier New'
Font.Style = []
BGColor = clWhite
StyleType = stBracket
BracketStart = '"'
BracketEnd = '"'
Info = 'Double Quote'
end
item
Font.Charset = DEFAULT_CHARSET
Font.Color = clRed
Font.Height = -11
Font.Name = 'Courier New'
Font.Style = []
BGColor = clWhite
StyleType = stSymbol
BracketStart = #0
BracketEnd = #0
Symbols = ' ,;:.(){}[]=+-*/^%<>#'#13#10
Info = 'Symbols Delimiters'
end>
AutoCompletion.Strings = (
'ShowMessage'
'MessageDlg')
HintParameter.TextColor = clBlack
HintParameter.BkColor = clInfoBk
HintParameter.HintCharStart = '('
HintParameter.HintCharEnd = ')'
HintParameter.HintCharDelimiter = ';'
HintParameter.HintClassDelimiter = '.'
HintParameter.HintCharWriteDelimiter = ','
HintParameter.Parameters.Strings = (
'ShowMessage(const Msg: string);'
'MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMs' +
'gDlgButtons; HelpCtx: Longint): Integer);')
HexIdentifier = '$'
Description = 'Pascal'
Filter = 'Pascal Files (*.pas,*.dpr,*.dpk,*.inc)|*.pas;*.dpr;*.dpk;*.inc'
DefaultExtension = '.pas'
StylerName = 'Pascal'
Extensions = 'pas;dpr;dpk;inc'
RegionDefinitions = <
item
Identifier = 'procedure'
RegionStart = 'begin'
RegionEnd = 'end'
RegionType = rtClosed
ShowComments = False
end
item
Identifier = 'constructor'
RegionStart = 'begin'
RegionEnd = 'end'
RegionType = rtClosed
ShowComments = False
end
item
Identifier = 'destructor'
RegionStart = 'begin'
RegionEnd = 'end'
RegionType = rtClosed
ShowComments = False
end
item
Identifier = 'interface'
RegionStart = 'interface'
RegionType = rtOpen
ShowComments = False
end
item
Identifier = 'unit'
RegionStart = 'unit'
RegionType = rtFile
ShowComments = False
end
item
Identifier = 'implementation'
RegionStart = 'implementation'
RegionType = rtOpen
ShowComments = False
end
item
Identifier = 'case'
RegionStart = 'case'
RegionEnd = 'end'
RegionType = rtIgnore
ShowComments = False
end
item
Identifier = 'try'
RegionStart = 'try'
RegionEnd = 'end'
RegionType = rtIgnore
ShowComments = False
end
item
Identifier = 'function'
RegionStart = 'begin'
RegionEnd = 'end'
RegionType = rtClosed
ShowComments = False
end
item
Identifier = '{$region'
RegionStart = '{$region'
RegionEnd = '{$endregion'
RegionType = rtClosed
ShowComments = False
end>
Left = 288
Top = 208
end
end

4210
Forms/ScriptForm.pas Normal file

File diff suppressed because it is too large Load Diff

40
Forms/ScriptRender.dfm Normal file
View File

@ -0,0 +1,40 @@
object ScriptRenderForm: TScriptRenderForm
Left = 390
Top = 391
BorderStyle = bsDialog
Caption = 'ScriptRenderForm'
ClientHeight = 58
ClientWidth = 285
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
DesignSize = (
285
58)
PixelsPerInch = 96
TextHeight = 13
object btnCancel: TButton
Left = 96
Top = 28
Width = 95
Height = 25
Anchors = [akLeft, akRight, akBottom]
Caption = '&Cancel'
TabOrder = 0
OnClick = btnCancelClick
end
object ProgressBar: TProgressBar
Left = 8
Top = 8
Width = 271
Height = 13
Anchors = [akLeft, akTop, akRight]
TabOrder = 1
end
end

172
Forms/ScriptRender.pas Normal file
View File

@ -0,0 +1,172 @@
{
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 ScriptRender;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, RenderThread, cmap, ControlPoint, Translation;
type
TScriptRenderForm = class(TForm)
btnCancel: TButton;
ProgressBar: TProgressBar;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
private
// PixelsPerUnit: double;
StartTime: TDateTime;
Remainder: TDateTime;
procedure HandleThreadCompletion(var Message: TMessage);
message WM_THREAD_COMPLETE;
procedure HandleThreadTermination(var Message: TMessage);
message WM_THREAD_TERMINATE;
public
Renderer: TRenderThread;
ColorMap: TColorMap;
cp: TControlPoint;
Filename: string;
ImageWidth, ImageHeight, Oversample: Integer;
zoom, Sample_Density, Brightness, Gamma, Vibrancy, Filter_Radius: double;
center: array[0..1] of double;
procedure OnProgress(prog: double);
procedure Render;
procedure SetRenderBounds;
end;
var
ScriptRenderForm: TScriptRenderForm;
Cancelled: boolean;
implementation
uses Global, Math, FormRender, ScriptForm;
{$R *.DFM}
procedure TScriptRenderForm.SetRenderBounds;
begin
cp.copy(ScriptEditor.cp);
//cp.Width := ScriptEditor.Renderer.Width;
//cp.Height := ScriptEditor.Renderer.Height;
cp.AdjustScale(ScriptEditor.Renderer.Width, ScriptEditor.Renderer.Height);
// --?-- cp.CalcBoundBox;
cp.center[0] := ScriptEditor.cp.center[0];
cp.center[1] := ScriptEditor.cp.center[1];
cp.zoom := ScriptEditor.cp.zoom;
//PixelsPerUnit := cp.Pixels_per_unit;
end;
procedure TScriptRenderForm.Render;
begin
assert(not Assigned(Renderer));
Renderer := TRenderThread.Create;
Cancelled := False;
ScriptEditor.Scripter.Paused := True;
StartTime := Now;
Remainder := 1;
cp.copy(ScriptEditor.cp);
Filename := ScriptEditor.Renderer.Filename;
//cp.Width := ScriptEditor.Renderer.Width;
//cp.Height := ScriptEditor.Renderer.Height;
//cp.pixels_per_unit := PixelsPerUnit;
cp.AdjustScale(ScriptEditor.Renderer.Width, ScriptEditor.Renderer.Height);
cp.Transparency := (PNGTransparency <> 0) and (UpperCase(ExtractFileExt(ScriptEditor.Renderer.FileName)) = '.PNG');
Renderer.OnProgress := OnProgress;
// Renderer.Compatibility := Compatibility;
Renderer.SetCP(cp);
if (ScriptEditor.Renderer.MaxMemory > 0) then Renderer.MaxMem := ScriptEditor.Renderer.MaxMemory;
Renderer.TargetHandle := Handle;
renderPath := ExtractFilePath(ScriptEditor.Renderer.Filename);
Renderer.Priority := tpLower;
Renderer.NrThreads := NrTreads;
Renderer.Resume;
// Renderer.SaveImage(FileName);
// ScriptEditor.Scripter.Paused := False;
end;
procedure TScriptRenderForm.OnProgress(prog: double);
var
Elapsed: TDateTime;
begin
prog := (Renderer.Slice + Prog) / Renderer.NrSlices;
ProgressBar.Position := round(100 * prog);
Elapsed := Now - StartTime;
// if prog > 0 then Remainder := Elapsed * (1/prog - 1);
//Application.ProcessMessages;
end;
procedure TScriptRenderForm.FormDestroy(Sender: TObject);
begin
cp.free;
assert(not Assigned(Renderer)); //if Assigned(Renderer) then Renderer.free;
end;
procedure TScriptRenderForm.FormCreate(Sender: TObject);
begin
//Renderer := TRenderThread.Create;
self.Caption := TextByKey('script-rendering');
btnCancel.Caption := TextByKey('common-cancel');
cp := TControlPoint.Create;
end;
procedure TScriptRenderForm.btnCancelClick(Sender: TObject);
begin
ScriptEditor.Scripter.Halt;
Cancelled := True;
// Renderer.Stop;
if Assigned(Renderer) then begin
Renderer.Terminate;
Renderer.WaitFor;
Renderer.Free;
Renderer := nil;
end;
LastError := 'Render cancelled';
end;
procedure TScriptRenderForm.HandleThreadCompletion(var Message: TMessage);
begin
Renderer.SaveImage(FileName);
Renderer.Free;
Renderer := nil;
ScriptEditor.Scripter.Paused := False;
end;
procedure TScriptRenderForm.HandleThreadTermination(var Message: TMessage);
begin
if Assigned(Renderer) then
begin
Renderer.Free;
Renderer := nil;
end;
end;
end.

11305
Forms/SplashForm.dfm Normal file

File diff suppressed because it is too large Load Diff

39
Forms/SplashForm.pas Normal file
View File

@ -0,0 +1,39 @@
unit SplashForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Global;
type
TSplashWindow = class(TForm)
BackgroundImage: TImage;
lblVersion: TLabel;
lblInfo: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure SetInfo(info:string);
end;
var
SplashWindow: TSplashWindow;
implementation
{$R *.dfm}
procedure TSplashWindow.FormCreate(Sender: TObject);
begin
lblVersion.Caption := APP_BUILD;
end;
procedure TSplashWindow.SetInfo(info:string);
begin
lblInfo.Caption := info;
//Application.ProcessMessages;
end;
end.

117
Forms/Template.dfm Normal file
View File

@ -0,0 +1,117 @@
object TemplateForm: TTemplateForm
Left = 399
Top = 213
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'New Flame'
ClientHeight = 391
ClientWidth = 547
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
FormStyle = fsStayOnTop
Icon.Data = {
0000010001001010000001001800680300001600000028000000100000002000
0000010018000000000000030000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000B7A293634935634935634935
6349356349356349356349356349356349356349350000000000000000000000
00000000B7A293FFFFFFB7A293B7A293B7A293B7A293B7A293B7A293B7A293B7
A293634935000000000000000000000000000000B7A293FFFFFFFFFFFFFCFAF9
F7F1EEF1E7E1ECDDD5E6D3C9E1CABDB7A2936349350000000000000000000000
00000000B7A293FFFFFFFFFFFFF5F5F5F1EEECECE4E0E6DBD4E1D1C9E4CFC4B7
A293634935000000000000000000000000000000B7A293FFFFFFC1C1C1ACACAC
ABAAA9A7A4A2A39D99A09692B4A69FB7A2936349350000000000000000000000
00000000BAA596FFFFFFB6B6B6ECECECFFFFFFFBF8F7EEE7E49C9591E8D8D0B7
A293634935000000000000000000000000000000BEA99AFFFFFFB6B6B6ECECEC
FFFFFFF8F7F6ACAAA7E7DEDAEEE1DAB7A2936349350000000000000000000000
00000000C3AE9EFFFFFFB6B6B6ECECECFCFCFCB9B9B9CCCBCAF7F1EEF1E7E1B7
A293634935000000000000000000000000000000C8B2A3FFFFFFB5B5B5EDEDED
C1C1C1CBCBCBFEFEFEFAF7F5F5EDE9B7A2936349350000000000000000000000
00000000CCB6A7FFFFFFB0B0B0C7C7C7C7C7C7FFFFFFFFFFFFFDFCFBB7A293B7
A293644A36000000000000000000000000000000D1BBABFFFFFFB6B6B6C1C1C1
FFFFFFFFFFFFFFFFFFB7A293644A36644A36644A360000000000000000000000
00000000D5BFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9A495D4C5BA64
4A36E1D5CD000000000000000000000000000000D8C2B2FFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFC0AB9C644A36E2D6CD0000000000000000000000000000
00000000D8C2B2D8C2B2D8C2B2D8C2B2D8C2B2D4BEAECFB9A9C9B3A4E2D6CD00
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000FFFF
0000C0070000C0070000C0070000C0070000C0070000C0070000C0070000C007
0000C0070000C0070000C0070000C0070000C00F0000C01F0000FFFF0000}
OldCreateOrder = False
OnCreate = FormCreate
OnShow = FormShow
DesignSize = (
547
391)
PixelsPerInch = 96
TextHeight = 13
object lblFile: TLabel
Left = 16
Top = 364
Width = 329
Height = 13
Anchors = [akLeft, akRight, akBottom]
AutoSize = False
Visible = False
end
object btnCancel: TButton
Left = 454
Top = 360
Width = 89
Height = 25
Anchors = [akRight, akBottom]
Cancel = True
Caption = 'Cancel'
TabOrder = 1
OnClick = btnCancelClick
end
object btnOK: TButton
Left = 357
Top = 359
Width = 89
Height = 25
Anchors = [akRight, akBottom]
Caption = 'OK'
Default = True
Enabled = False
TabOrder = 2
OnClick = btnOKClick
end
object Files: TListBox
Left = 112
Top = 8
Width = 417
Height = 113
ItemHeight = 13
TabOrder = 3
Visible = False
end
object TemplateList: TListView
Left = 8
Top = 8
Width = 529
Height = 344
Anchors = [akLeft, akTop, akRight, akBottom]
BevelInner = bvNone
BevelOuter = bvNone
BevelKind = bkTile
BorderStyle = bsNone
Color = clBtnFace
Columns = <>
LargeImages = UsedThumbnails
TabOrder = 0
OnChange = TemplateListChange
end
object UsedThumbnails: TImageList
Height = 128
Masked = False
Width = 128
Left = 8
Top = 320
end
end

344
Forms/Template.pas Normal file
View File

@ -0,0 +1,344 @@
{
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 = '<flame name="Blank Flame" version="Apophysis" size="1500 1000" center="0 0" background="0 0 0">';
blankFlameXML2 = '<xform weight="0.5" color="0" linear3D="1" coefs="1 0 0 1 0 0" />';
blankFlameXML3 = '<palette count="256" format="RGB">';
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 + '</palette></flame>';
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('<flame ', Lowercase(FStrings.Text)) <> 0) then
begin
for i := 0 to FStrings.Count - 1 do
begin
p := Pos('<flame ', LowerCase(FStrings[i]));
if (p <> 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.

133
Forms/Tracer.dfm Normal file
View File

@ -0,0 +1,133 @@
object TraceForm: TTraceForm
Left = 36
Top = 159
Width = 411
Height = 527
Caption = 'Trace'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Icon.Data = {
0000010001001010000000000800680500001600000028000000100000002000
0000010008000000000000010000000000000000000000010000000100000000
0000000080000080000000808000800000008000800080800000C0C0C000C0DC
C000F0CAA60004040400080808000C0C0C0011111100161616001C1C1C002222
220029292900555555004D4D4D004242420039393900807CFF005050FF009300
D600FFECCC00C6D6EF00D6E7E70090A9AD000000330000006600000099000000
CC00003300000033330000336600003399000033CC000033FF00006600000066
330000666600006699000066CC000066FF000099000000993300009966000099
99000099CC000099FF0000CC000000CC330000CC660000CC990000CCCC0000CC
FF0000FF660000FF990000FFCC00330000003300330033006600330099003300
CC003300FF00333300003333330033336600333399003333CC003333FF003366
00003366330033666600336699003366CC003366FF0033990000339933003399
6600339999003399CC003399FF0033CC000033CC330033CC660033CC990033CC
CC0033CCFF0033FF330033FF660033FF990033FFCC0033FFFF00660000006600
330066006600660099006600CC006600FF006633000066333300663366006633
99006633CC006633FF00666600006666330066666600666699006666CC006699
00006699330066996600669999006699CC006699FF0066CC000066CC330066CC
990066CCCC0066CCFF0066FF000066FF330066FF990066FFCC00CC00FF00FF00
CC009999000099339900990099009900CC009900000099333300990066009933
CC009900FF00996600009966330099336600996699009966CC009933FF009999
330099996600999999009999CC009999FF0099CC000099CC330066CC660099CC
990099CCCC0099CCFF0099FF000099FF330099CC660099FF990099FFCC0099FF
FF00CC00000099003300CC006600CC009900CC00CC0099330000CC333300CC33
6600CC339900CC33CC00CC33FF00CC660000CC66330099666600CC669900CC66
CC009966FF00CC990000CC993300CC996600CC999900CC99CC00CC99FF00CCCC
0000CCCC3300CCCC6600CCCC9900CCCCCC00CCCCFF00CCFF0000CCFF330099FF
6600CCFF9900CCFFCC00CCFFFF00CC003300FF006600FF009900CC330000FF33
3300FF336600FF339900FF33CC00FF33FF00FF660000FF663300CC666600FF66
9900FF66CC00CC66FF00FF990000FF993300FF996600FF999900FF99CC00FF99
FF00FFCC0000FFCC3300FFCC6600FFCC9900FFCCCC00FFCCFF00FFFF3300CCFF
6600FFFF9900FFFFCC006666FF0066FF660066FFFF00FF666600FF66FF00FFFF
66002100A5005F5F5F00777777008686860096969600CBCBCB00B2B2B200D7D7
D700DDDDDD00E3E3E300EAEAEA00F1F1F100F8F8F800F0FBFF00A4A0A0008080
80000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000
000000000000000000000000000000000000000000000000000000000000AC12
1212121212121212121212F70000AC000000000000000000000000120000AC00
0000000000000000000000120000AC00FA00FAFA00FA0000000000120000AC00
0000000000000000000000120000AC00FAFA00FAFAFA00FA000000120000AC00
0000000000000000000000120000AC00FA00FAFA00FAFA00000000120000AC00
0000000000000000000000120000AC000000000000000000000000120000ACAC
ACACACACACACACACACACACAC0000ACFF090909090909090909FFADFF0000ACAC
ACACACACACACACACACACACACAC0000000000000000000000000000000000FFFF
0000000100000001000000010000000100000001000000010000000100000001
0000000100000001000000010000000100000001000000010000FFFF0000}
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
DesignSize = (
403
500)
PixelsPerInch = 96
TextHeight = 13
object PageControl1: TPageControl
Left = 0
Top = 0
Width = 403
Height = 500
ActivePage = TabMain
Align = alClient
Images = MainForm.Buttons
TabOrder = 0
object TabMain: TTabSheet
Caption = 'Main'
ImageIndex = 47
object MainTrace: TMemo
Left = 0
Top = 0
Width = 395
Height = 471
Align = alClient
Color = clBlack
Font.Charset = DEFAULT_CHARSET
Font.Color = clLime
Font.Height = -11
Font.Name = 'Courier New'
Font.Style = []
ParentFont = False
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 0
end
end
object TabFullscreen: TTabSheet
Caption = 'Fullscreen'
ImageIndex = 52
object FullscreenTrace: TMemo
Left = 0
Top = 0
Width = 395
Height = 471
Align = alClient
Color = clBlack
Font.Charset = DEFAULT_CHARSET
Font.Color = clLime
Font.Height = -11
Font.Name = 'Courier New'
Font.Style = []
ParentFont = False
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 0
end
end
end
object cbTraceLevel: TComboBox
Left = 280
Top = 0
Width = 121
Height = 21
Style = csDropDownList
Anchors = [akTop, akRight]
ItemHeight = 13
TabOrder = 1
OnSelect = cbTraceLevelSelect
Items.Strings = (
'No trace'
'Minimal trace'
'Full trace')
end
end

149
Forms/Tracer.pas Normal file
View File

@ -0,0 +1,149 @@
{
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 Tracer;
{$define TRACEFORM_HIDDEN}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TTraceForm = class(TForm)
PageControl1: TPageControl;
TabMain: TTabSheet;
TabFullscreen: TTabSheet;
FullscreenTrace: TMemo;
cbTraceLevel: TComboBox;
MainTrace: TMemo;
procedure cbTraceLevelSelect(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
TraceForm: TTraceForm;
var
TraceLevel: integer;
const
MsgComplete = '< Received WM_THREAD_COMPLETE from RenderThread #';
MsgTerminated = '< Received WM_THREAD_TERMINATE from RenderThread #';
MsgNotAssigned = 'Ignoring message: RenderThread does not exist';
MsgAnotherRunning = 'Ignoring message: another RenderThread is running';
implementation
{$R *.dfm}
uses
Registry,
Global, Main;
procedure TTraceForm.cbTraceLevelSelect(Sender: TObject);
begin
TraceLevel := cbTraceLevel.ItemIndex;
end;
procedure TTraceForm.FormCreate(Sender: TObject);
var
Registry: TRegistry;
begin
{ Read position from registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Trace', False) then
begin
if Registry.ValueExists('Top') then
self.Top := Registry.ReadInteger('Top');
if Registry.ValueExists('Left') then
self.Left := Registry.ReadInteger('Left');
if Registry.ValueExists('Width') then
self.Width := Registry.ReadInteger('Width');
if Registry.ValueExists('Height') then
self.Height := Registry.ReadInteger('Height');
{$ifndef TRACEFORM_HIDDEN}
if Registry.ValueExists('TraceLevel') then
TraceLevel := Registry.ReadInteger('TraceLevel')
else
TraceLevel := 0;
MainForm.tbShowTrace.Visible := true;
MainForm.tbShowTrace.Enabled := true;
MainForm.tbTraceSeparator.Visible := true;
MainForm.tbTraceSeparator.Enabled := true;
{$else} // Tracer disabled in release version
TraceLevel := 0;
//MainForm.tbShowTrace.Visible := false;
//MainForm.tbShowTrace.Enabled := false;
//MainForm.tbTraceSeparator.Visible := false;
//MainForm.tbTraceSeparator.Enabled := false;
{$endif}
end;
Registry.CloseKey;
finally
Registry.Free;
end;
cbTraceLevel.ItemIndex := TraceLevel;
end;
procedure TTraceForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
Registry: TRegistry;
begin
{ Write position to registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Trace', True) then
begin
if self.WindowState <> wsMaximized then begin
Registry.WriteInteger('Top', self.Top);
Registry.WriteInteger('Left', self.Left);
Registry.WriteInteger('Width', self.Width);
Registry.WriteInteger('Height', self.Height);
Registry.WriteInteger('TraceLevel', TraceLevel);
end;
end;
finally
Registry.Free;
end;
end;
end.

251
Forms/formPostProcess.dfm Normal file
View File

@ -0,0 +1,251 @@
object frmPostProcess: TfrmPostProcess
Left = 421
Top = 359
Width = 709
Height = 575
Caption = 'Post Render'
Color = clBtnFace
Constraints.MinHeight = 200
Constraints.MinWidth = 700
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
DesignSize = (
701
548)
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 0
Top = 0
Width = 701
Height = 81
Align = alTop
BevelOuter = bvNone
TabOrder = 0
DesignSize = (
701
81)
object pnlFilter: TPanel
Left = 8
Top = 32
Width = 121
Height = 21
Cursor = crHandPoint
BevelOuter = bvLowered
Caption = 'Filter Radius'
TabOrder = 11
OnDblClick = DragPanelDblClick
OnMouseDown = DragPanelMouseDown
OnMouseMove = DragPanelMouseMove
OnMouseUp = DragPanelMouseUp
end
object pnlVibrancy: TPanel
Left = 360
Top = 32
Width = 105
Height = 21
Cursor = crHandPoint
BevelOuter = bvLowered
Caption = 'Vibrancy'
TabOrder = 10
OnDblClick = DragPanelDblClick
OnMouseDown = DragPanelMouseDown
OnMouseMove = DragPanelMouseMove
OnMouseUp = DragPanelMouseUp
end
object pnlBrightness: TPanel
Left = 192
Top = 32
Width = 105
Height = 21
Cursor = crHandPoint
BevelOuter = bvLowered
Caption = 'Brightness'
TabOrder = 8
OnDblClick = DragPanelDblClick
OnMouseDown = DragPanelMouseDown
OnMouseMove = DragPanelMouseMove
OnMouseUp = DragPanelMouseUp
end
object pnlContrast: TPanel
Left = 360
Top = 8
Width = 105
Height = 21
Cursor = crHandPoint
BevelOuter = bvLowered
Caption = 'Contrast'
TabOrder = 9
OnDblClick = DragPanelDblClick
OnMouseDown = DragPanelMouseDown
OnMouseMove = DragPanelMouseMove
OnMouseUp = DragPanelMouseUp
end
object pnlGamma: TPanel
Left = 192
Top = 8
Width = 105
Height = 21
Cursor = crHandPoint
BevelOuter = bvLowered
Caption = 'Gamma'
TabOrder = 7
OnDblClick = DragPanelDblClick
OnMouseDown = DragPanelMouseDown
OnMouseMove = DragPanelMouseMove
OnMouseUp = DragPanelMouseUp
end
object ProgressBar1: TProgressBar
Left = 8
Top = 61
Width = 690
Height = 20
Anchors = [akLeft, akRight, akBottom]
TabOrder = 1
end
object txtFilterRadius: TEdit
Left = 128
Top = 32
Width = 57
Height = 21
TabOrder = 2
end
object txtGamma: TEdit
Left = 296
Top = 8
Width = 57
Height = 21
TabOrder = 3
end
object txtVibrancy: TEdit
Left = 464
Top = 32
Width = 57
Height = 21
TabOrder = 6
end
object txtContrast: TEdit
Left = 464
Top = 8
Width = 57
Height = 21
TabOrder = 5
end
object txtBrightness: TEdit
Left = 296
Top = 32
Width = 57
Height = 21
TabOrder = 4
end
object pnlBackground: TPanel
Left = 8
Top = 8
Width = 121
Height = 21
Cursor = crArrow
BevelOuter = bvLowered
Caption = 'Background'
TabOrder = 12
OnDblClick = DragPanelDblClick
OnMouseDown = DragPanelMouseDown
OnMouseMove = DragPanelMouseMove
OnMouseUp = DragPanelMouseUp
end
object pnlBackColor: TPanel
Left = 128
Top = 8
Width = 57
Height = 21
Cursor = crHandPoint
BevelInner = bvRaised
BevelOuter = bvLowered
BorderStyle = bsSingle
TabOrder = 0
OnClick = pnlBackColorClick
object shBack: TShape
Left = 2
Top = 2
Width = 49
Height = 13
Align = alClient
Brush.Color = clBlack
Pen.Color = clWindow
Pen.Style = psClear
Pen.Width = 0
OnMouseUp = shBackMouseUp
end
end
object btnApply: TButton
Left = 597
Top = 16
Width = 97
Height = 25
Anchors = [akTop, akRight]
Caption = '&Apply'
Default = True
TabOrder = 13
OnClick = btnApplyClick
end
end
object ScrollBox1: TScrollBox
Left = 8
Top = 88
Width = 689
Height = 417
Align = alCustom
Anchors = [akLeft, akTop, akRight, akBottom]
BevelInner = bvNone
BevelKind = bkSoft
BorderStyle = bsNone
Color = clAppWorkSpace
ParentColor = False
TabOrder = 1
object Image: TImage
Left = 0
Top = 0
Width = 687
Height = 415
Align = alClient
AutoSize = True
Center = True
Proportional = True
Stretch = True
end
end
object btnSave: TButton
Left = 599
Top = 516
Width = 97
Height = 25
Anchors = [akRight, akBottom]
Caption = '&Save'
TabOrder = 2
OnClick = btnSaveClick
end
object chkFitToWindow: TCheckBox
Left = 8
Top = 520
Width = 490
Height = 17
Anchors = [akLeft, akRight, akBottom]
Caption = 'Fit to window'
Checked = True
State = cbChecked
TabOrder = 3
Visible = False
OnClick = chkFitToWindowClick
end
object ColorDialog: TColorDialog
Left = 612
Top = 76
end
end

523
Forms/formPostProcess.pas Normal file
View File

@ -0,0 +1,523 @@
{
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 formPostProcess;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, RenderingInterface, controlpoint, StdCtrls, ComCtrls,
Translation;
type
TfrmPostProcess = class(TForm)
Panel1: TPanel;
ScrollBox1: TScrollBox;
Image: TImage;
pnlBackColor: TPanel;
ColorDialog: TColorDialog;
ProgressBar1: TProgressBar;
txtFilterRadius: TEdit;
txtGamma: TEdit;
txtVibrancy: TEdit;
txtContrast: TEdit;
txtBrightness: TEdit;
pnlGamma: TPanel;
pnlBrightness: TPanel;
pnlContrast: TPanel;
pnlVibrancy: TPanel;
pnlFilter: TPanel;
shBack: TShape;
pnlBackground: TPanel;
btnSave: TButton;
chkFitToWindow: TCheckBox;
btnApply: TButton;
procedure chkFitToWindowClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure btnApplyClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure pnlBackColorClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure DragPanelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure DragPanelMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure DragPanelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure DragPanelDblClick(Sender: TObject);
procedure shBackMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
FRenderer: TBaseRenderer;
FCP: TControlPoint;
FImagename: string;
pnlDragMode, pnlDragged, pnlMM: boolean;
pnlDragPos, pnlDragOld: integer;
pnlDragValue: double;
mousepos: TPoint;
BkgColor: TColor;
Filter,
Gamma, Brightness,
Contrast, Vibrancy: double;
procedure UpdateFlame;
procedure SetDefaultValues;
procedure OnProgress(prog: double);
public
cp : TControlPoint;
procedure SetRenderer(Renderer: TBaseRenderer);
procedure SetControlPoint(CP: TControlPoint);
procedure SetImageName(imagename: string);
end;
var
frmPostProcess: TfrmPostProcess;
implementation
uses
Registry, Global, Main;
{$R *.dfm}
{ TfrmPostProcess }
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.SetRenderer(Renderer: TBaseRenderer);
begin
if assigned(FRenderer) then
FRenderer.Free;
FRenderer := Renderer;
Frenderer.OnProgress := OnProgress;
Image.Picture.Graphic := FRenderer.GetImage;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.FormShow(Sender: TObject);
var
Registry: TRegistry;
begin
{ Read posution from registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('Software\' + APP_NAME + '\Forms\PostProcess', False) then begin
if Registry.ValueExists('Left') then
Left := Registry.ReadInteger('Left');
if Registry.ValueExists('Top') then
Top := Registry.ReadInteger('Top');
//if Registry.ValueExists('Width') then
//Width := Registry.ReadInteger('Width');
//if Registry.ValueExists('Height') then
// Height := Registry.ReadInteger('Height');
end;
Registry.CloseKey;
finally
Registry.Free;
end;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.FormClose(Sender: TObject; var Action: TCloseAction);
var
Registry: TRegistry;
begin
{ Write position to registry }
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_CURRENT_USER;
if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\PostProcess', True) then
begin
Registry.WriteInteger('Top', Top);
Registry.WriteInteger('Left', Left);
// Registry.WriteInteger('Width', Width);
// Registry.WriteInteger('Height', Height);
end;
finally
Registry.Free;
end;
FRenderer.Free; // weirdness!!! :-/
FRenderer := nil;
Image.Picture.Graphic := nil;
FCP.Free;
FCP := nil;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.SetDefaultValues;
begin
BkgColor := RGB(Fcp.background[0], Fcp.background[1], Fcp.background[2]);
pnlBackColor.Color := BkgColor;
shBack.Brush.Color := BkgColor;
Filter := FCP.spatial_filter_radius;
txtFilterRadius.Text := FloatTostr(Filter);
Gamma := FCP.gamma;
txtGamma.Text := FloatTostr(Gamma);
Vibrancy := FCP.vibrancy;
txtVibrancy.Text := FloatTostr(Vibrancy);
Contrast := FCP.contrast;
txtContrast.Text := FloatTostr(Contrast);
Brightness := FCP.brightness;
txtBrightness.Text := FloatTostr(brightness);
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.SetControlPoint(CP: TControlPoint);
begin
if assigned(FCP) then
FCP.Free;
FCP := cp.Clone;
SetDefaultValues;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.pnlBackColorClick(Sender: TObject);
var
col: Longint;
begin
ColorDialog.Color := shBack.Brush.Color;
if ColorDialog.Execute then begin
pnlBackColor.Color := ColorDialog.Color;
shBack.Brush.Color := ColorDialog.Color;
col := ColorToRGB(ColorDialog.Color);
Fcp.background[0] := col and 255;
Fcp.background[1] := (col shr 8) and 255;
Fcp.background[2] := (col shr 16) and 255;
UpdateFlame;
end;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.UpdateFlame;
begin
Screen.Cursor := crHourGlass;
FRenderer.UpdateImage(FCP);
Image.Picture.Graphic := FRenderer.GetImage;
Screen.Cursor := crDefault;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.FormDestroy(Sender: TObject);
begin
if assigned(FRenderer) then
FRenderer.Free;
if assigned(FCP) then
FCP.Free;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.OnProgress(prog: double);
begin
ProgressBar1.Position := round(100 * prog);
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.btnApplyClick(Sender: TObject);
var
temp: double;
begin
TryStrToFloat(txtFilterRadius.Text, FCP.spatial_filter_radius);
if FCP.spatial_filter_radius > 2 then begin
FCP.spatial_filter_radius := 2;
txtFilterRadius.Text := '2';
end else if FCP.spatial_filter_radius < 0 then begin
FCP.spatial_filter_radius := 0.01;
txtFilterRadius.Text := FloatTostr(0.01);
end;
TryStrToFloat(txtGamma.Text, FCP.gamma);
if FCP.gamma > 10 then begin
FCP.gamma := 10;
txtGamma.Text := '10';
end else if FCP.gamma < 0.01 then begin
FCP.gamma := 0.01;
txtGamma.Text := FloatTostr(0.01);
end;
TryStrToFloat(txtVibrancy.Text, FCP.vibrancy);
if FCP.vibrancy > 10 then begin
FCP.vibrancy := 10;
txtVibrancy.Text := '10';
end else if FCP.vibrancy < 0.01 then begin
FCP.vibrancy := 0.01;
txtVibrancy.Text := FloatTostr(0.01);
end;
TryStrToFloat(txtContrast.Text, FCP.contrast);
if FCP.contrast > 10 then begin
FCP.contrast := 10;
txtContrast.Text := '10';
end else if FCP.contrast < 0.01 then begin
FCP.contrast := 0.01;
txtContrast.Text := FloatTostr(0.01);
end;
if TryStrToFloat(txtBrightness.Text, temp) then FCP.brightness := temp;
//TryStrToFloat(txtBrightness.Text, FCP.brightness);
if FCP.brightness > 100 then begin
FCP.brightness := 100;
txtBrightness.Text := '100';
end else if FCP.brightness < 0.01 then begin
FCP.brightness := 0.01;
txtBrightness.Text := FloatTostr(0.01);
end;
UpdateFlame;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.btnSaveClick(Sender: TObject);
begin
FRenderer.SaveImage(FImagename);
end;
///////////////////////////////////////////////////////////////////////////////
procedure TfrmPostProcess.SetImageName(imagename: string);
begin
FImagename := imagename;
end;
// -----------------------------------------------------------------------------
procedure TfrmPostProcess.DragPanelMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button <> mbLeft then exit;
if (Sender = pnlFilter) then
pnlDragValue := fcp.spatial_filter_radius * 10
else if (Sender = pnlGamma) then
pnlDragValue := fcp.gamma
else if (Sender = pnlBrightness) then
pnlDragValue := fcp.brightness
else if (Sender = pnlContrast) then
pnlDragValue := fcp.contrast
else if (Sender = pnlVibrancy) then
pnlDragValue := fcp.vibrancy
else exit;//assert(false);
pnlDragMode := true;
pnlDragPos := 0;
pnlDragOld := x;
pnlMM := false;
SetCaptureControl(TControl(Sender));
Screen.Cursor := crHSplit;
GetCursorPos(mousepos); // hmmm
pnlDragged := false;
end;
procedure TfrmPostProcess.DragPanelMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
v: double;
pEdit: ^TEdit;
enableDrag : boolean;
begin
if pnlMM then // hack: to skip MouseMove event
begin
pnlMM:=false;
end
else
if pnlDragMode and (x <> pnlDragOld) then
begin
Inc(pnlDragPos, x - pnlDragOld);
if GetKeyState(VK_MENU) < 0 then v := 100000
else if GetKeyState(VK_CONTROL) < 0 then v := 10000
else if GetKeyState(VK_SHIFT) < 0 then v := 100
else v := 1000;
v := Round6(pnlDragValue + pnlDragPos / v);
SetCursorPos(MousePos.x, MousePos.y); // hmmm
pnlMM:=true;
enableDrag := true;
if (Sender = pnlFilter) then
begin
v := v / 10;
if v > 2 then v := 2
else if v < 0.01 then v := 0.01;
fcp.spatial_filter_radius := v;
pEdit := @txtFilterRadius;
end
else if (Sender = pnlGamma) then
begin
if v > 10 then v := 10
else if v < 0.01 then v := 0.01;
fcp.gamma := v;
pEdit := @txtGamma;
end
else if (Sender = pnlBrightness) then
begin
if v > 100 then v := 100
else if v < 0.01 then v := 0.01;
fcp.brightness := v;
pEdit := @txtBrightness;
end
else if (Sender = pnlContrast) then
begin
if v > 10 then v := 10
else if v < 0.01 then v := 0.01;
fcp.contrast := v;
pEdit := @txtContrast;
end
else if (Sender = pnlVibrancy) then
begin
if v > 10 then v := 10
else if v < 0.01 then v := 0.01;
fcp.vibrancy := v;
pEdit := @txtVibrancy;
end else exit;
if enableDrag then begin
pEdit^.Text := FloatToStr(v);
//pEdit.Refresh;
pnlDragged := True;
// TODO: image preview (?)
//DrawPreview;
end;
end;
end;
procedure TfrmPostProcess.DragPanelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button <> mbLeft then exit;
if pnlDragMode then
begin
SetCaptureControl(nil);
pnlDragMode := false;
Screen.Cursor := crDefault;
if pnlDragged then
begin
//UpdateFlame;
pnlDragged := False;
end;
end;
end;
procedure TfrmPostProcess.DragPanelDblClick(Sender: TObject);
var
pValue: ^double;
pDefaultValue: ^double;
pEdit: ^TEdit;
begin
if (Sender = pnlFilter) then
begin
pValue := @fcp.spatial_filter_radius;
pDefaultValue := @Filter;
pEdit := @txtFilterRadius;
end
else if (Sender = pnlGamma) then
begin
pValue := @fcp.gamma;
pDefaultValue := @Gamma;
pEdit := @txtGamma;
end
else if (Sender = pnlBrightness) then
begin
{
pValue := @fcp.brightness;
pDefaultValue := @Brightness;
pEdit := @txtBrightness;
}
if fcp.brightness = Brightness then exit;
fcp.brightness := Brightness;
txtBrightness.Text := FloatToStr(fcp.brightness);
exit;
end
else if (Sender = pnlContrast) then
begin
pValue := @fcp.contrast;
pDefaultValue := @Contrast;
pEdit := @txtContrast
end
else if (Sender = pnlVibrancy) then
begin
pValue := @fcp.vibrancy;
pDefaultValue := @Vibrancy;
pEdit := @txtVibrancy;
end
else exit; //assert(false);
if pValue^ = pDefaultValue^ then exit;
pValue^ := pDefaultValue^;
pEdit^.Text := FloatToStr(pValue^);
//UpdateFlame;
end;
procedure TfrmPostProcess.shBackMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
pnlBackColorClick(sender);
end;
procedure TfrmPostProcess.FormCreate(Sender: TObject);
begin
btnApply.Caption := TextByKey('common-apply');
pnlFilter.Caption := TextByKey('common-filterradius');
pnlGamma.Caption := TextByKey('common-gamma');
pnlBrightness.Caption := TextByKey('common-brightness');
pnlContrast.Caption := TextByKey('common-contrast');
pnlVibrancy.Caption := TextByKey('common-vibrancy');
pnlBackground.Caption := TextByKey('common-background');
pnlFilter.Hint := TextByKey('common-dragpanelhint');
pnlGamma.Hint := TextByKey('common-dragpanelhint');
pnlBrightness.Hint := TextByKey('common-dragpanelhint');
pnlVibrancy.Hint := TextByKey('common-dragpanelhint');
pnlContrast.Hint := TextByKey('common-dragpanelhint');
self.Caption := TextByKey('postprocess-title');
btnSave.Caption := TextByKey('postprocess-save');
chkFitToWindow.Caption := TextByKey('postprocess-fittowindow');
end;
procedure TfrmPostProcess.chkFitToWindowClick(Sender: TObject);
begin
{if (chkFitToWindow.Checked) then begin
Image.Stretch := true;
Image.Align := alClient;
end else begin
Image.Stretch := false;
Image.Align := alNone;
end; }
end;
end.

267
IO/Base64.pas Normal file
View File

@ -0,0 +1,267 @@
{
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 Base64;
interface
uses
Windows, Sysutils;
type TBinArray = Array of Byte;
{ Base64 encode and decode a string }
function B64Encode(const data: TBinArray; size : integer): string;
procedure B64Decode(S: string; var data : TBinArray; var size : integer);
{******************************************************************************}
{******************************************************************************}
implementation
const
B64Table= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
procedure StringToBinArray(const s: String; var bin: TBinArray);
var
l: Integer;
begin
l := Length(s);
SetLength(bin, l);
CopyMemory(@bin[0], @s[1], l);
end;
procedure BinArrayToString(const bin: TBinArray; var s: string);
var
l: Integer;
begin
l := Length(bin);
SetLength(s, l);
CopyMemory(@s[1], @bin[0], l);
end;
function B64Encode(const data: TBinArray; size : integer) : string;
var
i: integer;
S: string;
InBuf: array[0..2] of byte;
OutBuf: array[0..3] of char;
begin
BinArrayToString(data, s);
SetLength(Result,((size+2) div 3)*4);
for i:= 1 to ((size+2) div 3) do
begin
if size< (i*3) then
Move(S[(i-1)*3+1],InBuf,size-(i-1)*3)
else
Move(S[(i-1)*3+1],InBuf,3);
OutBuf[0]:= B64Table[((InBuf[0] and $FC) shr 2) + 1];
OutBuf[1]:= B64Table[(((InBuf[0] and $03) shl 4) or ((InBuf[1] and $F0) shr 4)) + 1];
OutBuf[2]:= B64Table[(((InBuf[1] and $0F) shl 2) or ((InBuf[2] and $C0) shr 6)) + 1];
OutBuf[3]:= B64Table[(InBuf[2] and $3F) + 1];
Move(OutBuf,Result[(i-1)*4+1],4);
end;
if (size mod 3)= 1 then
begin
Result[Length(Result)-1]:= '=';
Result[Length(Result)]:= '=';
end
else if (Length(S) mod 3)= 2 then
Result[Length(Result)]:= '=';
end;
procedure B64Decode(S: string; var data : TBinArray; var size : integer);
var
i: integer;
InBuf: array[0..3] of byte;
OutBuf: array[0..2] of byte;
Result2: string;
begin
if (Length(S) mod 4)<> 0 then
raise Exception.Create('Base64: Incorrect string format');
SetLength(Result2,((Length(S) div 4)-1)*3);
for i:= 1 to ((Length(S) div 4)-1) do
begin
Move(S[(i-1)*4+1],InBuf,4);
if (InBuf[0]> 64) and (InBuf[0]< 91) then
Dec(InBuf[0],65)
else if (InBuf[0]> 96) and (InBuf[0]< 123) then
Dec(InBuf[0],71)
else if (InBuf[0]> 47) and (InBuf[0]< 58) then
Inc(InBuf[0],4)
else if InBuf[0]= 43 then
InBuf[0]:= 62
else
InBuf[0]:= 63;
if (InBuf[1]> 64) and (InBuf[1]< 91) then
Dec(InBuf[1],65)
else if (InBuf[1]> 96) and (InBuf[1]< 123) then
Dec(InBuf[1],71)
else if (InBuf[1]> 47) and (InBuf[1]< 58) then
Inc(InBuf[1],4)
else if InBuf[1]= 43 then
InBuf[1]:= 62
else
InBuf[1]:= 63;
if (InBuf[2]> 64) and (InBuf[2]< 91) then
Dec(InBuf[2],65)
else if (InBuf[2]> 96) and (InBuf[2]< 123) then
Dec(InBuf[2],71)
else if (InBuf[2]> 47) and (InBuf[2]< 58) then
Inc(InBuf[2],4)
else if InBuf[2]= 43 then
InBuf[2]:= 62
else
InBuf[2]:= 63;
if (InBuf[3]> 64) and (InBuf[3]< 91) then
Dec(InBuf[3],65)
else if (InBuf[3]> 96) and (InBuf[3]< 123) then
Dec(InBuf[3],71)
else if (InBuf[3]> 47) and (InBuf[3]< 58) then
Inc(InBuf[3],4)
else if InBuf[3]= 43 then
InBuf[3]:= 62
else
InBuf[3]:= 63;
OutBuf[0]:= (InBuf[0] shl 2) or ((InBuf[1] shr 4) and $03);
OutBuf[1]:= (InBuf[1] shl 4) or ((InBuf[2] shr 2) and $0F);
OutBuf[2]:= (InBuf[2] shl 6) or (InBuf[3] and $3F);
Move(OutBuf,Result2[(i-1)*3+1],3);
end;
if Length(S)<> 0 then
begin
Move(S[Length(S)-3],InBuf,4);
if InBuf[2]= 61 then
begin
if (InBuf[0]> 64) and (InBuf[0]< 91) then
Dec(InBuf[0],65)
else if (InBuf[0]> 96) and (InBuf[0]< 123) then
Dec(InBuf[0],71)
else if (InBuf[0]> 47) and (InBuf[0]< 58) then
Inc(InBuf[0],4)
else if InBuf[0]= 43 then
InBuf[0]:= 62
else
InBuf[0]:= 63;
if (InBuf[1]> 64) and (InBuf[1]< 91) then
Dec(InBuf[1],65)
else if (InBuf[1]> 96) and (InBuf[1]< 123) then
Dec(InBuf[1],71)
else if (InBuf[1]> 47) and (InBuf[1]< 58) then
Inc(InBuf[1],4)
else if InBuf[1]= 43 then
InBuf[1]:= 62
else
InBuf[1]:= 63;
OutBuf[0]:= (InBuf[0] shl 2) or ((InBuf[1] shr 4) and $03);
Result2:= Result2 + char(OutBuf[0]);
end
else if InBuf[3]= 61 then
begin
if (InBuf[0]> 64) and (InBuf[0]< 91) then
Dec(InBuf[0],65)
else if (InBuf[0]> 96) and (InBuf[0]< 123) then
Dec(InBuf[0],71)
else if (InBuf[0]> 47) and (InBuf[0]< 58) then
Inc(InBuf[0],4)
else if InBuf[0]= 43 then
InBuf[0]:= 62
else
InBuf[0]:= 63;
if (InBuf[1]> 64) and (InBuf[1]< 91) then
Dec(InBuf[1],65)
else if (InBuf[1]> 96) and (InBuf[1]< 123) then
Dec(InBuf[1],71)
else if (InBuf[1]> 47) and (InBuf[1]< 58) then
Inc(InBuf[1],4)
else if InBuf[1]= 43 then
InBuf[1]:= 62
else
InBuf[1]:= 63;
if (InBuf[2]> 64) and (InBuf[2]< 91) then
Dec(InBuf[2],65)
else if (InBuf[2]> 96) and (InBuf[2]< 123) then
Dec(InBuf[2],71)
else if (InBuf[2]> 47) and (InBuf[2]< 58) then
Inc(InBuf[2],4)
else if InBuf[2]= 43 then
InBuf[2]:= 62
else
InBuf[2]:= 63;
OutBuf[0]:= (InBuf[0] shl 2) or ((InBuf[1] shr 4) and $03);
OutBuf[1]:= (InBuf[1] shl 4) or ((InBuf[2] shr 2) and $0F);
Result2:= Result2 + char(OutBuf[0]) + char(OutBuf[1]);
end
else
begin
if (InBuf[0]> 64) and (InBuf[0]< 91) then
Dec(InBuf[0],65)
else if (InBuf[0]> 96) and (InBuf[0]< 123) then
Dec(InBuf[0],71)
else if (InBuf[0]> 47) and (InBuf[0]< 58) then
Inc(InBuf[0],4)
else if InBuf[0]= 43 then
InBuf[0]:= 62
else
InBuf[0]:= 63;
if (InBuf[1]> 64) and (InBuf[1]< 91) then
Dec(InBuf[1],65)
else if (InBuf[1]> 96) and (InBuf[1]< 123) then
Dec(InBuf[1],71)
else if (InBuf[1]> 47) and (InBuf[1]< 58) then
Inc(InBuf[1],4)
else if InBuf[1]= 43 then
InBuf[1]:= 62
else
InBuf[1]:= 63;
if (InBuf[2]> 64) and (InBuf[2]< 91) then
Dec(InBuf[2],65)
else if (InBuf[2]> 96) and (InBuf[2]< 123) then
Dec(InBuf[2],71)
else if (InBuf[2]> 47) and (InBuf[2]< 58) then
Inc(InBuf[2],4)
else if InBuf[2]= 43 then
InBuf[2]:= 62
else
InBuf[2]:= 63;
if (InBuf[3]> 64) and (InBuf[3]< 91) then
Dec(InBuf[3],65)
else if (InBuf[3]> 96) and (InBuf[3]< 123) then
Dec(InBuf[3],71)
else if (InBuf[3]> 47) and (InBuf[3]< 58) then
Inc(InBuf[3],4)
else if InBuf[3]= 43 then
InBuf[3]:= 62
else
InBuf[3]:= 63;
OutBuf[0]:= (InBuf[0] shl 2) or ((InBuf[1] shr 4) and $03);
OutBuf[1]:= (InBuf[1] shl 4) or ((InBuf[2] shr 2) and $0F);
OutBuf[2]:= (InBuf[2] shl 6) or (InBuf[3] and $3F);
Result2:= Result2 + Char(OutBuf[0]) + Char(OutBuf[1]) + Char(OutBuf[2]);
end;
end;
StringToBinArray(Result2, data);
size := Length(result2);
end;
end.

177
IO/Binary.pas Normal file
View File

@ -0,0 +1,177 @@
unit Binary;
interface
const
HIB_BLOCKSIZE = $10; // 16 bytes
HIB_MAXOFFSET = $0F; // HIB_BLOCKSIZE - 1
type
// low-level binary types
TBlock = array[0..HIB_MAXOFFSET] of byte;
TWord = array[0..1] of byte;
TDWord = array[0..3] of byte;
TQWord = array[0..7] of byte;
THibRawString = array of byte;
// procedures to write blocks at low level
procedure WriteData2(var target: TBlock; data: TWord; pos: integer);
procedure WriteData4(var target: TBlock; data: TDWord; pos: integer);
procedure WriteData8(var target: TBlock; data: TQWord; pos: integer);
// procedures to read blocks at low level
procedure ReadData2(source: TBlock; var data: TWord; pos: integer);
procedure ReadData4(source: TBlock; var data: TDWord; pos: integer);
procedure ReadData8(source: TBlock; var data: TQWord; pos: integer);
// procedures to write typed data to blocks
procedure Int16ToBlock(var target: TBlock; pos: integer; data: SmallInt);
procedure Int32ToBlock(var target: TBlock; pos: integer; data: Integer);
procedure LongWordToBlock(var target: TBlock; pos: integer; data: LongWord);
procedure Int64ToBlock(var target: TBlock; pos: integer; data: Int64);
procedure SingleToBlock(var target: TBlock; pos: integer; data: Single);
procedure DoubleToBlock(var target: TBlock; pos: integer; data: Double);
// procedures to read typed data from blocks
function BlockToInt16(source: TBlock; pos: integer): SmallInt;
function BlockToInt32(source: TBlock; pos: integer): Integer;
function BlockToLongWord(source: TBlock; pos: integer): LongWord;
function BlockToInt64(source: TBlock; pos: integer): Int64;
function BlockToSingle(source: TBlock; pos: integer): Single;
function BlockToDouble(source: TBlock; pos: integer): Double;
implementation
procedure ReadData2(source: TBlock; var data: TWord; pos: integer);
const size = 2;
var i: integer;
begin
for i := 0 to size - 1 do
if i + pos < HIB_BLOCKSIZE then
data[i] := source[i + pos];
end;
procedure ReadData4(source: TBlock; var data: TDWord; pos: integer);
const size = 4;
var i: integer;
begin
for i := 0 to size - 1 do
if i + pos < HIB_BLOCKSIZE then
data[i] := source[i + pos];
end;
procedure ReadData8(source: TBlock; var data: TQWord; pos: integer);
const size = 8;
var i: integer;
begin
for i := 0 to size - 1 do
if i + pos < HIB_BLOCKSIZE then
data[i] := source[i + pos];
end;
procedure WriteData2(var target: TBlock; data: TWord; pos: integer);
const size = 2;
var i: integer;
begin
for i := 0 to size - 1 do
if i + pos < HIB_BLOCKSIZE then
target[i + pos] := data[i];
end;
procedure WriteData4(var target: TBlock; data: TDWord; pos: integer);
const size = 4;
var i: integer;
begin
for i := 0 to size - 1 do
if i + pos < HIB_BLOCKSIZE then
target[i + pos] := data[i];
end;
procedure WriteData8(var target: TBlock; data: TQWord; pos: integer);
const size = 8;
var i: integer;
begin
for i := 0 to size - 1 do
if i + pos < HIB_BLOCKSIZE then
target[i + pos] := data[i];
end;
function BlockToInt16(source: TBlock; pos: integer): SmallInt;
var temp: TWord; data: SmallInt;
begin
ReadData2(source, temp, pos);
Move(temp, data, SizeOf(TWord));
Result := data;
end;
function BlockToInt32(source: TBlock; pos: integer): Integer;
var temp: TDWord; data: Integer;
begin
ReadData4(source, temp, pos);
Move(temp, data, SizeOf(TDWord));
Result := data;
end;
function BlockToLongWord(source: TBlock; pos: integer): LongWord;
var temp: TDWord; data: LongWord;
begin
ReadData4(source, temp, pos);
Move(temp, data, SizeOf(TDWord));
Result := data;
end;
function BlockToInt64(source: TBlock; pos: integer): Int64;
var temp: TQWord; data: Int64;
begin
ReadData8(source, temp, pos);
Move(temp, data, SizeOf(TQWord));
Result := data;
end;
function BlockToSingle(source: TBlock; pos: integer): Single;
var temp: TDWord; data: Single;
begin
ReadData4(source, temp, pos);
Move(temp, data, SizeOf(TDWord));
Result := data;
end;
function BlockToDouble(source: TBlock; pos: integer): Double;
var temp: TQWord; data: Double;
begin
ReadData8(source, temp, pos);
Move(temp, data, SizeOf(TQWord));
Result := data;
end;
procedure Int16ToBlock(var target: TBlock; pos: integer; data: SmallInt);
var temp: TWord;
begin
Move(data, temp, SizeOf(TWord));
WriteData2(target, temp, pos);
end;
procedure Int32ToBlock(var target: TBlock; pos: integer; data: Integer);
var temp: TDWord;
begin
Move(data, temp, SizeOf(TDWord));
WriteData4(target, temp, pos);
end;
procedure LongWordToBlock(var target: TBlock; pos: integer; data: LongWord);
var temp: TDWord;
begin
Move(data, temp, SizeOf(TDWord));
WriteData4(target, temp, pos);
end;
procedure Int64ToBlock(var target: TBlock; pos: integer; data: Int64);
var temp: TQWord;
begin
Move(data, temp, SizeOf(TQWord));
WriteData8(target, temp, pos);
end;
procedure SingleToBlock(var target: TBlock; pos: integer; data: single);
var temp: TDWord;
begin
Move(data, temp, SizeOf(TDWord));
WriteData4(target, temp, pos);
end;
procedure DoubleToBlock(var target: TBlock; pos: integer; data: double);
var temp: TQWord;
begin
Move(data, temp, SizeOf(TQWord));
WriteData8(target, temp, pos);
end;
end.

48
IO/CommandLine.pas Normal file
View File

@ -0,0 +1,48 @@
unit CommandLine;
interface
uses Dialogs, RegularExpressionsCore;
type TCommandLine = class
public
CreateFromTemplate : boolean;
TemplateFile : string;
TemplateName : string;
Lite: boolean;
procedure Load;
end;
implementation
procedure TCommandLine.Load;
var
Regex: TPerlRegEx;
begin
Regex := TPerlRegEx.Create;
Regex.RegEx := '-template\s+"(.+)"\s+"(.+)"';
Regex.Options := [preSingleLine, preCaseless];
Regex.Subject := Utf8String(CmdLine);
CreateFromTemplate := false;
if Regex.Match then begin
if Regex.GroupCount = 2 then begin
CreateFromTemplate := true;
TemplateFile := String(Regex.Groups[1]);
TemplateName := String(Regex.Groups[2]);
end;
end;
Regex.Destroy;
Regex := TPerlRegEx.Create;
Regex.RegEx := '-lite';
Regex.Options := [preSingleLine, preCaseless];
Regex.Subject := Utf8String(CmdLine);
CreateFromTemplate := false;
if Regex.Match then begin
Lite := true;
end;
Regex.Destroy;
end;
end.

397
IO/Hibernation.pas Normal file
View File

@ -0,0 +1,397 @@
unit Hibernation;
interface
uses RenderingCommon, RenderingInterface, SysUtils, Windows, Forms, Classes, Binary, ControlPoint;
const
HIB_VERSION_MAJOR = 2; // Apophysis7X.15
HIB_VERSION_MINOR = 10;
HIB_VERSION_REVISION = 1500;
HIB_ADDR_HEADER = $30; // 48 bytes
HIB_SIZE_HEADER = $30; // 48 bytes
HIB_ADDR_LOCATOR = $60; // HIB_SIZE_HEADER + HIB_ADDR_HEADER
HIB_SIZE_LOCATOR = $20; // 32 bytes
HIB_COOKIE_INTRO_HIGH = $AB; // A B0F
HIB_COOKIE_INTRO_LOW = $0F;
HIB_COOKIE_OUTRO_HIGH = $AE; // A E0F
HIB_COOKIE_OUTRO_LOW = $0F;
type
EHibBitsPerPixel = (
EBP_32 = 32,
EBP_64 = 64 // 64 bit renderer; probably used later
);
EHibPixelLayout = (
EPL_XYZW = 0123,
EPL_YXZW = 1023, // indicates different subpixel orders;
EPL_YZXW = 1203, // for example, metaphysis uses WXYZ (3012)
EPL_YZWX = 1230,
EPL_XZYW = 0213,
EPL_XZWY = 0231,
EPL_XYWZ = 0132,
EPL_ZXYW = 2013,
EPL_WXYZ = 3012,
EPL_XWYZ = 0312
);
EHibFileFlags = (
EFF_NONE = 0, // no flags (default)
EFF_FLOATBUFFER = 1, // using a float buffer (32/64bit)
EFF_SEPARATEFLAME = 2, // flame stored in separate file (unused yet)
EFF_BINARYFLAME = 4, // flame stored in binary format (unused yet)
EFF_COMPRESSED = 8 // data is GZIP-compressed (unused yet)
);
// some types for the header (some unused)
THibInt2_32 = record X, Y : integer; end;
THibInt2_64 = record X, Y : int64; end;
THibFloat2 = record X, Y : double; end;
THibFloat4 = record X, Y, Z, W : double; end;
THibBoolean = (HB_YES = -1, HB_NO = 0);
// the actual header
THibHeader = record
ActualDensity : double;
Size2D : THibInt2_64;
Size : int64;
RenderTime : TDateTime;
PauseTime : TDateTime;
end;
// file allocation and release procedures
procedure HibAllocate(var handle: File; path: string);
procedure HibOpen(var handle: File; path: string);
procedure HibFree(const handle: File);
// high-level write procedures
procedure HibWriteIntro(const handle: File);
procedure HibWriteOutro(const handle: File);
procedure HibWriteGlobals(const handle: File; flags: EHibFileFlags;
layout: EHibPixelLayout; bpp: EHibBitsPerPixel);
procedure HibWriteHeader(const handle: File; header: THibHeader);
procedure HibWriteData(const handle: File; header: THibHeader;
flame: TControlPoint; buckets: TBucket32Array;
colormap: TColorMapArray; callback: TOnProgress);
// high-level read procedures
procedure HibReadIntro(const handle: File; var cookieValid: boolean);
procedure HibReadOutro(const handle: File; var cookieValid: boolean);
procedure HibReadGlobals(const handle: File; var versionRel: smallint;
var flags: EHibFileFlags; var layout: EHibPixelLayout; var bpp: EHibBitsPerPixel);
procedure HibReadHeader(const handle: File; var header: THibHeader);
procedure HibReadData(const handle: File; header: THibHeader; var flame: TStringList;
var buckets: TBucket32Array; var colormap: TColorMapArray; callback: TOnProgress);
implementation
////////////////////////////////////////////////////////////////////////////////
procedure HibAllocate(var handle: File; path: string);
begin
AssignFile(handle, path);
ReWrite(handle, HIB_BLOCKSIZE);
end;
procedure HibOpen(var handle: File; path: string);
begin
AssignFile(handle, path);
FileMode := fmOpenRead;
Reset(handle, HIB_BLOCKSIZE);
end;
procedure HibFree(const handle: File);
begin
CloseFile(handle);
end;
////////////////////////////////////////////////////////////////////////////////
procedure HibWriteIntro(const handle: File);
var
block: TBlock;
chunk: string;
begin
block[0] := HIB_COOKIE_INTRO_HIGH;
block[1] := HIB_COOKIE_INTRO_LOW;
chunk := 'Apophysis7X Hi';
CopyMemory(@block[2], @chunk[1], Length(chunk));
BlockWrite(handle, block, 1);
chunk := 'bernation File';
block[14] := $0; block[15] := $0;
CopyMemory(@block[0], @chunk[1], Length(chunk));
BlockWrite(handle, block, 1);
end;
procedure HibWriteOutro(const handle: File);
var
block: TBlock;
begin
block[0] := $0; block[1] := $0; block[2] := $0; block[3] := $0;
block[4] := $0; block[5] := $0; block[6] := $0; block[7] := $0;
block[8] := $0; block[9] := $0; block[10] := $0; block[11] := $0;
block[12] := $0; block[13] := $0;
block[14] := HIB_COOKIE_OUTRO_HIGH;
block[15] := HIB_COOKIE_OUTRO_LOW;
BlockWrite(handle, block, 1);
end;
procedure HibWriteGlobals(const handle: File; flags: EHibFileFlags;
layout: EHibPixelLayout; bpp: EHibBitsPerPixel);
var
block: TBlock;
begin
Int16ToBlock(block, 0, HIB_VERSION_MAJOR);
Int16ToBlock(block, 2, HIB_VERSION_MINOR);
Int32ToBlock(block, 4, HIB_VERSION_REVISION);
Int16ToBlock(block, 8, SmallInt(flags));
Int16ToBlock(block, 10, HIB_SIZE_HEADER);
Int16ToBlock(block, 12, SmallInt(layout));
Int16ToBlock(block, 14, SmallInt(bpp));
BlockWrite(handle, block, 1);
end;
procedure HibWriteHeader(const handle: File; header: THibHeader);
var
block: TBlock;
begin
DoubleToBlock(block, 0, header.ActualDensity);
Int64ToBlock(block, 8, header.Size);
BlockWrite(handle, block, 1);
Int64ToBlock(block, 0, header.Size2D.X);
Int64ToBlock(block, 8, header.Size2D.Y);
BlockWrite(handle, block, 1);
Int64ToBlock(block, 0,
Int64(((Trunc(header.RenderTime) - 25569) * 86400) +
Trunc(86400 * (header.RenderTime -
Trunc(header.RenderTime))) - 7200));
Int64ToBlock(block, 8,
Int64(((Trunc(header.PauseTime) - 25569) * 86400) +
Trunc(86400 * (header.PauseTime -
Trunc(header.PauseTime))) - 7200));
BlockWrite(handle, block, 1);
end;
procedure HibWriteData(const handle: File; header: THibHeader; flame: TControlPoint;
buckets: TBucket32Array; colormap: TColorMapArray; callback: TOnProgress);
var
block: TBlock;
flametext: string;
rawflame: THibRawString;
rawflamesize: integer;
rawflamechunks: integer;
i, j, c: integer;
p, step: double;
begin
rawflamesize := CalcBinaryFlameSize(flame);
Int64ToBlock(block, 0, HIB_ADDR_LOCATOR + HIB_SIZE_LOCATOR);
Int64ToBlock(block, 8, Int64(rawflamesize) );
BlockWrite(handle, block, 1);
Int64ToBlock(block, 0, HIB_ADDR_LOCATOR + HIB_SIZE_LOCATOR + rawflamesize);
Int64ToBlock(block, 8, 16 * header.Size2D.X * header.Size2D.Y);
BlockWrite(handle, block, 1);
flame.SaveToBinary(handle);
callback(0);
c := 0; p := 0;
step := 1.0 / (header.Size2D.X * header.Size2D.Y);
for j := 0 to header.Size2D.Y - 1 do
for i := 0 to header.Size2D.X - 1 do
with buckets[j][i] do begin
Int32ToBlock(block, 0, Red);
Int32ToBlock(block, 4, Green);
Int32ToBlock(block, 8, Blue);
Int32ToBlock(block, 12, Count);
BlockWrite(handle, block, 1);
p := p + step;
c := (c + 1) mod 64;
if (c = 0) then begin
callback(p*0.99);
Application.ProcessMessages;
end;
end;
callback(0.99);
i := 0;
while i < 256 do begin
Int32ToBlock(block, 0,
(colormap[i+0].Red) or
(((colormap[i+0].Green) and $ff) shl 8) or
(((colormap[i+0].Blue) and $ff) shl 16));
Int32ToBlock(block, 4,
(colormap[i+1].Red) or
(((colormap[i+1].Green) and $ff) shl 8) or
(((colormap[i+1].Blue) and $ff) shl 16));
Int32ToBlock(block, 8,
(colormap[i+2].Red) or
(((colormap[i+2].Green) and $ff) shl 8) or
(((colormap[i+2].Blue) and $ff) shl 16));
Int32ToBlock(block, 12,
(colormap[i+3].Red) or
(((colormap[i+3].Green) and $ff) shl 8) or
(((colormap[i+3].Blue) and $ff) shl 16));
BlockWrite(handle, block, 1);
i := i + 4;
end;
callback(1);
end;
////////////////////////////////////////////////////////////////////////////////
procedure HibReadIntro(const handle: File; var cookieValid: boolean);
var
block1, block2: TBlock;
begin
BlockRead(handle, block1, 1);
BlockRead(handle, block2, 1);
cookieValid :=
(block1[0] = HIB_COOKIE_INTRO_HIGH) and
(block1[1] = HIB_COOKIE_INTRO_LOW);
end;
procedure HibReadOutro(const handle: File; var cookieValid: boolean);
var
block1, block2: TBlock;
begin
BlockRead(handle, block1, 1);
BlockRead(handle, block2, 1);
cookieValid :=
(block2[14] = HIB_COOKIE_OUTRO_HIGH) and
(block2[15] = HIB_COOKIE_OUTRO_LOW);
end;
procedure HibReadGlobals(const handle: File; var versionRel: SmallInt;
var flags: EHibFileFlags; var layout: EHibPixelLayout; var bpp: EHibBitsPerPixel);
var
block: TBlock;
major, minor, rev: Integer;
begin
BlockRead(handle, block, 1);
major := BlockToInt16(block, 0);
minor := BlockToInt16(block, 2);
rev := BlockToInt32(block, 4);
flags := EHibFileFlags(BlockToInt16(block, 8));
assert(BlockToInt16(block, 10) <> HIB_SIZE_HEADER, 'Invalid header size');
layout := EHibPixelLayout(BlockToInt16(block, 12));
bpp := EHibBitsPerPixel(BlockToInt16(block, 14));
if major < HIB_VERSION_MAJOR then versionRel := -1
else if major > HIB_VERSION_MAJOR then versionRel := 1
else begin
if minor < HIB_VERSION_MINOR then versionRel := -1
else if minor > HIB_VERSION_MINOR then versionRel := 1
else begin
if rev < HIB_VERSION_REVISION then versionRel := -1
else if rev > HIB_VERSION_REVISION then versionRel := 1
else versionRel := 0;
end;
end;
end;
procedure HibReadHeader(const handle: File; var header: THibHeader);
var
block: TBlock;
begin
BlockRead(handle, block, 1);
header.ActualDensity := BlockToDouble(block, 0);
header.Size := BlockToInt64(block, 8);
BlockRead(handle, block, 1);
header.Size2D.X := BlockToInt64(block, 0);
header.Size2D.Y := BlockToInt64(block, 8);
BlockRead(handle, block, 1);
header.RenderTime := ((BlockToInt64(block, 0) + 7200) / 86500) + 25569;
header.PauseTime := ((BlockToInt64(block, 8) + 7200) / 86500) + 25569;
end;
procedure HibReadData(const handle: File; header: THibHeader; var flame: TStringList;
var buckets: TBucket32Array; var colormap: TColorMapArray; callback: TOnProgress);
var
block: TBlock;
pos, offsf, sizef, offsd, sized : Int64;
fbytes: THibRawString;
i, c, bx, by: Integer;
p, step: Double;
begin
BlockRead(handle, block, 1);
offsf := BlockToInt64(block, 0);
sizef := BlockToInt64(block, 8);
BlockRead(handle, block, 1);
offsd := BlockToInt64(block, 0);
sized := BlockToInt64(block, 8);
pos := 0;
Seek(handle, offsf);
SetLength(fbytes, sizef);
while pos < sizef do begin
BlockRead(handle, block, 1);
CopyMemory(@fbytes[pos], @block[0], HIB_BLOCKSIZE);
pos := pos + HIB_BLOCKSIZE;
end;
flame := TStringList.Create;
flame.Text := PChar(fbytes);
pos := 0;
bx := 0; by := 0;
Seek(handle, offsd);
SetLength(buckets, header.Size2D.Y, header.Size2D.X);
callback(0);
c := 0; p := 0;
step := 1.0 / sized;
while pos < sized do begin
with buckets[by][bx] do begin
BlockRead(handle, block, 1);
Red := BlockToInt32(block, 0);
Green := BlockToInt32(block, 4);
Blue := BlockToInt32(block, 8);
Count := BlockToInt32(block, 12);
end;
Inc(bx);
pos := pos + HIB_BLOCKSIZE;
if bx >= header.Size2D.X then begin
Inc(by); bx := 0;
end;
p := p + step;
c := (c + 1) mod 64;
if (c = 0) then begin
callback(p*0.99);
Application.ProcessMessages;
end;
end;
callback(0.99);
i := 0;
while i < 256 do begin
BlockRead(handle, block, 1);
c := BlockToInt32(block, 0);
colormap[i+0].Red := c and $ff;
colormap[i+0].Green := (c and $ff00) shr 8;
colormap[i+0].Blue := (c and $ff0000) shr 16;
c := BlockToInt32(block, 4);
colormap[i+1].Red := c and $ff;
colormap[i+1].Green := (c and $ff00) shr 8;
colormap[i+1].Blue := (c and $ff0000) shr 16;
c := BlockToInt32(block, 8);
colormap[i+2].Red := c and $ff;
colormap[i+2].Green := (c and $ff00) shr 8;
colormap[i+2].Blue := (c and $ff0000) shr 16;
c := BlockToInt32(block, 12);
colormap[i+3].Red := c and $ff;
colormap[i+3].Green := (c and $ff00) shr 8;
colormap[i+3].Blue := (c and $ff0000) shr 16;
i := i + 4;
end;
end;
end.

76
IO/MissingPlugin.pas Normal file
View File

@ -0,0 +1,76 @@
unit MissingPlugin;
interface
uses Windows, Global, Classes, LoadTracker, ComCtrls, SysUtils,
ControlPoint, Translation;
const RegisteredAttributes : array[0..13] of string = (
'weight', 'color', 'symmetry', 'color_speed', 'coefs', 'chaos',
'plotmode', 'opacity', 'post', 'var', 'var1', 'var_color',
'name', 'linear3D'
);
var MissingPluginList : TStringList;
Parsing : boolean;
ErrorMessageString : string;
procedure BeginParsing;
procedure CheckAttribute(attr:string);
function EndParsing(cp : TControlPoint; var statusPanelText : string): boolean;
procedure AnnoyUser;
implementation
procedure BeginParsing;
begin
MissingPluginList := TStringList.Create;
if (AutoOpenLog = true) then
if (LoadForm.Showing = false) then
LoadForm.Show;
end;
procedure CheckAttribute(attr:string);
var i : integer;
begin
for i := 0 to Length(RegisteredAttributes)-1 do
if attr=RegisteredAttributes[i] then exit;
if MissingPluginList.IndexOf(attr) < 0 then
MissingPluginList.Add(attr);
end;
function EndParsing(cp : TControlPoint; var statusPanelText : string): boolean;
var str, str2 : string; i : integer; newl : TStringList;
begin
str2 := TextByKey('main-status-variationsorvariables');
if (cp.used_plugins.Count > 0) then begin
newl := TStringList.Create;
for i := 0 to MissingPluginList.Count - 1 do begin
if cp.used_plugins.IndexOf(MissingPluginList[i]) >= 0 then
newl.Add(MissingPluginList[i]);
end;
str2 := TextByKey('main-status-plugins');
MissingPluginList.Free;
MissingPluginList := newl;
end;
if MissingPluginList.Count > 0 then begin
statusPanelText := Format(TextByKey('main-status-loadingerrorcount'), [MissingPluginList.Count]);
for i := 0 to MissingPluginList.Count - 1 do
str := str + #13#10 + ' - ' + MissingPluginList[i];
ErrorMessageString := Format(TextByKey('main-status-morepluginsneeded'), [cp.name, str2]) + str;
LoadForm.Output.Text := LoadForm.Output.Text +
ErrorMessageString + #13#10#13#10;
Result := false;
end else begin
statusPanelText := TextByKey('main-status-noloadingerrors');
ErrorMessageString := '';
Result := true;
end;
MissingPluginList.Free;
end;
procedure AnnoyUser;
begin
if (ErrorMessageString = '') or (not WarnOnMissingPlugin) then exit;
MessageBox($00000000, PChar(ErrorMessageString), PChar('Apophysis'), MB_ICONHAND or MB_OK);
end;
end.

603
IO/ParameterIO.pas Normal file
View File

@ -0,0 +1,603 @@
unit ParameterIO;
interface
uses Global, SysUtils, StrUtils, ControlPoint, XForm, cmap,
XFormMan, RegularExpressionsCore, RegexHelper, Classes;
function IsRegisteredVariation(name: string): boolean;
function IsRegisteredVariable(name: string): boolean;
procedure EnumParameters(xml: string; var list: TStringList);
function NameOf(xml: string): string;
function FindFlameInBatch(xml, name: string): string;
procedure LoadPaletteFromXmlCompatible(xml: Utf8String; var cp: TControlPoint);
procedure LoadXFormFromXmlCompatible(xml: Utf8String; isFinalXForm: boolean; var xf: TXForm; var enabled: boolean);
function LoadCpFromXmlCompatible(xml: string; var cp: TControlPoint; var statusOutput: string): boolean;
function SaveCpToXmlCompatible(var xml: string; const cp1: TControlPoint): boolean;
implementation
(* *************************** Validation functions ***************************** *)
function IsRegisteredVariation(name: string): boolean;
var i, count: integer; vname: string; xf: txform;
begin
xf := txform.Create;
xf.Destroy;
count:=NrVar;
for i:=0 to count - 1 do
begin
vname := VarNames(i);
if (lowercase(vname) = lowercase(name)) then
begin
Result := true;
exit;
end;
end;
Result := false;
end;
function IsRegisteredVariable(name: string): boolean;
var i, count: integer;
begin
count:=GetNrVariableNames;
for i:=0 to count - 1 do
begin
if (LowerCase(GetVariableNameAt(i)) = LowerCase(name)) then
begin
Result := true;
exit;
end;
end;
Result := false;
end;
(* ***************************** Loading functions ******************************* *)
function NameOf(xml: string): string;
var
Regex: TPerlRegEx;
begin
Regex := TPerlRegEx.Create;
Regex.RegEx := '<flame.*?name="(.*?)".*?>.*?</flame>';
Regex.Options := [preSingleLine, preCaseless];
Regex.Subject := Utf8String(xml);
if Regex.Match then begin
Result := String(Regex.Groups[1]);
end else Result := '';
Regex.Free;
end;
procedure EnumParameters(xml: string; var list: TStringList);
var
Regex: TPerlRegEx;
begin
Regex := TPerlRegEx.Create;
Regex.RegEx := '<flame.*?>.*?</flame>';
Regex.Options := [preSingleLine, preCaseless];
Regex.Subject := Utf8String(xml);
if Regex.Match then begin
repeat
list.Add(String(Regex.MatchedText));
until not Regex.MatchAgain;
end;
Regex.Free;
end;
function FindFlameInBatch(xml, name: string): string;
var
Regex: TPerlRegEx;
begin
Regex := TPerlRegEx.Create;
Regex.RegEx := '<flame.*?name="(.*?)".*?>.*?</flame>';
Regex.Options := [preSingleLine, preCaseless];
Regex.Subject := Utf8String(xml);
if Regex.Match then begin
repeat
if (Utf8String(name) = Regex.Groups[1]) then begin
Result := String(Regex.MatchedText);
Regex.Free;
exit;
end;
until not Regex.MatchAgain;
end;
Result := '';
Regex.Free;
end;
function LoadCpFromXmlCompatible(xml: string; var cp: TControlPoint; var statusOutput: string): boolean;
const
re_flame : string = '<flame(.*?)>(.*?)</flame>';
re_xform : string = '<((?:final)?xform)(.*?)/>';
re_palette : string = '<palette(.*?)>([a-f0-9\s]+)</palette>';
re_attrib : string = '([0-9a-z_]+)="(.*?)"';
re_strtoken : string = '([a-z0-9_]+)';
var
flame_attribs : Utf8String;
flame_content : Utf8String;
xform_type : Utf8String;
xform_attribs : Utf8String;
palette_attribs : Utf8String;
palette_content : Utf8String;
find_attribs : TPerlRegEx;
found_attrib : boolean;
attrib_name : Utf8String;
attrib_match : Utf8String;
find_xforms : TPerlRegEx;
found_xform : boolean;
xform_index : integer;
find_strtokens : TPerlRegEx;
found_strtoken : boolean;
strtoken_index : integer;
strtoken_value : Utf8String;
find_palette : TPerlRegEx;
temp2i : T2Int;
temp2f : T2Float;
temprgb : TRGB;
dummy: boolean;
attrib_success: boolean;
i: integer;
begin
find_strtokens := TPerlRegEx.Create;
find_attribs := TPerlRegEx.Create;
find_xforms := TPerlRegEx.Create;
find_palette := TPerlRegEx.Create;
find_attribs.RegEx := Utf8String(re_attrib);
find_strtokens.RegEx := Utf8String(re_strtoken);
find_xforms.RegEx := Utf8String(re_xform);
find_palette.RegEx := Utf8String(re_palette);
find_attribs.Options := [preSingleLine, preCaseless];
find_strtokens.Options := [preSingleLine, preCaseless];
find_xforms.Options := [preSingleLine, preCaseless];
find_palette.Options := [preSingleLine, preCaseless];
flame_attribs := Utf8String(GetStringPart(xml, re_flame, 1, ''));
flame_content := Utf8String(GetStringPart(xml, re_flame, 2, ''));
find_attribs.Subject := Utf8String(flame_attribs);
found_attrib := find_attribs.Match;
Result := true;
while found_attrib do begin
attrib_match := find_attribs.MatchedText;
attrib_name := Utf8String(Lowercase(String(find_attribs.Groups[1])));
attrib_success := true;
if attrib_name = 'name' then
cp.name := GetStringPart(String(attrib_match), re_attrib, 2, '')
else if attrib_name = 'vibrancy' then
cp.vibrancy := GetFloatPart(String(attrib_match), re_attrib, 2, defVibrancy)
else if attrib_name = 'brightness' then
cp.brightness := GetFloatPart(String(attrib_match), re_attrib, 2, defBrightness)
else if attrib_name = 'gamma' then
cp.gamma := GetFloatPart(String(attrib_match), re_attrib, 2, defGamma)
else if attrib_name = 'gamma_threshold' then
cp.gamma_threshold := GetFloatPart(String(attrib_match), re_attrib, 2, defGammaThreshold)
else if attrib_name = 'oversample' then
cp.spatial_oversample := GetIntPart(String(attrib_match), re_attrib, 2, defOversample)
else if attrib_name = 'filter' then
cp.spatial_filter_radius := GetFloatPart(String(attrib_match), re_attrib, 2, defFilterRadius)
else if attrib_name = 'zoom' then
cp.zoom := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'scale' then
cp.pixels_per_unit := GetFloatPart(String(attrib_match), re_attrib, 2, 25)
else if attrib_name = 'quality' then
cp.sample_density := GetFloatPart(String(attrib_match), re_attrib, 2, 5)
else if attrib_name = 'angle' then
cp.fangle := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'rotate' then // angle = -pi*x/180
cp.vibrancy := -PI * GetFloatPart(String(attrib_match), re_attrib, 2, 0) / 180
else if attrib_name = 'cam_pitch' then
cp.cameraPitch := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'cam_yaw' then
cp.cameraYaw := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'cam_perspective' then
cp.cameraPersp := GetFloatPart(String(attrib_match), re_attrib, 2, 1)
else if attrib_name = 'cam_dist' then // perspective = 1/x
begin
cp.cameraPersp := GetFloatPart(String(attrib_match), re_attrib, 2, 1);
if cp.cameraPersp = 0 then
cp.cameraPersp := EPS;
cp.cameraPersp := 1 / cp.cameraPersp;
end
else if attrib_name = 'cam_zpos' then
cp.cameraZpos := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'cam_dof' then
cp.cameraDOF := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'estimator_radius' then
cp.estimator := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'estimator_minimum' then
cp.estimator_min := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'estimator_curve' then
cp.estimator_curve := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if attrib_name = 'enable_de' then
cp.enable_de := GetBoolPart(String(attrib_match), re_attrib, 2, false)
else if attrib_name = 'center' then
begin
temp2f := Get2FloatPart(String(attrib_match), re_attrib, 2, 0);
cp.center[0] := temp2f.f1; cp.center[1] := temp2f.f2;
end
else if attrib_name = 'size' then
begin
temp2i := Get2IntPart(String(attrib_match), re_attrib, 2, 0);
cp.Width := temp2i.i1; cp.Height := temp2i.i2;
end
else if attrib_name = 'background' then
begin
temprgb := GetRGBPart(String(attrib_match), re_attrib, 2, 0);
cp.background[0] := temprgb.r;
cp.background[1] := temprgb.g;
cp.background[2] := temprgb.b;
end
else if attrib_name = 'soloxform' then
cp.soloXform := GetIntPart(String(attrib_match), re_attrib, 2, 0);
found_attrib := find_attribs.MatchAgain;
end;
if LimitVibrancy and (cp.vibrancy > 1) then
cp.vibrancy := 1;
cp.cmapindex := -1;
find_xforms.Subject := flame_content;
found_xform := find_xforms.Match;
xform_index := 0;
cp.finalXformEnabled := false;
for i := 0 TO NXFORMS - 1 do
cp.xform[i].density := 0;
while found_xform do begin
xform_type := find_xforms.Groups[1];
xform_attribs := find_xforms.Groups[2];
if (LowerCase(String(xform_type)) = 'xform') then begin
LoadXFormFromXmlCompatible(find_xforms.MatchedText,
false, cp.xform[xform_index], cp.finalXformEnabled);
xform_index := xform_index + 1;
end else begin
cp.finalXform := Txform.Create;
LoadXFormFromXmlCompatible(find_xforms.MatchedText,
true, cp.finalXform, dummy);
cp.finalXformEnabled := true;
cp.useFinalXform := true;
xform_index := xform_index + 1;
cp.xform[cp.NumXForms] := cp.finalXform;
end;
found_xform := find_xforms.MatchAgain;
end;
find_palette.Subject := Utf8String(xml);
if (find_palette.Match) then
LoadPaletteFromXmlCompatible(find_palette.MatchedText, cp);
find_strtokens.Free;
find_attribs.Free;
find_xforms.Free;
find_palette.Free;
end;
procedure LoadPaletteFromXmlCompatible(xml: Utf8String; var cp: TControlPoint);
const
re_palette: string = '<palette(.*?)>([a-f0-9\s]+)</palette>';
re_attrib : string = '([0-9a-z_]+)="(.*?)"';
var
i, pos, len, count: integer; c: char;
data, attr, hexdata, format: string;
alpha: boolean;
find_attribs : TPerlRegEx;
found_attrib : boolean;
attrib_name : Utf8String;
attrib_match : Utf8String;
attrib_success : Boolean;
function HexChar(c: Char): Byte;
begin
case c of
'0'..'9': Result := (Byte(c) - Byte('0'));
'a'..'f': Result := (Byte(c) - Byte('a')) + 10;
'A'..'F': Result := (Byte(c) - Byte('A')) + 10;
else
Result := 0;
end;
end;
begin
hexdata := GetStringPart(String(xml), re_palette, 2, '');
attr := GetStringPart(String(xml), re_palette, 1, '');
find_attribs := TPerlRegEx.Create;
find_attribs.RegEx := Utf8String(re_attrib);
find_attribs.Options := [preSingleLine, preCaseless];
find_attribs.Subject := Utf8String(attr);
found_attrib := find_attribs.Match;
count := 0;
while found_attrib do begin
attrib_match := find_attribs.MatchedText;
attrib_name := Utf8String(Lowercase(String(find_attribs.Groups[1])));
attrib_success := true;
if (attrib_name = 'count') then
count := GetIntPart(String(attrib_match), re_attrib, 2, 256)
else if (attrib_name = 'format') then
format := GetStringPart(String(attrib_match), re_attrib, 2, 'RGB');
found_attrib := find_attribs.MatchAgain;
end;
find_attribs.Free;
alpha := (lowercase(format) = 'rgba');
data := '';
for i := 1 to Length(hexdata) do
begin
c := hexdata[i];
if CharInSet(c, ['0'..'9']+['A'..'F']+['a'..'f']) then data := data + c;
end;
if alpha then len := count * 8
else len := count * 6;
for i := 0 to Count-1 do begin
if alpha then pos := i * 8 + 2
else pos := i * 6;
cp.cmap[i][0] := 16 * HexChar(Data[pos + 1]) + HexChar(Data[pos + 2]);
cp.cmap[i][1] := 16 * HexChar(Data[pos + 3]) + HexChar(Data[pos + 4]);
cp.cmap[i][2] := 16 * HexChar(Data[pos + 5]) + HexChar(Data[pos + 6]);
end;
end;
procedure LoadXFormFromXmlCompatible(xml: Utf8String; isFinalXForm: boolean; var xf: TXForm; var enabled: boolean);
const
re_attrib : string = '([0-9a-z_]+)="(.*?)"';
re_xform : string = '<((?:final)?xform)(.*?)/>';
re_coefs : string = '([\d.eE+-]+)\s+([\d.eE+-]+)\s+([\d.eE+-]+)\s+([\d.eE+-]+)\s+([\d.eE+-]+)\s+([\d.eE+-]+)';
var
xform_attribs: string;
find_attribs : TPerlRegEx;
found_attrib : boolean;
attrib_name : Utf8String;
attrib_match : Utf8String;
token_part : string;
i, j : integer;
d : double;
t : TStringList;
v_set : Boolean;
attrib_success: Boolean;
begin
enabled := true;
xform_attribs := GetStringPart(String(xml), re_xform, 2, '');
find_attribs := TPerlRegEx.Create;
find_attribs.RegEx := Utf8String(re_attrib);
find_attribs.Options := [preSingleLine, preCaseless];
find_attribs.Subject := Utf8String(xform_attribs);
found_attrib := find_attribs.Match;
for i := 0 to NRVAR-1 do
xf.SetVariation(i, 0);
while found_attrib do begin
attrib_match := find_attribs.MatchedText;
attrib_name := (find_attribs.Groups[1]);
attrib_success := true;
if (attrib_name = 'enabled') and isFinalXform then
enabled := GetBoolPart(String(attrib_match), re_attrib, 2, true)
else if (attrib_name = 'weight') and (not isFinalXform) then
xf.density := GetFloatPart(String(attrib_match), re_attrib, 2, 0.5)
else if (attrib_name = 'symmetry') and (not isFinalXform) then
xf.symmetry := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if (attrib_name = 'color_speed') and (not isFinalXform) then
xf.symmetry := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if (attrib_name = 'chaos') and (not isFinalXform) then
begin
token_part := GetStringPart(String(attrib_match), re_attrib, 2, '');
if token_part <> '' then
begin
t := TStringList.Create;
GetTokens(token_part, t);
for i := 0 to t.Count-1 do
xf.modWeights[i] := Abs(StrToFloat(t[i]));
t.Destroy;
end;
end
else if (attrib_name = 'opacity') and (not isFinalXform) then
xf.transOpacity := GetFloatPart(String(attrib_match), re_attrib, 2, 1)
else if (attrib_name = 'name') and (not isFinalXform) then
xf.TransformName := GetStringPart(String(attrib_match), re_attrib, 2, '')
else if (attrib_name = 'plotmode') and (not isFinalXform) then
xf.transOpacity := StrToFloat(IfThen(LowerCase(GetStringPart(String(attrib_match), re_attrib, 2, '')) = 'off', '0', '1'))
else if (attrib_name = 'coefs') then
begin
token_part := GetStringPart(String(attrib_match), re_attrib, 2, '1 0 0 1 0 0');
xf.c[0][0] := GetFloatPart(token_part, re_coefs, 1, 1);
xf.c[0][1] := GetFloatPart(token_part, re_coefs, 2, 0);
xf.c[1][0] := GetFloatPart(token_part, re_coefs, 3, 0);
xf.c[1][1] := GetFloatPart(token_part, re_coefs, 4, 1);
xf.c[2][0] := GetFloatPart(token_part, re_coefs, 5, 0);
xf.c[2][1] := GetFloatPart(token_part, re_coefs, 6, 0);
end
else if (attrib_name = 'post') then
begin
token_part := GetStringPart(String(attrib_match), re_attrib, 2, '1 0 0 1 0 0');
xf.p[0][0] := GetFloatPart(token_part, re_coefs, 1, 1);
xf.p[0][1] := GetFloatPart(token_part, re_coefs, 2, 0);
xf.p[1][0] := GetFloatPart(token_part, re_coefs, 3, 0);
xf.p[1][1] := GetFloatPart(token_part, re_coefs, 4, 1);
xf.p[2][0] := GetFloatPart(token_part, re_coefs, 5, 0);
xf.p[2][1] := GetFloatPart(token_part, re_coefs, 6, 0);
end
else if (attrib_name = 'color') then
xf.color := GetFloatPart(String(attrib_match), re_attrib, 2, 0)
else if (attrib_name = 'var_color') then
xf.vc := GetFloatPart(String(attrib_match), re_attrib, 2, 1)
else if ((String(attrib_name) = 'symmetry') or (String(attrib_name) = 'weight') or
(String(attrib_name) = 'color_speed') or (String(attrib_name) = 'chaos') or
(String(attrib_name) = 'opacity') or (String(attrib_name) = 'name') or
(String(attrib_name) = 'plotmode')) and (isFinalXForm) then
begin
//EmitWarning('Malformed attribute "xform.' + attrib_name + '" - ignoring');
//LogWrite('WARNING|' +'Malformed attribute "xform.' + attrib_name + '" - ignoring', 'parser.log');
attrib_success := false;
end
else begin
if (String(attrib_name) = 'linear3D') then begin
xf.SetVariation(0, GetFloatPart(String(attrib_match), re_attrib, 2, 0));
end else if (IsRegisteredVariation(String(attrib_name))) then begin
for i := 0 to NRVAR - 1 do begin
if lowercase(varnames(i)) = lowercase(String(attrib_name)) then begin
xf.SetVariation(i, GetFloatPart(String(attrib_match), re_attrib, 2, 0));
v_set := true;
break;
end;
end;
if (IsRegisteredVariable(String(attrib_name))) then begin
d := GetFloatPart(String(attrib_match), re_attrib, 2, 0);
xf.SetVariable(String(attrib_name), d);
end;
end else if (IsRegisteredVariable(String(attrib_name))) then begin
d := GetFloatPart(String(attrib_match), re_attrib, 2, 0);
xf.SetVariable(String(attrib_name), d);
end;
attrib_success := false;
end;
found_attrib := find_attribs.MatchAgain;
end;
if (isFinalXform) then begin
xf.symmetry := 1;
xf.color := 0;
end;
find_attribs.Free;
end;
// Replace...
function SaveCpToXmlCompatible(var xml: string; const cp1: TControlPoint): boolean;
function ColorToXmlCompact(cp1: TControlPoint): string;
var
i: integer;
begin
Result := ' <palette count="256" format="RGB">';
for i := 0 to 255 do begin
if ((i and 7) = 0) then Result := Result + #13#10 + ' ';
Result := Result + IntToHex(cp1.cmap[i, 0],2)
+ IntToHex(cp1.cmap[i, 1],2)
+ IntToHex(cp1.cmap[i, 2],2);
end;
Result := Result + #13#10 + ' </palette>';
end;
var
t, i{, j}: integer;
FileList: TStringList;
x, y: double;
parameters: string;
str: string;
begin
FileList := TStringList.create;
x := cp1.center[0];
y := cp1.center[1];
// if cp1.cmapindex >= 0 then pal := pal + 'gradient="' + IntToStr(cp1.cmapindex) + '" ';
try
parameters := 'version="Apophysis 7X" ';
if cp1.time <> 0 then
parameters := parameters + format('time="%g" ', [cp1.time]);
parameters := parameters +
'size="' + IntToStr(cp1.width) + ' ' + IntToStr(cp1.height) +
format('" center="%g %g" ', [x, y]) +
format('scale="%g" ', [cp1.pixels_per_unit]);
if cp1.FAngle <> 0 then
parameters := parameters + format('angle="%g" ', [cp1.FAngle]) +
format('rotate="%g" ', [-180 * cp1.FAngle/Pi]);
if cp1.zoom <> 0 then
parameters := parameters + format('zoom="%g" ', [cp1.zoom]);
// 3d
if cp1.cameraPitch <> 0 then
parameters := parameters + format('cam_pitch="%g" ', [cp1.cameraPitch]);
if cp1.cameraYaw <> 0 then
parameters := parameters + format('cam_yaw="%g" ', [cp1.cameraYaw]);
if cp1.cameraPersp <> 0 then
parameters := parameters + format('cam_perspective="%g" ', [cp1.cameraPersp]);
if cp1.cameraZpos <> 0 then
parameters := parameters + format('cam_zpos="%g" ', [cp1.cameraZpos]);
if cp1.cameraDOF <> 0 then
parameters := parameters + format('cam_dof="%g" ', [cp1.cameraDOF]);
//
parameters := parameters + format(
'oversample="%d" filter="%g" quality="%g" ',
[cp1.spatial_oversample,
cp1.spatial_filter_radius,
cp1.sample_density]
);
if cp1.nbatches <> 1 then parameters := parameters + 'batches="' + IntToStr(cp1.nbatches) + '" ';
parameters := parameters +
format('background="%g %g %g" ', [cp1.background[0] / 255, cp1.background[1] / 255, cp1.background[2] / 255]) +
format('brightness="%g" ', [cp1.brightness]) +
format('gamma="%g" ', [cp1.gamma]);
if cp1.vibrancy <> 1 then
parameters := parameters + format('vibrancy="%g" ', [cp1.vibrancy]);
if cp1.gamma_threshold <> 0 then
parameters := parameters + format('gamma_threshold="%g" ', [cp1.gamma_threshold]);
if cp1.soloXform >= 0 then
parameters := parameters + format('soloxform="%d" ', [cp1.soloXform]);
parameters := parameters +
format('estimator_radius="%g" ', [cp1.estimator]) +
format('estimator_minimum="%g" ', [cp1.estimator_min]) +
format('estimator_curve="%g" ', [cp1.estimator_curve]);
if (cp1.enable_de) then
parameters := parameters + ('enable_de="1" ')
else parameters := parameters + ('enable_de="0" ');
str := '';
for i := 0 to cp1.used_plugins.Count-1 do begin
str := str + cp1.used_plugins[i];
if (i = cp1.used_plugins.Count-1) then break;
str := str + ' ';
end;
parameters := parameters + format('plugins="%s" ', [str]);
FileList.Add('<flame name="' + cp1.name + '" ' + parameters + '>');
{ Write transform parameters }
t := cp1.NumXForms;
for i := 0 to t - 1 do
FileList.Add(cp1.xform[i].ToXMLString);
if cp1.HasFinalXForm then
begin
// 'enabled' flag disabled in this release
FileList.Add(cp1.xform[t].FinalToXMLString(cp1.finalXformEnabled));
end;
{ Write palette data }
//if exporting or OldPaletteFormat then
// FileList.Add(ColorToXml(cp1))
//else
FileList.Add(ColorToXmlCompact(cp1));
FileList.Add('</flame>');
xml := FileList.text;
result := true;
finally
FileList.free
end;
end;
end.

1545
IO/Settings.pas Normal file

File diff suppressed because it is too large Load Diff

89
Plugin/barycentroid.c Normal file
View File

@ -0,0 +1,89 @@
/*
Apophysis Plugin
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.
*/
typedef struct
{
double barycentroid_a, barycentroid_b, barycentroid_c, barycentroid_d;
double a, b, c, d;
} Variables;
#include "apoplugin.h"
APO_PLUGIN("barycentroid");
APO_VARIABLES(
VAR_REAL(barycentroid_a, 1.0),
VAR_REAL(barycentroid_b, 0.0),
VAR_REAL(barycentroid_c, 0.0),
VAR_REAL(barycentroid_d, 1.0)
);
int PluginVarPrepare(Variation* vp)
{
// alias
VAR(a) = VAR(barycentroid_a);
VAR(b) = VAR(barycentroid_b);
VAR(c) = VAR(barycentroid_c);
VAR(d) = VAR(barycentroid_d);
return TRUE;
}
inline double sgn(double v) { return v < 0 ? -1 : v > 0 ? 1 : 0; }
int PluginVarCalc(Variation* vp)
{
// helpers
/* The code is supposed to be fast and you all can read it so I dont
create those aliases for readability in actual code:
v0x = VAR(a)
v0y = VAR(b)
v1x = VAR(c)
v1y = VAR(d)
v2x = FTx
v2y = FTy
*/
// compute dot products
double dot00 = VAR(a) * VAR(a) + VAR(b) * VAR(b); // v0 * v0
double dot01 = VAR(a) * VAR(c) + VAR(b) * VAR(d); // v0 * v1
double dot02 = VAR(a) * FTx + VAR(b) * FTy; // v0 * v2
double dot11 = VAR(c) * VAR(c) + VAR(d) * VAR(d); // v1 * v1
double dot12 = VAR(c) * FTx + VAR(d) * FTy; // v1 * v2
// compute inverse denomiator
double invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
/* now we can pull [u,v] as the barycentric coordinates of the point
P in the triangle [A, B, C]
*/
double u = (dot11 * dot02 - dot01 * dot12) * invDenom;
double v = (dot00 * dot12 - dot01 * dot02) * invDenom;
// now combine with input
double um = sqrt(sqr(u) + sqr(FTx)) * sgn(u);
double vm = sqrt(sqr(v) + sqr(FTy)) * sgn(v);
FPx += VVAR * um;
FPy += VVAR * vm;
FPz += VVAR * FTz; // just pass
return TRUE;
}

65
Plugin/bcircle.c Normal file
View File

@ -0,0 +1,65 @@
/*
Apophysis Plugin
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.
*/
typedef struct
{
double bcbw;
double bcircle_scale;
double bcircle_borderwidth;
} Variables;
#include "apoplugin.h"
APO_PLUGIN("bcircle");
APO_VARIABLES(
VAR_REAL(bcircle_scale, 1.0),
VAR_REAL(bcircle_borderwidth, 0.0)
);
int PluginVarPrepare(Variation* vp)
{
VAR(bcbw) = fabs(VAR(bcircle_borderwidth));
return TRUE;
}
int PluginVarCalc(Variation* vp)
{
if ((FTx == 0) && (FTy == 0)) {
return TRUE;
}
double x = FTx * VAR(bcircle_scale);
double y = FTy * VAR(bcircle_scale);
double r = sqrt(x * x + y * y);
if (r <= 1) {
FPx += VVAR * x;
FPy += VVAR * y;
} else {
if (VAR(bcbw) != 0) {
double ang = atan2(y, x);
double omega = (0.2 * VAR(bcbw) * random01()) + 1;
double px = omega * cos(ang);
double py = omega * sin(ang);
FPx += VVAR * px;
FPy += VVAR * py;
}
}
return TRUE;
}

67
Plugin/bent2.c Normal file
View File

@ -0,0 +1,67 @@
/*
Apophysis Plugin
Copyright (C) 2008-2009 Michael Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double bent2_x;
double bent2_y;
double vvarx;
double vvary;
//double bipilar_vvar;
} Variables;
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("bent2");
// Define the Variables
APO_VARIABLES(
VAR_REAL(bent2_x, 1.0),
VAR_REAL(bent2_y, 1.0)
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(vvarx) = VVAR * VAR(bent2_x);
VAR(vvary) = VVAR * VAR(bent2_y);
//VAR(bipolar_vvar) = 1
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
if(FTx >= 0.0)
FPx += VVAR * FTx;
else
FPx += VAR(vvarx) * FTx;
if(FTy >= 0.0)
FPy += VVAR * FTy;
else
FPy += VAR(vvary) * FTy;
return TRUE;
}

58
Plugin/blur_linear.c Normal file
View File

@ -0,0 +1,58 @@
/*
Apophysis Plugin
Copyright (C) 2009 Joel Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double blur_linear_length;
double blur_linear_angle;
double s;
double c;
} Variables;
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("blur_linear");
// Define the Variables
APO_VARIABLES(
VAR_REAL(blur_linear_length, 0.0),
VAR_REAL_CYCLE(blur_linear_angle, 0.0, M_2PI, 0.0)
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
fsincos(VAR(blur_linear_angle), &VAR(s), &VAR(c));
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double r = VAR(blur_linear_length) * random01();
FPx += VVAR * (FTx + r * VAR(c));
FPy += VVAR * (FTy + r * VAR(s));
return TRUE;
}

53
Plugin/blur_square.c Normal file
View File

@ -0,0 +1,53 @@
/*
Apophysis Plugin
Copyright (C) 2009 Joel Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double v;
} Variables;
#define _USE_MATH_DEFINES
#define APO_NOVARIABLES
#define APO_VIRTUALVAR
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("blur_square");
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(v) = VVAR * 2.0;
// Always return TRUE.
return TRUE;
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
FPx += VAR(v) * (random01() - 0.5);
FPy += VAR(v) * (random01() - 0.5);
return TRUE;
}

104
Plugin/boarders2.c Normal file
View File

@ -0,0 +1,104 @@
/*
Apophysis Plugin
Copyright (C) 2007-2009 Joel Faber
Copyright (C) 2007-2009 Michael Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double boarders2_c;
double boarders2_left;
double boarders2_right;
double c, cl, cr;
} Variables;
#include "apoplugin.h"
APO_PLUGIN("boarders2");
APO_VARIABLES(
VAR_REAL(boarders2_c, 0.5),
VAR_REAL(boarders2_left, 0.5),
VAR_REAL(boarders2_right, 0.5),
);
inline double rint(double x)
{
int temp; temp = (x >= 0. ? (int)(x + 0.5) : (int)(x - 0.5));
return (double)temp;
}
int PluginVarPrepare(Variation* vp)
{
double c = fabs(VAR(boarders2_c)),
cl = fabs(VAR(boarders2_left)),
cr = fabs(VAR(boarders2_right));
c = c==0?EPS:c; cl = cl==0?EPS:cl; cr = cr==0?EPS:cr;
VAR(c) = c; VAR(cl) = c*cl; VAR(cr) = c+(c*cr);
return TRUE;
}
int PluginVarCalc(Variation* vp)
{
const double c = vp->var.c;
const double cl = vp->var.cl;
const double cr = vp->var.cr;
double roundX, roundY, offsetX, offsetY;
roundX = rint(FTx);
roundY = rint(FTy);
offsetX = FTx - roundX;
offsetY = FTy - roundY;
if(random01() >= cr)
{
FPx += VVAR*(offsetX*c + roundX);
FPy += VVAR*(offsetY*c + roundY);
}
else
{
if(fabs(offsetX) >= fabs(offsetY))
{
if(offsetX >= 0.0)
{
FPx += VVAR*(offsetX*c + roundX + cl);
FPy += VVAR*(offsetY*c + roundY + cl * offsetY / offsetX);
}
else
{
FPx += VVAR*(offsetX*c + roundX - cl);
FPy += VVAR*(offsetY*c + roundY - cl * offsetY / offsetX);
}
}
else
{
if(offsetY >= 0.0)
{
FPy += VVAR*(offsetY*c + roundY + cl);
FPx += VVAR*(offsetX*c + roundX + offsetX/offsetY*cl);
}
else
{
FPy += VVAR*(offsetY*c + roundY - cl);
FPx += VVAR*(offsetX*c + roundX - offsetX/offsetY*cl);
}
}
}
return TRUE;
}

54
Plugin/butterfly.c Normal file
View File

@ -0,0 +1,54 @@
/*
Apophysis Plugin
Copyright (C) 2007-2009 Joel Faber
Copyright (C) 2007-2009 Michael Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double v;
} Variables;
#define _USE_MATH_DEFINES
#define APO_NOVARIABLES
#define APO_VIRTUALVAR
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("butterfly");
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(v) = VVAR * 4.0 / sqrt(3.0 * M_PI);
// Always return TRUE.
return TRUE;
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double y2 = FTy * 2.0;
double r = VAR(v) * sqrt(fabs(FTy * FTx)/(EPS + sqr(FTx) + sqr(y2)));
FPx += r * FTx;
FPy += r * y2;
return TRUE;
}

52
Plugin/cardiod.c Normal file
View File

@ -0,0 +1,52 @@
/*
Apophysis Plugin
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double cardioid_a;
} Variables;
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("cardioid");
// Define the Variables
APO_VARIABLES(
VAR_REAL(cardioid_a, 1.0)
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double a = atan2(FTy, FTx);
double r = VVAR * sqrt(sqr(FTx) + sqr(FTy) + sin( a * VAR(cardioid_a)) + 1.0 );
double s, c;
fsincos( a, &s, &c);
FPx += r * c;
FPy += r * s;
return TRUE;
}

92
Plugin/cell.c Normal file
View File

@ -0,0 +1,92 @@
/*
Apophysis Plugin
Copyright (c) 2008 Joel Faber. All rights reserverd.
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double cell_size;
double inv_cell_size;
} Variables;
#define _USE_MATH_DEFINES
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("cell");
// Define the Variables
APO_VARIABLES(
VAR_REAL(cell_size, 1.0)
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
if (VAR(cell_size) == 0) VAR(cell_size) = 1e-6;
VAR(inv_cell_size) = 1.0 / VAR(cell_size);
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
// calculate input cell
int x = floor(FTx*VAR(inv_cell_size));
int y = floor(FTy*VAR(inv_cell_size));
// Offset from cell origin
double dx = FTx - x*VAR(cell_size);
double dy = FTy - y*VAR(cell_size);
// interleave cells
if (y >= 0)
{
if (x >= 0)
{
y *= 2;
x *= 2;
}
else
{
y *= 2;
x = -(2*x+1);
}
}
else
{
if (x >= 0)
{
y = -(2*y+1);
x *= 2;
}
else
{
y = -(2*y+1);
x = -(2*x+1);
}
}
// calculate output point from interleaved cell
FPx += VVAR * (dx + x*VAR(cell_size));
FPy -= VVAR * (dy + y*VAR(cell_size));
return TRUE;
}

101
Plugin/checks.c Normal file
View File

@ -0,0 +1,101 @@
/*
Apophysis Plugin
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double checks_x;
double checks_y;
double checks_size;
double checks_rnd;
double cs, cx, cy, ncx, ncy;
} Variables;
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("checks");
// Define the Variables
APO_VARIABLES(
VAR_REAL(checks_x, 0.5),
VAR_REAL(checks_y, 0.5),
VAR_REAL(checks_size, 0.5),
VAR_REAL(checks_rnd, 0.0)
);
inline double lrint(double x)
{
long int temp; temp = (x >= 0. ? (long int)(x + 0.5) : (long int)(x - 0.5));
return (double)temp;
}
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
// Multiplication is faster than division, so divide in precalc, multiply in calc.
VAR(cs) = 1.0 / (VAR(checks_size) + EPS);
// -X- Copied the variables as we only need them for reading
// This is just for safety :-)
VAR(cx) = VAR(checks_x); VAR(cy) = VAR(checks_y);
// -X- Then precalculate -checkx_x, -checks_y
VAR(ncx) = VAR(checks_x) * -1.0; VAR(ncy) = VAR(checks_y) * -1.0;
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double dx, dy;
double x = FTx * VAR(cs);
double y = FTy * VAR(cs);
int isXY = lrint(FTx * VAR(cs)) +
lrint(FTy * VAR(cs));
// -X- This is just for code readability,
// if there is any impact on performance, its minimal :-)
double rnx = VAR(checks_rnd) * random01();
double rny = VAR(checks_rnd) * random01();
if (isXY % 2)
{
// -X- The -VAR(checks_#) stuff caused the error!
dx = VAR(ncx) + rnx;
dy = VAR(ncy);
}
else
{
dx = VAR(cx);
dy = VAR(cy) + rny;
}
FPx += VVAR * (FTx + dx);
FPy += VVAR * (FTy + dy);
// -X- and as a little goodie, I pass through FTz so that
// neat lil variation does not kill 3Dness in hack & 7X
FPz += VVAR * (FTz);
return TRUE;
}

93
Plugin/circlize.c Normal file
View File

@ -0,0 +1,93 @@
/*
Apophysis Plugin
Copyright (C) 2007-2009 Joel Faber
Copyright (C) 2007-2009 Michael Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double circlize_hole;
double VVAR4_PI;
} Variables;
#define _USE_MATH_DEFINES
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("circlize");
// Define the Variables
APO_VARIABLES(
VAR_REAL(circlize_hole, 0.0)
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(VVAR4_PI) = VVAR / M_PI_4;
// Always return TRUE.
return TRUE;
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double absx = fabs(FTx);
double absy = fabs(FTy);
double side;
double perimeter;
double r, sina, cosa;
if (absx >= absy)
{
if (FTx >= absy)
{
perimeter = absx + FTy;
}
else
{
perimeter = 5.0 * absx - FTy;
}
side = absx;
}
else
{
if (FTy >= absx)
{
perimeter = 3.0 * absy - FTx;
}
else
{
perimeter = 7.0 * absy + FTx;
}
side = absy;
}
// tsk tsk... hole is not scaled by vvar.
r = VAR(VVAR4_PI) * side + VAR(circlize_hole);
fsincos(M_PI_4 * perimeter / side - M_PI_4, &sina, &cosa);
FPx += r * cosa;
FPy += r * sina;
return TRUE;
}

75
Plugin/coswrap.c Normal file
View File

@ -0,0 +1,75 @@
/*
"Cosine Wrap" plugin for Apophysis 2.x
Copyright (C) 2010 Georg Kiehne
Apophysis Fractal Flame Renderer
Copyright (C) 2001-2004 Mark Townsend
Copyright (C) 2005-2008 Peter Sdobnov, Piotr Borys, Ronald Hordijk
flame - cosmic recursive fractal flames
Copyright (C) 1992-2007 Scott Draves
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.
*/
typedef struct
{
int coswrap_repeat;
double coswrap_amount_x, coswrap_amount_y;
double coswrap_phase_x, coswrap_phase_y;
double ax, ay, px, py, axn, ayn, fr, vv2;
} Variables;
#define _USE_MATH_DEFINES
#include "apoplugin.h"
APO_PLUGIN("coswrap");
APO_VARIABLES(
VAR_INTEGER_NONZERO(coswrap_repeat, 1.0),
VAR_REAL(coswrap_amount_x, 0.0),
VAR_REAL(coswrap_amount_y, 0.0),
VAR_REAL_CYCLE(coswrap_phase_x, -1.0, 1.0, 0.0),
VAR_REAL_CYCLE(coswrap_phase_y, -1.0, 1.0, 0.0)
);
// why isn't this in apoplugin.h??
#define MIN(a, b) ((a) < (b) ? (a) : (b))
int PluginVarPrepare(Variation* vp)
{
VAR(ax) = M_2PI * fabs(VAR(coswrap_amount_x));
VAR(ay) = M_2PI * fabs(VAR(coswrap_amount_y));
VAR(px) = M_PI * VAR(coswrap_phase_x);
VAR(py) = M_PI * VAR(coswrap_phase_y);
VAR(fr) = fabs((double)VAR(coswrap_repeat));
VAR(vv2)= 2.0 * VVAR;
return TRUE;
}
inline double flerp(double a, double b, double p) { return (a+(b-a)*p); }
inline double fabsmod(double fintp) { double dummy; return modf(fintp, &dummy); }
inline double fosc(double p, double amp, double ph) { return 0.5-cos(p*amp+ph)*0.5; }
inline double foscn(double p, double ph) { return 0.5-cos(p+ph)*0.5; }
int PluginVarCalc(Variation* vp)
{
double x = 0.5 * FTx + 0.5, y = 0.5 * FTy + 0.5;
double bx = fabsmod(VAR(fr) * x), by = fabsmod(VAR(fr) * y);
double oscnapx = foscn(VAR(coswrap_amount_x), VAR(px)),
oscnapy = foscn(VAR(coswrap_amount_y), VAR(py));
FPx = -1.0 + VAR(vv2) * flerp(flerp(x, fosc(x, 4.0, VAR(px)), oscnapx), fosc(bx, 4.0, VAR(px)), oscnapx);
FPy = -1.0 + VAR(vv2) * flerp(flerp(y, fosc(y, 4.0, VAR(py)), oscnapy), fosc(by, 4.0, VAR(py)), oscnapy);
return TRUE;
}

79
Plugin/cpow.c Normal file
View File

@ -0,0 +1,79 @@
/*
Apophysis Plugin
Copyright (C) 2007-2009 Joel Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double cpow_r;
double cpow_i;
int cpow_power;
double c;
double d;
double ang;
} Variables;
#define _USE_MATH_DEFINES
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("cpow");
// Define the Variables
APO_VARIABLES(
VAR_REAL(cpow_r, 1.0),
VAR_REAL(cpow_i, 0.0),
VAR_INTEGER_NONZERO(cpow_power, 1)
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(ang) = 2.0 * M_PI / ((double) VAR(cpow_power));
VAR(c) = VAR(cpow_r) / ((double) VAR(cpow_power));
VAR(d) = VAR(cpow_i) / ((double) VAR(cpow_power));
return TRUE; // Always return TRUE.
}
/*
z' = z^(cpow_r + i * cpow_i)
Simplified using formula:
(a + i*b)^(c + i*d) = rho^c * e^(-d * theta) * [cos(c * theta + d * ln(rho) + i * sin(c * theta + d * ln(rho)],
where (rho, theta) is the polar coordinate equivalent of z=(x, y).
*/
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double sn, cs;
double a = atan2(FTy, FTx); // Angular polar dimension
double lnr = 0.5 * log(FTx*FTx + FTy*FTy); // Natural logarithm of the radial polar dimension.
double m = VVAR * exp(VAR(c) * lnr - VAR(d) * a);
fsincos(VAR(c) * a + VAR(d) * lnr + VAR(ang) * (rand() % VAR(cpow_power)), &sn, &cs);
FPx += m * cs;
FPy += m * sn;
return TRUE;
}

84
Plugin/cpow2.c Normal file
View File

@ -0,0 +1,84 @@
/*
Apophysis Plugin
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double cpow2_r, cpow2_a;
int cpow2_divisor;
int cpow2_spread;
double c, half_c;
double d, half_d;
double ang;
double inv_spread, full_spread;
} Variables;
#define _USE_MATH_DEFINES
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("cpow2");
// Define the Variables
APO_VARIABLES(
VAR_REAL(cpow2_r, 1.0),
VAR_REAL(cpow2_a, 0.0),
VAR_INTEGER_NONZERO(cpow2_divisor, 1),
VAR_INTEGER_RANGE(cpow2_spread, 1, 0x7fffffff, 1),
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(ang) = 2*M_PI / ((double) VAR(cpow2_divisor));
VAR(c) = VAR(cpow2_r) * cos(M_PI/2*VAR(cpow2_a)) / ((double) VAR(cpow2_divisor));
VAR(d) = VAR(cpow2_r) * sin(M_PI/2*VAR(cpow2_a)) / ((double) VAR(cpow2_divisor));
VAR(half_c) = VAR(c) / 2;
VAR(half_d) = VAR(d) / 2;
VAR(inv_spread) = 0.5 / VAR(cpow2_spread);
VAR(full_spread) = 2*M_PI*VAR(cpow2_spread);
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double sn, cs;
double a = atan2(FTy, FTx);
int n = rand() % VAR(cpow2_spread);
if (a < 0) n++;
a += 2*M_PI*n;
if (cos(a*VAR(inv_spread)) < rand()*2.0/RAND_MAX - 1.0)
a -= VAR(full_spread);
double lnr2 = log(FTx*FTx + FTy*FTy); // logarithm * 2
double r = VVAR * exp(VAR(half_c) * lnr2 - VAR(d) * a);
fsincos(VAR(c) * a + VAR(half_d) * lnr2 + VAR(ang) * rand(),
&sn, &cs);
FPx += r * cs;
FPy += r * sn;
return TRUE;
}

762
Plugin/crackle.c Normal file
View File

@ -0,0 +1,762 @@
/*
Apophysis Plugin
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.
*/
// "Crackle" variation is a type of blur - it is not affected by incoming data, simply
// generates a texture.
// These set cache size for cell centres, they take a lot of processing, so it's handy to
// keep values between calls
#define _USE_MATH_DEFINES
#define CACHE_NUM 10
#define CACHE_WIDTH 21
#define VORONOI_MAXPOINTS 25
// voronoi and noiseb are additional, not required in all Apophysis plugins
#define _x_ 0
#define _y_ 1
#define _z_ 2
double vratio( double P[2], double Q[2], double U[2] );
int closest( double P[VORONOI_MAXPOINTS][2], int n, double U[2] );
double voronoi( double P[VORONOI_MAXPOINTS][2], int n, int q, double U[2] );
double simplexNoise3D( double V[3] );
double perlinNoise3D( double V[3], double aScale, double fScale, int octaves );
// Must define this structure before we include apoplugin.h
typedef struct
{
double crackle_cellsize;
double crackle_power;
double crackle_distort;
double crackle_scale;
double crackle_z;
// P is a working list of points
double P[VORONOI_MAXPOINTS][2];
// C is a cache of pre-calculated centres
double C[CACHE_WIDTH][CACHE_WIDTH][2];
} Variables;
#include "apoplugin.h"
static int p[2050] = {
127, 71, 882, 898, 798, 463, 517, 451, 454, 634, 578, 695, 728, 742, 325, 350, 684, 153, 340,
311, 992, 706, 218, 285, 96, 486, 160, 98, 686, 288, 193, 119, 410, 246, 536, 415, 953, 417,
784, 573, 734, 1, 136, 381, 177, 678, 773, 22, 301, 51, 874, 844, 775, 744, 633, 468, 1019,
287, 475, 78, 294, 724, 519, 17, 323, 191, 187, 446, 262, 212, 170, 33, 7, 227, 566, 526, 264,
556, 717, 477, 815, 671, 225, 207, 692, 663, 969, 393, 658, 877, 353, 788, 128, 303, 614, 501,
490, 387, 53, 941, 951, 736, 539, 102, 163, 175, 584, 988, 35, 347, 442, 649, 642, 198, 727,
939, 913, 811, 894, 858, 181, 412, 307, 830, 154, 479, 704, 326, 681, 619, 698, 621, 552, 598,
74, 890, 299, 922, 701, 481, 867, 214, 817, 731, 768, 673, 315, 338, 576, 222, 484, 305, 623,
239, 269, 46, 748, 608, 546, 537, 125, 667, 998, 714, 529, 823, 247, 289, 771, 808, 973, 735,
516, 974, 702, 636, 357, 455, 600, 80, 336, 696, 963, 297, 92, 980, 670, 958, 625, 712, 406,
173, 19, 763, 470, 793, 283, 655, 59, 421, 1016, 219, 13, 105, 840, 111, 38, 408, 945, 242,
559, 206, 443, 331, 737, 580, 767, 1020, 220, 31, 968, 15, 527, 833, 139, 129, 859, 739, 418,
783, 933, 49, 789, 178, 124, 772, 627, 0, 23, 388, 950, 976, 940, 485, 685, 21, 523, 723, 244,
637, 488, 835, 379, 342, 452, 862, 295, 765, 897, 507, 370, 567, 416, 100, 914, 300, 120, 392,
694, 94, 265, 791, 171, 200, 787, 441, 868, 672, 769, 983, 911, 427, 82, 69, 224, 176, 920,
500, 462, 263, 513, 797, 293, 322, 645, 469, 635, 40, 215, 687, 960, 818, 826, 34, 603, 316,
994, 611, 511, 93, 899, 114, 73, 241, 585, 327, 674, 280, 957, 471, 24, 502, 355, 159, 1017,
855, 270, 538, 521, 162, 880, 334, 986, 740, 719, 266, 820, 97, 41, 52, 750, 893, 838, 616, 83,
896, 777, 464, 562, 183, 362, 411, 478, 398, 384, 912, 599, 587, 609, 822, 243, 504, 753, 857,
157, 964, 65, 261, 81, 371, 435, 924, 885, 884, 863, 613, 721, 669, 121, 639, 989, 487, 238,
448, 216, 852, 643, 713, 676, 277, 879, 133, 123, 304, 547, 396, 70, 141, 909, 848, 900, 318,
146, 356, 802, 4, 807, 558, 764, 545, 588, 872, 554, 467, 544, 505, 149, 62, 901, 64, 45, 813,
27, 109, 718, 803, 853, 996, 1014, 476, 575, 28, 199, 688, 6, 482, 703, 560, 395, 66, 341, 794,
422, 376, 601, 76, 14, 569, 480, 39, 1011, 1001, 854, 55, 89, 335, 761, 363, 419, 252, 799,
358, 324, 1012, 152, 312, 496, 235, 916, 582, 615, 979, 1005, 891, 1013, 641, 18, 148, 185,
512, 378, 58, 211, 495, 594, 87, 762, 366, 660, 449, 520, 424, 886, 819, 281, 147, 290, 390,
32, 572, 993, 720, 683, 309, 254, 607, 568, 256, 533, 394, 620, 429, 67, 831, 103, 423, 668,
693, 518, 551, 697, 253, 949, 54, 875, 116, 434, 743, 644, 590, 279, 843, 589, 11, 647, 586,
806, 549, 375, 226, 851, 499, 450, 978, 29, 982, 189, 107, 508, 373, 796, 20, 700, 110, 26,
461, 782, 591, 828, 57, 904, 847, 328, 122, 630, 711, 44, 397, 404, 209, 365, 84, 194, 1021,
675, 135, 965, 329, 557, 691, 79, 352, 498, 629, 869, 90, 921, 233, 622, 871, 755, 439, 955,
228, 63, 825, 43, 943, 438, 144, 961, 359, 330, 682, 626, 425, 259, 249, 801, 754, 1003, 230,
377, 217, 878, 1007, 313, 2, 915, 550, 271, 437, 846, 548, 145, 715, 346, 251, 372, 99, 543,
16, 47, 195, 679, 174, 905, 188, 804, 169, 785, 231, 726, 814, 339, 531, 420, 258, 1009, 134,
972, 458, 234, 690, 260, 666, 646, 142, 184, 91, 628, 987, 10, 210, 926, 348, 386, 161, 60,
409, 680, 204, 164, 444, 708, 276, 68, 383, 491, 382, 42, 816, 483, 699, 150, 9, 565, 555, 433,
593, 86, 952, 839, 618, 751, 889, 108, 361, 595, 677, 407, 856, 255, 604, 85, 648, 928, 824,
213, 192, 267, 902, 792, 656, 631, 403, 389, 493, 333, 756, 602, 925, 113, 632, 354, 37, 873,
577, 56, 278, 930, 367, 428, 332, 317, 530, 364, 800, 774, 497, 1023, 12, 137, 845, 653, 101,
888, 542, 167, 48, 158, 1002, 745, 292, 944, 456, 990, 574, 25, 1018, 937, 298, 966, 430, 400,
349, 860, 689, 320, 117, 778, 104, 314, 786, 205, 606, 440, 936, 457, 932, 934, 948, 168, 445,
931, 757, 291, 571, 919, 360, 284, 509, 296, 245, 836, 166, 3, 257, 50, 282, 151, 810, 344,
947, 236, 946, 865, 752, 77, 610, 967, 795, 131, 302, 760, 781, 190, 938, 61, 1022, 652, 138,
984, 832, 202, 140, 985, 5, 657, 997, 401, 319, 431, 662, 405, 275, 650, 651, 887, 310, 1004,
368, 208, 596, 248, 758, 8, 126, 730, 489, 343, 337, 506, 515, 432, 232, 250, 532, 954, 524,
115, 229, 522, 908, 729, 186, 561, 995, 156, 196, 118, 805, 399, 918, 991, 849, 273, 747, 640,
143, 321, 624, 268, 306, 30, 722, 540, 534, 710, 130, 155, 883, 716, 525, 426, 812, 345, 929,
975, 472, 837, 605, 664, 391, 581, 272, 746, 112, 659, 665, 780, 240, 841, 474, 563, 36, 579,
286, 436, 907, 369, 201, 402, 962, 106, 749, 172, 494, 88, 466, 473, 414, 597, 374, 942, 308,
766, 459, 821, 592, 881, 380, 759, 866, 779, 809, 876, 541, 829, 528, 999, 221, 661, 927, 413,
977, 182, 583, 733, 892, 741, 570, 351, 617, 956, 72, 709, 850, 732, 770, 870, 95, 935, 223,
179, 861, 917, 447, 385, 132, 827, 923, 75, 465, 612, 460, 725, 492, 553, 1008, 910, 981, 503,
165, 895, 834, 1000, 180, 638, 906, 510, 274, 776, 971, 564, 738, 903, 654, 864, 959, 1015,
453, 535, 237, 197, 1006, 790, 514, 842, 970, 705, 707, 1010, 203,
// 1k Block repeats here
127, 71, 882, 898, 798, 463, 517, 451, 454, 634, 578, 695, 728, 742, 325, 350, 684, 153, 340,
311, 992, 706, 218, 285, 96, 486, 160, 98, 686, 288, 193, 119, 410, 246, 536, 415, 953, 417,
784, 573, 734, 1, 136, 381, 177, 678, 773, 22, 301, 51, 874, 844, 775, 744, 633, 468, 1019,
287, 475, 78, 294, 724, 519, 17, 323, 191, 187, 446, 262, 212, 170, 33, 7, 227, 566, 526, 264,
556, 717, 477, 815, 671, 225, 207, 692, 663, 969, 393, 658, 877, 353, 788, 128, 303, 614, 501,
490, 387, 53, 941, 951, 736, 539, 102, 163, 175, 584, 988, 35, 347, 442, 649, 642, 198, 727,
939, 913, 811, 894, 858, 181, 412, 307, 830, 154, 479, 704, 326, 681, 619, 698, 621, 552, 598,
74, 890, 299, 922, 701, 481, 867, 214, 817, 731, 768, 673, 315, 338, 576, 222, 484, 305, 623,
239, 269, 46, 748, 608, 546, 537, 125, 667, 998, 714, 529, 823, 247, 289, 771, 808, 973, 735,
516, 974, 702, 636, 357, 455, 600, 80, 336, 696, 963, 297, 92, 980, 670, 958, 625, 712, 406,
173, 19, 763, 470, 793, 283, 655, 59, 421, 1016, 219, 13, 105, 840, 111, 38, 408, 945, 242,
559, 206, 443, 331, 737, 580, 767, 1020, 220, 31, 968, 15, 527, 833, 139, 129, 859, 739, 418,
783, 933, 49, 789, 178, 124, 772, 627, 0, 23, 388, 950, 976, 940, 485, 685, 21, 523, 723, 244,
637, 488, 835, 379, 342, 452, 862, 295, 765, 897, 507, 370, 567, 416, 100, 914, 300, 120, 392,
694, 94, 265, 791, 171, 200, 787, 441, 868, 672, 769, 983, 911, 427, 82, 69, 224, 176, 920,
500, 462, 263, 513, 797, 293, 322, 645, 469, 635, 40, 215, 687, 960, 818, 826, 34, 603, 316,
994, 611, 511, 93, 899, 114, 73, 241, 585, 327, 674, 280, 957, 471, 24, 502, 355, 159, 1017,
855, 270, 538, 521, 162, 880, 334, 986, 740, 719, 266, 820, 97, 41, 52, 750, 893, 838, 616, 83,
896, 777, 464, 562, 183, 362, 411, 478, 398, 384, 912, 599, 587, 609, 822, 243, 504, 753, 857,
157, 964, 65, 261, 81, 371, 435, 924, 885, 884, 863, 613, 721, 669, 121, 639, 989, 487, 238,
448, 216, 852, 643, 713, 676, 277, 879, 133, 123, 304, 547, 396, 70, 141, 909, 848, 900, 318,
146, 356, 802, 4, 807, 558, 764, 545, 588, 872, 554, 467, 544, 505, 149, 62, 901, 64, 45, 813,
27, 109, 718, 803, 853, 996, 1014, 476, 575, 28, 199, 688, 6, 482, 703, 560, 395, 66, 341, 794,
422, 376, 601, 76, 14, 569, 480, 39, 1011, 1001, 854, 55, 89, 335, 761, 363, 419, 252, 799,
358, 324, 1012, 152, 312, 496, 235, 916, 582, 615, 979, 1005, 891, 1013, 641, 18, 148, 185,
512, 378, 58, 211, 495, 594, 87, 762, 366, 660, 449, 520, 424, 886, 819, 281, 147, 290, 390,
32, 572, 993, 720, 683, 309, 254, 607, 568, 256, 533, 394, 620, 429, 67, 831, 103, 423, 668,
693, 518, 551, 697, 253, 949, 54, 875, 116, 434, 743, 644, 590, 279, 843, 589, 11, 647, 586,
806, 549, 375, 226, 851, 499, 450, 978, 29, 982, 189, 107, 508, 373, 796, 20, 700, 110, 26,
461, 782, 591, 828, 57, 904, 847, 328, 122, 630, 711, 44, 397, 404, 209, 365, 84, 194, 1021,
675, 135, 965, 329, 557, 691, 79, 352, 498, 629, 869, 90, 921, 233, 622, 871, 755, 439, 955,
228, 63, 825, 43, 943, 438, 144, 961, 359, 330, 682, 626, 425, 259, 249, 801, 754, 1003, 230,
377, 217, 878, 1007, 313, 2, 915, 550, 271, 437, 846, 548, 145, 715, 346, 251, 372, 99, 543,
16, 47, 195, 679, 174, 905, 188, 804, 169, 785, 231, 726, 814, 339, 531, 420, 258, 1009, 134,
972, 458, 234, 690, 260, 666, 646, 142, 184, 91, 628, 987, 10, 210, 926, 348, 386, 161, 60,
409, 680, 204, 164, 444, 708, 276, 68, 383, 491, 382, 42, 816, 483, 699, 150, 9, 565, 555, 433,
593, 86, 952, 839, 618, 751, 889, 108, 361, 595, 677, 407, 856, 255, 604, 85, 648, 928, 824,
213, 192, 267, 902, 792, 656, 631, 403, 389, 493, 333, 756, 602, 925, 113, 632, 354, 37, 873,
577, 56, 278, 930, 367, 428, 332, 317, 530, 364, 800, 774, 497, 1023, 12, 137, 845, 653, 101,
888, 542, 167, 48, 158, 1002, 745, 292, 944, 456, 990, 574, 25, 1018, 937, 298, 966, 430, 400,
349, 860, 689, 320, 117, 778, 104, 314, 786, 205, 606, 440, 936, 457, 932, 934, 948, 168, 445,
931, 757, 291, 571, 919, 360, 284, 509, 296, 245, 836, 166, 3, 257, 50, 282, 151, 810, 344,
947, 236, 946, 865, 752, 77, 610, 967, 795, 131, 302, 760, 781, 190, 938, 61, 1022, 652, 138,
984, 832, 202, 140, 985, 5, 657, 997, 401, 319, 431, 662, 405, 275, 650, 651, 887, 310, 1004,
368, 208, 596, 248, 758, 8, 126, 730, 489, 343, 337, 506, 515, 432, 232, 250, 532, 954, 524,
115, 229, 522, 908, 729, 186, 561, 995, 156, 196, 118, 805, 399, 918, 991, 849, 273, 747, 640,
143, 321, 624, 268, 306, 30, 722, 540, 534, 710, 130, 155, 883, 716, 525, 426, 812, 345, 929,
975, 472, 837, 605, 664, 391, 581, 272, 746, 112, 659, 665, 780, 240, 841, 474, 563, 36, 579,
286, 436, 907, 369, 201, 402, 962, 106, 749, 172, 494, 88, 466, 473, 414, 597, 374, 942, 308,
766, 459, 821, 592, 881, 380, 759, 866, 779, 809, 876, 541, 829, 528, 999, 221, 661, 927, 413,
977, 182, 583, 733, 892, 741, 570, 351, 617, 956, 72, 709, 850, 732, 770, 870, 95, 935, 223,
179, 861, 917, 447, 385, 132, 827, 923, 75, 465, 612, 460, 725, 492, 553, 1008, 910, 981, 503,
165, 895, 834, 1000, 180, 638, 906, 510, 274, 776, 971, 564, 738, 903, 654, 864, 959, 1015,
453, 535, 237, 197, 1006, 790, 514, 842, 970, 705, 707, 1010, 203,
// 2k block overlaps by two items here . . . (to allow for over-runs caused by taking
// "next item in sequence")
127, 71
};
// grad[][] contains gradient values that will be associated with grid points for
// the simplex code to interpolate. They are chosen using the hash codes
// from p[], above
static double grad3[1024][3] = {
{0.79148875, 0.11986299, -0.59931496}, {0.51387411, -0.61170974, 0.60145208}, {-0.95395128, -0.21599571, 0.20814132}, {0.59830026, 0.67281067, 0.43515813},
{-0.93971346, 0.16019818, -0.30211777}, {-0.74549699, -0.35758846, 0.56246309}, {-0.78850321, -0.29060783, 0.54204223}, {0.61332339, 0.38915256, 0.68730976},
{-0.64370632, -0.40843865, 0.64716307}, {-0.23922684, 0.70399949, -0.66869667}, {-0.82882802, -0.00130741, 0.55950192}, {0.07987672, 0.62439350, -0.77701510},
{-0.46863456, -0.57517073, 0.67049257}, {0.30792870, 0.42464616, -0.85138449}, {-0.06972001, 0.30439513, 0.94999091}, {0.58798450, -0.00151777, 0.80887077},
{-0.32757867, 0.51578941, 0.79161449}, {-0.44745031, 0.86883688, 0.21192142}, {-0.38042636, 0.71222019, 0.58993066}, {-0.32616370, 0.61421101, -0.71858339},
{0.45483340, 0.19928843, -0.86799234}, {-0.81020233, -0.05930352, 0.58314259}, {0.81994145, 0.39825895, 0.41120046}, {0.49257662, 0.74240487, 0.45409612},
{0.95124863, -0.26667257, -0.15495734}, {-0.95745656, 0.09203090, -0.27350914}, {0.20842499, -0.82482150, -0.52557446}, {0.46829293, -0.47740985, -0.74349282},
{-0.65000311, -0.74754355, 0.13665502}, {0.83566743, 0.53294928, -0.13275921}, {0.90454761, -0.35449497, -0.23691126}, {-0.64270969, 0.21532175, 0.73522839},
{-0.39693478, -0.17553935, -0.90090439}, {0.45073049, 0.65155528, 0.61017845}, {0.69618384, -0.07989842, 0.71340333}, {0.09059934, 0.85274641, -0.51440773},
{-0.00560267, 0.69197466, 0.72190005}, {0.23586856, -0.95830502, 0.16129945}, {0.20354340, -0.96925430, -0.13826128}, {-0.45516395, 0.63885905, 0.62022970},
{0.80792021, 0.47917579, 0.34300946}, {0.40886670, -0.32579857, -0.85245722}, {-0.83819701, -0.30910810, 0.44930831}, {-0.57602641, -0.75801200, 0.30595978},
{-0.16591524, -0.96579983, -0.19925569}, {0.27174061, 0.93638167, -0.22214053}, {-0.45758922, 0.73185326, -0.50497812}, {-0.18029934, -0.78067110, -0.59836843},
{0.14087163, -0.39189764, -0.90915974}, {-0.03534787, -0.02750024, 0.99899663}, {0.91016878, 0.06772570, 0.40866370}, {0.70142578, 0.70903193, 0.07263332},
{-0.49486157, -0.54111502, -0.67993129}, {-0.26972486, -0.84418773, -0.46324462}, {0.91931005, 0.03121901, 0.39229378}, {-0.15332070, -0.87495538, 0.45928842},
{-0.59010107, -0.66883868, 0.45214549}, {0.51964273, -0.78565398, -0.33573688}, {-0.25845001, 0.87348329, -0.41259003}, {-0.64741807, -0.59846669, 0.47189773},
{-0.79348688, -0.32782128, -0.51274923}, {-0.86280237, -0.14342378, -0.48476972}, {0.19469709, -0.76349966, 0.61576076}, {0.39371236, -0.70742193, -0.58697938},
{0.62103834, -0.50000004, -0.60358209}, {-0.19652824, -0.51508695, 0.83430335}, {-0.96016549, -0.26826630, -0.07820118}, {0.52655683, 0.84118729, 0.12305219},
{0.56222101, 0.70557745, -0.43135599}, {0.06395307, 0.99025162, -0.12374061}, {-0.65379289, 0.52521996, 0.54470070}, {0.81206590, -0.38643765, 0.43728128},
{-0.69449067, -0.71926243, -0.01855435}, {0.33968533, 0.75504287, 0.56082452}, {-0.52402654, -0.70537870, -0.47732282}, {-0.65379327, -0.46369816, 0.59794512},
{-0.08582021, -0.01217948, 0.99623619}, {-0.66287577, 0.49604924, 0.56083051}, {0.70911302, 0.68748287, -0.15660789}, {-0.58662137, -0.46475685, 0.66323181},
{-0.76681755, 0.63310950, -0.10565607}, {0.68601816, -0.59353001, 0.42083395}, {0.64792478, -0.72668696, 0.22829704}, {0.68756542, -0.69062543, 0.22425499},
{-0.46901797, -0.72307343, -0.50713604}, {-0.71418521, -0.11738817, 0.69004312}, {0.50880449, -0.80611081, 0.30216445}, {0.27793962, -0.58372922, -0.76289565},
{-0.39417207, 0.91575060, -0.07764800}, {-0.84724113, -0.47860304, 0.23048124}, {0.67628991, 0.54362408, -0.49709638}, {0.65073821, -0.09420630, 0.75343544},
{0.66910202, 0.73566783, -0.10533437}, {0.72191995, -0.00305613, 0.69196983}, {-0.00313125, 0.06634333, 0.99779194}, {-0.06908811, 0.28990653, -0.95455803},
{0.17507626, 0.73870621, 0.65089280}, {-0.57470594, 0.75735703, 0.31003777}, {-0.91870733, 0.08883536, 0.38481830}, {-0.27399536, 0.39846316, 0.87530203},
{0.99772699, -0.05473919, 0.03929993}, {0.22663907, 0.97393801, -0.00891541}, {0.62338001, 0.59656797, -0.50547405}, {0.59177247, 0.49473684, -0.63642816},
{-0.24457664, -0.31345545, 0.91756632}, {-0.44691491, -0.89198404, -0.06805539}, {-0.83115967, -0.44685014, 0.33090566}, {-0.39940345, 0.67719937, -0.61796270},
{0.55460272, -0.63265953, -0.54051619}, {0.82284412, 0.14794174, -0.54867185}, {-0.39887172, -0.82890906, -0.39218761}, {0.28591109, 0.71270085, 0.64055628},
{-0.15438831, 0.66966606, 0.72643762}, {-0.75134796, 0.54289699, 0.37515211}, {0.32016243, 0.77691605, -0.54212311}, {0.50884942, 0.15171482, -0.84738119},
{0.08945627, 0.73684807, 0.67011379}, {-0.68792851, -0.71885270, -0.10002580}, {0.02292266, -0.07249674, 0.99710520}, {0.94083723, -0.10191422, 0.32316993},
{-0.81053204, 0.43703808, 0.38991733}, {-0.19558496, -0.07485841, 0.97782552}, {0.68911052, -0.49915226, -0.52533200}, {0.19796974, 0.93342057, 0.29922235},
{-0.79540501, -0.26473293, 0.54520395}, {-0.27945416, -0.91288360, 0.29757168}, {0.82074194, 0.43648314, 0.36859889}, {-0.20594999, -0.70696486, -0.67659832},
{-0.05687654, -0.70968577, 0.70221874}, {-0.26280466, 0.69993747, -0.66409430}, {-0.54551347, -0.78469719, 0.29438983}, {0.90609571, 0.39319111, 0.15617717},
{0.69129692, 0.67317351, 0.26257571}, {0.98391565, -0.05206160, 0.17087883}, {0.63806303, 0.67740288, -0.36606134}, {-0.50096077, 0.83542684, -0.22605378},
{0.65237128, 0.35509583, 0.66956603}, {-0.85711882, -0.19885856, 0.47518691}, {0.79383271, -0.12451513, 0.59525256}, {-0.63301076, 0.07907192, 0.77009416},
{0.57925311, -0.49077742, 0.65084818}, {0.14070842, 0.97298117, 0.18305403}, {-0.59601232, 0.69646383, -0.39963413}, {-0.68205637, -0.47455943, 0.55641033},
{0.47997775, -0.84805982, -0.22453484}, {0.83562547, -0.48273957, 0.26209270}, {0.59180830, 0.36411758, 0.71915320}, {0.66057023, -0.66033264, 0.35722231},
{0.53319130, 0.75511965, 0.38144639}, {-0.21631797, -0.12712992, 0.96801060}, {-0.23971441, 0.89928294, -0.36582400}, {-0.72825564, 0.27377922, -0.62824252},
{0.02135570, 0.73882696, 0.67355672}, {0.48112026, 0.78759215, 0.38499597}, {-0.58250985, -0.09956878, 0.80670213}, {0.21323385, 0.36856735, 0.90481459},
{-0.36459960, -0.93062781, -0.03160697}, {-0.68684541, 0.17314748, -0.70587771}, {0.68032531, -0.07909205, -0.72863017}, {0.25007484, -0.61882132, 0.74466284},
{0.77055613, 0.59380162, 0.23160935}, {0.67996118, -0.03835970, 0.73224403}, {0.43079959, 0.38901749, -0.81429547}, {0.76815116, -0.63831184, 0.05001794},
{-0.13601015, 0.75596033, -0.64033211}, {0.36884321, -0.45188838, -0.81225093}, {0.79562623, -0.43647179, 0.42008485}, {-0.65875496, 0.39126701, -0.64261344},
{-0.68899899, 0.44217527, 0.57424858}, {0.25292617, 0.96620732, -0.04971687}, {-0.68558843, -0.70460233, 0.18304118}, {0.86382379, 0.29507865, 0.40833448},
{0.13627838, 0.31500179, 0.93925613}, {0.67187940, 0.64336667, 0.36695693}, {0.37977583, 0.31123423, 0.87115072}, {-0.03326050, -0.99451574, -0.09915731},
{-0.66427749, -0.01424397, -0.74735033}, {0.68859558, 0.44744486, -0.57063931}, {-0.56738045, 0.30154774, -0.76625608}, {-0.58488004, 0.63357146, 0.50646080},
{0.38842469, 0.92016339, 0.04925032}, {0.15316057, -0.97495961, -0.16123153}, {0.57623375, 0.51659393, 0.63331301}, {0.32392581, -0.79816566, -0.50794059},
{0.73136440, -0.54179646, 0.41420129}, {-0.58929886, -0.58690534, -0.55521975}, {0.64030162, 0.32487137, -0.69604054}, {0.80502987, -0.00635101, 0.59320028},
{0.46595373, 0.62005710, -0.63120227}, {0.83612498, 0.53677947, 0.11297261}, {-0.60753284, -0.29028728, -0.73934913}, {-0.45583848, 0.84488003, 0.27998037},
{-0.27320563, -0.39709327, 0.87617100}, {0.84893256, -0.09000823, 0.52078021}, {-0.35708766, -0.73203774, 0.58018027}, {0.10507148, -0.71032871, 0.69598355},
{0.68468508, 0.26788814, -0.67782172}, {-0.94602428, -0.13594737, -0.29420466}, {0.27104088, 0.95431757, 0.12575696}, {-0.55840113, 0.14909310, 0.81606337},
{0.47553129, 0.80729730, 0.34948685}, {-0.01891509, -0.97526220, 0.22024047}, {-0.65760518, -0.45924250, -0.59720327}, {-0.70549425, 0.70862555, 0.01129989},
{-0.88864223, 0.43707946, -0.13883994}, {0.49252849, -0.43814774, 0.75195894}, {-0.01398277, 0.69598571, 0.71791947}, {-0.67265622, 0.27228276, -0.68803758},
{-0.91724038, -0.01083918, -0.39818663}, {-0.24468025, 0.75690032, 0.60599792}, {-0.49070434, -0.48530058, 0.72366608}, {0.67110346, -0.55453760, -0.49204492},
{-0.95532877, -0.26328211, -0.13427388}, {-0.66012945, 0.41730904, 0.62456567}, {0.96822786, -0.03273592, 0.24791766}, {0.91952853, 0.23575545, -0.31446248},
{0.63712542, 0.06762652, 0.76778763}, {-0.21680947, 0.65843559, 0.72073312}, {0.06143588, 0.47272235, -0.87906724}, {0.70541616, -0.21884659, 0.67416186},
{-0.04396589, -0.67487644, -0.73661984}, {-0.65032618, 0.75012744, 0.11993615}, {-0.78840054, 0.58187068, -0.19962741}, {0.99318416, 0.11467779, 0.02083796},
{0.76775820, 0.46845611, -0.43714554}, {-0.70891635, -0.54302381, -0.45006972}, {0.55548849, -0.71825576, -0.41897638}, {-0.62167600, 0.77500231, 0.11353575},
{0.38413022, -0.79687865, 0.46629218}, {-0.56271512, 0.54186596, -0.62428597}, {0.62019121, -0.70563211, -0.34270424}, {0.85913131, 0.50529005, 0.08108862},
{0.54973106, -0.66129569, -0.51037612}, {-0.74254469, -0.49670185, -0.44934914}, {-0.75780366, 0.59195518, -0.27444976}, {-0.40050287, 0.04302113, -0.91528500},
{-0.60859484, 0.35063171, 0.71180736}, {-0.57297537, 0.81938865, -0.01736289}, {0.98721933, 0.09373543, -0.12888621}, {0.30397213, 0.87942861, 0.36634172},
{0.32615126, -0.64515144, -0.69094498}, {0.83015604, 0.30783918, 0.46483974}, {0.42822875, -0.04288671, -0.90265213}, {0.16585965, 0.53714643, 0.82702133},
{-0.37193298, 0.88497229, 0.28016051}, {0.73544877, 0.67744273, 0.01365471}, {-0.66150496, 0.09327263, -0.74411787}, {0.41664753, -0.23786298, -0.87739731},
{-0.78513086, -0.42653313, 0.44904233}, {0.08029855, 0.84803303, 0.52382451}, {-0.09507221, 0.50524394, -0.85772364}, {0.66939507, -0.17805679, 0.72125309},
{-0.76923153, 0.41652205, -0.48455364}, {0.51989556, 0.79632686, 0.30914743}, {0.85617969, -0.51024476, 0.08128121}, {0.71830013, 0.03208003, 0.69499337},
{-0.96000528, -0.11640072, -0.25463844}, {0.66084196, -0.19355993, 0.72513617}, {-0.57661819, -0.54757438, 0.60636109}, {0.65123443, -0.64818909, -0.39464494},
{0.36952748, -0.22540306, -0.90146708}, {0.34048182, -0.33515083, 0.87849078}, {0.11132435, -0.75280467, 0.64876191}, {0.67563520, 0.64934616, -0.34909404},
{0.23316576, 0.69276343, -0.68243135}, {0.30368064, -0.87532007, 0.37628825}, {-0.27080673, -0.74246398, 0.61270789}, {-0.21655683, -0.49565083, -0.84109060},
{-0.98776592, -0.14473189, 0.05806181}, {0.64562720, 0.38598860, 0.65892209}, {-0.63746045, -0.57205546, 0.51613635}, {0.06117405, -0.78423981, -0.61743474},
{0.74829362, 0.59119862, 0.30090006}, {-0.42571462, 0.51302568, -0.74536683}, {-0.56331794, 0.48608227, -0.66812943}, {-0.75919788, -0.64885422, 0.05105673},
{0.14385006, -0.53933953, 0.82971081}, {-0.77031548, -0.28344830, 0.57120148}, {-0.98358057, 0.17900745, 0.02292584}, {-0.25051205, 0.10358351, 0.96255606},
{-0.32867861, -0.83176115, -0.44737430}, {-0.36281449, -0.92995082, -0.05964161}, {-0.53796595, -0.03614791, 0.84219117}, {0.92960703, 0.10461247, 0.35339354},
{0.64021850, 0.61360003, 0.46218532}, {0.22343529, 0.69409296, 0.68433299}, {0.01781074, 0.89088149, 0.45388648}, {-0.63004672, -0.26934609, 0.72835007},
{0.48560056, -0.35192051, -0.80021500}, {0.62050161, 0.57366872, 0.53467931}, {0.00265452, 0.71539198, -0.69871830}, {0.64229521, 0.41380752, 0.64515130},
{0.23080049, -0.43573115, 0.86998247}, {0.14620517, 0.61171896, -0.77744708}, {-0.27436021, -0.61900378, 0.73590814}, {0.69959023, 0.71050058, 0.07591065},
{0.70362024, 0.62044755, -0.34635731}, {-0.29622242, -0.71700405, -0.63099721}, {0.31094340, -0.84299864, -0.43893905}, {0.07704196, -0.46344069, -0.88277248},
{-0.94533514, -0.04418570, 0.32309301}, {0.65845027, -0.36172634, -0.65999795}, {0.76069300, -0.18013255, 0.62361721}, {0.18607691, -0.45751624, -0.86951382},
{-0.67626808, -0.39178398, -0.62383235}, {-0.58782719, 0.55645189, -0.58721418}, {0.37531624, 0.80640206, 0.45700485}, {0.32610790, -0.50457786, 0.79940905},
{0.62915643, 0.76094546, -0.15850616}, {0.62803678, -0.75273385, -0.19738681}, {0.42539119, -0.89094420, 0.15893638}, {0.17668676, -0.40626331, 0.89651096},
{0.02778178, -0.78957083, -0.61303024}, {-0.25950053, -0.16244258, 0.95198313}, {-0.44117714, 0.73727502, -0.51165249}, {-0.30827444, 0.94136275, 0.13712420},
{0.97572111, -0.04258044, -0.21483768}, {0.55607688, 0.60474525, -0.57014181}, {-0.67430479, 0.12532345, 0.72774109}, {-0.31325824, -0.81393777, -0.48925921},
{-0.34811982, -0.70956566, 0.61264114}, {0.22583632, 0.72502572, -0.65064250}, {0.76936493, 0.63742123, -0.04209247}, {-0.55303394, -0.38417341, -0.73929984},
{-0.20953448, -0.92686077, -0.31148742}, {-0.18786352, 0.39920999, 0.89740664}, {0.46307517, -0.88470611, 0.05344618}, {-0.70328479, 0.30353783, 0.64284935},
{0.85916171, 0.15710234, 0.48699077}, {-0.26398391, 0.42122173, 0.86768932}, {0.82468427, 0.55134621, 0.12614757}, {0.05993298, 0.63414584, 0.77088721},
{-0.57291678, 0.81909656, -0.02910645}, {0.64075141, 0.74416542, -0.18882655}, {0.67112660, -0.55747979, -0.48867716}, {0.89932863, 0.23426637, -0.36922525},
{0.59146340, -0.44386974, 0.67316469}, {0.46684506, 0.19781570, -0.86193076}, {0.18536399, 0.76259887, 0.61974443}, {0.84144446, -0.53500771, -0.07574940},
{0.31212800, 0.82898453, -0.46406977}, {-0.88440729, -0.27020677, -0.38054178}, {0.20051055, 0.77523319, 0.59900670}, {0.48749115, 0.44082691, -0.75367368},
{0.24971103, -0.88242146, 0.39871892}, {-0.29777449, -0.95158243, -0.07629705}, {-0.37776905, -0.58777023, 0.71541366}, {0.22179317, 0.14730715, -0.96390269},
{0.58348153, 0.68630504, 0.43420582}, {-0.96759942, 0.14572096, 0.20619593}, {-0.15181654, 0.47495708, 0.86681458}, {0.26580537, 0.74350537, -0.61363447},
{-0.39189499, 0.72950601, 0.56057051}, {-0.01888074, 0.73557245, -0.67718290}, {0.73486517, 0.20569655, -0.64626783}, {-0.26354754, -0.23595215, -0.93534447},
{-0.62584298, -0.65116585, 0.42930594}, {-0.66666701, 0.61406968, 0.42246127}, {0.71799877, 0.67101619, 0.18497305}, {0.80098282, -0.45681211, -0.38697444},
{0.13205975, 0.91574792, -0.37942847}, {0.68891728, 0.72389791, -0.03694308}, {0.50346408, 0.46323331, -0.72934136}, {0.84557323, 0.53378861, -0.00869685},
{0.08666773, -0.81879883, 0.56750082}, {-0.50044423, 0.65858460, -0.56198033}, {0.35669785, 0.32248792, -0.87679427}, {-0.97346629, -0.22237373, -0.05397509},
{-0.53358835, -0.29312069, -0.79332448}, {0.12615748, 0.47083230, 0.87315591}, {-0.97022570, 0.19065350, 0.14937651}, {-0.57777643, 0.36008023, 0.73247295},
{0.60132454, 0.72398065, 0.33802488}, {0.19047827, -0.94729649, -0.25757988}, {-0.45904437, 0.69100108, 0.55838676}, {0.39148612, -0.51878308, 0.76000180},
{0.04137949, -0.75662546, -0.65253786}, {0.20020542, -0.76439245, -0.61288006}, {0.07933739, -0.21074410, 0.97431643}, {-0.40807425, 0.80614533, 0.42849166},
{-0.95397962, -0.09342040, -0.28494828}, {-0.31365384, 0.14377778, -0.93858895}, {0.84618575, -0.39191761, 0.36106822}, {-0.90177404, 0.07825801, -0.42506385},
{-0.19689944, -0.97296956, 0.12066831}, {0.61145370, 0.51715369, -0.59889601}, {-0.57329050, -0.80450317, -0.15528251}, {-0.27749150, -0.76245284, 0.58452044},
{-0.74877628, 0.66124357, 0.04572758}, {0.60284514, 0.58208119, 0.54567318}, {0.17695878, -0.67360184, 0.71759748}, {-0.83953853, 0.41240184, 0.35369447},
{0.37802442, -0.60322405, 0.70229501}, {0.51050450, -0.42970396, 0.74480847}, {-0.48366785, -0.20902730, -0.84992529}, {-0.87971286, -0.14820690, -0.45181855},
{-0.11520437, -0.59044778, -0.79881123}, {0.38877393, 0.92116844, -0.01742240}, {0.94330646, -0.27385756, -0.18754989}, {-0.66585548, 0.46928680, -0.58000550},
{0.20659390, -0.97226278, -0.10965425}, {0.70114934, 0.70875543, -0.07781609}, {0.50683262, 0.81003447, 0.29489803}, {-0.75501572, 0.56485827, -0.33299610},
{-0.43930454, -0.48824131, 0.75407688}, {-0.43442626, 0.51174617, 0.74120826}, {-0.97139119, -0.22722375, 0.06905442}, {-0.27189670, 0.51890879, -0.81043559},
{0.34109465, 0.91412005, -0.21917797}, {0.23216825, -0.66497033, 0.70986785}, {0.87281521, 0.48669099, 0.03640737}, {-0.60266004, -0.34235001, -0.72083101},
{-0.01994494, -0.52747354, 0.84933731}, {-0.27000504, -0.77679344, -0.56893693}, {-0.12330809, 0.85744248, -0.49958734}, {-0.69270982, 0.61145042, -0.38246763},
{-0.60277814, 0.55015465, 0.57791727}, {0.64946165, -0.22132925, -0.72747023}, {0.24257305, 0.26557728, 0.93307397}, {-0.66814908, 0.64881591, -0.36416303},
{-0.74538727, -0.44634982, -0.49514609}, {0.25115903, 0.38535072, -0.88793241}, {-0.61584597, -0.69782826, -0.36574509}, {0.13745929, 0.92666227, 0.34985995},
{-0.50342245, -0.82980249, -0.24081874}, {0.11249648, 0.99333196, -0.02522230}, {0.83241096, 0.21922825, -0.50895085}, {0.50175590, 0.86108612, 0.08229039},
{-0.35527286, -0.56925625, -0.74143679}, {0.31441654, -0.91653449, 0.24719782}, {0.62936968, 0.70222610, 0.33282475}, {0.77755375, -0.56236234, -0.28135169},
{-0.80098254, -0.37712493, 0.46497715}, {0.59310190, -0.68181911, -0.42819720}, {0.15392285, -0.98282954, 0.10175390}, {-0.96618662, 0.25781497, 0.00385483},
{0.33750940, -0.86020836, 0.38226820}, {-0.09597976, -0.40348179, -0.90993974}, {-0.70910783, 0.60681107, -0.35909108}, {0.41726791, -0.90380775, 0.09496860},
{-0.03646000, 0.99581799, -0.08376873}, {0.35348135, -0.70899268, 0.61022972}, {0.66002017, 0.74115740, -0.12271547}, {0.18515044, 0.96534454, -0.18392727},
{-0.29364182, -0.88826809, -0.35320572}, {0.99692330, 0.02436644, -0.07449968}, {-0.13529570, 0.35908874, 0.92344483}, {-0.76888326, -0.29702475, 0.56621095},
{-0.31931644, 0.72859881, 0.60595444}, {0.52827199, -0.82385659, 0.20539968}, {-0.83281688, -0.27413556, 0.48090097}, {-0.76899198, 0.23377782, 0.59497837},
{-0.60599231, 0.54438401, -0.58001670}, {-0.59616975, -0.18605791, 0.78100198}, {-0.83753036, 0.32458912, -0.43952794}, {0.62016934, 0.71285793, 0.32745011},
{-0.62489231, 0.01790151, 0.78050570}, {-0.44050813, -0.31396367, 0.84105850}, {0.82831903, 0.51349534, 0.22407615}, {-0.54638365, -0.42878084, -0.71945250},
{-0.30690837, -0.54588407, -0.77962673}, {-0.51419246, 0.49668914, 0.69921814}, {0.12759508, 0.79794754, 0.58906640}, {0.59812622, 0.53597438, 0.59579904},
{0.75450428, 0.31026344, 0.57832507}, {-0.34806954, -0.09710281, 0.93242621}, {-0.40140375, -0.85287390, 0.33388792}, {0.57290191, 0.32347021, -0.75309390},
{-0.53362688, -0.81285892, 0.23345818}, {-0.74679447, 0.64927639, 0.14400758}, {-0.80251380, -0.59638095, 0.01736004}, {-0.56868668, 0.61763086, -0.54325646},
{-0.72976559, 0.04179896, -0.68241852}, {0.57244144, -0.09255805, -0.81470474}, {0.97741613, 0.07186077, -0.19873032}, {0.72298477, 0.06613486, 0.68769121},
{-0.42596585, -0.65375247, -0.62542850}, {0.64840687, 0.16136696, -0.74399545}, {0.34352050, -0.92950264, 0.13423304}, {0.74687236, 0.45351768, -0.48631613},
{-0.51873425, -0.73762481, -0.43223191}, {0.29790392, 0.44209023, 0.84605525}, {-0.67740274, 0.46717430, -0.56821977}, {-0.36224935, -0.42773177, 0.82814307},
{-0.44192484, 0.73919980, 0.50821855}, {-0.92680658, -0.18163204, -0.32869343}, {-0.71384582, -0.70014113, 0.01505111}, {0.70600729, -0.70152253, 0.09705589},
{0.90031692, -0.36943663, 0.23010002}, {0.25264659, -0.65121757, -0.71560141}, {0.96727807, 0.19056552, 0.16750499}, {-0.65770755, -0.65887301, 0.36511251},
{0.05208955, -0.10417910, 0.99319353}, {-0.65282932, -0.40832320, 0.63803294}, {-0.00628739, -0.99502463, -0.09943061}, {-0.51900794, -0.62993523, 0.57776497},
{0.83046729, -0.16527060, 0.53198657}, {0.66869945, -0.56606479, -0.48209097}, {-0.54299772, -0.48639669, -0.68452300}, {0.52407156, -0.42268239, 0.73938393},
{0.71446999, -0.30844019, -0.62801057}, {-0.67320882, 0.39978543, 0.62206228}, {-0.53289859, -0.05079670, -0.84465306}, {0.67708925, -0.71979254, 0.15313018},
{-0.61369683, 0.65230332, 0.44483321}, {-0.26453665, -0.69129417, -0.67240816}, {0.85045794, 0.03075140, 0.52514345}, {-0.76757885, -0.10940324, 0.63154861},
{0.72754104, -0.17450402, -0.66350011}, {-0.34075755, -0.67303082, 0.65644026}, {0.70044829, 0.13095479, -0.70158609}, {0.43950040, -0.88211196, 0.16946353},
{-0.35706397, 0.48041126, 0.80106825}, {-0.77687193, 0.33320308, -0.53427120}, {0.51274543, 0.77662232, 0.36599165}, {0.33380578, 0.79591657, 0.50506486},
{-0.76587225, -0.03670574, 0.64194422}, {-0.23491078, 0.43695339, -0.86826762}, {0.25698923, -0.62346599, 0.73840822}, {0.13009757, -0.93331414, -0.33466303},
{-0.54841950, 0.64297666, -0.53461861}, {0.69823865, 0.51710521, -0.49504039}, {-0.64058874, -0.76638614, -0.04794108}, {-0.99383538, 0.10829476, 0.02373760},
{0.53702674, -0.26620457, -0.80046075}, {0.95618706, 0.14762618, 0.25280983}, {0.46882627, -0.32353926, -0.82190284}, {0.37771393, -0.17580406, -0.90907927},
{-0.38046162, 0.14393199, -0.91352752}, {0.99319923, -0.09757638, -0.06351493}, {0.50851715, 0.83898531, 0.19368521}, {0.32506349, -0.66811447, 0.66929574},
{-0.48035988, -0.63636898, -0.60356351}, {-0.06435942, 0.26733173, 0.96145286}, {0.60598929, -0.04278909, 0.79432114}, {-0.24869997, 0.88809619, -0.38656626},
{0.37370464, 0.04464997, -0.92647246}, {-0.48971589, -0.59472073, 0.63756224}, {0.69752714, 0.12358938, 0.70581978}, {0.52787180, 0.64468756, -0.55292794},
{-0.10489693, 0.16880171, -0.98005235}, {-0.63336451, -0.45121552, -0.62869226}, {0.54866356, 0.65678858, 0.51729785}, {-0.85968969, 0.49557488, -0.12385145},
{-0.47320716, -0.15150042, 0.86782637}, {0.19900943, -0.10259966, 0.97461200}, {-0.52893938, 0.84740153, 0.04619294}, {0.65121421, -0.49243156, -0.57743503},
{0.45693424, 0.73751862, 0.49726994}, {-0.47661222, -0.77374319, -0.41732752}, {-0.04808540, 0.90050093, 0.43218730}, {0.91129978, -0.31013948, 0.27082507},
{0.58778939, -0.42668247, -0.68734686}, {0.82297839, -0.34772114, -0.44921773}, {0.29494223, -0.86544442, -0.40498769}, {-0.39161493, 0.79055212, 0.47081322},
{0.79434783, -0.59398096, -0.12727195}, {0.77174313, 0.29796481, 0.56180915}, {0.78482345, -0.44974833, 0.42635500}, {-0.58988658, -0.54565594, 0.59522551},
{-0.97115669, 0.13450224, 0.19688532}, {0.42988246, 0.15513097, -0.88945796}, {-0.30013401, -0.45617888, 0.83774722}, {0.50990724, -0.38026491, -0.77161727},
{-0.68923129, 0.29274099, -0.66276914}, {-0.81531731, -0.42344291, -0.39490984}, {0.26048163, -0.96468719, -0.03908901}, {0.32147033, 0.32614689, -0.88897977},
{0.70055924, -0.70700997, 0.09671429}, {-0.58890140, -0.17999683, 0.78790626}, {0.70222863, 0.69308083, -0.16283095}, {-0.75366081, -0.65098223, -0.09065052},
{-0.19053922, -0.78772343, -0.58582130}, {-0.58846812, 0.34955220, 0.72905317}, {-0.60563594, -0.40529546, -0.68479244}, {-0.71315551, 0.69904447, 0.05240265},
{-0.45479055, 0.81186703, -0.36611129}, {-0.29059626, 0.05377439, 0.95533352}, {0.56290473, 0.78501299, 0.25863657}, {-0.43010366, -0.47609705, 0.76703484},
{0.63372606, -0.06214270, -0.77105744}, {0.28788198, -0.78226752, -0.55243234}, {-0.55506056, 0.67832002, -0.48144545}, {-0.47229498, 0.84794057, -0.24069533},
{-0.27628326, 0.87423025, -0.39923556}, {0.97754921, -0.01429369, -0.21022189}, {-0.78483628, 0.30941478, -0.53693064}, {-0.35769150, -0.53057471, 0.76847073},
{0.56804560, 0.59946775, -0.56388173}, {0.80328735, -0.57298006, -0.16255243}, {-0.34327107, -0.35133498, -0.87105034}, {0.80357102, -0.01979284, -0.59487970},
{-0.87804782, 0.46346126, 0.11931336}, {-0.11872912, -0.93845057, 0.32436695}, {0.68065237, 0.69467363, 0.23268195}, {-0.71974506, -0.36713686, 0.58921776},
{0.52822234, 0.82314813, -0.20834663}, {-0.67654042, -0.73158271, 0.08414148}, {-0.39062516, 0.89358947, -0.22115571}, {-0.62142505, 0.43386674, -0.65237302},
{-0.48099381, -0.18611372, -0.85674188}, {0.05036514, -0.74987003, 0.65966528}, {-0.49984895, -0.80920390, -0.30877188}, {0.50496868, 0.85618105, 0.10936472},
{-0.54084761, 0.24485715, 0.80469176}, {-0.81973873, -0.50777759, 0.26493457}, {0.72082268, -0.43713926, -0.53788839}, {0.91725234, -0.15187152, 0.36821621},
{-0.17151325, 0.57985483, 0.79646192}, {-0.74076471, 0.06061813, -0.66902398}, {0.32541463, -0.08200506, 0.94200875}, {-0.10818362, 0.99402161, -0.01474260},
{-0.61710380, -0.78296663, 0.07839742}, {-0.38878719, -0.57916742, 0.71652608}, {0.37911419, 0.92170992, 0.08199541}, {-0.60810067, -0.43108035, 0.66662082},
{-0.11745691, 0.38395577, 0.91585034}, {0.47694470, -0.81050760, 0.34000174}, {0.40287244, 0.88894800, 0.21786522}, {0.46780815, -0.54966937, 0.69211207},
{0.07109649, 0.79259959, -0.60558333}, {-0.52073054, -0.06778631, 0.85102569}, {-0.36866700, 0.77676019, -0.51061556}, {-0.71702100, -0.35727116, 0.59853004},
{-0.59010862, -0.73536014, -0.33319257}, {-0.66875911, 0.58597660, 0.45759445}, {-0.59798034, -0.69169805, 0.40493619}, {-0.20490060, 0.79048994, 0.57718402},
{0.48765302, 0.85851673, 0.15856717}, {0.88918101, 0.10371433, 0.44564612}, {0.48664272, 0.83596000, 0.25367252}, {-0.24554119, 0.50230038, -0.82909822},
{0.03554055, -0.41884154, -0.90736356}, {-0.03701100, -0.61772404, 0.78552352}, {0.42824046, 0.20582938, -0.87991158}, {-0.06839464, -0.43555129, -0.89756183},
{-0.40866952, -0.70331213, -0.58167111}, {-0.74822692, 0.38256599, 0.54203297}, {0.71541445, 0.51615594, 0.47091953}, {0.60759905, -0.70288934, -0.36982423},
{-0.01648745, -0.13394229, -0.99085197}, {-0.64568452, -0.13342451, 0.75185730}, {-0.42008783, 0.33302268, 0.84416948}, {-0.63557180, -0.46817632, 0.61388877},
{-0.82478405, -0.45636029, 0.33386606}, {-0.66628051, 0.24058840, 0.70582399}, {-0.60499178, -0.78374178, -0.14047697}, {0.63041860, -0.60894989, -0.48140672},
{-0.07945150, -0.91288865, -0.40040202}, {-0.66942344, 0.18523930, 0.71941550}, {-0.00849762, -0.47038898, 0.88241827}, {0.66223413, -0.33585751, 0.66981019},
{0.82512667, -0.23099667, -0.51556427}, {-0.75186864, 0.65450118, -0.07950940}, {0.87383910, 0.08193441, 0.47926192}, {-0.26554211, 0.78650504, 0.55758158},
{-0.49574252, 0.70523568, 0.50683527}, {-0.49212635, -0.64694353, 0.58247381}, {0.32264136, 0.78159510, -0.53386482}, {0.71510371, -0.22498049, 0.66182359},
{0.61434883, -0.51790453, 0.59527340}, {-0.82551670, -0.14228251, -0.54614821}, {-0.46251954, 0.64306734, -0.61036060}, {-0.52117891, -0.69061769, 0.50141773},
{0.27468699, -0.88951139, -0.36512537}, {0.65713642, -0.75365863, -0.01305358}, {0.94136220, -0.21960140, -0.25614924}, {-0.85554460, 0.30842011, -0.41583708},
{-0.35233681, -0.15379949, 0.92314922}, {-0.74432132, 0.44164975, -0.50093040}, {0.53994954, -0.79953954, -0.26304184}, {0.42964607, 0.11880600, 0.89514769},
{-0.87921789, 0.18018271, 0.44103298}, {-0.80353079, 0.36514238, 0.47011628}, {0.50404538, 0.65465655, -0.56334986}, {-0.92083981, -0.30381360, -0.24444087},
{0.13956423, -0.96009192, -0.24237437}, {-0.71698508, 0.68682212, 0.11919639}, {-0.76698836, 0.61675487, -0.17703754}, {-0.21874818, -0.57847904, -0.78581883},
{0.55494484, -0.79971185, 0.22912262}, {0.79660662, -0.41090893, 0.44336412}, {0.66489466, 0.00947646, -0.74687703}, {-0.59920476, 0.36935905, 0.71030103},
{-0.57524868, -0.51402380, -0.63629277}, {0.20536135, -0.69296940, 0.69110066}, {-0.05544564, -0.99802158, 0.02964287}, {0.13201661, 0.16519726, -0.97738502},
{0.46510187, 0.64584669, -0.60544390}, {-0.80108393, -0.59762086, 0.03337417}, {-0.39806873, -0.44410006, -0.80269323}, {0.95136791, -0.21916666, -0.21648342},
{-0.82086395, 0.17982074, 0.54207645}, {0.79513089, 0.37056075, 0.48005374}, {0.77112323, 0.56616567, 0.29124800}, {0.81176337, -0.24837815, 0.52853432},
{-0.81842091, 0.50060656, 0.28209979}, {-0.38248924, -0.72602893, 0.57147525}, {0.46198573, 0.37950267, 0.80159024}, {-0.59524911, 0.04222053, 0.80243126},
{-0.52273882, 0.79497643, -0.30782561}, {-0.79922245, 0.45390541, 0.39397125}, {0.38051244, -0.76512679, 0.51941436}, {0.83818590, 0.22605420, 0.49633043},
{0.63218067, 0.48127057, 0.60722832}, {0.59242495, 0.18424992, -0.78427333}, {0.85249021, -0.48552132, 0.19372531}, {-0.43548364, -0.58439144, 0.68471939},
{0.73179011, 0.29594379, -0.61392223}, {-0.45280534, -0.80755156, 0.37792566}, {0.55557939, 0.30092870, -0.77509578}, {0.42575514, 0.70893498, 0.56226662},
{0.60528173, -0.51550786, 0.60653580}, {-0.51076670, 0.84729685, -0.14562083}, {-0.33474095, 0.69713420, -0.63399716}, {-0.48650711, 0.74561924, 0.45537104},
{-0.41670009, -0.87381546, -0.25061440}, {0.92586094, -0.34254116, -0.15952140}, {-0.10682502, 0.59910669, 0.79351092}, {-0.44718479, -0.59299328, 0.66961536},
{0.69862855, -0.48858264, 0.52269031}, {-0.74718902, 0.51933770, -0.41472512}, {-0.56931667, 0.42835158, 0.70170753}, {0.05154068, 0.16647211, 0.98469823},
{0.74568360, -0.66371406, 0.05864824}, {0.64686641, 0.41668704, 0.63869849}, {0.27796256, -0.73021674, 0.62411563}, {0.77079499, -0.62615383, 0.11750087},
{-0.06833979, 0.90160690, 0.42712371}, {-0.98003087, -0.09480635, 0.17478914}, {-0.85191651, 0.47279136, 0.22518122}, {0.52473004, -0.19693989, -0.82817454},
{0.16081399, 0.75081437, -0.64063768}, {0.71441816, 0.52488995, -0.46270642}, {-0.23333515, -0.88652173, 0.39954216}, {0.54760612, -0.74897952, -0.37303782},
{0.48186221, -0.57810371, 0.65848683}, {-0.21255857, -0.53489421, -0.81774509}, {0.77930308, 0.57549405, -0.24797842}, {0.60279872, -0.76604104, -0.22319235},
{0.37230136, -0.52720909, 0.76383393}, {-0.13321231, -0.92277683, 0.36157627}, {-0.47833070, -0.49076061, -0.72825392}, {0.28828612, -0.93601402, 0.20191301},
{-0.66460360, -0.65589055, 0.35792406}, {0.90686144, 0.30403802, 0.29182738}, {-0.00682204, 0.42199214, 0.90657382}, {-0.33221520, 0.26584830, -0.90496284},
{-0.59515132, 0.55081686, 0.58514588}, {0.77123373, 0.59869357, -0.21625109}, {-0.69765329, -0.61042387, 0.37505011}, {0.02426772, -0.55656860, -0.83044715},
{0.65180023, 0.75814507, 0.01930051}, {-0.01531784, -0.78276243, 0.62213209}, {0.63847163, 0.03936370, 0.76863807}, {0.40703600, -0.09783879, -0.90815707},
{-0.46223121, -0.64783550, -0.60551753}, {0.82788442, -0.46539053, 0.31307993}, {-0.75467147, 0.24001984, 0.61062382}, {-0.70062375, -0.69087941, 0.17835919},
{0.35457466, 0.88605939, -0.29862279}, {0.20159504, -0.88658663, -0.41632150}, {-0.32096612, 0.72494426, -0.60945597}, {0.14147986, 0.53949815, -0.83001518},
{0.28297638, 0.93772862, 0.20146813}, {0.67192636, 0.43759891, -0.59751332}, {0.98497844, 0.01967209, 0.17155312}, {0.60388215, -0.68969665, 0.39955586},
{0.41200242, 0.85002960, 0.32818240}, {-0.83375884, 0.39266173, -0.38815328}, {-0.70938505, -0.58502714, -0.39308535}, {-0.63048972, 0.77513872, 0.04053013},
{0.10261233, -0.69355480, -0.71305852}, {0.65702752, -0.38976767, -0.64528753}, {-0.41388260, 0.33890875, 0.84489174}, {0.03028400, -0.46424256, -0.88519022},
{0.45068344, -0.52775066, -0.71997478}, {0.48930093, 0.41323002, -0.76800101}, {0.28350070, 0.66390322, 0.69199701}, {0.42450922, -0.60916900, 0.66985450},
{0.67306932, 0.51724488, -0.52861652}, {0.31095891, 0.94487804, -0.10251852}, {-0.25569777, 0.90632689, -0.33643754}, {-0.21431592, 0.07778980, -0.97366187},
{0.27676605, -0.87464593, 0.39798876}, {0.00288072, -0.88726140, -0.46125796}, {0.51138622, 0.12353356, 0.85042554}, {0.59734197, 0.76052363, 0.25453168},
{-0.43336730, -0.76588813, 0.47498227}, {0.34180565, -0.68750195, -0.64071052}, {-0.65078280, 0.51803512, 0.55508681}, {-0.89824124, 0.40466264, -0.17149586},
{0.54253116, 0.81082175, -0.21960883}, {-0.53994336, 0.54836630, 0.63855741}, {0.68778819, 0.33483595, -0.64407475}, {-0.63530446, -0.39864092, 0.66141792},
{0.80728009, -0.58358794, -0.08788616}, {0.94835277, 0.26419320, 0.17558181}, {-0.15823843, -0.51165316, 0.84449490}, {0.17510951, -0.22389002, 0.95875436},
{0.13697442, -0.88598087, 0.44303037}, {-0.73457485, -0.23332652, -0.63714874}, {0.95521505, -0.11801760, 0.27135964}, {-0.40184319, -0.90170455, -0.15953355},
{0.16857866, -0.70975159, -0.68398386}, {-0.55230772, 0.37144476, 0.74631426}, {0.29875717, -0.61848962, -0.72678383}, {0.62465217, -0.76131685, 0.17379963},
{0.75759704, 0.19352541, 0.62337360}, {-0.10375594, 0.61563856, 0.78116827}, {0.52725731, 0.25296549, 0.81117704}, {-0.71292545, -0.53989924, -0.44748867},
{0.78246146, 0.54867457, 0.29446609}, {0.31458005, 0.63401883, -0.70644145}, {-0.09360697, -0.99481997, -0.03963538}, {-0.59000956, 0.10880136, -0.80003186},
{0.49713243, 0.77379744, -0.39255173}, {-0.92985377, 0.17383167, 0.32427537}, {0.73574353, -0.63730495, -0.22918086}, {-0.04383386, -0.80273910, -0.59471719},
{0.68411849, 0.52929683, -0.50182344}, {-0.19561815, -0.57428906, -0.79493749}, {0.90257811, -0.06366895, -0.42579222}, {0.62294256, 0.39027502, -0.67795868},
{-0.39046281, -0.70398950, 0.59324327}, {0.70990020, 0.62433400, -0.32595821}, {-0.99157404, 0.01300690, 0.12888658}, {-0.55765988, -0.46179257, 0.68975581},
{-0.53736280, -0.34635255, -0.76894807}, {0.25083685, 0.44726649, -0.85850659}, {0.45758528, 0.86982087, -0.18446507}, {-0.18615519, 0.23441065, -0.95414773},
{0.56359579, -0.41325118, -0.71525048}, {-0.48542469, 0.59678985, -0.63890903}, {-0.72243931, -0.40815930, 0.55811059}, {-0.23748605, 0.68466361, -0.68908354},
{-0.69257361, 0.27959985, -0.66495543}, {-0.10352601, -0.17369566, -0.97934273}, {0.00192480, -0.09194122, 0.99576258}, {0.36297645, 0.86362173, 0.34986513},
{-0.71118388, -0.10242990, 0.69550385}, {0.45146824, 0.43080300, 0.78139952}, {-0.13265094, -0.68773403, -0.71374059}, {0.56016516, -0.56270148, -0.60793259},
{-0.95871022, -0.27465634, -0.07374694}, {-0.84169709, 0.06533746, -0.53598230}, {0.69711911, -0.61618111, -0.36653212}, {-0.01620384, 0.59778204, -0.80149490},
{-0.34911215, 0.65899531, -0.66621760}, {-0.19279427, -0.50540811, -0.84106659}, {-0.60506152, 0.72292944, 0.33357695}, {0.79789244, -0.59553505, 0.09330415},
{-0.48173680, -0.74189415, 0.46639331}, {0.84140763, 0.31839867, 0.43664115}, {0.79614481, 0.60391839, -0.03789486}, {0.19384456, 0.57096572, 0.79776089},
{0.83441754, -0.25078854, -0.49076723}, {-0.62605441, 0.72550166, 0.28583776}, {0.55337866, -0.75558589, 0.35051679}, {0.80543476, -0.01571309, 0.59247611},
{-0.00851542, 0.98991715, 0.14139139}, {-0.94076275, -0.29730096, -0.16302633}, {-0.75465549, -0.41353736, -0.50939371}, {0.37739255, -0.63080384, 0.67798332},
{0.47325376, -0.73145333, -0.49092453}, {0.12930721, -0.49066326, -0.86170135}, {0.71173142, -0.11663112, 0.69270165}, {0.41952295, -0.63051086, -0.65303641},
{0.85916103, 0.42641569, 0.28286390}, {0.54792224, -0.66418740, 0.50856299}, {0.28479416, 0.43856869, 0.85237890}, {-0.59050384, -0.68486024, -0.42693285},
{0.54884141, 0.60847988, 0.57317130}, {0.87567478, 0.25649070, -0.40915304}, {0.02961573, 0.33496172, 0.94176619}, {0.67428181, 0.70665199, 0.21444580},
{0.23609059, -0.51982231, 0.82100305}, {0.93726653, 0.00671493, 0.34854893}, {-0.39891590, -0.91536143, -0.05458531}, {0.93359117, -0.35793085, 0.01711843},
{0.53572079, -0.56879583, 0.62407896}, {-0.61516933, -0.36856434, -0.69694119}, {0.74630703, -0.65946218, -0.09019675}, {0.50607373, -0.59204544, -0.62719342},
{-0.89793356, 0.43675114, 0.05444050}, {-0.91682171, 0.07126199, 0.39288634}, {-0.61178292, -0.15203616, -0.77627744}, {-0.14028895, 0.63023583, 0.76362413},
{0.71475895, -0.54060748, 0.44369268}, {-0.31764961, 0.92630790, -0.20261391}, {0.59833443, -0.58864018, -0.54359788}, {-0.81450219, 0.22699691, -0.53390879},
{0.00452737, -0.06652318, 0.99777461}, {0.59311614, 0.19797584, -0.78039657}, {-0.71375488, -0.02586188, 0.69991795}, {-0.75600145, -0.26384588, -0.59903853},
{0.25716644, 0.77480857, -0.57752671}, {0.71712423, 0.61984999, -0.31862018}, {-0.28194922, -0.55108799, 0.78537040}, {0.57068285, -0.67066160, 0.47385030},
{0.48969101, -0.22604767, -0.84208382}, {-0.93763991, -0.34062289, 0.06933579}, {-0.67376035, 0.15110895, -0.72333469}, {-0.72414406, -0.65877431, -0.20403872},
{-0.71204285, 0.41163046, -0.56881926}, {0.23641604, -0.86280490, 0.44685026}, {0.84208951, 0.19949878, -0.50108432}, {-0.67481860, 0.67904385, -0.28899707},
{0.52167146, 0.66360202, 0.53618211}, {-0.49330390, -0.48590434, 0.72149029}, {-0.18240720, 0.04137646, -0.98235208}, {0.30714395, 0.55170433, 0.77542564},
{-0.14577549, 0.95376355, -0.26283949}, {-0.54373260, -0.69781662, -0.46626905}, {0.01799205, -0.81833182, 0.57446437}, {0.51019037, -0.56615200, -0.64743934},
{0.48463473, 0.59436639, 0.64176146}, {0.09115853, -0.52830175, -0.84414891}, {-0.62962436, -0.38408030, -0.67531880}, {0.50864721, -0.48401592, -0.71204396},
{-0.69669235, -0.63427804, -0.33512853}, {0.60735178, -0.18339351, 0.77297518}, {0.74102699, 0.67064566, 0.03336744}, {-0.47352242, -0.76145583, -0.44267543},
{0.47751531, -0.79737827, -0.36900816}, {0.74175025, -0.64892413, 0.16942269}, {0.65484829, -0.70924167, -0.26105549}, {0.60455058, -0.64392987, -0.46890608},
{-0.61878613, -0.77223405, 0.14407742}, {-0.72376655, -0.65562529, 0.21521492}, {0.24420910, -0.52118606, -0.81775731}, {0.61291622, 0.39870471, -0.68217906},
{0.67751893, 0.65970488, 0.32520389}, {-0.04366879, -0.96113671, 0.27259726}, {0.36541094, 0.62808212, 0.68701361}, {-0.92572867, 0.10611717, -0.36299528},
{0.80766374, -0.02031352, -0.58929335}, {-0.82117076, 0.53034081, 0.21075390}, {-0.62778197, -0.51872129, 0.58036025}, {0.37696186, 0.57743439, -0.72420251},
{-0.56818895, -0.47089866, -0.67484500}, {-0.61126182, -0.69853192, 0.37203783}, {0.57901952, 0.81284241, -0.06343191}, {-0.53287943, 0.70445351, 0.46881208},
{0.22300157, -0.93258969, 0.28380764}, {-0.63832115, -0.40157013, -0.65672486}, {-0.22074780, 0.50999380, 0.83137040}, {-0.59081050, -0.13684815, -0.79511982},
{-0.79824305, 0.52060475, -0.30295004}, {-0.56871170, 0.76435226, 0.30386284}, {0.12786983, -0.64236825, -0.75565358}, {-0.17631562, -0.76167939, -0.62350405},
{0.34713709, 0.61125835, -0.71123770}, {-0.39238887, -0.52886732, 0.75254922}, {0.38116332, 0.71358998, -0.58779577}, {-0.72949527, -0.67040404, 0.13562844},
{-0.62057913, 0.45165344, -0.64100757}, {-0.10668918, -0.98309252, -0.14881706}, {0.59490400, -0.46196716, -0.65778079}, {0.22433782, 0.49054463, 0.84204424},
{0.77498791, -0.57220981, 0.26827165}, {0.26474565, 0.93986866, -0.21576987}, {-0.01328623, 0.99975439, 0.01773780}, {0.53097408, 0.47771884, 0.69989373},
{0.24635212, -0.37499947, -0.89369236}, {0.31300988, -0.54171955, 0.78010560}, {0.77494650, -0.52634980, 0.34987684}, {0.65518408, 0.51410661, -0.55355958},
{0.78000762, -0.61855443, -0.09475515}, {0.58176976, 0.62638121, 0.51883574}, {-0.62371886, -0.59433046, 0.50768699}, {0.85206333, 0.17478222, -0.49339564},
{0.69974170, -0.42963013, 0.57077098}, {-0.44953934, 0.62956163, -0.63369277}, {0.63562255, 0.51965998, -0.57090935}, {-0.02766532, -0.52812789, -0.84871406},
{0.78698609, 0.04742916, -0.61514500}, {0.37827449, 0.78614098, 0.48876454}, {0.90534508, -0.25600916, -0.33883565}, {-0.37701605, 0.47347359, -0.79604124},
{-0.43802429, 0.40756165, -0.80126664}, {-0.87945568, -0.47372426, -0.04629300}, {-0.22787901, -0.82242670, 0.52123457}, {0.48721529, 0.74652617, -0.45312243},
{-0.68473990, -0.68222429, 0.25632263}, {-0.33289944, 0.62102263, -0.70958358}, {-0.07838790, -0.85438083, -0.51370101}, {0.18575601, 0.96209034, 0.19969195},
{0.09048656, -0.68256793, -0.72519874}, {0.29506068, -0.68306389, -0.66810397}, {-0.94937153, -0.17748927, 0.25921277}, {-0.38725072, 0.16372291, 0.90732116},
{-0.02691563, 0.81898594, 0.57318198}, {-0.65244629, -0.52276924, -0.54865851}, {0.15270967, -0.00097578, 0.98827061}, {0.39108739, 0.55471383, -0.73439990},
{0.85379797, -0.05140234, 0.51806064}, {0.31443713, 0.14998906, -0.93735403}, {-0.44277186, -0.56474741, -0.69642907}, {-0.31521736, 0.37268196, 0.87278071},
{0.97997903, -0.16829529, 0.10638514}, {-0.25174419, -0.84939324, 0.46384910}, {0.03867740, -0.72044135, 0.69243651}, {-0.80207202, 0.48047131, 0.35472214},
{0.48200634, -0.48413492, 0.73026246}, {-0.41800015, 0.44068588, -0.79440029}, {0.58661859, -0.43233611, 0.68480955}, {0.40830998, -0.53710845, 0.73810397},
{0.61242611, -0.72220206, -0.32149407}, {-0.34159283, -0.62199145, -0.70458567}, {-0.29885191, 0.58492128, -0.75402562}, {-0.62924060, 0.77130626, -0.09561862},
{0.91118189, 0.27762192, 0.30442344}, {0.08064464, -0.99213777, -0.09570315}, {0.93083382, -0.34928416, -0.10746612}, {0.66101659, -0.67569323, 0.32633681},
{0.07148482, -0.97619739, -0.20476469}, {0.30440743, -0.78193565, -0.54397863}, {-0.35656518, -0.19962907, 0.91269355}, {0.82151650, -0.31061678, 0.47815045},
{-0.69709423, -0.71173375, -0.08657198}, {-0.46044170, -0.78565215, -0.41321197}, {-0.70275364, -0.21121895, 0.67935548}, {0.38087769, 0.63933041, 0.66797366} };
// Simplex noise is evaluated on a tetrahedral grid, as opposed to a regular
// cube-based one. The two "skew factors" are used to convert between views
// of the grid so that calculations of which gridpoints to use are simpler.
// These numbers are straightforward for 3D, but the geometry is not so kind in
// 2D or 4D
static const double skewF3 = 1.0/3.0;
static const double skewG3 = 1.0/6.0;
// simplexNoise3D - given a vector in (x,y,z) returns the noise value for the
// location
double simplexNoise3D( double V[3] ) {
double C[4][3]; // Co-ordinates of four simplex shape corners in (x,y,z)
double n = 0.0; // Noise total value
int gi[4]; // Hashed grid index for each corner, used to determine gradient
double* U; // Pointer to current gradient vector . . .
int corner; // Iterator for which corner is being processed
double t; // Temp double
// Convert input co-ordinates ( x, y, z ) to
// integer-based simplex grid ( i, j, k )
double skewIn = ( V[_x_] + V[_y_] + V[_z_] ) * skewF3;
int i = floor( V[_x_] + skewIn );
int j = floor( V[_y_] + skewIn );
int k = floor( V[_z_] + skewIn );
t = (i + j + k) * skewG3;
// Cell origin co-ordinates in input space (x,y,z)
double X0 = i - t;
double Y0 = j - t;
double Z0 = k - t;
// This value of t finished with, not used later . . .
// Point offset within cell, in input space (x,y,z)
C[0][_x_] = V[_x_] - X0;
C[0][_y_] = V[_y_] - Y0;
C[0][_z_] = V[_z_] - Z0;
// For the 3D case, the simplex shape is a slightly irregular tetrahedron.
// The nested logic determines which simplex we are in, and therefore in which
// order to get gradients for the four corners
int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords
int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords
// The fourth corner is always i3 = 1, j3 = 1, k3 = 1, so no need to
// calculate values
if ( C[0][_x_] >= C[0][_y_] ) {
if ( C[0][_y_] >= C[0][_z_] ) {
i1=1; j1=0; k1=0; i2=1; j2=1; k2=0;
} else { // y0<z0
if( C[0][_x_] >= C[0][_z_] ) {
i1=1; j1=0; k1=0; i2=1; j2=0; k2=1;
} else {
i1=0; j1=0; k1=1; i2=1; j2=0; k2=1;
}
}
} else { // x0<y0
if( C[0][_y_] < C[0][_z_] ) {
i1=0; j1=0; k1=1; i2=0; j2=1; k2=1;
} else {
if( C[0][_x_] < C[0][_z_] ) {
i1=0; j1=1; k1=0; i2=0; j2=1; k2=1;
} else {
i1=0; j1=1; k1=0; i2=1; j2=1; k2=0;
} // Y X Z order
}
}
// A step of 1i in (i,j,k) is a step of (1-skewG3, -skewG3, -skewG3) in (x,y,z),
// and this is similar for j and k . . .
// Offsets for second corner in (x,y,z) coords
C[1][_x_] = C[0][_x_] - i1 + skewG3;
C[1][_y_] = C[0][_y_] - j1 + skewG3;
C[1][_z_] = C[0][_z_] - k1 + skewG3;
// Offsets for third corner in (x,y,z) coords
C[2][_x_] = C[0][_x_] - i2 + 2.0 * skewG3;
C[2][_y_] = C[0][_y_] - j2 + 2.0 * skewG3;
C[2][_z_] = C[0][_z_] - k2 + 2.0 * skewG3;
// Offsets for last corner in (x,y,z) coords
C[3][_x_] = C[0][_x_] - 1.0 + 3.0 * skewG3;
C[3][_y_] = C[0][_y_] - 1.0 + 3.0 * skewG3;
C[3][_z_] = C[0][_z_] - 1.0 + 3.0 * skewG3;
// Work out the hashed gradient indices of the four simplex corners
int ii = i & 0x3ff;
int jj = j & 0x3ff;
int kk = k & 0x3ff;
gi[0] = p[ii + p[jj + p[kk]]];
gi[1] = p[ii + i1 + p[jj + j1 + p[kk + k1]]];
gi[2] = p[ii + i2 +p[jj + j2 + p[kk + k2]]];
gi[3] = p[ii + 1 + p[jj + 1 + p[kk + 1]]];
// Calculate the contribution from the four corners, and add to total
for( corner = 0; corner < 4; corner++ ) {
t = 0.6 - C[corner][_x_] * C[corner][_x_] - C[corner][_y_] * C[corner][_y_] - C[corner][_z_] * C[corner][_z_] ;
if(t > 0.0) {
U = grad3[ gi[corner] ];
t *= t;
n += t * t * ( U[_x_] * C[corner][_x_] + U[_y_] * C[corner][_y_] + U[_z_] * C[corner][_z_] );
}
}
// The result is scaled be fit -1.0 to 1.0
return 32.0 * n;
}
// The Perlin noise function is based on summing coherent noise in "octaves"
double perlinNoise3D(double V[3], double aScale, double fScale, int octaves) {
int i; // Iterator
double n = 0.0; // Sum of noise values
double U[3];
double a = 1.0;
U[_x_] = V[_x_];
U[_y_] = V[_y_];
U[_z_] = V[_z_];
for (i=0; i < octaves; i++) {
n += simplexNoise3D(U) / a;
// None of the below required for last octave . . .
a *= aScale;
U[_x_] *= fScale;
U[_y_] *= fScale;
U[_z_] *= fScale;
}
return n;
}
double vratio( double P[2], double Q[2], double U[2] ) {
double PmQx, PmQy;
PmQx = P[_x_] - Q[_x_];
PmQy = P[_y_] - Q[_y_];
if ( 0.0 == PmQx && 0.0 == PmQy ) {
return 1.0;
}
return 2.0 * ( ( U[_x_] - Q[_x_] ) * PmQx + ( U[_y_] - Q[_y_] ) * PmQy ) / ( PmQx * PmQx + PmQy * PmQy );
}
// Closest point to U from array P.
// P is an array of points
// n is number of points to check
// U is location to find closest
int closest( double P[VORONOI_MAXPOINTS][2], int n, double U[2] ) {
double d2;
double d2min = 1.0e100;
int i, j;
for( i = 0; i < n; i++ ) {
d2 = (P[i][_x_] - U[_x_]) * (P[i][_x_] - U[_x_]) + (P[i][_y_] - U[_y_]) * (P[i][_y_] - U[_y_]);
if ( d2 < d2min ) {
d2min = d2;
j = i;
}
}
return j;
}
// Voronoi "value" is 0.0 (centre) to 1.0 (edge) if inside cell . . . higher values
// mean that point is not in the cell defined by chosen centre.
// P is an array of points defining cell centres
// n is number of points in array
// q is chosen centre to measure distance from
// U is point to test
double voronoi( double P[VORONOI_MAXPOINTS][2], int n, int q, double U[2] ) {
double ratio;
double ratiomax = -1.0e100;
int i;
for( i = 0; i < n; i++ ) {
if ( i != q ) {
ratio = vratio( P[i], P[q], U );
if ( ratio > ratiomax ) {
ratiomax = ratio;
}
}
}
return ratiomax;
}
// Waffle's cells are based on a simple square grid which is distorted using a noise function
// position() calculates cell centre for cell (x, y), given plane slice z, scale factor s, distortion d
// and stores in supplied array
void position( int x, int y, double z, double s, double d, double V[2] ) {
double E[3], F[3];
// Values here are arbitrary, chosen simply to be far enough apart so they do not correlate
E[_x_] = x * 2.5;
E[_y_] = y * 2.5;
E[_z_] = z * 2.5;
// Cross-over between x and y is intentional
F[_x_] = y * 2.5 + 30.2;
F[_y_] = x * 2.5 - 12.1;
F[_z_] = z * 2.5 + 19.8;
V[_x_] = ( x + d * simplexNoise3D( E ) ) * s;
V[_y_] = ( y + d * simplexNoise3D( F ) ) * s;
}
// cached_position gives centre co-ordinates either from cache, or calculated from scratch if needed
void cached_position( double Cache[CACHE_WIDTH][CACHE_WIDTH][2], int x, int y, double z, double s, double d, double V[2] ) {
if ( abs(x) <= CACHE_NUM && abs(y) <= CACHE_NUM ) {
V[_x_] = Cache[x+CACHE_NUM][y+CACHE_NUM][_x_];
V[_y_] = Cache[x+CACHE_NUM][y+CACHE_NUM][_y_];
} else {
position( x,y,z,s,d,V );
}
}
// Set the name of this plugin
APO_PLUGIN("crackle");
// Define the Variables
APO_VARIABLES(
VAR_REAL(crackle_cellsize, 1.0),
VAR_REAL(crackle_power, 0.2),
VAR_REAL(crackle_distort, 0.0),
VAR_REAL(crackle_scale, 1.0),
VAR_REAL(crackle_z, 0.0)
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
// Pre-calculate cache of grid centres, to save time later . . .
int x,y;
for ( x= -CACHE_NUM; x <= CACHE_NUM; x++ ) { for ( y= -CACHE_NUM; y <= CACHE_NUM; y++ ) {
position( x, y, VAR(crackle_z), VAR(crackle_cellsize) / 2.0, VAR(crackle_distort), VAR(C)[x+CACHE_NUM][y+CACHE_NUM] );
} }
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double XCo, YCo, DXo, DYo, L, R, s, trgL;
double U[2];
int XCv, YCv;
// An infinite number of invisible cells? No thanks!
if ( 0.0 == VAR(crackle_cellsize) ) {
return TRUE;
}
// Scaling factor
s = VAR(crackle_cellsize) / 2.0;
// For a blur effect, base everything starting on a circle radius 1.0
// (as opposed to reading the values from FTx and FTy)
double blurr = (random01() + random01()) / 2.0 + ( random01() - 0.5 ) / 4.0;
double theta = 2 * M_PI * random01();
U[_x_] = blurr * sin(theta);
U[_y_] = blurr * cos(theta);
// Use integer values as Voronoi grid co-ordinates
XCv = (int) floor( U[_x_] / s );
YCv = (int) floor( U[_y_] / s );
// Get a set of 9 square centre points, based around the one above
int di, dj;
int i = 0;
for (di = -1; di < 2; di++) { for (dj = -1; dj < 2; dj++) {
cached_position( VAR(C), XCv+di, YCv+dj, VAR(crackle_z), s, VAR(crackle_distort), VAR(P)[i] );
i++;
} }
int q = closest( VAR(P), 9, U );
int offset[9][2] = { { -1, -1}, { -1, 0}, { -1, 1},
{ 0, -1}, { 0, 0}, { 0, 1},
{ 1, -1}, { 1, 0}, { 1, 1} };
// Remake list starting from chosen square, ensure it is completely surrounded (total 9 points)
// First adjust centres according to which one was found to be closest
XCv += offset[q][_x_];
YCv += offset[q][_y_];
// Get a new set of 9 square centre points, based around the definite closest point
i=0;
for (di = -1; di < 2; di++) { for (dj = -1; dj < 2; dj++) {
cached_position( VAR(C), XCv+di, YCv+dj, VAR(crackle_z), s, VAR(crackle_distort), VAR(P)[i] );
i++;
} }
L = voronoi( VAR(P), 9, 4, U ); // index 4 is centre cell
// Delta vector from centre
DXo = U[_x_] - VAR(P)[4][_x_];
DYo = U[_y_] - VAR(P)[4][_y_];
/////////////////////////////////////////////////////////////////
// Apply "interesting bit" to cell's DXo and DYo co-ordinates
// trgL is the new value of L
trgL = pow(L + 1e-100, VAR(crackle_power)) * VAR(crackle_scale); // ( 0.9 )
R = trgL / ( L + 1e-100 );
DXo *= R;
DYo *= R;
// Add cell centre co-ordinates back in
DXo += VAR(P)[4][_x_];
DYo += VAR(P)[4][_y_];
// Finally add values in
FPx += VVAR * DXo;
FPy += VVAR * DYo;
return TRUE;
}

73
Plugin/curve.c Normal file
View File

@ -0,0 +1,73 @@
/*
Apophysis Plugin
Copyright (C) 2007-2009 Joel Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double curve_xamp;
double curve_xlength;
double curve_yamp;
double curve_ylength;
// precalc values:
double pc_xamp;
double pc_yamp;
double pc_xlen;
double pc_ylen;
} Variables;
#define _USE_MATH_DEFINES
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("curve");
// Define the Variables
APO_VARIABLES(
VAR_REAL(curve_xamp, 0.0),
VAR_REAL(curve_yamp, 0.0),
VAR_REAL(curve_xlength, 1.0),
VAR_REAL(curve_ylength, 1.0)
);
inline double fmax(double a, double b) {
return a > b ? a : b;
}
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(pc_xamp) = VVAR * VAR(curve_xamp);
VAR(pc_yamp) = VVAR * VAR(curve_yamp);
VAR(pc_xlen) = 1.0 / fmax(VAR(curve_xlength) * VAR(curve_xlength), 1E-20);
VAR(pc_ylen) = 1.0 / fmax(VAR(curve_ylength) * VAR(curve_ylength), 1E-20);
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
FPx += VVAR * FTx + VAR(pc_xamp) * exp(-FTy * FTy * VAR(pc_xlen));
FPy += VVAR * FTy + VAR(pc_yamp) * exp(-FTx * FTx * VAR(pc_ylen));
return TRUE;
}

85
Plugin/dc_boarders.c Normal file
View File

@ -0,0 +1,85 @@
/*
Apophysis Plugin
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.
*/
#define APO_NOVARIABLES
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("dc_boarders");
inline double rint(double x)
{
int temp; temp = (x >= 0. ? (int)(x + 0.5) : (int)(x - 0.5));
return (double)temp;
}
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
// Always return TRUE.
return TRUE;
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double roundX, roundY, offsetX, offsetY;
roundX = rint(FTx);
roundY = rint(FTy);
offsetX = FTx - roundX;
offsetY = FTy - roundY;
if(random01() >= 0.75)
{
FPx += VVAR*(offsetX*0.5 + roundX);
FPy += VVAR*(offsetY*0.5 + roundY);
}
else
{
if(fabs(offsetX) >= fabs(offsetY))
{
if(offsetX >= 0.0)
{
FPx += VVAR*(offsetX*0.5 + roundX + 0.25);
FPy += VVAR*(offsetY*0.5 + roundY + 0.25 * offsetY / offsetX);
}
else
{
FPx += VVAR*(offsetX*0.5 + roundX - 0.25);
FPy += VVAR*(offsetY*0.5 + roundY - 0.25 * offsetY / offsetX);
}
}
else
{
if(offsetY >= 0.0)
{
FPy += VVAR*(offsetY*0.5 + roundY + 0.25);
FPx += VVAR*(offsetX*0.5 + roundX + offsetX/offsetY*0.25);
}
else
{
FPy += VVAR*(offsetY*0.5 + roundY - 0.25);
FPx += VVAR*(offsetX*0.5 + roundX - offsetX/offsetY*0.25);
}
}
}
return TRUE;
}

55
Plugin/dc_bubble.c Normal file
View File

@ -0,0 +1,55 @@
/*
Apophysis Plugin
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.
*/
typedef struct
{
double dc_bubble_centerx;
double dc_bubble_centery;
double dc_bubble_scale;
double bdcs;
} Variables;
#include "apoplugin.h"
APO_PLUGIN("dc_bubble");
APO_VARIABLES(
VAR_REAL(dc_bubble_centerx, 0.0),
VAR_REAL(dc_bubble_centery, 0.0),
VAR_REAL(dc_bubble_scale, 1.0)
);
int PluginVarPrepare(Variation* vp)
{
VAR(bdcs) = 1.0 / (VAR(dc_bubble_scale) == 0.0 ? 10E-6 : VAR(dc_bubble_scale));
return TRUE;
}
int PluginVarCalc(Variation* vp)
{
double r = (sqr(FTx) + sqr(FTy));
double r4_1 = r / 4.0 + 1.0;
r4_1 = VVAR / r4_1;
FPx += FPx + r4_1 * FTx;
FPy += FPy + r4_1 * FTy;
FPz += FPz + VVAR * (2.0 / r4_1 - 1.0);
TC = fmod(fabs(VAR(bdcs) * (sqr(FPx + VAR(dc_bubble_centerx)) + sqr(FPy + VAR(dc_bubble_centery)))), 1.0);
return TRUE;
}

63
Plugin/dc_cube.c Normal file
View File

@ -0,0 +1,63 @@
/*
Apophysis Plugin
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.
*/
typedef struct
{
double dc_cube_c1, dc_cube_c2, dc_cube_c3,
dc_cube_c4, dc_cube_c5, dc_cube_c6;
double dc_cube_x, dc_cube_y, dc_cube_z;
double c1, c2, c3, c4, c5, c6;
} Variables;
#include "apoplugin.h"
APO_PLUGIN("dc_cube");
APO_VARIABLES(
VAR_REAL(dc_cube_c1, 0.0), VAR_REAL(dc_cube_c2, 0.0),
VAR_REAL(dc_cube_c3, 0.0), VAR_REAL(dc_cube_c4, 0.0),
VAR_REAL(dc_cube_c5, 0.0), VAR_REAL(dc_cube_c6, 0.0),
VAR_REAL(dc_cube_x, 1.0), VAR_REAL(dc_cube_y, 1.0),
VAR_REAL(dc_cube_z, 1.0)
);
int PluginVarPrepare(Variation* vp)
{
VAR(c1) = VAR(dc_cube_c1)<0?0:VAR(dc_cube_c1)>1?1:VAR(dc_cube_c1);
VAR(c2) = VAR(dc_cube_c2)<0?0:VAR(dc_cube_c2)>1?1:VAR(dc_cube_c2);
VAR(c3) = VAR(dc_cube_c3)<0?0:VAR(dc_cube_c3)>1?1:VAR(dc_cube_c3);
VAR(c4) = VAR(dc_cube_c4)<0?0:VAR(dc_cube_c4)>1?1:VAR(dc_cube_c4);
VAR(c5) = VAR(dc_cube_c5)<0?0:VAR(dc_cube_c5)>1?1:VAR(dc_cube_c5);
VAR(c6) = VAR(dc_cube_c6)<0?0:VAR(dc_cube_c6)>1?1:VAR(dc_cube_c6);
return TRUE;
}
int PluginVarCalc(Variation* vp)
{
double x, y, z;
double p = 2*random01()-1, q = 2*random01()-1;
int i = rand() % 3, j = rand() & 1; switch (i) {
case 0: x = VVAR * (j?-1:1); y = VVAR * p; z = VVAR * q;
if(j) TC=VAR(c1); else TC=VAR(c2); break;
case 1: x = VVAR * p; y = VVAR * (j?-1:1); z = VVAR * q;
if(j) TC=VAR(c3); else TC=VAR(c4); break;
case 2: x = VVAR * p; y = VVAR * q; z = VVAR * (j?-1:1);
if(j) TC=VAR(c5); else TC=VAR(c6); break;
}
FPx += x * VAR(dc_cube_x); FPy += y * VAR(dc_cube_y); FPz += z * VAR(dc_cube_z);
return TRUE;
}

117
Plugin/dc_gridout.c Normal file
View File

@ -0,0 +1,117 @@
/*
Apophysis Plugin
Copyright (C) 2007-2008 Michael Faber
Copyright (C) 2007-2008 Joel Faber
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.
*/
#define APO_NOVARIABLES
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("dc_gridout");
inline double rint(double x)
{
int temp; temp = (x >= 0. ? (int)(x + 0.5) : (int)(x - 0.5));
return (double)temp;
}
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double x = rint(FTx);
double y = rint(FTy);
double c = TC;
if (y <= 0.0)
{
if (x > 0.0)
{
if (-y >= x)
{
FPx += VVAR * (FTx + 1.0);
FPy += VVAR * FTy;
c += 0.25;
}
else
{
FPx += VVAR * FTx;
FPy += VVAR * (FTy + 1.0);
c += 0.75;
}
}
else
{
if (y <= x)
{
FPx += VVAR * (FTx + 1.0);
FPy += VVAR * FTy;
c += 0.25;
}
else
{
FPx += VVAR * FTx;
FPy += VVAR * (FTy - 1.0);
c += 0.75;
}
}
}
else
{
if (x > 0.0)
{
if (y >= x)
{
FPx += VVAR * (FTx - 1.0);
FPy += VVAR * FTy;
c += 0.25;
}
else
{
FPx += VVAR * FTx;
FPy += VVAR * (FTy + 1.0);
c += 0.75;
}
}
else
{
if (y > -x)
{
FPx += VVAR * (FTx - 1.0);
FPy += VVAR * FTy;
c += 0.25;
}
else
{
FPx += VVAR * FTx;
FPy += VVAR * (FTy - 1.0);
c += 0.75;
}
}
}
TC = fmod(c, 1.0);
return TRUE;
}

52
Plugin/dc_linear.c Normal file
View File

@ -0,0 +1,52 @@
/*
Apophysis Plugin
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.
*/
typedef struct
{
double dc_linear_offset, dc_linear_angle, dc_linear_scale;
double ldcs, ldca;
} Variables;
#define _USE_MATH_DEFINES
#include "apoplugin.h"
APO_PLUGIN("dc_linear");
APO_VARIABLES(
VAR_REAL(dc_linear_offset, 0.0),
VAR_REAL(dc_linear_angle, 0.0),
VAR_REAL(dc_linear_scale, 1.0),
);
int PluginVarPrepare(Variation* vp)
{
VAR(ldcs) = 1.0 / (VAR(dc_linear_scale) == 0.0 ? 10E-6 : VAR(dc_linear_scale));
VAR(ldca) = VAR(dc_linear_offset) * M_PI;
return TRUE;
}
int PluginVarCalc(Variation* vp)
{
FPx += VVAR * FTx;
FPy += VVAR * FTy;
FPz += VVAR * FTz;
double c, s; fsincos(VAR(dc_linear_angle), &s, &c);
TC = fmod( fabs( 0.5 * (VAR(ldcs) * ((c * FPx + s * FPy + VAR(dc_linear_offset))) + 1.0) ), 1.0 );
return TRUE;
}

301
Plugin/dc_mandelbrot.c Normal file
View File

@ -0,0 +1,301 @@
/*
Apophysis Plugin
Mandelbrot Set Plugin v2 - Copyright 2008,2009 Jed Kelsey
Changed to work with Apophysis 7X / DC in 2010 by 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.
*/
typedef struct
{
int dcm_iter;
int dcm_miniter;
int dcm_smooth_iter;
int dcm_retries;
int dcm_mode;
int dcm_pow;
int dcm_color_method;
double dcm_invert;
double dcm_xmin;
double dcm_xmax;
double dcm_ymin;
double dcm_ymax;
double dcm_scatter;
double dcm_sx;
double dcm_sy;
double dcm_zscale;
double x0, y0;
double zs, sc;
} Variables;
#define _USE_MATH_DEFINES
#include "apoplugin.h"
APO_PLUGIN("dc_mandelbrot");
APO_VARIABLES(
VAR_INTEGER_RANGE(dcm_iter, 5, INT_MAX, 25),
VAR_INTEGER_RANGE(dcm_miniter, 0, INT_MAX, 1),
VAR_INTEGER_RANGE(dcm_smooth_iter, 0, INT_MAX, 0),
VAR_INTEGER_RANGE(dcm_retries, 0, INT_MAX, 50),
VAR_INTEGER_RANGE(dcm_mode, 0, 5, 0),
VAR_INTEGER_RANGE(dcm_pow, -6, 6, 2), // TODO: negative powers
VAR_INTEGER_RANGE(dcm_color_method, 0, 7, 0),
VAR_REAL_RANGE(dcm_invert, 0.0, 1.0, 0.0),
VAR_REAL(dcm_xmin, -2.0),
VAR_REAL(dcm_xmax, 2.0),
VAR_REAL(dcm_ymin, -1.5),
VAR_REAL(dcm_ymax, 1.5),
VAR_REAL_RANGE(dcm_scatter, -1000.0, 1000.0, 0.0),
// Following parameters don't affect iterations, just the output point positions.
VAR_REAL(dcm_sx, 0.0),
VAR_REAL(dcm_sy, 0.0),
VAR_REAL(dcm_zscale, 0.0)
);
int PluginVarPrepare(Variation* vp)
{
VAR(zs) = VVAR * VAR(dcm_zscale) / VAR(dcm_iter);
VAR(sc) = VAR(dcm_scatter) / 10.0;
return TRUE;
}
inline double fmod2(double h, double q) { return fmod(fabs(h),q); }
int PluginVarCalc(Variation* vp)
{
double x=0.0, y=0.0, x1=0.0, y1=0.0, x2, y2, xtemp=0.0;
double cx=0.0, cy=0.0;
int maxiter = VAR(dcm_iter);
int miniter = VAR(dcm_miniter); // = 0.1*(maxiter*(1-scatter));
double xmax = VAR(dcm_xmax);
double xmin = VAR(dcm_xmin);
double ymax = VAR(dcm_ymax);
double ymin = VAR(dcm_ymin);
int maxRetries = VAR(dcm_retries);
int mode = VAR(dcm_mode); /* 0=Mandelbrot, 1=Julia, 3=Tricorn(Mandelbar) */
int color_method = VAR(dcm_color_method);
double xp = 0.0, yp = 0.0;
int smooth_iter=0, max_smooth_iter=VAR(dcm_smooth_iter);
int inverted, iter=0, retries=0;
int isblur = (VAR(sc)>=0);
double smoothed_iter = 0.0, inv_iter = 1.0;
double mag2 = 0.0;
int m_power = VAR(dcm_pow);
int m_power_abs = ((m_power<0) ? -m_power : m_power);
inverted = random01() < VAR(dcm_invert);
if (!isblur) {
VAR(x0) = FTx;
VAR(y0) = FTy;
}
do {
if (VAR(sc)==0) {
// Force selection of point at random
VAR(x0) = VAR(y0) = 0;
}
if (VAR(x0)==0 && VAR(y0)==0) {
// Choose a point at random
VAR(x0) = (xmax-xmin)*random01() + xmin;
VAR(y0) = (ymax-ymin)*random01() + ymin;
} else {
// Choose a point close to previous point
VAR(x0) += VAR(sc)*(random01()-0.5);
VAR(y0) += VAR(sc)*(random01()-0.5);
}
// default to Mandelbrot Set
cx = x1 = x = xp = VAR(x0);
cy = y1 = y = yp = VAR(y0);
switch(mode) {
case 1: // Julia Set
cx = TM(e);
cy = TM(f);
break;
case 2: // tricorn (Mandelbar)
// leave as-is, handled below
break;
default: // Regular Mandelbrot set
// Leave as-is
break;
}
iter = smooth_iter = 0;
while ( (((x2=x*x) + (y2=y*y) < 4) && (iter < maxiter)) || (smooth_iter++<max_smooth_iter) ) {
if (smooth_iter==0)
xp=x; yp=y;
if (mode==2) y=-y;
switch(m_power_abs) {
case 3:
xtemp = x*(x2 - 3*y2) + cx;
y = y*(3*x2 - y2) + cy;
x = xtemp;
break;
case 4:
xtemp = (x2-y2)*(x2-y2)-4*x2*y2 + cx;
y = 4*x*y*(x2 - y2) + cy;
x = xtemp;
break;
case 5:
xtemp = x2*x2*x - 10*x2*x*y2 + 5*x*y2*y2 + cx;
y = 5*x2*x2*y - 10*x2*y2*y + y2*y2*y + cy;
x = xtemp;
break;
case 6:
xtemp = x2*x2*x2 - 15*x2*x2*y2 + 15*x2*y2*y2 - y2*y2*y2 + cx;
y = 6*x2*x2*x*y - 20*x2*x*y2*y + 6*x*y2*y2*y + cy;
x = xtemp;
break;
case 1:
if ((m_power>0) && (iter<maxiter)) // (more iterations not helpful)
iter = maxiter-1;
break;
case 2:
default:
xtemp = x2 - y2 + cx;
y = 2*x*y + cy;
x = xtemp;
break;
}
if ((m_power<0) && (xtemp=x2+y2)>0) {
x = x/xtemp;
y = -y/xtemp;
}
iter++;
}
iter -= (smooth_iter-1);
// could probably bypass check and always select next point at random
if ( (miniter==0) || (!inverted && (iter>=maxiter)) /*|| (iter < miniter)*/ ) {
VAR(x0) = VAR(y0) = 0; // Random point next time
} else if ( (iter < miniter) || (inverted && (iter<maxiter/2)) ) {
//if (retries>maxRetries-5) {
// VAR(x0) /= 100;
// VAR(y0) /= 100;
//} else
VAR(x0) = VAR(y0) = 0;
}
if (++retries > maxRetries)
break;
} while ((inverted && (iter < maxiter)) || (!inverted && ((iter >= maxiter) || ((miniter>0) && (iter < miniter)))));
smoothed_iter = iter;
if (max_smooth_iter>0) {
// use Normalized Iteration Count Algorithm for smoothing
mag2 = x2 + y2;
if (mag2 > 1.1) //FIXME: change this back to if(mag2>4) ?
smoothed_iter += 1 - log(log(mag2)/2)/M_LN2;
}
if (smoothed_iter>0)
inv_iter = 1/smoothed_iter;
else
inv_iter = 1;
// Adjust location of point according to sx,sy and final iterated point (x,y)
// (use of inv_iter reduces effect of factor near regions of high gradient
FPx += VVAR*(x1 + VAR(dcm_sx)*x*inv_iter);
FPy += VVAR*(y1 + VAR(dcm_sy)*y*inv_iter);
//FPx += VVAR*(x1 + VAR(dcm_sx)*x);
//FPy += VVAR*(y1 + VAR(dcm_sy)*y);
// TODO: add check to see whether this Apo supports 3D?
if (VAR(dcm_zscale)) {
FPz += smoothed_iter * VAR(zs);
}
// Allow plugin to influence coloring (-X- changed for Apo7X/DC)
if (smoothed_iter<0) smoothed_iter=0;
if (smoothed_iter>maxiter) smoothed_iter=maxiter;
switch (color_method) {
case 1:
// scale colormap indexing extent by the final angle of the iterated point
// after the extra "smoothing" iterations complete
xtemp = 0.0;
if (y != 0.0) xtemp = atan2(x,y) * M_1_2PI;
TC = fmod2(xtemp, 1);
break;
case 2:
// scale colormap indexing extent by the angle of the iterated point at time of escape
xtemp = 0.0;
if (yp != 0.0) xtemp = atan2(xp,yp) * M_1_2PI;
TC = fmod2(xtemp, 1);
break;
case 3:
// combination of mode 4 and 2
xtemp = 0.0;
if (y-yp != 0.0) xtemp = atan2(x-xp,y-yp) * M_1_2PI;
TC = fmod2((smoothed_iter/maxiter * xtemp), 1);
break;
case 4:
// scale colormap indexing extent by the product of the scaled iteration count and
// the angle of the iterated point at time of escape
xtemp = 0.0;
if (yp != 0.0) xtemp = atan2(xp,yp) * M_1_2PI;
TC = fmod2((smoothed_iter/maxiter * xtemp), 1);
break;
case 5:
// scale colormap indexing extent by a combination of scaled iteration count,
// the squared magnitude and adjusted angle of the iterated point at time of escape
xtemp = 0.0;
if (yp != 0.0) xtemp = (0.5 + atan2(xp,yp) * M_1_2PI) * (xp*xp+yp*yp);
TC = fmod2((smoothed_iter/maxiter * xtemp), 1);
break;
case 6:
// scale colormap indexing extent by a combination of scaled iteration count and
// the squared magnitude of the iterated point at time of escape
xtemp = xp*xp+yp*yp;
TC = fmod2((smoothed_iter/maxiter * xtemp), 1);
break;
case 7:
// scale colormap indexing extent by a combination of scaled iteration count and
// the squared magnitude of the iterated point at time of escape
// (slightly more relaxed color rolloff than case 6)
xtemp = sqrt(xp*xp+yp*yp);
TC = fmod2((smoothed_iter/maxiter * xtemp), 1);
break;
case 0:
// default coloring method: scale colormap indexing extent by the scaled "escape time"
// (iteration count)
default:
TC = fmod2(smoothed_iter/maxiter, 1);
break;
}
return TRUE;
}

102
Plugin/dc_triangle.c Normal file
View File

@ -0,0 +1,102 @@
/*
Apophysis Plugin
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.
*/
typedef struct
{
double dc_triangle_scatter_area, A;
int dc_triangle_zero_edges;
} Variables;
#include "apoplugin.h"
APO_PLUGIN("dc_triangle");
APO_VARIABLES(
VAR_REAL(dc_triangle_scatter_area, 0.0),
VAR_INTEGER_RANGE(dc_triangle_zero_edges, 0, 1, 0)
);
int PluginVarPrepare(Variation* vp)
{
VAR(A) = VAR(dc_triangle_scatter_area) < -1 ? -1 :
VAR(dc_triangle_scatter_area) > 1 ? 1 :
VAR(dc_triangle_scatter_area);
return TRUE;
}
/* This function is called during calculation.
You must call the argument "vp"
*/
int PluginVarCalc(Variation* vp)
{
// set up triangle
const double
xx = TM(a), xy = TM(b), // X
yx = TM(c) * -1, yy = TM(d) * -1, // Y
ox = TM(e), oy = TM(f), // O
px = FTx - ox, py = FTy - oy; // P
// calculate dot products
const double dot00 = xx * xx + xy * xy; // X * X
const double dot01 = xx * yx + xy * yy; // X * Y
const double dot02 = xx * px + xy * py; // X * P
const double dot11 = yx * yx + yy * yy; // Y * Y
const double dot12 = yx * px + yy * py; // Y * P
// calculate barycentric coordinates
const double denom = (dot00 * dot11 - dot01 * dot01);
const double num_u = (dot11 * dot02 - dot01 * dot12);
const double num_v = (dot00 * dot12 - dot01 * dot02);
// u, v must not be constant
double u = num_u / denom;
double v = num_v / denom;
int inside = 0, f = 1;
// case A - point escapes edge XY
if (u + v > 1) { f = -1;
if (u > v) { u = u>1?1:u; v = 1-u; }
else { v = v>1?1:v; u = 1-v; } }
// case B - point escapes either edge OX or OY
else if ((u < 0) || (v < 0)) {
u = u<0?0:u>1?1:u; v = v<0?0:v>1?1:v; }
// case C - point is in triangle
else inside = 1;
// handle outside points
if (VAR(dc_triangle_zero_edges) && !inside) u = v = 0;
else if (!inside) {
u = (u + random01() * VAR(A) * f);
v = (v + random01() * VAR(A) * f);
u = u<-1?-1:u>1?1:u; v = v<-1?-1:v>1?1:v;
if ((u + v > 1) && (VAR(A) > 0))
if (u > v) { u = u>1?1:u; v = 1-u; }
else { v = v>1?1:v; u = 1-v; }
}
// set output
FPx += VVAR * (ox + u * xx + v * yx);
FPy += VVAR * (oy + u * xy + v * yy);
FPz += VVAR * FTz;
TC = fmod(fabs(u+v),1.0);
// done
return TRUE;
}

69
Plugin/dc_ztransl.c Normal file
View File

@ -0,0 +1,69 @@
/*
Apophysis Plugin
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.
Written by Georg Kiehne
--> http://xyrus-worx.net, http://xyrus02.deviantart.com
If you find any bugs / nags - keep them :)
*/
typedef struct {
double dc_ztransl_x0;
double dc_ztransl_x1;
double dc_ztransl_factor;
double x0_, x1_, x1_m_x0;
int dc_ztransl_overwrite;
int dc_ztransl_clamp;
} Variables;
#include "apoplugin.h"
APO_PLUGIN("dc_ztransl");
APO_VARIABLES(
VAR_REAL_RANGE(dc_ztransl_x0, 0.0, 1.0, 0.0),
VAR_REAL_RANGE(dc_ztransl_x1, 0.0, 1.0, 1.0),
VAR_REAL(dc_ztransl_factor, 1.0),
VAR_INTEGER_RANGE(dc_ztransl_overwrite, 0, 1, 1),
VAR_INTEGER_RANGE(dc_ztransl_clamp, 0, 1, 0)
);
int PluginVarPrepare(Variation* vp)
{
vp->var.x0_ = vp->var.dc_ztransl_x0 < vp->var.dc_ztransl_x1 ? vp->var.dc_ztransl_x0 : vp->var.dc_ztransl_x1;
vp->var.x1_ = vp->var.dc_ztransl_x0 > vp->var.dc_ztransl_x1 ? vp->var.dc_ztransl_x0 : vp->var.dc_ztransl_x1;
vp->var.x1_m_x0 = vp->var.x1_ - vp->var.x0_ == 0 ? EPS : vp->var.x1_ - vp->var.x0_;
return 1;
}
inline double flip(double a, double b, double c){return (c*(b-a)+a);}
int PluginVarCalc(Variation* vp)
{
double zf = vp->var.dc_ztransl_factor * (*(vp->pColor) - vp->var.x0_) / vp->var.x1_m_x0;
if (vp->var.dc_ztransl_clamp != 0)
zf = zf < 0 ? 0 : zf > 1 ? 1 : zf;
*(vp->pFPx) += vp->vvar*(*(vp->pFTx));
*(vp->pFPy) += vp->vvar*(*(vp->pFTy));
if (vp->var.dc_ztransl_overwrite == 0)
*(vp->pFPz) += vp->vvar*(*(vp->pFTz))*zf;
else *(vp->pFPz) += vp->vvar*zf;
return 1;
}

57
Plugin/deltaA.c Normal file
View File

@ -0,0 +1,57 @@
/*
Apophysis Plugin
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double v;
} Variables;
#define _USE_MATH_DEFINES
#define APO_NOVARIABLES
#define APO_VIRTUALVAR
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("deltaA");
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(v) = 0.5 * VVAR / M_PI;
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double avgr, avga;
double s, c;
avgr = VVAR * (sqrt(sqr(FTy) + sqr(FTx + 1.0)) / sqrt(sqr(FTy) + sqr(FTx - 1.0)));
avga = (atan2( FTy, FTx - 1.0) - atan2(FTy, FTx + 1.0) )/ 2.0;
fsincos( avga, &s, &c);
FPx += avgr * c;
FPy += avgr * s;
return TRUE;
}

64
Plugin/edisc.c Normal file
View File

@ -0,0 +1,64 @@
/*
Apophysis Plugin
Copyright (C) 2007-2009 Joel Faber
Copyright (C) 2007-2009 Michael Faber
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.
*/
// Must define this structure before we include apoplugin.h
typedef struct
{
double edisc_vvar;
} Variables;
#define _USE_MATH_DEFINES
#define APO_NOVARIABLES
#define APO_VIRTUALVAR
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("edisc");
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(edisc_vvar) = VVAR / 11.57034632;
return TRUE; // Always return TRUE.
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double tmp = FTy * FTy + FTx * FTx + 1.0;
double tmp2 = 2.0 * FTx;
double r1 = sqrt(tmp + tmp2);
double r2 = sqrt(tmp - tmp2);
double xmax = (r1 + r2) * 0.5;
double snv, csv, snhu, cshu;
double expu, expuinv;
fsincos(log(xmax + sqrt(xmax - 1.0)), &snv, &csv);
sinhcosh(-acos(FTx / xmax), &snhu, &cshu);
if (FTy > 0.0)
snv = -snv;
FPx += VAR(edisc_vvar) * cshu * csv;
FPy += VAR(edisc_vvar) * snhu * snv;
return TRUE;
}

53
Plugin/ex.c Normal file
View File

@ -0,0 +1,53 @@
/*
Apophysis Plugin
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.
*/
#define _USE_MATH_DEFINES
#define APO_NOVARIABLES
#include "apoplugin.h"
/* SET PLUGIN NAME HERE:
e.g. name-me
*/
APO_PLUGIN("ex");
/* DO PREPARE STUFF HERE:
You must call the argument "vp"
*/
int PluginVarPrepare(Variation* vp)
{
return TRUE; // Always return TRUE.
}
/* DO CALC STUFF HERE:
You must call the argument "vp"
*/
int PluginVarCalc(Variation* vp)
{
double FAngle = atan2(FTy, FTx);
double r = sqrt(FTx*FTx+FTy*FTy);
double n0 = sin(FAngle + r);
double n1 = cos(FAngle - r);
double m0 = sqr(n0) * n0;
double m1 = sqr(n1) * n1;
r = r * VVAR;
FPx = FPx + r * (m0 + m1);
FPy = FPy + r * (m0 - m1);
return TRUE;
}

Some files were not shown because too many files have changed in this diff Show More