diff --git a/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj b/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj index 9139d362..cd9cde1c 100644 --- a/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj +++ b/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj @@ -15,7 +15,6 @@ Library LibreMetaverse.GUI true - AnyCPU;x64;x86 True @@ -36,44 +35,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - - - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - - - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -92,42 +53,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - LibreMetaverse.GUI.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - LibreMetaverse.GUI.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - diff --git a/LibreMetaverse.GUI/MiniMap.cs b/LibreMetaverse.GUI/MiniMap.cs index ab632b7d..3d36924f 100644 --- a/LibreMetaverse.GUI/MiniMap.cs +++ b/LibreMetaverse.GUI/MiniMap.cs @@ -30,7 +30,6 @@ using System.Drawing; using System.Windows.Forms; using OpenMetaverse.Imaging; using OpenMetaverse.Assets; -using LibreMetaverse.Imaging; namespace OpenMetaverse.GUI { @@ -212,18 +211,13 @@ namespace OpenMetaverse.GUI SetMapLayer(null); _MapImageID = region.MapImageID; + ManagedImage nullImage; Client.Assets.RequestImage(_MapImageID, ImageType.Baked, delegate(TextureRequestState state, AssetTexture asset) { - if (state == TextureRequestState.Finished) - { - using (J2KReader reader = new J2KReader(asset.AssetData)) - { - if (!reader.ReadHeader()) { return; } - _MapLayer = reader.DecodeToBitmap(); - } - } + if(state == TextureRequestState.Finished) + OpenJPEG.DecodeToImage(asset.AssetData, out nullImage, out _MapLayer); }); } } diff --git a/LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj b/LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj index ca2fe533..e2449a96 100644 --- a/LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj +++ b/LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj @@ -14,7 +14,6 @@ Library LibreMetaverse.Rendering.Meshmerizer true - AnyCPU;x64;x86 True @@ -33,40 +32,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -84,40 +49,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - diff --git a/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj b/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj index fb3f7d9a..3a537735 100644 --- a/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj +++ b/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj @@ -14,7 +14,6 @@ Library LibreMetaverse.Rendering.Simple true - AnyCPU;x64;x86 True @@ -33,40 +32,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -84,40 +49,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - diff --git a/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj b/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj index d3ccdda6..8442863e 100644 --- a/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj +++ b/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj @@ -14,7 +14,6 @@ Library LibreMetaverse.StructuredData true - AnyCPU;x64;x86 True @@ -35,44 +34,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - - - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - - - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -91,42 +52,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - LibreMetaverse.StructuredData.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - LibreMetaverse.StructuredData.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - diff --git a/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj b/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj index 1db47c37..0f532b19 100644 --- a/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj +++ b/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj @@ -15,7 +15,6 @@ LibreMetaverse.Tests true false - AnyCPU;x64;x86 True @@ -36,44 +35,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - - - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - - - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -93,44 +54,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - - - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - - - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - diff --git a/LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj b/LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj index 6286b383..50a39267 100644 --- a/LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj +++ b/LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj @@ -14,7 +14,6 @@ Library LibreMetaverse.Utilities true - AnyCPU;x64;x86 True @@ -35,44 +34,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - - - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - - - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -91,42 +52,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - LibreMetaverse.Utilities.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - LibreMetaverse.Utilities.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - diff --git a/LibreMetaverse.sln b/LibreMetaverse.sln index 20086a2b..28081ab0 100644 --- a/LibreMetaverse.sln +++ b/LibreMetaverse.sln @@ -35,307 +35,109 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VoiceTest", "Programs\Voice EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.PrimMesher", "PrimMesher\LibreMetaverse.PrimMesher.csproj", "{2E2B643F-F18B-4791-BA4B-6E82D0E794B6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mapgenerator", "Programs\mapgenerator\mapgenerator.csproj", "{2867B4B3-0000-0000-0000-000000000000}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mapgenerator", "Programs\mapgenerator\mapgenerator.csproj", "{2867B4B3-0000-0000-0000-000000000000}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 ReleaseNoGui|Any CPU = ReleaseNoGui|Any CPU - ReleaseNoGui|x64 = ReleaseNoGui|x64 - ReleaseNoGui|x86 = ReleaseNoGui|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {95F42663-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95F42663-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95F42663-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {95F42663-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {95F42663-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {95F42663-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {95F42663-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {95F42663-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {95F42663-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {95F42663-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {95F42663-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {95F42663-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {95F42663-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU - {95F42663-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {95F42663-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {95F42663-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {95F42663-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {79B51DAA-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {79B51DAA-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {79B51DAA-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {79B51DAA-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {79B51DAA-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {79B51DAA-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {79B51DAA-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {79B51DAA-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {79B51DAA-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {79B51DAA-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {79B51DAA-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {79B51DAA-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {89049BBC-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {89049BBC-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {89049BBC-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {89049BBC-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {89049BBC-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {89049BBC-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {89049BBC-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {89049BBC-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {89049BBC-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {89049BBC-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {89049BBC-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {89049BBC-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {27C70F3A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {27C70F3A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {27C70F3A-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {27C70F3A-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {27C70F3A-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {27C70F3A-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {27C70F3A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {27C70F3A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {27C70F3A-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {27C70F3A-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {27C70F3A-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {27C70F3A-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {09C292AF-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {09C292AF-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {09C292AF-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {09C292AF-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {09C292AF-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {09C292AF-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {09C292AF-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {09C292AF-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {09C292AF-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {09C292AF-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {09C292AF-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {09C292AF-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {09C292AF-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU - {09C292AF-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {09C292AF-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {09C292AF-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {09C292AF-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {95479B1D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95479B1D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95479B1D-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {95479B1D-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {95479B1D-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {95479B1D-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {95479B1D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {95479B1D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {95479B1D-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {95479B1D-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {95479B1D-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {95479B1D-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {29E206AC-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {29E206AC-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29E206AC-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {29E206AC-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {29E206AC-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {29E206AC-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {29E206AC-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {29E206AC-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {29E206AC-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {29E206AC-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {29E206AC-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {29E206AC-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {89D7A3E5-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {89D7A3E5-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {89D7A3E5-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {89D7A3E5-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {89D7A3E5-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {89D7A3E5-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {89D7A3E5-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {89D7A3E5-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {89D7A3E5-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {89D7A3E5-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {89D7A3E5-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {89D7A3E5-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {0CCC2C3D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0CCC2C3D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CCC2C3D-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {0CCC2C3D-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {0CCC2C3D-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {0CCC2C3D-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {0CCC2C3D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {0CCC2C3D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {0CCC2C3D-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {0CCC2C3D-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {0CCC2C3D-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {0CCC2C3D-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {1266CE08-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1266CE08-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1266CE08-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {1266CE08-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {1266CE08-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {1266CE08-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {1266CE08-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {1266CE08-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {1266CE08-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {1266CE08-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {1266CE08-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {1266CE08-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {B37B02AD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B37B02AD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B37B02AD-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {B37B02AD-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {B37B02AD-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {B37B02AD-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {B37B02AD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {B37B02AD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {B37B02AD-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {B37B02AD-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {B37B02AD-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {B37B02AD-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {58443010-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58443010-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {58443010-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {58443010-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {58443010-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {58443010-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {58443010-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {58443010-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {58443010-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {58443010-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {58443010-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {58443010-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {9F71FDB3-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F71FDB3-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9F71FDB3-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {9F71FDB3-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {9F71FDB3-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {9F71FDB3-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {9F71FDB3-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F71FDB3-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {9F71FDB3-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {9F71FDB3-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {9F71FDB3-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {9F71FDB3-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {EE4EA934-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE4EA934-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EE4EA934-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {EE4EA934-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {EE4EA934-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {EE4EA934-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {EE4EA934-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE4EA934-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {EE4EA934-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {EE4EA934-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {EE4EA934-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {EE4EA934-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|x64.ActiveCfg = Debug|x64 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|x64.Build.0 = Debug|x64 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|x86.ActiveCfg = Debug|x86 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|x86.Build.0 = Debug|x86 {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|Any CPU.Build.0 = Release|Any CPU - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|x64.ActiveCfg = Release|x64 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|x64.Build.0 = Release|x64 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|x86.ActiveCfg = Release|x86 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|x86.Build.0 = Release|x86 {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|x64.Build.0 = Release|x64 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|x86.Build.0 = Release|x86 {2867B4B3-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2867B4B3-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2867B4B3-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 - {2867B4B3-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 - {2867B4B3-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 - {2867B4B3-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 {2867B4B3-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {2867B4B3-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {2867B4B3-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 - {2867B4B3-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 - {2867B4B3-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 - {2867B4B3-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU - {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 - {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 - {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 - {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/LibreMetaverse/Assets/AssetTypes/AssetTexture.cs b/LibreMetaverse/Assets/AssetTypes/AssetTexture.cs index 489bd817..60aea7b0 100644 --- a/LibreMetaverse/Assets/AssetTypes/AssetTexture.cs +++ b/LibreMetaverse/Assets/AssetTypes/AssetTexture.cs @@ -1,6 +1,5 @@ /* * Copyright (c) 2006-2016, openmetaverse.co - * Copyright (c) 2021, Sjofn LLC. * All rights reserved. * * - Redistribution and use in source and binary forms, with or without @@ -26,8 +25,7 @@ */ using System; -using System.Runtime.InteropServices; -using LibreMetaverse.Imaging; +using OpenMetaverse; using OpenMetaverse.Imaging; namespace OpenMetaverse.Assets @@ -43,6 +41,9 @@ namespace OpenMetaverse.Assets /// A object containing image data public ManagedImage Image; + /// + public OpenJPEG.J2KLayerInfo[] LayerInfo; + /// public int Components; @@ -80,12 +81,7 @@ namespace OpenMetaverse.Assets /// public override void Encode() { - using (J2KWriter writer = new J2KWriter(AssetData)) - { - writer.WriteHeader(new OpenJpegDotNet.IO.Parameter { Compression = 1 }); - // *hack: encode from ManagedImage directly or better yet, get rid of ManagedImage entirely! - AssetData = writer.Encode(Image.ExportBitmap()); - } + AssetData = OpenJPEG.Encode(Image); } /// @@ -95,28 +91,36 @@ namespace OpenMetaverse.Assets /// True if the decoding was successful, otherwise false public override bool Decode() { - if (AssetData == null || AssetData.Length <= 0) { return false; } - - this.Components = 0; - - using (J2KReader reader = new J2KReader(AssetData)) + if (AssetData != null && AssetData.Length > 0) { - // *hack: decode from ManagedImage directly or better yet, get rid of ManagedImage entirely! - if (!reader.ReadHeader()) { return false; } - System.Drawing.Bitmap bitmap = reader.DecodeToBitmap(); - Image = new ManagedImage(bitmap); + this.Components = 0; + + if (OpenJPEG.DecodeToImage(AssetData, out Image)) + { + if ((Image.Channels & ManagedImage.ImageChannels.Color) != 0) + Components += 3; + if ((Image.Channels & ManagedImage.ImageChannels.Gray) != 0) + ++Components; + if ((Image.Channels & ManagedImage.ImageChannels.Bump) != 0) + ++Components; + if ((Image.Channels & ManagedImage.ImageChannels.Alpha) != 0) + ++Components; + + return true; + } } - if ((Image.Channels & ManagedImage.ImageChannels.Color) != 0) - Components += 3; - if ((Image.Channels & ManagedImage.ImageChannels.Gray) != 0) - ++Components; - if ((Image.Channels & ManagedImage.ImageChannels.Bump) != 0) - ++Components; - if ((Image.Channels & ManagedImage.ImageChannels.Alpha) != 0) - ++Components; + return false; + } - return true; + /// + /// Decodes the begin and end byte positions for each quality layer in + /// the image + /// + /// + public bool DecodeLayerBoundaries() + { + return OpenJPEG.DecodeLayerBoundaries(AssetData, out LayerInfo, out Components); } } } diff --git a/LibreMetaverse/Imaging/BakeLayer.cs b/LibreMetaverse/Imaging/BakeLayer.cs index 04ebb67a..a5598670 100644 --- a/LibreMetaverse/Imaging/BakeLayer.cs +++ b/LibreMetaverse/Imaging/BakeLayer.cs @@ -160,15 +160,15 @@ namespace OpenMetaverse.Imaging if (bakeType == BakeType.Head) { - if (DrawLayer(LoadResourceLayer("head_color.tga"), false) == true) - { - AddAlpha(bakedTexture.Image, LoadResourceLayer("head_alpha.tga")); - MultiplyLayerFromAlpha(bakedTexture.Image, LoadResourceLayer("head_skingrain.tga")); - Logger.Log("[Bake]: created head master bake", Helpers.LogLevel.Debug); - } - else - { - Logger.Log("[Bake]: Unable to draw layer from texture file", Helpers.LogLevel.Debug); + if (DrawLayer(LoadResourceLayer("head_color.tga"), false) == true) + { + AddAlpha(bakedTexture.Image, LoadResourceLayer("head_alpha.tga")); + MultiplyLayerFromAlpha(bakedTexture.Image, LoadResourceLayer("head_skingrain.tga")); + Logger.Log("[Bake]: created head master bake", Helpers.LogLevel.Debug); + } + else + { + Logger.Log("[Bake]: Unable to draw layer from texture file", Helpers.LogLevel.Debug); } } @@ -357,10 +357,10 @@ namespace OpenMetaverse.Imaging lock (ResourceSync) { using (Stream stream = Helpers.GetResourceStream(fileName, Settings.RESOURCE_DIR)) - { + { if (stream != null) - { - bitmap = LoadTGAClass.LoadTGA(stream); + { + bitmap = LoadTGAClass.LoadTGA(stream); } } } @@ -428,8 +428,8 @@ namespace OpenMetaverse.Imaging private bool MaskBelongsToBake(string mask) { - return (bakeType != BakeType.LowerBody || !mask.Contains("upper")) - && (bakeType != BakeType.LowerBody || !mask.Contains("shirt")) + return (bakeType != BakeType.LowerBody || !mask.Contains("upper")) + && (bakeType != BakeType.LowerBody || !mask.Contains("shirt")) && (bakeType != BakeType.UpperBody || !mask.Contains("lower")); } @@ -471,57 +471,57 @@ namespace OpenMetaverse.Imaging { loadedAlpha = false; alpha = 0; - alphaInv = 0; - + alphaInv = 0; + if (sourceHasAlpha) { - if (sourceAlpha.Length > i) - { - loadedAlpha = true; - alpha = sourceAlpha[i]; - alphaInv = (byte)(Byte.MaxValue - alpha); + if (sourceAlpha.Length > i) + { + loadedAlpha = true; + alpha = sourceAlpha[i]; + alphaInv = (byte)(Byte.MaxValue - alpha); } } if (sourceHasColor) { - if ((bakedRed.Length > i) && (bakedGreen.Length > i) && (bakedBlue.Length > i)) - { - if ((sourceRed.Length > i) && (sourceGreen.Length > i) && (sourceBlue.Length > i)) - { - if (loadedAlpha == true) - { - bakedRed[i] = (byte)((bakedRed[i] * alphaInv + sourceRed[i] * alpha) >> 8); - bakedGreen[i] = (byte)((bakedGreen[i] * alphaInv + sourceGreen[i] * alpha) >> 8); - bakedBlue[i] = (byte)((bakedBlue[i] * alphaInv + sourceBlue[i] * alpha) >> 8); - } - else - { - bakedRed[i] = sourceRed[i]; - bakedGreen[i] = sourceGreen[i]; - bakedBlue[i] = sourceBlue[i]; - } - } + if ((bakedRed.Length > i) && (bakedGreen.Length > i) && (bakedBlue.Length > i)) + { + if ((sourceRed.Length > i) && (sourceGreen.Length > i) && (sourceBlue.Length > i)) + { + if (loadedAlpha == true) + { + bakedRed[i] = (byte)((bakedRed[i] * alphaInv + sourceRed[i] * alpha) >> 8); + bakedGreen[i] = (byte)((bakedGreen[i] * alphaInv + sourceGreen[i] * alpha) >> 8); + bakedBlue[i] = (byte)((bakedBlue[i] * alphaInv + sourceBlue[i] * alpha) >> 8); + } + else + { + bakedRed[i] = sourceRed[i]; + bakedGreen[i] = sourceGreen[i]; + bakedBlue[i] = sourceBlue[i]; + } + } } } if (addSourceAlpha) { - if ((sourceAlpha.Length > i) && (bakedAlpha.Length > i)) - { - if (sourceAlpha[i] < bakedAlpha[i]) - { - bakedAlpha[i] = sourceAlpha[i]; - } + if ((sourceAlpha.Length > i) && (bakedAlpha.Length > i)) + { + if (sourceAlpha[i] < bakedAlpha[i]) + { + bakedAlpha[i] = sourceAlpha[i]; + } } } - if (sourceHasBump) - { - if (sourceBump.Length > i) - { - bakedBump[i] = sourceBump[i]; - } + if (sourceHasBump) + { + if (sourceBump.Length > i) + { + bakedBump[i] = sourceBump[i]; + } } ++i; diff --git a/LibreMetaverse/Imaging/J2KBuffer.cs b/LibreMetaverse/Imaging/J2KBuffer.cs deleted file mode 100644 index 3b8e18af..00000000 --- a/LibreMetaverse/Imaging/J2KBuffer.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace LibreMetaverse.Imaging -{ - [StructLayout(LayoutKind.Sequential)] - internal struct J2KBuffer - { - - public IntPtr Data; - - public int Length; - - public int Position; - - } -} diff --git a/LibreMetaverse/Imaging/J2KReader.cs b/LibreMetaverse/Imaging/J2KReader.cs deleted file mode 100644 index 2d5f8a37..00000000 --- a/LibreMetaverse/Imaging/J2KReader.cs +++ /dev/null @@ -1,259 +0,0 @@ -/** - * Copyright (c) 2021, Sjofn LLC. - * All rights reserved. - * - * - Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Neither the name of the openmetaverse.co nor the names - * of its contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using OpenJpegDotNet; - -namespace LibreMetaverse.Imaging -{ - public sealed class J2KReader : IDisposable - { - - #region Fields - - private readonly J2KBuffer _Buffer; - - private readonly IntPtr _UserData; - - private readonly DelegateHandler _ReadCallback; - - private readonly DelegateHandler _SeekCallback; - - private readonly DelegateHandler _SkipCallback; - - private Codec _Codec; - - private DecompressionParameters _DecompressionParameters; - - private OpenJpegDotNet.Image _Image; - - private readonly Stream _Stream; - - #endregion - - #region Constructors - - public J2KReader(byte[] data) - { - this._Buffer = new J2KBuffer - { - Data = Marshal.AllocHGlobal(data.Length), - Length = data.Length, - Position = 0 - }; - - Marshal.Copy(data, 0, this._Buffer.Data, this._Buffer.Length); - - var size = Marshal.SizeOf(this._Buffer); - this._UserData = Marshal.AllocHGlobal(size); - Marshal.StructureToPtr(this._Buffer, this._UserData, false); - - this._ReadCallback = new DelegateHandler(Read); - this._SeekCallback = new DelegateHandler(Seek); - this._SkipCallback = new DelegateHandler(Skip); - - this._Stream = OpenJpeg.StreamDefaultCreate(true); - OpenJpeg.StreamSetUserData(this._Stream, this._UserData); - OpenJpeg.StreamSetUserDataLength(this._Stream, this._Buffer.Length); - OpenJpeg.StreamSetReadFunction(this._Stream, this._ReadCallback); - OpenJpeg.StreamSetSeekFunction(this._Stream, this._SeekCallback); - OpenJpeg.StreamSetSkipFunction(this._Stream, this._SkipCallback); - } - - #endregion - - #region Properties - - public int Height - { - get; - private set; - } - - /// - /// Gets a value indicating whether this instance has been disposed. - /// - /// true if this instance has been disposed; otherwise, false. - public bool IsDisposed - { - get; - private set; - } - - public int Width - { - get; - private set; - } - - #endregion - - #region Methods - - public bool ReadHeader() - { - this._Codec?.Dispose(); - this._DecompressionParameters?.Dispose(); - this._Image?.Dispose(); - - this._Codec = null; - this._DecompressionParameters = null; - this._Image = null; - - this._Codec = OpenJpeg.CreateDecompress(CodecFormat.J2k); - this._DecompressionParameters = new DecompressionParameters(); - OpenJpeg.SetDefaultDecoderParameters(this._DecompressionParameters); - - if (!OpenJpeg.SetupDecoder(this._Codec, this._DecompressionParameters)) - return false; - - if (!OpenJpeg.ReadHeader(this._Stream, this._Codec, out var image)) - return false; - - this.Width = (int)(image.X1 - image.X0); - this.Height = (int)(image.Y1 - image.Y0); - this._Image = image; - - return true; - } - - public OpenJpegDotNet.Image Decode() - { - if (this._Image == null || this._Image.IsDisposed) - throw new InvalidOperationException(); - - if (!OpenJpeg.Decode(this._Codec, this._Stream, this._Image)) - throw new InvalidOperationException(); - - return this._Image; - } - - public Bitmap DecodeToBitmap() - { - if (this._Image == null || this._Image.IsDisposed) - throw new InvalidOperationException(); - - if (!OpenJpeg.Decode(this._Codec, this._Stream, this._Image)) - throw new InvalidOperationException(); - - return this._Image.ToBitmap(); - } - - #region Event Handlers - - private static ulong Read(IntPtr buffer, ulong bytes, IntPtr userData) - { - unsafe - { - var buf = (J2KBuffer*)userData; - var bytesToRead = (int)Math.Min((ulong)buf->Length, bytes); - if (bytesToRead > 0) - { - NativeMethods.cstd_memcpy(buffer, IntPtr.Add(buf->Data, buf->Position), bytesToRead); - buf->Position += bytesToRead; - return (ulong)bytesToRead; - } - else - { - return unchecked((ulong)-1); - } - } - } - - private static int Seek(ulong bytes, IntPtr userData) - { - unsafe - { - var buf = (J2KBuffer*)userData; - var position = Math.Min((ulong)buf->Length, bytes); - buf->Position = (int)position; - return 1; - } - } - - private static long Skip(ulong bytes, IntPtr userData) - { - unsafe - { - var buf = (J2KBuffer*)userData; - var bytesToSkip = (int)Math.Min((ulong)buf->Length, bytes); - if (bytesToSkip > 0) - { - buf->Position += bytesToSkip; - return bytesToSkip; - } - else - { - return unchecked(-1); - } - } - } - - #endregion - - #endregion - - #region IDisposable Members - - /// - /// Releases all resources used by this . - /// - public void Dispose() - { - this.Dispose(true); - //GC.SuppressFinalize(this); - } - - /// - /// Releases all resources used by this . - /// - /// Indicate value whether method was called. - private void Dispose(bool disposing) - { - if (this.IsDisposed) - { - return; - } - - this.IsDisposed = true; - - if (disposing) - { - this._Codec?.Dispose(); - this._DecompressionParameters?.Dispose(); - this._Stream.Dispose(); - - Marshal.FreeHGlobal(this._Buffer.Data); - Marshal.FreeHGlobal(this._UserData); - } - } - - #endregion - - } -} diff --git a/LibreMetaverse/Imaging/J2KWriter.cs b/LibreMetaverse/Imaging/J2KWriter.cs deleted file mode 100644 index 20bb0169..00000000 --- a/LibreMetaverse/Imaging/J2KWriter.cs +++ /dev/null @@ -1,485 +0,0 @@ -/** - * Copyright (c) 2021, Sjofn LLC. - * All rights reserved. - * - * - Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Neither the name of the openmetaverse.co nor the names - * of its contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.Runtime.InteropServices; -using OpenJpegDotNet; - -namespace LibreMetaverse.Imaging -{ - public sealed class J2KWriter : IDisposable - { - - #region Fields - - private readonly J2KBuffer _Buffer; - - private readonly IntPtr _UserData; - - private readonly DelegateHandler _ReadCallback; - - private readonly DelegateHandler _WriteCallback; - - private readonly DelegateHandler _SeekCallback; - - private readonly DelegateHandler _SkipCallback; - - private Codec _Codec; - - private CompressionParameters _CompressionParameters; - - private OpenJpegDotNet.Image _Image; - - private readonly Stream _Stream; - - #endregion - - #region Constructors - - public J2KWriter(byte[] data) - { - this._Buffer = new J2KBuffer - { - Data = Marshal.AllocHGlobal(data.Length), - Length = data.Length, - Position = 0 - }; - - Marshal.Copy(data, 0, this._Buffer.Data, this._Buffer.Length); - - var size = Marshal.SizeOf(this._Buffer); - this._UserData = Marshal.AllocHGlobal(size); - Marshal.StructureToPtr(this._Buffer, this._UserData, false); - - this._WriteCallback = new DelegateHandler(Write); - this._ReadCallback = new DelegateHandler(Read); - this._SeekCallback = new DelegateHandler(Seek); - this._SkipCallback = new DelegateHandler(Skip); - - this._Stream = OpenJpeg.StreamDefaultCreate(true); - OpenJpeg.StreamSetUserData(this._Stream, this._UserData); - OpenJpeg.StreamSetUserDataLength(this._Stream, this._Buffer.Length); - OpenJpeg.StreamSetReadFunction(this._Stream, this._ReadCallback); - OpenJpeg.StreamSetWriteFunction(this._Stream, this._WriteCallback); - OpenJpeg.StreamSetSeekFunction(this._Stream, this._SeekCallback); - OpenJpeg.StreamSetSkipFunction(this._Stream, this._SkipCallback); - } - - #endregion - - #region Properties - - public int Height - { - get; - private set; - } - - /// - /// Gets a value indicating whether this instance has been disposed. - /// - /// true if this instance has been disposed; otherwise, false. - public bool IsDisposed - { - get; - private set; - } - - public int Width - { - get; - private set; - } - - #endregion - - #region Methods - - private OpenJpegDotNet.Image Decode() - { - if (this._Image == null || this._Image.IsDisposed) - throw new InvalidOperationException(); - - if (!OpenJpeg.Decode(this._Codec, this._Stream, this._Image)) - throw new InvalidOperationException(); - - return this._Image; - } - - private Bitmap DecodeToBitmap() - { - if (this._Image == null || this._Image.IsDisposed) - throw new InvalidOperationException(); - - if (!OpenJpeg.Decode(this._Codec, this._Stream, this._Image)) - throw new InvalidOperationException(); - - return this._Image.ToBitmap(); - } - - public bool WriteHeader(OpenJpegDotNet.IO.Parameter parameter) - { - if (parameter == null) - throw new ArgumentNullException(nameof(parameter)); - - this._Codec?.Dispose(); - this._CompressionParameters?.Dispose(); - this._Image?.Dispose(); - - this._Codec = null; - this._CompressionParameters = null; - this._Image = null; - - this._Codec = OpenJpeg.CreateDecompress(CodecFormat.J2k); - this._CompressionParameters = this.SetupEncoderParameters(parameter); - - return true; - } - - public byte[] Encode(Bitmap bitmap) - { - if (bitmap == null) { throw new ArgumentNullException(nameof(bitmap)); } - - this._Codec?.Dispose(); - this._CompressionParameters?.Dispose(); - this._Image?.Dispose(); - - var channels = 0; - var outPrecision = 0u; - var colorSpace = ColorSpace.Gray; - var format = bitmap.PixelFormat; - var width = bitmap.Width; - var height = bitmap.Height; - switch (format) - { - case PixelFormat.Format24bppRgb: - channels = 3; - colorSpace = ColorSpace.Srgb; - outPrecision = 24u / (uint)channels; - break; - case PixelFormat.Format32bppArgb: - channels = 4; - colorSpace = ColorSpace.Srgb; - outPrecision = 32u / (uint)channels; - break; - case PixelFormat.Format8bppIndexed: - channels = 1; - colorSpace = ColorSpace.Srgb; - outPrecision = 8u / (uint)channels; - break; - default: - throw new NotSupportedException(); - } - - var componentParametersArray = new ImageComponentParameters[channels]; - for (var i = 0; i < channels; i++) - { - componentParametersArray[i].Precision = outPrecision; - componentParametersArray[i].Bpp = outPrecision; - componentParametersArray[i].Signed = false; - componentParametersArray[i].Dx = (uint)this._CompressionParameters.SubsamplingDx; - componentParametersArray[i].Dy = (uint)this._CompressionParameters.SubsamplingDy; - componentParametersArray[i].Width = (uint)width; - componentParametersArray[i].Height = (uint)height; - } - - // ToDo: throw proper exception - _Image = OpenJpeg.ImageCreate((uint)channels, componentParametersArray, colorSpace); - if (_Image == null) - throw new ArgumentException(); - - // ToDo: support alpha components - //switch (channels) - //{ - // case 2: - // case 4: - // image.Components[(int)(channels - 1)].Alpha = 1; - // break; - //} - - _Image.X0 = 0; - _Image.Y0 = 0; - _Image.X1 = componentParametersArray[0].Dx * componentParametersArray[0].Width; - _Image.Y1 = componentParametersArray[0].Dy * componentParametersArray[0].Height; - - - //std::vector outcomps(channels, nullptr); - //switch (channels) - //{ - // case 1: - // outcomps.assign({ image.Components[0].data }); - // break; - // // Reversed order for BGR -> RGB conversion - // case 2: - // outcomps.assign({ image.Components[0].data, image.Components[1].data }); - // break; - // case 3: - // outcomps.assign({ image.Components[2].data, image.Components[1].data, image.Components[0].data }); - // break; - // case 4: - // outcomps.assign({ - // image.Components[2].data, image.Components[1].data, image.Components[0].data, - // image.Components[3].data }); - // break; - //} - OpenJpeg.StartCompress(_Codec, _Image, _Stream); - OpenJpeg.Encode(this._Codec, this._Stream); - OpenJpeg.EndCompress(_Codec, _Stream); - - byte[] raw = new byte[_Buffer.Position]; - Marshal.Copy(_Buffer.Data, raw, 0, _Buffer.Position); - return raw; - } - - public OpenJpegDotNet.Image EncodeToJ2KImg(Bitmap bitmap) - { - if (bitmap == null) { throw new ArgumentNullException(nameof(bitmap)); } - - this._Codec?.Dispose(); - this._CompressionParameters?.Dispose(); - this._Image?.Dispose(); - - var channels = 0; - var outPrecision = 0u; - var colorSpace = ColorSpace.Gray; - var format = bitmap.PixelFormat; - var width = bitmap.Width; - var height = bitmap.Height; - switch (format) - { - case PixelFormat.Format24bppRgb: - channels = 3; - colorSpace = ColorSpace.Srgb; - outPrecision = 24u / (uint)channels; - break; - case PixelFormat.Format32bppArgb: - channels = 4; - colorSpace = ColorSpace.Srgb; - outPrecision = 32u / (uint)channels; - break; - case PixelFormat.Format8bppIndexed: - channels = 1; - colorSpace = ColorSpace.Srgb; - outPrecision = 8u / (uint)channels; - break; - default: - throw new NotSupportedException(); - } - - var componentParametersArray = new ImageComponentParameters[channels]; - for (var i = 0; i < channels; i++) - { - componentParametersArray[i].Precision = outPrecision; - componentParametersArray[i].Bpp = outPrecision; - componentParametersArray[i].Signed = false; - componentParametersArray[i].Dx = (uint)this._CompressionParameters.SubsamplingDx; - componentParametersArray[i].Dy = (uint)this._CompressionParameters.SubsamplingDy; - componentParametersArray[i].Width = (uint)width; - componentParametersArray[i].Height = (uint)height; - } - - // ToDo: throw proper exception - _Image = OpenJpeg.ImageCreate((uint)channels, componentParametersArray, colorSpace); - if (_Image == null) - throw new ArgumentException(); - - // ToDo: support alpha components - //switch (channels) - //{ - // case 2: - // case 4: - // image.Components[(int)(channels - 1)].Alpha = 1; - // break; - //} - - _Image.X0 = 0; - _Image.Y0 = 0; - _Image.X1 = componentParametersArray[0].Dx * componentParametersArray[0].Width; - _Image.Y1 = componentParametersArray[0].Dy * componentParametersArray[0].Height; - - - //std::vector outcomps(channels, nullptr); - //switch (channels) - //{ - // case 1: - // outcomps.assign({ image.Components[0].data }); - // break; - // // Reversed order for BGR -> RGB conversion - // case 2: - // outcomps.assign({ image.Components[0].data, image.Components[1].data }); - // break; - // case 3: - // outcomps.assign({ image.Components[2].data, image.Components[1].data, image.Components[0].data }); - // break; - // case 4: - // outcomps.assign({ - // image.Components[2].data, image.Components[1].data, image.Components[0].data, - // image.Components[3].data }); - // break; - //} - OpenJpeg.StartCompress(_Codec, _Image, _Stream); - OpenJpeg.Encode(this._Codec, this._Stream); - OpenJpeg.EndCompress(_Codec, _Stream); - - return _Image; - } - - #region Event Handlers - - private static ulong Read(IntPtr buffer, ulong bytes, IntPtr userData) - { - unsafe - { - var buf = (J2KBuffer*)userData; - var bytesToRead = (int)Math.Min((ulong)buf->Length, bytes); - if (bytesToRead > 0) - { - - NativeMethods.cstd_memcpy(buffer, IntPtr.Add(buf->Data, buf->Position), bytesToRead); - buf->Position += bytesToRead; - return (ulong)bytesToRead; - } - else - { - return unchecked((ulong)-1); - } - } - } - - private static int Seek(ulong bytes, IntPtr userData) - { - unsafe - { - var buf = (J2KBuffer*)userData; - var position = Math.Min((ulong)buf->Length, bytes); - buf->Position = (int)position; - return 1; - } - } - - private static long Skip(ulong bytes, IntPtr userData) - { - unsafe - { - var buf = (J2KBuffer*)userData; - var bytesToSkip = (int)Math.Min((ulong)buf->Length, bytes); - if (bytesToSkip > 0) - { - buf->Position += bytesToSkip; - return bytesToSkip; - } - else - { - return unchecked(-1); - } - } - } - - private static ulong Write(IntPtr buffer, ulong bytes, IntPtr userData) - { - unsafe - { - var buf = (J2KBuffer*)userData; - var bytesToRead = (int)Math.Min((ulong)buf->Length, bytes); - if (bytesToRead > 0) - { - NativeMethods.cstd_memcpy(buffer, IntPtr.Add(buf->Data, buf->Position), bytesToRead); - buf->Position += bytesToRead; - return (ulong)bytesToRead; - } - else - { - return unchecked((ulong)-1); - } - } - } - - #endregion - - #region Helpers - - private CompressionParameters SetupEncoderParameters(OpenJpegDotNet.IO.Parameter parameter) - { - var compressionParameters = new CompressionParameters(); - OpenJpeg.SetDefaultEncoderParameters(compressionParameters); - - if (parameter.Compression.HasValue) - compressionParameters.TcpRates[0] = 1000f / Math.Min(Math.Max(parameter.Compression.Value, 1), 1000); - - compressionParameters.TcpNumLayers = 1; - compressionParameters.CodingParameterDistortionAllocation = 1; - - if (!parameter.Compression.HasValue) - compressionParameters.TcpRates[0] = 4; - - return compressionParameters; - } - - #endregion - - #endregion - - #region IDisposable Members - - /// - /// Releases all resources used by this . - /// - public void Dispose() - { - this.Dispose(true); - //GC.SuppressFinalize(this); - } - - /// - /// Releases all resources used by this . - /// - /// Indicate value whether method was called. - private void Dispose(bool disposing) - { - if (this.IsDisposed) - { - return; - } - - this.IsDisposed = true; - - if (disposing) - { - this._Codec?.Dispose(); - this._CompressionParameters?.Dispose(); - this._Stream.Dispose(); - - Marshal.FreeHGlobal(this._Buffer.Data); - Marshal.FreeHGlobal(this._UserData); - } - } - - #endregion - - } -} diff --git a/LibreMetaverse/Imaging/NativeMethods.cs b/LibreMetaverse/Imaging/NativeMethods.cs deleted file mode 100644 index 8cbc5403..00000000 --- a/LibreMetaverse/Imaging/NativeMethods.cs +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2021, Sjofn LLC. - * All rights reserved. - * - * - Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Neither the name of the openmetaverse.co nor the names - * of its contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Runtime.InteropServices; - -namespace LibreMetaverse.Imaging -{ - internal sealed partial class NativeMethods - { - - #region Fields - - // Native library file name. - // If Linux, it will be converted to libOpenJpegDotNetNative.so - // If MacOSX, it will be converted to libOpenJpegDotNetNative.dylib - // If Windows, it will be available after call LoadLibrary. - // And this file name must not contain period. If it does, - // CLR does not add extension (.dll) and CLR fails to load library - internal const string NativeLibrary = "OpenJpegDotNetNative"; - - public const CallingConvention CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl; - - private static readonly WindowsLibraryLoader WindowsLibraryLoader = new WindowsLibraryLoader(); - - #endregion - - #region Constructors - - static NativeMethods() - { - WindowsLibraryLoader.LoadLibraries(new[] - { - $"{NativeLibrary}" - }); - } - - #endregion - - #region cstd - - [DllImport(NativeLibrary, CallingConvention = CallingConvention)] - public static extern IntPtr cstd_memcpy(IntPtr dest, IntPtr src, int count); - - #endregion - - } -} diff --git a/LibreMetaverse/Imaging/OpenJPEG.cs b/LibreMetaverse/Imaging/OpenJPEG.cs new file mode 100644 index 00000000..b687f9fe --- /dev/null +++ b/LibreMetaverse/Imaging/OpenJPEG.cs @@ -0,0 +1,590 @@ +/* + * Copyright (c) 2006-2016, openmetaverse.co + * All rights reserved. + * + * - Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * - Neither the name of the openmetaverse.co nor the names + * of its contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; +using Rectangle = System.Drawing.Rectangle; + +namespace OpenMetaverse.Imaging +{ +#if !NO_UNSAFE + /// + /// A Wrapper around openjpeg to encode and decode images to and from byte arrays + /// + public class OpenJPEG + { + /// TGA Header size + public const int TGA_HEADER_SIZE = 32; + + #region JPEG2000 Structs + + /// + /// Defines the beginning and ending file positions of a layer in an + /// LRCP-progression JPEG2000 file + /// + [System.Diagnostics.DebuggerDisplay("Start = {Start} End = {End} Size = {End - Start}")] + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct J2KLayerInfo + { + public int Start; + public int End; + } + + /// + /// This structure is used to marshal both encoded and decoded images. + /// MUST MATCH THE STRUCT IN dotnet.h! + /// + [StructLayout(LayoutKind.Sequential, Pack = 4)] + private struct MarshalledImage + { + public IntPtr encoded; // encoded image data + public int length; // encoded image length + public int dummy; // padding for 64-bit alignment + + public IntPtr decoded; // decoded image, contiguous components + + public int width; // width of decoded image + public int height; // height of decoded image + public int layers; // layer count + public int resolutions; // resolution count + public int components; // component count + public int packet_count; // packet count + public IntPtr packets; // pointer to the packets array + } + + /// + /// Information about a single packet in a JPEG2000 stream + /// + [StructLayout(LayoutKind.Sequential, Pack = 4)] + private struct MarshalledPacket + { + /// Packet start position + public int start_pos; + /// Packet header end position + public int end_ph_pos; + /// Packet end position + public int end_pos; + + public override string ToString() + { + return String.Format("start_pos: {0} end_ph_pos: {1} end_pos: {2}", + start_pos, end_ph_pos, end_pos); + } + } + + #endregion JPEG2000 Structs + + #region Unmanaged Function Declarations + + + // allocate encoded buffer based on length field + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetAllocEncoded(ref MarshalledImage image); + + // allocate decoded buffer based on width and height fields + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetAllocDecoded(ref MarshalledImage image); + + // free buffers + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetFree(ref MarshalledImage image); + + // encode raw to jpeg2000 + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetEncode(ref MarshalledImage image, bool lossless); + + // decode jpeg2000 to raw + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetDecode(ref MarshalledImage image); + + // decode jpeg2000 to raw, get jpeg2000 file info + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetDecodeWithInfo(ref MarshalledImage image); + + // invoke 64 bit openjpeg calls + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet-x86_64.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetAllocEncoded64(ref MarshalledImage image); + + // allocate decoded buffer based on width and height fields + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet-x86_64.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetAllocDecoded64(ref MarshalledImage image); + + // free buffers + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet-x86_64.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetFree64(ref MarshalledImage image); + + // encode raw to jpeg2000 + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet-x86_64.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetEncode64(ref MarshalledImage image, bool lossless); + + // decode jpeg2000 to raw + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet-x86_64.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetDecode64(ref MarshalledImage image); + + // decode jpeg2000 to raw, get jpeg2000 file info + [System.Security.SuppressUnmanagedCodeSecurity] + [DllImport("openjpeg-dotnet-x86_64.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DotNetDecodeWithInfo64(ref MarshalledImage image); + #endregion Unmanaged Function Declarations + + /// OpenJPEG is not threadsafe, so this object is used to lock + /// during calls into unmanaged code + private static object OpenJPEGLock = new object(); + + /// + /// Encode a object into a byte array + /// + /// The object to encode + /// true to enable lossless conversion, only useful for small images ie: sculptmaps + /// A byte array containing the encoded Image object + public static byte[] Encode(ManagedImage image, bool lossless) + { + if ((image.Channels & ManagedImage.ImageChannels.Color) == 0 || + ((image.Channels & ManagedImage.ImageChannels.Bump) != 0 && (image.Channels & ManagedImage.ImageChannels.Alpha) == 0)) + throw new ArgumentException("JPEG2000 encoding is not supported for this channel combination"); + + byte[] encoded = null; + MarshalledImage marshalled = new MarshalledImage(); + + // allocate and copy to input buffer + marshalled.width = image.Width; + marshalled.height = image.Height; + marshalled.components = 3; + if ((image.Channels & ManagedImage.ImageChannels.Alpha) != 0) marshalled.components++; + if ((image.Channels & ManagedImage.ImageChannels.Bump) != 0) marshalled.components++; + + lock (OpenJPEGLock) + { + + bool allocSuccess = (IntPtr.Size == 8) ? DotNetAllocDecoded64(ref marshalled) : DotNetAllocDecoded(ref marshalled); + + if (!allocSuccess) + throw new Exception("DotNetAllocDecoded failed"); + + int n = image.Width * image.Height; + + if ((image.Channels & ManagedImage.ImageChannels.Color) != 0) + { + Marshal.Copy(image.Red, 0, marshalled.decoded, n); + Marshal.Copy(image.Green, 0, (IntPtr)(marshalled.decoded.ToInt64() + n), n); + Marshal.Copy(image.Blue, 0, (IntPtr)(marshalled.decoded.ToInt64() + n * 2), n); + } + + if ((image.Channels & ManagedImage.ImageChannels.Alpha) != 0) Marshal.Copy(image.Alpha, 0, (IntPtr)(marshalled.decoded.ToInt64() + n * 3), n); + if ((image.Channels & ManagedImage.ImageChannels.Bump) != 0) Marshal.Copy(image.Bump, 0, (IntPtr)(marshalled.decoded.ToInt64() + n * 4), n); + + // codec will allocate output buffer + bool encodeSuccess = (IntPtr.Size == 8) ? DotNetEncode64(ref marshalled, lossless) : DotNetEncode(ref marshalled, lossless); + if (!encodeSuccess) + throw new Exception("DotNetEncode failed"); + + // copy output buffer + encoded = new byte[marshalled.length]; + Marshal.Copy(marshalled.encoded, encoded, 0, marshalled.length); + + // free buffers + if (IntPtr.Size == 8) + DotNetFree64(ref marshalled); + else + DotNetFree(ref marshalled); + } + + return encoded; + } + + /// + /// Encode a object into a byte array + /// + /// The object to encode + /// a byte array of the encoded image + public static byte[] Encode(ManagedImage image) + { + return Encode(image, false); + } + + /// + /// Decode JPEG2000 data to an and + /// + /// + /// JPEG2000 encoded data + /// ManagedImage object to decode to + /// Image object to decode to + /// True if the decode succeeds, otherwise false + public static bool DecodeToImage(byte[] encoded, out ManagedImage managedImage, out Image image) + { + managedImage = null; + image = null; + + if (DecodeToImage(encoded, out managedImage)) + { + try + { + image = managedImage.ExportBitmap(); + return true; + } + catch (Exception ex) + { + Logger.Log("Failed to export and load TGA data from decoded image", Helpers.LogLevel.Error, ex); + return false; + } + } + else + { + return false; + } + } + + /// + /// + /// + /// + /// + /// + public static bool DecodeToImage(byte[] encoded, out ManagedImage managedImage) + { + MarshalledImage marshalled = new MarshalledImage(); + + // Allocate and copy to input buffer + marshalled.length = encoded.Length; + + lock (OpenJPEGLock) + { + if (IntPtr.Size == 8) + DotNetAllocEncoded64(ref marshalled); + else + DotNetAllocEncoded(ref marshalled); + + Marshal.Copy(encoded, 0, marshalled.encoded, encoded.Length); + + // Codec will allocate output buffer + if (IntPtr.Size == 8) + DotNetDecode64(ref marshalled); + else + DotNetDecode(ref marshalled); + + int n = marshalled.width * marshalled.height; + + switch (marshalled.components) + { + case 1: // Grayscale + managedImage = new ManagedImage(marshalled.width, marshalled.height, + ManagedImage.ImageChannels.Color); + Marshal.Copy(marshalled.decoded, managedImage.Red, 0, n); + Buffer.BlockCopy(managedImage.Red, 0, managedImage.Green, 0, n); + Buffer.BlockCopy(managedImage.Red, 0, managedImage.Blue, 0, n); + break; + + case 2: // Grayscale + alpha + managedImage = new ManagedImage(marshalled.width, marshalled.height, + ManagedImage.ImageChannels.Color | ManagedImage.ImageChannels.Alpha); + Marshal.Copy(marshalled.decoded, managedImage.Red, 0, n); + Buffer.BlockCopy(managedImage.Red, 0, managedImage.Green, 0, n); + Buffer.BlockCopy(managedImage.Red, 0, managedImage.Blue, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)n), managedImage.Alpha, 0, n); + break; + + case 3: // RGB + managedImage = new ManagedImage(marshalled.width, marshalled.height, + ManagedImage.ImageChannels.Color); + Marshal.Copy(marshalled.decoded, managedImage.Red, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)n), managedImage.Green, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)(n * 2)), managedImage.Blue, 0, n); + break; + + case 4: // RGBA + managedImage = new ManagedImage(marshalled.width, marshalled.height, + ManagedImage.ImageChannels.Color | ManagedImage.ImageChannels.Alpha); + Marshal.Copy(marshalled.decoded, managedImage.Red, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)n), managedImage.Green, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)(n * 2)), managedImage.Blue, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)(n * 3)), managedImage.Alpha, 0, n); + break; + + case 5: // RGBAB + managedImage = new ManagedImage(marshalled.width, marshalled.height, + ManagedImage.ImageChannels.Color | ManagedImage.ImageChannels.Alpha | ManagedImage.ImageChannels.Bump); + Marshal.Copy(marshalled.decoded, managedImage.Red, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)n), managedImage.Green, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)(n * 2)), managedImage.Blue, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)(n * 3)), managedImage.Alpha, 0, n); + Marshal.Copy((IntPtr)(marshalled.decoded.ToInt64() + (long)(n * 4)), managedImage.Bump, 0, n); + break; + + default: + Logger.Log("Decoded image with unhandled number of components: " + marshalled.components, + Helpers.LogLevel.Error); + + if (IntPtr.Size == 8) + DotNetFree64(ref marshalled); + else + DotNetFree(ref marshalled); + + managedImage = null; + return false; + } + + if (IntPtr.Size == 8) + DotNetFree64(ref marshalled); + else + DotNetFree(ref marshalled); + } + + return true; + } + + /// + /// + /// + /// + /// + /// + /// + public static bool DecodeLayerBoundaries(byte[] encoded, out J2KLayerInfo[] layerInfo, out int components) + { + bool success = false; + layerInfo = null; + components = 0; + MarshalledImage marshalled = new MarshalledImage(); + + // Allocate and copy to input buffer + marshalled.length = encoded.Length; + + lock (OpenJPEGLock) + { + if (IntPtr.Size == 8) + DotNetAllocEncoded64(ref marshalled); + else + DotNetAllocEncoded(ref marshalled); + + Marshal.Copy(encoded, 0, marshalled.encoded, encoded.Length); + + // Run the decode + bool decodeSuccess = (IntPtr.Size == 8) ? DotNetDecodeWithInfo64(ref marshalled) : DotNetDecodeWithInfo(ref marshalled); + if (decodeSuccess) + { + components = marshalled.components; + + // Sanity check + if (marshalled.layers * marshalled.resolutions * marshalled.components == marshalled.packet_count) + { + // Manually marshal the array of opj_packet_info structs + MarshalledPacket[] packets = new MarshalledPacket[marshalled.packet_count]; + int offset = 0; + + for (int i = 0; i < marshalled.packet_count; i++) + { + MarshalledPacket packet; + packet.start_pos = Marshal.ReadInt32(marshalled.packets, offset); + offset += 4; + packet.end_ph_pos = Marshal.ReadInt32(marshalled.packets, offset); + offset += 4; + packet.end_pos = Marshal.ReadInt32(marshalled.packets, offset); + offset += 4; + //double distortion = (double)Marshal.ReadInt64(marshalled.packets, offset); + offset += 8; + + packets[i] = packet; + } + + layerInfo = new J2KLayerInfo[marshalled.layers]; + + for (int i = 0; i < marshalled.layers; i++) + { + int packetsPerLayer = marshalled.packet_count / marshalled.layers; + MarshalledPacket startPacket = packets[packetsPerLayer * i]; + MarshalledPacket endPacket = packets[(packetsPerLayer * (i + 1)) - 1]; + layerInfo[i].Start = startPacket.start_pos; + layerInfo[i].End = endPacket.end_pos; + } + + // More sanity checking + if (layerInfo.Length == 0 || layerInfo[layerInfo.Length - 1].End <= encoded.Length - 1) + { + success = true; + + for (int i = 0; i < layerInfo.Length; i++) + { + if (layerInfo[i].Start >= layerInfo[i].End || + (i > 0 && layerInfo[i].Start <= layerInfo[i - 1].End)) + { + System.Text.StringBuilder output = new System.Text.StringBuilder( + "Inconsistent packet data in JPEG2000 stream:\n"); + for (int j = 0; j < layerInfo.Length; j++) + output.AppendFormat("Layer {0}: Start: {1} End: {2}\n", j, layerInfo[j].Start, layerInfo[j].End); + Logger.DebugLog(output.ToString()); + + success = false; + break; + } + } + + if (!success) + { + for (int i = 0; i < layerInfo.Length; i++) + { + if (i < layerInfo.Length - 1) + layerInfo[i].End = layerInfo[i + 1].Start - 1; + else + layerInfo[i].End = marshalled.length; + } + + Logger.DebugLog("Corrected JPEG2000 packet data"); + success = true; + + for (int i = 0; i < layerInfo.Length; i++) + { + if (layerInfo[i].Start >= layerInfo[i].End || + (i > 0 && layerInfo[i].Start <= layerInfo[i - 1].End)) + { + System.Text.StringBuilder output = new System.Text.StringBuilder( + "Still inconsistent packet data in JPEG2000 stream, giving up:\n"); + for (int j = 0; j < layerInfo.Length; j++) + output.AppendFormat("Layer {0}: Start: {1} End: {2}\n", j, layerInfo[j].Start, layerInfo[j].End); + Logger.DebugLog(output.ToString()); + + success = false; + break; + } + } + } + } + else + { + Logger.Log(String.Format( + "Last packet end in JPEG2000 stream extends beyond the end of the file. filesize={0} layerend={1}", + encoded.Length, layerInfo[layerInfo.Length - 1].End), Helpers.LogLevel.Warning); + } + } + else + { + Logger.Log(String.Format( + "Packet count mismatch in JPEG2000 stream. layers={0} resolutions={1} components={2} packets={3}", + marshalled.layers, marshalled.resolutions, marshalled.components, marshalled.packet_count), + Helpers.LogLevel.Warning); + } + } + + if (IntPtr.Size == 8) + DotNetFree64(ref marshalled); + else + DotNetFree(ref marshalled); + } + + return success; + } + + /// + /// Encode a object into a byte array + /// + /// The source object to encode + /// true to enable lossless decoding + /// A byte array containing the source Bitmap object + public unsafe static byte[] EncodeFromImage(Bitmap bitmap, bool lossless) + { + BitmapData bd; + ManagedImage decoded; + + int bitmapWidth = bitmap.Width; + int bitmapHeight = bitmap.Height; + int pixelCount = bitmapWidth * bitmapHeight; + int i; + + if ((bitmap.PixelFormat & PixelFormat.Alpha) != 0 || (bitmap.PixelFormat & PixelFormat.PAlpha) != 0) + { + // Four layers, RGBA + decoded = new ManagedImage(bitmapWidth, bitmapHeight, + ManagedImage.ImageChannels.Color | ManagedImage.ImageChannels.Alpha); + bd = bitmap.LockBits(new Rectangle(0, 0, bitmapWidth, bitmapHeight), + ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + byte* pixel = (byte*)bd.Scan0; + + for (i = 0; i < pixelCount; i++) + { + // GDI+ gives us BGRA and we need to turn that in to RGBA + decoded.Blue[i] = *(pixel++); + decoded.Green[i] = *(pixel++); + decoded.Red[i] = *(pixel++); + decoded.Alpha[i] = *(pixel++); + } + } + else if (bitmap.PixelFormat == PixelFormat.Format16bppGrayScale) + { + // One layer + decoded = new ManagedImage(bitmapWidth, bitmapHeight, + ManagedImage.ImageChannels.Color); + bd = bitmap.LockBits(new Rectangle(0, 0, bitmapWidth, bitmapHeight), + ImageLockMode.ReadOnly, PixelFormat.Format16bppGrayScale); + byte* pixel = (byte*)bd.Scan0; + + for (i = 0; i < pixelCount; i++) + { + // Normalize 16-bit data down to 8-bit + ushort origVal = (byte)(*(pixel) + (*(pixel + 1) << 8)); + byte val = (byte)(((double)origVal / (double)UInt32.MaxValue) * (double)Byte.MaxValue); + + decoded.Red[i] = val; + decoded.Green[i] = val; + decoded.Blue[i] = val; + pixel += 2; + } + } + else + { + // Three layers, RGB + decoded = new ManagedImage(bitmapWidth, bitmapHeight, + ManagedImage.ImageChannels.Color); + bd = bitmap.LockBits(new Rectangle(0, 0, bitmapWidth, bitmapHeight), + ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); + byte* pixel = (byte*)bd.Scan0; + + for (i = 0; i < pixelCount; i++) + { + decoded.Blue[i] = *(pixel++); + decoded.Green[i] = *(pixel++); + decoded.Red[i] = *(pixel++); + } + } + + bitmap.UnlockBits(bd); + byte[] encoded = Encode(decoded, lossless); + return encoded; + } + } +#endif +} diff --git a/LibreMetaverse/ImportExport/ColladalLoader.cs b/LibreMetaverse/ImportExport/ColladalLoader.cs index 88d2ea0a..d3f5494a 100644 --- a/LibreMetaverse/ImportExport/ColladalLoader.cs +++ b/LibreMetaverse/ImportExport/ColladalLoader.cs @@ -164,11 +164,7 @@ namespace OpenMetaverse.ImportExport bitmap = resized; } - using (var writer = new LibreMetaverse.Imaging.J2KWriter(material.TextureData)) - { - writer.WriteHeader(new OpenJpegDotNet.IO.Parameter { Compression = 1 }); - material.TextureData = writer.Encode(bitmap); - } + material.TextureData = OpenJPEG.EncodeFromImage(bitmap, false); Logger.Log("Successfully encoded " + fname, Helpers.LogLevel.Info); } diff --git a/LibreMetaverse/LibreMetaverse.csproj b/LibreMetaverse/LibreMetaverse.csproj index 3e59cd34..0925d89b 100644 --- a/LibreMetaverse/LibreMetaverse.csproj +++ b/LibreMetaverse/LibreMetaverse.csproj @@ -14,7 +14,6 @@ LibreMetaverse true netstandard2.0;netstandard2.1;net50 - AnyCPU;x64;x86 True @@ -33,40 +32,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -85,47 +50,10 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - LibreMetaverse.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - LibreMetaverse.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - diff --git a/LibreMetaverse/WindowsLibraryLoader.cs b/LibreMetaverse/WindowsLibraryLoader.cs deleted file mode 100644 index f4aeacfc..00000000 --- a/LibreMetaverse/WindowsLibraryLoader.cs +++ /dev/null @@ -1,307 +0,0 @@ -/** - * Copyright (c) 2021, Sjofn LLC. - * All rights reserved. - * - * - Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Neither the name of the openmetaverse.co nor the names - * of its contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Text; - -namespace LibreMetaverse -{ - internal sealed class WindowsLibraryLoader - { - #region Fields - - private const string ProcessorArchitecture = "PROCESSOR_ARCHITECTURE"; - private const string DllFileExtension = ".dll"; - private const string DllDirectory = "dll"; - private readonly Dictionary _ProcessorArchitectureAddressWidthPlatforms = - new Dictionary(StringComparer.OrdinalIgnoreCase) - { - {"x86", 4}, - {"AMD64", 8}, - {"IA64", 8}, - {"ARM", 4} - }; - - private readonly Dictionary _ProcessorArchitecturePlatforms = - new Dictionary(StringComparer.OrdinalIgnoreCase) - { - {"x86", "x86"}, - {"AMD64", "x64"}, - {"IA64", "Itanium"}, - {"ARM", "WinCE"} - }; - - private readonly object _SyncLock = new object(); - private static readonly IDictionary LoadedLibraries = new Dictionary(); - - [DllImport("kernel32", EntryPoint = "LoadLibrary", CallingConvention = CallingConvention.Winapi, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)] - private static extern IntPtr Win32LoadLibrary(string dllPath); - - #endregion - - #region Properties - - public static bool IsCurrentPlatformSupported() - { - return RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - } - - public static bool IsWindows() - { - return Environment.OSVersion.Platform == PlatformID.Win32NT || - Environment.OSVersion.Platform == PlatformID.Win32S || - Environment.OSVersion.Platform == PlatformID.Win32Windows || - Environment.OSVersion.Platform == PlatformID.WinCE; - } - - #endregion - - #region Methods - - #region Helpers - - private static string FixUpDllFileName(string fileName) - { - if (string.IsNullOrEmpty(fileName)) - return fileName; - - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - return fileName; - - if (!fileName.EndsWith(DllFileExtension, StringComparison.OrdinalIgnoreCase)) - return $"{fileName}{DllFileExtension}"; - - return fileName; - } - - private ProcessArchitectureInfo GetProcessArchitecture() - { - // BUG: Will this always be reliable? - var processArchitecture = Environment.GetEnvironmentVariable(ProcessorArchitecture); - var processInfo = new ProcessArchitectureInfo(); - if (!string.IsNullOrEmpty(processArchitecture)) - { - // Sanity check - processInfo.Architecture = processArchitecture; - } - else - { - processInfo.AddWarning("Failed to detect processor architecture, falling back to x86."); - processInfo.Architecture = (IntPtr.Size == 8) ? "x64" : "x86"; - } - - var addressWidth = this._ProcessorArchitectureAddressWidthPlatforms[processInfo.Architecture]; - if (addressWidth != IntPtr.Size) - { - if (String.Equals(processInfo.Architecture, "AMD64", StringComparison.OrdinalIgnoreCase) && IntPtr.Size == 4) - { - // fall back to x86 if detected x64 but has an address width of 32 bits. - processInfo.Architecture = "x86"; - processInfo.AddWarning("Expected the detected processing architecture of {0} to have an address width of {1} Bytes but was {2} Bytes, falling back to x86.", processInfo.Architecture, addressWidth, IntPtr.Size); - } - else - { - // no fallback possible - processInfo.AddWarning("Expected the detected processing architecture of {0} to have an address width of {1} Bytes but was {2} Bytes.", processInfo.Architecture, addressWidth, IntPtr.Size); - - } - } - - return processInfo; - } - - private string GetPlatformName(string processorArchitecture) - { - if (String.IsNullOrEmpty(processorArchitecture)) - return null; - - string platformName; - if (this._ProcessorArchitecturePlatforms.TryGetValue(processorArchitecture, out platformName)) - { - return platformName; - } - - return null; - } - - public void LoadLibraries(IEnumerable dlls) - { - if (!IsWindows()) - return; - - foreach (var dll in dlls) - LoadLibrary(dll); - } - - private void LoadLibrary(string dllName) - { - if (!IsCurrentPlatformSupported()) - return; - - try - { - lock (this._SyncLock) - { - if (LoadedLibraries.ContainsKey(dllName)) - return; - - var processArch = GetProcessArchitecture(); - IntPtr dllHandle; - - // Try loading from executing assembly domain - var executingAssembly = GetType().GetTypeInfo().Assembly; - var baseDirectory = Path.GetDirectoryName(executingAssembly.Location); - dllHandle = LoadLibraryInternal(dllName, baseDirectory, processArch); - if (dllHandle != IntPtr.Zero) return; - - // Gets the pathname of the base directory that the assembly resolver uses to probe for assemblies. - // https://github.com/dotnet/corefx/issues/2221 - baseDirectory = AppContext.BaseDirectory; - dllHandle = LoadLibraryInternal(dllName, baseDirectory, processArch); - if (dllHandle != IntPtr.Zero) return; - - // Finally try the working directory - baseDirectory = Path.GetFullPath(Directory.GetCurrentDirectory()); - dllHandle = LoadLibraryInternal(dllName, baseDirectory, processArch); - if (dllHandle != IntPtr.Zero) return; - - var errorMessage = new StringBuilder(); - errorMessage.Append($"Failed to find dll \"{dllName}\", for processor architecture {processArch.Architecture}."); - if (processArch.HasWarnings) - { - // include process detection warnings - errorMessage.Append($"\r\nWarnings: \r\n{processArch.WarningText()}"); - } - - throw new Exception(errorMessage.ToString()); - } - } - catch (Exception e) - { - Debug.WriteLine(e.Message); - } - } - - private IntPtr LoadLibraryInternal(string dllName, string baseDirectory, ProcessArchitectureInfo processArchInfo) - { - var platformName = GetPlatformName(processArchInfo.Architecture); - var expectedDllDirectory = Path.Combine( - Path.Combine(baseDirectory, DllDirectory), platformName); - return this.LoadLibraryRaw(dllName, expectedDllDirectory); - } - - private IntPtr LoadLibraryRaw(string dllName, string baseDirectory) - { - var libraryHandle = IntPtr.Zero; - var fileName = FixUpDllFileName(Path.Combine(baseDirectory, dllName)); - - // Show where we're trying to load the file from - Debug.WriteLine($"Trying to load native library \"{fileName}\"..."); - - if (File.Exists(fileName)) - { - // Attempt to load dll - try - { - libraryHandle = Win32LoadLibrary(fileName); - if (libraryHandle != IntPtr.Zero) - { - // library has been loaded - Debug.WriteLine($"Successfully loaded native library \"{fileName}\"."); - LoadedLibraries.Add(dllName, libraryHandle); - } - else - { - Debug.WriteLine($"Failed to load native library \"{fileName}\".\r\nCheck windows event log."); - } - } - catch (Exception e) - { - var lastError = Marshal.GetLastWin32Error(); - Debug.WriteLine($"Failed to load native library \"{fileName}\".\r\nLast Error:{lastError}\r\nCheck inner exception and\\or windows event log.\r\nInner Exception: {e}"); - } - } - else - { - Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "The native library \"{0}\" does not exist.", fileName)); - } - - return libraryHandle; - } - - #endregion - - #endregion - - private class ProcessArchitectureInfo - { - #region Constructors - - public ProcessArchitectureInfo() - { - this.Warnings = new List(); - } - - #endregion - - #region Properties - - public string Architecture - { - get; set; - } - - private List Warnings - { - get; - } - - #endregion - - #region Methods - - public void AddWarning(string format, params object[] args) - { - Warnings.Add(String.Format(format, args)); - } - - public bool HasWarnings => Warnings.Count > 0; - - public string WarningText() - { - return string.Join("\r\n", Warnings.ToArray()); - } - - #endregion - } - } -} diff --git a/LibreMetaverseTypes/LibreMetaverse.Types.csproj b/LibreMetaverseTypes/LibreMetaverse.Types.csproj index 0c77d7ae..529950b5 100644 --- a/LibreMetaverseTypes/LibreMetaverse.Types.csproj +++ b/LibreMetaverseTypes/LibreMetaverse.Types.csproj @@ -14,7 +14,6 @@ Library LibreMetaverse true - AnyCPU;x64;x86 True @@ -33,40 +32,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -85,42 +50,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - LibreMetaverseTypes.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - LibreMetaverseTypes.XML - False - 4096 - True - ..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - diff --git a/PrimMesher/LibreMetaverse.PrimMesher.csproj b/PrimMesher/LibreMetaverse.PrimMesher.csproj index 6ddbd2c1..3fe00fcf 100644 --- a/PrimMesher/LibreMetaverse.PrimMesher.csproj +++ b/PrimMesher/LibreMetaverse.PrimMesher.csproj @@ -17,7 +17,6 @@ Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC 2018-2021. All rights reserved. LICENSE.txt https://github.com/cinderblocks/libremetaverse - AnyCPU;x64;x86 true @@ -28,24 +27,6 @@ prompt 4 - - true - full - false - ..\bin\ - TRACE;DEBUG;VERTEX_INDEXER - prompt - 4 - - - true - full - false - ..\bin\ - TRACE;DEBUG;VERTEX_INDEXER - prompt - 4 - pdbonly true @@ -54,22 +35,6 @@ prompt 4 - - pdbonly - true - ..\bin\ - TRACE;VERTEX_INDEXER - prompt - 4 - - - pdbonly - true - ..\bin\ - TRACE;VERTEX_INDEXER - prompt - 4 - diff --git a/Programs/Baker/Baker.csproj b/Programs/Baker/Baker.csproj index 3e2fbc97..446e5bcf 100644 --- a/Programs/Baker/Baker.csproj +++ b/Programs/Baker/Baker.csproj @@ -23,7 +23,6 @@ False - AnyCPU;x64;x86 diff --git a/Programs/GridProxy/GridProxy.csproj b/Programs/GridProxy/GridProxy.csproj index b008b54a..7ea00e54 100644 --- a/Programs/GridProxy/GridProxy.csproj +++ b/Programs/GridProxy/GridProxy.csproj @@ -14,7 +14,6 @@ GridProxy true netcoreapp3.1;net5 - AnyCPU;x64;x86 True @@ -33,40 +32,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE;DEBUG - True - 4096 - False - ..\..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - True 285212672 @@ -84,40 +49,6 @@ 1591,1574,0419 AnyCPU - - True - 285212672 - False - TRACE - False - 4096 - True - ..\..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - - - True - 285212672 - False - TRACE - False - 4096 - True - ..\..\bin\ - False - False - False - 4 - False - 1591,1574,0419 - AnyCPU - diff --git a/Programs/VoiceTest/VoiceTest.csproj b/Programs/VoiceTest/VoiceTest.csproj index 0d4efb79..1ed2fb74 100644 --- a/Programs/VoiceTest/VoiceTest.csproj +++ b/Programs/VoiceTest/VoiceTest.csproj @@ -25,7 +25,6 @@ netcoreapp3.1;net50 - AnyCPU;x64;x86 diff --git a/Programs/examples/IRCGateway/IRCGateway.csproj b/Programs/examples/IRCGateway/IRCGateway.csproj index cff458cc..1ef8ddaa 100644 --- a/Programs/examples/IRCGateway/IRCGateway.csproj +++ b/Programs/examples/IRCGateway/IRCGateway.csproj @@ -25,7 +25,6 @@ netcoreapp3.1;net5 - AnyCPU;x64;x86 diff --git a/Programs/examples/PacketDump/PacketDump.csproj b/Programs/examples/PacketDump/PacketDump.csproj index 6f791584..8ae634ed 100644 --- a/Programs/examples/PacketDump/PacketDump.csproj +++ b/Programs/examples/PacketDump/PacketDump.csproj @@ -25,7 +25,6 @@ netcoreapp3.1 - AnyCPU;x64;x86 diff --git a/Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs b/Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs index 0fc152a9..26bcf6f3 100644 --- a/Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs +++ b/Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using OpenMetaverse; using OpenMetaverse.Imaging; using OpenMetaverse.Assets; -using LibreMetaverse.Imaging; namespace OpenMetaverse.TestClient { @@ -92,14 +91,10 @@ namespace OpenMetaverse.TestClient File.WriteAllBytes(assetTexture.AssetID + ".jp2", assetTexture.AssetData); Console.WriteLine("Wrote JPEG2000 image " + assetTexture.AssetID + ".jp2"); - using (J2KReader reader = new J2KReader(assetTexture.AssetData)) - { - reader.ReadHeader(); - System.Drawing.Bitmap bitmap = reader.DecodeToBitmap(); - ManagedImage imgData = new ManagedImage(bitmap); - byte[] tgaFile = imgData.ExportTGA(); - File.WriteAllBytes(assetTexture.AssetID + ".tga", tgaFile); - } + ManagedImage imgData; + OpenJPEG.DecodeToImage(assetTexture.AssetData, out imgData); + byte[] tgaFile = imgData.ExportTGA(); + File.WriteAllBytes(assetTexture.AssetID + ".tga", tgaFile); Console.WriteLine("Wrote TGA image " + assetTexture.AssetID + ".tga"); } catch (Exception e) diff --git a/Programs/examples/TestClient/Commands/Inventory/UploadImageCommand.cs b/Programs/examples/TestClient/Commands/Inventory/UploadImageCommand.cs index ef1a1e1f..28fe8478 100644 --- a/Programs/examples/TestClient/Commands/Inventory/UploadImageCommand.cs +++ b/Programs/examples/TestClient/Commands/Inventory/UploadImageCommand.cs @@ -77,7 +77,7 @@ namespace OpenMetaverse.TestClient private byte[] LoadImage(string fileName) { - byte[] UploadData = { }; + byte[] UploadData; string lowfilename = fileName.ToLower(); Bitmap bitmap = null; @@ -85,22 +85,22 @@ namespace OpenMetaverse.TestClient { if (lowfilename.EndsWith(".jp2") || lowfilename.EndsWith(".j2c")) { + Image image; + ManagedImage managedImage; + // Upload JPEG2000 images untouched UploadData = System.IO.File.ReadAllBytes(fileName); - - using (var reader = new LibreMetaverse.Imaging.J2KReader(UploadData)) - { - reader.ReadHeader(); - bitmap = reader.DecodeToBitmap(); - } + + OpenJPEG.DecodeToImage(UploadData, out managedImage, out image); + bitmap = (Bitmap)image; } else { - if (lowfilename.EndsWith(".tga")) { + if (lowfilename.EndsWith(".tga")) bitmap = LoadTGAClass.LoadTGA(fileName); - } else { + else bitmap = (Bitmap)Image.FromFile(fileName); - } + int oldwidth = bitmap.Width; int oldheight = bitmap.Height; @@ -137,11 +137,8 @@ namespace OpenMetaverse.TestClient bitmap.Dispose(); bitmap = resized; } - using (var writer = new LibreMetaverse.Imaging.J2KWriter(UploadData)) - { - writer.WriteHeader(new OpenJpegDotNet.IO.Parameter { Compression = 1 }); - UploadData = writer.Encode(bitmap); - } + + UploadData = OpenJPEG.EncodeFromImage(bitmap, false); } } catch (Exception ex) diff --git a/Programs/examples/TestClient/TestClient.csproj b/Programs/examples/TestClient/TestClient.csproj index 2aceae33..c4e276aa 100644 --- a/Programs/examples/TestClient/TestClient.csproj +++ b/Programs/examples/TestClient/TestClient.csproj @@ -24,7 +24,6 @@ false netcoreapp3.1;net50 - AnyCPU;x64;x86 diff --git a/Programs/mapgenerator/mapgenerator.csproj b/Programs/mapgenerator/mapgenerator.csproj index 383be7cc..39880496 100644 --- a/Programs/mapgenerator/mapgenerator.csproj +++ b/Programs/mapgenerator/mapgenerator.csproj @@ -26,7 +26,6 @@ - AnyCPU;x64;x86 diff --git a/bin/OpenMetaverse.dll.config b/bin/OpenMetaverse.dll.config new file mode 100755 index 00000000..ccafc0ff --- /dev/null +++ b/bin/OpenMetaverse.dll.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bin/Tao.OpenGl.dll.config b/bin/Tao.OpenGl.dll.config new file mode 100644 index 00000000..a788d0f0 --- /dev/null +++ b/bin/Tao.OpenGl.dll.config @@ -0,0 +1,4 @@ + + + + diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so new file mode 100755 index 00000000..193eca4b Binary files /dev/null and b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so differ diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so new file mode 100755 index 00000000..7a9bdfcd Binary files /dev/null and b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so differ diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib new file mode 100755 index 00000000..91f7264f Binary files /dev/null and b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib differ diff --git a/bin/openjpeg-dotnet-x86_64.dll b/bin/openjpeg-dotnet-x86_64.dll new file mode 100755 index 00000000..9e8cd215 Binary files /dev/null and b/bin/openjpeg-dotnet-x86_64.dll differ diff --git a/bin/openjpeg-dotnet.dll b/bin/openjpeg-dotnet.dll new file mode 100755 index 00000000..6377b8d9 Binary files /dev/null and b/bin/openjpeg-dotnet.dll differ