Skip to content

Commit 0933d6c

Browse files
authored
Use image sharp (#33)
* use imagesharp for palette * update to nunit 4.0
1 parent 8534d01 commit 0933d6c

File tree

6 files changed

+58
-28
lines changed

6 files changed

+58
-28
lines changed

Gui/Gui.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
<ItemGroup>
4343
<PackageReference Include="NAudio" Version="2.2.1" />
44+
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.2" />
4445
</ItemGroup>
4546

4647
<ItemGroup>

Gui/MainForm.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
using Core.Objects.Sound;
1212
using Zenith.Core;
1313
using System.Text;
14+
using SixLabors.ImageSharp.PixelFormats;
15+
using SixLabors.ImageSharp.Formats;
1416

1517
namespace OpenLoco.ObjectEditor.Gui
1618
{
@@ -90,8 +92,12 @@ public MainForm()
9092
var paletteFilename = "Gui.palette.png";
9193
using (var stream = assembly.GetManifestResourceStream(paletteFilename))
9294
{
93-
var paletteBitmap = (Bitmap)Image.FromStream(stream!);
94-
var palette = PaletteHelpers.PaletteFromBitmap(paletteBitmap);
95+
//var paletteBitmap = (Bitmap)Image.FromStream(stream!);
96+
//var palette = PaletteHelpers.PaletteFromBitmap(paletteBitmap);
97+
//model = new MainFormModel(logger, SettingsFile, palette);
98+
99+
var paletteBitmap = SixLabors.ImageSharp.Image.Load<Rgb24>(stream!);
100+
var palette = PaletteHelpers.PaletteFromBitmapIS(paletteBitmap);
95101
model = new MainFormModel(logger, SettingsFile, palette);
96102
}
97103

@@ -1010,7 +1016,7 @@ IEnumerable<Control> CreateImageControls(IEnumerable<Bitmap> images)
10101016
}
10111017
}
10121018

1013-
static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, Color[] palette, bool useTransparency = false, ILogger? logger = null)
1019+
static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, SixLabors.ImageSharp.Color[] palette, bool useTransparency = false, ILogger? logger = null)
10141020
{
10151021
if (palette is null)
10161022
{
@@ -1057,7 +1063,7 @@ static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, Color[] pa
10571063
}
10581064
}
10591065

1060-
static Bitmap? G1ElementToBitmap(G1Element32 currElement, Color[] palette, bool useTransparency = false)
1066+
static Bitmap? G1ElementToBitmap(G1Element32 currElement, SixLabors.ImageSharp.Color[] palette, bool useTransparency = false)
10611067
{
10621068
var imageData = currElement.ImageData;
10631069
var dstImg = new Bitmap(currElement.Width, currElement.Height);
@@ -1082,7 +1088,8 @@ static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, Color[] pa
10821088
// //Debugger.Break();
10831089
//}
10841090
var colour = palette[paletteIndex];
1085-
ImageHelpers.SetPixel(dstImgData, x, y, colour);
1091+
var pixel = colour.ToPixel<Rgb24>();
1092+
ImageHelpers.SetPixel(dstImgData, x, y, Color.FromArgb(pixel.R, pixel.G, pixel.B));
10861093
}
10871094
}
10881095
}

Gui/MainFormModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class MainFormModel
6060
// //}
6161
//}
6262

63-
public Color[] Palette { get; private set; }
63+
public SixLabors.ImageSharp.Color[] Palette { get; private set; }
6464

6565
public G1Dat? G1 { get; set; }
6666

@@ -74,7 +74,7 @@ class MainFormModel
7474

7575
public List<string> MiscFiles { get; set; } = [];
7676

