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