diff --git a/CHANGELOG.md b/CHANGELOG.md index e54911f..a6f96fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog -## /12/2022 - v3.9.3 +## 29/12/2022 - v3.9.4 + +- **CTB:** + - (Improvement) Split `uint PerLayerSettings` into `byte AntiAliasFlag`, `ushort Padding` and `byte PerLayerSettings` + - (Improvement) Change the way and value set to `PerLayerSettings`, this may fix some recent problems where printer doesn't respect per layer settings? + +## 14/12/2022 - v3.9.3 - **Issues:** - (Fix) Resin traps and suction cups area sum, was losing precision due uint cast (#621) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 2b5bf69..22d198f 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,6 +1,4 @@ -- **Issues:** - - (Fix) Resin traps and suction cups area sum, was losing precision due uint cast (#621) - - (Fix) Overhang area was incorrectly showing bounding rectangle area instead it real area -- (Fix) OSF: Unable to open certain files when using anti-aliasing -- (Upgrade) .NET from 6.0.11 to 6.0.12 +- **CTB:** + - (Improvement) Split `uint PerLayerSettings` into `byte AntiAliasFlag`, `ushort Padding` and `byte PerLayerSettings` + - (Improvement) Change the way and value set to `PerLayerSettings`, this may fix some recent problems where printer doesn't respect per layer settings? diff --git a/Scripts/010 Editor/ctb.bt b/Scripts/010 Editor/ctb.bt index ef89f11..5e8e98a 100644 --- a/Scripts/010 Editor/ctb.bt +++ b/Scripts/010 Editor/ctb.bt @@ -85,7 +85,10 @@ struct SLICER_INFO { uint MachineNameAddress ; uint MachineNameSize ; - uint PerLayerSettings ; // 0/8 for cbddlp files, 0xF (15) for ctb files, 0x2000000F (536870927) for v3 ctb and 1073741839 for v4 ctb files to allow per layer parameters + //uint PerLayerSettings ; // 0 to not support, 0x20 (32) for v3 ctb and 1073741839 for v4 ctb files to allow per layer parameters + ubyte AntiAliasFlag ; // 0 [No AA] / 8 [AA] for cbddlp files, 7(0x7) [No AA] / 15(0x0F) [AA] for ctb files + ushort Padding ; + ubyte PerLayerSettings ; // 0 to not support, 0x20 for v3 ctb and 0x40 to 0x50 for v4 ctb files to allow per layer parameters, 16 * version? uint TimestampMinutes ; uint AntiAliasLevel ; uint SoftwareVersion ; // ctb v3 = 17171200 | ctb v4 pro = 16777216 diff --git a/Scripts/010 Editor/ctb_decrypted.bt b/Scripts/010 Editor/ctb_decrypted.bt index 8ac6eaf..40dd92f 100644 --- a/Scripts/010 Editor/ctb_decrypted.bt +++ b/Scripts/010 Editor/ctb_decrypted.bt @@ -68,9 +68,11 @@ struct DECRYPTED_HEADER { float RestTimeAfterLift; uint PrinterNameOffset; uint PrinterNameSize; - uint Unknown4; + ubyte AntiAliasFlag ; // 7(0x7) [No AA] / 15(0x0F) [AA] + ushort Padding ; + ubyte PerLayerSettings ; // 0 to not support, 0x40 or 0x50, 16 * version? + uint unknown4; uint unknown5; - uint unknown6; float RestTimeAfterRetract; float RestTimeAfterLift; uint TransitionLayerCount; @@ -84,9 +86,9 @@ struct DECRYPTED_HEADER { float RestTimeAfterLift; float RestTimeBeforeLift; float BottomRetractHeight; - float unknown7; + float unknown6; + uint unknown7; uint unknown8; - uint unknown9; uint LastLayerIndex; uint Padding3; uint Padding4; diff --git a/UVtools.Core/FileFormats/CTBEncryptedFile.cs b/UVtools.Core/FileFormats/CTBEncryptedFile.cs index 98ee883..26e55de 100644 --- a/UVtools.Core/FileFormats/CTBEncryptedFile.cs +++ b/UVtools.Core/FileFormats/CTBEncryptedFile.cs @@ -6,7 +6,6 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; -using System.Drawing.Printing; using System.IO; using System.Linq; using System.Security.Cryptography; @@ -27,24 +26,23 @@ public class CTBEncryptedFile : FileFormat public const ushort RLE16EncodingLimit = 0xFFF; public const ushort RLEEncryptedMinimumLength = 512; - public const uint PERLAYER_SETTINGS_DISALLOW_NO_AA = 7; // 7 (This disallow per layer settings and follow global table only) No AA - public const uint PERLAYER_SETTINGS_DISALLOW = 15; // 15 (This disallow per layer settings and follow global table only) with AA - public const uint PERLAYER_SETTINGS_ALLOW = 0x5000000F; // 1342177295 (This allow per layer settings) + private const byte PERLAYER_SETTINGS_DISALLOW = 0; + private const byte PERLAYER_SETTINGS_ALLOW = 0x40; private const string CTB_DISCLAIMER = "Layout and record format for the ctb and cbddlp file types are the copyrighted programs or codes of CBD Technology (China) Inc..The Customer or User shall not in any manner reproduce, distribute, modify, decompile, disassemble, decrypt, extract, reverse engineer, lease, assign, or sublicense the said programs or codes."; private const ushort CTB_DISCLAIMER_SIZE = 320; - public const byte HASH_LENGTH = 32; - public const uint LAYER_XOR_KEY = 0xEFBEADDE; + private const byte HASH_LENGTH = 32; + private const uint LAYER_XOR_KEY = 0xEFBEADDE; - public const string Secret0 = "HDgSAB0BEiE/AgpPAhwhM1QAAUwHPT8HTywEGiEjVAoBDwEsJgAKC0wVPDoRTwkDATg3AE9HQhAhNF1VZWYkMHYVHQpMEjI3HQEcGFM7OQBPHwkBOD8AGwoIUyAlER1PCBIhN1QKAQ8BLCYABgACX3U6GwwEH191NRsBHBgBND8aHENMATAlAB0GDwc8ORocQ0weOjgbHwAAGi83AAYAAlM0OBBPAQMdeCURARwJUyU5GAYMBRYmdgAHDhhTJSQRGQoCByZ2GxsHCQEmdhIdAAFTNiQRDhsJUzQ4EE8DCRIxexIAHRsSJzJUHAAABiE/GwEcTBInOQEBC0wHMDUcAQAAHDIvWmU8GQMlOQYbBgIUdSIcBhxMFTw6EU8JAwE4NwBPBh9TNHYHGwocXjc3FwRPChwndkcrTxgWNj4aAAMDFCx2FQELTBU6JFQbBwlTNjkZAhoCGiEvVAAZCQE0OhhBTz8HPDoYQ08NHTF2HQFPDhY9NxgJTwMVdSMHCh0fUyIzVA4DABwidgAATx4WNDJYTxwNBTB2FQELTB40OB0fGgASITNUGwcJUzM/GApPChwndgYKGQUWInpUHQoPHCMzBk8LDQc0dhUBC0wXMCIRDBtMAyc5FgMKAQB1IhtPAg0YMHYNABpMEDogER0KCFMzJBsCTwEaJiIVBAofUzQ4EE8KHgE6JAdBZTwfMDcHCkNMHjQ9EU8WAwYndgcHBgoHdTAGAAJMBz0/B08fHhwxIxcbHEwSOzJUBwoAA3UiHApPXzd1IhEMBwIcOTkTFk8LHHUwGx0YDQExdhUBC0wcJTMaTk8/BiUmGx0bTBwlMxpCHAMGJzURTxwDHyAiHQABH191IhwOG0wENC9UGApMEDQ4VAwdCRIhM1QNChgHMCRUHx0DFyA1ABxPChwndgAHCkwQOjgHGgIJASZ4"; - public const string Secret1 = "hQ36XB6yTk+zO02ysyiowt8yC1buK+nbLWyfY40EXoU="; - public const string Secret2 = "Wld+ampndVJecmVjYH5cWQ=="; + private const string Secret0 = "HDgSAB0BEiE/AgpPAhwhM1QAAUwHPT8HTywEGiEjVAoBDwEsJgAKC0wVPDoRTwkDATg3AE9HQhAhNF1VZWYkMHYVHQpMEjI3HQEcGFM7OQBPHwkBOD8AGwoIUyAlER1PCBIhN1QKAQ8BLCYABgACX3U6GwwEH191NRsBHBgBND8aHENMATAlAB0GDwc8ORocQ0weOjgbHwAAGi83AAYAAlM0OBBPAQMdeCURARwJUyU5GAYMBRYmdgAHDhhTJSQRGQoCByZ2GxsHCQEmdhIdAAFTNiQRDhsJUzQ4EE8DCRIxexIAHRsSJzJUHAAABiE/GwEcTBInOQEBC0wHMDUcAQAAHDIvWmU8GQMlOQYbBgIUdSIcBhxMFTw6EU8JAwE4NwBPBh9TNHYHGwocXjc3FwRPChwndkcrTxgWNj4aAAMDFCx2FQELTBU6JFQbBwlTNjkZAhoCGiEvVAAZCQE0OhhBTz8HPDoYQ08NHTF2HQFPDhY9NxgJTwMVdSMHCh0fUyIzVA4DABwidgAATx4WNDJYTxwNBTB2FQELTB40OB0fGgASITNUGwcJUzM/GApPChwndgYKGQUWInpUHQoPHCMzBk8LDQc0dhUBC0wXMCIRDBtMAyc5FgMKAQB1IhtPAg0YMHYNABpMEDogER0KCFMzJBsCTwEaJiIVBAofUzQ4EE8KHgE6JAdBZTwfMDcHCkNMHjQ9EU8WAwYndgcHBgoHdTAGAAJMBz0/B08fHhwxIxcbHEwSOzJUBwoAA3UiHApPXzd1IhEMBwIcOTkTFk8LHHUwGx0YDQExdhUBC0wcJTMaTk8/BiUmGx0bTBwlMxpCHAMGJzURTxwDHyAiHQABH191IhwOG0wENC9UGApMEDQ4VAwdCRIhM1QNChgHMCRUHx0DFyA1ABxPChwndgAHCkwQOjgHGgIJASZ4"; + private const string Secret1 = "hQ36XB6yTk+zO02ysyiowt8yC1buK+nbLWyfY40EXoU="; + private const string Secret2 = "Wld+ampndVJecmVjYH5cWQ=="; public static readonly string Preamble = CryptExtensions.XORCipherString(System.Convert.FromBase64String(Secret0), About.Software); - public static byte[] Bigfoot = CryptExtensions.XORCipher(System.Convert.FromBase64String(Secret1), About.Software); - public static byte[] CookieMonster = CryptExtensions.XORCipher(System.Convert.FromBase64String(Secret2), About.Software); + private static byte[] Bigfoot = CryptExtensions.XORCipher(System.Convert.FromBase64String(Secret1), About.Software); + private static byte[] CookieMonster = CryptExtensions.XORCipher(System.Convert.FromBase64String(Secret2), About.Software); #endregion @@ -125,36 +123,47 @@ public class CTBEncryptedFile : FileFormat [FieldOrder(39)] public float RestTimeAfterLift { get; set; } [FieldOrder(40)] public uint MachineNameOffset { get; set; } [FieldOrder(41)] public uint MachineNameSize { get; set; } = (uint)(string.IsNullOrEmpty(DefaultMachineName) ? 0 : DefaultMachineName.Length); - [FieldOrder(42)] public uint PerLayerSettings { get; set; } = PERLAYER_SETTINGS_DISALLOW; - [FieldOrder(43)] public uint Unknown4 { get; set; } - [FieldOrder(44)] public uint Unknown5 { get; set; } = 8; // Also 1 - [FieldOrder(45)] public float RestTimeAfterRetract { get; set; } - [FieldOrder(46)] public float RestTimeAfterLift2 { get; set; } - [FieldOrder(47)] public uint TransitionLayerCount { get; set; } - [FieldOrder(48)] public float BottomRetractSpeed { get; set; } - [FieldOrder(49)] public float BottomRetractSpeed2 { get; set; } - [FieldOrder(50)] public uint Padding1 { get; set; } - [FieldOrder(51)] public float Four1 { get; set; } = 4; // Same as CTBv4.PrintParametersV4.Four1) - [FieldOrder(52)] public uint Padding2 { get; set; } - [FieldOrder(53)] public float Four2 { get; set; } = 4; // Same as CTBv4.PrintParametersV4.Four2) - [FieldOrder(54)] public float RestTimeAfterRetract2 { get; set; } - [FieldOrder(55)] public float RestTimeAfterLift3 { get; set; } - [FieldOrder(56)] public float RestTimeBeforeLift { get; set; } - [FieldOrder(57)] public float BottomRetractHeight2 { get; set; } - [FieldOrder(58)] public uint Unknown6 { get; set; } // Same as CTBv4.PrintParametersV4.Unknown1) - [FieldOrder(59)] public uint Unknown7 { get; set; } // Same as CTBv4.PrintParametersV4.Unknown2) - [FieldOrder(60)] public uint Unknown8 { get; set; } = 4; // Same as CTBv4.PrintParametersV4.Unknown3) - [FieldOrder(61)] public uint LastLayerIndex { get; set; } - [FieldOrder(62)] public uint Padding3 { get; set; } - [FieldOrder(63)] public uint Padding4 { get; set; } - [FieldOrder(64)] public uint Padding5 { get; set; } - [FieldOrder(65)] public uint Padding6 { get; set; } - [FieldOrder(66)] public uint DisclaimerOffset { get; set; } - [FieldOrder(67)] public uint DisclaimerSize { get; set; } - [FieldOrder(68)] public uint Padding7 { get; set; } - [FieldOrder(69)] public uint Padding8 { get; set; } - [FieldOrder(70)] public uint Padding9 { get; set; } - [FieldOrder(71)] public uint Padding10 { get; set; } + + /// + /// 7(0x7) [No AA] / 15(0x0F) [AA] + /// + [FieldOrder(42)] public byte AntiAliasFlag { get; set; } = 0x0F; + + [FieldOrder(43)] public ushort Padding { get; set; } + + /// + /// Not totally understood. 0 to not support, 0x40 to 0x50 to allow per layer parameters + /// + [FieldOrder(44)] public byte PerLayerSettings { get; set; } + [FieldOrder(45)] public uint Unknown4 { get; set; } + [FieldOrder(46)] public uint Unknown5 { get; set; } = 8; // Also 1 + [FieldOrder(47)] public float RestTimeAfterRetract { get; set; } + [FieldOrder(48)] public float RestTimeAfterLift2 { get; set; } + [FieldOrder(49)] public uint TransitionLayerCount { get; set; } + [FieldOrder(50)] public float BottomRetractSpeed { get; set; } + [FieldOrder(51)] public float BottomRetractSpeed2 { get; set; } + [FieldOrder(52)] public uint Padding1 { get; set; } + [FieldOrder(53)] public float Four1 { get; set; } = 4; // Same as CTBv4.PrintParametersV4.Four1) + [FieldOrder(54)] public uint Padding2 { get; set; } + [FieldOrder(55)] public float Four2 { get; set; } = 4; // Same as CTBv4.PrintParametersV4.Four2) + [FieldOrder(56)] public float RestTimeAfterRetract2 { get; set; } + [FieldOrder(57)] public float RestTimeAfterLift3 { get; set; } + [FieldOrder(58)] public float RestTimeBeforeLift { get; set; } + [FieldOrder(59)] public float BottomRetractHeight2 { get; set; } + [FieldOrder(60)] public uint Unknown6 { get; set; } // Same as CTBv4.PrintParametersV4.Unknown1) + [FieldOrder(61)] public uint Unknown7 { get; set; } // Same as CTBv4.PrintParametersV4.Unknown2) + [FieldOrder(62)] public uint Unknown8 { get; set; } = 4; // Same as CTBv4.PrintParametersV4.Unknown3) + [FieldOrder(63)] public uint LastLayerIndex { get; set; } + [FieldOrder(64)] public uint Padding3 { get; set; } + [FieldOrder(65)] public uint Padding4 { get; set; } + [FieldOrder(66)] public uint Padding5 { get; set; } + [FieldOrder(67)] public uint Padding6 { get; set; } + [FieldOrder(68)] public uint DisclaimerOffset { get; set; } + [FieldOrder(69)] public uint DisclaimerSize { get; set; } + [FieldOrder(70)] public uint Padding7 { get; set; } + [FieldOrder(71)] public uint Padding8 { get; set; } + [FieldOrder(72)] public uint Padding9 { get; set; } + [FieldOrder(73)] public uint Padding10 { get; set; } [Ignore] public string MachineName @@ -170,7 +179,7 @@ public class CTBEncryptedFile : FileFormat public override string ToString() { - return $"{nameof(ChecksumValue)}: {ChecksumValue}, {nameof(LayerPointersOffset)}: {LayerPointersOffset}, {nameof(DisplayWidth)}: {DisplayWidth}, {nameof(DisplayHeight)}: {DisplayHeight}, {nameof(MachineZ)}: {MachineZ}, {nameof(Unknown1)}: {Unknown1}, {nameof(Unknown2)}: {Unknown2}, {nameof(TotalHeightMillimeter)}: {TotalHeightMillimeter}, {nameof(LayerHeight)}: {LayerHeight}, {nameof(ExposureTime)}: {ExposureTime}, {nameof(BottomExposureTime)}: {BottomExposureTime}, {nameof(LightOffDelay)}: {LightOffDelay}, {nameof(BottomLayerCount)}: {BottomLayerCount}, {nameof(ResolutionX)}: {ResolutionX}, {nameof(ResolutionY)}: {ResolutionY}, {nameof(LayerCount)}: {LayerCount}, {nameof(LargePreviewOffset)}: {LargePreviewOffset}, {nameof(SmallPreviewOffset)}: {SmallPreviewOffset}, {nameof(PrintTime)}: {PrintTime}, {nameof(ProjectorType)}: {ProjectorType}, {nameof(BottomLiftHeight)}: {BottomLiftHeight}, {nameof(BottomLiftSpeed)}: {BottomLiftSpeed}, {nameof(LiftHeight)}: {LiftHeight}, {nameof(LiftSpeed)}: {LiftSpeed}, {nameof(RetractSpeed)}: {RetractSpeed}, {nameof(MaterialMilliliters)}: {MaterialMilliliters}, {nameof(MaterialGrams)}: {MaterialGrams}, {nameof(MaterialCost)}: {MaterialCost}, {nameof(BottomLightOffDelay)}: {BottomLightOffDelay}, {nameof(Unknown3)}: {Unknown3}, {nameof(LightPWM)}: {LightPWM}, {nameof(BottomLightPWM)}: {BottomLightPWM}, {nameof(LayerXorKey)}: {LayerXorKey}, {nameof(BottomLiftHeight2)}: {BottomLiftHeight2}, {nameof(BottomLiftSpeed2)}: {BottomLiftSpeed2}, {nameof(LiftHeight2)}: {LiftHeight2}, {nameof(LiftSpeed2)}: {LiftSpeed2}, {nameof(RetractHeight2)}: {RetractHeight2}, {nameof(RetractSpeed2)}: {RetractSpeed2}, {nameof(RestTimeAfterLift)}: {RestTimeAfterLift}, {nameof(MachineNameOffset)}: {MachineNameOffset}, {nameof(MachineNameSize)}: {MachineNameSize}, {nameof(PerLayerSettings)}: {PerLayerSettings}, {nameof(Unknown4)}: {Unknown4}, {nameof(Unknown5)}: {Unknown5}, {nameof(RestTimeAfterRetract)}: {RestTimeAfterRetract}, {nameof(RestTimeAfterLift2)}: {RestTimeAfterLift2}, {nameof(TransitionLayerCount)}: {TransitionLayerCount}, {nameof(BottomRetractSpeed)}: {BottomRetractSpeed}, {nameof(BottomRetractSpeed2)}: {BottomRetractSpeed2}, {nameof(Padding1)}: {Padding1}, {nameof(Four1)}: {Four1}, {nameof(Padding2)}: {Padding2}, {nameof(Four2)}: {Four2}, {nameof(RestTimeAfterRetract2)}: {RestTimeAfterRetract2}, {nameof(RestTimeAfterLift3)}: {RestTimeAfterLift3}, {nameof(RestTimeBeforeLift)}: {RestTimeBeforeLift}, {nameof(BottomRetractHeight2)}: {BottomRetractHeight2}, {nameof(Unknown6)}: {Unknown6}, {nameof(Unknown7)}: {Unknown7}, {nameof(Unknown8)}: {Unknown8}, {nameof(LastLayerIndex)}: {LastLayerIndex}, {nameof(Padding3)}: {Padding3}, {nameof(Padding4)}: {Padding4}, {nameof(Padding5)}: {Padding5}, {nameof(Padding6)}: {Padding6}, {nameof(DisclaimerOffset)}: {DisclaimerOffset}, {nameof(DisclaimerSize)}: {DisclaimerSize}, {nameof(Padding7)}: {Padding7}, {nameof(Padding8)}: {Padding8}, {nameof(Padding9)}: {Padding9}, {nameof(Padding10)}: {Padding10}, {nameof(MachineName)}: {MachineName}"; + return $"{nameof(ChecksumValue)}: {ChecksumValue}, {nameof(LayerPointersOffset)}: {LayerPointersOffset}, {nameof(DisplayWidth)}: {DisplayWidth}, {nameof(DisplayHeight)}: {DisplayHeight}, {nameof(MachineZ)}: {MachineZ}, {nameof(Unknown1)}: {Unknown1}, {nameof(Unknown2)}: {Unknown2}, {nameof(TotalHeightMillimeter)}: {TotalHeightMillimeter}, {nameof(LayerHeight)}: {LayerHeight}, {nameof(ExposureTime)}: {ExposureTime}, {nameof(BottomExposureTime)}: {BottomExposureTime}, {nameof(LightOffDelay)}: {LightOffDelay}, {nameof(BottomLayerCount)}: {BottomLayerCount}, {nameof(ResolutionX)}: {ResolutionX}, {nameof(ResolutionY)}: {ResolutionY}, {nameof(LayerCount)}: {LayerCount}, {nameof(LargePreviewOffset)}: {LargePreviewOffset}, {nameof(SmallPreviewOffset)}: {SmallPreviewOffset}, {nameof(PrintTime)}: {PrintTime}, {nameof(ProjectorType)}: {ProjectorType}, {nameof(BottomLiftHeight)}: {BottomLiftHeight}, {nameof(BottomLiftSpeed)}: {BottomLiftSpeed}, {nameof(LiftHeight)}: {LiftHeight}, {nameof(LiftSpeed)}: {LiftSpeed}, {nameof(RetractSpeed)}: {RetractSpeed}, {nameof(MaterialMilliliters)}: {MaterialMilliliters}, {nameof(MaterialGrams)}: {MaterialGrams}, {nameof(MaterialCost)}: {MaterialCost}, {nameof(BottomLightOffDelay)}: {BottomLightOffDelay}, {nameof(Unknown3)}: {Unknown3}, {nameof(LightPWM)}: {LightPWM}, {nameof(BottomLightPWM)}: {BottomLightPWM}, {nameof(LayerXorKey)}: {LayerXorKey}, {nameof(BottomLiftHeight2)}: {BottomLiftHeight2}, {nameof(BottomLiftSpeed2)}: {BottomLiftSpeed2}, {nameof(LiftHeight2)}: {LiftHeight2}, {nameof(LiftSpeed2)}: {LiftSpeed2}, {nameof(RetractHeight2)}: {RetractHeight2}, {nameof(RetractSpeed2)}: {RetractSpeed2}, {nameof(RestTimeAfterLift)}: {RestTimeAfterLift}, {nameof(MachineNameOffset)}: {MachineNameOffset}, {nameof(MachineNameSize)}: {MachineNameSize}, {nameof(AntiAliasFlag)}: {AntiAliasFlag}, {nameof(Padding)}: {Padding}, {nameof(PerLayerSettings)}: {PerLayerSettings}, {nameof(Unknown4)}: {Unknown4}, {nameof(Unknown5)}: {Unknown5}, {nameof(RestTimeAfterRetract)}: {RestTimeAfterRetract}, {nameof(RestTimeAfterLift2)}: {RestTimeAfterLift2}, {nameof(TransitionLayerCount)}: {TransitionLayerCount}, {nameof(BottomRetractSpeed)}: {BottomRetractSpeed}, {nameof(BottomRetractSpeed2)}: {BottomRetractSpeed2}, {nameof(Padding1)}: {Padding1}, {nameof(Four1)}: {Four1}, {nameof(Padding2)}: {Padding2}, {nameof(Four2)}: {Four2}, {nameof(RestTimeAfterRetract2)}: {RestTimeAfterRetract2}, {nameof(RestTimeAfterLift3)}: {RestTimeAfterLift3}, {nameof(RestTimeBeforeLift)}: {RestTimeBeforeLift}, {nameof(BottomRetractHeight2)}: {BottomRetractHeight2}, {nameof(Unknown6)}: {Unknown6}, {nameof(Unknown7)}: {Unknown7}, {nameof(Unknown8)}: {Unknown8}, {nameof(LastLayerIndex)}: {LastLayerIndex}, {nameof(Padding3)}: {Padding3}, {nameof(Padding4)}: {Padding4}, {nameof(Padding5)}: {Padding5}, {nameof(Padding6)}: {Padding6}, {nameof(DisclaimerOffset)}: {DisclaimerOffset}, {nameof(DisclaimerSize)}: {DisclaimerSize}, {nameof(Padding7)}: {Padding7}, {nameof(Padding8)}: {Padding8}, {nameof(Padding9)}: {Padding9}, {nameof(Padding10)}: {Padding10}, {nameof(MachineName)}: {MachineName}"; } } @@ -1040,7 +1049,7 @@ public class CTBEncryptedFile : FileFormat { get { - return new object[] { Settings }; + return new object[] { Header, Settings }; } } @@ -1092,14 +1101,6 @@ public class CTBEncryptedFile : FileFormat return false; } - private void SanitizeProperties() - { - Settings.PerLayerSettings = AllLayersAreUsingGlobalParameters - ? PERLAYER_SETTINGS_DISALLOW - : PERLAYER_SETTINGS_ALLOW; - } - - protected override void DecodeInternally(OperationProgress progress) { using var inputFile = new FileStream(FileFullPath!, FileMode.Open, FileAccess.Read); @@ -1285,6 +1286,13 @@ public class CTBEncryptedFile : FileFormat //inputFile.ReadBytes(HashLength); } + protected override void OnBeforeEncode(bool isPartialEncode) + { + Settings.PerLayerSettings = AllLayersAreUsingGlobalParameters + ? PERLAYER_SETTINGS_DISALLOW + : PERLAYER_SETTINGS_ALLOW; + } + protected override void EncodeInternally(OperationProgress progress) { using var outputFile = new FileStream(TemporaryOutputFileFullPath, FileMode.Create, FileAccess.Write); @@ -1294,8 +1302,6 @@ public class CTBEncryptedFile : FileFormat Header.SettingsSize = (uint)Helpers.Serializer.SizeOf(Settings); Header.SettingsOffset = (uint)Helpers.Serializer.SizeOf(Header); - SanitizeProperties(); - if (Settings.LayerXorKey == 0) { Settings.LayerXorKey = LAYER_XOR_KEY; @@ -1353,7 +1359,7 @@ public class CTBEncryptedFile : FileFormat LayersPointer = new LayerPointer[LayerCount]; LayersDefinition = new LayerDef[LayerCount]; - uint layerTableSize = (uint)Helpers.Serializer.SizeOf(new LayerPointer()) * LayerCount; + var layerTableSize = Helpers.Serializer.SizeOf(new LayerPointer()) * LayerCount; outputFile.Seek(outputFile.Position + layerTableSize, SeekOrigin.Begin); @@ -1377,7 +1383,7 @@ public class CTBEncryptedFile : FileFormat var layerDef = LayersDefinition[layerIndex]; LayersPointer[layerIndex] = new LayerPointer(outputFile.Position); - long layerDataOffset = outputFile.Position + LayerDef.TABLE_SIZE; + var layerDataOffset = outputFile.Position + LayerDef.TABLE_SIZE; layerDef.PageNumber = (uint)(layerDataOffset / ChituboxFile.PageSize); layerDef.LayerDataOffset = (uint)(layerDataOffset - ChituboxFile.PageSize * layerDef.PageNumber); outputFile.WriteSerialize(layerDef); @@ -1414,8 +1420,6 @@ public class CTBEncryptedFile : FileFormat protected override void PartialSaveInternally(OperationProgress progress) { - SanitizeProperties(); - using var outputFile = new FileStream(TemporaryOutputFileFullPath, FileMode.Open, FileAccess.Write); outputFile.Seek(Header.SettingsOffset, SeekOrigin.Begin); diff --git a/UVtools.Core/FileFormats/ChituboxFile.cs b/UVtools.Core/FileFormats/ChituboxFile.cs index c761add..c87766d 100644 --- a/UVtools.Core/FileFormats/ChituboxFile.cs +++ b/UVtools.Core/FileFormats/ChituboxFile.cs @@ -40,12 +40,11 @@ public class ChituboxFile : FileFormat public const byte RLE8EncodingLimit = 0x7d; // 125; public const ushort RLE16EncodingLimit = 0xFFF; - public const uint PERLAYER_SETTINGS_CBDDLP = 8; // 0 or 8 (This disallow per layer settings) - public const uint PERLAYER_SETTINGS_DISALLOW_NO_AA = 7; // 7 (This disallow per layer settings) no AA - public const uint PERLAYER_SETTINGS_DISALLOW = 15; // 15 (This disallow per layer settings) with AA - public const uint PERLAYER_SETTINGS_CTBv2 = 15; // 15 for ctb v2 files and others (This disallow per layer settings) - public const uint PERLAYER_SETTINGS_CTBv3 = 0x2000000F; // 536870927 for ctb v3 files (This allow per layer settings, while 15 don't) - public const uint PERLAYER_SETTINGS_CTBv4 = 0x4000000F; // 1073741839 for ctb v4 files (This allow per layer settings, while 15 don't) + private const byte PERLAYER_SETTINGS_DISALLOW = 0; + private const byte PERLAYER_SETTINGS_CBDDLP = 0x10; + private const byte PERLAYER_SETTINGS_CTBv2 = 0x20; // 15 for ctb v2 files and others (This disallow per layer settings) + private const byte PERLAYER_SETTINGS_CTBv3 = 0x30; // 536870927 for ctb v3 files (This allow per layer settings, while 15 don't) + private const byte PERLAYER_SETTINGS_CTBv4 = 0x40; // 1073741839 for ctb v4 files (This allow per layer settings, while 15 don't) private const string CTBv4_DISCLAIMER = "Layout and record format for the ctb and cbddlp file types are the copyrighted programs or codes of CBD Technology (China) Inc..The Customer or User shall not in any manner reproduce, distribute, modify, decompile, disassemble, decrypt, extract, reverse engineer, lease, assign, or sublicense the said programs or codes."; private const ushort CTBv4_DISCLAIMER_SIZE = 320; @@ -288,12 +287,12 @@ public class ChituboxFile : FileFormat { private string _machineName = DefaultMachineName; [FieldOrder(0)] public float BottomLiftHeight2 { get; set; } - [FieldOrder(1)] public float BottomLiftSpeed2 { get; set; } - [FieldOrder(2)] public float LiftHeight2 { get; set; } - [FieldOrder(3)] public float LiftSpeed2 { get; set; } - [FieldOrder(4)] public float RetractHeight2 { get; set; } - [FieldOrder(5)] public float RetractSpeed2 { get; set; } - [FieldOrder(6)] public float RestTimeAfterLift { get; set; } + [FieldOrder(1)] public float BottomLiftSpeed2 { get; set; } + [FieldOrder(2)] public float LiftHeight2 { get; set; } + [FieldOrder(3)] public float LiftSpeed2 { get; set; } + [FieldOrder(4)] public float RetractHeight2 { get; set; } + [FieldOrder(5)] public float RetractSpeed2 { get; set; } + [FieldOrder(6)] public float RestTimeAfterLift { get; set; } /// /// Gets the machine name offset to a string naming the machine type, and its length in bytes. @@ -306,42 +305,48 @@ public class ChituboxFile : FileFormat [FieldOrder(8)] public uint MachineNameSize { get; set; } = (uint)(string.IsNullOrEmpty(DefaultMachineName) ? 0 : DefaultMachineName.Length); /// - /// Gets the parameter used to control encryption. - /// Not totally understood. 0/8 for cbddlp files, 0xF (15) for ctb files, 0x2000000F (536870927) for v3 ctb and 1073741839 for v4 ctb files to allow per layer parameters + /// CBDDLP: 0 [No AA] / 8 [AA] for cbddlp files. CTB: 7(0x7) [No AA] / 15(0x0F) [AA] /// - [FieldOrder(9)] public uint PerLayerSettings { get; set; } = PERLAYER_SETTINGS_DISALLOW; + [FieldOrder(9)] public byte AntiAliasFlag { get; set; } = 0x0F; + + [FieldOrder(10)] public ushort Padding { get; set; } + + /// + /// Not totally understood. 0 to not support, 0x20 for v2, 0x30 for v3 and 0x40 to 0x50 for v4 ctb files to allow per layer parameters + /// + [FieldOrder(11)] public byte PerLayerSettings { get; set; } /// /// Gets the minutes since Jan 1, 1970 UTC /// - [FieldOrder(10)] public uint ModifiedTimestampMinutes { get; set; } = (uint)DateTimeExtensions.Timestamp.TotalMinutes; + [FieldOrder(12)] public uint ModifiedTimestampMinutes { get; set; } = (uint)DateTimeExtensions.Timestamp.TotalMinutes; [Ignore] public string ModifiedDate => DateTimeExtensions.GetDateTimeFromTimestampMinutes(ModifiedTimestampMinutes).ToString("dd/MM/yyyy HH:mm"); /// /// Gets the user-selected antialiasing level. For cbddlp files this will match the level_set_count. For ctb files, this number is essentially arbitrary. /// - [FieldOrder(11)] public uint AntiAliasLevel { get; set; } = 1; + [FieldOrder(13)] public uint AntiAliasLevel { get; set; } = 1; /// /// Gets a version of software that generated this file, encoded with major, minor, and patch release in bytes starting from the MSB down. /// (No provision is made to name the software being used, so this assumes that only one software package can generate the files. /// Probably best to hardcode it at 0x01060300.) /// 17170480 - [FieldOrder(12)] public uint SoftwareVersion { get; set; } = 0x1090000; // ctb v3 = 0x1060300 (1.6.3) | ctb v4 = 0x1090000 (1.9.0) - [FieldOrder(13)] public float RestTimeAfterRetract { get; set; } - [FieldOrder(14)] public float RestTimeAfterLift2 { get; set; } - [FieldOrder(15)] public uint TransitionLayerCount { get; set; } // CTB not all printers - [FieldOrder(16)] public uint PrintParametersV4Address { get; set; } // V4 Only - [FieldOrder(17)] public uint Padding2 { get; set; } - [FieldOrder(18)] public uint Padding3 { get; set; } + [FieldOrder(14)] public uint SoftwareVersion { get; set; } = 0x1090000; // ctb v3 = 0x1060300 (1.6.3) | ctb v4 = 0x1090000 (1.9.0) + [FieldOrder(15)] public float RestTimeAfterRetract { get; set; } + [FieldOrder(16)] public float RestTimeAfterLift2 { get; set; } + [FieldOrder(17)] public uint TransitionLayerCount { get; set; } // CTB not all printers + [FieldOrder(18)] public uint PrintParametersV4Address { get; set; } // V4 Only + [FieldOrder(19)] public uint Padding2 { get; set; } + [FieldOrder(20)] public uint Padding3 { get; set; } /// /// Gets the machine name. string is not nul-terminated. /// The character encoding is currently unknown — all observed files in the wild use 7-bit ASCII characters only. /// Note that the machine type here is set in the software profile, and is not the name the user assigned to the machine. /// - [FieldOrder(19)] + [FieldOrder(21)] [FieldLength(nameof(MachineNameSize))] public string MachineName { @@ -352,12 +357,11 @@ public class ChituboxFile : FileFormat _machineName = value; MachineNameSize = string.IsNullOrEmpty(_machineName) ? 0 : (uint)_machineName.Length; } - } public override string ToString() { - return $"{nameof(BottomLiftHeight2)}: {BottomLiftHeight2}, {nameof(BottomLiftSpeed2)}: {BottomLiftSpeed2}, {nameof(LiftHeight2)}: {LiftHeight2}, {nameof(LiftSpeed2)}: {LiftSpeed2}, {nameof(RetractHeight2)}: {RetractHeight2}, {nameof(RetractSpeed2)}: {RetractSpeed2}, {nameof(RestTimeAfterLift)}: {RestTimeAfterLift}, {nameof(MachineNameAddress)}: {MachineNameAddress}, {nameof(MachineNameSize)}: {MachineNameSize}, {nameof(PerLayerSettings)}: {PerLayerSettings}, {nameof(ModifiedTimestampMinutes)}: {ModifiedTimestampMinutes}, {nameof(ModifiedDate)}: {ModifiedDate}, {nameof(AntiAliasLevel)}: {AntiAliasLevel}, {nameof(SoftwareVersion)}: {SoftwareVersion}, {nameof(RestTimeAfterRetract)}: {RestTimeAfterRetract}, {nameof(RestTimeAfterLift2)}: {RestTimeAfterLift2}, {nameof(TransitionLayerCount)}: {TransitionLayerCount}, {nameof(PrintParametersV4Address)}: {PrintParametersV4Address}, {nameof(Padding2)}: {Padding2}, {nameof(Padding3)}: {Padding3}, {nameof(MachineName)}: {MachineName}"; + return $"{nameof(BottomLiftHeight2)}: {BottomLiftHeight2}, {nameof(BottomLiftSpeed2)}: {BottomLiftSpeed2}, {nameof(LiftHeight2)}: {LiftHeight2}, {nameof(LiftSpeed2)}: {LiftSpeed2}, {nameof(RetractHeight2)}: {RetractHeight2}, {nameof(RetractSpeed2)}: {RetractSpeed2}, {nameof(RestTimeAfterLift)}: {RestTimeAfterLift}, {nameof(MachineNameAddress)}: {MachineNameAddress}, {nameof(MachineNameSize)}: {MachineNameSize}, {nameof(AntiAliasFlag)}: {AntiAliasFlag}, {nameof(Padding)}: {Padding}, {nameof(PerLayerSettings)}: {PerLayerSettings}, {nameof(ModifiedTimestampMinutes)}: {ModifiedTimestampMinutes}, {nameof(ModifiedDate)}: {ModifiedDate}, {nameof(AntiAliasLevel)}: {AntiAliasLevel}, {nameof(SoftwareVersion)}: {SoftwareVersion}, {nameof(RestTimeAfterRetract)}: {RestTimeAfterRetract}, {nameof(RestTimeAfterLift2)}: {RestTimeAfterLift2}, {nameof(TransitionLayerCount)}: {TransitionLayerCount}, {nameof(PrintParametersV4Address)}: {PrintParametersV4Address}, {nameof(Padding2)}: {Padding2}, {nameof(Padding3)}: {Padding3}, {nameof(MachineName)}: {MachineName}"; } } @@ -1812,19 +1816,14 @@ public class ChituboxFile : FileFormat if (HeaderSettings.Version <= 2) { - SlicerInfoSettings.PerLayerSettings = PERLAYER_SETTINGS_CTBv2; PrintParametersSettings.Padding4 = 0x1234; // 4660 } - else if (HeaderSettings.Version == 3) - { - SlicerInfoSettings.PerLayerSettings = AllLayersAreUsingGlobalParameters ? PERLAYER_SETTINGS_DISALLOW : PERLAYER_SETTINGS_CTBv3; - } - else if (HeaderSettings.Version >= 4) - { - SlicerInfoSettings.PerLayerSettings = AllLayersAreUsingGlobalParameters ? PERLAYER_SETTINGS_DISALLOW : PERLAYER_SETTINGS_CTBv4; - } } + SlicerInfoSettings.PerLayerSettings = AllLayersAreUsingGlobalParameters + ? PERLAYER_SETTINGS_DISALLOW + : (byte)(Version * 16); // 0x10, 0x20, 0x30, 0x40, 0x50, ... + SlicerInfoSettings.ModifiedTimestampMinutes = (uint)DateTimeExtensions.TimestampMinutes; } @@ -1845,7 +1844,6 @@ public class ChituboxFile : FileFormat { //HeaderSettings.Version = 2; HeaderSettings.EncryptionKey = 0; // Force disable encryption - SlicerInfoSettings.PerLayerSettings = PERLAYER_SETTINGS_CBDDLP; } //uint currentOffset = (uint)Helpers.Serializer.SizeOf(HeaderSettings); diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj index a6416f3..958d58a 100644 --- a/UVtools.Core/UVtools.Core.csproj +++ b/UVtools.Core/UVtools.Core.csproj @@ -10,7 +10,7 @@ https://github.com/sn4k3/UVtools https://github.com/sn4k3/UVtools MSLA/DLP, file analysis, calibration, repair, conversion and manipulation - 3.9.3 + 3.9.4 Copyright © 2020 PTRTECH UVtools.png AnyCPU;x64 @@ -73,7 +73,7 @@ - + diff --git a/UVtools.WPF/UVtools.WPF.csproj b/UVtools.WPF/UVtools.WPF.csproj index 5451fa7..5864e6d 100644 --- a/UVtools.WPF/UVtools.WPF.csproj +++ b/UVtools.WPF/UVtools.WPF.csproj @@ -12,7 +12,7 @@ LICENSE https://github.com/sn4k3/UVtools Git - 3.9.3 + 3.9.4 AnyCPU;x64 UVtools.png README.md diff --git a/documentation/UVtools.Core.xml b/documentation/UVtools.Core.xml index d1ff60c..95f4908 100644 --- a/documentation/UVtools.Core.xml +++ b/documentation/UVtools.Core.xml @@ -1579,10 +1579,14 @@ Gets the machine size in bytes + + + CBDDLP: 0 [No AA] / 8 [AA] for cbddlp files. CTB: 7(0x7) [No AA] / 15(0x0F) [AA] + + - Gets the parameter used to control encryption. - Not totally understood. 0/8 for cbddlp files, 0xF (15) for ctb files, 0x2000000F (536870927) for v3 ctb and 1073741839 for v4 ctb files to allow per layer parameters + Not totally understood. 0 to not support, 0x20 for v2, 0x30 for v3 and 0x40 to 0x50 for v4 ctb files to allow per layer parameters @@ -1675,6 +1679,16 @@ Checksum of unix timestamp + + + 7(0x7) [No AA] / 15(0x0F) [AA] + + + + + Not totally understood. 0 to not support, 0x40 to 0x50 to allow per layer parameters + + The files contain two preview images.