77-
public MainFormModel(ILogger logger, string settingsFile, Color[] palette)
77+
public MainFormModel(ILogger logger, string settingsFile, SixLabors.ImageSharp.Color[] palette)
7878
{
7979
this.logger = logger;
8080
Palette = palette;

Gui/PaletteHelpers.cs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,39 @@
1-
using System.Drawing.Imaging;
1+
using SixLabors.ImageSharp;
2+
using SixLabors.ImageSharp.PixelFormats;
23

34
namespace OpenLoco.ObjectEditor.Gui
45
{
56
public static class PaletteHelpers
67
{
7-
public static Color[] PaletteFromBitmap(Bitmap img)
8+
//public static System.Drawing.Color[] PaletteFromBitmap(Bitmap img)
9+
//{
10+
// var palette = new System.Drawing.Color[256];
11+
// var rect = new System.Drawing.Rectangle(0, 0, img.Width, img.Height);
12+
// var imgData = img.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
13+
// for (var y = 0; y < img.Width; ++y)
14+
// {
15+
// for (var x = 0; x < img.Height; ++x)
16+
// {
17+
// palette[(y * img.Height) + x] = ImageHelpers.GetPixel(imgData, x, y);
18+
// }
19+
// }
20+
21+
// img.UnlockBits(imgData);
22+
// return palette;
23+
//}
24+
25+
public static SixLabors.ImageSharp.Color[] PaletteFromBitmapIS(Image<Rgb24> img)
826
{
9-
var palette = new Color[256];
10-
var rect = new Rectangle(0, 0, img.Width, img.Height);
11-
var imgData = img.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
12-
for (var y = 0; y < img.Width; ++y)
27+
var palette = new SixLabors.ImageSharp.Color[256];
28+
29+
for (var y = 0; y < img.Height; ++y)
1330
{
14-
for (var x = 0; x < img.Height; ++x)
31+
for (var x = 0; x < img.Width; ++x)
1532
{
16-
palette[(y * img.Height) + x] = ImageHelpers.GetPixel(imgData, x, y);
33+
palette[(y * img.Height) + x] = img[x, y];
1734
}
1835
}
1936

20-
img.UnlockBits(imgData);
2137
return palette;
2238
}
2339

Tests/LoadSaveTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void LoadSaveGenericTest<T>(string objectName, Action<ILocoObject, T> ass
7373
{
7474
Assert.That(bytes2S5Header, Is.EqualTo(bytes1S5Header));
7575
Assert.That(bytes2ObjHeader, Is.EqualTo(bytes1ObjHeader));
76-
CollectionAssert.AreEqual(bytes1ObjArr.ToArray(), bytes2ObjArr.ToArray());
76+
Assert.That(bytes1ObjArr.ToArray(), Is.EquivalentTo(bytes2ObjArr.ToArray()));
7777
});
7878
}
7979

@@ -250,7 +250,7 @@ void assertFunc(ILocoObject obj, CompetitorObject struc) => Assert.Multiple(() =
250250
Assert.That(struc.var_04, Is.EqualTo(6672), nameof(struc.var_04));
251251
Assert.That(struc.var_08, Is.EqualTo(2053), nameof(struc.var_08));
252252
Assert.That(struc.Emotions, Is.EqualTo(255), nameof(struc.Emotions));
253-
CollectionAssert.AreEqual(struc.Images, Array.CreateInstance(typeof(byte), 9), nameof(struc.Images));
253+
Assert.That(struc.Images, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 9)), nameof(struc.Images));
254254
Assert.That(struc.Intelligence, Is.EqualTo(7), nameof(struc.Intelligence));
255255
Assert.That(struc.Aggressiveness, Is.EqualTo(5), nameof(struc.Aggressiveness));
256256
Assert.That(struc.Competitiveness, Is.EqualTo(6), nameof(struc.Competitiveness));
@@ -304,7 +304,7 @@ void assertFunc(ILocoObject obj, HillShapesObject struc) => Assert.Multiple(() =
304304
Assert.That(struc.HillHeightMapCount, Is.EqualTo(2), nameof(struc.HillHeightMapCount));
305305
Assert.That(struc.MountainHeightMapCount, Is.EqualTo(2), nameof(struc.MountainHeightMapCount));
306306
//Assert.That(struc.var_08, Is.EqualTo(0), nameof(struc.var_08));
307-
CollectionAssert.AreEqual(struc.pad_0C, Array.CreateInstance(typeof(byte), 2), nameof(struc.pad_0C));
307+
Assert.That(struc.pad_0C, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 2)), nameof(struc.pad_0C));
308308
});
309309
LoadSaveGenericTest<HillShapesObject>(objectName, assertFunc);
310310
}
@@ -433,10 +433,10 @@ public void RegionObject(string objectName)
433433
{
434434
void assertFunc(ILocoObject obj, RegionObject struc) => Assert.Multiple(() =>
435435
{
436-
CollectionAssert.AreEqual(struc.pad_06, Array.CreateInstance(typeof(byte), 2), nameof(struc.pad_06));
436+
Assert.That(struc.pad_06, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 2)), nameof(struc.pad_06));
437437
Assert.That(struc.RequiredObjectCount, Is.EqualTo(1), nameof(struc.RequiredObjectCount));
438438
//CollectionAssert.AreEqual(struc.requiredObjects, Array.CreateInstance(typeof(byte), 4), nameof(struc.requiredObjects));
439-
CollectionAssert.AreEqual(struc.pad_0D, Array.CreateInstance(typeof(byte), 5), nameof(struc.pad_0D));
439+
Assert.That(struc.pad_0D, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 5)), nameof(struc.pad_0D));
440440
});
441441
LoadSaveGenericTest<RegionObject>(objectName, assertFunc);
442442
}
@@ -759,8 +759,8 @@ void assertFunc(ILocoObject obj, TreeObject struc) => Assert.Multiple(() =>
759759
Assert.That(struc.NumRotations, Is.EqualTo(1), nameof(struc.NumRotations));
760760
Assert.That(struc.Growth, Is.EqualTo(4), nameof(struc.Growth));
761761
Assert.That(struc.Flags, Is.EqualTo(TreeObjectFlags.HighAltitude | TreeObjectFlags.RequiresWater | TreeObjectFlags.HasShadow), nameof(struc.Flags));
762-
CollectionAssert.AreEqual(struc.Sprites, Array.CreateInstance(typeof(byte), 6), nameof(struc.Sprites));
763-
CollectionAssert.AreEqual(struc.SnowSprites, Array.CreateInstance(typeof(byte), 6), nameof(struc.SnowSprites));
762+
Assert.That(struc.Sprites, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 6)), nameof(struc.Sprites));
763+
Assert.That(struc.SnowSprites, Is.EquivalentTo(Array.CreateInstance(typeof(byte), 6)), nameof(struc.SnowSprites));
764764
Assert.That(struc.ShadowImageOffset, Is.EqualTo(0), nameof(struc.ShadowImageOffset));
765765
Assert.That(struc.var_3C, Is.EqualTo(15), nameof(struc.var_3C));
766766
Assert.That(struc.SeasonState, Is.EqualTo(3), nameof(struc.SeasonState));

Tests/Tests.csproj

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,17 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
14-
<PackageReference Include="NUnit" Version="3.13.3" />
15-
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
16-
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
17-
<PackageReference Include="coverlet.collector" Version="3.2.0" />
13+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
14+
<PackageReference Include="NUnit" Version="4.0.1" />
15+
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
16+
<PackageReference Include="NUnit.Analyzers" Version="4.0.1">
17+
<PrivateAssets>all</PrivateAssets>
18+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
19+
</PackageReference>
20+
<PackageReference Include="coverlet.collector" Version="6.0.0">
21+
<PrivateAssets>all</PrivateAssets>
22+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
23+
</PackageReference>
1824
</ItemGroup>
1925

2026
<ItemGroup>

0 commit comments

Comments
 (0)