| @@ -33,7 +33,7 @@ | |||||
| <PackageName Value="LCL"/> | <PackageName Value="LCL"/> | ||||
| </Item1> | </Item1> | ||||
| </RequiredPackages> | </RequiredPackages> | ||||
| <Units Count="9"> | |||||
| <Units Count="10"> | |||||
| <Unit0> | <Unit0> | ||||
| <Filename Value="TextSuiteTest.lpr"/> | <Filename Value="TextSuiteTest.lpr"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| @@ -80,6 +80,11 @@ | |||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <UnitName Value="utsCodePages"/> | <UnitName Value="utsCodePages"/> | ||||
| </Unit8> | </Unit8> | ||||
| <Unit9> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <UnitName Value="utsPostProcess"/> | |||||
| </Unit9> | |||||
| </Units> | </Units> | ||||
| </ProjectOptions> | </ProjectOptions> | ||||
| <CompilerOptions> | <CompilerOptions> | ||||
| @@ -7,7 +7,7 @@ uses | |||||
| cthreads, | cthreads, | ||||
| {$ENDIF}{$ENDIF} | {$ENDIF}{$ENDIF} | ||||
| Interfaces, sysutils, Forms, uMainForm, | Interfaces, sysutils, Forms, uMainForm, | ||||
| utsFontCreatorGDI, utsUtils, utsTypes, utsTtfUtils, utsTextSuite, utsRendererOpenGL, utsCodePages; | |||||
| utsFontCreatorGDI, utsUtils, utsTypes, utsTtfUtils, utsTextSuite, utsRendererOpenGL, utsCodePages, utsPostProcess; | |||||
| {$R *.res} | {$R *.res} | ||||
| @@ -4,13 +4,13 @@ | |||||
| <PathDelim Value="\"/> | <PathDelim Value="\"/> | ||||
| <Version Value="9"/> | <Version Value="9"/> | ||||
| <BuildModes Active="Default"/> | <BuildModes Active="Default"/> | ||||
| <Units Count="53"> | |||||
| <Units Count="60"> | |||||
| <Unit0> | <Unit0> | ||||
| <Filename Value="TextSuiteTest.lpr"/> | <Filename Value="TextSuiteTest.lpr"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="29" Y="20"/> | <CursorPos X="29" Y="20"/> | ||||
| <UsageCount Value="97"/> | |||||
| <UsageCount Value="106"/> | |||||
| </Unit0> | </Unit0> | ||||
| <Unit1> | <Unit1> | ||||
| <Filename Value="uMainForm.pas"/> | <Filename Value="uMainForm.pas"/> | ||||
| @@ -20,20 +20,19 @@ | |||||
| <ResourceBaseClass Value="Form"/> | <ResourceBaseClass Value="Form"/> | ||||
| <UnitName Value="uMainForm"/> | <UnitName Value="uMainForm"/> | ||||
| <IsVisibleTab Value="True"/> | <IsVisibleTab Value="True"/> | ||||
| <TopLine Value="122"/> | |||||
| <CursorPos X="39" Y="146"/> | |||||
| <UsageCount Value="97"/> | |||||
| <TopLine Value="73"/> | |||||
| <CursorPos X="78" Y="89"/> | |||||
| <UsageCount Value="106"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| <LoadedDesigner Value="True"/> | |||||
| </Unit1> | </Unit1> | ||||
| <Unit2> | <Unit2> | ||||
| <Filename Value="..\..\utsRendererOpenGL.pas"/> | <Filename Value="..\..\utsRendererOpenGL.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <UnitName Value="utsRendererOpenGL"/> | <UnitName Value="utsRendererOpenGL"/> | ||||
| <EditorIndex Value="6"/> | |||||
| <TopLine Value="233"/> | |||||
| <CursorPos X="43" Y="277"/> | |||||
| <UsageCount Value="25"/> | |||||
| <EditorIndex Value="7"/> | |||||
| <TopLine Value="37"/> | |||||
| <CursorPos X="35" Y="114"/> | |||||
| <UsageCount Value="34"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit2> | </Unit2> | ||||
| <Unit3> | <Unit3> | ||||
| @@ -41,65 +40,75 @@ | |||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <UnitName Value="utsTextSuite"/> | <UnitName Value="utsTextSuite"/> | ||||
| <EditorIndex Value="1"/> | <EditorIndex Value="1"/> | ||||
| <TopLine Value="2113"/> | |||||
| <CursorPos X="27" Y="2129"/> | |||||
| <UsageCount Value="25"/> | |||||
| <TopLine Value="10"/> | |||||
| <CursorPos X="5" Y="26"/> | |||||
| <UsageCount Value="34"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit3> | </Unit3> | ||||
| <Unit4> | <Unit4> | ||||
| <Filename Value="..\..\utsTtfUtils.pas"/> | <Filename Value="..\..\utsTtfUtils.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <UsageCount Value="25"/> | |||||
| <UsageCount Value="34"/> | |||||
| </Unit4> | </Unit4> | ||||
| <Unit5> | <Unit5> | ||||
| <Filename Value="..\..\utsTypes.pas"/> | <Filename Value="..\..\utsTypes.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <UnitName Value="utsTypes"/> | <UnitName Value="utsTypes"/> | ||||
| <EditorIndex Value="4"/> | |||||
| <TopLine Value="155"/> | |||||
| <CursorPos X="10" Y="171"/> | |||||
| <UsageCount Value="25"/> | |||||
| <EditorIndex Value="5"/> | |||||
| <TopLine Value="282"/> | |||||
| <CursorPos Y="298"/> | |||||
| <UsageCount Value="34"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit5> | </Unit5> | ||||
| <Unit6> | <Unit6> | ||||
| <Filename Value="..\..\utsUtils.pas"/> | <Filename Value="..\..\utsUtils.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <UnitName Value="utsUtils"/> | <UnitName Value="utsUtils"/> | ||||
| <EditorIndex Value="2"/> | |||||
| <EditorIndex Value="3"/> | |||||
| <TopLine Value="161"/> | <TopLine Value="161"/> | ||||
| <CursorPos X="23" Y="180"/> | <CursorPos X="23" Y="180"/> | ||||
| <UsageCount Value="25"/> | |||||
| <UsageCount Value="34"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit6> | </Unit6> | ||||
| <Unit7> | <Unit7> | ||||
| <Filename Value="..\..\utsFontCreatorGDI.pas"/> | <Filename Value="..\..\utsFontCreatorGDI.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <UnitName Value="utsFontCreatorGDI"/> | <UnitName Value="utsFontCreatorGDI"/> | ||||
| <EditorIndex Value="5"/> | |||||
| <EditorIndex Value="6"/> | |||||
| <TopLine Value="643"/> | <TopLine Value="643"/> | ||||
| <CursorPos X="40" Y="628"/> | |||||
| <UsageCount Value="25"/> | |||||
| <CursorPos X="33" Y="659"/> | |||||
| <UsageCount Value="34"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit7> | </Unit7> | ||||
| <Unit8> | <Unit8> | ||||
| <Filename Value="..\..\utsCodePages.pas"/> | <Filename Value="..\..\utsCodePages.pas"/> | ||||
| <IsPartOfProject Value="True"/> | <IsPartOfProject Value="True"/> | ||||
| <UnitName Value="utsCodePages"/> | <UnitName Value="utsCodePages"/> | ||||
| <EditorIndex Value="3"/> | |||||
| <EditorIndex Value="4"/> | |||||
| <TopLine Value="196"/> | <TopLine Value="196"/> | ||||
| <CursorPos X="30" Y="8"/> | <CursorPos X="30" Y="8"/> | ||||
| <UsageCount Value="22"/> | |||||
| <UsageCount Value="31"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit8> | </Unit8> | ||||
| <Unit9> | <Unit9> | ||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <IsPartOfProject Value="True"/> | |||||
| <UnitName Value="utsPostProcess"/> | |||||
| <EditorIndex Value="2"/> | |||||
| <TopLine Value="229"/> | |||||
| <CursorPos X="13" Y="250"/> | |||||
| <UsageCount Value="29"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit9> | |||||
| <Unit10> | |||||
| <Filename Value="new\utsTextSuite.pas"/> | <Filename Value="new\utsTextSuite.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="1886"/> | <TopLine Value="1886"/> | ||||
| <CursorPos X="33" Y="1904"/> | <CursorPos X="33" Y="1904"/> | ||||
| <UsageCount Value="91"/> | <UsageCount Value="91"/> | ||||
| </Unit9> | |||||
| <Unit10> | |||||
| </Unit10> | |||||
| <Unit11> | |||||
| <Filename Value="old\TextSuite.pas"/> | <Filename Value="old\TextSuite.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| @@ -112,240 +121,240 @@ | |||||
| <CursorPos X="3" Y="302"/> | <CursorPos X="3" Y="302"/> | ||||
| </ExtraEditor1> | </ExtraEditor1> | ||||
| <UsageCount Value="86"/> | <UsageCount Value="86"/> | ||||
| </Unit10> | |||||
| <Unit11> | |||||
| </Unit11> | |||||
| <Unit12> | |||||
| <Filename Value="old\TextSuiteImports.pas"/> | <Filename Value="old\TextSuiteImports.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="656"/> | <TopLine Value="656"/> | ||||
| <CursorPos X="20" Y="635"/> | <CursorPos X="20" Y="635"/> | ||||
| <UsageCount Value="86"/> | <UsageCount Value="86"/> | ||||
| </Unit11> | |||||
| <Unit12> | |||||
| </Unit12> | |||||
| <Unit13> | |||||
| <Filename Value="old\TextSuiteWideUtils.pas"/> | <Filename Value="old\TextSuiteWideUtils.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="1243"/> | <TopLine Value="1243"/> | ||||
| <CursorPos X="18" Y="1257"/> | <CursorPos X="18" Y="1257"/> | ||||
| <UsageCount Value="86"/> | <UsageCount Value="86"/> | ||||
| </Unit12> | |||||
| <Unit13> | |||||
| </Unit13> | |||||
| <Unit14> | |||||
| <Filename Value="old\TextSuiteClasses.pas"/> | <Filename Value="old\TextSuiteClasses.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="654"/> | <TopLine Value="654"/> | ||||
| <CursorPos X="25" Y="673"/> | <CursorPos X="25" Y="673"/> | ||||
| <UsageCount Value="86"/> | <UsageCount Value="86"/> | ||||
| </Unit13> | |||||
| <Unit14> | |||||
| </Unit14> | |||||
| <Unit15> | |||||
| <Filename Value="old\TextSuitePostProcess.pas"/> | <Filename Value="old\TextSuitePostProcess.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="163"/> | <TopLine Value="163"/> | ||||
| <CursorPos X="61" Y="141"/> | <CursorPos X="61" Y="141"/> | ||||
| <UsageCount Value="86"/> | <UsageCount Value="86"/> | ||||
| </Unit14> | |||||
| <Unit15> | |||||
| </Unit15> | |||||
| <Unit16> | |||||
| <Filename Value="old\TextSuiteTTFUtils.pas"/> | <Filename Value="old\TextSuiteTTFUtils.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="83"/> | <TopLine Value="83"/> | ||||
| <CursorPos X="3" Y="91"/> | <CursorPos X="3" Y="91"/> | ||||
| <UsageCount Value="86"/> | <UsageCount Value="86"/> | ||||
| </Unit15> | |||||
| <Unit16> | |||||
| </Unit16> | |||||
| <Unit17> | |||||
| <Filename Value="old\TextSuiteVersion.pas"/> | <Filename Value="old\TextSuiteVersion.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="-1"/> | <WindowIndex Value="-1"/> | ||||
| <TopLine Value="-1"/> | <TopLine Value="-1"/> | ||||
| <CursorPos X="-1" Y="-1"/> | <CursorPos X="-1" Y="-1"/> | ||||
| <UsageCount Value="86"/> | <UsageCount Value="86"/> | ||||
| </Unit16> | |||||
| <Unit17> | |||||
| </Unit17> | |||||
| <Unit18> | |||||
| <Filename Value="new\utsFontCreatorGDI.pas"/> | <Filename Value="new\utsFontCreatorGDI.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="655"/> | <TopLine Value="655"/> | ||||
| <CursorPos X="53" Y="662"/> | <CursorPos X="53" Y="662"/> | ||||
| <UsageCount Value="50"/> | <UsageCount Value="50"/> | ||||
| </Unit17> | |||||
| <Unit18> | |||||
| </Unit18> | |||||
| <Unit19> | |||||
| <Filename Value="new\utsTtfUtils.pas"/> | <Filename Value="new\utsTtfUtils.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="128"/> | <TopLine Value="128"/> | ||||
| <CursorPos X="17" Y="144"/> | <CursorPos X="17" Y="144"/> | ||||
| <UsageCount Value="42"/> | <UsageCount Value="42"/> | ||||
| </Unit18> | |||||
| <Unit19> | |||||
| </Unit19> | |||||
| <Unit20> | |||||
| <Filename Value="new\utsTypes.pas"/> | <Filename Value="new\utsTypes.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="152"/> | <TopLine Value="152"/> | ||||
| <CursorPos X="5" Y="168"/> | <CursorPos X="5" Y="168"/> | ||||
| <UsageCount Value="42"/> | <UsageCount Value="42"/> | ||||
| </Unit19> | |||||
| <Unit20> | |||||
| </Unit20> | |||||
| <Unit21> | |||||
| <Filename Value="new\utsUtils.pas"/> | <Filename Value="new\utsUtils.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos Y="20"/> | <CursorPos Y="20"/> | ||||
| <UsageCount Value="42"/> | <UsageCount Value="42"/> | ||||
| </Unit20> | |||||
| <Unit21> | |||||
| </Unit21> | |||||
| <Unit22> | |||||
| <Filename Value="new\utsRendererOpenGL.pas"/> | <Filename Value="new\utsRendererOpenGL.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="356"/> | <TopLine Value="356"/> | ||||
| <CursorPos X="20" Y="376"/> | <CursorPos X="20" Y="376"/> | ||||
| <UsageCount Value="39"/> | <UsageCount Value="39"/> | ||||
| </Unit21> | |||||
| <Unit22> | |||||
| </Unit22> | |||||
| <Unit23> | |||||
| <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\OpenGLCore\uglcTypes.pas"/> | <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\OpenGLCore\uglcTypes.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="261"/> | <TopLine Value="261"/> | ||||
| <CursorPos X="3" Y="277"/> | <CursorPos X="3" Y="277"/> | ||||
| <UsageCount Value="37"/> | <UsageCount Value="37"/> | ||||
| </Unit22> | |||||
| <Unit23> | |||||
| </Unit23> | |||||
| <Unit24> | |||||
| <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\OpenGLCore\dglOpenGL.pas"/> | <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\OpenGLCore\dglOpenGL.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="1066"/> | <TopLine Value="1066"/> | ||||
| <CursorPos X="27" Y="1082"/> | <CursorPos X="27" Y="1082"/> | ||||
| <UsageCount Value="32"/> | <UsageCount Value="32"/> | ||||
| </Unit23> | |||||
| <Unit24> | |||||
| </Unit24> | |||||
| <Unit25> | |||||
| <Filename Value="new\uglctextsuite.pas"/> | <Filename Value="new\uglctextsuite.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="3" Y="13"/> | <CursorPos X="3" Y="13"/> | ||||
| <UsageCount Value="13"/> | <UsageCount Value="13"/> | ||||
| </Unit24> | |||||
| <Unit25> | |||||
| </Unit25> | |||||
| <Unit26> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\ustringh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\ustringh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="110"/> | <TopLine Value="110"/> | ||||
| <CursorPos X="10" Y="126"/> | <CursorPos X="10" Y="126"/> | ||||
| <UsageCount Value="27"/> | <UsageCount Value="27"/> | ||||
| </Unit25> | |||||
| <Unit26> | |||||
| </Unit26> | |||||
| <Unit27> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\ustrings.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\ustrings.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="1819"/> | <TopLine Value="1819"/> | ||||
| <CursorPos X="37" Y="2066"/> | <CursorPos X="37" Y="2066"/> | ||||
| <UsageCount Value="4"/> | <UsageCount Value="4"/> | ||||
| </Unit26> | |||||
| <Unit27> | |||||
| </Unit27> | |||||
| <Unit28> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\systemh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\systemh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="756"/> | <TopLine Value="756"/> | ||||
| <CursorPos X="32" Y="774"/> | <CursorPos X="32" Y="774"/> | ||||
| <UsageCount Value="25"/> | <UsageCount Value="25"/> | ||||
| </Unit27> | |||||
| <Unit28> | |||||
| </Unit28> | |||||
| <Unit29> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\heaph.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\heaph.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="71"/> | <TopLine Value="71"/> | ||||
| <CursorPos X="10" Y="95"/> | <CursorPos X="10" Y="95"/> | ||||
| <UsageCount Value="26"/> | <UsageCount Value="26"/> | ||||
| </Unit28> | |||||
| <Unit29> | |||||
| </Unit29> | |||||
| <Unit30> | |||||
| <Filename Value="old\TextSuiteCPUUtils.pas"/> | <Filename Value="old\TextSuiteCPUUtils.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <CursorPos X="23" Y="20"/> | <CursorPos X="23" Y="20"/> | ||||
| <UsageCount Value="16"/> | <UsageCount Value="16"/> | ||||
| </Unit29> | |||||
| <Unit30> | |||||
| </Unit30> | |||||
| <Unit31> | |||||
| <Filename Value="..\glBitmap\glBitmap\glBitmap.pas"/> | <Filename Value="..\glBitmap\glBitmap\glBitmap.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos X="14" Y="14"/> | <CursorPos X="14" Y="14"/> | ||||
| <UsageCount Value="4"/> | <UsageCount Value="4"/> | ||||
| </Unit30> | |||||
| <Unit31> | |||||
| </Unit31> | |||||
| <Unit32> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\objpas\math.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\objpas\math.pp"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="1011"/> | <TopLine Value="1011"/> | ||||
| <CursorPos X="47" Y="1015"/> | <CursorPos X="47" Y="1015"/> | ||||
| <UsageCount Value="8"/> | <UsageCount Value="8"/> | ||||
| </Unit31> | |||||
| <Unit32> | |||||
| </Unit32> | |||||
| <Unit33> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\mathh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\mathh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="84"/> | <TopLine Value="84"/> | ||||
| <CursorPos X="14" Y="101"/> | <CursorPos X="14" Y="101"/> | ||||
| <UsageCount Value="8"/> | <UsageCount Value="8"/> | ||||
| </Unit32> | |||||
| <Unit33> | |||||
| </Unit33> | |||||
| <Unit34> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\genmath.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\genmath.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="152"/> | <TopLine Value="152"/> | ||||
| <CursorPos X="10" Y="155"/> | <CursorPos X="10" Y="155"/> | ||||
| <UsageCount Value="8"/> | <UsageCount Value="8"/> | ||||
| </Unit33> | |||||
| <Unit34> | |||||
| </Unit34> | |||||
| <Unit35> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\dynlibs.pas"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\dynlibs.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="41"/> | <TopLine Value="41"/> | ||||
| <CursorPos X="10" Y="58"/> | <CursorPos X="10" Y="58"/> | ||||
| <UsageCount Value="13"/> | <UsageCount Value="13"/> | ||||
| </Unit34> | |||||
| <Unit35> | |||||
| </Unit35> | |||||
| <Unit36> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\win\dynlibs.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\win\dynlibs.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="9"/> | <TopLine Value="9"/> | ||||
| <CursorPos X="3" Y="26"/> | <CursorPos X="3" Y="26"/> | ||||
| <UsageCount Value="13"/> | <UsageCount Value="13"/> | ||||
| </Unit35> | |||||
| <Unit36> | |||||
| </Unit36> | |||||
| <Unit37> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\win\sysosh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\win\sysosh.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="11"/> | <TopLine Value="11"/> | ||||
| <CursorPos X="3" Y="19"/> | <CursorPos X="3" Y="19"/> | ||||
| <UsageCount Value="13"/> | <UsageCount Value="13"/> | ||||
| </Unit36> | |||||
| <Unit37> | |||||
| </Unit37> | |||||
| <Unit38> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\objpash.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\objpash.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="177"/> | <TopLine Value="177"/> | ||||
| <CursorPos X="22" Y="195"/> | <CursorPos X="22" Y="195"/> | ||||
| <UsageCount Value="17"/> | <UsageCount Value="17"/> | ||||
| </Unit37> | |||||
| <Unit38> | |||||
| </Unit38> | |||||
| <Unit39> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\objpas\sysutils\sysunih.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\objpas\sysutils\sysunih.inc"/> | ||||
| <EditorIndex Value="6"/> | |||||
| <EditorIndex Value="12"/> | |||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="25"/> | <TopLine Value="25"/> | ||||
| <CursorPos X="34" Y="43"/> | <CursorPos X="34" Y="43"/> | ||||
| <UsageCount Value="23"/> | |||||
| <UsageCount Value="28"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit38> | |||||
| <Unit39> | |||||
| </Unit39> | |||||
| <Unit40> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\packages\fcl-base\src\syncobjs.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\packages\fcl-base\src\syncobjs.pp"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="113"/> | <TopLine Value="113"/> | ||||
| <CursorPos X="25" Y="115"/> | <CursorPos X="25" Y="115"/> | ||||
| <UsageCount Value="18"/> | <UsageCount Value="18"/> | ||||
| </Unit39> | |||||
| <Unit40> | |||||
| </Unit40> | |||||
| <Unit41> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\objpas\classes\classesh.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\objpas\classes\classesh.inc"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="311"/> | <TopLine Value="311"/> | ||||
| <CursorPos X="14" Y="327"/> | <CursorPos X="14" Y="327"/> | ||||
| <UsageCount Value="20"/> | |||||
| <UsageCount Value="25"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit40> | |||||
| <Unit41> | |||||
| </Unit41> | |||||
| <Unit42> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\objpas.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\inc\objpas.inc"/> | ||||
| <EditorIndex Value="5"/> | |||||
| <EditorIndex Value="11"/> | |||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <CursorPos X="35" Y="24"/> | <CursorPos X="35" Y="24"/> | ||||
| <UsageCount Value="17"/> | |||||
| <UsageCount Value="22"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit41> | |||||
| <Unit42> | |||||
| </Unit42> | |||||
| <Unit43> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\include\control.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\include\control.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="2843"/> | <TopLine Value="2843"/> | ||||
| <CursorPos Y="2858"/> | <CursorPos Y="2858"/> | ||||
| <UsageCount Value="15"/> | <UsageCount Value="15"/> | ||||
| </Unit42> | |||||
| <Unit43> | |||||
| </Unit43> | |||||
| <Unit44> | |||||
| <Filename Value="C:\Users\Erik\Desktop\RectPacking\unit1.pas"/> | <Filename Value="C:\Users\Erik\Desktop\RectPacking\unit1.pas"/> | ||||
| <ComponentName Value="Form1"/> | <ComponentName Value="Form1"/> | ||||
| <HasResources Value="True"/> | <HasResources Value="True"/> | ||||
| @@ -355,223 +364,254 @@ | |||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="376"/> | <TopLine Value="376"/> | ||||
| <CursorPos X="74" Y="397"/> | <CursorPos X="74" Y="397"/> | ||||
| <UsageCount Value="18"/> | |||||
| <UsageCount Value="23"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit43> | |||||
| <Unit44> | |||||
| </Unit44> | |||||
| <Unit45> | |||||
| <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\OpenGLCore\uglcArrayBuffer.pas"/> | <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\OpenGLCore\uglcArrayBuffer.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="102"/> | <TopLine Value="102"/> | ||||
| <CursorPos X="37" Y="112"/> | <CursorPos X="37" Y="112"/> | ||||
| <UsageCount Value="12"/> | <UsageCount Value="12"/> | ||||
| </Unit44> | |||||
| <Unit45> | |||||
| </Unit45> | |||||
| <Unit46> | |||||
| <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\OpenGLCore\uglcBitmap.pas"/> | <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\OpenGLCore\uglcBitmap.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="1047"/> | <TopLine Value="1047"/> | ||||
| <CursorPos X="15" Y="1043"/> | <CursorPos X="15" Y="1043"/> | ||||
| <UsageCount Value="10"/> | <UsageCount Value="10"/> | ||||
| </Unit45> | |||||
| <Unit46> | |||||
| </Unit46> | |||||
| <Unit47> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\objpas\objpas.pp"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\fpc\2.7.1\source\rtl\objpas\objpas.pp"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="19"/> | <TopLine Value="19"/> | ||||
| <CursorPos X="8" Y="35"/> | <CursorPos X="8" Y="35"/> | ||||
| <UsageCount Value="10"/> | <UsageCount Value="10"/> | ||||
| </Unit46> | |||||
| <Unit47> | |||||
| </Unit47> | |||||
| <Unit48> | |||||
| <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\include\application.inc"/> | <Filename Value="C:\Zusatzprogramme\Lazarus\lcl\include\application.inc"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="966"/> | <TopLine Value="966"/> | ||||
| <CursorPos Y="981"/> | <CursorPos Y="981"/> | ||||
| <UsageCount Value="10"/> | <UsageCount Value="10"/> | ||||
| </Unit47> | |||||
| <Unit48> | |||||
| </Unit48> | |||||
| <Unit49> | |||||
| <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\SpaceEngine\uengFrameLimiter.pas"/> | <Filename Value="..\bitSpace\_projects\MassiveUniverseOnline\bitSpaceEngine\src\SpaceEngine\uengFrameLimiter.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <TopLine Value="14"/> | <TopLine Value="14"/> | ||||
| <CursorPos X="13" Y="14"/> | <CursorPos X="13" Y="14"/> | ||||
| <UsageCount Value="10"/> | <UsageCount Value="10"/> | ||||
| </Unit48> | |||||
| <Unit49> | |||||
| </Unit49> | |||||
| <Unit50> | |||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | <Filename Value="..\..\old\TextSuiteClasses.pas"/> | ||||
| <UnitName Value="TextSuiteClasses"/> | <UnitName Value="TextSuiteClasses"/> | ||||
| <IsVisibleTab Value="True"/> | |||||
| <EditorIndex Value="2"/> | <EditorIndex Value="2"/> | ||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="2184"/> | |||||
| <CursorPos X="3" Y="2192"/> | |||||
| <UsageCount Value="12"/> | |||||
| <TopLine Value="1811"/> | |||||
| <CursorPos X="18" Y="1754"/> | |||||
| <UsageCount Value="17"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit49> | |||||
| <Unit50> | |||||
| </Unit50> | |||||
| <Unit51> | |||||
| <Filename Value="..\..\old\TextSuite.pas"/> | <Filename Value="..\..\old\TextSuite.pas"/> | ||||
| <UnitName Value="TextSuite"/> | <UnitName Value="TextSuite"/> | ||||
| <EditorIndex Value="3"/> | |||||
| <EditorIndex Value="9"/> | |||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="1293"/> | |||||
| <CursorPos X="44" Y="1298"/> | |||||
| <UsageCount Value="11"/> | |||||
| <TopLine Value="29"/> | |||||
| <CursorPos X="3" Y="45"/> | |||||
| <UsageCount Value="16"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit50> | |||||
| <Unit51> | |||||
| </Unit51> | |||||
| <Unit52> | |||||
| <Filename Value="..\..\old\TextSuiteWideUtils.pas"/> | <Filename Value="..\..\old\TextSuiteWideUtils.pas"/> | ||||
| <UnitName Value="TextSuiteWideUtils"/> | <UnitName Value="TextSuiteWideUtils"/> | ||||
| <EditorIndex Value="4"/> | |||||
| <EditorIndex Value="10"/> | |||||
| <WindowIndex Value="1"/> | <WindowIndex Value="1"/> | ||||
| <TopLine Value="1362"/> | <TopLine Value="1362"/> | ||||
| <CursorPos X="3" Y="1390"/> | <CursorPos X="3" Y="1390"/> | ||||
| <UsageCount Value="11"/> | |||||
| <UsageCount Value="16"/> | |||||
| <Loaded Value="True"/> | <Loaded Value="True"/> | ||||
| </Unit51> | |||||
| <Unit52> | |||||
| </Unit52> | |||||
| <Unit53> | |||||
| <Filename Value="..\..\utsWideStringUtils.pas"/> | <Filename Value="..\..\utsWideStringUtils.pas"/> | ||||
| <EditorIndex Value="-1"/> | <EditorIndex Value="-1"/> | ||||
| <CursorPos Y="9"/> | <CursorPos Y="9"/> | ||||
| <UsageCount Value="20"/> | <UsageCount Value="20"/> | ||||
| </Unit52> | |||||
| </Unit53> | |||||
| <Unit54> | |||||
| <Filename Value="..\..\old\TextSuiteCPUUtils.pas"/> | |||||
| <UnitName Value="TextSuiteCPUUtils"/> | |||||
| <EditorIndex Value="3"/> | |||||
| <WindowIndex Value="1"/> | |||||
| <UsageCount Value="15"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit54> | |||||
| <Unit55> | |||||
| <Filename Value="..\..\old\TextSuiteImports.pas"/> | |||||
| <UnitName Value="TextSuiteImports"/> | |||||
| <EditorIndex Value="4"/> | |||||
| <WindowIndex Value="1"/> | |||||
| <CursorPos X="41" Y="12"/> | |||||
| <UsageCount Value="15"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit55> | |||||
| <Unit56> | |||||
| <Filename Value="..\..\old\TextSuiteOptions.inc"/> | |||||
| <EditorIndex Value="5"/> | |||||
| <WindowIndex Value="1"/> | |||||
| <UsageCount Value="15"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit56> | |||||
| <Unit57> | |||||
| <Filename Value="..\..\old\TextSuitePostProcess.pas"/> | |||||
| <UnitName Value="TextSuitePostProcess"/> | |||||
| <IsVisibleTab Value="True"/> | |||||
| <EditorIndex Value="6"/> | |||||
| <WindowIndex Value="1"/> | |||||
| <TopLine Value="261"/> | |||||
| <CursorPos X="23" Y="345"/> | |||||
| <UsageCount Value="15"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit57> | |||||
| <Unit58> | |||||
| <Filename Value="..\..\old\TextSuiteTTFUtils.pas"/> | |||||
| <UnitName Value="TextSuiteTTFUtils"/> | |||||
| <EditorIndex Value="7"/> | |||||
| <WindowIndex Value="1"/> | |||||
| <UsageCount Value="15"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit58> | |||||
| <Unit59> | |||||
| <Filename Value="..\..\old\TextSuiteVersion.pas"/> | |||||
| <UnitName Value="TextSuiteVersion"/> | |||||
| <EditorIndex Value="8"/> | |||||
| <WindowIndex Value="1"/> | |||||
| <UsageCount Value="15"/> | |||||
| <Loaded Value="True"/> | |||||
| </Unit59> | |||||
| </Units> | </Units> | ||||
| <JumpHistory Count="30" HistoryIndex="29"> | |||||
| <JumpHistory Count="29" HistoryIndex="28"> | |||||
| <Position1> | <Position1> | ||||
| <Filename Value="..\..\utsTypes.pas"/> | |||||
| <Caret Line="190" TopLine="172"/> | |||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="878" TopLine="866"/> | |||||
| </Position1> | </Position1> | ||||
| <Position2> | <Position2> | ||||
| <Filename Value="..\..\utsTypes.pas"/> | |||||
| <Caret Line="191" TopLine="172"/> | |||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="879" TopLine="866"/> | |||||
| </Position2> | </Position2> | ||||
| <Position3> | <Position3> | ||||
| <Filename Value="..\..\utsTypes.pas"/> | |||||
| <Caret Line="192" TopLine="172"/> | |||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="880" TopLine="866"/> | |||||
| </Position3> | </Position3> | ||||
| <Position4> | <Position4> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="54" Column="14" TopLine="39"/> | |||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Caret Line="371" Column="23" TopLine="358"/> | |||||
| </Position4> | </Position4> | ||||
| <Position5> | <Position5> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="475" Column="20" TopLine="466"/> | |||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Caret Line="394" Column="68" TopLine="367"/> | |||||
| </Position5> | </Position5> | ||||
| <Position6> | <Position6> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | <Filename Value="..\..\utsTextSuite.pas"/> | ||||
| <Caret Line="471" TopLine="465"/> | |||||
| <Caret Line="882" Column="44" TopLine="866"/> | |||||
| </Position6> | </Position6> | ||||
| <Position7> | <Position7> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="472" TopLine="465"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="87" Column="69" TopLine="71"/> | |||||
| </Position7> | </Position7> | ||||
| <Position8> | <Position8> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="511" TopLine="495"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="65" Column="65" TopLine="38"/> | |||||
| </Position8> | </Position8> | ||||
| <Position9> | <Position9> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="515" Column="27" TopLine="495"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="243" Column="46" TopLine="223"/> | |||||
| </Position9> | </Position9> | ||||
| <Position10> | <Position10> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="512" Column="27" TopLine="496"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="240" Column="34" TopLine="224"/> | |||||
| </Position10> | </Position10> | ||||
| <Position11> | <Position11> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="471" TopLine="455"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="35" Column="15" TopLine="25"/> | |||||
| </Position11> | </Position11> | ||||
| <Position12> | <Position12> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="511" TopLine="495"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="91" Column="73" TopLine="71"/> | |||||
| </Position12> | </Position12> | ||||
| <Position13> | <Position13> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="519" Column="38" TopLine="495"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="234" Column="19" TopLine="219"/> | |||||
| </Position13> | </Position13> | ||||
| <Position14> | <Position14> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="513" TopLine="495"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="241" TopLine="222"/> | |||||
| </Position14> | </Position14> | ||||
| <Position15> | <Position15> | ||||
| <Filename Value="..\..\utsTypes.pas"/> | |||||
| <Caret Line="237" TopLine="221"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="246" TopLine="222"/> | |||||
| </Position15> | </Position15> | ||||
| <Position16> | <Position16> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="554" Column="44" TopLine="532"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="242" TopLine="222"/> | |||||
| </Position16> | </Position16> | ||||
| <Position17> | <Position17> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="536" Column="33" TopLine="520"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="245" TopLine="222"/> | |||||
| </Position17> | </Position17> | ||||
| <Position18> | <Position18> | ||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Caret Line="730" Column="14" TopLine="718"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="244" TopLine="222"/> | |||||
| </Position18> | </Position18> | ||||
| <Position19> | <Position19> | ||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="243" TopLine="222"/> | |||||
| </Position19> | </Position19> | ||||
| <Position20> | <Position20> | ||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Caret Line="43" Column="9" TopLine="28"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="242" TopLine="222"/> | |||||
| </Position20> | </Position20> | ||||
| <Position21> | <Position21> | ||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Caret Line="44" Column="32" TopLine="28"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="241" Column="36" TopLine="225"/> | |||||
| </Position21> | </Position21> | ||||
| <Position22> | <Position22> | ||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Caret Line="70" Column="16" TopLine="53"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="243" Column="56" TopLine="229"/> | |||||
| </Position22> | </Position22> | ||||
| <Position23> | <Position23> | ||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Caret Line="158" Column="9" TopLine="144"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="248" TopLine="227"/> | |||||
| </Position23> | </Position23> | ||||
| <Position24> | <Position24> | ||||
| <Filename Value="..\..\old\TextSuiteClasses.pas"/> | |||||
| <Caret Line="1978" Column="3" TopLine="1973"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="250" Column="80" TopLine="228"/> | |||||
| </Position24> | </Position24> | ||||
| <Position25> | <Position25> | ||||
| <Filename Value="..\..\utsRendererOpenGL.pas"/> | |||||
| <Caret Line="108" Column="32" TopLine="84"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="248" Column="28" TopLine="233"/> | |||||
| </Position25> | </Position25> | ||||
| <Position26> | <Position26> | ||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="135" Column="20" TopLine="118"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="250" Column="48" TopLine="233"/> | |||||
| </Position26> | </Position26> | ||||
| <Position27> | <Position27> | ||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="133" Column="31" TopLine="118"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="225" Column="3" TopLine="217"/> | |||||
| </Position27> | </Position27> | ||||
| <Position28> | <Position28> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="252" Column="19" TopLine="232"/> | |||||
| <Filename Value="..\..\utsPostProcess.pas"/> | |||||
| <Caret Line="246" Column="34" TopLine="228"/> | |||||
| </Position28> | </Position28> | ||||
| <Position29> | <Position29> | ||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="2128" Column="19" TopLine="2111"/> | |||||
| <Filename Value="uMainForm.pas"/> | |||||
| <Caret Line="91" Column="73" TopLine="71"/> | |||||
| </Position29> | </Position29> | ||||
| <Position30> | |||||
| <Filename Value="..\..\utsTextSuite.pas"/> | |||||
| <Caret Line="1759" Column="52" TopLine="1743"/> | |||||
| </Position30> | |||||
| </JumpHistory> | </JumpHistory> | ||||
| </ProjectSession> | </ProjectSession> | ||||
| <Debugging> | <Debugging> | ||||
| <BreakPoints Count="2"> | |||||
| <Item1> | |||||
| <Kind Value="bpkSource"/> | |||||
| <WatchScope Value="wpsLocal"/> | |||||
| <WatchKind Value="wpkWrite"/> | |||||
| <Source Value="..\..\utsTypes.pas"/> | |||||
| <Line Value="263"/> | |||||
| </Item1> | |||||
| <Item2> | |||||
| <Kind Value="bpkSource"/> | |||||
| <WatchScope Value="wpsLocal"/> | |||||
| <WatchKind Value="wpkWrite"/> | |||||
| <Source Value="..\..\utsTypes.pas"/> | |||||
| <Line Value="272"/> | |||||
| </Item2> | |||||
| </BreakPoints> | |||||
| <Watches Count="3"> | <Watches Count="3"> | ||||
| <Item1> | <Item1> | ||||
| <Expression Value="aItem"/> | <Expression Value="aItem"/> | ||||
| @@ -8,7 +8,7 @@ interface | |||||
| uses | uses | ||||
| Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, uglcContext, TextSuite, uglcTypes, | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, uglcContext, TextSuite, uglcTypes, | ||||
| utsTextSuite, utsTypes, utsFontCreatorGDI, utsRendererOpenGL; | |||||
| utsTextSuite, utsTypes, utsFontCreatorGDI, utsRendererOpenGL, utsPostProcess; | |||||
| type | type | ||||
| TMainForm = class(TForm) | TMainForm = class(TForm) | ||||
| @@ -53,6 +53,18 @@ const | |||||
| procedure TMainForm.FormCreate(Sender: TObject); | procedure TMainForm.FormCreate(Sender: TObject); | ||||
| var | var | ||||
| pf: TglcContextPixelFormatSettings; | pf: TglcContextPixelFormatSettings; | ||||
| pp: TtsPostProcessStep; | |||||
| pa: TtsImage; | |||||
| const | |||||
| data: array[0..63] of Byte = ( | |||||
| $FF, $AA, $88, $44, $44, $88, $AA, $FF, | |||||
| $AA, $88, $44, $22, $22, $44, $88, $AA, | |||||
| $88, $44, $22, $11, $11, $22, $44, $88, | |||||
| $44, $22, $11, $00, $00, $11, $22, $44, | |||||
| $44, $22, $11, $00, $00, $11, $22, $44, | |||||
| $88, $44, $22, $11, $11, $22, $44, $88, | |||||
| $AA, $88, $44, $22, $22, $44, $88, $AA, | |||||
| $FF, $AA, $88, $44, $44, $88, $AA, $FF); | |||||
| begin | begin | ||||
| pf := TglcContext.MakePF(); | pf := TglcContext.MakePF(); | ||||
| fContext := TglcContext.GetPlatformClass.Create(self, pf); | fContext := TglcContext.GetPlatformClass.Create(self, pf); | ||||
| @@ -67,9 +79,18 @@ begin | |||||
| tsFontBind(ftsFont); | tsFontBind(ftsFont); | ||||
| {$ELSE} | {$ELSE} | ||||
| ftsContext := TtsContext.Create; | ftsContext := TtsContext.Create; | ||||
| ftsRenderer := TtsRendererOpenGL.Create(ftsContext, tsFormatAlpha8); | |||||
| ftsRenderer := TtsRendererOpenGL.Create(ftsContext, tsFormatRGBA8); | |||||
| ftsGenerator := TtsFontGeneratorGDI.Create(ftsContext); | ftsGenerator := TtsFontGeneratorGDI.Create(ftsContext); | ||||
| ftsFont1 := ftsGenerator.GetFontByName('Calibri', ftsRenderer, 25, [tsStyleBold, tsStyleItalic], tsAANormal); | |||||
| pp := TtsPostProcessFillColor.Create(tsColor4f(0.0, 0.0, 0.0, 1.0), TS_MODES_MODULATE_ALPHA, TS_CHANNELS_RGBA); | |||||
| pp.AddUsageRange(tsUsageInclude, #$0000, #$FFFF); | |||||
| ftsGenerator.AddPostProcessStep(pp); | |||||
| pp := TtsPostProcessShadow.Create(3, 0, 2, 2, tsColor4f(1.0, 0.0, 1.0, 0.05)); | |||||
| pp.AddUsageRange(tsUsageInclude, #$0000, #$FFFF); | |||||
| ftsGenerator.AddPostProcessStep(pp); | |||||
| ftsFont1 := ftsGenerator.GetFontByName('Calibri', ftsRenderer, 100, [tsStyleBold, tsStyleItalic], tsAANormal); | |||||
| ftsFont2 := ftsGenerator.GetFontByName('Calibri', ftsRenderer, 20, [], tsAANormal); | ftsFont2 := ftsGenerator.GetFontByName('Calibri', ftsRenderer, 20, [], tsAANormal); | ||||
| {$ENDIF} | {$ENDIF} | ||||
| end; | end; | ||||
| @@ -113,7 +134,7 @@ begin | |||||
| fFrameTime := t; | fFrameTime := t; | ||||
| glViewport(0, 0, ClientWidth, ClientHeight); | glViewport(0, 0, ClientWidth, ClientHeight); | ||||
| glClearColor(0, 0, 0, 0); | |||||
| glClearColor(1, 1, 1, 0); | |||||
| glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); | ||||
| glMatrixMode(GL_PROJECTION); | glMatrixMode(GL_PROJECTION); | ||||
| @@ -123,7 +144,7 @@ begin | |||||
| glLoadIdentity; | glLoadIdentity; | ||||
| glEnable(GL_BLEND); | glEnable(GL_BLEND); | ||||
| glcBlendFunc(TglcBlendMode.bmAdditiveAlphaBlend); | |||||
| glcBlendFunc(TglcBlendMode.bmAlphaBlend); | |||||
| {$IFDEF USE_OLD_TS} | {$IFDEF USE_OLD_TS} | ||||
| tsTextBeginBlock(0, 0, ClientWidth, ClientHeight, TS_ALIGN_BLOCK); | tsTextBeginBlock(0, 0, ClientWidth, ClientHeight, TS_ALIGN_BLOCK); | ||||
| @@ -135,7 +156,7 @@ begin | |||||
| block.HorzAlign := tsHorzAlignJustify; | block.HorzAlign := tsHorzAlignJustify; | ||||
| block.ChangeFont(ftsFont1); | block.ChangeFont(ftsFont1); | ||||
| block.ChangeColor(tsColor4f(1.0, 0.0, 0.0, 1.0)); | |||||
| block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0)); | |||||
| block.TextOutW('L'); | block.TextOutW('L'); | ||||
| block.ChangeFont(ftsFont2); | block.ChangeFont(ftsFont2); | ||||
| @@ -143,7 +164,7 @@ begin | |||||
| block.TextOutW(TEST_STRING + sLineBreak); | block.TextOutW(TEST_STRING + sLineBreak); | ||||
| block.ChangeFont(ftsFont1); | block.ChangeFont(ftsFont1); | ||||
| block.ChangeColor(tsColor4f(0.0, 1.0, 0.0, 1.0)); | |||||
| block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0)); | |||||
| block.TextOutW('L'); | block.TextOutW('L'); | ||||
| block.ChangeFont(ftsFont2); | block.ChangeFont(ftsFont2); | ||||
| @@ -0,0 +1,261 @@ | |||||
| unit utsPostProcess; | |||||
| {$mode objfpc}{$H+} | |||||
| interface | |||||
| uses | |||||
| Classes, SysUtils, utsTextSuite, utsTypes; | |||||
| type | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TtsPostProcessFillColor = class(TtsPostProcessStep) | |||||
| private | |||||
| fColor: TtsColor4f; | |||||
| fModes: TtsImageModes; | |||||
| fChannels: TtsColorChannels; | |||||
| protected | |||||
| procedure Execute(const aChar: TtsChar; const aCharImage: TtsImage); override; | |||||
| public | |||||
| constructor Create(const aColor: TtsColor4f; | |||||
| const aModes: TtsImageModes; const aChannels: TtsColorChannels); | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TtsPostProcessFillPattern = class(TtsPostProcessStep) | |||||
| private | |||||
| fPattern: TtsImage; | |||||
| fOwnsPattern: Boolean; | |||||
| fX, fY: Integer; | |||||
| fModes: TtsImageModes; | |||||
| fChannels: TtsColorChannels; | |||||
| protected | |||||
| procedure Execute(const aChar: TtsChar; const aCharImage: TtsImage); override; | |||||
| public | |||||
| constructor Create(const aPattern: TtsImage; const aOwnsPattern: Boolean; const X, Y: Integer; | |||||
| const aModes: TtsImageModes; const aChannels: TtsColorChannels); | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TtsPostProcessBorder = class(TtsPostProcessStep) | |||||
| private | |||||
| fKernel: TtsKernel2D; | |||||
| fColor: TtsColor4f; | |||||
| fUpdateCharSize: Boolean; | |||||
| public | |||||
| procedure Execute(const aChar: TtsChar; const aCharImage: TtsImage); override; | |||||
| public | |||||
| constructor Create(const aWidth, aStrength: Single; const aColor: TtsColor4f; | |||||
| const aUpdateCharSize: Boolean = false); | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| TtsPostProcessShadow = class(TtsPostProcessStep) | |||||
| private | |||||
| fKernel: TtsKernel1D; | |||||
| fColor: TtsColor4f; | |||||
| fX, fY: Integer; | |||||
| protected | |||||
| procedure Execute(const aChar: TtsChar; const aCharImage: TtsImage); override; | |||||
| public | |||||
| constructor Create(const aRadius, aStrength: Single; const X, Y: Integer; const aColor: TtsColor4f); | |||||
| destructor Destroy; override; | |||||
| end; | |||||
| implementation | |||||
| uses | |||||
| Math; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TtsPostProcessFillColor/////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TtsPostProcessFillColor.Execute(const aChar: TtsChar; const aCharImage: TtsImage); | |||||
| begin | |||||
| if Assigned(aCharImage) then | |||||
| aCharImage.FillColor(fColor, fChannels, fModes); | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TtsPostProcessFillColor.Create(const aColor: TtsColor4f; const aModes: TtsImageModes; const aChannels: TtsColorChannels); | |||||
| begin | |||||
| inherited Create; | |||||
| fColor := aColor; | |||||
| fModes := aModes; | |||||
| fChannels := aChannels; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TtsPostProcessFillPattern///////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TtsPostProcessFillPattern.Execute(const aChar: TtsChar; const aCharImage: TtsImage); | |||||
| begin | |||||
| if Assigned(aCharImage) then | |||||
| aCharImage.FillPattern(fPattern, fX, fY, fChannels, fModes); | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TtsPostProcessFillPattern.Create(const aPattern: TtsImage; const aOwnsPattern: Boolean; const X, | |||||
| Y: Integer; const aModes: TtsImageModes; const aChannels: TtsColorChannels); | |||||
| begin | |||||
| inherited Create; | |||||
| fPattern := aPattern; | |||||
| fOwnsPattern := aOwnsPattern; | |||||
| fX := X; | |||||
| fY := Y; | |||||
| fModes := aModes; | |||||
| fChannels := aChannels; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TtsPostProcessFillPattern.Destroy; | |||||
| begin | |||||
| if fOwnsPattern then | |||||
| FreeAndNil(fPattern); | |||||
| inherited Destroy; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TtsPostProcessBorder////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TtsPostProcessBorder.Execute(const aChar: TtsChar; const aCharImage: TtsImage); | |||||
| var | |||||
| orig: TtsImage; | |||||
| x, y: Integer; | |||||
| dst: PByte; | |||||
| function BorderLookup: TtsColor4f; | |||||
| var | |||||
| i: Integer; | |||||
| c: TtsColor4f; | |||||
| s: Single; | |||||
| chan: TtsColorChannel; | |||||
| mask: TtsColorChannels; | |||||
| tmpX, tmpY: Integer; | |||||
| begin | |||||
| mask := TS_CHANNELS_RGBA; | |||||
| result := tsColor4f(0, 0, 0, 0); | |||||
| for i := 0 to fKernel.ItemCount-1 do begin | |||||
| tmpX := x + fKernel.Items[i].OffsetX; | |||||
| tmpY := y + fKernel.Items[i].OffsetY; | |||||
| if (tmpX >= 0) and (tmpX < orig.Width) and | |||||
| (tmpY >= 0) and (tmpY < orig.Height) and | |||||
| orig.GetPixelAt(tmpX, tmpY, c) then | |||||
| begin | |||||
| for chan in mask do begin | |||||
| s := c.arr[Integer(chan)] * fColor.arr[Integer(chan)] * fKernel.Items[i].Value; | |||||
| if (s > result.arr[Integer(chan)]) then begin | |||||
| result.arr[Integer(chan)] := s; | |||||
| if (s >= 1.0) then begin | |||||
| Exclude(mask, chan); | |||||
| if (mask = []) then | |||||
| exit; | |||||
| end; | |||||
| end; | |||||
| end; | |||||
| end; | |||||
| end; | |||||
| end; | |||||
| begin | |||||
| if not Assigned(aCharImage) then | |||||
| exit; | |||||
| aCharImage.Resize( | |||||
| aCharImage.Width + 2 * fKernel.SizeX, | |||||
| aCharImage.Height + 2 * fKernel.SizeY, | |||||
| fKernel.SizeX, fKernel.SizeY); | |||||
| orig := TtsImage.Create; | |||||
| try | |||||
| orig.Assign(aCharImage); | |||||
| aCharImage.FillColor(fColor, TS_CHANNELS_RGBA, TS_MODES_REPLACE_ALL); | |||||
| for y := 0 to orig.Height-1 do begin | |||||
| dst := aCharImage.Scanline[y]; | |||||
| for x := 0 to orig.Width-1 do | |||||
| tsFormatMap(aCharImage.Format, dst, BorderLookup); | |||||
| end; | |||||
| aCharImage.Blend(orig, 0, 0, @tsBlendFundAdditiveAlpha); | |||||
| finally | |||||
| FreeAndNil(orig); | |||||
| end; | |||||
| if fUpdateCharSize then begin | |||||
| aChar.GlyphRect := tsRect( | |||||
| aChar.GlyphRect.Left + fKernel.SizeX - fKernel.MidSizeX, | |||||
| aChar.GlyphRect.Top + fKernel.SizeY - fKernel.MidSizeY, | |||||
| aChar.GlyphRect.Right + fKernel.SizeX + fKernel.MidSizeX, | |||||
| aChar.GlyphRect.Bottom + fKernel.SizeY + fKernel.MidSizeY); | |||||
| aChar.GlyphOrigin := tsPosition( | |||||
| aChar.GlyphOrigin.x + fKernel.MidSizeX, | |||||
| aChar.GlyphOrigin.y + fKernel.MidSizeY); | |||||
| aChar.Advance := aChar.Advance + fKernel.MidSizeX ; | |||||
| end; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TtsPostProcessBorder.Create(const aWidth, aStrength: Single; const aColor: TtsColor4f; | |||||
| const aUpdateCharSize: Boolean); | |||||
| begin | |||||
| inherited Create; | |||||
| fKernel := TtsKernel2D.Create(aWidth, aStrength); | |||||
| fColor := aColor; | |||||
| fUpdateCharSize := aUpdateCharSize; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TtsPostProcessBorder.Destroy; | |||||
| begin | |||||
| FreeAndNil(fKernel); | |||||
| inherited Destroy; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TtsPostProcessShadow////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure TtsPostProcessShadow.Execute(const aChar: TtsChar; const aCharImage: TtsImage); | |||||
| var | |||||
| orig: TtsImage; | |||||
| tmpX, tmpY: Integer; | |||||
| begin | |||||
| orig := TtsImage.Create; | |||||
| try | |||||
| orig.Assign(aCharImage); | |||||
| aCharImage.Resize( | |||||
| aCharImage.Width + 2 * fKernel.Size, | |||||
| aCharImage.Height + 2 * fKernel.Size, | |||||
| fKernel.Size, fKernel.Size); | |||||
| aCharImage.FillColor(fColor, TS_CHANNELS_RGBA, TS_MODES_MODULATE_ALPHA); | |||||
| aCharImage.Blur(fKernel, fKernel, [tsChannelAlpha]); | |||||
| tmpX := fKernel.Size - fX; | |||||
| tmpY := fKernel.Size - fY; | |||||
| aCharImage.Blend(orig, tmpX, tmpY, @tsBlendFundAlpha); | |||||
| finally | |||||
| FreeAndNil(orig); | |||||
| end; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TtsPostProcessShadow.Create(const aRadius, aStrength: Single; const X, Y: Integer; const aColor: TtsColor4f); | |||||
| begin | |||||
| inherited Create; | |||||
| fKernel := TtsKernel1D.Create(aRadius, aStrength); | |||||
| fX := X; | |||||
| fY := Y; | |||||
| fColor := aColor; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| destructor TtsPostProcessShadow.Destroy; | |||||
| begin | |||||
| FreeAndNil(fKernel); | |||||
| inherited Destroy; | |||||
| end; | |||||
| end. | |||||
| @@ -107,6 +107,10 @@ const | |||||
| ( //tsFormatAlpha8 | ( //tsFormatAlpha8 | ||||
| InternalFormat: GL_ALPHA8; | InternalFormat: GL_ALPHA8; | ||||
| Format: GL_ALPHA; | Format: GL_ALPHA; | ||||
| DataFormat: GL_UNSIGNED_BYTE), | |||||
| ( //tsFormatAlpha8 | |||||
| InternalFormat: GL_LUMINANCE8; | |||||
| Format: GL_LUMINANCE; | |||||
| DataFormat: GL_UNSIGNED_BYTE) | DataFormat: GL_UNSIGNED_BYTE) | ||||
| ); | ); | ||||
| @@ -19,7 +19,6 @@ type | |||||
| TtsKernel1DItem = packed record | TtsKernel1DItem = packed record | ||||
| Offset: Integer; | Offset: Integer; | ||||
| Value: Single; | Value: Single; | ||||
| DataOffset: Integer; | |||||
| end; | end; | ||||
| TtsKernel1D = class | TtsKernel1D = class | ||||
| @@ -30,11 +29,36 @@ type | |||||
| constructor Create(const aRadius, aStrength: Single); | constructor Create(const aRadius, aStrength: Single); | ||||
| end; | end; | ||||
| TtsKernel2DItem = packed record | |||||
| OffsetX: Integer; | |||||
| OffsetY: Integer; | |||||
| Value: Double; | |||||
| DataOffset: Integer; | |||||
| end; | |||||
| TtsKernel2D = class | |||||
| public | |||||
| SizeX: Integer; | |||||
| SizeY: Integer; | |||||
| MidSizeX: Integer; | |||||
| MidSizeY: Integer; | |||||
| ValueSum: Double; | |||||
| Items: array of TtsKernel2DItem; | |||||
| ItemCount: Integer; | |||||
| constructor Create(const aRadius, aStrength: Single); | |||||
| end; | |||||
| TtsImageFunc = procedure(const aImage: TtsImage; X, Y: Integer; var aPixel: TtsColor4f; aArgs: Pointer); | TtsImageFunc = procedure(const aImage: TtsImage; X, Y: Integer; var aPixel: TtsColor4f; aArgs: Pointer); | ||||
| TtsImage = class(TObject) | TtsImage = class(TObject) | ||||
| private | private | ||||
| fWidth: Integer; | fWidth: Integer; | ||||
| fHeight: Integer; | fHeight: Integer; | ||||
| fDataSize: Integer; | |||||
| fLineSize: Integer; | |||||
| fFormat: TtsFormat; | fFormat: TtsFormat; | ||||
| fData: Pointer; | fData: Pointer; | ||||
| @@ -43,14 +67,18 @@ type | |||||
| function GetScanline(const aIndex: Integer): Pointer; | function GetScanline(const aIndex: Integer): Pointer; | ||||
| function GetIsEmpty: Boolean; | function GetIsEmpty: Boolean; | ||||
| procedure SetData(const aData: Pointer; const aFormat: TtsFormat = tsFormatEmpty; const aWidth: Integer = 0; const aHeight: Integer = 0); | |||||
| procedure SetData(const aData: Pointer; const aFormat: TtsFormat = tsFormatEmpty; | |||||
| const aWidth: Integer = 0; const aHeight: Integer = 0; | |||||
| const aLineSize: Integer = 0; const aDataSize: Integer = 0); | |||||
| procedure UpdateScanlines; | procedure UpdateScanlines; | ||||
| public | public | ||||
| property IsEmpty: Boolean read GetIsEmpty; | |||||
| property Width: Integer read fWidth; | |||||
| property Height: Integer read fHeight; | |||||
| property Format: TtsFormat read fFormat; | |||||
| property Data: Pointer read fData; | |||||
| property IsEmpty: Boolean read GetIsEmpty; | |||||
| property Width: Integer read fWidth; | |||||
| property Height: Integer read fHeight; | |||||
| property LineSize: Integer read fLineSize; | |||||
| property DataSize: Integer read fDataSize; | |||||
| property Format: TtsFormat read fFormat; | |||||
| property Data: Pointer read fData; | |||||
| property Scanline[const aIndex: Integer]: Pointer read GetScanline; | property Scanline[const aIndex: Integer]: Pointer read GetScanline; | ||||
| function GetPixelAt(const x, y: Integer; out aColor: TtsColor4f): Boolean; | function GetPixelAt(const x, y: Integer; out aColor: TtsColor4f): Boolean; | ||||
| @@ -64,7 +92,7 @@ type | |||||
| procedure FillColor(const aColor: TtsColor4f; const aChannelMask: TtsColorChannels; const aModes: TtsImageModes); | procedure FillColor(const aColor: TtsColor4f; const aChannelMask: TtsColorChannels; const aModes: TtsImageModes); | ||||
| procedure FillPattern(const aPattern: TtsImage; X, Y: Integer; const aChannelMask: TtsColorChannels; const aModes: TtsImageModes); | procedure FillPattern(const aPattern: TtsImage; X, Y: Integer; const aChannelMask: TtsColorChannels; const aModes: TtsImageModes); | ||||
| procedure BlendImage(const aImage: TtsImage; const X, Y: Integer); | |||||
| procedure Blend(const aImage: TtsImage; const X, Y: Integer; const aFunc: TtsBlendFunc); | |||||
| procedure Blur(const aHorzKernel, aVertKernel: TtsKernel1D; const aChannelMask: TtsColorChannels); | procedure Blur(const aHorzKernel, aVertKernel: TtsKernel1D; const aChannelMask: TtsColorChannels); | ||||
| procedure AddResizingBorder; | procedure AddResizingBorder; | ||||
| @@ -159,9 +187,10 @@ type | |||||
| fExcludeCharRange: TList; | fExcludeCharRange: TList; | ||||
| procedure ClearList(const aList: TList); | procedure ClearList(const aList: TList); | ||||
| protected | |||||
| procedure Execute(const aChar: TtsChar; const aCharImage: TtsImage); virtual; abstract; | |||||
| public | public | ||||
| function IsInRange(const aCharCode: WideChar): Boolean; | function IsInRange(const aCharCode: WideChar): Boolean; | ||||
| procedure Execute(const aChar: TtsChar; const aCharImage: TtsImage); virtual; abstract; | |||||
| procedure AddUsageRange(const aUsage: TtsFontProcessStepUsage; const aStartChar, aEndChar: WideChar); | procedure AddUsageRange(const aUsage: TtsFontProcessStepUsage; const aStartChar, aEndChar: WideChar); | ||||
| procedure AddUsageChars(const aUsage: TtsFontProcessStepUsage; aChars: PWideChar); | procedure AddUsageChars(const aUsage: TtsFontProcessStepUsage; aChars: PWideChar); | ||||
| @@ -464,6 +493,116 @@ begin | |||||
| end; | end; | ||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //TtsKernel2D/////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| constructor TtsKernel2D.Create(const aRadius, aStrength: Single); | |||||
| var | |||||
| tmpStrenght: Double; | |||||
| tmpRadius: Double; | |||||
| tmpValue: Double; | |||||
| sqrRadius: Double; | |||||
| x, y, w, h: Integer; | |||||
| function CalcValue(const aIndex: Double): Double; | |||||
| begin | |||||
| result := max(0, Abs(aIndex) - tmpStrenght); | |||||
| result := Sqr(result * tmpRadius) / sqrRadius; | |||||
| result := Exp(-result); | |||||
| end; | |||||
| procedure CalcSize(var aSize, aMidSize: Integer); | |||||
| begin | |||||
| aSize := 0; | |||||
| aMidSize := 0; | |||||
| while CalcValue(aSize) > 0.5 do begin | |||||
| inc(aSize, 1); | |||||
| inc(aMidSize, 1); | |||||
| end; | |||||
| while CalcValue(aSize) > 0.001 do | |||||
| Inc(aSize, 1); | |||||
| end; | |||||
| procedure SetItem(const x, y: Integer); | |||||
| begin | |||||
| with Items[(SizeY + y) * w + (SizeX + x)] do begin | |||||
| OffsetX := x; | |||||
| OffsetY := y; | |||||
| Value := tmpValue; | |||||
| end; | |||||
| end; | |||||
| procedure QuickSort(l, r: Integer); | |||||
| var | |||||
| _l, _r: Integer; | |||||
| p, t: TtsKernel2DItem; | |||||
| begin | |||||
| repeat | |||||
| _l := l; | |||||
| _r := r; | |||||
| p := Items[(l + r) shr 1]; | |||||
| repeat | |||||
| while (Items[_l].Value > p.Value) do | |||||
| inc(_l, 1); | |||||
| while (Items[_r].Value < p.Value) do | |||||
| dec(_r, 1); | |||||
| if (_l <= _r) then begin | |||||
| t := Items[_l]; | |||||
| Items[_l] := Items[_r]; | |||||
| Items[_r] := t; | |||||
| inc(_l, 1); | |||||
| dec(_r, 1); | |||||
| end; | |||||
| until (_l > _r); | |||||
| if (l < _r) then | |||||
| QuickSort(l, _r); | |||||
| l := _l; | |||||
| until (_l >= r); | |||||
| end; | |||||
| begin | |||||
| inherited Create; | |||||
| tmpStrenght := Min(aRadius - 1.0, aRadius * aStrength); | |||||
| tmpRadius := aRadius - tmpStrenght; | |||||
| sqrRadius := sqr(tmpRadius) * sqr(tmpRadius); | |||||
| CalcSize(SizeX, MidSizeX); | |||||
| CalcSize(SizeY, MidSizeY); | |||||
| ValueSum := 0.0; | |||||
| w := 2 * SizeX + 1; | |||||
| h := 2 * SizeY + 1; | |||||
| ItemCount := w * h; | |||||
| SetLength(Items, ItemCount); | |||||
| for y := 0 to SizeY do begin | |||||
| for x := 0 to SizeX do begin | |||||
| tmpValue := CalcValue(sqrt(Sqr(x) + Sqr(y))); | |||||
| SetItem( x, y); | |||||
| SetItem( x, -y); | |||||
| SetItem(-x, -y); | |||||
| SetItem(-x, y); | |||||
| ValueSum := ValueSum + tmpValue; | |||||
| if (x > 0) and (y > 0) then | |||||
| ValueSum := ValueSum + tmpValue; | |||||
| end; | |||||
| end; | |||||
| QuickSort(0, ItemCount-1); | |||||
| while (Items[ItemCount-1].Value < 0.001) do | |||||
| dec(ItemCount, 1); | |||||
| SetLength(Items, ItemCount); | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //TtsImage////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TtsImage////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -485,7 +624,8 @@ begin | |||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TtsImage.SetData(const aData: Pointer; const aFormat: TtsFormat; const aWidth: Integer; const aHeight: Integer); | |||||
| procedure TtsImage.SetData(const aData: Pointer; const aFormat: TtsFormat; const aWidth: Integer; | |||||
| const aHeight: Integer; const aLineSize: Integer; const aDataSize: Integer); | |||||
| begin | begin | ||||
| fHasScanlines := false; | fHasScanlines := false; | ||||
| if Assigned(fData) then | if Assigned(fData) then | ||||
| @@ -493,28 +633,30 @@ begin | |||||
| fData := aData; | fData := aData; | ||||
| if Assigned(fData) then begin | if Assigned(fData) then begin | ||||
| fWidth := aWidth; | |||||
| fHeight := aHeight; | |||||
| fFormat := aFormat; | |||||
| fWidth := aWidth; | |||||
| fHeight := aHeight; | |||||
| fFormat := aFormat; | |||||
| fLineSize := aLineSize; | |||||
| fDataSize := aDataSize; | |||||
| end else begin | end else begin | ||||
| fWidth := 0; | |||||
| fHeight := 0; | |||||
| fFormat := tsFormatEmpty; | |||||
| fWidth := 0; | |||||
| fHeight := 0; | |||||
| fLineSize := 0; | |||||
| fDataSize := 0; | |||||
| fFormat := tsFormatEmpty; | |||||
| end; | end; | ||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TtsImage.UpdateScanlines; | procedure TtsImage.UpdateScanlines; | ||||
| var | var | ||||
| i, LineSize: Integer; | |||||
| i: Integer; | |||||
| tmp: PByte; | tmp: PByte; | ||||
| begin | begin | ||||
| LineSize := fWidth * tsFormatSize(fFormat); | |||||
| LineSize := LineSize + ((4 - (LineSize mod 4)) mod 4); | |||||
| SetLength(fScanlines, fHeight); | SetLength(fScanlines, fHeight); | ||||
| for i := 0 to fHeight-1 do begin | for i := 0 to fHeight-1 do begin | ||||
| tmp := fData; | tmp := fData; | ||||
| inc(tmp, i * LineSize); | |||||
| inc(tmp, i * fLineSize); | |||||
| fScanlines[i] := tmp; | fScanlines[i] := tmp; | ||||
| end; | end; | ||||
| fHasScanlines := true; | fHasScanlines := true; | ||||
| @@ -537,27 +679,25 @@ end; | |||||
| procedure TtsImage.Assign(const aImage: TtsImage); | procedure TtsImage.Assign(const aImage: TtsImage); | ||||
| var | var | ||||
| ImgData: Pointer; | ImgData: Pointer; | ||||
| ImgSize, LineSize: Integer; | |||||
| begin | begin | ||||
| LineSize := aImage.Width * tsFormatSize(aImage.Format); | |||||
| LineSize := LineSize + ((4 - (LineSize mod 4)) mod 4); | |||||
| ImgSize := LineSize * aImage.Height; | |||||
| GetMem(ImgData, ImgSize); | |||||
| GetMem(ImgData, aImage.DataSize); | |||||
| if Assigned(ImgData) then | if Assigned(ImgData) then | ||||
| Move(aImage.Data, ImgData, ImgSize); | |||||
| SetData(ImgData, aImage.Format, aImage.Width, aImage.Height); | |||||
| Move(aImage.Data^, ImgData^, aImage.DataSize); | |||||
| SetData(ImgData, aImage.Format, aImage.Width, aImage.Height, aImage.LineSize, aImage.DataSize); | |||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TtsImage.CreateEmpty(const aFormat: TtsFormat; const aWidth, aHeight: Integer); | procedure TtsImage.CreateEmpty(const aFormat: TtsFormat; const aWidth, aHeight: Integer); | ||||
| var | var | ||||
| ImgData: PByte; | ImgData: PByte; | ||||
| LineSize: Integer; | |||||
| lSize, dSize: Integer; | |||||
| begin | begin | ||||
| LineSize := aWidth * tsFormatSize(aFormat); | |||||
| LineSize := LineSize + ((4 - (LineSize mod 4)) mod 4); | |||||
| ImgData := AllocMem(aHeight * LineSize); | |||||
| SetData(ImgData, aFormat, aWidth, aHeight); | |||||
| lSize := aWidth * tsFormatSize(aFormat); | |||||
| lSize := lSize + ((4 - (lSize mod 4)) mod 4); | |||||
| dSize := aHeight * lSize; | |||||
| ImgData := AllocMem(dSize); | |||||
| FillByte(ImgData^, dSize, 0); | |||||
| SetData(ImgData, aFormat, aWidth, aHeight, lSize, dSize); | |||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -582,7 +722,7 @@ end; | |||||
| procedure TtsImage.Resize(const aNewWidth, aNewHeight, X, Y: Integer); | procedure TtsImage.Resize(const aNewWidth, aNewHeight, X, Y: Integer); | ||||
| var | var | ||||
| ImgData: PByte; | ImgData: PByte; | ||||
| PixSize, LineSize, ImageSize, OrgLineSize: Integer; | |||||
| pSize, lSize, dSize: Integer; | |||||
| src, dst: PByte; | src, dst: PByte; | ||||
| YStart, YEnd, YPos, XStart, XEnd: Integer; | YStart, YEnd, YPos, XStart, XEnd: Integer; | ||||
| @@ -592,14 +732,14 @@ begin | |||||
| exit; | exit; | ||||
| end; | end; | ||||
| PixSize := tsFormatSize(Format); | |||||
| LineSize := PixSize * aNewWidth; | |||||
| ImageSize := LineSize * aNewHeight; | |||||
| OrgLineSize := PixSize * Width; | |||||
| pSize := tsFormatSize(Format); | |||||
| lSize := pSize * aNewWidth; | |||||
| lSize := lSize + ((4 - (lSize mod 4)) mod 4); | |||||
| dSize := lSize * aNewHeight; | |||||
| GetMem(ImgData, ImageSize); | |||||
| GetMem(ImgData, dSize); | |||||
| try | try | ||||
| FillChar(ImgData^, ImageSize, 0); | |||||
| FillChar(ImgData^, dSize, 0); | |||||
| // positions | // positions | ||||
| YStart := Max(0, Y); | YStart := Max(0, Y); | ||||
| @@ -610,16 +750,16 @@ begin | |||||
| // copy data | // copy data | ||||
| for YPos := YStart to YEnd -1 do begin | for YPos := YStart to YEnd -1 do begin | ||||
| dst := ImgData; | dst := ImgData; | ||||
| Inc(dst, LineSize * YPos + PixSize * XStart); | |||||
| Inc(dst, lSize * YPos + pSize * XStart); | |||||
| src := fData; | src := fData; | ||||
| Inc(src, OrgLineSize * (YPos - Y) + PixSize * (XStart - X)); | |||||
| Inc(src, fLineSize * (YPos - Y) + pSize * (XStart - X)); | |||||
| Move(src^, dst^, (XEnd - XStart) * PixSize); | |||||
| Move(src^, dst^, (XEnd - XStart) * pSize); | |||||
| end; | end; | ||||
| // assign | // assign | ||||
| SetData(ImgData, Format, aNewWidth, aNewHeight); | |||||
| SetData(ImgData, Format, aNewWidth, aNewHeight, lSize, dSize); | |||||
| except | except | ||||
| FreeMem(ImgData); | FreeMem(ImgData); | ||||
| end; | end; | ||||
| @@ -663,20 +803,22 @@ end; | |||||
| procedure TtsImage.FillColor(const aColor: TtsColor4f; const aChannelMask: TtsColorChannels; const aModes: TtsImageModes); | procedure TtsImage.FillColor(const aColor: TtsColor4f; const aChannelMask: TtsColorChannels; const aModes: TtsImageModes); | ||||
| var | var | ||||
| x, y: Integer; | x, y: Integer; | ||||
| p: PByte; | |||||
| rp, wp: PByte; | |||||
| c: TtsColor4f; | c: TtsColor4f; | ||||
| ch: TtsColorChannel; | ch: TtsColorChannel; | ||||
| i: Integer; | i: Integer; | ||||
| begin | begin | ||||
| for y := 0 to Height-1 do begin | for y := 0 to Height-1 do begin | ||||
| p := Scanline[y]; | |||||
| rp := Scanline[y]; | |||||
| wp := rp; | |||||
| for x := 0 to Width-1 do begin | for x := 0 to Width-1 do begin | ||||
| tsFormatUnmap(Format, p, c); | |||||
| tsFormatUnmap(Format, rp, c); | |||||
| for i := 0 to 3 do begin | for i := 0 to 3 do begin | ||||
| ch := TtsColorChannel(i); | ch := TtsColorChannel(i); | ||||
| if (ch in aChannelMask) then | if (ch in aChannelMask) then | ||||
| c.arr[i] := IMAGE_MODE_FUNCTIONS[aModes[ch]](aColor.arr[i], c.arr[i]); | c.arr[i] := IMAGE_MODE_FUNCTIONS[aModes[ch]](aColor.arr[i], c.arr[i]); | ||||
| end; | end; | ||||
| tsFormatMap(Format, wp, c); | |||||
| end; | end; | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -708,7 +850,7 @@ begin | |||||
| end; | end; | ||||
| tmp := dst; | tmp := dst; | ||||
| tsFormatUnmap(Format, src, cSrc); | |||||
| tsFormatUnmap(aPattern.Format, src, cSrc); | |||||
| tsFormatUnmap(Format, tmp, cDst); | tsFormatUnmap(Format, tmp, cDst); | ||||
| for i := 0 to 3 do begin | for i := 0 to 3 do begin | ||||
| ch := TtsColorChannel(i); | ch := TtsColorChannel(i); | ||||
| @@ -722,97 +864,30 @@ begin | |||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure TtsImage.BlendImage(const aImage: TtsImage; const X, Y: Integer); | |||||
| procedure TtsImage.Blend(const aImage: TtsImage; const X, Y: Integer; const aFunc: TtsBlendFunc); | |||||
| var | var | ||||
| _x, _y, i: Integer; | |||||
| c, cOver, cUnder: TtsColor4f; | |||||
| FaqOver, FaqUnder: Single; | |||||
| UnionRect, IntersectRect: TtsRect; | |||||
| NewSize: TtsPosition; | |||||
| ImgSize: Integer; | |||||
| ImgData, dst, src, pOver, pUnder: PByte; | |||||
| tmpLines: array of Pointer; | |||||
| begin | |||||
| UnionRect := tsRect( | |||||
| Min(X, 0), | |||||
| Min(Y, 0), | |||||
| Max(X + aImage.Width, Width), | |||||
| Max(Y + aImage.Height, Height)); | |||||
| IntersectRect := tsRect( | |||||
| Max(X, 0), | |||||
| Max(Y, 0), | |||||
| Min(X + aImage.Width, Width), | |||||
| Min(X + aImage.Height, Height)); | |||||
| NewSize := tsPosition( | |||||
| UnionRect.Right - UnionRect.Left, | |||||
| UnionRect.Bottom - UnionRect.Top); | |||||
| ImgSize := NewSize.x * NewSize.y * tsFormatSize(Format); | |||||
| GetMem(ImgData, ImgSize); | |||||
| try | |||||
| FillByte(ImgData^, ImgSize, $00); | |||||
| // temporary scanlines | |||||
| SetLength(tmpLines, NewSize.y); | |||||
| for _y := 0 to NewSize.y-1 do begin | |||||
| tmpLines[_y] := ImgData; | |||||
| inc(tmpLines[_y], _y * NewSize.y); | |||||
| end; | |||||
| // copy data from underlaying image | |||||
| for _y := 0 to Height-1 do begin | |||||
| src := Scanline[_y]; | |||||
| dst := tmpLines[_y - UnionRect.Top]; | |||||
| dec(dst, UnionRect.Left); | |||||
| for _x := 0 to Width-1 do begin | |||||
| dst^ := src^; | |||||
| inc(src); | |||||
| inc(dst); | |||||
| end; | |||||
| end; | |||||
| // copy data from overlaying image | |||||
| for _y := 0 to aImage.Height-1 do begin | |||||
| src := aImage.Scanline[_y]; | |||||
| dst := tmpLines[_y + y - UnionRect.Top]; | |||||
| inc(dst, X - UnionRect.Left); | |||||
| for _x := 0 to Width-1 do begin | |||||
| dst^ := src^; | |||||
| inc(src); | |||||
| inc(dst); | |||||
| end; | |||||
| end; | |||||
| // blend overlapped | |||||
| for _y := IntersectRect.Top to IntersectRect.Bottom-1 do begin | |||||
| pOver := aImage.Scanline[_y - Min(IntersectRect.Top, UnionRect.Top)]; | |||||
| inc(pOver, IntersectRect.Left - UnionRect.Left); | |||||
| pUnder := Scanline[_y - Min(IntersectRect.Top, 0)]; | |||||
| inc(pUnder, IntersectRect.Left); | |||||
| dst := tmpLines[_y - Min(Y, 0)]; | |||||
| inc(dst, IntersectRect.Left - Min(X, 0)); | |||||
| for _x := IntersectRect.Left to IntersectRect.Right-1 do begin | |||||
| tsFormatUnmap(aImage.Format, pOver, cOver); | |||||
| tsFormatUnmap(Format, pUnder, cUnder); | |||||
| c.a := cOver.a + cUnder.a * (1 - cOver.a); | |||||
| if (c.a > 0) then begin | |||||
| FaqUnder := (cUnder.a * (1 - cOver.a)) / c.a; | |||||
| FaqOver := cOver.a / c.a; | |||||
| for i := 0 to 2 do | |||||
| c.arr[i] := cOver.arr[i] * FaqOver + cUnder.arr[i] * FaqUnder; | |||||
| end else begin | |||||
| c.r := 0; | |||||
| c.g := 0; | |||||
| c.b := 0; | |||||
| end; | |||||
| tsFormatMap(Format, dst, c); | |||||
| end; | |||||
| _x, _y, x1, x2, y1, y2: Integer; | |||||
| src, dst, tmp: PByte; | |||||
| srcColor, dstColor: TtsColor4f; | |||||
| srcPixelSize, dstPixelSize: Integer; | |||||
| begin | |||||
| x1 := Max(X, 0); | |||||
| x2 := Min(X + aImage.Width , Width); | |||||
| y1 := Max(Y, 0); | |||||
| y2 := Min(Y + aImage.Height, Height); | |||||
| srcPixelSize := tsFormatSize(aImage.Format); | |||||
| dstPixelSize := tsFormatSize(Format); | |||||
| for _y := y1 to y2-1 do begin | |||||
| src := aImage.Scanline[_y - min(y1, y)]; | |||||
| dst := Scanline[_y]; | |||||
| inc(src, (x1 - x) * srcPixelSize); | |||||
| inc(dst, x1 * dstPixelSize); | |||||
| tmp := dst; | |||||
| for _x := x1 to x2-1 do begin | |||||
| tsFormatUnmap(aImage.Format, src, srcColor); | |||||
| tsFormatUnmap( Format, dst, dstColor); | |||||
| tsFormatMap(aImage.Format, tmp, aFunc(srcColor, dstColor)); | |||||
| end; | end; | ||||
| except | |||||
| FreeMem(ImgData); | |||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -77,7 +77,8 @@ type | |||||
| tsFormatEmpty, | tsFormatEmpty, | ||||
| tsFormatRGBA8, | tsFormatRGBA8, | ||||
| tsFormatLumAlpha8, | tsFormatLumAlpha8, | ||||
| tsFormatAlpha8); | |||||
| tsFormatAlpha8, | |||||
| tsFormatLum8); | |||||
| TtsAntiAliasing = ( | TtsAntiAliasing = ( | ||||
| tsAANone, | tsAANone, | ||||
| @@ -168,7 +169,18 @@ type | |||||
| LineSpacing: Integer; | LineSpacing: Integer; | ||||
| end; | end; | ||||
| TtsBlendFunc = function(const aSrc, aDst: TtsColor4f): TtsColor4f; | |||||
| const | |||||
| TS_CHANNELS_RGB: TtsColorChannels = [tsChannelRed, tsChannelGreen, tsChannelBlue]; | |||||
| TS_CHANNELS_RGBA: TtsColorChannels = [tsChannelRed, tsChannelGreen, tsChannelBlue, tsChannelAlpha]; | |||||
| TS_MODES_REPLACE_ALL: TtsImageModes = (tsModeReplace, tsModeReplace, tsModeReplace, tsModeReplace); | |||||
| TS_MODES_MODULATE_ALL: TtsImageModes = (tsModeModulate, tsModeModulate, tsModeModulate, tsModeModulate); | |||||
| TS_MODES_MODULATE_ALPHA: TtsImageModes = (tsModeReplace, tsModeReplace, tsModeReplace, tsModeModulate); | |||||
| function tsColor4f(r, g, b, a: Single): TtsColor4f; | function tsColor4f(r, g, b, a: Single): TtsColor4f; | ||||
| function tsModes(r, g, b, a: TtsImageMode): TtsImageModes; | |||||
| function tsRect(const l, t, r, b: Integer): TtsRect; | function tsRect(const l, t, r, b: Integer): TtsRect; | ||||
| function tsPosition(const x, y: Integer): TtsPosition; | function tsPosition(const x, y: Integer): TtsPosition; | ||||
| @@ -180,8 +192,15 @@ function tsImageModeFuncIgnore(const aSource, aDest: Single): Single; | |||||
| function tsImageModeFuncReplace(const aSource, aDest: Single): Single; | function tsImageModeFuncReplace(const aSource, aDest: Single): Single; | ||||
| function tsImageModeFuncModulate(const aSource, aDest: Single): Single; | function tsImageModeFuncModulate(const aSource, aDest: Single): Single; | ||||
| function tsBlendFundAlpha(const aSrc, aDst: TtsColor4f): TtsColor4f; | |||||
| function tsBlendFundAdditive(const aSrc, aDst: TtsColor4f): TtsColor4f; | |||||
| function tsBlendFundAdditiveAlpha(const aSrc, aDst: TtsColor4f): TtsColor4f; | |||||
| implementation | implementation | ||||
| uses | |||||
| Math; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| function tsColor4f(r, g, b, a: Single): TtsColor4f; | function tsColor4f(r, g, b, a: Single): TtsColor4f; | ||||
| begin | begin | ||||
| @@ -191,6 +210,15 @@ begin | |||||
| result.a := a; | result.a := a; | ||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function tsModes(r, g, b, a: TtsImageMode): TtsImageModes; | |||||
| begin | |||||
| result[tsChannelRed] := r; | |||||
| result[tsChannelGreen] := g; | |||||
| result[tsChannelBlue] := b; | |||||
| result[tsChannelAlpha] := a; | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| function tsRect(const l, t, r, b: Integer): TtsRect; | function tsRect(const l, t, r, b: Integer): TtsRect; | ||||
| begin | begin | ||||
| @@ -214,6 +242,7 @@ begin | |||||
| tsFormatRGBA8: result := 4; | tsFormatRGBA8: result := 4; | ||||
| tsFormatLumAlpha8: result := 2; | tsFormatLumAlpha8: result := 2; | ||||
| tsFormatAlpha8: result := 1; | tsFormatAlpha8: result := 1; | ||||
| tsFormatLum8: result := 1; | |||||
| else | else | ||||
| result := 0; | result := 0; | ||||
| end; | end; | ||||
| @@ -228,19 +257,31 @@ begin | |||||
| case aFormat of | case aFormat of | ||||
| tsFormatRGBA8: begin | tsFormatRGBA8: begin | ||||
| for i := 0 to 3 do begin | for i := 0 to 3 do begin | ||||
| aData^ := Trunc($FF * aColor.arr[i]); | |||||
| aData^ := Trunc($FF * min(aColor.arr[i], 1.0)); | |||||
| inc(aData); | inc(aData); | ||||
| end; | end; | ||||
| end; | end; | ||||
| tsFormatLumAlpha8: begin | tsFormatLumAlpha8: begin | ||||
| s := 0.30 * aColor.r + 0.59 * aColor.g + 0.11 * aColor.b; | |||||
| aData^ := Trunc($FF * s); inc(aData); | |||||
| aData^ := Trunc($FF * aColor.a); inc(aData); | |||||
| s := 0.30 * min(aColor.r, 1.0) + | |||||
| 0.59 * min(aColor.g, 1.0) + | |||||
| 0.11 * min(aColor.b, 1.0); | |||||
| aData^ := Trunc($FF * s); | |||||
| inc(aData); | |||||
| aData^ := Trunc($FF * min(aColor.a, 1.0)); | |||||
| inc(aData); | |||||
| end; | end; | ||||
| tsFormatAlpha8: begin | tsFormatAlpha8: begin | ||||
| aData^ := Trunc($FF * aColor.a); | |||||
| aData^ := Trunc($FF * min(aColor.a, 1.0)); | |||||
| inc(aData); | |||||
| end; | |||||
| tsFormatLum8: begin | |||||
| s := 0.30 * min(aColor.r, 1.0) + | |||||
| 0.59 * min(aColor.g, 1.0) + | |||||
| 0.11 * min(aColor.b, 1.0); | |||||
| aData^ := Trunc($FF * s); | |||||
| inc(aData); | inc(aData); | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -275,6 +316,14 @@ begin | |||||
| aColor.a := aData^ / $FF; | aColor.a := aData^ / $FF; | ||||
| inc(aData); | inc(aData); | ||||
| end; | end; | ||||
| tsFormatLum8: begin | |||||
| aColor.r := aData^ / $FF; | |||||
| aColor.g := aData^ / $FF; | |||||
| aColor.b := aData^ / $FF; | |||||
| aColor.a := 1.0; | |||||
| inc(aData); | |||||
| end; | |||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -296,5 +345,33 @@ begin | |||||
| result := aSource * aDest; | result := aSource * aDest; | ||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function tsBlendFundAlpha(const aSrc, aDst: TtsColor4f): TtsColor4f; | |||||
| var | |||||
| i: Integer; | |||||
| begin | |||||
| for i := 0 to 2 do | |||||
| result.arr[i] := aSrc.arr[i] * aSrc.a + aDst.arr[i] * (1 - aSrc.a); | |||||
| result.a := aSrc.a + aDst.a * (1 - aSrc.a); | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| function tsBlendFundAdditive(const aSrc, aDst: TtsColor4f): TtsColor4f; | |||||
| var | |||||
| i: Integer; | |||||
| begin | |||||
| for i := 0 to 3 do | |||||
| result.arr[i] := aSrc.arr[i] + aDst.arr[i]; | |||||
| end; | |||||
| function tsBlendFundAdditiveAlpha(const aSrc, aDst: TtsColor4f): TtsColor4f; | |||||
| var | |||||
| i: Integer; | |||||
| begin | |||||
| for i := 0 to 2 do | |||||
| result.arr[i] := aSrc.arr[i] * aSrc.a + aDst.arr[i]; | |||||
| result.a := aDst.a; | |||||
| end; | |||||
| end. | end. | ||||