diff --git a/build/Stride.sln b/build/Stride.sln index c7060e2b2c..e05726524f 100644 --- a/build/Stride.sln +++ b/build/Stride.sln @@ -338,6 +338,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Importer.3D", "..\so EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.BepuPhysics.Tests", "..\sources\engine\Stride.BepuPhysics\Stride.BepuPhysics.Tests\Stride.BepuPhysics.Tests.csproj", "{7B70C783-4085-4702-B3C6-6570FD85CB8F}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.FreeImage", "..\sources\tools\Stride.FreeImage\Stride.FreeImage.csproj", "{03695F9B-10E9-4A10-93AE-6402E46F10B5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1523,6 +1525,18 @@ Global {7B70C783-4085-4702-B3C6-6570FD85CB8F}.Release|Mixed Platforms.Build.0 = Release|Any CPU {7B70C783-4085-4702-B3C6-6570FD85CB8F}.Release|Win32.ActiveCfg = Release|Any CPU {7B70C783-4085-4702-B3C6-6570FD85CB8F}.Release|Win32.Build.0 = Release|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Debug|Win32.ActiveCfg = Debug|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Debug|Win32.Build.0 = Debug|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Release|Any CPU.Build.0 = Release|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Release|Win32.ActiveCfg = Release|Any CPU + {03695F9B-10E9-4A10-93AE-6402E46F10B5}.Release|Win32.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1651,6 +1665,7 @@ Global {7715D094-DF59-4D91-BC9A-9A5118039ECB} = {DE048114-9AE4-467E-A879-188DC0D88A59} {66EFFDE4-24F0-4E57-9618-0F5577E20A1E} = {6F473FA6-4F8B-4FBA-AE33-EE5AF997D50C} {7B70C783-4085-4702-B3C6-6570FD85CB8F} = {DE048114-9AE4-467E-A879-188DC0D88A59} + {03695F9B-10E9-4A10-93AE-6402E46F10B5} = {1AE1AC60-5D2F-4CA7-AE20-888F44551185} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FF877973-604D-4EA7-B5F5-A129961F9EF2} diff --git a/sources/engine/Stride/Graphics/StandardImageHelper.Desktop.cs b/sources/engine/Stride/Graphics/StandardImageHelper.Desktop.cs new file mode 100644 index 0000000000..8e348cb373 --- /dev/null +++ b/sources/engine/Stride/Graphics/StandardImageHelper.Desktop.cs @@ -0,0 +1,115 @@ +// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) +// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. +#if STRIDE_PLATFORM_DESKTOP +using System; +using System.IO; +using System.Runtime.InteropServices; +using FreeImageAPI; +using Stride.Core; +using RotateFlipType = FreeImageAPI.RotateFlipType; + +namespace Stride.Graphics +{ + /// + /// This class is responsible to provide image loader for png, gif, bmp. + /// + partial class StandardImageHelper + { + static StandardImageHelper() + { + NativeLibraryHelper.PreloadLibrary("freeimage", typeof(StandardImageHelper)); + } + + public static unsafe Image LoadFromMemory(IntPtr pSource, int size, bool makeACopy, GCHandle? handle) + { + using var memoryStream = new UnmanagedMemoryStream((byte*)pSource, size, capacity: size, access: FileAccess.Read); + using var bitmap = FreeImageBitmap.FromStream(memoryStream); + + bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); + bitmap.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_32_BPP); + + var image = Image.New2D(bitmap.Width, bitmap.Height, 1, PixelFormat.B8G8R8A8_UNorm, 1, bitmap.Line); + + try + { + // TODO: Test if still necessary + // Directly load image as RGBA instead of BGRA, because OpenGL ES devices don't support it out of the box (extension). + Utilities.CopyWithAlignmentFallback((void*)image.PixelBuffer[0].DataPointer, (void*)bitmap.Bits, (uint)image.PixelBuffer[0].BufferStride); + } + finally + { + if (handle != null) + handle.Value.Free(); + else if (!makeACopy) + Utilities.FreeMemory(pSource); + } + + return image; + } + + public static void SaveGifFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) + { + SaveFromMemory(pixelBuffers, description, imageStream, FREE_IMAGE_FORMAT.FIF_GIF); + } + + public static void SaveTiffFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) + { + SaveFromMemory(pixelBuffers, description, imageStream, FREE_IMAGE_FORMAT.FIF_TIFF); + } + + public static void SaveBmpFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) + { + SaveFromMemory(pixelBuffers, description, imageStream, FREE_IMAGE_FORMAT.FIF_BMP); + } + + public static void SaveJpgFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) + { + SaveFromMemory(pixelBuffers, description, imageStream, FREE_IMAGE_FORMAT.FIF_BMP); + } + + public static void SavePngFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) + { + SaveFromMemory(pixelBuffers, description, imageStream, FREE_IMAGE_FORMAT.FIF_PNG); + } + + public static void SaveWmpFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) + { + throw new NotImplementedException(); + } + + private static unsafe void SaveFromMemory(PixelBuffer[] pixelBuffers, ImageDescription description, Stream imageStream, FREE_IMAGE_FORMAT imageFormat) + { + using var bitmap = new FreeImageBitmap(description.Width, description.Height); + bitmap.ConvertColorDepth(FREE_IMAGE_COLOR_DEPTH.FICD_32_BPP); + + // Copy memory + var format = description.Format; + if (format is PixelFormat.R8G8B8A8_UNorm or PixelFormat.R8G8B8A8_UNorm_SRgb) + { + CopyMemoryBGRA(bitmap.Bits, pixelBuffers[0].DataPointer, pixelBuffers[0].BufferStride); + } + else if (format is PixelFormat.B8G8R8A8_UNorm or PixelFormat.B8G8R8A8_UNorm_SRgb) + { + Utilities.CopyWithAlignmentFallback((void*)bitmap.Bits, (void*)pixelBuffers[0].DataPointer, (uint)pixelBuffers[0].BufferStride); + } + else if (format is PixelFormat.R8_UNorm or PixelFormat.A8_UNorm) + { + // TODO Ideally we will want to support grayscale images, but the SpriteBatch can only render RGBA for now + // so convert the grayscale image as an RGBA and save it + CopyMemoryRRR1(bitmap.Bits, pixelBuffers[0].DataPointer, pixelBuffers[0].BufferStride); + } + else + { + throw new ArgumentException( + message: + $"The pixel format {format} is not supported. Supported formats are {PixelFormat.B8G8R8A8_UNorm}, {PixelFormat.B8G8R8A8_UNorm_SRgb}, {PixelFormat.R8G8B8A8_UNorm}, {PixelFormat.R8G8B8A8_UNorm_SRgb}, {PixelFormat.R8_UNorm}, {PixelFormat.A8_UNorm}", + paramName: nameof(description)); + } + + // Save + bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); + bitmap.Save(imageStream, imageFormat); + } + } +} +#endif diff --git a/sources/engine/Stride/Graphics/StandardImageHelper.Windows.cs b/sources/engine/Stride/Graphics/StandardImageHelper.Windows.cs deleted file mode 100644 index 37750c0be2..0000000000 --- a/sources/engine/Stride/Graphics/StandardImageHelper.Windows.cs +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. -#if STRIDE_PLATFORM_DESKTOP -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using Stride.Core; - -namespace Stride.Graphics -{ - /// - /// This class is responsible to provide image loader for png, gif, bmp. - /// TODO: Replace using System.Drawing, as it is not available on all platforms (not on Windows 8/WP8). - /// - partial class StandardImageHelper - { - public static unsafe Image LoadFromMemory(IntPtr pSource, int size, bool makeACopy, GCHandle? handle) - { - using var memoryStream = new UnmanagedMemoryStream((byte*)pSource, size, capacity: size, access: FileAccess.Read); - using var bitmap = (Bitmap)System.Drawing.Image.FromStream(memoryStream); - var sourceArea = new Rectangle(0, 0, bitmap.Width, bitmap.Height); - // Lock System.Drawing.Bitmap - - var bitmapData = bitmap.LockBits(sourceArea, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - var image = Image.New2D(bitmap.Width, bitmap.Height, 1, PixelFormat.B8G8R8A8_UNorm, 1, bitmapData.Stride); - // var dataRect = new DataRectangle(bitmapData.Stride, bitmapData.Scan0); - - try - { - // TODO: Test if still necessary - // Directly load image as RGBA instead of BGRA, because OpenGL ES devices don't support it out of the box (extension). - //image.Description.Format = PixelFormat.R8G8B8A8_UNorm; - //CopyMemoryBGRA(image.PixelBuffer[0].DataPointer, bitmapData.Scan0, image.PixelBuffer[0].BufferStride); - Utilities.CopyWithAlignmentFallback((void*)image.PixelBuffer[0].DataPointer, (void*)bitmapData.Scan0, (uint)image.PixelBuffer[0].BufferStride); - } - finally - { - bitmap.UnlockBits(bitmapData); - - if (handle != null) - handle.Value.Free(); - else if (!makeACopy) - Utilities.FreeMemory(pSource); - } - - return image; - } - - public static void SaveGifFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) - { - SaveFromMemory(pixelBuffers, count, description, imageStream, ImageFormat.Gif); - } - - public static void SaveTiffFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) - { - SaveFromMemory(pixelBuffers, count, description, imageStream, ImageFormat.Tiff); - } - - public static void SaveBmpFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) - { - SaveFromMemory(pixelBuffers, count, description, imageStream, ImageFormat.Bmp); - } - - public static void SaveJpgFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) - { - SaveFromMemory(pixelBuffers, count, description, imageStream, ImageFormat.Jpeg); - } - - public static void SavePngFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) - { - SaveFromMemory(pixelBuffers, count, description, imageStream, ImageFormat.Png); - } - - public static void SaveWmpFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream) - { - throw new NotImplementedException(); - } - - private static unsafe void SaveFromMemory(PixelBuffer[] pixelBuffers, int count, ImageDescription description, Stream imageStream, ImageFormat imageFormat) - { - using var bitmap = new Bitmap(description.Width, description.Height); - var sourceArea = new Rectangle(0, 0, bitmap.Width, bitmap.Height); - - // Lock System.Drawing.Bitmap - var bitmapData = bitmap.LockBits(sourceArea, ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - - try - { - // Copy memory - var format = description.Format; - if (format == PixelFormat.R8G8B8A8_UNorm || format == PixelFormat.R8G8B8A8_UNorm_SRgb) - { - CopyMemoryBGRA(bitmapData.Scan0, pixelBuffers[0].DataPointer, pixelBuffers[0].BufferStride); - } - else if (format == PixelFormat.B8G8R8A8_UNorm || format == PixelFormat.B8G8R8A8_UNorm_SRgb) - { - Utilities.CopyWithAlignmentFallback((void*)bitmapData.Scan0, (void*)pixelBuffers[0].DataPointer, (uint)pixelBuffers[0].BufferStride); - } - else if (format == PixelFormat.R8_UNorm || format == PixelFormat.A8_UNorm) - { - // TODO Ideally we will want to support grayscale images, but the SpriteBatch can only render RGBA for now - // so convert the grayscale image as an RGBA and save it - CopyMemoryRRR1(bitmapData.Scan0, pixelBuffers[0].DataPointer, pixelBuffers[0].BufferStride); - } - else - { - throw new ArgumentException( - message: $"The pixel format {format} is not supported. Supported formats are {PixelFormat.B8G8R8A8_UNorm}, {PixelFormat.B8G8R8A8_UNorm_SRgb}, {PixelFormat.R8G8B8A8_UNorm}, {PixelFormat.R8G8B8A8_UNorm_SRgb}, {PixelFormat.R8_UNorm}, {PixelFormat.A8_UNorm}", - paramName: nameof(description)); - } - } - finally - { - bitmap.UnlockBits(bitmapData); - } - - // Save - bitmap.Save(imageStream, imageFormat); - } - } -} -#endif diff --git a/sources/engine/Stride/Stride.csproj b/sources/engine/Stride/Stride.csproj index ac4882991e..ec99888c23 100644 --- a/sources/engine/Stride/Stride.csproj +++ b/sources/engine/Stride/Stride.csproj @@ -32,6 +32,7 @@ + diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/FreeImageBitmap.cs b/sources/tools/Stride.FreeImage/Classes/FreeImageBitmap.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/FreeImageBitmap.cs rename to sources/tools/Stride.FreeImage/Classes/FreeImageBitmap.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/FreeImageEngine.cs b/sources/tools/Stride.FreeImage/Classes/FreeImageEngine.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/FreeImageEngine.cs rename to sources/tools/Stride.FreeImage/Classes/FreeImageEngine.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/FreeImagePlugin.cs b/sources/tools/Stride.FreeImage/Classes/FreeImagePlugin.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/FreeImagePlugin.cs rename to sources/tools/Stride.FreeImage/Classes/FreeImagePlugin.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/FreeImageStreamIO.cs b/sources/tools/Stride.FreeImage/Classes/FreeImageStreamIO.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/FreeImageStreamIO.cs rename to sources/tools/Stride.FreeImage/Classes/FreeImageStreamIO.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/GifInformation.cs b/sources/tools/Stride.FreeImage/Classes/GifInformation.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/GifInformation.cs rename to sources/tools/Stride.FreeImage/Classes/GifInformation.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/ImageMetadata.cs b/sources/tools/Stride.FreeImage/Classes/ImageMetadata.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/ImageMetadata.cs rename to sources/tools/Stride.FreeImage/Classes/ImageMetadata.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/LocalPlugin.cs b/sources/tools/Stride.FreeImage/Classes/LocalPlugin.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/LocalPlugin.cs rename to sources/tools/Stride.FreeImage/Classes/LocalPlugin.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/MemoryArray.cs b/sources/tools/Stride.FreeImage/Classes/MemoryArray.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/MemoryArray.cs rename to sources/tools/Stride.FreeImage/Classes/MemoryArray.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/MetadataModel.cs b/sources/tools/Stride.FreeImage/Classes/MetadataModel.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/MetadataModel.cs rename to sources/tools/Stride.FreeImage/Classes/MetadataModel.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/MetadataModels.cs b/sources/tools/Stride.FreeImage/Classes/MetadataModels.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/MetadataModels.cs rename to sources/tools/Stride.FreeImage/Classes/MetadataModels.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/MetadataTag.cs b/sources/tools/Stride.FreeImage/Classes/MetadataTag.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/MetadataTag.cs rename to sources/tools/Stride.FreeImage/Classes/MetadataTag.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/Palette.cs b/sources/tools/Stride.FreeImage/Classes/Palette.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/Palette.cs rename to sources/tools/Stride.FreeImage/Classes/Palette.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/PluginRepository.cs b/sources/tools/Stride.FreeImage/Classes/PluginRepository.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/PluginRepository.cs rename to sources/tools/Stride.FreeImage/Classes/PluginRepository.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/Scanline.cs b/sources/tools/Stride.FreeImage/Classes/Scanline.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/Scanline.cs rename to sources/tools/Stride.FreeImage/Classes/Scanline.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/StreamWrapper.cs b/sources/tools/Stride.FreeImage/Classes/StreamWrapper.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Classes/StreamWrapper.cs rename to sources/tools/Stride.FreeImage/Classes/StreamWrapper.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Delegates.cs b/sources/tools/Stride.FreeImage/Delegates.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Delegates.cs rename to sources/tools/Stride.FreeImage/Delegates.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/DisposalMethodType.cs b/sources/tools/Stride.FreeImage/Enumerations/DisposalMethodType.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/DisposalMethodType.cs rename to sources/tools/Stride.FreeImage/Enumerations/DisposalMethodType.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COLOR_CHANNEL.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COLOR_CHANNEL.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COLOR_CHANNEL.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COLOR_CHANNEL.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COLOR_DEPTH.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COLOR_DEPTH.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COLOR_DEPTH.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COLOR_DEPTH.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COLOR_OPTIONS.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COLOR_OPTIONS.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COLOR_OPTIONS.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COLOR_OPTIONS.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COLOR_TYPE.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COLOR_TYPE.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COLOR_TYPE.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COLOR_TYPE.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COMPARE_FLAGS.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COMPARE_FLAGS.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_COMPARE_FLAGS.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_COMPARE_FLAGS.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_DITHER.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_DITHER.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_DITHER.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_DITHER.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_FILTER.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_FILTER.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_FILTER.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_FILTER.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_FORMAT.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_FORMAT.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_FORMAT.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_FORMAT.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_JPEG_OPERATION.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_JPEG_OPERATION.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_JPEG_OPERATION.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_JPEG_OPERATION.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_LOAD_FLAGS.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_LOAD_FLAGS.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_LOAD_FLAGS.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_LOAD_FLAGS.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_MDMODEL.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_MDMODEL.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_MDMODEL.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_MDMODEL.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_MDTYPE.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_MDTYPE.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_MDTYPE.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_MDTYPE.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_METADATA_COPY.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_METADATA_COPY.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_METADATA_COPY.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_METADATA_COPY.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_QUANTIZE.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_QUANTIZE.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_QUANTIZE.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_QUANTIZE.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_SAVE_FLAGS.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_SAVE_FLAGS.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_SAVE_FLAGS.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_SAVE_FLAGS.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_TMO.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_TMO.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_TMO.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_TMO.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_TYPE.cs b/sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_TYPE.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/FREE_IMAGE_TYPE.cs rename to sources/tools/Stride.FreeImage/Enumerations/FREE_IMAGE_TYPE.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/ICC_FLAGS.cs b/sources/tools/Stride.FreeImage/Enumerations/ICC_FLAGS.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/ICC_FLAGS.cs rename to sources/tools/Stride.FreeImage/Enumerations/ICC_FLAGS.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/MD_SEARCH_FLAGS.cs b/sources/tools/Stride.FreeImage/Enumerations/MD_SEARCH_FLAGS.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Enumerations/MD_SEARCH_FLAGS.cs rename to sources/tools/Stride.FreeImage/Enumerations/MD_SEARCH_FLAGS.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/FreeImageStaticImports.cs b/sources/tools/Stride.FreeImage/FreeImageStaticImports.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/FreeImageStaticImports.cs rename to sources/tools/Stride.FreeImage/FreeImageStaticImports.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/FreeImageWrapper.cs b/sources/tools/Stride.FreeImage/FreeImageWrapper.cs similarity index 97% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/FreeImageWrapper.cs rename to sources/tools/Stride.FreeImage/FreeImageWrapper.cs index 9dbbc21a4a..1e33d9c856 100644 --- a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/FreeImageWrapper.cs +++ b/sources/tools/Stride.FreeImage/FreeImageWrapper.cs @@ -45,7 +45,6 @@ using FreeImageAPI.IO; using FreeImageAPI.Metadata; using Stride.Core; -using StridePixelFormat = Stride.Graphics.PixelFormat; namespace FreeImageAPI { @@ -2423,165 +2422,6 @@ public static bool GetFormatParameters( return result; } - /// - /// Retrieves all parameters needed to create a new FreeImage bitmap from the pixel format. - /// - /// The of the image. - /// Returns the type used for the new bitmap. - /// Returns the color depth for the new bitmap. - /// Returns the red_mask for the new bitmap. - /// Returns the green_mask for the new bitmap. - /// Returns the blue_mask for the new bitmap. - /// True in case a matching conversion exists; else false. - /// - public static bool GetFormatParameters( - StridePixelFormat format, - out FREE_IMAGE_TYPE type, - out uint bpp, - out uint redMask, - out uint greenMask, - out uint blueMask) - { - var result = true; - type = FREE_IMAGE_TYPE.FIT_UNKNOWN; - bpp = 0; - redMask = 0; - greenMask = 0; - blueMask = 0; - - switch (format) - { - case StridePixelFormat.R32G32B32A32_Float: - type = FREE_IMAGE_TYPE.FIT_RGBAF; - bpp = 128; - break; - case StridePixelFormat.R32G32B32_Float: - type = FREE_IMAGE_TYPE.FIT_RGBF; - bpp = 96; - break; - case StridePixelFormat.R16G16B16A16_Typeless: - case StridePixelFormat.R16G16B16A16_Float: - case StridePixelFormat.R16G16B16A16_UNorm: - case StridePixelFormat.R16G16B16A16_UInt: - case StridePixelFormat.R16G16B16A16_SNorm: - case StridePixelFormat.R16G16B16A16_SInt: - type = FREE_IMAGE_TYPE.FIT_RGBA16; - bpp = 64; - break; - case StridePixelFormat.D32_Float: - case StridePixelFormat.R32_Float: - type = FREE_IMAGE_TYPE.FIT_FLOAT; - bpp = 32; - break; - case StridePixelFormat.R32_SInt: - type = FREE_IMAGE_TYPE.FIT_INT32; - bpp = 32; - break; - case StridePixelFormat.R32_UInt: - type = FREE_IMAGE_TYPE.FIT_UINT32; - bpp = 32; - break; - case StridePixelFormat.R16_SInt: - type = FREE_IMAGE_TYPE.FIT_INT16; - bpp = 16; - break; - case StridePixelFormat.R16_UInt: - type = FREE_IMAGE_TYPE.FIT_UINT16; - bpp = 16; - break; - case StridePixelFormat.R32_Typeless: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 32; - break; - case StridePixelFormat.R8G8B8A8_Typeless: - case StridePixelFormat.R8G8B8A8_UNorm: - case StridePixelFormat.R8G8B8A8_UNorm_SRgb: - case StridePixelFormat.R8G8B8A8_UInt: - case StridePixelFormat.R8G8B8A8_SNorm: - case StridePixelFormat.R8G8B8A8_SInt: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 32; - redMask = FI_RGBA_RED_MASK; - greenMask = FI_RGBA_GREEN_MASK; - blueMask = FI_RGBA_BLUE_MASK; - break; - case StridePixelFormat.R16G16_Typeless: - case StridePixelFormat.R16G16_Float: - case StridePixelFormat.R16G16_UNorm: - case StridePixelFormat.R16G16_UInt: - case StridePixelFormat.R16G16_SNorm: - case StridePixelFormat.R16G16_SInt: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 32; - redMask = 0xFFFF0000; - greenMask = 0x0000FFFF; - break; - case StridePixelFormat.B8G8R8A8_Typeless: - case StridePixelFormat.B8G8R8A8_UNorm_SRgb: - case StridePixelFormat.B8G8R8X8_Typeless: - case StridePixelFormat.B8G8R8X8_UNorm_SRgb: - case StridePixelFormat.B8G8R8A8_UNorm: - case StridePixelFormat.B8G8R8X8_UNorm: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 32; - redMask = FI_RGBA_BLUE_MASK; - greenMask = FI_RGBA_GREEN_MASK; - blueMask = FI_RGBA_RED_MASK; - break; - - case StridePixelFormat.B5G6R5_UNorm: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 16; - redMask = FI16_565_RED_MASK; - greenMask = FI16_565_GREEN_MASK; - blueMask = FI16_565_BLUE_MASK; - break; - case StridePixelFormat.B5G5R5A1_UNorm: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 16; - redMask = FI16_555_RED_MASK; - greenMask = FI16_555_GREEN_MASK; - blueMask = FI16_555_BLUE_MASK; - break; - case StridePixelFormat.R16_Typeless: - case StridePixelFormat.R16_Float: - case StridePixelFormat.D16_UNorm: - case StridePixelFormat.R16_UNorm: - case StridePixelFormat.R16_SNorm: - type = FREE_IMAGE_TYPE.FIT_UINT16; - bpp = 16; - break; - case StridePixelFormat.R8G8_Typeless: - case StridePixelFormat.R8G8_UNorm: - case StridePixelFormat.R8G8_UInt: - case StridePixelFormat.R8G8_SNorm: - case StridePixelFormat.R8G8_SInt: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 16; - redMask = 0xFF00; - greenMask= 0x00FF; - break; - case StridePixelFormat.R8_Typeless: - case StridePixelFormat.R8_UNorm: - case StridePixelFormat.R8_UInt: - case StridePixelFormat.R8_SNorm: - case StridePixelFormat.R8_SInt: - case StridePixelFormat.A8_UNorm: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 8; - break; - case StridePixelFormat.R1_UNorm: - type = FREE_IMAGE_TYPE.FIT_BITMAP; - bpp = 1; - break; - default: - result = false; - break; - } - - return result; - } - /// /// Retrieves all parameters needed to create a new FreeImage bitmap from /// raw bits . diff --git a/sources/tools/Stride.FreeImage/Properties/AssemblyInfo.cs b/sources/tools/Stride.FreeImage/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..91be5f2cf4 --- /dev/null +++ b/sources/tools/Stride.FreeImage/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Runtime.CompilerServices; + +#pragma warning disable 436 // Stride.PublicKeys is defined in multiple assemblies + +[assembly: InternalsVisibleTo("Stride.TextureConverter")] diff --git a/sources/tools/Stride.FreeImage/Stride.FreeImage.csproj b/sources/tools/Stride.FreeImage/Stride.FreeImage.csproj new file mode 100644 index 0000000000..e44921d9bd --- /dev/null +++ b/sources/tools/Stride.FreeImage/Stride.FreeImage.csproj @@ -0,0 +1,20 @@ + + + + $(StrideXplatEditorTargetFramework) + enable + enable + + + + runtimes\%(RecursiveDir)native\%(Filename)%(Extension) + + + + + + + + + + diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/BITMAP.cs b/sources/tools/Stride.FreeImage/Structs/BITMAP.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/BITMAP.cs rename to sources/tools/Stride.FreeImage/Structs/BITMAP.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/BITMAPINFO.cs b/sources/tools/Stride.FreeImage/Structs/BITMAPINFO.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/BITMAPINFO.cs rename to sources/tools/Stride.FreeImage/Structs/BITMAPINFO.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/BITMAPINFOHEADER.cs b/sources/tools/Stride.FreeImage/Structs/BITMAPINFOHEADER.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/BITMAPINFOHEADER.cs rename to sources/tools/Stride.FreeImage/Structs/BITMAPINFOHEADER.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FI16RGB555.cs b/sources/tools/Stride.FreeImage/Structs/FI16RGB555.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FI16RGB555.cs rename to sources/tools/Stride.FreeImage/Structs/FI16RGB555.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FI16RGB565.cs b/sources/tools/Stride.FreeImage/Structs/FI16RGB565.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FI16RGB565.cs rename to sources/tools/Stride.FreeImage/Structs/FI16RGB565.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FI1BIT.cs b/sources/tools/Stride.FreeImage/Structs/FI1BIT.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FI1BIT.cs rename to sources/tools/Stride.FreeImage/Structs/FI1BIT.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FI4BIT.cs b/sources/tools/Stride.FreeImage/Structs/FI4BIT.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FI4BIT.cs rename to sources/tools/Stride.FreeImage/Structs/FI4BIT.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIBITMAP.cs b/sources/tools/Stride.FreeImage/Structs/FIBITMAP.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIBITMAP.cs rename to sources/tools/Stride.FreeImage/Structs/FIBITMAP.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FICOMPLEX.cs b/sources/tools/Stride.FreeImage/Structs/FICOMPLEX.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FICOMPLEX.cs rename to sources/tools/Stride.FreeImage/Structs/FICOMPLEX.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIICCPROFILE.cs b/sources/tools/Stride.FreeImage/Structs/FIICCPROFILE.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIICCPROFILE.cs rename to sources/tools/Stride.FreeImage/Structs/FIICCPROFILE.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIMEMORY.cs b/sources/tools/Stride.FreeImage/Structs/FIMEMORY.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIMEMORY.cs rename to sources/tools/Stride.FreeImage/Structs/FIMEMORY.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIMETADATA.cs b/sources/tools/Stride.FreeImage/Structs/FIMETADATA.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIMETADATA.cs rename to sources/tools/Stride.FreeImage/Structs/FIMETADATA.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIMULTIBITMAP.cs b/sources/tools/Stride.FreeImage/Structs/FIMULTIBITMAP.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIMULTIBITMAP.cs rename to sources/tools/Stride.FreeImage/Structs/FIMULTIBITMAP.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRGB16.cs b/sources/tools/Stride.FreeImage/Structs/FIRGB16.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRGB16.cs rename to sources/tools/Stride.FreeImage/Structs/FIRGB16.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRGBA16.cs b/sources/tools/Stride.FreeImage/Structs/FIRGBA16.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRGBA16.cs rename to sources/tools/Stride.FreeImage/Structs/FIRGBA16.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRGBAF.cs b/sources/tools/Stride.FreeImage/Structs/FIRGBAF.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRGBAF.cs rename to sources/tools/Stride.FreeImage/Structs/FIRGBAF.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRGBF.cs b/sources/tools/Stride.FreeImage/Structs/FIRGBF.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRGBF.cs rename to sources/tools/Stride.FreeImage/Structs/FIRGBF.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRational.cs b/sources/tools/Stride.FreeImage/Structs/FIRational.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIRational.cs rename to sources/tools/Stride.FreeImage/Structs/FIRational.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FITAG.cs b/sources/tools/Stride.FreeImage/Structs/FITAG.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FITAG.cs rename to sources/tools/Stride.FreeImage/Structs/FITAG.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIURational.cs b/sources/tools/Stride.FreeImage/Structs/FIURational.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FIURational.cs rename to sources/tools/Stride.FreeImage/Structs/FIURational.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FreeImageIO.cs b/sources/tools/Stride.FreeImage/Structs/FreeImageIO.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/FreeImageIO.cs rename to sources/tools/Stride.FreeImage/Structs/FreeImageIO.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/Plugin.cs b/sources/tools/Stride.FreeImage/Structs/Plugin.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/Plugin.cs rename to sources/tools/Stride.FreeImage/Structs/Plugin.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/RGBQUAD.cs b/sources/tools/Stride.FreeImage/Structs/RGBQUAD.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/RGBQUAD.cs rename to sources/tools/Stride.FreeImage/Structs/RGBQUAD.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/RGBTRIPLE.cs b/sources/tools/Stride.FreeImage/Structs/RGBTRIPLE.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/RGBTRIPLE.cs rename to sources/tools/Stride.FreeImage/Structs/RGBTRIPLE.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/fi_handle.cs b/sources/tools/Stride.FreeImage/Structs/fi_handle.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/Structs/fi_handle.cs rename to sources/tools/Stride.FreeImage/Structs/fi_handle.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/System.Drawing/ImageFlags.cs b/sources/tools/Stride.FreeImage/System.Drawing/ImageFlags.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/System.Drawing/ImageFlags.cs rename to sources/tools/Stride.FreeImage/System.Drawing/ImageFlags.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/System.Drawing/PixelFormat.cs b/sources/tools/Stride.FreeImage/System.Drawing/PixelFormat.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/System.Drawing/PixelFormat.cs rename to sources/tools/Stride.FreeImage/System.Drawing/PixelFormat.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/System.Drawing/PropertyItem.cs b/sources/tools/Stride.FreeImage/System.Drawing/PropertyItem.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/System.Drawing/PropertyItem.cs rename to sources/tools/Stride.FreeImage/System.Drawing/PropertyItem.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/System.Drawing/RotateFlipType.cs b/sources/tools/Stride.FreeImage/System.Drawing/RotateFlipType.cs similarity index 100% rename from sources/tools/Stride.TextureConverter/Backend/Wrappers/FINetWrapper/System.Drawing/RotateFlipType.cs rename to sources/tools/Stride.FreeImage/System.Drawing/RotateFlipType.cs diff --git a/sources/tools/Stride.TextureConverter/Backend/TexLibraries/FITexLib.cs b/sources/tools/Stride.TextureConverter/Backend/TexLibraries/FITexLib.cs index 6fe0e8985e..917d4a1470 100644 --- a/sources/tools/Stride.TextureConverter/Backend/TexLibraries/FITexLib.cs +++ b/sources/tools/Stride.TextureConverter/Backend/TexLibraries/FITexLib.cs @@ -10,8 +10,7 @@ using Stride.Graphics; using Stride.TextureConverter.Requests; using FreeImageAPI; -using FreeImageAPI.Plugins; -using System.Runtime.CompilerServices; +using StridePixelFormat = Stride.Graphics.PixelFormat; namespace Stride.TextureConverter.TexLibraries { @@ -69,7 +68,7 @@ public void StartLibrary(TexImage image) FREE_IMAGE_TYPE type; uint bpp, redMask, greenMask, blueMask; - if (!FreeImage.GetFormatParameters(image.Format, out type, out bpp, out redMask, out greenMask, out blueMask)) + if (!GetFormatParameters(image.Format, out type, out bpp, out redMask, out greenMask, out blueMask)) { throw new ArgumentException("The pixel format '{0}' is not supported by FreeImage".ToFormat(image.Format)); } @@ -611,6 +610,165 @@ private static int GetAlphaDepth(FREE_IMAGE_FORMAT fileFormat, FIBITMAP bitmap) } return 0; } - + + + /// + /// Retrieves all parameters needed to create a new FreeImage bitmap from the pixel format. + /// + /// The of the image. + /// Returns the type used for the new bitmap. + /// Returns the color depth for the new bitmap. + /// Returns the red_mask for the new bitmap. + /// Returns the green_mask for the new bitmap. + /// Returns the blue_mask for the new bitmap. + /// True in case a matching conversion exists; else false. + /// + private static bool GetFormatParameters( + StridePixelFormat format, + out FREE_IMAGE_TYPE type, + out uint bpp, + out uint redMask, + out uint greenMask, + out uint blueMask) + { + var result = true; + type = FREE_IMAGE_TYPE.FIT_UNKNOWN; + bpp = 0; + redMask = 0; + greenMask = 0; + blueMask = 0; + + switch (format) + { + case StridePixelFormat.R32G32B32A32_Float: + type = FREE_IMAGE_TYPE.FIT_RGBAF; + bpp = 128; + break; + case StridePixelFormat.R32G32B32_Float: + type = FREE_IMAGE_TYPE.FIT_RGBF; + bpp = 96; + break; + case StridePixelFormat.R16G16B16A16_Typeless: + case StridePixelFormat.R16G16B16A16_Float: + case StridePixelFormat.R16G16B16A16_UNorm: + case StridePixelFormat.R16G16B16A16_UInt: + case StridePixelFormat.R16G16B16A16_SNorm: + case StridePixelFormat.R16G16B16A16_SInt: + type = FREE_IMAGE_TYPE.FIT_RGBA16; + bpp = 64; + break; + case StridePixelFormat.D32_Float: + case StridePixelFormat.R32_Float: + type = FREE_IMAGE_TYPE.FIT_FLOAT; + bpp = 32; + break; + case StridePixelFormat.R32_SInt: + type = FREE_IMAGE_TYPE.FIT_INT32; + bpp = 32; + break; + case StridePixelFormat.R32_UInt: + type = FREE_IMAGE_TYPE.FIT_UINT32; + bpp = 32; + break; + case StridePixelFormat.R16_SInt: + type = FREE_IMAGE_TYPE.FIT_INT16; + bpp = 16; + break; + case StridePixelFormat.R16_UInt: + type = FREE_IMAGE_TYPE.FIT_UINT16; + bpp = 16; + break; + case StridePixelFormat.R32_Typeless: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 32; + break; + case StridePixelFormat.R8G8B8A8_Typeless: + case StridePixelFormat.R8G8B8A8_UNorm: + case StridePixelFormat.R8G8B8A8_UNorm_SRgb: + case StridePixelFormat.R8G8B8A8_UInt: + case StridePixelFormat.R8G8B8A8_SNorm: + case StridePixelFormat.R8G8B8A8_SInt: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 32; + redMask = FreeImage.FI_RGBA_RED_MASK; + greenMask = FreeImage.FI_RGBA_GREEN_MASK; + blueMask = FreeImage.FI_RGBA_BLUE_MASK; + break; + case StridePixelFormat.R16G16_Typeless: + case StridePixelFormat.R16G16_Float: + case StridePixelFormat.R16G16_UNorm: + case StridePixelFormat.R16G16_UInt: + case StridePixelFormat.R16G16_SNorm: + case StridePixelFormat.R16G16_SInt: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 32; + redMask = 0xFFFF0000; + greenMask = 0x0000FFFF; + break; + case StridePixelFormat.B8G8R8A8_Typeless: + case StridePixelFormat.B8G8R8A8_UNorm_SRgb: + case StridePixelFormat.B8G8R8X8_Typeless: + case StridePixelFormat.B8G8R8X8_UNorm_SRgb: + case StridePixelFormat.B8G8R8A8_UNorm: + case StridePixelFormat.B8G8R8X8_UNorm: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 32; + redMask = FreeImage.FI_RGBA_BLUE_MASK; + greenMask = FreeImage.FI_RGBA_GREEN_MASK; + blueMask = FreeImage.FI_RGBA_RED_MASK; + break; + + case StridePixelFormat.B5G6R5_UNorm: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 16; + redMask = FreeImage.FI16_565_RED_MASK; + greenMask = FreeImage.FI16_565_GREEN_MASK; + blueMask = FreeImage.FI16_565_BLUE_MASK; + break; + case StridePixelFormat.B5G5R5A1_UNorm: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 16; + redMask = FreeImage.FI16_555_RED_MASK; + greenMask = FreeImage.FI16_555_GREEN_MASK; + blueMask = FreeImage.FI16_555_BLUE_MASK; + break; + case StridePixelFormat.R16_Typeless: + case StridePixelFormat.R16_Float: + case StridePixelFormat.D16_UNorm: + case StridePixelFormat.R16_UNorm: + case StridePixelFormat.R16_SNorm: + type = FREE_IMAGE_TYPE.FIT_UINT16; + bpp = 16; + break; + case StridePixelFormat.R8G8_Typeless: + case StridePixelFormat.R8G8_UNorm: + case StridePixelFormat.R8G8_UInt: + case StridePixelFormat.R8G8_SNorm: + case StridePixelFormat.R8G8_SInt: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 16; + redMask = 0xFF00; + greenMask= 0x00FF; + break; + case StridePixelFormat.R8_Typeless: + case StridePixelFormat.R8_UNorm: + case StridePixelFormat.R8_UInt: + case StridePixelFormat.R8_SNorm: + case StridePixelFormat.R8_SInt: + case StridePixelFormat.A8_UNorm: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 8; + break; + case StridePixelFormat.R1_UNorm: + type = FREE_IMAGE_TYPE.FIT_BITMAP; + bpp = 1; + break; + default: + result = false; + break; + } + + return result; + } } } diff --git a/sources/tools/Stride.TextureConverter/Stride.TextureConverter.csproj b/sources/tools/Stride.TextureConverter/Stride.TextureConverter.csproj index f04c66df33..bed695302c 100644 --- a/sources/tools/Stride.TextureConverter/Stride.TextureConverter.csproj +++ b/sources/tools/Stride.TextureConverter/Stride.TextureConverter.csproj @@ -13,9 +13,6 @@ - - runtimes\%(RecursiveDir)native\%(Filename)%(Extension) - runtimes\%(RecursiveDir)native\%(Filename)%(Extension) @@ -25,6 +22,7 @@ + \ No newline at end of file