diff --git a/Core/Objects/WallObject.cs b/Core/Objects/WallObject.cs index e501da44..526b4f59 100644 --- a/Core/Objects/WallObject.cs +++ b/Core/Objects/WallObject.cs @@ -26,7 +26,7 @@ public enum WallObjectFlags2 : uint8_t NoSelectPrimaryColour = 1 << 0, DoorSoundMask = 1 << 1, // unused? only for rct2? DoorSoundShift = 1 << 2, // unused? only for rct2? - IsOpaque = 1 << 3, // unused? only for rct2? + Opaque = 1 << 3, // unused? only for rct2? Animated = 1 << 4, // unused? only for rct2? }; diff --git a/Gui/Gui.csproj b/Gui/Gui.csproj index 122c6c17..88e5b953 100644 --- a/Gui/Gui.csproj +++ b/Gui/Gui.csproj @@ -40,6 +40,7 @@ + diff --git a/Gui/MainForm.cs b/Gui/MainForm.cs index 4cbc34d4..41a6709b 100644 --- a/Gui/MainForm.cs +++ b/Gui/MainForm.cs @@ -1,6 +1,5 @@ using NAudio.Gui; using NAudio.Wave; -using OpenLoco.ObjectEditor; using OpenLoco.ObjectEditor.DatFileParsing; using OpenLoco.ObjectEditor.Headers; using OpenLoco.ObjectEditor.Objects; @@ -13,6 +12,8 @@ using Core.Objects.Sound; using Zenith.Core; using System.Text; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Formats; namespace OpenLoco.ObjectEditor.Gui { @@ -92,8 +93,12 @@ public MainForm() var paletteFilename = "Gui.palette.png"; using (var stream = assembly.GetManifestResourceStream(paletteFilename)) { - var paletteBitmap = (Bitmap)Image.FromStream(stream!); - var palette = PaletteHelpers.PaletteFromBitmap(paletteBitmap); + //var paletteBitmap = (Bitmap)Image.FromStream(stream!); + //var palette = PaletteHelpers.PaletteFromBitmap(paletteBitmap); + //model = new MainFormModel(logger, SettingsFile, palette); + + var paletteBitmap = SixLabors.ImageSharp.Image.Load(stream!); + var palette = PaletteHelpers.PaletteFromBitmapIS(paletteBitmap); model = new MainFormModel(logger, SettingsFile, palette); } @@ -1004,7 +1009,7 @@ IEnumerable CreateImageControls(IEnumerable images) } } - static IEnumerable CreateImages(List G1Elements, Color[] palette, bool useTransparency = false, ILogger? logger = null) + static IEnumerable CreateImages(List G1Elements, SixLabors.ImageSharp.Color[] palette, bool useTransparency = false, ILogger? logger = null) { if (palette is null) { @@ -1051,7 +1056,7 @@ static IEnumerable CreateImages(List G1Elements, Color[] pa } } - static Bitmap? G1ElementToBitmap(G1Element32 currElement, Color[] palette, bool useTransparency = false) + static Bitmap? G1ElementToBitmap(G1Element32 currElement, SixLabors.ImageSharp.Color[] palette, bool useTransparency = false) { var imageData = currElement.ImageData; var dstImg = new Bitmap(currElement.Width, currElement.Height); @@ -1075,7 +1080,8 @@ static IEnumerable CreateImages(List G1Elements, Color[] pa else { var colour = palette[paletteIndex]; - ImageHelpers.SetPixel(dstImgData, x, y, colour); + var pixel = colour.ToPixel(); + ImageHelpers.SetPixel(dstImgData, x, y, Color.FromArgb(pixel.R, pixel.G, pixel.B)); } } } diff --git a/Gui/MainFormModel.cs b/Gui/MainFormModel.cs index 5dc76a56..0c76c6f7 100644 --- a/Gui/MainFormModel.cs +++ b/Gui/MainFormModel.cs @@ -60,7 +60,7 @@ class MainFormModel // //} //} - public Color[] Palette { get; private set; } + public SixLabors.ImageSharp.Color[] Palette { get; private set; } public G1Dat? G1 { get; set; } @@ -74,7 +74,7 @@ class MainFormModel public List MiscFiles { get; set; } = []; - public MainFormModel(ILogger logger, string settingsFile, Color[] palette) + public MainFormModel(ILogger logger, string settingsFile, SixLabors.ImageSharp.Color[] palette) { this.logger = logger; Palette = palette; diff --git a/Gui/PaletteHelpers.cs b/Gui/PaletteHelpers.cs index e26ef335..2e25a8f7 100644 --- a/Gui/PaletteHelpers.cs +++ b/Gui/PaletteHelpers.cs @@ -1,23 +1,39 @@ -using System.Drawing.Imaging; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; namespace OpenLoco.ObjectEditor.Gui { public static class PaletteHelpers { - public static Color[] PaletteFromBitmap(Bitmap img) + //public static System.Drawing.Color[] PaletteFromBitmap(Bitmap img) + //{ + // var palette = new System.Drawing.Color[256]; + // var rect = new System.Drawing.Rectangle(0, 0, img.Width, img.Height); + // var imgData = img.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + // for (var y = 0; y < img.Width; ++y) + // { + // for (var x = 0; x < img.Height; ++x) + // { + // palette[(y * img.Height) + x] = ImageHelpers.GetPixel(imgData, x, y); + // } + // } + + // img.UnlockBits(imgData); + // return palette; + //} + + public static SixLabors.ImageSharp.Color[] PaletteFromBitmapIS(Image img) { - var palette = new Color[256]; - var rect = new Rectangle(0, 0, img.Width, img.Height); - var imgData = img.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - for (var y = 0; y < img.Width; ++y) + var palette = new SixLabors.ImageSharp.Color[256]; + + for (var y = 0; y < img.Height; ++y) { - for (var x = 0; x < img.Height; ++x) + for (var x = 0; x < img.Width; ++x) { - palette[(y * img.Height) + x] = ImageHelpers.GetPixel(imgData, x, y); + palette[(y * img.Height) + x] = img[x, y]; } } - img.UnlockBits(imgData); return palette; } diff --git a/Tests/LoadSaveTests.cs b/Tests/LoadSaveTests.cs index 778cf10b..a2561dcd 100644 --- a/Tests/LoadSaveTests.cs +++ b/Tests/LoadSaveTests.cs @@ -73,7 +73,7 @@ public void LoadSaveGenericTest(string objectName, Action ass { Assert.That(bytes2S5Header, Is.EqualTo(bytes1S5Header)); Assert.That(bytes2ObjHeader, Is.EqualTo(bytes1ObjHeader)); - CollectionAssert.AreEqual(bytes1ObjArr.ToArray(), bytes2ObjArr.ToArray()); + Assert.That(bytes1ObjArr.ToArray(), Is.EquivalentTo(bytes2ObjArr.ToArray())); }); } @@ -250,7 +250,7 @@ void assertFunc(ILocoObject obj, CompetitorObject struc) => Assert.Multiple(() = Assert.That(struc.var_04, Is.EqualTo(6672), nameof(struc.var_04)); Assert.That(struc.var_08, Is.EqualTo(2053), nameof(struc.var_08)); Assert.That(struc.Emotions, Is.EqualTo(255), nameof(struc.Emotions)); - CollectionAssert.AreEqual(struc.Images, Array.CreateInstance(typeof(byte), 9), nameof(struc.Images)); + Assert.That(struc.Images, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 9)), nameof(struc.Images)); Assert.That(struc.Intelligence, Is.EqualTo(7), nameof(struc.Intelligence)); Assert.That(struc.Aggressiveness, Is.EqualTo(5), nameof(struc.Aggressiveness)); Assert.That(struc.Competitiveness, Is.EqualTo(6), nameof(struc.Competitiveness)); @@ -304,7 +304,7 @@ void assertFunc(ILocoObject obj, HillShapesObject struc) => Assert.Multiple(() = Assert.That(struc.HillHeightMapCount, Is.EqualTo(2), nameof(struc.HillHeightMapCount)); Assert.That(struc.MountainHeightMapCount, Is.EqualTo(2), nameof(struc.MountainHeightMapCount)); //Assert.That(struc.var_08, Is.EqualTo(0), nameof(struc.var_08)); - CollectionAssert.AreEqual(struc.pad_0C, Array.CreateInstance(typeof(byte), 2), nameof(struc.pad_0C)); + Assert.That(struc.pad_0C, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 2)), nameof(struc.pad_0C)); }); LoadSaveGenericTest(objectName, assertFunc); } @@ -433,10 +433,10 @@ public void RegionObject(string objectName) { void assertFunc(ILocoObject obj, RegionObject struc) => Assert.Multiple(() => { - CollectionAssert.AreEqual(struc.pad_06, Array.CreateInstance(typeof(byte), 2), nameof(struc.pad_06)); + Assert.That(struc.pad_06, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 2)), nameof(struc.pad_06)); Assert.That(struc.RequiredObjectCount, Is.EqualTo(1), nameof(struc.RequiredObjectCount)); //CollectionAssert.AreEqual(struc.requiredObjects, Array.CreateInstance(typeof(byte), 4), nameof(struc.requiredObjects)); - CollectionAssert.AreEqual(struc.pad_0D, Array.CreateInstance(typeof(byte), 5), nameof(struc.pad_0D)); + Assert.That(struc.pad_0D, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 5)), nameof(struc.pad_0D)); }); LoadSaveGenericTest(objectName, assertFunc); } @@ -759,8 +759,8 @@ void assertFunc(ILocoObject obj, TreeObject struc) => Assert.Multiple(() => Assert.That(struc.NumRotations, Is.EqualTo(1), nameof(struc.NumRotations)); Assert.That(struc.Growth, Is.EqualTo(4), nameof(struc.Growth)); Assert.That(struc.Flags, Is.EqualTo(TreeObjectFlags.HighAltitude | TreeObjectFlags.RequiresWater | TreeObjectFlags.HasShadow), nameof(struc.Flags)); - CollectionAssert.AreEqual(struc.Sprites, Array.CreateInstance(typeof(byte), 6), nameof(struc.Sprites)); - CollectionAssert.AreEqual(struc.SnowSprites, Array.CreateInstance(typeof(byte), 6), nameof(struc.SnowSprites)); + Assert.That(struc.Sprites, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 6)), nameof(struc.Sprites)); + Assert.That(struc.SnowSprites, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 6)), nameof(struc.SnowSprites)); Assert.That(struc.ShadowImageOffset, Is.EqualTo(0), nameof(struc.ShadowImageOffset)); Assert.That(struc.var_3C, Is.EqualTo(15), nameof(struc.var_3C)); Assert.That(struc.SeasonState, Is.EqualTo(3), nameof(struc.SeasonState)); @@ -862,10 +862,10 @@ public void WallObject(string objectName) { void assertFunc(ILocoObject obj, WallObject struc) => Assert.Multiple(() => { - Assert.That(struc.var_06, Is.EqualTo(15), nameof(struc.var_06)); + Assert.That(struc.ToolId, Is.EqualTo(15), nameof(struc.ToolId)); Assert.That(struc.Flags, Is.EqualTo(WallObjectFlags.None), nameof(struc.Flags)); Assert.That(struc.Height, Is.EqualTo(2), nameof(struc.Height)); - Assert.That(struc.var_09, Is.EqualTo(8), nameof(struc.var_09)); + Assert.That(struc.Flags2, Is.EqualTo(WallObjectFlags2.Opaque), nameof(struc.Flags2)); }); LoadSaveGenericTest(objectName, assertFunc); } diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 7da61d6b..f985db80 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -10,11 +10,17 @@ - - - - - + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive +