* Updated Vampyre Imaging Lib
* Fixed heContrs compilation * Fixed region editing in frmLargeScaleCommand and frmRegionControl * Fixed control alignment in frmMain
This commit is contained in:
+497
-491
@@ -1,491 +1,497 @@
|
||||
<?xml version="1.0"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="9"/>
|
||||
<General>
|
||||
<Flags>
|
||||
<MainUnitHasUsesSectionForAllUnits Value="False"/>
|
||||
</Flags>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<Title Value="CentrED"/>
|
||||
<ResourceType Value="res"/>
|
||||
<UseXPManifest Value="True"/>
|
||||
<Icon Value="0"/>
|
||||
</General>
|
||||
<LazDoc Paths="../doc"/>
|
||||
<VersionInfo>
|
||||
<UseVersionInfo Value="True"/>
|
||||
<MinorVersionNr Value="6"/>
|
||||
<RevisionNr Value="3"/>
|
||||
<BuildNr Value="241"/>
|
||||
<StringTable CompanyName="AKS DataBasis" ProductName="CentrED" InternalName="CentrED" LegalCopyright="(c) 2012 Andreas Schneider" ProductVersion="0.6.3" FileDescription="UO CentrED" OriginalFilename="CentrED.exe"/>
|
||||
</VersionInfo>
|
||||
<BuildModes Count="3">
|
||||
<Item1 Name="default" Default="True"/>
|
||||
<Item2 Name="Release Win32">
|
||||
<MacroValues Count="1">
|
||||
<Macro1 Name="LCLWidgetType" Value="win32"/>
|
||||
</MacroValues>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<Target>
|
||||
<Filename Value="../bin/CentrED"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir);../Imaging;.."/>
|
||||
<OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
<UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/>
|
||||
<SrcPath Value="$(LazarusDir)/lcl;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType);..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<CStyleOperator Value="False"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
<SmartLinkUnit Value="True"/>
|
||||
<TargetCPU Value="i386"/>
|
||||
<TargetOS Value="win32"/>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="3"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<GenerateDebugInfo Value="False"/>
|
||||
<UseLineInfoUnit Value="False"/>
|
||||
<StripSymbols Value="True"/>
|
||||
</Debugging>
|
||||
<LinkSmart Value="True"/>
|
||||
<Options>
|
||||
<Win32>
|
||||
<GraphicApplication Value="True"/>
|
||||
</Win32>
|
||||
</Options>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CustomOptions Value="-FE../bin/
|
||||
-dNoLogging"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
</Item2>
|
||||
<Item3 Name="Release Linux GTK2 x86">
|
||||
<MacroValues Count="1">
|
||||
<Macro1 Name="LCLWidgetType" Value="gtk2"/>
|
||||
</MacroValues>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<Target>
|
||||
<Filename Value="../bin/CentrED"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir);../Imaging;.."/>
|
||||
<OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
<UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/>
|
||||
<SrcPath Value="$(LazarusDir)/lcl;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType);..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<CStyleOperator Value="False"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
<SmartLinkUnit Value="True"/>
|
||||
<TargetCPU Value="i386"/>
|
||||
<TargetOS Value="linux"/>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="3"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<GenerateDebugInfo Value="False"/>
|
||||
<UseLineInfoUnit Value="False"/>
|
||||
<StripSymbols Value="True"/>
|
||||
</Debugging>
|
||||
<LinkSmart Value="True"/>
|
||||
<Options>
|
||||
<Win32>
|
||||
<GraphicApplication Value="True"/>
|
||||
</Win32>
|
||||
</Options>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CustomOptions Value="-FE../bin/
|
||||
-dNoLogging"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
</Item3>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<local>
|
||||
<FormatVersion Value="1"/>
|
||||
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
|
||||
</local>
|
||||
<environment>
|
||||
<UserOverrides Count="1">
|
||||
<Variable0 Name="HEAPTRC" Value="log=CentrED.trc"/>
|
||||
</UserOverrides>
|
||||
</environment>
|
||||
</RunParams>
|
||||
<RequiredPackages Count="6">
|
||||
<Item1>
|
||||
<PackageName Value="LCLBase"/>
|
||||
<MinVersion Major="1" Valid="True" Release="1"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<PackageName Value="multiloglaz"/>
|
||||
</Item2>
|
||||
<Item3>
|
||||
<PackageName Value="LazOpenGLContext"/>
|
||||
<MinVersion Valid="True"/>
|
||||
</Item3>
|
||||
<Item4>
|
||||
<PackageName Value="LCL"/>
|
||||
</Item4>
|
||||
<Item5>
|
||||
<PackageName Value="lnetvisual"/>
|
||||
<MinVersion Minor="5" Valid="True" Release="3"/>
|
||||
</Item5>
|
||||
<Item6>
|
||||
<PackageName Value="virtualtreeview_package"/>
|
||||
<MinVersion Major="4" Minor="5" Valid="True" Release="1"/>
|
||||
</Item6>
|
||||
</RequiredPackages>
|
||||
<Units Count="48">
|
||||
<Unit0>
|
||||
<Filename Value="CentrED.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="CentrED"/>
|
||||
</Unit0>
|
||||
<Unit1>
|
||||
<Filename Value="UfrmMain.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmMain"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmMain"/>
|
||||
</Unit1>
|
||||
<Unit2>
|
||||
<Filename Value="UdmNetwork.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="dmNetwork"/>
|
||||
<ResourceBaseClass Value="DataModule"/>
|
||||
<UnitName Value="UdmNetwork"/>
|
||||
</Unit2>
|
||||
<Unit3>
|
||||
<Filename Value="UfrmLogin.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmLogin"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmLogin"/>
|
||||
</Unit3>
|
||||
<Unit4>
|
||||
<Filename Value="UfrmInitialize.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmInitialize"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmInitialize"/>
|
||||
</Unit4>
|
||||
<Unit5>
|
||||
<Filename Value="UfrmAccountControl.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmAccountControl"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmAccountControl"/>
|
||||
</Unit5>
|
||||
<Unit6>
|
||||
<Filename Value="UfrmEditAccount.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmEditAccount"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmEditAccount"/>
|
||||
</Unit6>
|
||||
<Unit7>
|
||||
<Filename Value="Tools/UfrmDrawSettings.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmDrawSettings"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmDrawSettings"/>
|
||||
</Unit7>
|
||||
<Unit8>
|
||||
<Filename Value="Tools/UfrmBoundaries.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmBoundaries"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmBoundaries"/>
|
||||
</Unit8>
|
||||
<Unit9>
|
||||
<Filename Value="Tools/UfrmElevateSettings.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmElevateSettings"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmElevateSettings"/>
|
||||
</Unit9>
|
||||
<Unit10>
|
||||
<Filename Value="UOverlayUI.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UOverlayUI"/>
|
||||
</Unit10>
|
||||
<Unit11>
|
||||
<Filename Value="UResourceManager.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UResourceManager"/>
|
||||
</Unit11>
|
||||
<Unit12>
|
||||
<Filename Value="Tools/UfrmConfirmation.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmConfirmation"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmConfirmation"/>
|
||||
</Unit12>
|
||||
<Unit13>
|
||||
<Filename Value="Tools/UfrmMoveSettings.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmMoveSettings"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmMoveSettings"/>
|
||||
</Unit13>
|
||||
<Unit14>
|
||||
<Filename Value="UfrmAbout.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmAbout"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmAbout"/>
|
||||
</Unit14>
|
||||
<Unit15>
|
||||
<Filename Value="Tools/UfrmHueSettings.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmHueSettings"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmHueSettings"/>
|
||||
</Unit15>
|
||||
<Unit16>
|
||||
<Filename Value="UfrmRadar.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmRadarMap"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmRadar"/>
|
||||
</Unit16>
|
||||
<Unit17>
|
||||
<Filename Value="UfrmLargeScaleCommand.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmLargeScaleCommand"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmLargeScaleCommand"/>
|
||||
</Unit17>
|
||||
<Unit18>
|
||||
<Filename Value="Tools/UfrmVirtualLayer.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmVirtualLayer"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmVirtualLayer"/>
|
||||
</Unit18>
|
||||
<Unit19>
|
||||
<Filename Value="Tools/UfrmFilter.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmFilter"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmFilter"/>
|
||||
</Unit19>
|
||||
<Unit20>
|
||||
<Filename Value="UGUIPlatformUtils.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UGUIPlatformUtils"/>
|
||||
</Unit20>
|
||||
<Unit21>
|
||||
<Filename Value="UPlatformTypes.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UPlatformTypes"/>
|
||||
</Unit21>
|
||||
<Unit22>
|
||||
<Filename Value="UfrmRegionControl.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmRegionControl"/>
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmRegionControl"/>
|
||||
</Unit22>
|
||||
<Unit23>
|
||||
<Filename Value="UPacketHandlers.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UPacketHandlers"/>
|
||||
</Unit23>
|
||||
<Unit24>
|
||||
<Filename Value="UPackets.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UPackets"/>
|
||||
</Unit24>
|
||||
<Unit25>
|
||||
<Filename Value="ULandscape.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="ULandscape"/>
|
||||
</Unit25>
|
||||
<Unit26>
|
||||
<Filename Value="UGameResources.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UGameResources"/>
|
||||
</Unit26>
|
||||
<Unit27>
|
||||
<Filename Value="UAdminHandling.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UAdminHandling"/>
|
||||
</Unit27>
|
||||
<Unit28>
|
||||
<Filename Value="Tools/UfrmToolWindow.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmToolWindow"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmToolWindow"/>
|
||||
</Unit28>
|
||||
<Unit29>
|
||||
<Filename Value="../Logging.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="Logging"/>
|
||||
</Unit29>
|
||||
<Unit30>
|
||||
<Filename Value="../UOLib/UStatics.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UStatics"/>
|
||||
</Unit30>
|
||||
<Unit31>
|
||||
<Filename Value="../UOLib/UWorldItem.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UWorldItem"/>
|
||||
</Unit31>
|
||||
<Unit32>
|
||||
<Filename Value="../UOLib/UMap.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UMap"/>
|
||||
</Unit32>
|
||||
<Unit33>
|
||||
<Filename Value="../UOLib/UTiledata.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UTiledata"/>
|
||||
</Unit33>
|
||||
<Unit34>
|
||||
<Filename Value="UGLFont.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UGLFont"/>
|
||||
</Unit34>
|
||||
<Unit35>
|
||||
<Filename Value="../UOLib/UAnimData.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UAnimData"/>
|
||||
</Unit35>
|
||||
<Unit36>
|
||||
<Filename Value="../MulProvider/UTileDataProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UTileDataProvider"/>
|
||||
</Unit36>
|
||||
<Unit37>
|
||||
<Filename Value="../MulProvider/UAnimDataProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UAnimDataProvider"/>
|
||||
</Unit37>
|
||||
<Unit38>
|
||||
<Filename Value="../MulProvider/UMulManager.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UMulManager"/>
|
||||
</Unit38>
|
||||
<Unit39>
|
||||
<Filename Value="../MulProvider/UArtProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UArtProvider"/>
|
||||
</Unit39>
|
||||
<Unit40>
|
||||
<Filename Value="../MulProvider/UTexmapProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UTexmapProvider"/>
|
||||
</Unit40>
|
||||
<Unit41>
|
||||
<Filename Value="../version.inc"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit41>
|
||||
<Unit42>
|
||||
<Filename Value="ULightManager.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="ULightManager"/>
|
||||
</Unit42>
|
||||
<Unit43>
|
||||
<Filename Value="../UOLib/ULight.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="ULight"/>
|
||||
</Unit43>
|
||||
<Unit44>
|
||||
<Filename Value="../MulProvider/ULightProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="ULightProvider"/>
|
||||
</Unit44>
|
||||
<Unit45>
|
||||
<Filename Value="Tools/UfrmLightlevel.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmLightlevel"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmLightlevel"/>
|
||||
</Unit45>
|
||||
<Unit46>
|
||||
<Filename Value="../heContnrs.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="heContnrs"/>
|
||||
</Unit46>
|
||||
<Unit47>
|
||||
<Filename Value="../UContnrExt.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UContnrExt"/>
|
||||
</Unit47>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<Target>
|
||||
<Filename Value="../bin/CentrED"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir);../Imaging;.."/>
|
||||
<OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
<UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<CStyleOperator Value="False"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
<Checks>
|
||||
<RangeChecks Value="True"/>
|
||||
</Checks>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="0"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsStabs"/>
|
||||
</Debugging>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CustomOptions Value="-FE../bin/"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
</CONFIG>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="9"/>
|
||||
<General>
|
||||
<Flags>
|
||||
<MainUnitHasUsesSectionForAllUnits Value="False"/>
|
||||
</Flags>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<Title Value="CentrED"/>
|
||||
<ResourceType Value="res"/>
|
||||
<UseXPManifest Value="True"/>
|
||||
<Icon Value="0"/>
|
||||
</General>
|
||||
<LazDoc Paths="../doc"/>
|
||||
<VersionInfo>
|
||||
<UseVersionInfo Value="True"/>
|
||||
<MinorVersionNr Value="6"/>
|
||||
<RevisionNr Value="3"/>
|
||||
<BuildNr Value="241"/>
|
||||
<StringTable CompanyName="AKS DataBasis" ProductName="CentrED" InternalName="CentrED" LegalCopyright="(c) 2012 Andreas Schneider" ProductVersion="0.6.3" FileDescription="UO CentrED" OriginalFilename="CentrED.exe"/>
|
||||
</VersionInfo>
|
||||
<BuildModes Count="3">
|
||||
<Item1 Name="default" Default="True"/>
|
||||
<Item2 Name="Release Win32">
|
||||
<MacroValues Count="1">
|
||||
<Macro1 Name="LCLWidgetType" Value="win32"/>
|
||||
</MacroValues>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<Target>
|
||||
<Filename Value="../bin/CentrED"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir);../Imaging;.."/>
|
||||
<OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
<UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/>
|
||||
<SrcPath Value="$(LazarusDir)/lcl;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType);..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<CStyleOperator Value="False"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
<SmartLinkUnit Value="True"/>
|
||||
<TargetCPU Value="i386"/>
|
||||
<TargetOS Value="win32"/>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="3"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<GenerateDebugInfo Value="False"/>
|
||||
<UseLineInfoUnit Value="False"/>
|
||||
<StripSymbols Value="True"/>
|
||||
</Debugging>
|
||||
<LinkSmart Value="True"/>
|
||||
<Options>
|
||||
<Win32>
|
||||
<GraphicApplication Value="True"/>
|
||||
</Win32>
|
||||
</Options>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CustomOptions Value="-FE../bin/
|
||||
-dNoLogging"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
</Item2>
|
||||
<Item3 Name="Release Linux GTK2 x86">
|
||||
<MacroValues Count="1">
|
||||
<Macro2 Name="LCLWidgetType" Value="gtk2"/>
|
||||
</MacroValues>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<Target>
|
||||
<Filename Value="../bin/CentrED"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir);../Imaging;.."/>
|
||||
<OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
<UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/>
|
||||
<SrcPath Value="$(LazarusDir)/lcl;$(LazarusDir)/lcl/interfaces/$(LCLWidgetType);..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<CStyleOperator Value="False"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
<SmartLinkUnit Value="True"/>
|
||||
<TargetCPU Value="i386"/>
|
||||
<TargetOS Value="linux"/>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="3"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<GenerateDebugInfo Value="False"/>
|
||||
<UseLineInfoUnit Value="False"/>
|
||||
<StripSymbols Value="True"/>
|
||||
</Debugging>
|
||||
<LinkSmart Value="True"/>
|
||||
<Options>
|
||||
<Win32>
|
||||
<GraphicApplication Value="True"/>
|
||||
</Win32>
|
||||
</Options>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CustomOptions Value="-FE../bin/
|
||||
-dNoLogging"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
</Item3>
|
||||
<SharedMatrixOptions Count="2">
|
||||
<Item1 ID="851019893220" Modes="Release Win32" Type="IDEMacro" MacroName="LCLWidgetType" Value="win32"/>
|
||||
<Item2 ID="521965364444" Modes="Release Linux GTK2 x86" Type="IDEMacro" MacroName="LCLWidgetType" Value="gtk2"/>
|
||||
</SharedMatrixOptions>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<local>
|
||||
<FormatVersion Value="1"/>
|
||||
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
|
||||
</local>
|
||||
<environment>
|
||||
<UserOverrides Count="1">
|
||||
<Variable0 Name="HEAPTRC" Value="log=CentrED.trc"/>
|
||||
</UserOverrides>
|
||||
</environment>
|
||||
</RunParams>
|
||||
<RequiredPackages Count="6">
|
||||
<Item1>
|
||||
<PackageName Value="LCLBase"/>
|
||||
<MinVersion Major="1" Release="1" Valid="True"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<PackageName Value="multiloglaz"/>
|
||||
</Item2>
|
||||
<Item3>
|
||||
<PackageName Value="LazOpenGLContext"/>
|
||||
<MinVersion Valid="True"/>
|
||||
</Item3>
|
||||
<Item4>
|
||||
<PackageName Value="LCL"/>
|
||||
</Item4>
|
||||
<Item5>
|
||||
<PackageName Value="lnetvisual"/>
|
||||
<MinVersion Minor="5" Release="3" Valid="True"/>
|
||||
</Item5>
|
||||
<Item6>
|
||||
<PackageName Value="virtualtreeview_package"/>
|
||||
<MinVersion Major="4" Minor="5" Release="1" Valid="True"/>
|
||||
</Item6>
|
||||
</RequiredPackages>
|
||||
<Units Count="48">
|
||||
<Unit0>
|
||||
<Filename Value="CentrED.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="CentrED"/>
|
||||
</Unit0>
|
||||
<Unit1>
|
||||
<Filename Value="UfrmMain.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmMain"/>
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmMain"/>
|
||||
</Unit1>
|
||||
<Unit2>
|
||||
<Filename Value="UdmNetwork.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="dmNetwork"/>
|
||||
<ResourceBaseClass Value="DataModule"/>
|
||||
<UnitName Value="UdmNetwork"/>
|
||||
</Unit2>
|
||||
<Unit3>
|
||||
<Filename Value="UfrmLogin.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmLogin"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmLogin"/>
|
||||
</Unit3>
|
||||
<Unit4>
|
||||
<Filename Value="UfrmInitialize.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmInitialize"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmInitialize"/>
|
||||
</Unit4>
|
||||
<Unit5>
|
||||
<Filename Value="UfrmAccountControl.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmAccountControl"/>
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmAccountControl"/>
|
||||
</Unit5>
|
||||
<Unit6>
|
||||
<Filename Value="UfrmEditAccount.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmEditAccount"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmEditAccount"/>
|
||||
</Unit6>
|
||||
<Unit7>
|
||||
<Filename Value="Tools/UfrmDrawSettings.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmDrawSettings"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmDrawSettings"/>
|
||||
</Unit7>
|
||||
<Unit8>
|
||||
<Filename Value="Tools/UfrmBoundaries.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmBoundaries"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmBoundaries"/>
|
||||
</Unit8>
|
||||
<Unit9>
|
||||
<Filename Value="Tools/UfrmElevateSettings.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmElevateSettings"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmElevateSettings"/>
|
||||
</Unit9>
|
||||
<Unit10>
|
||||
<Filename Value="UOverlayUI.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UOverlayUI"/>
|
||||
</Unit10>
|
||||
<Unit11>
|
||||
<Filename Value="UResourceManager.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UResourceManager"/>
|
||||
</Unit11>
|
||||
<Unit12>
|
||||
<Filename Value="Tools/UfrmConfirmation.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmConfirmation"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmConfirmation"/>
|
||||
</Unit12>
|
||||
<Unit13>
|
||||
<Filename Value="Tools/UfrmMoveSettings.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmMoveSettings"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmMoveSettings"/>
|
||||
</Unit13>
|
||||
<Unit14>
|
||||
<Filename Value="UfrmAbout.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmAbout"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmAbout"/>
|
||||
</Unit14>
|
||||
<Unit15>
|
||||
<Filename Value="Tools/UfrmHueSettings.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmHueSettings"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmHueSettings"/>
|
||||
</Unit15>
|
||||
<Unit16>
|
||||
<Filename Value="UfrmRadar.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmRadarMap"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmRadar"/>
|
||||
</Unit16>
|
||||
<Unit17>
|
||||
<Filename Value="UfrmLargeScaleCommand.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmLargeScaleCommand"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmLargeScaleCommand"/>
|
||||
</Unit17>
|
||||
<Unit18>
|
||||
<Filename Value="Tools/UfrmVirtualLayer.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmVirtualLayer"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmVirtualLayer"/>
|
||||
</Unit18>
|
||||
<Unit19>
|
||||
<Filename Value="Tools/UfrmFilter.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmFilter"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmFilter"/>
|
||||
</Unit19>
|
||||
<Unit20>
|
||||
<Filename Value="UGUIPlatformUtils.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UGUIPlatformUtils"/>
|
||||
</Unit20>
|
||||
<Unit21>
|
||||
<Filename Value="UPlatformTypes.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UPlatformTypes"/>
|
||||
</Unit21>
|
||||
<Unit22>
|
||||
<Filename Value="UfrmRegionControl.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmRegionControl"/>
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmRegionControl"/>
|
||||
</Unit22>
|
||||
<Unit23>
|
||||
<Filename Value="UPacketHandlers.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UPacketHandlers"/>
|
||||
</Unit23>
|
||||
<Unit24>
|
||||
<Filename Value="UPackets.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UPackets"/>
|
||||
</Unit24>
|
||||
<Unit25>
|
||||
<Filename Value="ULandscape.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="ULandscape"/>
|
||||
</Unit25>
|
||||
<Unit26>
|
||||
<Filename Value="UGameResources.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UGameResources"/>
|
||||
</Unit26>
|
||||
<Unit27>
|
||||
<Filename Value="UAdminHandling.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UAdminHandling"/>
|
||||
</Unit27>
|
||||
<Unit28>
|
||||
<Filename Value="Tools/UfrmToolWindow.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmToolWindow"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmToolWindow"/>
|
||||
</Unit28>
|
||||
<Unit29>
|
||||
<Filename Value="../Logging.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="Logging"/>
|
||||
</Unit29>
|
||||
<Unit30>
|
||||
<Filename Value="../UOLib/UStatics.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UStatics"/>
|
||||
</Unit30>
|
||||
<Unit31>
|
||||
<Filename Value="../UOLib/UWorldItem.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UWorldItem"/>
|
||||
</Unit31>
|
||||
<Unit32>
|
||||
<Filename Value="../UOLib/UMap.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UMap"/>
|
||||
</Unit32>
|
||||
<Unit33>
|
||||
<Filename Value="../UOLib/UTiledata.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UTiledata"/>
|
||||
</Unit33>
|
||||
<Unit34>
|
||||
<Filename Value="UGLFont.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UGLFont"/>
|
||||
</Unit34>
|
||||
<Unit35>
|
||||
<Filename Value="../UOLib/UAnimData.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UAnimData"/>
|
||||
</Unit35>
|
||||
<Unit36>
|
||||
<Filename Value="../MulProvider/UTileDataProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UTileDataProvider"/>
|
||||
</Unit36>
|
||||
<Unit37>
|
||||
<Filename Value="../MulProvider/UAnimDataProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UAnimDataProvider"/>
|
||||
</Unit37>
|
||||
<Unit38>
|
||||
<Filename Value="../MulProvider/UMulManager.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UMulManager"/>
|
||||
</Unit38>
|
||||
<Unit39>
|
||||
<Filename Value="../MulProvider/UArtProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UArtProvider"/>
|
||||
</Unit39>
|
||||
<Unit40>
|
||||
<Filename Value="../MulProvider/UTexmapProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UTexmapProvider"/>
|
||||
</Unit40>
|
||||
<Unit41>
|
||||
<Filename Value="../version.inc"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit41>
|
||||
<Unit42>
|
||||
<Filename Value="ULightManager.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="ULightManager"/>
|
||||
</Unit42>
|
||||
<Unit43>
|
||||
<Filename Value="../UOLib/ULight.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="ULight"/>
|
||||
</Unit43>
|
||||
<Unit44>
|
||||
<Filename Value="../MulProvider/ULightProvider.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="ULightProvider"/>
|
||||
</Unit44>
|
||||
<Unit45>
|
||||
<Filename Value="Tools/UfrmLightlevel.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="frmLightlevel"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="UfrmLightlevel"/>
|
||||
</Unit45>
|
||||
<Unit46>
|
||||
<Filename Value="../heContnrs.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="heContnrs"/>
|
||||
</Unit46>
|
||||
<Unit47>
|
||||
<Filename Value="../UContnrExt.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UContnrExt"/>
|
||||
</Unit47>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<Target>
|
||||
<Filename Value="../bin/CentrED"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir);../Imaging;.."/>
|
||||
<OtherUnitFiles Value="..;../UOLib;../MulProvider;../Imaging;../Imaging/JpegLib;../Imaging/ZLib;Tools"/>
|
||||
<UnitOutputDirectory Value="../obj/$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<CStyleOperator Value="False"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
<Checks>
|
||||
<RangeChecks Value="True"/>
|
||||
</Checks>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="0"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsStabs"/>
|
||||
</Debugging>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<IgnoredMessages idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5028="True"/>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CustomOptions Value="-FE../bin/"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
</CONFIG>
|
||||
|
||||
@@ -15,7 +15,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
OnShow = FormShow
|
||||
Position = poOwnerFormCenter
|
||||
ShowInTaskBar = stAlways
|
||||
LCLVersion = '0.9.31'
|
||||
LCLVersion = '1.3'
|
||||
object nbActions: TNotebook
|
||||
AnchorSideLeft.Control = vstActions
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
@@ -27,21 +27,21 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
Height = 349
|
||||
Top = 0
|
||||
Width = 468
|
||||
PageIndex = 3
|
||||
PageIndex = 0
|
||||
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||
TabOrder = 0
|
||||
TabStop = True
|
||||
object pgArea: TPage
|
||||
ClientWidth = 468
|
||||
ClientHeight = 349
|
||||
object sbArea: TScrollBox
|
||||
Left = 0
|
||||
Height = 349
|
||||
Top = 0
|
||||
Width = 468
|
||||
HorzScrollBar.Page = 464
|
||||
VertScrollBar.Page = 345
|
||||
Align = alClient
|
||||
ClientHeight = 347
|
||||
ClientWidth = 466
|
||||
ClientHeight = 345
|
||||
ClientWidth = 464
|
||||
TabOrder = 0
|
||||
object pbArea: TPaintBox
|
||||
Left = 0
|
||||
@@ -55,8 +55,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
end
|
||||
end
|
||||
object pgCopyMove: TPage
|
||||
ClientWidth = 936
|
||||
ClientHeight = 698
|
||||
object rgCMAction: TRadioGroup
|
||||
AnchorSideLeft.Control = pgCopyMove
|
||||
AnchorSideTop.Control = pgCopyMove
|
||||
@@ -198,7 +196,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
FF00FFFFFF00FFFFFF00CBCBCB7EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnGrabOffsetClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -218,8 +215,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
end
|
||||
end
|
||||
object pgModifyAltitude: TPage
|
||||
ClientWidth = 468
|
||||
ClientHeight = 349
|
||||
object Label2: TLabel
|
||||
AnchorSideLeft.Control = rbSetTerrainAltitude
|
||||
AnchorSideTop.Control = rbSetTerrainAltitude
|
||||
@@ -325,8 +320,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
end
|
||||
end
|
||||
object pgDrawTerrain: TPage
|
||||
ClientWidth = 468
|
||||
ClientHeight = 349
|
||||
object gbDrawTerrainTiles: TGroupBox
|
||||
AnchorSideLeft.Control = pgDrawTerrain
|
||||
AnchorSideTop.Control = pgDrawTerrain
|
||||
@@ -454,7 +447,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnClearTerrainClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -506,7 +498,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnDeleteTerrainClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -514,8 +505,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
end
|
||||
end
|
||||
object pgDeleteStatics: TPage
|
||||
ClientWidth = 1848
|
||||
ClientHeight = 1264
|
||||
object gbDeleteStaticsTiles: TGroupBox
|
||||
AnchorSideLeft.Control = pgDeleteStatics
|
||||
AnchorSideTop.Control = pgDeleteStatics
|
||||
@@ -643,7 +632,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnClearDStaticsTilesClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -695,7 +683,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnDeleteDStaticsTilesClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -773,8 +760,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
end
|
||||
end
|
||||
object pgInsertStatics: TPage
|
||||
ClientWidth = 1848
|
||||
ClientHeight = 1264
|
||||
object gbInserStaticsTiles: TGroupBox
|
||||
AnchorSideLeft.Control = pgInsertStatics
|
||||
AnchorSideTop.Control = pgInsertStatics
|
||||
@@ -899,7 +884,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnClearIStaticsTilesClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -951,7 +935,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnDeleteIStaticsTilesClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -1131,7 +1114,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
AnchorSideBottom.Control = btnDeleteArea
|
||||
Left = 4
|
||||
Height = 119
|
||||
Top = 155
|
||||
Top = 153
|
||||
Width = 144
|
||||
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||
BorderSpacing.Bottom = 4
|
||||
@@ -1154,7 +1137,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
AnchorSideRight.Control = vstActions
|
||||
AnchorSideRight.Side = asrBottom
|
||||
Left = 4
|
||||
Height = 15
|
||||
Height = 13
|
||||
Top = 140
|
||||
Width = 144
|
||||
Anchors = [akTop, akLeft, akRight]
|
||||
@@ -1177,7 +1160,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
item
|
||||
Position = 0
|
||||
Text = 'Actions'
|
||||
Width = 150
|
||||
Width = 148
|
||||
end>
|
||||
Header.DefaultHeight = 17
|
||||
Header.Options = [hoAutoResize, hoVisible]
|
||||
@@ -1198,7 +1181,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
Left = 39
|
||||
Height = 22
|
||||
Hint = 'Add area'
|
||||
Top = 278
|
||||
Top = 276
|
||||
Width = 22
|
||||
Anchors = [akTop, akRight]
|
||||
Glyph.Data = {
|
||||
@@ -1237,7 +1220,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnAddAreaClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -1250,7 +1232,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
Left = 65
|
||||
Height = 22
|
||||
Hint = 'Delete area'
|
||||
Top = 278
|
||||
Top = 276
|
||||
Width = 22
|
||||
Anchors = [akLeft, akBottom]
|
||||
BorderSpacing.Bottom = 4
|
||||
@@ -1291,7 +1273,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnDeleteAreaClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -1303,7 +1284,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
Left = 91
|
||||
Height = 22
|
||||
Hint = 'Delete all areas'
|
||||
Top = 278
|
||||
Top = 276
|
||||
Width = 22
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
@@ -1341,7 +1322,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnClearAreaClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -1351,9 +1331,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
AnchorSideTop.Control = seX1
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 4
|
||||
Height = 15
|
||||
Top = 311
|
||||
Width = 9
|
||||
Height = 13
|
||||
Top = 310
|
||||
Width = 6
|
||||
Caption = 'X'
|
||||
Enabled = False
|
||||
ParentColor = False
|
||||
@@ -1361,9 +1341,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
object seX1: TSpinEdit
|
||||
AnchorSideLeft.Control = seY1
|
||||
AnchorSideBottom.Control = seY1
|
||||
Left = 20
|
||||
Height = 20
|
||||
Top = 308
|
||||
Left = 17
|
||||
Height = 21
|
||||
Top = 306
|
||||
Width = 50
|
||||
Anchors = [akLeft, akBottom]
|
||||
BorderSpacing.Bottom = 8
|
||||
@@ -1376,9 +1356,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
AnchorSideLeft.Control = seX1
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = seX1
|
||||
Left = 78
|
||||
Height = 20
|
||||
Top = 308
|
||||
Left = 75
|
||||
Height = 21
|
||||
Top = 306
|
||||
Width = 50
|
||||
BorderSpacing.Left = 8
|
||||
Enabled = False
|
||||
@@ -1391,9 +1371,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
AnchorSideTop.Control = seY1
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 4
|
||||
Height = 15
|
||||
Height = 13
|
||||
Top = 339
|
||||
Width = 8
|
||||
Width = 5
|
||||
BorderSpacing.Left = 4
|
||||
Caption = 'Y'
|
||||
Enabled = False
|
||||
@@ -1403,9 +1383,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
AnchorSideLeft.Control = lblY
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideBottom.Control = btnGrab1
|
||||
Left = 20
|
||||
Height = 20
|
||||
Top = 336
|
||||
Left = 17
|
||||
Height = 21
|
||||
Top = 335
|
||||
Width = 50
|
||||
Anchors = [akLeft, akBottom]
|
||||
BorderSpacing.Left = 8
|
||||
@@ -1418,9 +1398,9 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
object seY2: TSpinEdit
|
||||
AnchorSideLeft.Control = seX2
|
||||
AnchorSideTop.Control = seY1
|
||||
Left = 78
|
||||
Height = 20
|
||||
Top = 336
|
||||
Left = 75
|
||||
Height = 21
|
||||
Top = 335
|
||||
Width = 50
|
||||
Enabled = False
|
||||
OnChange = seX1Change
|
||||
@@ -1432,7 +1412,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
AnchorSideLeft.Side = asrCenter
|
||||
AnchorSideBottom.Control = Owner
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 34
|
||||
Left = 31
|
||||
Height = 22
|
||||
Hint = 'Grab coordinates from the main window.'
|
||||
Top = 360
|
||||
@@ -1476,7 +1456,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
FF00FFFFFF00FFFFFF00CBCBCB7EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnGrab1Click
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -1486,7 +1465,7 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
AnchorSideLeft.Side = asrCenter
|
||||
AnchorSideBottom.Control = btnGrab1
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 92
|
||||
Left = 89
|
||||
Height = 22
|
||||
Hint = 'Grab coordinates from the main window.'
|
||||
Top = 360
|
||||
@@ -1529,7 +1508,6 @@ object frmLargeScaleCommand: TfrmLargeScaleCommand
|
||||
FF00FFFFFF00FFFFFF00CBCBCB7EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnGrab1Click
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
|
||||
@@ -666,10 +666,18 @@ begin
|
||||
if selected then
|
||||
begin
|
||||
nodeInfo := Sender.GetNodeData(Node);
|
||||
seX1.OnChange := nil;
|
||||
seX2.OnChange := nil;
|
||||
seY1.OnChange := nil;
|
||||
seY2.OnChange := nil;
|
||||
seX1.Value := nodeInfo^.Left;
|
||||
seX2.Value := nodeInfo^.Right;
|
||||
seY1.Value := nodeInfo^.Top;
|
||||
seY2.Value := nodeInfo^.Bottom;
|
||||
seX1.OnChange := @seX1Change;
|
||||
seX2.OnChange := @seX1Change;
|
||||
seY1.OnChange := @seX1Change;
|
||||
seY2.OnChange := @seX1Change;
|
||||
end;
|
||||
pbArea.Repaint;
|
||||
end;
|
||||
|
||||
+2731
-2738
File diff suppressed because it is too large
Load Diff
@@ -14,7 +14,7 @@ object frmRegionControl: TfrmRegionControl
|
||||
OnShow = FormShow
|
||||
Position = poOwnerFormCenter
|
||||
ShowInTaskBar = stAlways
|
||||
LCLVersion = '0.9.29'
|
||||
LCLVersion = '1.3'
|
||||
object sbArea: TScrollBox
|
||||
AnchorSideLeft.Control = vstRegions
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
@@ -26,6 +26,8 @@ object frmRegionControl: TfrmRegionControl
|
||||
Height = 372
|
||||
Top = 0
|
||||
Width = 460
|
||||
HorzScrollBar.Page = 456
|
||||
VertScrollBar.Page = 368
|
||||
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||
ClientHeight = 368
|
||||
ClientWidth = 456
|
||||
@@ -110,7 +112,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
Width = 22
|
||||
Anchors = [akLeft, akBottom]
|
||||
BorderSpacing.Around = 4
|
||||
Color = clBtnFace
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
2000000000000004000064000000640000000000000000000000000000000000
|
||||
@@ -147,7 +148,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = mnuAddRegionClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -164,7 +164,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
Width = 22
|
||||
Anchors = [akLeft, akBottom]
|
||||
BorderSpacing.Left = 4
|
||||
Color = clBtnFace
|
||||
Enabled = False
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
@@ -202,7 +201,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = mnuDeleteRegionClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -215,8 +213,8 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideRight.Side = asrBottom
|
||||
AnchorSideBottom.Control = btnDeleteArea
|
||||
Left = 4
|
||||
Height = 124
|
||||
Top = 179
|
||||
Height = 121
|
||||
Top = 178
|
||||
Width = 152
|
||||
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||
BorderSpacing.Left = 4
|
||||
@@ -241,7 +239,7 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideRight.Control = spRegionsArea
|
||||
AnchorSideRight.Side = asrBottom
|
||||
Left = 4
|
||||
Height = 14
|
||||
Height = 13
|
||||
Top = 165
|
||||
Width = 152
|
||||
Anchors = [akTop, akLeft, akRight]
|
||||
@@ -270,10 +268,9 @@ object frmRegionControl: TfrmRegionControl
|
||||
Left = 43
|
||||
Height = 22
|
||||
Hint = 'Add area'
|
||||
Top = 307
|
||||
Top = 303
|
||||
Width = 22
|
||||
Anchors = [akTop, akRight]
|
||||
Color = clBtnFace
|
||||
Enabled = False
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
@@ -311,7 +308,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnAddAreaClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -323,12 +319,11 @@ object frmRegionControl: TfrmRegionControl
|
||||
Left = 69
|
||||
Height = 22
|
||||
Hint = 'Delete area'
|
||||
Top = 307
|
||||
Top = 303
|
||||
Width = 22
|
||||
Anchors = [akLeft, akBottom]
|
||||
BorderSpacing.Bottom = 4
|
||||
BorderSpacing.Around = 4
|
||||
Color = clBtnFace
|
||||
Enabled = False
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
@@ -366,7 +361,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnDeleteAreaClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -378,9 +372,8 @@ object frmRegionControl: TfrmRegionControl
|
||||
Left = 95
|
||||
Height = 22
|
||||
Hint = 'Delete all areas'
|
||||
Top = 307
|
||||
Top = 303
|
||||
Width = 22
|
||||
Color = clBtnFace
|
||||
Enabled = False
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
@@ -418,7 +411,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnClearAreaClick
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -428,9 +420,9 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideTop.Control = seX1
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 4
|
||||
Height = 14
|
||||
Top = 339
|
||||
Width = 8
|
||||
Height = 13
|
||||
Top = 337
|
||||
Width = 6
|
||||
BorderSpacing.Left = 4
|
||||
Caption = 'X'
|
||||
Enabled = False
|
||||
@@ -439,9 +431,9 @@ object frmRegionControl: TfrmRegionControl
|
||||
object seX1: TSpinEdit
|
||||
AnchorSideLeft.Control = seY1
|
||||
AnchorSideBottom.Control = seY1
|
||||
Left = 20
|
||||
Height = 19
|
||||
Top = 337
|
||||
Left = 17
|
||||
Height = 21
|
||||
Top = 333
|
||||
Width = 50
|
||||
Anchors = [akLeft, akBottom]
|
||||
BorderSpacing.Bottom = 8
|
||||
@@ -454,9 +446,9 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideLeft.Control = seX1
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = seX1
|
||||
Left = 78
|
||||
Height = 19
|
||||
Top = 337
|
||||
Left = 75
|
||||
Height = 21
|
||||
Top = 333
|
||||
Width = 50
|
||||
BorderSpacing.Left = 8
|
||||
Enabled = False
|
||||
@@ -469,9 +461,9 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideTop.Control = seY1
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 4
|
||||
Height = 14
|
||||
Height = 13
|
||||
Top = 366
|
||||
Width = 8
|
||||
Width = 5
|
||||
Caption = 'Y'
|
||||
Enabled = False
|
||||
ParentColor = False
|
||||
@@ -482,10 +474,10 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideRight.Control = seX1
|
||||
AnchorSideRight.Side = asrBottom
|
||||
AnchorSideBottom.Control = btnGrab1
|
||||
Left = 20
|
||||
Height = 19
|
||||
Top = 364
|
||||
Width = 50
|
||||
Left = 17
|
||||
Height = 21
|
||||
Top = 362
|
||||
Width = 53
|
||||
Anchors = [akLeft, akRight, akBottom]
|
||||
BorderSpacing.Left = 8
|
||||
Enabled = False
|
||||
@@ -499,9 +491,9 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideTop.Side = asrBottom
|
||||
AnchorSideRight.Control = seX2
|
||||
AnchorSideRight.Side = asrBottom
|
||||
Left = 78
|
||||
Height = 19
|
||||
Top = 364
|
||||
Left = 75
|
||||
Height = 21
|
||||
Top = 362
|
||||
Width = 50
|
||||
Anchors = [akTop, akLeft, akRight]
|
||||
BorderSpacing.Top = 8
|
||||
@@ -515,14 +507,13 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideLeft.Side = asrCenter
|
||||
AnchorSideBottom.Control = Owner
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 34
|
||||
Left = 32
|
||||
Height = 22
|
||||
Hint = 'Grab coordinates from the main window.'
|
||||
Top = 387
|
||||
Width = 22
|
||||
Anchors = [akLeft, akBottom]
|
||||
BorderSpacing.Around = 4
|
||||
Color = clBtnFace
|
||||
Enabled = False
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
@@ -560,7 +551,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
FF00FFFFFF00FFFFFF00CBCBCB7EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnGrab1Click
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
@@ -570,13 +560,12 @@ object frmRegionControl: TfrmRegionControl
|
||||
AnchorSideLeft.Side = asrCenter
|
||||
AnchorSideBottom.Control = btnGrab1
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 92
|
||||
Left = 89
|
||||
Height = 22
|
||||
Hint = 'Grab coordinates from the main window.'
|
||||
Top = 387
|
||||
Width = 22
|
||||
Anchors = [akLeft, akBottom]
|
||||
Color = clBtnFace
|
||||
Enabled = False
|
||||
Glyph.Data = {
|
||||
36040000424D3604000000000000360000002800000010000000100000000100
|
||||
@@ -614,7 +603,6 @@ object frmRegionControl: TfrmRegionControl
|
||||
FF00FFFFFF00FFFFFF00CBCBCB7EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
|
||||
}
|
||||
NumGlyphs = 0
|
||||
OnClick = btnGrab1Click
|
||||
ShowHint = True
|
||||
ParentShowHint = False
|
||||
|
||||
@@ -460,7 +460,7 @@ var
|
||||
node: PVirtualNode;
|
||||
areaInfo: PRect;
|
||||
begin
|
||||
node := vstArea.GetFirstSelected;
|
||||
node := vstArea.GetFirstSelected;
|
||||
if node <> nil then
|
||||
begin
|
||||
areaInfo := vstArea.GetNodeData(node);
|
||||
@@ -494,10 +494,18 @@ begin
|
||||
if selected then
|
||||
begin
|
||||
areaInfo := Sender.GetNodeData(Node);
|
||||
seX1.OnChange := nil;
|
||||
seX2.OnChange := nil;
|
||||
seY1.OnChange := nil;
|
||||
seY2.OnChange := nil;
|
||||
seX1.Value := areaInfo^.Left;
|
||||
seX2.Value := areaInfo^.Right;
|
||||
seY1.Value := areaInfo^.Top;
|
||||
seY2.Value := areaInfo^.Bottom;
|
||||
seX1.OnChange := @seX1Change;
|
||||
seX2.OnChange := @seX1Change;
|
||||
seY1.OnChange := @seX1Change;
|
||||
seY2.OnChange := @seX1Change;
|
||||
end;
|
||||
pbArea.Repaint;
|
||||
end;
|
||||
|
||||
+143
-143
@@ -1866,142 +1866,142 @@ var
|
||||
OldFmt: TImageFormat;
|
||||
|
||||
procedure XShear(var Src, Dst: TImageData; Row, Offset, Weight, Bpp: Integer);
|
||||
var
|
||||
I, J, XPos: Integer;
|
||||
PixSrc, PixLeft, PixOldLeft: TColor32Rec;
|
||||
LineDst: PByteArray;
|
||||
SrcPtr: PColor32;
|
||||
begin
|
||||
SrcPtr := @PByteArray(Src.Bits)[Row * Src.Width * Bpp];
|
||||
LineDst := @PByteArray(Dst.Bits)[Row * Dst.Width * Bpp];
|
||||
PixOldLeft.Color := 0;
|
||||
|
||||
for I := 0 to Src.Width - 1 do
|
||||
begin
|
||||
CopyPixel(SrcPtr, @PixSrc, Bpp);
|
||||
for J := 0 to Bpp - 1 do
|
||||
PixLeft.Channels[J] := MulDiv(PixSrc.Channels[J], Weight, 256);
|
||||
|
||||
XPos := I + Offset;
|
||||
if (XPos >= 0) and (XPos < Dst.Width) then
|
||||
begin
|
||||
for J := 0 to Bpp - 1 do
|
||||
PixSrc.Channels[J] := PixSrc.Channels[J] - (PixLeft.Channels[J] - PixOldLeft.Channels[J]);
|
||||
CopyPixel(@PixSrc, @LineDst[XPos * Bpp], Bpp);
|
||||
end;
|
||||
PixOldLeft := PixLeft;
|
||||
Inc(PByte(SrcPtr), Bpp);
|
||||
end;
|
||||
|
||||
XPos := Src.Width + Offset;
|
||||
if XPos < Dst.Width then
|
||||
CopyPixel(@PixOldLeft, @LineDst[XPos * Bpp], Bpp);
|
||||
end;
|
||||
|
||||
procedure YShear(var Src, Dst: TImageData; Col, Offset, Weight, Bpp: Integer);
|
||||
var
|
||||
I, J, YPos: Integer;
|
||||
PixSrc, PixLeft, PixOldLeft: TColor32Rec;
|
||||
SrcPtr: PByte;
|
||||
begin
|
||||
SrcPtr := @PByteArray(Src.Bits)[Col * Bpp];
|
||||
PixOldLeft.Color := 0;
|
||||
|
||||
for I := 0 to Src.Height - 1 do
|
||||
begin
|
||||
CopyPixel(SrcPtr, @PixSrc, Bpp);
|
||||
for J := 0 to Bpp - 1 do
|
||||
PixLeft.Channels[J] := MulDiv(PixSrc.Channels[J], Weight, 256);
|
||||
|
||||
YPos := I + Offset;
|
||||
if (YPos >= 0) and (YPos < Dst.Height) then
|
||||
begin
|
||||
for J := 0 to Bpp - 1 do
|
||||
PixSrc.Channels[J] := PixSrc.Channels[J] - (PixLeft.Channels[J] - PixOldLeft.Channels[J]);
|
||||
CopyPixel(@PixSrc, @PByteArray(Dst.Bits)[(YPos * Dst.Width + Col) * Bpp], Bpp);
|
||||
end;
|
||||
PixOldLeft := PixLeft;
|
||||
Inc(SrcPtr, Src.Width * Bpp);
|
||||
end;
|
||||
|
||||
YPos := Src.Height + Offset;
|
||||
if YPos < Dst.Height then
|
||||
CopyPixel(@PixOldLeft, @PByteArray(Dst.Bits)[(YPos * Dst.Width + Col) * Bpp], Bpp);
|
||||
end;
|
||||
|
||||
procedure Rotate45(var Image: TImageData; Angle: Single);
|
||||
var
|
||||
TempImage1, TempImage2: TImageData;
|
||||
AngleRad, AngleTan, AngleSin, AngleCos, Shear: Single;
|
||||
I, DstWidth, DstHeight, SrcWidth, SrcHeight, Bpp: Integer;
|
||||
SrcFmt, TempFormat: TImageFormat;
|
||||
Info: TImageFormatInfo;
|
||||
begin
|
||||
AngleRad := Angle * Pi / 180;
|
||||
AngleSin := Sin(AngleRad);
|
||||
AngleCos := Cos(AngleRad);
|
||||
AngleTan := Sin(AngleRad / 2) / Cos(AngleRad / 2);
|
||||
SrcWidth := Image.Width;
|
||||
SrcHeight := Image.Height;
|
||||
SrcFmt := Image.Format;
|
||||
|
||||
if not (SrcFmt in [ifR8G8B8..ifX8R8G8B8, ifGray8..ifGray32, ifA16Gray16]) then
|
||||
ConvertImage(Image, ifA8R8G8B8);
|
||||
|
||||
TempFormat := Image.Format;
|
||||
GetImageFormatInfo(TempFormat, Info);
|
||||
Bpp := Info.BytesPerPixel;
|
||||
|
||||
// 1st shear (horizontal)
|
||||
DstWidth := Trunc(SrcWidth + SrcHeight * Abs(AngleTan) + 0.5);
|
||||
DstHeight := SrcHeight;
|
||||
NewImage(DstWidth, DstHeight, TempFormat, TempImage1);
|
||||
|
||||
for I := 0 to DstHeight - 1 do
|
||||
begin
|
||||
if AngleTan >= 0 then
|
||||
Shear := (I + 0.5) * AngleTan
|
||||
else
|
||||
Shear := (I - DstHeight + 0.5) * AngleTan;
|
||||
XShear(Image, TempImage1, I, Floor(Shear), Trunc(255 * (Shear - Floor(Shear)) + 1), Bpp);
|
||||
end;
|
||||
|
||||
// 2nd shear (vertical)
|
||||
FreeImage(Image);
|
||||
DstHeight := Trunc(SrcWidth * Abs(AngleSin) + SrcHeight * AngleCos + 0.5) + 1;
|
||||
NewImage(DstWidth, DstHeight, TempFormat, TempImage2);
|
||||
|
||||
if AngleSin >= 0 then
|
||||
Shear := (SrcWidth - 1) * AngleSin
|
||||
else
|
||||
Shear := (SrcWidth - DstWidth) * -AngleSin;
|
||||
|
||||
for I := 0 to DstWidth - 1 do
|
||||
begin
|
||||
YShear(TempImage1, TempImage2, I, Floor(Shear), Trunc(255 * (Shear - Floor(Shear)) + 1), Bpp);
|
||||
Shear := Shear - AngleSin;
|
||||
end;
|
||||
|
||||
// 3rd shear (horizontal)
|
||||
FreeImage(TempImage1);
|
||||
DstWidth := Trunc(SrcHeight * Abs(AngleSin) + SrcWidth * AngleCos + 0.5) + 1;
|
||||
NewImage(DstWidth, DstHeight, TempFormat, Image);
|
||||
|
||||
if AngleSin >= 0 then
|
||||
Shear := (SrcWidth - 1) * AngleSin * -AngleTan
|
||||
else
|
||||
Shear := ((SrcWidth - 1) * -AngleSin + (1 - DstHeight)) * AngleTan;
|
||||
|
||||
for I := 0 to DstHeight - 1 do
|
||||
begin
|
||||
XShear(TempImage2, Image, I, Floor(Shear), Trunc(255 * (Shear - Floor(Shear)) + 1), Bpp);
|
||||
Shear := Shear + AngleTan;
|
||||
end;
|
||||
|
||||
FreeImage(TempImage2);
|
||||
if Image.Format <> SrcFmt then
|
||||
ConvertImage(Image, SrcFmt);
|
||||
end;
|
||||
var
|
||||
I, J, XPos: Integer;
|
||||
PixSrc, PixLeft, PixOldLeft: TColor32Rec;
|
||||
LineDst: PByteArray;
|
||||
SrcPtr: PColor32;
|
||||
begin
|
||||
SrcPtr := @PByteArray(Src.Bits)[Row * Src.Width * Bpp];
|
||||
LineDst := @PByteArray(Dst.Bits)[Row * Dst.Width * Bpp];
|
||||
PixOldLeft.Color := 0;
|
||||
|
||||
for I := 0 to Src.Width - 1 do
|
||||
begin
|
||||
CopyPixel(SrcPtr, @PixSrc, Bpp);
|
||||
for J := 0 to Bpp - 1 do
|
||||
PixLeft.Channels[J] := MulDiv(PixSrc.Channels[J], Weight, 256);
|
||||
|
||||
XPos := I + Offset;
|
||||
if (XPos >= 0) and (XPos < Dst.Width) then
|
||||
begin
|
||||
for J := 0 to Bpp - 1 do
|
||||
PixSrc.Channels[J] := PixSrc.Channels[J] - (PixLeft.Channels[J] - PixOldLeft.Channels[J]);
|
||||
CopyPixel(@PixSrc, @LineDst[XPos * Bpp], Bpp);
|
||||
end;
|
||||
PixOldLeft := PixLeft;
|
||||
Inc(PByte(SrcPtr), Bpp);
|
||||
end;
|
||||
|
||||
XPos := Src.Width + Offset;
|
||||
if XPos < Dst.Width then
|
||||
CopyPixel(@PixOldLeft, @LineDst[XPos * Bpp], Bpp);
|
||||
end;
|
||||
|
||||
procedure YShear(var Src, Dst: TImageData; Col, Offset, Weight, Bpp: Integer);
|
||||
var
|
||||
I, J, YPos: Integer;
|
||||
PixSrc, PixLeft, PixOldLeft: TColor32Rec;
|
||||
SrcPtr: PByte;
|
||||
begin
|
||||
SrcPtr := @PByteArray(Src.Bits)[Col * Bpp];
|
||||
PixOldLeft.Color := 0;
|
||||
|
||||
for I := 0 to Src.Height - 1 do
|
||||
begin
|
||||
CopyPixel(SrcPtr, @PixSrc, Bpp);
|
||||
for J := 0 to Bpp - 1 do
|
||||
PixLeft.Channels[J] := MulDiv(PixSrc.Channels[J], Weight, 256);
|
||||
|
||||
YPos := I + Offset;
|
||||
if (YPos >= 0) and (YPos < Dst.Height) then
|
||||
begin
|
||||
for J := 0 to Bpp - 1 do
|
||||
PixSrc.Channels[J] := PixSrc.Channels[J] - (PixLeft.Channels[J] - PixOldLeft.Channels[J]);
|
||||
CopyPixel(@PixSrc, @PByteArray(Dst.Bits)[(YPos * Dst.Width + Col) * Bpp], Bpp);
|
||||
end;
|
||||
PixOldLeft := PixLeft;
|
||||
Inc(SrcPtr, Src.Width * Bpp);
|
||||
end;
|
||||
|
||||
YPos := Src.Height + Offset;
|
||||
if YPos < Dst.Height then
|
||||
CopyPixel(@PixOldLeft, @PByteArray(Dst.Bits)[(YPos * Dst.Width + Col) * Bpp], Bpp);
|
||||
end;
|
||||
|
||||
procedure Rotate45(var Image: TImageData; Angle: Single);
|
||||
var
|
||||
TempImage1, TempImage2: TImageData;
|
||||
AngleRad, AngleTan, AngleSin, AngleCos, Shear: Single;
|
||||
I, DstWidth, DstHeight, SrcWidth, SrcHeight, Bpp: Integer;
|
||||
SrcFmt, TempFormat: TImageFormat;
|
||||
Info: TImageFormatInfo;
|
||||
begin
|
||||
AngleRad := Angle * Pi / 180;
|
||||
AngleSin := Sin(AngleRad);
|
||||
AngleCos := Cos(AngleRad);
|
||||
AngleTan := Sin(AngleRad / 2) / Cos(AngleRad / 2);
|
||||
SrcWidth := Image.Width;
|
||||
SrcHeight := Image.Height;
|
||||
SrcFmt := Image.Format;
|
||||
|
||||
if not (SrcFmt in [ifR8G8B8..ifX8R8G8B8, ifGray8..ifGray32, ifA16Gray16]) then
|
||||
ConvertImage(Image, ifA8R8G8B8);
|
||||
|
||||
TempFormat := Image.Format;
|
||||
GetImageFormatInfo(TempFormat, Info);
|
||||
Bpp := Info.BytesPerPixel;
|
||||
|
||||
// 1st shear (horizontal)
|
||||
DstWidth := Trunc(SrcWidth + SrcHeight * Abs(AngleTan) + 0.5);
|
||||
DstHeight := SrcHeight;
|
||||
NewImage(DstWidth, DstHeight, TempFormat, TempImage1);
|
||||
|
||||
for I := 0 to DstHeight - 1 do
|
||||
begin
|
||||
if AngleTan >= 0 then
|
||||
Shear := (I + 0.5) * AngleTan
|
||||
else
|
||||
Shear := (I - DstHeight + 0.5) * AngleTan;
|
||||
XShear(Image, TempImage1, I, Floor(Shear), Trunc(255 * (Shear - Floor(Shear)) + 1), Bpp);
|
||||
end;
|
||||
|
||||
// 2nd shear (vertical)
|
||||
FreeImage(Image);
|
||||
DstHeight := Trunc(SrcWidth * Abs(AngleSin) + SrcHeight * AngleCos + 0.5) + 1;
|
||||
NewImage(DstWidth, DstHeight, TempFormat, TempImage2);
|
||||
|
||||
if AngleSin >= 0 then
|
||||
Shear := (SrcWidth - 1) * AngleSin
|
||||
else
|
||||
Shear := (SrcWidth - DstWidth) * -AngleSin;
|
||||
|
||||
for I := 0 to DstWidth - 1 do
|
||||
begin
|
||||
YShear(TempImage1, TempImage2, I, Floor(Shear), Trunc(255 * (Shear - Floor(Shear)) + 1), Bpp);
|
||||
Shear := Shear - AngleSin;
|
||||
end;
|
||||
|
||||
// 3rd shear (horizontal)
|
||||
FreeImage(TempImage1);
|
||||
DstWidth := Trunc(SrcHeight * Abs(AngleSin) + SrcWidth * AngleCos + 0.5) + 1;
|
||||
NewImage(DstWidth, DstHeight, TempFormat, Image);
|
||||
|
||||
if AngleSin >= 0 then
|
||||
Shear := (SrcWidth - 1) * AngleSin * -AngleTan
|
||||
else
|
||||
Shear := ((SrcWidth - 1) * -AngleSin + (1 - DstHeight)) * AngleTan;
|
||||
|
||||
for I := 0 to DstHeight - 1 do
|
||||
begin
|
||||
XShear(TempImage2, Image, I, Floor(Shear), Trunc(255 * (Shear - Floor(Shear)) + 1), Bpp);
|
||||
Shear := Shear + AngleTan;
|
||||
end;
|
||||
|
||||
FreeImage(TempImage2);
|
||||
if Image.Format <> SrcFmt then
|
||||
ConvertImage(Image, SrcFmt);
|
||||
end;
|
||||
|
||||
procedure RotateMul90(var Image: TImageData; Angle: Integer);
|
||||
var
|
||||
@@ -2009,7 +2009,7 @@ var
|
||||
X, Y, BytesPerPixel: Integer;
|
||||
RotPix, Pix: PByte;
|
||||
begin
|
||||
InitImage(RotImage);
|
||||
InitImage(RotImage);
|
||||
BytesPerPixel := ImageFormatInfos[Image.Format].BytesPerPixel;
|
||||
|
||||
if ((Angle = 90) or (Angle = 270)) and (Image.Width <> Image.Height) then
|
||||
@@ -2061,9 +2061,9 @@ var
|
||||
|
||||
FreeMemNil(Image.Bits);
|
||||
RotImage.Palette := Image.Palette;
|
||||
Image := RotImage;
|
||||
Image := RotImage;
|
||||
end;
|
||||
|
||||
|
||||
begin
|
||||
Result := False;
|
||||
|
||||
@@ -2073,7 +2073,7 @@ begin
|
||||
Angle := Angle - 360;
|
||||
while Angle < 0 do
|
||||
Angle := Angle + 360;
|
||||
|
||||
|
||||
if (Angle = 0) or (Abs(Angle) = 360) then
|
||||
begin
|
||||
Result := True;
|
||||
@@ -2099,9 +2099,9 @@ begin
|
||||
RotateMul90(Image, 270);
|
||||
Angle := Angle - 270;
|
||||
end;
|
||||
|
||||
if Angle <> 0 then
|
||||
Rotate45(Image, Angle);
|
||||
|
||||
if Angle <> 0 then
|
||||
Rotate45(Image, Angle);
|
||||
|
||||
if OldFmt <> Image.Format then
|
||||
ConvertImage(Image, OldFmt);
|
||||
|
||||
+857
-857
File diff suppressed because it is too large
Load Diff
+2177
-2177
File diff suppressed because it is too large
Load Diff
+997
-997
File diff suppressed because it is too large
Load Diff
+245
-245
@@ -1,245 +1,245 @@
|
||||
{
|
||||
$Id: ImagingColors.pas 173 2009-09-04 17:05:52Z galfar $
|
||||
Vampyre Imaging Library
|
||||
by Marek Mauder
|
||||
http://imaginglib.sourceforge.net
|
||||
|
||||
The contents of this file are used with permission, subject to the Mozilla
|
||||
Public License Version 1.1 (the "License"); you may not use this file except
|
||||
in compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/MPL-1.1.html
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
the specific language governing rights and limitations under the License.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of the
|
||||
GNU Lesser General Public License (the "LGPL License"), in which case the
|
||||
provisions of the LGPL License are applicable instead of those above.
|
||||
If you wish to allow use of your version of this file only under the terms
|
||||
of the LGPL License and not to allow others to use your version of this file
|
||||
under the MPL, indicate your decision by deleting the provisions above and
|
||||
replace them with the notice and other provisions required by the LGPL
|
||||
License. If you do not delete the provisions above, a recipient may use
|
||||
your version of this file under either the MPL or the LGPL License.
|
||||
|
||||
For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
|
||||
}
|
||||
|
||||
{ This unit contains functions for manipulating and converting color values.}
|
||||
unit ImagingColors;
|
||||
|
||||
interface
|
||||
|
||||
{$I ImagingOptions.inc}
|
||||
|
||||
uses
|
||||
SysUtils, ImagingTypes, ImagingUtility;
|
||||
|
||||
{ Converts RGB color to YUV.}
|
||||
procedure RGBToYUV(R, G, B: Byte; var Y, U, V: Byte);
|
||||
{ Converts YIV to RGB color.}
|
||||
procedure YUVToRGB(Y, U, V: Byte; var R, G, B: Byte);
|
||||
|
||||
{ Converts RGB color to YCbCr as used in JPEG.}
|
||||
procedure RGBToYCbCr(R, G, B: Byte; var Y, Cb, Cr: Byte);
|
||||
{ Converts YCbCr as used in JPEG to RGB color.}
|
||||
procedure YCbCrToRGB(Y, Cb, Cr: Byte; var R, G, B: Byte);
|
||||
{ Converts RGB color to YCbCr as used in JPEG.}
|
||||
procedure RGBToYCbCr16(R, G, B: Word; var Y, Cb, Cr: Word);
|
||||
{ Converts YCbCr as used in JPEG to RGB color.}
|
||||
procedure YCbCrToRGB16(Y, Cb, Cr: Word; var R, G, B: Word);
|
||||
|
||||
{ Converts RGB color to CMY.}
|
||||
procedure RGBToCMY(R, G, B: Byte; var C, M, Y: Byte);
|
||||
{ Converts CMY to RGB color.}
|
||||
procedure CMYToRGB(C, M, Y: Byte; var R, G, B: Byte);
|
||||
{ Converts RGB color to CMY.}
|
||||
procedure RGBToCMY16(R, G, B: Word; var C, M, Y: Word);
|
||||
{ Converts CMY to RGB color.}
|
||||
procedure CMYToRGB16(C, M, Y: Word; var R, G, B: Word);
|
||||
|
||||
{ Converts RGB color to CMYK.}
|
||||
procedure RGBToCMYK(R, G, B: Byte; var C, M, Y, K: Byte);
|
||||
{ Converts CMYK to RGB color.}
|
||||
procedure CMYKToRGB(C, M, Y, K: Byte; var R, G, B: Byte);
|
||||
{ Converts RGB color to CMYK.}
|
||||
procedure RGBToCMYK16(R, G, B: Word; var C, M, Y, K: Word);
|
||||
{ Converts CMYK to RGB color.}
|
||||
procedure CMYKToRGB16(C, M, Y, K: Word; var R, G, B: Word);
|
||||
|
||||
{ Converts RGB color to YCoCg.}
|
||||
procedure RGBToYCoCg(R, G, B: Byte; var Y, Co, Cg: Byte);
|
||||
{ Converts YCoCg to RGB color.}
|
||||
procedure YCoCgToRGB(Y, Co, Cg: Byte; var R, G, B: Byte);
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
procedure RGBToYUV(R, G, B: Byte; var Y, U, V: Byte);
|
||||
begin
|
||||
Y := ClampToByte(Round( 0.257 * R + 0.504 * G + 0.098 * B) + 16);
|
||||
V := ClampToByte(Round( 0.439 * R - 0.368 * G - 0.071 * B) + 128);
|
||||
U := ClampToByte(Round(-0.148 * R - 0.291 * G + 0.439 * B) + 128);
|
||||
end;
|
||||
|
||||
procedure YUVToRGB(Y, U, V: Byte; var R, G, B: Byte);
|
||||
var
|
||||
CY, CU, CV: LongInt;
|
||||
begin
|
||||
CY := Y - 16;
|
||||
CU := U - 128;
|
||||
CV := V - 128;
|
||||
R := ClampToByte(Round(1.164 * CY - 0.002 * CU + 1.596 * CV));
|
||||
G := ClampToByte(Round(1.164 * CY - 0.391 * CU - 0.813 * CV));
|
||||
B := ClampToByte(Round(1.164 * CY + 2.018 * CU - 0.001 * CV));
|
||||
end;
|
||||
|
||||
procedure RGBToYCbCr(R, G, B: Byte; var Y, Cb, Cr: Byte);
|
||||
begin
|
||||
Y := ClampToByte(Round( 0.29900 * R + 0.58700 * G + 0.11400 * B));
|
||||
Cb := ClampToByte(Round(-0.16874 * R - 0.33126 * G + 0.50000 * B + 128));
|
||||
Cr := ClampToByte(Round( 0.50000 * R - 0.41869 * G - 0.08131 * B + 128));
|
||||
end;
|
||||
|
||||
procedure YCbCrToRGB(Y, Cb, Cr: Byte; var R, G, B: Byte);
|
||||
begin
|
||||
R := ClampToByte(Round(Y + 1.40200 * (Cr - 128)));
|
||||
G := ClampToByte(Round(Y - 0.34414 * (Cb - 128) - 0.71414 * (Cr - 128)));
|
||||
B := ClampToByte(Round(Y + 1.77200 * (Cb - 128)));
|
||||
end;
|
||||
|
||||
procedure RGBToYCbCr16(R, G, B: Word; var Y, Cb, Cr: Word);
|
||||
begin
|
||||
Y := ClampToWord(Round( 0.29900 * R + 0.58700 * G + 0.11400 * B));
|
||||
Cb := ClampToWord(Round(-0.16874 * R - 0.33126 * G + 0.50000 * B + 32768));
|
||||
Cr := ClampToWord(Round( 0.50000 * R - 0.41869 * G - 0.08131 * B + 32768));
|
||||
end;
|
||||
|
||||
procedure YCbCrToRGB16(Y, Cb, Cr: Word; var R, G, B: Word);
|
||||
begin
|
||||
R := ClampToWord(Round(Y + 1.40200 * (Cr - 32768)));
|
||||
G := ClampToWord(Round(Y - 0.34414 * (Cb - 32768) - 0.71414 * (Cr - 32768)));
|
||||
B := ClampToWord(Round(Y + 1.77200 * (Cb - 32768)));
|
||||
end;
|
||||
|
||||
procedure RGBToCMY(R, G, B: Byte; var C, M, Y: Byte);
|
||||
begin
|
||||
C := 255 - R;
|
||||
M := 255 - G;
|
||||
Y := 255 - B;
|
||||
end;
|
||||
|
||||
procedure CMYToRGB(C, M, Y: Byte; var R, G, B: Byte);
|
||||
begin
|
||||
R := 255 - C;
|
||||
G := 255 - M;
|
||||
B := 255 - Y;
|
||||
end;
|
||||
|
||||
procedure RGBToCMY16(R, G, B: Word; var C, M, Y: Word);
|
||||
begin
|
||||
C := 65535 - R;
|
||||
M := 65535 - G;
|
||||
Y := 65535 - B;
|
||||
end;
|
||||
|
||||
procedure CMYToRGB16(C, M, Y: Word; var R, G, B: Word);
|
||||
begin
|
||||
R := 65535 - C;
|
||||
G := 65535 - M;
|
||||
B := 65535 - Y;
|
||||
end;
|
||||
|
||||
procedure RGBToCMYK(R, G, B: Byte; var C, M, Y, K: Byte);
|
||||
begin
|
||||
RGBToCMY(R, G, B, C, M, Y);
|
||||
K := Min(C, Min(M, Y));
|
||||
if K = 255 then
|
||||
begin
|
||||
C := 0;
|
||||
M := 0;
|
||||
Y := 0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
C := ClampToByte(Round((C - K) / (255 - K) * 255));
|
||||
M := ClampToByte(Round((M - K) / (255 - K) * 255));
|
||||
Y := ClampToByte(Round((Y - K) / (255 - K) * 255));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CMYKToRGB(C, M, Y, K: Byte; var R, G, B: Byte);
|
||||
begin
|
||||
R := (255 - (C - MulDiv(C, K, 255) + K));
|
||||
G := (255 - (M - MulDiv(M, K, 255) + K));
|
||||
B := (255 - (Y - MulDiv(Y, K, 255) + K));
|
||||
end;
|
||||
|
||||
procedure RGBToCMYK16(R, G, B: Word; var C, M, Y, K: Word);
|
||||
begin
|
||||
RGBToCMY16(R, G, B, C, M, Y);
|
||||
K := Min(C, Min(M, Y));
|
||||
if K = 65535 then
|
||||
begin
|
||||
C := 0;
|
||||
M := 0;
|
||||
Y := 0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
C := ClampToWord(Round((C - K) / (65535 - K) * 65535));
|
||||
M := ClampToWord(Round((M - K) / (65535 - K) * 65535));
|
||||
Y := ClampToWord(Round((Y - K) / (65535 - K) * 65535));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CMYKToRGB16(C, M, Y, K: Word; var R, G, B: Word);
|
||||
begin
|
||||
R := 65535 - (C - MulDiv(C, K, 65535) + K);
|
||||
G := 65535 - (M - MulDiv(M, K, 65535) + K);
|
||||
B := 65535 - (Y - MulDiv(Y, K, 65535) + K);
|
||||
end;
|
||||
|
||||
procedure RGBToYCoCg(R, G, B: Byte; var Y, Co, Cg: Byte);
|
||||
begin
|
||||
// C and Delphi's SHR behaviour differs for negative numbers, use div instead.
|
||||
Y := ClampToByte(( R + G shl 1 + B + 2) div 4);
|
||||
Co := ClampToByte(( R shl 1 - B shl 1 + 2) div 4 + 128);
|
||||
Cg := ClampToByte((-R + G shl 1 - B + 2) div 4 + 128);
|
||||
end;
|
||||
|
||||
procedure YCoCgToRGB(Y, Co, Cg: Byte; var R, G, B: Byte);
|
||||
var
|
||||
CoInt, CgInt: Integer;
|
||||
begin
|
||||
CoInt := Co - 128;
|
||||
CgInt := Cg - 128;
|
||||
R := ClampToByte(Y + CoInt - CgInt);
|
||||
G := ClampToByte(Y + CgInt);
|
||||
B := ClampToByte(Y - CoInt - CgInt);
|
||||
end;
|
||||
|
||||
{
|
||||
File Notes:
|
||||
|
||||
-- TODOS ----------------------------------------------------
|
||||
- nothing now
|
||||
|
||||
-- 0.26.3 Changes/Bug Fixes ---------------------------------
|
||||
- Added RGB<>YCoCg conversion functions.
|
||||
- Fixed RGB>>CMYK conversions.
|
||||
|
||||
-- 0.23 Changes/Bug Fixes -----------------------------------
|
||||
- Added RGB<>CMY(K) converion functions for 16 bit channels
|
||||
(needed by PSD loading code).
|
||||
|
||||
-- 0.21 Changes/Bug Fixes -----------------------------------
|
||||
- Added some color space conversion functions and LUTs
|
||||
(RGB/YUV/YCrCb/CMY/CMYK).
|
||||
|
||||
-- 0.17 Changes/Bug Fixes -----------------------------------
|
||||
- unit created (empty!)
|
||||
}
|
||||
|
||||
end.
|
||||
{
|
||||
$Id: ImagingColors.pas 173 2009-09-04 17:05:52Z galfar $
|
||||
Vampyre Imaging Library
|
||||
by Marek Mauder
|
||||
http://imaginglib.sourceforge.net
|
||||
|
||||
The contents of this file are used with permission, subject to the Mozilla
|
||||
Public License Version 1.1 (the "License"); you may not use this file except
|
||||
in compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/MPL-1.1.html
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
the specific language governing rights and limitations under the License.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of the
|
||||
GNU Lesser General Public License (the "LGPL License"), in which case the
|
||||
provisions of the LGPL License are applicable instead of those above.
|
||||
If you wish to allow use of your version of this file only under the terms
|
||||
of the LGPL License and not to allow others to use your version of this file
|
||||
under the MPL, indicate your decision by deleting the provisions above and
|
||||
replace them with the notice and other provisions required by the LGPL
|
||||
License. If you do not delete the provisions above, a recipient may use
|
||||
your version of this file under either the MPL or the LGPL License.
|
||||
|
||||
For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
|
||||
}
|
||||
|
||||
{ This unit contains functions for manipulating and converting color values.}
|
||||
unit ImagingColors;
|
||||
|
||||
interface
|
||||
|
||||
{$I ImagingOptions.inc}
|
||||
|
||||
uses
|
||||
SysUtils, ImagingTypes, ImagingUtility;
|
||||
|
||||
{ Converts RGB color to YUV.}
|
||||
procedure RGBToYUV(R, G, B: Byte; var Y, U, V: Byte);
|
||||
{ Converts YIV to RGB color.}
|
||||
procedure YUVToRGB(Y, U, V: Byte; var R, G, B: Byte);
|
||||
|
||||
{ Converts RGB color to YCbCr as used in JPEG.}
|
||||
procedure RGBToYCbCr(R, G, B: Byte; var Y, Cb, Cr: Byte);
|
||||
{ Converts YCbCr as used in JPEG to RGB color.}
|
||||
procedure YCbCrToRGB(Y, Cb, Cr: Byte; var R, G, B: Byte);
|
||||
{ Converts RGB color to YCbCr as used in JPEG.}
|
||||
procedure RGBToYCbCr16(R, G, B: Word; var Y, Cb, Cr: Word);
|
||||
{ Converts YCbCr as used in JPEG to RGB color.}
|
||||
procedure YCbCrToRGB16(Y, Cb, Cr: Word; var R, G, B: Word);
|
||||
|
||||
{ Converts RGB color to CMY.}
|
||||
procedure RGBToCMY(R, G, B: Byte; var C, M, Y: Byte);
|
||||
{ Converts CMY to RGB color.}
|
||||
procedure CMYToRGB(C, M, Y: Byte; var R, G, B: Byte);
|
||||
{ Converts RGB color to CMY.}
|
||||
procedure RGBToCMY16(R, G, B: Word; var C, M, Y: Word);
|
||||
{ Converts CMY to RGB color.}
|
||||
procedure CMYToRGB16(C, M, Y: Word; var R, G, B: Word);
|
||||
|
||||
{ Converts RGB color to CMYK.}
|
||||
procedure RGBToCMYK(R, G, B: Byte; var C, M, Y, K: Byte);
|
||||
{ Converts CMYK to RGB color.}
|
||||
procedure CMYKToRGB(C, M, Y, K: Byte; var R, G, B: Byte);
|
||||
{ Converts RGB color to CMYK.}
|
||||
procedure RGBToCMYK16(R, G, B: Word; var C, M, Y, K: Word);
|
||||
{ Converts CMYK to RGB color.}
|
||||
procedure CMYKToRGB16(C, M, Y, K: Word; var R, G, B: Word);
|
||||
|
||||
{ Converts RGB color to YCoCg.}
|
||||
procedure RGBToYCoCg(R, G, B: Byte; var Y, Co, Cg: Byte);
|
||||
{ Converts YCoCg to RGB color.}
|
||||
procedure YCoCgToRGB(Y, Co, Cg: Byte; var R, G, B: Byte);
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
procedure RGBToYUV(R, G, B: Byte; var Y, U, V: Byte);
|
||||
begin
|
||||
Y := ClampToByte(Round( 0.257 * R + 0.504 * G + 0.098 * B) + 16);
|
||||
V := ClampToByte(Round( 0.439 * R - 0.368 * G - 0.071 * B) + 128);
|
||||
U := ClampToByte(Round(-0.148 * R - 0.291 * G + 0.439 * B) + 128);
|
||||
end;
|
||||
|
||||
procedure YUVToRGB(Y, U, V: Byte; var R, G, B: Byte);
|
||||
var
|
||||
CY, CU, CV: LongInt;
|
||||
begin
|
||||
CY := Y - 16;
|
||||
CU := U - 128;
|
||||
CV := V - 128;
|
||||
R := ClampToByte(Round(1.164 * CY - 0.002 * CU + 1.596 * CV));
|
||||
G := ClampToByte(Round(1.164 * CY - 0.391 * CU - 0.813 * CV));
|
||||
B := ClampToByte(Round(1.164 * CY + 2.018 * CU - 0.001 * CV));
|
||||
end;
|
||||
|
||||
procedure RGBToYCbCr(R, G, B: Byte; var Y, Cb, Cr: Byte);
|
||||
begin
|
||||
Y := ClampToByte(Round( 0.29900 * R + 0.58700 * G + 0.11400 * B));
|
||||
Cb := ClampToByte(Round(-0.16874 * R - 0.33126 * G + 0.50000 * B + 128));
|
||||
Cr := ClampToByte(Round( 0.50000 * R - 0.41869 * G - 0.08131 * B + 128));
|
||||
end;
|
||||
|
||||
procedure YCbCrToRGB(Y, Cb, Cr: Byte; var R, G, B: Byte);
|
||||
begin
|
||||
R := ClampToByte(Round(Y + 1.40200 * (Cr - 128)));
|
||||
G := ClampToByte(Round(Y - 0.34414 * (Cb - 128) - 0.71414 * (Cr - 128)));
|
||||
B := ClampToByte(Round(Y + 1.77200 * (Cb - 128)));
|
||||
end;
|
||||
|
||||
procedure RGBToYCbCr16(R, G, B: Word; var Y, Cb, Cr: Word);
|
||||
begin
|
||||
Y := ClampToWord(Round( 0.29900 * R + 0.58700 * G + 0.11400 * B));
|
||||
Cb := ClampToWord(Round(-0.16874 * R - 0.33126 * G + 0.50000 * B + 32768));
|
||||
Cr := ClampToWord(Round( 0.50000 * R - 0.41869 * G - 0.08131 * B + 32768));
|
||||
end;
|
||||
|
||||
procedure YCbCrToRGB16(Y, Cb, Cr: Word; var R, G, B: Word);
|
||||
begin
|
||||
R := ClampToWord(Round(Y + 1.40200 * (Cr - 32768)));
|
||||
G := ClampToWord(Round(Y - 0.34414 * (Cb - 32768) - 0.71414 * (Cr - 32768)));
|
||||
B := ClampToWord(Round(Y + 1.77200 * (Cb - 32768)));
|
||||
end;
|
||||
|
||||
procedure RGBToCMY(R, G, B: Byte; var C, M, Y: Byte);
|
||||
begin
|
||||
C := 255 - R;
|
||||
M := 255 - G;
|
||||
Y := 255 - B;
|
||||
end;
|
||||
|
||||
procedure CMYToRGB(C, M, Y: Byte; var R, G, B: Byte);
|
||||
begin
|
||||
R := 255 - C;
|
||||
G := 255 - M;
|
||||
B := 255 - Y;
|
||||
end;
|
||||
|
||||
procedure RGBToCMY16(R, G, B: Word; var C, M, Y: Word);
|
||||
begin
|
||||
C := 65535 - R;
|
||||
M := 65535 - G;
|
||||
Y := 65535 - B;
|
||||
end;
|
||||
|
||||
procedure CMYToRGB16(C, M, Y: Word; var R, G, B: Word);
|
||||
begin
|
||||
R := 65535 - C;
|
||||
G := 65535 - M;
|
||||
B := 65535 - Y;
|
||||
end;
|
||||
|
||||
procedure RGBToCMYK(R, G, B: Byte; var C, M, Y, K: Byte);
|
||||
begin
|
||||
RGBToCMY(R, G, B, C, M, Y);
|
||||
K := Min(C, Min(M, Y));
|
||||
if K = 255 then
|
||||
begin
|
||||
C := 0;
|
||||
M := 0;
|
||||
Y := 0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
C := ClampToByte(Round((C - K) / (255 - K) * 255));
|
||||
M := ClampToByte(Round((M - K) / (255 - K) * 255));
|
||||
Y := ClampToByte(Round((Y - K) / (255 - K) * 255));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CMYKToRGB(C, M, Y, K: Byte; var R, G, B: Byte);
|
||||
begin
|
||||
R := (255 - (C - MulDiv(C, K, 255) + K));
|
||||
G := (255 - (M - MulDiv(M, K, 255) + K));
|
||||
B := (255 - (Y - MulDiv(Y, K, 255) + K));
|
||||
end;
|
||||
|
||||
procedure RGBToCMYK16(R, G, B: Word; var C, M, Y, K: Word);
|
||||
begin
|
||||
RGBToCMY16(R, G, B, C, M, Y);
|
||||
K := Min(C, Min(M, Y));
|
||||
if K = 65535 then
|
||||
begin
|
||||
C := 0;
|
||||
M := 0;
|
||||
Y := 0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
C := ClampToWord(Round((C - K) / (65535 - K) * 65535));
|
||||
M := ClampToWord(Round((M - K) / (65535 - K) * 65535));
|
||||
Y := ClampToWord(Round((Y - K) / (65535 - K) * 65535));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CMYKToRGB16(C, M, Y, K: Word; var R, G, B: Word);
|
||||
begin
|
||||
R := 65535 - (C - MulDiv(C, K, 65535) + K);
|
||||
G := 65535 - (M - MulDiv(M, K, 65535) + K);
|
||||
B := 65535 - (Y - MulDiv(Y, K, 65535) + K);
|
||||
end;
|
||||
|
||||
procedure RGBToYCoCg(R, G, B: Byte; var Y, Co, Cg: Byte);
|
||||
begin
|
||||
// C and Delphi's SHR behaviour differs for negative numbers, use div instead.
|
||||
Y := ClampToByte(( R + G shl 1 + B + 2) div 4);
|
||||
Co := ClampToByte(( R shl 1 - B shl 1 + 2) div 4 + 128);
|
||||
Cg := ClampToByte((-R + G shl 1 - B + 2) div 4 + 128);
|
||||
end;
|
||||
|
||||
procedure YCoCgToRGB(Y, Co, Cg: Byte; var R, G, B: Byte);
|
||||
var
|
||||
CoInt, CgInt: Integer;
|
||||
begin
|
||||
CoInt := Co - 128;
|
||||
CgInt := Cg - 128;
|
||||
R := ClampToByte(Y + CoInt - CgInt);
|
||||
G := ClampToByte(Y + CgInt);
|
||||
B := ClampToByte(Y - CoInt - CgInt);
|
||||
end;
|
||||
|
||||
{
|
||||
File Notes:
|
||||
|
||||
-- TODOS ----------------------------------------------------
|
||||
- nothing now
|
||||
|
||||
-- 0.26.3 Changes/Bug Fixes ---------------------------------
|
||||
- Added RGB<>YCoCg conversion functions.
|
||||
- Fixed RGB>>CMYK conversions.
|
||||
|
||||
-- 0.23 Changes/Bug Fixes -----------------------------------
|
||||
- Added RGB<>CMY(K) converion functions for 16 bit channels
|
||||
(needed by PSD loading code).
|
||||
|
||||
-- 0.21 Changes/Bug Fixes -----------------------------------
|
||||
- Added some color space conversion functions and LUTs
|
||||
(RGB/YUV/YCrCb/CMY/CMYK).
|
||||
|
||||
-- 0.17 Changes/Bug Fixes -----------------------------------
|
||||
- unit created (empty!)
|
||||
}
|
||||
|
||||
end.
|
||||
|
||||
@@ -336,7 +336,7 @@ implementation
|
||||
uses
|
||||
{$IF Defined(LCL)}
|
||||
{$IF Defined(LCLGTK2)}
|
||||
GLib2, GDK2, GTK2, GTK2Def, GTK2Proc,
|
||||
GLib2, GDK2, GTK2, GTKDef, GTKProc,
|
||||
{$ELSEIF Defined(LCLGTK)}
|
||||
GDK, GTK, GTKDef, GTKProc,
|
||||
{$IFEND}
|
||||
|
||||
+864
-864
File diff suppressed because it is too large
Load Diff
+891
-891
File diff suppressed because it is too large
Load Diff
+4288
-4288
File diff suppressed because it is too large
Load Diff
+1239
-1239
File diff suppressed because it is too large
Load Diff
+574
-574
File diff suppressed because it is too large
Load Diff
+597
-606
File diff suppressed because it is too large
Load Diff
+2573
-2573
File diff suppressed because it is too large
Load Diff
@@ -83,14 +83,6 @@
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
|
||||
{$IF (Defined(DCC) and (CompilerVersion >= 18.5))}
|
||||
{$IFDEF RELEASE}
|
||||
{$UNDEF DEBUG} // If we are using Delphi 2007+ where you can set
|
||||
// DEBUG/RELEASE mode in project options and RELEASE
|
||||
// is currently set we undef DEBUG mode
|
||||
{$ENDIF}
|
||||
{$IFEND}
|
||||
|
||||
{$IF Defined(IMAGING_DEBUG)}
|
||||
{$ASSERTIONS ON}
|
||||
{$DEBUGINFO ON}
|
||||
@@ -128,18 +120,13 @@
|
||||
|
||||
// Define if compiler supports inlining of functions and procedures
|
||||
// Note that FPC inline support crashed in older versions (1.9.8)
|
||||
{$IF (Defined(DCC) and (CompilerVersion >= 17)) or (Defined(FPC) and Defined(CPU86))}
|
||||
{$IF (Defined(FPC) and Defined(CPU86))}
|
||||
{$DEFINE HAS_INLINE}
|
||||
{$IFEND}
|
||||
|
||||
// Define if compiler supports advanced records with methods
|
||||
{$IF (Defined(DCC) and (CompilerVersion >= 18)) }
|
||||
{$DEFINE HAS_ADVANCED_RECORDS}
|
||||
{$IFEND}
|
||||
|
||||
// Define if compiler supports operator overloading
|
||||
// (unfortunately Delphi and FPC operator overloaing is not compatible)
|
||||
{$IF (Defined(DCC) and (CompilerVersion >= 18)) or Defined(FPC)}
|
||||
{$IF Defined(FPC)}
|
||||
{$DEFINE HAS_OPERATOR_OVERLOADING}
|
||||
{$IFEND}
|
||||
|
||||
|
||||
+1020
-1020
File diff suppressed because it is too large
Load Diff
+623
-623
File diff suppressed because it is too large
Load Diff
+499
-499
@@ -1,499 +1,499 @@
|
||||
{
|
||||
$Id: ImagingTypes.pas 171 2009-09-02 01:34:19Z galfar $
|
||||
Vampyre Imaging Library
|
||||
by Marek Mauder
|
||||
http://imaginglib.sourceforge.net
|
||||
|
||||
The contents of this file are used with permission, subject to the Mozilla
|
||||
Public License Version 1.1 (the "License"); you may not use this file except
|
||||
in compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/MPL-1.1.html
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
the specific language governing rights and limitations under the License.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of the
|
||||
GNU Lesser General Public License (the "LGPL License"), in which case the
|
||||
provisions of the LGPL License are applicable instead of those above.
|
||||
If you wish to allow use of your version of this file only under the terms
|
||||
of the LGPL License and not to allow others to use your version of this file
|
||||
under the MPL, indicate your decision by deleting the provisions above and
|
||||
replace them with the notice and other provisions required by the LGPL
|
||||
License. If you do not delete the provisions above, a recipient may use
|
||||
your version of this file under either the MPL or the LGPL License.
|
||||
|
||||
For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
|
||||
}
|
||||
|
||||
{ This unit contains basic types and constants used by Imaging library.}
|
||||
unit ImagingTypes;
|
||||
|
||||
{$I ImagingOptions.inc}
|
||||
|
||||
interface
|
||||
|
||||
const
|
||||
{ Current Major version of Imaging.}
|
||||
ImagingVersionMajor = 0;
|
||||
{ Current Minor version of Imaging.}
|
||||
ImagingVersionMinor = 26;
|
||||
{ Current patch of Imaging.}
|
||||
ImagingVersionPatch = 4;
|
||||
|
||||
{ Imaging Option Ids whose values can be set/get by SetOption/
|
||||
GetOption functions.}
|
||||
|
||||
{ Defines Jpeg compression quality, ranges from 1 (ugly/small) to 100 (nice/large).
|
||||
Default value is 90.}
|
||||
ImagingJpegQuality = 10;
|
||||
{ Specifies whether Jpeg images are saved in progressive format,
|
||||
can be 0 or 1. Default value is 0.}
|
||||
ImagingJpegProgressive = 11;
|
||||
|
||||
{ Specifies whether Windows Bitmaps are saved using RLE compression
|
||||
(only for 1/4/8 bit images), can be 0 or 1. Default value is 1.}
|
||||
ImagingBitmapRLE = 12;
|
||||
|
||||
{ Specifies whether Targa images are saved using RLE compression,
|
||||
can be 0 or 1. Default value is 0.}
|
||||
ImagingTargaRLE = 13;
|
||||
|
||||
{ Value of this option is non-zero if last loaded DDS file was cube map.}
|
||||
ImagingDDSLoadedCubeMap = 14;
|
||||
{ Value of this option is non-zero if last loaded DDS file was volume texture.}
|
||||
ImagingDDSLoadedVolume = 15;
|
||||
{ Value of this option is number of mipmap levels of last loaded DDS image.}
|
||||
ImagingDDSLoadedMipMapCount = 16;
|
||||
{ Value of this option is depth (slices of volume texture or faces of
|
||||
cube map) of last loaded DDS image.}
|
||||
ImagingDDSLoadedDepth = 17;
|
||||
{ If it is non-zero next saved DDS file should be stored as cube map.}
|
||||
ImagingDDSSaveCubeMap = 18;
|
||||
{ If it is non-zero next saved DDS file should be stored as volume texture.}
|
||||
ImagingDDSSaveVolume = 19;
|
||||
{ Sets the number of mipmaps which should be stored in the next saved DDS file.
|
||||
Only applies to cube maps and volumes, ordinary 2D textures save all
|
||||
levels present in input.}
|
||||
ImagingDDSSaveMipMapCount = 20;
|
||||
{ Sets the depth (slices of volume texture or faces of cube map)
|
||||
of the next saved DDS file.}
|
||||
ImagingDDSSaveDepth = 21;
|
||||
|
||||
{ Sets precompression filter used when saving PNG images. Allowed values
|
||||
are: 0 (none), 1 (sub), 2 (up), 3 (average), 4 (paeth),
|
||||
5 (use 0 for indexed/gray images and 4 for RGB/ARGB images),
|
||||
6 (adaptive filtering - use best filter for each scanline - very slow).
|
||||
Note that filters 3 and 4 are much slower than filters 1 and 2.
|
||||
Default value is 5.}
|
||||
ImagingPNGPreFilter = 25;
|
||||
{ Sets ZLib compression level used when saving PNG images.
|
||||
Allowed values are in range 0 (no compresstion) to 9 (best compression).
|
||||
Default value is 5.}
|
||||
ImagingPNGCompressLevel = 26;
|
||||
{ Boolean option that specifies whether PNG images with more frames (APNG format)
|
||||
are animated by Imaging (according to frame disposal/blend methods) or just
|
||||
raw frames are loaded and sent to user (if you want to animate APNG yourself).
|
||||
Default value is 1.}
|
||||
ImagingPNGLoadAnimated = 27;
|
||||
|
||||
{ Specifies whether MNG animation frames are saved with lossy or lossless
|
||||
compression. Lossless frames are saved as PNG images and lossy frames are
|
||||
saved as JNG images. Allowed values are 0 (False) and 1 (True).
|
||||
Default value is 0.}
|
||||
ImagingMNGLossyCompression = 28;
|
||||
{ Defines whether alpha channel of lossy compressed MNG frames
|
||||
(when ImagingMNGLossyCompression is 1) is lossy compressed too.
|
||||
Allowed values are 0 (False) and 1 (True). Default value is 0.}
|
||||
ImagingMNGLossyAlpha = 29;
|
||||
{ Sets precompression filter used when saving MNG frames as PNG images.
|
||||
For details look at ImagingPNGPreFilter.}
|
||||
ImagingMNGPreFilter = 30;
|
||||
{ Sets ZLib compression level used when saving MNG frames as PNG images.
|
||||
For details look at ImagingPNGCompressLevel.}
|
||||
ImagingMNGCompressLevel = 31;
|
||||
{ Specifies compression quality used when saving MNG frames as JNG images.
|
||||
For details look at ImagingJpegQuality.}
|
||||
ImagingMNGQuality = 32;
|
||||
{ Specifies whether images are saved in progressive format when saving MNG
|
||||
frames as JNG images. For details look at ImagingJpegProgressive.}
|
||||
ImagingMNGProgressive = 33;
|
||||
|
||||
{ Specifies whether alpha channels of JNG images are lossy compressed.
|
||||
Allowed values are 0 (False) and 1 (True). Default value is 0.}
|
||||
ImagingJNGLossyAlpha = 40;
|
||||
{ Sets precompression filter used when saving lossless alpha channels.
|
||||
For details look at ImagingPNGPreFilter.}
|
||||
ImagingJNGAlphaPreFilter = 41;
|
||||
{ Sets ZLib compression level used when saving lossless alpha channels.
|
||||
For details look at ImagingPNGCompressLevel.}
|
||||
ImagingJNGAlphaCompressLevel = 42;
|
||||
{ Defines compression quality used when saving JNG images (and lossy alpha channels).
|
||||
For details look at ImagingJpegQuality.}
|
||||
ImagingJNGQuality = 43;
|
||||
{ Specifies whether JNG images are saved in progressive format.
|
||||
For details look at ImagingJpegProgressive.}
|
||||
ImagingJNGProgressive = 44;
|
||||
{ Specifies whether PGM files are stored in text or in binary format.
|
||||
Allowed values are 0 (store as text - very! large files) and 1 (save binary).
|
||||
Default value is 1.}
|
||||
ImagingPGMSaveBinary = 50;
|
||||
{ Specifies whether PPM files are stored in text or in binary format.
|
||||
Allowed values are 0 (store as text - very! large files) and 1 (save binary).
|
||||
Default value is 1.}
|
||||
ImagingPPMSaveBinary = 51;
|
||||
{ Boolean option that specifies whether GIF images with more frames
|
||||
are animated by Imaging (according to frame disposal methods) or just
|
||||
raw frames are loaded and sent to user (if you want to animate GIF yourself).
|
||||
Default value is 1.
|
||||
Raw frames are 256 color indexed images (ifIndex8), whereas
|
||||
animated frames are always in 32bit ifA8R8G8B8 format (simplifies animating).}
|
||||
ImagingGIFLoadAnimated = 56;
|
||||
|
||||
{ This option is used when reducing number of colors used in
|
||||
image (mainly when converting from ARGB image to indexed
|
||||
format). Mask is 'anded' (bitwise AND) with every pixel's
|
||||
channel value when creating color histogram. If $FF is used
|
||||
all 8bits of color channels are used which can result in very
|
||||
slow proccessing of large images with many colors so you can
|
||||
use lower masks to speed it up (FC, F8 and F0 are good
|
||||
choices). Allowed values are in range <0, $FF> and default is
|
||||
$FE. }
|
||||
ImagingColorReductionMask = 128;
|
||||
{ This option can be used to override image data format during image
|
||||
loading. If set to format different from ifUnknown all loaded images
|
||||
are automaticaly converted to this format. Useful when you have
|
||||
many files in various formats but you want them all in one format for
|
||||
further proccessing. Allowed values are in
|
||||
range <Ord(Low(TImageFormat)), Ord(High(TImageFormat))> and
|
||||
default value is ifUnknown.}
|
||||
ImagingLoadOverrideFormat = 129;
|
||||
{ This option can be used to override image data format during image
|
||||
saving. If set to format different from ifUnknown all images
|
||||
to be saved are automaticaly internaly converted to this format.
|
||||
Note that image file formats support only a subset of Imaging data formats
|
||||
so final saved file may in different format than this override.
|
||||
Allowed values are in range <Ord(Low(TImageFormat)), Ord(High(TImageFormat))>
|
||||
and default value is ifUnknown.}
|
||||
ImagingSaveOverrideFormat = 130;
|
||||
{ Specifies resampling filter used when generating mipmaps. It is used
|
||||
in GenerateMipMaps low level function and Direct3D and OpenGL extensions.
|
||||
Allowed values are in range
|
||||
<Ord(Low(ImagingFormats.TSamplingFilter)), Ord(High(ImagingFormats.TSamplingFilter))>
|
||||
and default value is 1 (linear filter).}
|
||||
ImagingMipMapFilter = 131;
|
||||
|
||||
{ Returned by GetOption if given Option Id is invalid.}
|
||||
InvalidOption = -$7FFFFFFF;
|
||||
|
||||
{ Indices that can be used to access channel values in array parts
|
||||
of structures like TColor32Rec. Note that this order can be
|
||||
used only for ARGB images. For ABGR image you must swap Red and Blue.}
|
||||
ChannelBlue = 0;
|
||||
ChannelGreen = 1;
|
||||
ChannelRed = 2;
|
||||
ChannelAlpha = 3;
|
||||
|
||||
type
|
||||
{ Enum defining image data format. In formats with more channels,
|
||||
first channel after "if" is stored in the most significant bits and channel
|
||||
before end is stored in the least significant.}
|
||||
TImageFormat = (
|
||||
ifUnknown = 0,
|
||||
ifDefault = 1,
|
||||
{ Indexed formats using palette.}
|
||||
ifIndex8 = 10,
|
||||
{ Grayscale/Luminance formats.}
|
||||
ifGray8 = 40,
|
||||
ifA8Gray8 = 41,
|
||||
ifGray16 = 42,
|
||||
ifGray32 = 43,
|
||||
ifGray64 = 44,
|
||||
ifA16Gray16 = 45,
|
||||
{ ARGB formats.}
|
||||
ifX5R1G1B1 = 80,
|
||||
ifR3G3B2 = 81,
|
||||
ifR5G6B5 = 82,
|
||||
ifA1R5G5B5 = 83,
|
||||
ifA4R4G4B4 = 84,
|
||||
ifX1R5G5B5 = 85,
|
||||
ifX4R4G4B4 = 86,
|
||||
ifR8G8B8 = 87,
|
||||
ifA8R8G8B8 = 88,
|
||||
ifX8R8G8B8 = 89,
|
||||
ifR16G16B16 = 90,
|
||||
ifA16R16G16B16 = 91,
|
||||
ifB16G16R16 = 92,
|
||||
ifA16B16G16R16 = 93,
|
||||
{ Floating point formats.}
|
||||
ifR32F = 170,
|
||||
ifA32R32G32B32F = 171,
|
||||
ifA32B32G32R32F = 172,
|
||||
ifR16F = 173,
|
||||
ifA16R16G16B16F = 174,
|
||||
ifA16B16G16R16F = 175,
|
||||
{ Special formats.}
|
||||
ifDXT1 = 220,
|
||||
ifDXT3 = 221,
|
||||
ifDXT5 = 222,
|
||||
ifBTC = 223,
|
||||
ifATI1N = 224,
|
||||
ifATI2N = 225);
|
||||
|
||||
{ Color value for 32 bit images.}
|
||||
TColor32 = LongWord;
|
||||
PColor32 = ^TColor32;
|
||||
|
||||
{ Color value for 64 bit images.}
|
||||
TColor64 = type Int64;
|
||||
PColor64 = ^TColor64;
|
||||
|
||||
{ Color record for 24 bit images, which allows access to individual color
|
||||
channels.}
|
||||
TColor24Rec = packed record
|
||||
case LongInt of
|
||||
0: (B, G, R: Byte);
|
||||
1: (Channels: array[0..2] of Byte);
|
||||
end;
|
||||
PColor24Rec = ^TColor24Rec;
|
||||
TColor24RecArray = array[0..MaxInt div SizeOf(TColor24Rec) - 1] of TColor24Rec;
|
||||
PColor24RecArray = ^TColor24RecArray;
|
||||
|
||||
{ Color record for 32 bit images, which allows access to individual color
|
||||
channels.}
|
||||
TColor32Rec = packed record
|
||||
case LongInt of
|
||||
0: (Color: TColor32);
|
||||
1: (B, G, R, A: Byte);
|
||||
2: (Channels: array[0..3] of Byte);
|
||||
3: (Color24Rec: TColor24Rec);
|
||||
end;
|
||||
PColor32Rec = ^TColor32Rec;
|
||||
TColor32RecArray = array[0..MaxInt div SizeOf(TColor32Rec) - 1] of TColor32Rec;
|
||||
PColor32RecArray = ^TColor32RecArray;
|
||||
|
||||
{ Color record for 48 bit images, which allows access to individual color
|
||||
channels.}
|
||||
TColor48Rec = packed record
|
||||
case LongInt of
|
||||
0: (B, G, R: Word);
|
||||
1: (Channels: array[0..2] of Word);
|
||||
end;
|
||||
PColor48Rec = ^TColor48Rec;
|
||||
TColor48RecArray = array[0..MaxInt div SizeOf(TColor48Rec) - 1] of TColor48Rec;
|
||||
PColor48RecArray = ^TColor48RecArray;
|
||||
|
||||
{ Color record for 64 bit images, which allows access to individual color
|
||||
channels.}
|
||||
TColor64Rec = packed record
|
||||
case LongInt of
|
||||
0: (Color: TColor64);
|
||||
1: (B, G, R, A: Word);
|
||||
2: (Channels: array[0..3] of Word);
|
||||
3: (Color48Rec: TColor48Rec);
|
||||
end;
|
||||
PColor64Rec = ^TColor64Rec;
|
||||
TColor64RecArray = array[0..MaxInt div SizeOf(TColor64Rec) - 1] of TColor64Rec;
|
||||
PColor64RecArray = ^TColor64RecArray;
|
||||
|
||||
{ Color record for 128 bit floating point images, which allows access to
|
||||
individual color channels.}
|
||||
TColorFPRec = packed record
|
||||
case LongInt of
|
||||
0: (B, G, R, A: Single);
|
||||
1: (Channels: array[0..3] of Single);
|
||||
end;
|
||||
PColorFPRec = ^TColorFPRec;
|
||||
TColorFPRecArray = array[0..MaxInt div SizeOf(TColorFPRec) - 1] of TColorFPRec;
|
||||
PColorFPRecArray = ^TColorFPRecArray;
|
||||
|
||||
{ 16 bit floating-point value. It has 1 sign bit, 5 exponent bits,
|
||||
and 10 mantissa bits.}
|
||||
THalfFloat = type Word;
|
||||
PHalfFloat = ^THalfFloat;
|
||||
|
||||
{ Color record for 64 bit floating point images, which allows access to
|
||||
individual color channels.}
|
||||
TColorHFRec = packed record
|
||||
case LongInt of
|
||||
0: (B, G, R, A: THalfFloat);
|
||||
1: (Channels: array[0..3] of THalfFloat);
|
||||
end;
|
||||
PColorHFRec = ^TColorHFRec;
|
||||
TColorHFRecArray = array[0..MaxInt div SizeOf(TColorHFRec) - 1] of TColorHFRec;
|
||||
PColorHFRecArray = ^TColorHFRecArray;
|
||||
|
||||
{ Palette for indexed mode images with 32 bit colors.}
|
||||
TPalette32 = TColor32RecArray;
|
||||
TPalette32Size256 = array[0..255] of TColor32Rec;
|
||||
PPalette32 = ^TPalette32;
|
||||
|
||||
{ Palette for indexd mode images with 24 bit colors.}
|
||||
TPalette24 = TColor24RecArray;
|
||||
TPalette24Size256 = array[0..255] of TColor24Rec;
|
||||
PPalette24 = ^TPalette24;
|
||||
|
||||
{ Record that stores single image data and information describing it.}
|
||||
TImageData = packed record
|
||||
Width: LongInt; // Width of image in pixels
|
||||
Height: LongInt; // Height of image in pixels
|
||||
Format: TImageFormat; // Data format of image
|
||||
Size: LongInt; // Size of image bits in Bytes
|
||||
Bits: Pointer; // Pointer to memory containing image bits
|
||||
Palette: PPalette32; // Image palette for indexed images
|
||||
end;
|
||||
PImageData = ^TImageData;
|
||||
|
||||
{ Pixel format information used in conversions to/from 16 and 8 bit ARGB
|
||||
image formats.}
|
||||
TPixelFormatInfo = packed record
|
||||
ABitCount, RBitCount, GBitCount, BBitCount: Byte;
|
||||
ABitMask, RBitMask, GBitMask, BBitMask: LongWord;
|
||||
AShift, RShift, GShift, BShift: Byte;
|
||||
ARecDiv, RRecDiv, GRecDiv, BRecDiv: Byte;
|
||||
end;
|
||||
PPixelFormatInfo = ^TPixelFormatInfo;
|
||||
|
||||
PImageFormatInfo = ^TImageFormatInfo;
|
||||
|
||||
{ Look at TImageFormatInfo.GetPixelsSize for details.}
|
||||
TFormatGetPixelsSizeFunc = function(Format: TImageFormat; Width,
|
||||
Height: LongInt): LongInt;
|
||||
{ Look at TImageFormatInfo.CheckDimensions for details.}
|
||||
TFormatCheckDimensionsProc = procedure(Format: TImageFormat; var Width,
|
||||
Height: LongInt);
|
||||
{ Function for getting pixel colors. Native pixel is read from Image and
|
||||
then translated to 32 bit ARGB.}
|
||||
TGetPixel32Func = function(Bits: Pointer; Info: PImageFormatInfo;
|
||||
Palette: PPalette32): TColor32Rec;
|
||||
{ Function for getting pixel colors. Native pixel is read from Image and
|
||||
then translated to FP ARGB.}
|
||||
TGetPixelFPFunc = function(Bits: Pointer; Info: PImageFormatInfo;
|
||||
Palette: PPalette32): TColorFPRec;
|
||||
{ Procedure for setting pixel colors. Input 32 bit ARGB color is translated to
|
||||
native format and then written to Image.}
|
||||
TSetPixel32Proc = procedure(Bits: Pointer; Info: PImageFormatInfo;
|
||||
Palette: PPalette32;const Color: TColor32Rec);
|
||||
{ Procedure for setting pixel colors. Input FP ARGB color is translated to
|
||||
native format and then written to Image.}
|
||||
TSetPixelFPProc = procedure(Bits: Pointer; Info: PImageFormatInfo;
|
||||
Palette: PPalette32; const Color: TColorFPRec);
|
||||
|
||||
{ Additional information for each TImageFormat value.}
|
||||
TImageFormatInfo = packed record
|
||||
Format: TImageFormat; // Format described by this record
|
||||
Name: array[0..15] of Char; // Symbolic name of format
|
||||
BytesPerPixel: LongInt; // Number of bytes per pixel (note: it is
|
||||
// 0 for formats where BitsPerPixel < 8 (e.g. DXT).
|
||||
// Use GetPixelsSize function to get size of
|
||||
// image data.
|
||||
ChannelCount: LongInt; // Number of image channels (R, G, B, A, Gray)
|
||||
PaletteEntries: LongInt; // Number of palette entries
|
||||
HasGrayChannel: Boolean; // True if image has grayscale channel
|
||||
HasAlphaChannel: Boolean; // True if image has alpha channel
|
||||
IsFloatingPoint: Boolean; // True if image has floating point pixels
|
||||
UsePixelFormat: Boolean; // True if image uses pixel format
|
||||
IsRBSwapped: Boolean; // True if Red and Blue channels are swapped
|
||||
// e.g. A16B16G16R16 has IsRBSwapped True
|
||||
RBSwapFormat: TImageFormat; // Indicates supported format with swapped
|
||||
// Red and Blue channels, ifUnknown if such
|
||||
// format does not exist
|
||||
IsIndexed: Boolean; // True if image uses palette
|
||||
IsSpecial: Boolean; // True if image is in special format
|
||||
PixelFormat: PPixelFormatInfo; // Pixel format structure
|
||||
GetPixelsSize: TFormatGetPixelsSizeFunc; // Returns size in bytes of
|
||||
// Width * Height pixels of image
|
||||
CheckDimensions: TFormatCheckDimensionsProc; // some formats have limited
|
||||
// values of Width and Height. This
|
||||
// procedure checks and changes dimensions
|
||||
// to be valid for given format.
|
||||
GetPixel32: TGetPixel32Func; // 32bit ARGB pixel get function
|
||||
GetPixelFP: TGetPixelFPFunc; // FP ARGB pixel get function
|
||||
SetPixel32: TSetPixel32Proc; // 32bit ARGB pixel set procedure
|
||||
SetPixelFP: TSetPixelFPProc; // FP ARGB pixel set procedure
|
||||
SpecialNearestFormat: TImageFormat; // Regular image format used when
|
||||
// compressing/decompressing special images
|
||||
// as source/target
|
||||
end;
|
||||
|
||||
{ Handle to list of image data records.}
|
||||
TImageDataList = Pointer;
|
||||
PImageDataList = ^TImageDataList;
|
||||
|
||||
{ Handle to input/output.}
|
||||
TImagingHandle = Pointer;
|
||||
|
||||
{ Filters used in functions that resize images or their portions.}
|
||||
TResizeFilter = (
|
||||
rfNearest = 0,
|
||||
rfBilinear = 1,
|
||||
rfBicubic = 2);
|
||||
|
||||
{ Seek origin mode for IO function Seek.}
|
||||
TSeekMode = (
|
||||
smFromBeginning = 0,
|
||||
smFromCurrent = 1,
|
||||
smFromEnd = 2);
|
||||
|
||||
{ IO functions used for reading and writing images from/to input/output.}
|
||||
TOpenReadProc = function(Source: PChar): TImagingHandle; cdecl;
|
||||
TOpenWriteProc = function(Source: PChar): TImagingHandle; cdecl;
|
||||
TCloseProc = procedure(Handle: TImagingHandle); cdecl;
|
||||
TEofProc = function(Handle: TImagingHandle): Boolean; cdecl;
|
||||
TSeekProc = function(Handle: TImagingHandle; Offset: LongInt; Mode: TSeekMode): LongInt; cdecl;
|
||||
TTellProc = function(Handle: TImagingHandle): LongInt; cdecl;
|
||||
TReadProc = function(Handle: TImagingHandle; Buffer: Pointer; Count: LongInt): LongInt; cdecl;
|
||||
TWriteProc = function(Handle: TImagingHandle; Buffer: Pointer; Count: LongInt): LongInt; cdecl;
|
||||
|
||||
implementation
|
||||
|
||||
{
|
||||
File Notes:
|
||||
|
||||
-- TODOS ----------------------------------------------------
|
||||
- add lookup tables to pixel formats for fast conversions
|
||||
|
||||
-- 0.24.3 Changes/Bug Fixes ---------------------------------
|
||||
- Added ifATI1N and ifATI2N image data formats.
|
||||
|
||||
-- 0.23 Changes/Bug Fixes -----------------------------------
|
||||
- Added ifBTC image format and SpecialNearestFormat field
|
||||
to TImageFormatInfo.
|
||||
|
||||
-- 0.21 Changes/Bug Fixes -----------------------------------
|
||||
- Added option constants for PGM and PPM file formats.
|
||||
- Added TPalette32Size256 and TPalette24Size256 types.
|
||||
|
||||
-- 0.19 Changes/Bug Fixes -----------------------------------
|
||||
- added ImagingVersionPatch constant so bug fix only releases
|
||||
can be distinguished from ordinary major/minor releases
|
||||
- renamed TPixelFormat to TPixelFormatInfo to avoid name collisions
|
||||
with Graphics.TPixelFormat
|
||||
- added new image data formats: ifR16F, ifA16R16G16B16F,
|
||||
ifA16B16G16R16F
|
||||
- added pixel get/set function pointers to TImageFormatInfo
|
||||
- added 16bit half float type and color record
|
||||
- renamed TColorFRec to TColorFPRec (and related types too)
|
||||
|
||||
-- 0.17 Changes/Bug Fixes -----------------------------------
|
||||
- added option ImagingMipMapFilter which now controls resampling filter
|
||||
used when generating mipmaps
|
||||
- added TResizeFilter type
|
||||
- added ChannelCount to TImageFormatInfo
|
||||
- added new option constants for MNG and JNG images
|
||||
|
||||
-- 0.15 Changes/Bug Fixes -----------------------------------
|
||||
- added RBSwapFormat to TImageFormatInfo for faster conversions
|
||||
between swapped formats (it just calls SwapChannels now if
|
||||
RBSwapFormat is not ifUnknown)
|
||||
- moved TImageFormatInfo and required types from Imaging unit
|
||||
here, removed TImageFormatShortInfo
|
||||
- added new options: ImagingLoadOverrideFormat, ImagingSaveOverrideFormat
|
||||
|
||||
-- 0.13 Changes/Bug Fixes -----------------------------------
|
||||
- new ImagingColorReductionMask option added
|
||||
- new image format added: ifA16Gray16
|
||||
|
||||
}
|
||||
|
||||
end.
|
||||
{
|
||||
$Id: ImagingTypes.pas 171 2009-09-02 01:34:19Z galfar $
|
||||
Vampyre Imaging Library
|
||||
by Marek Mauder
|
||||
http://imaginglib.sourceforge.net
|
||||
|
||||
The contents of this file are used with permission, subject to the Mozilla
|
||||
Public License Version 1.1 (the "License"); you may not use this file except
|
||||
in compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/MPL-1.1.html
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
the specific language governing rights and limitations under the License.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of the
|
||||
GNU Lesser General Public License (the "LGPL License"), in which case the
|
||||
provisions of the LGPL License are applicable instead of those above.
|
||||
If you wish to allow use of your version of this file only under the terms
|
||||
of the LGPL License and not to allow others to use your version of this file
|
||||
under the MPL, indicate your decision by deleting the provisions above and
|
||||
replace them with the notice and other provisions required by the LGPL
|
||||
License. If you do not delete the provisions above, a recipient may use
|
||||
your version of this file under either the MPL or the LGPL License.
|
||||
|
||||
For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
|
||||
}
|
||||
|
||||
{ This unit contains basic types and constants used by Imaging library.}
|
||||
unit ImagingTypes;
|
||||
|
||||
{$I ImagingOptions.inc}
|
||||
|
||||
interface
|
||||
|
||||
const
|
||||
{ Current Major version of Imaging.}
|
||||
ImagingVersionMajor = 0;
|
||||
{ Current Minor version of Imaging.}
|
||||
ImagingVersionMinor = 26;
|
||||
{ Current patch of Imaging.}
|
||||
ImagingVersionPatch = 4;
|
||||
|
||||
{ Imaging Option Ids whose values can be set/get by SetOption/
|
||||
GetOption functions.}
|
||||
|
||||
{ Defines Jpeg compression quality, ranges from 1 (ugly/small) to 100 (nice/large).
|
||||
Default value is 90.}
|
||||
ImagingJpegQuality = 10;
|
||||
{ Specifies whether Jpeg images are saved in progressive format,
|
||||
can be 0 or 1. Default value is 0.}
|
||||
ImagingJpegProgressive = 11;
|
||||
|
||||
{ Specifies whether Windows Bitmaps are saved using RLE compression
|
||||
(only for 1/4/8 bit images), can be 0 or 1. Default value is 1.}
|
||||
ImagingBitmapRLE = 12;
|
||||
|
||||
{ Specifies whether Targa images are saved using RLE compression,
|
||||
can be 0 or 1. Default value is 0.}
|
||||
ImagingTargaRLE = 13;
|
||||
|
||||
{ Value of this option is non-zero if last loaded DDS file was cube map.}
|
||||
ImagingDDSLoadedCubeMap = 14;
|
||||
{ Value of this option is non-zero if last loaded DDS file was volume texture.}
|
||||
ImagingDDSLoadedVolume = 15;
|
||||
{ Value of this option is number of mipmap levels of last loaded DDS image.}
|
||||
ImagingDDSLoadedMipMapCount = 16;
|
||||
{ Value of this option is depth (slices of volume texture or faces of
|
||||
cube map) of last loaded DDS image.}
|
||||
ImagingDDSLoadedDepth = 17;
|
||||
{ If it is non-zero next saved DDS file should be stored as cube map.}
|
||||
ImagingDDSSaveCubeMap = 18;
|
||||
{ If it is non-zero next saved DDS file should be stored as volume texture.}
|
||||
ImagingDDSSaveVolume = 19;
|
||||
{ Sets the number of mipmaps which should be stored in the next saved DDS file.
|
||||
Only applies to cube maps and volumes, ordinary 2D textures save all
|
||||
levels present in input.}
|
||||
ImagingDDSSaveMipMapCount = 20;
|
||||
{ Sets the depth (slices of volume texture or faces of cube map)
|
||||
of the next saved DDS file.}
|
||||
ImagingDDSSaveDepth = 21;
|
||||
|
||||
{ Sets precompression filter used when saving PNG images. Allowed values
|
||||
are: 0 (none), 1 (sub), 2 (up), 3 (average), 4 (paeth),
|
||||
5 (use 0 for indexed/gray images and 4 for RGB/ARGB images),
|
||||
6 (adaptive filtering - use best filter for each scanline - very slow).
|
||||
Note that filters 3 and 4 are much slower than filters 1 and 2.
|
||||
Default value is 5.}
|
||||
ImagingPNGPreFilter = 25;
|
||||
{ Sets ZLib compression level used when saving PNG images.
|
||||
Allowed values are in range 0 (no compresstion) to 9 (best compression).
|
||||
Default value is 5.}
|
||||
ImagingPNGCompressLevel = 26;
|
||||
{ Boolean option that specifies whether PNG images with more frames (APNG format)
|
||||
are animated by Imaging (according to frame disposal/blend methods) or just
|
||||
raw frames are loaded and sent to user (if you want to animate APNG yourself).
|
||||
Default value is 1.}
|
||||
ImagingPNGLoadAnimated = 27;
|
||||
|
||||
{ Specifies whether MNG animation frames are saved with lossy or lossless
|
||||
compression. Lossless frames are saved as PNG images and lossy frames are
|
||||
saved as JNG images. Allowed values are 0 (False) and 1 (True).
|
||||
Default value is 0.}
|
||||
ImagingMNGLossyCompression = 28;
|
||||
{ Defines whether alpha channel of lossy compressed MNG frames
|
||||
(when ImagingMNGLossyCompression is 1) is lossy compressed too.
|
||||
Allowed values are 0 (False) and 1 (True). Default value is 0.}
|
||||
ImagingMNGLossyAlpha = 29;
|
||||
{ Sets precompression filter used when saving MNG frames as PNG images.
|
||||
For details look at ImagingPNGPreFilter.}
|
||||
ImagingMNGPreFilter = 30;
|
||||
{ Sets ZLib compression level used when saving MNG frames as PNG images.
|
||||
For details look at ImagingPNGCompressLevel.}
|
||||
ImagingMNGCompressLevel = 31;
|
||||
{ Specifies compression quality used when saving MNG frames as JNG images.
|
||||
For details look at ImagingJpegQuality.}
|
||||
ImagingMNGQuality = 32;
|
||||
{ Specifies whether images are saved in progressive format when saving MNG
|
||||
frames as JNG images. For details look at ImagingJpegProgressive.}
|
||||
ImagingMNGProgressive = 33;
|
||||
|
||||
{ Specifies whether alpha channels of JNG images are lossy compressed.
|
||||
Allowed values are 0 (False) and 1 (True). Default value is 0.}
|
||||
ImagingJNGLossyAlpha = 40;
|
||||
{ Sets precompression filter used when saving lossless alpha channels.
|
||||
For details look at ImagingPNGPreFilter.}
|
||||
ImagingJNGAlphaPreFilter = 41;
|
||||
{ Sets ZLib compression level used when saving lossless alpha channels.
|
||||
For details look at ImagingPNGCompressLevel.}
|
||||
ImagingJNGAlphaCompressLevel = 42;
|
||||
{ Defines compression quality used when saving JNG images (and lossy alpha channels).
|
||||
For details look at ImagingJpegQuality.}
|
||||
ImagingJNGQuality = 43;
|
||||
{ Specifies whether JNG images are saved in progressive format.
|
||||
For details look at ImagingJpegProgressive.}
|
||||
ImagingJNGProgressive = 44;
|
||||
{ Specifies whether PGM files are stored in text or in binary format.
|
||||
Allowed values are 0 (store as text - very! large files) and 1 (save binary).
|
||||
Default value is 1.}
|
||||
ImagingPGMSaveBinary = 50;
|
||||
{ Specifies whether PPM files are stored in text or in binary format.
|
||||
Allowed values are 0 (store as text - very! large files) and 1 (save binary).
|
||||
Default value is 1.}
|
||||
ImagingPPMSaveBinary = 51;
|
||||
{ Boolean option that specifies whether GIF images with more frames
|
||||
are animated by Imaging (according to frame disposal methods) or just
|
||||
raw frames are loaded and sent to user (if you want to animate GIF yourself).
|
||||
Default value is 1.
|
||||
Raw frames are 256 color indexed images (ifIndex8), whereas
|
||||
animated frames are always in 32bit ifA8R8G8B8 format (simplifies animating).}
|
||||
ImagingGIFLoadAnimated = 56;
|
||||
|
||||
{ This option is used when reducing number of colors used in
|
||||
image (mainly when converting from ARGB image to indexed
|
||||
format). Mask is 'anded' (bitwise AND) with every pixel's
|
||||
channel value when creating color histogram. If $FF is used
|
||||
all 8bits of color channels are used which can result in very
|
||||
slow proccessing of large images with many colors so you can
|
||||
use lower masks to speed it up (FC, F8 and F0 are good
|
||||
choices). Allowed values are in range <0, $FF> and default is
|
||||
$FE. }
|
||||
ImagingColorReductionMask = 128;
|
||||
{ This option can be used to override image data format during image
|
||||
loading. If set to format different from ifUnknown all loaded images
|
||||
are automaticaly converted to this format. Useful when you have
|
||||
many files in various formats but you want them all in one format for
|
||||
further proccessing. Allowed values are in
|
||||
range <Ord(Low(TImageFormat)), Ord(High(TImageFormat))> and
|
||||
default value is ifUnknown.}
|
||||
ImagingLoadOverrideFormat = 129;
|
||||
{ This option can be used to override image data format during image
|
||||
saving. If set to format different from ifUnknown all images
|
||||
to be saved are automaticaly internaly converted to this format.
|
||||
Note that image file formats support only a subset of Imaging data formats
|
||||
so final saved file may in different format than this override.
|
||||
Allowed values are in range <Ord(Low(TImageFormat)), Ord(High(TImageFormat))>
|
||||
and default value is ifUnknown.}
|
||||
ImagingSaveOverrideFormat = 130;
|
||||
{ Specifies resampling filter used when generating mipmaps. It is used
|
||||
in GenerateMipMaps low level function and Direct3D and OpenGL extensions.
|
||||
Allowed values are in range
|
||||
<Ord(Low(ImagingFormats.TSamplingFilter)), Ord(High(ImagingFormats.TSamplingFilter))>
|
||||
and default value is 1 (linear filter).}
|
||||
ImagingMipMapFilter = 131;
|
||||
|
||||
{ Returned by GetOption if given Option Id is invalid.}
|
||||
InvalidOption = -$7FFFFFFF;
|
||||
|
||||
{ Indices that can be used to access channel values in array parts
|
||||
of structures like TColor32Rec. Note that this order can be
|
||||
used only for ARGB images. For ABGR image you must swap Red and Blue.}
|
||||
ChannelBlue = 0;
|
||||
ChannelGreen = 1;
|
||||
ChannelRed = 2;
|
||||
ChannelAlpha = 3;
|
||||
|
||||
type
|
||||
{ Enum defining image data format. In formats with more channels,
|
||||
first channel after "if" is stored in the most significant bits and channel
|
||||
before end is stored in the least significant.}
|
||||
TImageFormat = (
|
||||
ifUnknown = 0,
|
||||
ifDefault = 1,
|
||||
{ Indexed formats using palette.}
|
||||
ifIndex8 = 10,
|
||||
{ Grayscale/Luminance formats.}
|
||||
ifGray8 = 40,
|
||||
ifA8Gray8 = 41,
|
||||
ifGray16 = 42,
|
||||
ifGray32 = 43,
|
||||
ifGray64 = 44,
|
||||
ifA16Gray16 = 45,
|
||||
{ ARGB formats.}
|
||||
ifX5R1G1B1 = 80,
|
||||
ifR3G3B2 = 81,
|
||||
ifR5G6B5 = 82,
|
||||
ifA1R5G5B5 = 83,
|
||||
ifA4R4G4B4 = 84,
|
||||
ifX1R5G5B5 = 85,
|
||||
ifX4R4G4B4 = 86,
|
||||
ifR8G8B8 = 87,
|
||||
ifA8R8G8B8 = 88,
|
||||
ifX8R8G8B8 = 89,
|
||||
ifR16G16B16 = 90,
|
||||
ifA16R16G16B16 = 91,
|
||||
ifB16G16R16 = 92,
|
||||
ifA16B16G16R16 = 93,
|
||||
{ Floating point formats.}
|
||||
ifR32F = 170,
|
||||
ifA32R32G32B32F = 171,
|
||||
ifA32B32G32R32F = 172,
|
||||
ifR16F = 173,
|
||||
ifA16R16G16B16F = 174,
|
||||
ifA16B16G16R16F = 175,
|
||||
{ Special formats.}
|
||||
ifDXT1 = 220,
|
||||
ifDXT3 = 221,
|
||||
ifDXT5 = 222,
|
||||
ifBTC = 223,
|
||||
ifATI1N = 224,
|
||||
ifATI2N = 225);
|
||||
|
||||
{ Color value for 32 bit images.}
|
||||
TColor32 = LongWord;
|
||||
PColor32 = ^TColor32;
|
||||
|
||||
{ Color value for 64 bit images.}
|
||||
TColor64 = type Int64;
|
||||
PColor64 = ^TColor64;
|
||||
|
||||
{ Color record for 24 bit images, which allows access to individual color
|
||||
channels.}
|
||||
TColor24Rec = packed record
|
||||
case LongInt of
|
||||
0: (B, G, R: Byte);
|
||||
1: (Channels: array[0..2] of Byte);
|
||||
end;
|
||||
PColor24Rec = ^TColor24Rec;
|
||||
TColor24RecArray = array[0..MaxInt div SizeOf(TColor24Rec) - 1] of TColor24Rec;
|
||||
PColor24RecArray = ^TColor24RecArray;
|
||||
|
||||
{ Color record for 32 bit images, which allows access to individual color
|
||||
channels.}
|
||||
TColor32Rec = packed record
|
||||
case LongInt of
|
||||
0: (Color: TColor32);
|
||||
1: (B, G, R, A: Byte);
|
||||
2: (Channels: array[0..3] of Byte);
|
||||
3: (Color24Rec: TColor24Rec);
|
||||
end;
|
||||
PColor32Rec = ^TColor32Rec;
|
||||
TColor32RecArray = array[0..MaxInt div SizeOf(TColor32Rec) - 1] of TColor32Rec;
|
||||
PColor32RecArray = ^TColor32RecArray;
|
||||
|
||||
{ Color record for 48 bit images, which allows access to individual color
|
||||
channels.}
|
||||
TColor48Rec = packed record
|
||||
case LongInt of
|
||||
0: (B, G, R: Word);
|
||||
1: (Channels: array[0..2] of Word);
|
||||
end;
|
||||
PColor48Rec = ^TColor48Rec;
|
||||
TColor48RecArray = array[0..MaxInt div SizeOf(TColor48Rec) - 1] of TColor48Rec;
|
||||
PColor48RecArray = ^TColor48RecArray;
|
||||
|
||||
{ Color record for 64 bit images, which allows access to individual color
|
||||
channels.}
|
||||
TColor64Rec = packed record
|
||||
case LongInt of
|
||||
0: (Color: TColor64);
|
||||
1: (B, G, R, A: Word);
|
||||
2: (Channels: array[0..3] of Word);
|
||||
3: (Color48Rec: TColor48Rec);
|
||||
end;
|
||||
PColor64Rec = ^TColor64Rec;
|
||||
TColor64RecArray = array[0..MaxInt div SizeOf(TColor64Rec) - 1] of TColor64Rec;
|
||||
PColor64RecArray = ^TColor64RecArray;
|
||||
|
||||
{ Color record for 128 bit floating point images, which allows access to
|
||||
individual color channels.}
|
||||
TColorFPRec = packed record
|
||||
case LongInt of
|
||||
0: (B, G, R, A: Single);
|
||||
1: (Channels: array[0..3] of Single);
|
||||
end;
|
||||
PColorFPRec = ^TColorFPRec;
|
||||
TColorFPRecArray = array[0..MaxInt div SizeOf(TColorFPRec) - 1] of TColorFPRec;
|
||||
PColorFPRecArray = ^TColorFPRecArray;
|
||||
|
||||
{ 16 bit floating-point value. It has 1 sign bit, 5 exponent bits,
|
||||
and 10 mantissa bits.}
|
||||
THalfFloat = type Word;
|
||||
PHalfFloat = ^THalfFloat;
|
||||
|
||||
{ Color record for 64 bit floating point images, which allows access to
|
||||
individual color channels.}
|
||||
TColorHFRec = packed record
|
||||
case LongInt of
|
||||
0: (B, G, R, A: THalfFloat);
|
||||
1: (Channels: array[0..3] of THalfFloat);
|
||||
end;
|
||||
PColorHFRec = ^TColorHFRec;
|
||||
TColorHFRecArray = array[0..MaxInt div SizeOf(TColorHFRec) - 1] of TColorHFRec;
|
||||
PColorHFRecArray = ^TColorHFRecArray;
|
||||
|
||||
{ Palette for indexed mode images with 32 bit colors.}
|
||||
TPalette32 = TColor32RecArray;
|
||||
TPalette32Size256 = array[0..255] of TColor32Rec;
|
||||
PPalette32 = ^TPalette32;
|
||||
|
||||
{ Palette for indexd mode images with 24 bit colors.}
|
||||
TPalette24 = TColor24RecArray;
|
||||
TPalette24Size256 = array[0..255] of TColor24Rec;
|
||||
PPalette24 = ^TPalette24;
|
||||
|
||||
{ Record that stores single image data and information describing it.}
|
||||
TImageData = packed record
|
||||
Width: LongInt; // Width of image in pixels
|
||||
Height: LongInt; // Height of image in pixels
|
||||
Format: TImageFormat; // Data format of image
|
||||
Size: LongInt; // Size of image bits in Bytes
|
||||
Bits: Pointer; // Pointer to memory containing image bits
|
||||
Palette: PPalette32; // Image palette for indexed images
|
||||
end;
|
||||
PImageData = ^TImageData;
|
||||
|
||||
{ Pixel format information used in conversions to/from 16 and 8 bit ARGB
|
||||
image formats.}
|
||||
TPixelFormatInfo = packed record
|
||||
ABitCount, RBitCount, GBitCount, BBitCount: Byte;
|
||||
ABitMask, RBitMask, GBitMask, BBitMask: LongWord;
|
||||
AShift, RShift, GShift, BShift: Byte;
|
||||
ARecDiv, RRecDiv, GRecDiv, BRecDiv: Byte;
|
||||
end;
|
||||
PPixelFormatInfo = ^TPixelFormatInfo;
|
||||
|
||||
PImageFormatInfo = ^TImageFormatInfo;
|
||||
|
||||
{ Look at TImageFormatInfo.GetPixelsSize for details.}
|
||||
TFormatGetPixelsSizeFunc = function(Format: TImageFormat; Width,
|
||||
Height: LongInt): LongInt;
|
||||
{ Look at TImageFormatInfo.CheckDimensions for details.}
|
||||
TFormatCheckDimensionsProc = procedure(Format: TImageFormat; var Width,
|
||||
Height: LongInt);
|
||||
{ Function for getting pixel colors. Native pixel is read from Image and
|
||||
then translated to 32 bit ARGB.}
|
||||
TGetPixel32Func = function(Bits: Pointer; Info: PImageFormatInfo;
|
||||
Palette: PPalette32): TColor32Rec;
|
||||
{ Function for getting pixel colors. Native pixel is read from Image and
|
||||
then translated to FP ARGB.}
|
||||
TGetPixelFPFunc = function(Bits: Pointer; Info: PImageFormatInfo;
|
||||
Palette: PPalette32): TColorFPRec;
|
||||
{ Procedure for setting pixel colors. Input 32 bit ARGB color is translated to
|
||||
native format and then written to Image.}
|
||||
TSetPixel32Proc = procedure(Bits: Pointer; Info: PImageFormatInfo;
|
||||
Palette: PPalette32;const Color: TColor32Rec);
|
||||
{ Procedure for setting pixel colors. Input FP ARGB color is translated to
|
||||
native format and then written to Image.}
|
||||
TSetPixelFPProc = procedure(Bits: Pointer; Info: PImageFormatInfo;
|
||||
Palette: PPalette32; const Color: TColorFPRec);
|
||||
|
||||
{ Additional information for each TImageFormat value.}
|
||||
TImageFormatInfo = packed record
|
||||
Format: TImageFormat; // Format described by this record
|
||||
Name: array[0..15] of Char; // Symbolic name of format
|
||||
BytesPerPixel: LongInt; // Number of bytes per pixel (note: it is
|
||||
// 0 for formats where BitsPerPixel < 8 (e.g. DXT).
|
||||
// Use GetPixelsSize function to get size of
|
||||
// image data.
|
||||
ChannelCount: LongInt; // Number of image channels (R, G, B, A, Gray)
|
||||
PaletteEntries: LongInt; // Number of palette entries
|
||||
HasGrayChannel: Boolean; // True if image has grayscale channel
|
||||
HasAlphaChannel: Boolean; // True if image has alpha channel
|
||||
IsFloatingPoint: Boolean; // True if image has floating point pixels
|
||||
UsePixelFormat: Boolean; // True if image uses pixel format
|
||||
IsRBSwapped: Boolean; // True if Red and Blue channels are swapped
|
||||
// e.g. A16B16G16R16 has IsRBSwapped True
|
||||
RBSwapFormat: TImageFormat; // Indicates supported format with swapped
|
||||
// Red and Blue channels, ifUnknown if such
|
||||
// format does not exist
|
||||
IsIndexed: Boolean; // True if image uses palette
|
||||
IsSpecial: Boolean; // True if image is in special format
|
||||
PixelFormat: PPixelFormatInfo; // Pixel format structure
|
||||
GetPixelsSize: TFormatGetPixelsSizeFunc; // Returns size in bytes of
|
||||
// Width * Height pixels of image
|
||||
CheckDimensions: TFormatCheckDimensionsProc; // some formats have limited
|
||||
// values of Width and Height. This
|
||||
// procedure checks and changes dimensions
|
||||
// to be valid for given format.
|
||||
GetPixel32: TGetPixel32Func; // 32bit ARGB pixel get function
|
||||
GetPixelFP: TGetPixelFPFunc; // FP ARGB pixel get function
|
||||
SetPixel32: TSetPixel32Proc; // 32bit ARGB pixel set procedure
|
||||
SetPixelFP: TSetPixelFPProc; // FP ARGB pixel set procedure
|
||||
SpecialNearestFormat: TImageFormat; // Regular image format used when
|
||||
// compressing/decompressing special images
|
||||
// as source/target
|
||||
end;
|
||||
|
||||
{ Handle to list of image data records.}
|
||||
TImageDataList = Pointer;
|
||||
PImageDataList = ^TImageDataList;
|
||||
|
||||
{ Handle to input/output.}
|
||||
TImagingHandle = Pointer;
|
||||
|
||||
{ Filters used in functions that resize images or their portions.}
|
||||
TResizeFilter = (
|
||||
rfNearest = 0,
|
||||
rfBilinear = 1,
|
||||
rfBicubic = 2);
|
||||
|
||||
{ Seek origin mode for IO function Seek.}
|
||||
TSeekMode = (
|
||||
smFromBeginning = 0,
|
||||
smFromCurrent = 1,
|
||||
smFromEnd = 2);
|
||||
|
||||
{ IO functions used for reading and writing images from/to input/output.}
|
||||
TOpenReadProc = function(Source: PChar): TImagingHandle; cdecl;
|
||||
TOpenWriteProc = function(Source: PChar): TImagingHandle; cdecl;
|
||||
TCloseProc = procedure(Handle: TImagingHandle); cdecl;
|
||||
TEofProc = function(Handle: TImagingHandle): Boolean; cdecl;
|
||||
TSeekProc = function(Handle: TImagingHandle; Offset: LongInt; Mode: TSeekMode): LongInt; cdecl;
|
||||
TTellProc = function(Handle: TImagingHandle): LongInt; cdecl;
|
||||
TReadProc = function(Handle: TImagingHandle; Buffer: Pointer; Count: LongInt): LongInt; cdecl;
|
||||
TWriteProc = function(Handle: TImagingHandle; Buffer: Pointer; Count: LongInt): LongInt; cdecl;
|
||||
|
||||
implementation
|
||||
|
||||
{
|
||||
File Notes:
|
||||
|
||||
-- TODOS ----------------------------------------------------
|
||||
- add lookup tables to pixel formats for fast conversions
|
||||
|
||||
-- 0.24.3 Changes/Bug Fixes ---------------------------------
|
||||
- Added ifATI1N and ifATI2N image data formats.
|
||||
|
||||
-- 0.23 Changes/Bug Fixes -----------------------------------
|
||||
- Added ifBTC image format and SpecialNearestFormat field
|
||||
to TImageFormatInfo.
|
||||
|
||||
-- 0.21 Changes/Bug Fixes -----------------------------------
|
||||
- Added option constants for PGM and PPM file formats.
|
||||
- Added TPalette32Size256 and TPalette24Size256 types.
|
||||
|
||||
-- 0.19 Changes/Bug Fixes -----------------------------------
|
||||
- added ImagingVersionPatch constant so bug fix only releases
|
||||
can be distinguished from ordinary major/minor releases
|
||||
- renamed TPixelFormat to TPixelFormatInfo to avoid name collisions
|
||||
with Graphics.TPixelFormat
|
||||
- added new image data formats: ifR16F, ifA16R16G16B16F,
|
||||
ifA16B16G16R16F
|
||||
- added pixel get/set function pointers to TImageFormatInfo
|
||||
- added 16bit half float type and color record
|
||||
- renamed TColorFRec to TColorFPRec (and related types too)
|
||||
|
||||
-- 0.17 Changes/Bug Fixes -----------------------------------
|
||||
- added option ImagingMipMapFilter which now controls resampling filter
|
||||
used when generating mipmaps
|
||||
- added TResizeFilter type
|
||||
- added ChannelCount to TImageFormatInfo
|
||||
- added new option constants for MNG and JNG images
|
||||
|
||||
-- 0.15 Changes/Bug Fixes -----------------------------------
|
||||
- added RBSwapFormat to TImageFormatInfo for faster conversions
|
||||
between swapped formats (it just calls SwapChannels now if
|
||||
RBSwapFormat is not ifUnknown)
|
||||
- moved TImageFormatInfo and required types from Imaging unit
|
||||
here, removed TImageFormatShortInfo
|
||||
- added new options: ImagingLoadOverrideFormat, ImagingSaveOverrideFormat
|
||||
|
||||
-- 0.13 Changes/Bug Fixes -----------------------------------
|
||||
- new ImagingColorReductionMask option added
|
||||
- new image format added: ifA16Gray16
|
||||
|
||||
}
|
||||
|
||||
end.
|
||||
|
||||
+322
-322
@@ -106,13 +106,13 @@ type
|
||||
TChar16 = array[0..15] of AnsiChar;
|
||||
|
||||
{ Options for BuildFileList function:
|
||||
flFullNames - file names in result will have full path names
|
||||
(ExtractFileDir(Path) + FileName)
|
||||
flRelNames - file names in result will have names relative to
|
||||
ExtractFileDir(Path) dir
|
||||
flRecursive - adds files in subdirectories found in Path.}
|
||||
TFileListOption = (flFullNames, flRelNames, flRecursive);
|
||||
TFileListOptions = set of TFileListOption;
|
||||
flFullNames - file names in result will have full path names
|
||||
(ExtractFileDir(Path) + FileName)
|
||||
flRelNames - file names in result will have names relative to
|
||||
ExtractFileDir(Path) dir
|
||||
flRecursive - adds files in subdirectories found in Path.}
|
||||
TFileListOption = (flFullNames, flRelNames, flRecursive);
|
||||
TFileListOptions = set of TFileListOption;
|
||||
|
||||
|
||||
{ Frees class instance and sets its reference to nil.}
|
||||
@@ -137,35 +137,35 @@ function GetAppExe: string;
|
||||
path delimiter at the end.}
|
||||
function GetAppDir: string;
|
||||
{ Returns True if FileName matches given Mask with optional case sensitivity.
|
||||
Mask can contain ? and * special characters: ? matches
|
||||
one character, * matches zero or more characters.}
|
||||
Mask can contain ? and * special characters: ? matches
|
||||
one character, * matches zero or more characters.}
|
||||
function MatchFileNameMask(const FileName, Mask: string; CaseSensitive: Boolean = False): Boolean;
|
||||
{ This function fills Files string list with names of files found
|
||||
with FindFirst/FindNext functions (See details on Path/Atrr here).
|
||||
- BuildFileList('c:\*.*', faAnyFile, List, [flRecursive]) returns
|
||||
list of all files (only name.ext - no path) on C drive
|
||||
- BuildFileList('d:\*.*', faDirectory, List, [flFullNames]) returns
|
||||
list of all directories (d:\dirxxx) in root of D drive.}
|
||||
function BuildFileList(Path: string; Attr: LongInt; Files: TStrings;
|
||||
Options: TFileListOptions = []): Boolean;
|
||||
{ Similar to RTL's Pos function but with optional Offset where search will start.
|
||||
This function is in the RTL StrUtils unit but }
|
||||
function PosEx(const SubStr, S: string; Offset: LongInt = 1): LongInt;
|
||||
{ Same as PosEx but without case sensitivity.}
|
||||
function PosNoCase(const SubStr, S: string; Offset: LongInt = 1): LongInt; {$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{ Returns a sub-string from S which is followed by
|
||||
Sep separator and deletes the sub-string from S including the separator.}
|
||||
function StrToken(var S: string; Sep: Char): string;
|
||||
{ Same as StrToken but searches from the end of S string.}
|
||||
function StrTokenEnd(var S: string; Sep: Char): string;
|
||||
{ Fills instance of TStrings with tokens from string S where tokens are separated by
|
||||
one of Seps characters.}
|
||||
procedure StrTokensToList(const S: string; Sep: Char; Tokens: TStrings);
|
||||
{ Returns string representation of integer number (with digit grouping).}
|
||||
function IntToStrFmt(const I: Int64): string; {$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{ Returns string representation of float number (with digit grouping).}
|
||||
function FloatToStrFmt(const F: Double; Precision: Integer = 2): string; {$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
|
||||
with FindFirst/FindNext functions (See details on Path/Atrr here).
|
||||
- BuildFileList('c:\*.*', faAnyFile, List, [flRecursive]) returns
|
||||
list of all files (only name.ext - no path) on C drive
|
||||
- BuildFileList('d:\*.*', faDirectory, List, [flFullNames]) returns
|
||||
list of all directories (d:\dirxxx) in root of D drive.}
|
||||
function BuildFileList(Path: string; Attr: LongInt; Files: TStrings;
|
||||
Options: TFileListOptions = []): Boolean;
|
||||
{ Similar to RTL's Pos function but with optional Offset where search will start.
|
||||
This function is in the RTL StrUtils unit but }
|
||||
function PosEx(const SubStr, S: string; Offset: LongInt = 1): LongInt;
|
||||
{ Same as PosEx but without case sensitivity.}
|
||||
function PosNoCase(const SubStr, S: string; Offset: LongInt = 1): LongInt; {$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{ Returns a sub-string from S which is followed by
|
||||
Sep separator and deletes the sub-string from S including the separator.}
|
||||
function StrToken(var S: string; Sep: Char): string;
|
||||
{ Same as StrToken but searches from the end of S string.}
|
||||
function StrTokenEnd(var S: string; Sep: Char): string;
|
||||
{ Fills instance of TStrings with tokens from string S where tokens are separated by
|
||||
one of Seps characters.}
|
||||
procedure StrTokensToList(const S: string; Sep: Char; Tokens: TStrings);
|
||||
{ Returns string representation of integer number (with digit grouping).}
|
||||
function IntToStrFmt(const I: Int64): string; {$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{ Returns string representation of float number (with digit grouping).}
|
||||
function FloatToStrFmt(const F: Double; Precision: Integer = 2): string; {$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
|
||||
{ Clamps integer value to range <Min, Max>}
|
||||
function ClampInt(Number: LongInt; Min, Max: LongInt): LongInt; {$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
{ Clamps float value to range <Min, Max>}
|
||||
@@ -402,7 +402,7 @@ end;
|
||||
|
||||
function GetTimeMilliseconds: Int64;
|
||||
begin
|
||||
Result := GetTimeMicroseconds div 1000;
|
||||
Result := GetTimeMicroseconds div 1000;
|
||||
end;
|
||||
|
||||
function GetFileExt(const FileName: string): string;
|
||||
@@ -444,269 +444,269 @@ begin
|
||||
end;
|
||||
|
||||
function MatchFileNameMask(const FileName, Mask: string; CaseSensitive: Boolean): Boolean;
|
||||
var
|
||||
MaskLen, KeyLen : LongInt;
|
||||
|
||||
function CharMatch(A, B: Char): Boolean;
|
||||
begin
|
||||
if CaseSensitive then
|
||||
Result := A = B
|
||||
else
|
||||
Result := AnsiUpperCase (A) = AnsiUpperCase (B);
|
||||
end;
|
||||
|
||||
function MatchAt(MaskPos, KeyPos: LongInt): Boolean;
|
||||
begin
|
||||
while (MaskPos <= MaskLen) and (KeyPos <= KeyLen) do
|
||||
begin
|
||||
case Mask[MaskPos] of
|
||||
'?' :
|
||||
begin
|
||||
Inc(MaskPos);
|
||||
Inc(KeyPos);
|
||||
end;
|
||||
'*' :
|
||||
begin
|
||||
while (MaskPos <= MaskLen) and (Mask[MaskPos] = '*') do
|
||||
Inc(MaskPos);
|
||||
if MaskPos > MaskLen then
|
||||
begin
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
repeat
|
||||
if MatchAt(MaskPos, KeyPos) then
|
||||
begin
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
Inc(KeyPos);
|
||||
until KeyPos > KeyLen;
|
||||
Result := False;
|
||||
Exit;
|
||||
end;
|
||||
else
|
||||
if not CharMatch(Mask[MaskPos], FileName[KeyPos]) then
|
||||
begin
|
||||
Result := False;
|
||||
Exit;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Inc(MaskPos);
|
||||
Inc(KeyPos);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
while (MaskPos <= MaskLen) and (Mask[MaskPos] in ['?', '*']) do
|
||||
Inc(MaskPos);
|
||||
if (MaskPos <= MaskLen) or (KeyPos <= KeyLen) then
|
||||
begin
|
||||
Result := False;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
begin
|
||||
MaskLen := Length(Mask);
|
||||
KeyLen := Length(FileName);
|
||||
if MaskLen = 0 then
|
||||
begin
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
Result := MatchAt(1, 1);
|
||||
var
|
||||
MaskLen, KeyLen : LongInt;
|
||||
|
||||
function CharMatch(A, B: Char): Boolean;
|
||||
begin
|
||||
if CaseSensitive then
|
||||
Result := A = B
|
||||
else
|
||||
Result := AnsiUpperCase (A) = AnsiUpperCase (B);
|
||||
end;
|
||||
|
||||
function MatchAt(MaskPos, KeyPos: LongInt): Boolean;
|
||||
begin
|
||||
while (MaskPos <= MaskLen) and (KeyPos <= KeyLen) do
|
||||
begin
|
||||
case Mask[MaskPos] of
|
||||
'?' :
|
||||
begin
|
||||
Inc(MaskPos);
|
||||
Inc(KeyPos);
|
||||
end;
|
||||
'*' :
|
||||
begin
|
||||
while (MaskPos <= MaskLen) and (Mask[MaskPos] = '*') do
|
||||
Inc(MaskPos);
|
||||
if MaskPos > MaskLen then
|
||||
begin
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
repeat
|
||||
if MatchAt(MaskPos, KeyPos) then
|
||||
begin
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
Inc(KeyPos);
|
||||
until KeyPos > KeyLen;
|
||||
Result := False;
|
||||
Exit;
|
||||
end;
|
||||
else
|
||||
if not CharMatch(Mask[MaskPos], FileName[KeyPos]) then
|
||||
begin
|
||||
Result := False;
|
||||
Exit;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Inc(MaskPos);
|
||||
Inc(KeyPos);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
while (MaskPos <= MaskLen) and (Mask[MaskPos] in ['?', '*']) do
|
||||
Inc(MaskPos);
|
||||
if (MaskPos <= MaskLen) or (KeyPos <= KeyLen) then
|
||||
begin
|
||||
Result := False;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
begin
|
||||
MaskLen := Length(Mask);
|
||||
KeyLen := Length(FileName);
|
||||
if MaskLen = 0 then
|
||||
begin
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
Result := MatchAt(1, 1);
|
||||
end;
|
||||
|
||||
function BuildFileList(Path: string; Attr: LongInt;
|
||||
Files: TStrings; Options: TFileListOptions): Boolean;
|
||||
var
|
||||
FileMask: string;
|
||||
RootDir: string;
|
||||
Folders: TStringList;
|
||||
CurrentItem: LongInt;
|
||||
Counter: LongInt;
|
||||
LocAttr: LongInt;
|
||||
|
||||
procedure BuildFolderList;
|
||||
var
|
||||
FindInfo: TSearchRec;
|
||||
Rslt: LongInt;
|
||||
begin
|
||||
Counter := Folders.Count - 1;
|
||||
CurrentItem := 0;
|
||||
while CurrentItem <= Counter do
|
||||
begin
|
||||
// Searching for subfolders
|
||||
Rslt := SysUtils.FindFirst(Folders[CurrentItem] + '*', faDirectory, FindInfo);
|
||||
try
|
||||
while Rslt = 0 do
|
||||
begin
|
||||
if (FindInfo.Name <> '.') and (FindInfo.Name <> '..') and
|
||||
(FindInfo.Attr and faDirectory = faDirectory) then
|
||||
Folders.Add(Folders[CurrentItem] + FindInfo.Name + PathDelim);
|
||||
Rslt := SysUtils.FindNext(FindInfo);
|
||||
end;
|
||||
finally
|
||||
SysUtils.FindClose(FindInfo);
|
||||
end;
|
||||
Counter := Folders.Count - 1;
|
||||
Inc(CurrentItem);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure FillFileList(CurrentCounter: LongInt);
|
||||
var
|
||||
FindInfo: TSearchRec;
|
||||
Res: LongInt;
|
||||
CurrentFolder: string;
|
||||
begin
|
||||
CurrentFolder := Folders[CurrentCounter];
|
||||
Res := SysUtils.FindFirst(CurrentFolder + FileMask, LocAttr, FindInfo);
|
||||
if flRelNames in Options then
|
||||
CurrentFolder := ExtractRelativePath(RootDir, CurrentFolder);
|
||||
try
|
||||
while Res = 0 do
|
||||
begin
|
||||
if (FindInfo.Name <> '.') and (FindInfo.Name <> '..') then
|
||||
begin
|
||||
if (flFullNames in Options) or (flRelNames in Options) then
|
||||
Files.Add(CurrentFolder + FindInfo.Name)
|
||||
else
|
||||
Files.Add(FindInfo.Name);
|
||||
end;
|
||||
Res := SysUtils.FindNext(FindInfo);
|
||||
end;
|
||||
finally
|
||||
SysUtils.FindClose(FindInfo);
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
FileMask := ExtractFileName(Path);
|
||||
RootDir := ExtractFilePath(Path);
|
||||
Folders := TStringList.Create;
|
||||
Folders.Add(RootDir);
|
||||
Files.Clear;
|
||||
{$IFDEF DCC}
|
||||
{$WARN SYMBOL_PLATFORM OFF}
|
||||
{$ENDIF}
|
||||
if Attr = faAnyFile then
|
||||
LocAttr := faSysFile or faHidden or faArchive or faReadOnly
|
||||
else
|
||||
LocAttr := Attr;
|
||||
{$IFDEF DCC}
|
||||
{$WARN SYMBOL_PLATFORM ON}
|
||||
{$ENDIF}
|
||||
// Here's the recursive search for nested folders
|
||||
if flRecursive in Options then
|
||||
BuildFolderList;
|
||||
if Attr <> faDirectory then
|
||||
for Counter := 0 to Folders.Count - 1 do
|
||||
FillFileList(Counter)
|
||||
else
|
||||
Files.AddStrings(Folders);
|
||||
Folders.Free;
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
function PosEx(const SubStr, S: string; Offset: LongInt = 1): LongInt;
|
||||
var
|
||||
I, X: LongInt;
|
||||
Len, LenSubStr: LongInt;
|
||||
begin
|
||||
I := Offset;
|
||||
LenSubStr := Length(SubStr);
|
||||
Len := Length(S) - LenSubStr + 1;
|
||||
while I <= Len do
|
||||
begin
|
||||
if S[I] = SubStr[1] then
|
||||
begin
|
||||
X := 1;
|
||||
while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
|
||||
Inc(X);
|
||||
if (X = LenSubStr) then
|
||||
begin
|
||||
Result := I;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
Inc(I);
|
||||
end;
|
||||
Result := 0;
|
||||
end;
|
||||
|
||||
function PosNoCase(const SubStr, S: string; Offset: LongInt): LongInt;
|
||||
begin
|
||||
Result := PosEx(AnsiLowerCase(SubStr), AnsiLowerCase(S), Offset);
|
||||
end;
|
||||
|
||||
function StrToken(var S: string; Sep: Char): string;
|
||||
var
|
||||
I: LongInt;
|
||||
begin
|
||||
I := Pos(Sep, S);
|
||||
if I <> 0 then
|
||||
begin
|
||||
Result := Copy(S, 1, I - 1);
|
||||
Delete(S, 1, I);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Result := S;
|
||||
S := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
function StrTokenEnd(var S: string; Sep: Char): string;
|
||||
var
|
||||
I, J: LongInt;
|
||||
begin
|
||||
J := 0;
|
||||
I := Pos(Sep, S);
|
||||
while I <> 0 do
|
||||
begin
|
||||
J := I;
|
||||
I := PosEx(Sep, S, J + 1);
|
||||
end;
|
||||
if J <> 0 then
|
||||
begin
|
||||
Result := Copy(S, J + 1, MaxInt);
|
||||
Delete(S, J, MaxInt);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Result := S;
|
||||
S := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure StrTokensToList(const S: string; Sep: Char; Tokens: TStrings);
|
||||
var
|
||||
Token, Str: string;
|
||||
begin
|
||||
Tokens.Clear;
|
||||
Str := S;
|
||||
while Str <> '' do
|
||||
begin
|
||||
Token := StrToken(Str, Sep);
|
||||
Tokens.Add(Token);
|
||||
end;
|
||||
end;
|
||||
|
||||
function IntToStrFmt(const I: Int64): string;
|
||||
begin
|
||||
Result := Format('%.0n', [I * 1.0]);
|
||||
end;
|
||||
|
||||
function FloatToStrFmt(const F: Double; Precision: Integer): string;
|
||||
begin
|
||||
Result := Format('%.' + IntToStr(Precision) + 'n', [F]);
|
||||
end;
|
||||
|
||||
Files: TStrings; Options: TFileListOptions): Boolean;
|
||||
var
|
||||
FileMask: string;
|
||||
RootDir: string;
|
||||
Folders: TStringList;
|
||||
CurrentItem: LongInt;
|
||||
Counter: LongInt;
|
||||
LocAttr: LongInt;
|
||||
|
||||
procedure BuildFolderList;
|
||||
var
|
||||
FindInfo: TSearchRec;
|
||||
Rslt: LongInt;
|
||||
begin
|
||||
Counter := Folders.Count - 1;
|
||||
CurrentItem := 0;
|
||||
while CurrentItem <= Counter do
|
||||
begin
|
||||
// Searching for subfolders
|
||||
Rslt := SysUtils.FindFirst(Folders[CurrentItem] + '*', faDirectory, FindInfo);
|
||||
try
|
||||
while Rslt = 0 do
|
||||
begin
|
||||
if (FindInfo.Name <> '.') and (FindInfo.Name <> '..') and
|
||||
(FindInfo.Attr and faDirectory = faDirectory) then
|
||||
Folders.Add(Folders[CurrentItem] + FindInfo.Name + PathDelim);
|
||||
Rslt := SysUtils.FindNext(FindInfo);
|
||||
end;
|
||||
finally
|
||||
SysUtils.FindClose(FindInfo);
|
||||
end;
|
||||
Counter := Folders.Count - 1;
|
||||
Inc(CurrentItem);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure FillFileList(CurrentCounter: LongInt);
|
||||
var
|
||||
FindInfo: TSearchRec;
|
||||
Res: LongInt;
|
||||
CurrentFolder: string;
|
||||
begin
|
||||
CurrentFolder := Folders[CurrentCounter];
|
||||
Res := SysUtils.FindFirst(CurrentFolder + FileMask, LocAttr, FindInfo);
|
||||
if flRelNames in Options then
|
||||
CurrentFolder := ExtractRelativePath(RootDir, CurrentFolder);
|
||||
try
|
||||
while Res = 0 do
|
||||
begin
|
||||
if (FindInfo.Name <> '.') and (FindInfo.Name <> '..') then
|
||||
begin
|
||||
if (flFullNames in Options) or (flRelNames in Options) then
|
||||
Files.Add(CurrentFolder + FindInfo.Name)
|
||||
else
|
||||
Files.Add(FindInfo.Name);
|
||||
end;
|
||||
Res := SysUtils.FindNext(FindInfo);
|
||||
end;
|
||||
finally
|
||||
SysUtils.FindClose(FindInfo);
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
FileMask := ExtractFileName(Path);
|
||||
RootDir := ExtractFilePath(Path);
|
||||
Folders := TStringList.Create;
|
||||
Folders.Add(RootDir);
|
||||
Files.Clear;
|
||||
{$IFDEF DCC}
|
||||
{$WARN SYMBOL_PLATFORM OFF}
|
||||
{$ENDIF}
|
||||
if Attr = faAnyFile then
|
||||
LocAttr := faSysFile or faHidden or faArchive or faReadOnly
|
||||
else
|
||||
LocAttr := Attr;
|
||||
{$IFDEF DCC}
|
||||
{$WARN SYMBOL_PLATFORM ON}
|
||||
{$ENDIF}
|
||||
// Here's the recursive search for nested folders
|
||||
if flRecursive in Options then
|
||||
BuildFolderList;
|
||||
if Attr <> faDirectory then
|
||||
for Counter := 0 to Folders.Count - 1 do
|
||||
FillFileList(Counter)
|
||||
else
|
||||
Files.AddStrings(Folders);
|
||||
Folders.Free;
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
function PosEx(const SubStr, S: string; Offset: LongInt = 1): LongInt;
|
||||
var
|
||||
I, X: LongInt;
|
||||
Len, LenSubStr: LongInt;
|
||||
begin
|
||||
I := Offset;
|
||||
LenSubStr := Length(SubStr);
|
||||
Len := Length(S) - LenSubStr + 1;
|
||||
while I <= Len do
|
||||
begin
|
||||
if S[I] = SubStr[1] then
|
||||
begin
|
||||
X := 1;
|
||||
while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
|
||||
Inc(X);
|
||||
if (X = LenSubStr) then
|
||||
begin
|
||||
Result := I;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
Inc(I);
|
||||
end;
|
||||
Result := 0;
|
||||
end;
|
||||
|
||||
function PosNoCase(const SubStr, S: string; Offset: LongInt): LongInt;
|
||||
begin
|
||||
Result := PosEx(AnsiLowerCase(SubStr), AnsiLowerCase(S), Offset);
|
||||
end;
|
||||
|
||||
function StrToken(var S: string; Sep: Char): string;
|
||||
var
|
||||
I: LongInt;
|
||||
begin
|
||||
I := Pos(Sep, S);
|
||||
if I <> 0 then
|
||||
begin
|
||||
Result := Copy(S, 1, I - 1);
|
||||
Delete(S, 1, I);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Result := S;
|
||||
S := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
function StrTokenEnd(var S: string; Sep: Char): string;
|
||||
var
|
||||
I, J: LongInt;
|
||||
begin
|
||||
J := 0;
|
||||
I := Pos(Sep, S);
|
||||
while I <> 0 do
|
||||
begin
|
||||
J := I;
|
||||
I := PosEx(Sep, S, J + 1);
|
||||
end;
|
||||
if J <> 0 then
|
||||
begin
|
||||
Result := Copy(S, J + 1, MaxInt);
|
||||
Delete(S, J, MaxInt);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Result := S;
|
||||
S := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure StrTokensToList(const S: string; Sep: Char; Tokens: TStrings);
|
||||
var
|
||||
Token, Str: string;
|
||||
begin
|
||||
Tokens.Clear;
|
||||
Str := S;
|
||||
while Str <> '' do
|
||||
begin
|
||||
Token := StrToken(Str, Sep);
|
||||
Tokens.Add(Token);
|
||||
end;
|
||||
end;
|
||||
|
||||
function IntToStrFmt(const I: Int64): string;
|
||||
begin
|
||||
Result := Format('%.0n', [I * 1.0]);
|
||||
end;
|
||||
|
||||
function FloatToStrFmt(const F: Double; Precision: Integer): string;
|
||||
begin
|
||||
Result := Format('%.' + IntToStr(Precision) + 'n', [F]);
|
||||
end;
|
||||
|
||||
function ClampInt(Number: LongInt; Min, Max: LongInt): LongInt;
|
||||
begin
|
||||
Result := Number;
|
||||
@@ -877,18 +877,18 @@ end;
|
||||
|
||||
function Iff(Condition: Boolean; TruePart, FalsePart: Pointer): Pointer;
|
||||
begin
|
||||
if Condition then
|
||||
if Condition then
|
||||
Result := TruePart
|
||||
else
|
||||
Result := FalsePart;
|
||||
Result := FalsePart;
|
||||
end;
|
||||
|
||||
function Iff(Condition: Boolean; const TruePart, FalsePart: Int64): Int64;
|
||||
begin
|
||||
if Condition then
|
||||
if Condition then
|
||||
Result := TruePart
|
||||
else
|
||||
Result := FalsePart;
|
||||
Result := FalsePart;
|
||||
end;
|
||||
|
||||
function IffFloat(Condition: Boolean; TruePart, FalsePart: Single): Single;
|
||||
@@ -982,8 +982,8 @@ end;
|
||||
function MulDiv(Number, Numerator, Denominator: Word): Word;
|
||||
{$IF Defined(USE_ASM) and (not Defined(USE_INLINE))}
|
||||
asm
|
||||
MUL DX
|
||||
DIV CX
|
||||
MUL DX
|
||||
DIV CX
|
||||
end;
|
||||
{$ELSE}
|
||||
begin
|
||||
@@ -995,8 +995,8 @@ function IsLittleEndian: Boolean;
|
||||
var
|
||||
W: Word;
|
||||
begin
|
||||
W := $00FF;
|
||||
Result := PByte(@W)^ = $FF;
|
||||
W := $00FF;
|
||||
Result := PByte(@W)^ = $FF;
|
||||
end;
|
||||
|
||||
function SwapEndianWord(Value: Word): Word;
|
||||
@@ -1254,12 +1254,12 @@ begin
|
||||
end;
|
||||
|
||||
function GetVolumeLevelCount(Depth, MipMaps: LongInt): LongInt;
|
||||
var
|
||||
I: LongInt;
|
||||
begin
|
||||
Result := Depth;
|
||||
for I := 1 to MipMaps - 1 do
|
||||
Inc(Result, ClampInt(Depth shr I, 1, Depth));
|
||||
var
|
||||
I: LongInt;
|
||||
begin
|
||||
Result := Depth;
|
||||
for I := 1 to MipMaps - 1 do
|
||||
Inc(Result, ClampInt(Depth shr I, 1, Depth));
|
||||
end;
|
||||
|
||||
function BoundsToRect(X, Y, Width, Height: LongInt): TRect;
|
||||
@@ -1408,27 +1408,27 @@ begin
|
||||
end;
|
||||
|
||||
function RectInRect(const R1, R2: TRect): Boolean;
|
||||
begin
|
||||
Result:=
|
||||
(R1.Left >= R2.Left) and
|
||||
(R1.Top >= R2.Top) and
|
||||
(R1.Right <= R2.Right) and
|
||||
(R1.Bottom <= R2.Bottom);
|
||||
begin
|
||||
Result:=
|
||||
(R1.Left >= R2.Left) and
|
||||
(R1.Top >= R2.Top) and
|
||||
(R1.Right <= R2.Right) and
|
||||
(R1.Bottom <= R2.Bottom);
|
||||
end;
|
||||
|
||||
function RectIntersects(const R1, R2: TRect): Boolean;
|
||||
begin
|
||||
Result :=
|
||||
not (R1.Left > R2.Right) and
|
||||
not (R1.Top > R2.Bottom) and
|
||||
not (R1.Right < R2.Left) and
|
||||
not (R1.Bottom < R2.Top);
|
||||
end;
|
||||
Result :=
|
||||
not (R1.Left > R2.Right) and
|
||||
not (R1.Top > R2.Bottom) and
|
||||
not (R1.Right < R2.Left) and
|
||||
not (R1.Bottom < R2.Top);
|
||||
end;
|
||||
|
||||
function FormatExceptMsg(const Msg: string; const Args: array of const): string;
|
||||
begin
|
||||
Result := Format(Msg + SLineBreak + 'Message: ' + GetExceptObject.Message, Args);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure DebugMsg(const Msg: string; const Args: array of const);
|
||||
var
|
||||
|
||||
+14
-14
@@ -1499,7 +1499,7 @@ end;
|
||||
|
||||
function TheObjectVector.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheObjectVector.Has(const Item: TItem): Boolean;
|
||||
@@ -1733,7 +1733,7 @@ end;
|
||||
|
||||
function TheVector.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheVector.Has(const Item: TItem): Boolean;
|
||||
@@ -1944,7 +1944,7 @@ end;
|
||||
|
||||
function TheCmpVector.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheCmpVector.Has(const Item: TItem): Boolean;
|
||||
@@ -2105,7 +2105,7 @@ end;
|
||||
|
||||
function TheSortVector.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheSortVector.Has(const Item: TItem): Boolean;
|
||||
@@ -2267,7 +2267,7 @@ end;
|
||||
|
||||
function TheCmpSortVector.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheCmpSortVector.Has(const Item: TItem): Boolean;
|
||||
@@ -2439,7 +2439,7 @@ end;
|
||||
|
||||
function TheObjectSortVector.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheObjectSortVector.Has(const Item: TItem): Boolean;
|
||||
@@ -2621,7 +2621,7 @@ end;
|
||||
|
||||
function TheVectorSet.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheVectorSet.Include(const Item: TItem): Boolean;
|
||||
@@ -2778,7 +2778,7 @@ end;
|
||||
|
||||
function TheCmpVectorSet.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheCmpVectorSet.Include(const Item: TItem): Boolean;
|
||||
@@ -2941,7 +2941,7 @@ end;
|
||||
|
||||
function TheObjectVectorSet.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(-1, @MoveNext, @GetCurrent);
|
||||
Result.Init(-1, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheObjectVectorSet.Include(const Item: TItem): Boolean;
|
||||
@@ -3732,7 +3732,7 @@ end;
|
||||
|
||||
function TheList.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(NewIterator, @MoveNext, @CurrentItem);
|
||||
Result.Init(NewIterator, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@CurrentItem));
|
||||
end;
|
||||
|
||||
function TheList.CurrentItem(var Iterator: TIterator): TItem;
|
||||
@@ -3937,7 +3937,7 @@ end;
|
||||
|
||||
function TheObjectList.GetEnumerator: TEnumerator;
|
||||
begin
|
||||
Result.Init(NewIterator, @MoveNext, @CurrentItem);
|
||||
Result.Init(NewIterator, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@CurrentItem));
|
||||
end;
|
||||
|
||||
function TheObjectList.CurrentItem(var Iterator: TIterator): TItem;
|
||||
@@ -4163,7 +4163,7 @@ begin
|
||||
Iterator.Index := -1;
|
||||
Iterator.UseSentinel := False;
|
||||
Assert(Iterator.Page = Iterator.Page); // hint off
|
||||
Result.Init(Iterator, @MoveNext, @GetCurrent);
|
||||
Result.Init(Iterator, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheBTreeSet.Include(const Item: TItem): Boolean;
|
||||
@@ -5273,7 +5273,7 @@ begin
|
||||
Iterator.Index := -1;
|
||||
Iterator.UseSentinel := False;
|
||||
Assert(Iterator.Page = Iterator.Page); // hint off
|
||||
Result.Init(Iterator, @MoveNext, @GetCurrent);
|
||||
Result.Init(Iterator, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheCmpBTreeSet.Include(const Item: TItem): Boolean;
|
||||
@@ -5781,7 +5781,7 @@ begin
|
||||
Iterator.Index := -1;
|
||||
Iterator.UseSentinel := False;
|
||||
Assert(Iterator.Page = Iterator.Page); // hint off
|
||||
Result.Init(Iterator, @MoveNext, @GetCurrent);
|
||||
Result.Init(Iterator, TEnumerator.TMoveNext(@MoveNext), TEnumerator.TGetCurrent(@GetCurrent));
|
||||
end;
|
||||
|
||||
function TheObjectBTreeSet.Include(const Item: TItem): Boolean;
|
||||
|
||||
Reference in New Issue
Block a user