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);