diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4e597a0e..dddde4e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## 19/12/2024 - v5.0.1
+
+- (Fix) Windows MSI: System.IO.Compression.Native is missing when upgrading from 4.4.3 (#957)
+- (Fix) Index out of range when saving some file formats (#957)
+- (Change) Exposure time finder: Allow using 0 for the normal step in the multiple exposure generator (#958)
+
## 18/12/2024 - v5.0.0
- **File formats:**
diff --git a/Directory.Build.props b/Directory.Build.props
index 501e5112..39080b48 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -37,13 +37,14 @@
true
- 5.0.0
+ 5.0.1
11.2.2
false
+
true
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 9359112b..8ec4bd89 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,26 +1,3 @@
-- **File formats:**
- - (Add) Anycubic PWSZ Zip file format (#892)
- - (Add) Support for Anycubic Photon Mono 4 (pm4n) and corresponding PrusaSlicer profile
- - (Add) Support for Anycubic Photon Mono 4 Ultra (pm4u) and corresponding PrusaSlicer profile
- - (Add) Support for Anycubic Photon Mono M7 (pm7) and corresponding PrusaSlicer profile
- - (Add) Support for Anycubic Photon Mono M7 Max (pm7m) and corresponding PrusaSlicer profile
- - (Add) Support for Anycubic Photon Mono M7 Pro (pwsz) and corresponding PrusaSlicer profile
-- (Add) PrusaSlicer printer: Phrozen Sonic Mighty Revo (#950)
-- (Add) Litophane tool: Option to enable or disable the separation of grayscale pixels (#954)
-- (Add) Exposure time finder: Re-arrange exposure text layout and allow to change it font (#955)
-- (Add) Setting: Available RAM lower limit - Sets a lower limiter for the available memory RAM the program is allowed to run operations.
- When meet the threshold, a stopping action will be queued to relief pressure and maintain the system stability.
- In cases where is unable to pause or cancel the operation, the program will be forced to close and trigger an exception to ensure the system stability.
- Note: This limiter will check the RAM every 2 seconds while operations are running, if you have set a very low limit there is a chance to consume more RAM in the time and cause system instability.
- System can also reserve some RAM to prevent depletion and start to use SWAP memory, doing such with a low limit and is possible that the limiter never trigger.
- 0: Ignore the RAM limiter.
- Default: 1 GB
-- (Improvement) Change the gif animation library to a more efficient and compatible one
-- (Fix) Contour traverse function was duplicating the contours, causing wrong calculations
-- (Fix) Blur: Prevent stack blur from use even values
-- (Upgrade) AvaloniaUI from 11.1.3 to 11.2.2
-- (Upgrade) .NET from 6.0.33 to 9.0.0
- - .NET 6.0 is end of life and will no longer supported
- - This represents three major upgrades and will increase the system os version requirements, see more here: https://github.com/dotnet/core/blob/main/release-notes/9.0/supported-os.md
- - With this upgrade the software will be able to take advantage of the new features and improvements of the .NET 9.0, including a significant performance boost
+- (Fix) Index out of range when saving some file formats (#957)
+- (Change) Exposure time finder: Allow using 0 for the normal step in the multiple exposure generator (#958)
diff --git a/UVtools.Core/Extensions/BitExtensions.cs b/UVtools.Core/Extensions/BitExtensions.cs
index d117e26c..77b6004b 100644
--- a/UVtools.Core/Extensions/BitExtensions.cs
+++ b/UVtools.Core/Extensions/BitExtensions.cs
@@ -112,7 +112,7 @@ public static byte[] ToBytesLittleEndian(float value)
return bytes;
}
- public static void ToBytesLittleEndian(float value, byte[] buffer, uint offset = 0)
+ public static void ToBytesLittleEndian(float value, byte[] buffer, int offset = 0)
{
BinaryPrimitives.WriteSingleLittleEndian(buffer.AsSpan((int)offset, 4), value);
}
@@ -124,7 +124,7 @@ public static byte[] ToBytesBigEndian(float value)
return bytes;
}
- public static void ToBytesBigEndian(float value, byte[] buffer, uint offset = 0)
+ public static void ToBytesBigEndian(float value, byte[] buffer, int offset = 0)
{
BinaryPrimitives.WriteSingleBigEndian(buffer.AsSpan((int)offset, 4), value);
}
diff --git a/UVtools.Core/FileFormats/FileFormat.cs b/UVtools.Core/FileFormats/FileFormat.cs
index f6ab0a66..2ce2fc4f 100644
--- a/UVtools.Core/FileFormats/FileFormat.cs
+++ b/UVtools.Core/FileFormats/FileFormat.cs
@@ -815,7 +815,7 @@ or DATATYPE_BGR888
{
var bytesPerPixel = dataType is "RGB888" or "BGR888" ? 3 : 2;
var bytes = new byte[mat.Width * mat.Height * bytesPerPixel];
- uint index = 0;
+ int index = 0;
var span = mat.GetDataByteReadOnlySpan();
for (int i = 0; i < span.Length;)
{
diff --git a/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs b/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs
index d562cd00..0a30c632 100644
--- a/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs
+++ b/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs
@@ -2005,7 +2005,7 @@ lastExposureItem is not null &&
lastCurrentHeight == currentHeight &&
lastExposureItem.LayerHeight == layerHeight &&
(
- (isBottomLayer && lastExposureItem.BottomExposure == bottomExposure || !isBottomLayer && lastExposureItem.Exposure == normalExposure) ||
+ ((isBottomLayer && lastExposureItem.BottomExposure == bottomExposure) || (!isBottomLayer && lastExposureItem.Exposure == normalExposure)) ||
(!isBottomLayer && isBaseLayer && _multipleExposuresBaseLayersPrintMode != CalibrateExposureFinderMultipleExposuresBaseLayersPrintModes.Iterative)
);
@@ -2125,11 +2125,12 @@ lastExposureItem is not null &&
{
layer.ExposureTime = _multipleExposuresBaseLayersPrintMode switch
{
+ CalibrateExposureFinderMultipleExposuresBaseLayersPrintModes.Iterative => (float)normalExposure,
CalibrateExposureFinderMultipleExposuresBaseLayersPrintModes.UseLowest => (float) _exposureTable[0].Exposure,
CalibrateExposureFinderMultipleExposuresBaseLayersPrintModes.UseMiddle => (float) _exposureTable[(int) Math.Ceiling((_exposureTable.Count - 1) / 2.0)].Exposure,
CalibrateExposureFinderMultipleExposuresBaseLayersPrintModes.UseHighest => (float) _exposureTable[^1].Exposure,
CalibrateExposureFinderMultipleExposuresBaseLayersPrintModes.Custom => (float) _multipleExposuresBaseLayersCustomExposure,
- _ => throw new ArgumentOutOfRangeException($"Unhandled type for {_multipleExposuresBaseLayersCustomExposure}")
+ _ => throw new ArgumentOutOfRangeException($"Unhandled type for {_multipleExposuresBaseLayersPrintMode}")
};
}
}
diff --git a/UVtools.Installer/Code/Product.wxs b/UVtools.Installer/Code/Product.wxs
index b83764bb..ee01df54 100644
--- a/UVtools.Installer/Code/Product.wxs
+++ b/UVtools.Installer/Code/Product.wxs
@@ -1,5 +1,5 @@
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/UVtools.Installer/Code/UI.wxs b/UVtools.Installer/Code/UI.wxs
index 6512e9bd..55780854 100644
--- a/UVtools.Installer/Code/UI.wxs
+++ b/UVtools.Installer/Code/UI.wxs
@@ -1,16 +1,16 @@
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
+
+
\ No newline at end of file
diff --git a/UVtools.Installer/Code/UI_CustomInstallDir.wxs b/UVtools.Installer/Code/UI_CustomInstallDir.wxs
index 011969e3..76fd4848 100644
--- a/UVtools.Installer/Code/UI_CustomInstallDir.wxs
+++ b/UVtools.Installer/Code/UI_CustomInstallDir.wxs
@@ -21,66 +21,66 @@ Patch dialog sequence:
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UVtools.UI/Controls/Calibrators/CalibrateExposureFinderControl.axaml b/UVtools.UI/Controls/Calibrators/CalibrateExposureFinderControl.axaml
index 053116b1..5f4212f4 100644
--- a/UVtools.UI/Controls/Calibrators/CalibrateExposureFinderControl.axaml
+++ b/UVtools.UI/Controls/Calibrators/CalibrateExposureFinderControl.axaml
@@ -855,7 +855,7 @@