Skip to content

Commit

Permalink
Use image sharp (#33)
Browse files Browse the repository at this point in the history
* use imagesharp for palette

* update to nunit 4.0
  • Loading branch information
LeftofZen authored Feb 14, 2024
1 parent 8534d01 commit 0933d6c
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 28 deletions.
1 change: 1 addition & 0 deletions Gui/Gui.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@

<ItemGroup>
<PackageReference Include="NAudio" Version="2.2.1" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.2" />
</ItemGroup>

<ItemGroup>
Expand Down
17 changes: 12 additions & 5 deletions Gui/MainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
using Core.Objects.Sound;
using Zenith.Core;
using System.Text;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Formats;

namespace OpenLoco.ObjectEditor.Gui
{
Expand Down Expand Up @@ -90,8 +92,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<Rgb24>(stream!);
var palette = PaletteHelpers.PaletteFromBitmapIS(paletteBitmap);
model = new MainFormModel(logger, SettingsFile, palette);
}

Expand Down Expand Up @@ -1010,7 +1016,7 @@ IEnumerable<Control> CreateImageControls(IEnumerable<Bitmap> images)
}
}

static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, Color[] palette, bool useTransparency = false, ILogger? logger = null)
static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, SixLabors.ImageSharp.Color[] palette, bool useTransparency = false, ILogger? logger = null)
{
if (palette is null)
{
Expand Down Expand Up @@ -1057,7 +1063,7 @@ static IEnumerable<Bitmap> CreateImages(List<G1Element32> 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);
Expand All @@ -1082,7 +1088,8 @@ static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, Color[] pa
// //Debugger.Break();
//}
var colour = palette[paletteIndex];
ImageHelpers.SetPixel(dstImgData, x, y, colour);
var pixel = colour.ToPixel<Rgb24>();
ImageHelpers.SetPixel(dstImgData, x, y, Color.FromArgb(pixel.R, pixel.G, pixel.B));
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions Gui/MainFormModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

Expand All @@ -74,7 +74,7 @@ class MainFormModel

public List<string> 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;
Expand Down
34 changes: 25 additions & 9 deletions Gui/PaletteHelpers.cs
Original file line number Diff line number Diff line change
@@ -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<Rgb24> 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;
}

Expand Down
14 changes: 7 additions & 7 deletions Tests/LoadSaveTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void LoadSaveGenericTest<T>(string objectName, Action<ILocoObject, T> 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()));
});
}

Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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<HillShapesObject>(objectName, assertFunc);
}
Expand Down Expand Up @@ -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<RegionObject>(objectName, assertFunc);
}
Expand Down Expand Up @@ -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));
Expand Down
16 changes: 11 additions & 5 deletions Tests/Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,17 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="NUnit" Version="4.0.1" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageReference Include="NUnit.Analyzers" Version="4.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
Expand Down

0 comments on commit 0933d6c

Please sign in to comment.