From 448534080ee0234c278e7650128039881cc94d9c Mon Sep 17 00:00:00 2001 From: Markus Kalkbrenner Date: Fri, 27 Dec 2024 12:59:02 +0100 Subject: [PATCH] use libzedmd 0.8.0 for ZeDMD 5.0.0 --- LibDmd/Costura32/zedmd.dll | Bin 62464 -> 60416 bytes LibDmd/Costura64/zedmd64.dll | Bin 69120 -> 65024 bytes LibDmd/Output/ZeDMD/ZeDMD.cs | 44 +---------- LibDmd/Output/ZeDMD/ZeDMDBase.cs | 117 ++--------------------------- LibDmd/Output/ZeDMD/ZeDMDHD.cs | 52 ++----------- LibDmd/Output/ZeDMD/ZeDMDHDWiFi.cs | 42 +---------- LibDmd/Output/ZeDMD/ZeDMDWiFi.cs | 43 +---------- 7 files changed, 21 insertions(+), 277 deletions(-) diff --git a/LibDmd/Costura32/zedmd.dll b/LibDmd/Costura32/zedmd.dll index 6f7f16e8c671e287270fcea269218a1a272a85ac..99055dd4ce7f9a6d9ba9cc6cee11c96d8d15bde6 100644 GIT binary patch delta 26965 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 Pzq$F%-HU#IS@-_{Vbm2! diff --git a/LibDmd/Output/ZeDMD/ZeDMD.cs b/LibDmd/Output/ZeDMD/ZeDMD.cs index 23e611e1..ef113349 100644 --- a/LibDmd/Output/ZeDMD/ZeDMD.cs +++ b/LibDmd/Output/ZeDMD/ZeDMD.cs @@ -7,8 +7,7 @@ namespace LibDmd.Output.ZeDMD /// Check "ZeDMD Project Page" https://github.com/PPUC/ZeDMD) for details. /// This implementation supports ZeDMD and ZeDMD HD. /// - public class ZeDMD : ZeDMDBase, IGray2Destination, IGray4Destination, IColoredGray2Destination, IColoredGray4Destination, - IColoredGray6Destination, IRgb565Destination, IMultiSizeDestination, IColorRotationDestination + public class ZeDMD : ZeDMDBase, IRgb24Destination, IRgb565Destination, IMultiSizeDestination { public override string Name => "ZeDMD"; @@ -40,9 +39,6 @@ public static ZeDMD GetInstance(bool debug, int brightness, int rgbOrder, string OpenUSBConnection(); SendConfiguration(); ZeDMD_SetFrameSize(_pZeDMD, _currentDimensions.Width, _currentDimensions.Height); - ZeDMD_EnforceStreaming(_pZeDMD); - ZeDMD_EnablePreDownscaling(_pZeDMD); - ZeDMD_EnablePreUpscaling(_pZeDMD); } private void SetDimensions(Dimensions newDim) @@ -53,50 +49,16 @@ private void SetDimensions(Dimensions newDim) } } - public void RenderGray2(DmdFrame frame) - { - SetDimensions(frame.Dimensions); - ZeDMD_RenderGray2(_pZeDMD, frame.Data); - } - - public void RenderColoredGray2(ColoredFrame frame) - { - SetDimensions(frame.Dimensions); - SetPalette(frame.Palette); - ZeDMD_RenderGray2(_pZeDMD, frame.Data); - } - - public void RenderGray4(DmdFrame frame) - { - SetDimensions(frame.Dimensions); - ZeDMD_RenderGray4(_pZeDMD, frame.Data); - } - - public void RenderColoredGray4(ColoredFrame frame) - { - SetDimensions(frame.Dimensions); - SetPalette(frame.Palette); - ZeDMD_RenderGray4(_pZeDMD, frame.Data); - } - - public void RenderColoredGray6(ColoredFrame frame) - { - SetDimensions(frame.Dimensions); - SetPalette(frame.Palette); - ZeDMD_RenderColoredGray6(_pZeDMD, frame.Data, null); - _lastFrame = (ColoredFrame)frame.Clone(); - } - public void RenderRgb24(DmdFrame frame) { SetDimensions(frame.Dimensions); - ZeDMD_RenderRgb24EncodedAs565(_pZeDMD, frame.Data); + ZeDMD_RenderRgb888(_pZeDMD, frame.Data); } public void RenderRgb565(DmdFrame frame) { SetDimensions(frame.Dimensions); - ZeDMD_RenderRgb16(_pZeDMD, frame.Data); + ZeDMD_RenderRgb565(_pZeDMD, frame.Data); } } } diff --git a/LibDmd/Output/ZeDMD/ZeDMDBase.cs b/LibDmd/Output/ZeDMD/ZeDMDBase.cs index 9803932f..a9806f7d 100644 --- a/LibDmd/Output/ZeDMD/ZeDMDBase.cs +++ b/LibDmd/Output/ZeDMD/ZeDMDBase.cs @@ -4,6 +4,7 @@ using System.Windows.Media; using NLog; using System.Linq; +using System.IO.Ports; namespace LibDmd.Output.ZeDMD { @@ -85,50 +86,14 @@ public void Dispose() public void SetPalette(Color[] colors) { - if (_pZeDMD == IntPtr.Zero) { - return; - } - - byte[] paletteBuffer = Enumerable.Repeat((byte)0x0, 64 * 3).ToArray(); - var numOfColors = colors.Length; - - if (numOfColors != 4 && numOfColors != 16 && numOfColors != 64) { - return; - } - - // Custom palettes could be defined with less colors as required by the ROM. - // So we interpolate bigger palettes up to 64 colors. - while (numOfColors <= 64) { - var palette = ColorUtil.GetPalette(colors, numOfColors); - var pos = 0; - - foreach (var color in palette) { - paletteBuffer[pos++] = color.R; - paletteBuffer[pos++] = color.G; - paletteBuffer[pos++] = color.B; - } - ZeDMD_SetPalette(_pZeDMD, paletteBuffer, numOfColors); - - numOfColors *= 4; - } - } - - public void UpdatePalette(Color[] palette) - { - // For Rgb24, we get a new frame for each color rotation. - // But for ColoredGray6, we have to trigger the frame with - // an updated palette here. - if (_lastFrame != null) { - SetPalette(palette); - ZeDMD_RenderColoredGray6(_pZeDMD, _lastFrame.Data, null); - } + // no palette support here. } - public void SetColor(Color color) { - SetPalette(ColorUtil.GetPalette(new[] { Colors.Black, color }, 4)); + // no palette support here. } + public void ClearPalette() { } @@ -179,34 +144,6 @@ public void ClearColor() #endif protected static extern void ZeDMD_EnableDebug(IntPtr pZeDMD); -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_EnablePreDownscaling(IntPtr pZeDMD); - -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_DisablePreDownscaling(IntPtr pZeDMD); - -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_EnablePreUpscaling(IntPtr pZeDMD); - -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_DisablePreUpscaling(IntPtr pZeDMD); - #if PLATFORM_X64 [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] #else @@ -221,13 +158,6 @@ public void ClearColor() #endif protected static extern void ZeDMD_DisableUpscaling(IntPtr pZeDMD); -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_EnforceStreaming(IntPtr pZeDMD); - #if PLATFORM_X64 [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] #else @@ -256,13 +186,6 @@ public void ClearColor() #endif protected static extern void ZeDMD_SetFrameSize(IntPtr pZeDMD, int width, int height); -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_SetPalette(IntPtr pZeDMD, byte[] palette, int numColors); - #if PLATFORM_X64 [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] #else @@ -275,42 +198,14 @@ public void ClearColor() #else [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] #endif - protected static extern void ZeDMD_RenderGray2(IntPtr pZeDMD, byte[] frame); - -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_RenderGray4(IntPtr pZeDMD, byte[] frame); - -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_RenderColoredGray6(IntPtr pZeDMD, byte[] frame, byte[] rotations); - -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_RenderRgb24(IntPtr pZeDMD, byte[] frame); - -#if PLATFORM_X64 - [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#else - [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] -#endif - protected static extern void ZeDMD_RenderRgb24EncodedAs565(IntPtr pZeDMD, byte[] frame); + protected static extern void ZeDMD_RenderRgb888(IntPtr pZeDMD, byte[] frame); #if PLATFORM_X64 [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] #else [DllImport("zedmd.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] #endif - protected static extern void ZeDMD_RenderRgb16(IntPtr pZeDMD, byte[] frame); + protected static extern void ZeDMD_RenderRgb565(IntPtr pZeDMD, byte[] frame); #if PLATFORM_X64 [DllImport("zedmd64.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] diff --git a/LibDmd/Output/ZeDMD/ZeDMDHD.cs b/LibDmd/Output/ZeDMD/ZeDMDHD.cs index 6d57b46a..c74257fb 100644 --- a/LibDmd/Output/ZeDMD/ZeDMDHD.cs +++ b/LibDmd/Output/ZeDMD/ZeDMDHD.cs @@ -7,8 +7,7 @@ namespace LibDmd.Output.ZeDMD /// Check "ZeDMD Project Page" https://github.com/PPUC/ZeDMD) for details. /// This implementation supports ZeDMD and ZeDMD HD. /// - public class ZeDMDHD : ZeDMDBase, IGray2Destination, IGray4Destination, IColoredGray2Destination, IColoredGray4Destination, - IColoredGray6Destination, IRgb565Destination, IFixedSizeDestination, IColorRotationDestination + public class ZeDMDHD : ZeDMDBase, IRgb24Destination, IRgb565Destination, IFixedSizeDestination { public override string Name => "ZeDMD HD"; public virtual Dimensions FixedSize { get; } = new Dimensions(256, 64); @@ -45,57 +44,18 @@ protected ZeDMDHD() ZeDMD_SetFrameSize(_pZeDMD, FixedSize.Width, FixedSize.Height); } - public void RenderGray2(DmdFrame frame) - { - DmdAllowHdScaling = true; - ZeDMD_EnablePreUpscaling(_pZeDMD); - ZeDMD_RenderGray2(_pZeDMD, frame.Data); - } - - public void RenderColoredGray2(ColoredFrame frame) - { - DmdAllowHdScaling = true; - ZeDMD_EnablePreUpscaling(_pZeDMD); - SetPalette(frame.Palette); - ZeDMD_RenderGray2(_pZeDMD, frame.Data); - } - - public void RenderGray4(DmdFrame frame) - { - DmdAllowHdScaling = true; - ZeDMD_DisablePreUpscaling(_pZeDMD); - ZeDMD_RenderGray4(_pZeDMD, frame.Data); - } - - public void RenderColoredGray4(ColoredFrame frame) - { - DmdAllowHdScaling = true; - ZeDMD_DisablePreUpscaling(_pZeDMD); - SetPalette(frame.Palette); - ZeDMD_RenderGray4(_pZeDMD, frame.Data); - } - - public void RenderColoredGray6(ColoredFrame frame) - { - DmdAllowHdScaling = true; - ZeDMD_EnablePreUpscaling(_pZeDMD); - SetPalette(frame.Palette); - ZeDMD_RenderColoredGray6(_pZeDMD, frame.Data, null); - _lastFrame = (ColoredFrame)frame.Clone(); - } - public void RenderRgb24(DmdFrame frame) { DmdAllowHdScaling = ScaleRgb24; - ZeDMD_EnablePreUpscaling(_pZeDMD); - ZeDMD_RenderRgb24EncodedAs565(_pZeDMD, frame.Data); + if (!ScaleRgb24) { ZeDMD_DisableUpscaling(_pZeDMD); } + ZeDMD_RenderRgb888(_pZeDMD, frame.Data); } public void RenderRgb565(DmdFrame frame) { - DmdAllowHdScaling = ScaleRgb24; - ZeDMD_EnablePreUpscaling(_pZeDMD); - ZeDMD_RenderRgb16(_pZeDMD, frame.Data); + DmdAllowHdScaling = true; + ZeDMD_EnableUpscaling(_pZeDMD); + ZeDMD_RenderRgb565(_pZeDMD, frame.Data); } } } diff --git a/LibDmd/Output/ZeDMD/ZeDMDHDWiFi.cs b/LibDmd/Output/ZeDMD/ZeDMDHDWiFi.cs index 2e8f7385..65023d60 100644 --- a/LibDmd/Output/ZeDMD/ZeDMDHDWiFi.cs +++ b/LibDmd/Output/ZeDMD/ZeDMDHDWiFi.cs @@ -7,8 +7,7 @@ namespace LibDmd.Output.ZeDMD /// Check "ZeDMD Project Page" https://github.com/PPUC/ZeDMD) for details. /// This implementation supports ZeDMD and ZeDMD HD. /// - public class ZeDMDHDWiFi : ZeDMDWiFiBase, IGray2Destination, IGray4Destination, IColoredGray2Destination, - IColoredGray4Destination, IRgb565Destination, IColoredGray6Destination, IFixedSizeDestination, IColorRotationDestination + public class ZeDMDHDWiFi : ZeDMDWiFiBase, IRgb24Destination, IRgb565Destination, IFixedSizeDestination { public override string Name => "ZeDMD HD WiFi"; public virtual Dimensions FixedSize { get; } = new Dimensions(256, 64); @@ -36,50 +35,15 @@ public static ZeDMDHDWiFi GetInstance(bool debug, int brightness, int rgbOrder, ZeDMD_SetFrameSize(_pZeDMD, FixedSize.Width, FixedSize.Height); } - public void RenderGray2(DmdFrame frame) - { - DmdAllowHdScaling = true; - ZeDMD_RenderGray2(_pZeDMD, frame.Data); - } - - public void RenderColoredGray2(ColoredFrame frame) - { - DmdAllowHdScaling = true; - SetPalette(frame.Palette); - ZeDMD_RenderGray2(_pZeDMD, frame.Data); - } - - public void RenderGray4(DmdFrame frame) - { - DmdAllowHdScaling = true; - ZeDMD_RenderGray4(_pZeDMD, frame.Data); - } - - public void RenderColoredGray4(ColoredFrame frame) - { - DmdAllowHdScaling = true; - SetPalette(frame.Palette); - ZeDMD_RenderGray4(_pZeDMD, frame.Data); - } - - public void RenderColoredGray6(ColoredFrame frame) - { - DmdAllowHdScaling = true; - SetPalette(frame.Palette); - ZeDMD_RenderColoredGray6(_pZeDMD, frame.Data, null); - _lastFrame = (ColoredFrame)frame.Clone(); - } - public void RenderRgb24(DmdFrame frame) { DmdAllowHdScaling = ScaleRgb24; - ZeDMD_RenderRgb24EncodedAs565(_pZeDMD, frame.Data); + ZeDMD_RenderRgb888(_pZeDMD, frame.Data); } public void RenderRgb565(DmdFrame frame) { - DmdAllowHdScaling = ScaleRgb24; - ZeDMD_RenderRgb16(_pZeDMD, frame.Data); + ZeDMD_RenderRgb565(_pZeDMD, frame.Data); } } } diff --git a/LibDmd/Output/ZeDMD/ZeDMDWiFi.cs b/LibDmd/Output/ZeDMD/ZeDMDWiFi.cs index 57b07017..850ce608 100644 --- a/LibDmd/Output/ZeDMD/ZeDMDWiFi.cs +++ b/LibDmd/Output/ZeDMD/ZeDMDWiFi.cs @@ -7,8 +7,7 @@ namespace LibDmd.Output.ZeDMD /// Check "ZeDMD Project Page" https://github.com/PPUC/ZeDMD) for details. /// This implementation supports ZeDMD and ZeDMD HD. /// - public class ZeDMDWiFi : ZeDMDWiFiBase, IGray2Destination, IGray4Destination, IColoredGray2Destination, - IColoredGray4Destination, IRgb565Destination, IColoredGray6Destination, IMultiSizeDestination, IColorRotationDestination + public class ZeDMDWiFi : ZeDMDWiFiBase, IRgb24Destination, IRgb565Destination, IMultiSizeDestination { public override string Name => "ZeDMD WiFi"; // To leverage ZeDMD's own advanced downscaling we can't use FixedSize and RGB24Stream like ZeDMD HD. @@ -37,8 +36,6 @@ public static ZeDMDWiFi GetInstance(bool debug, int brightness, int rgbOrder, st { base.Init(); ZeDMD_SetFrameSize(_pZeDMD, _currentDimensions.Width, _currentDimensions.Height); - ZeDMD_EnablePreDownscaling(_pZeDMD); - ZeDMD_EnablePreUpscaling(_pZeDMD); } private void SetDimensions(Dimensions newDim) @@ -49,50 +46,16 @@ private void SetDimensions(Dimensions newDim) } } - public void RenderGray2(DmdFrame frame) - { - SetDimensions(frame.Dimensions); - ZeDMD_RenderGray2(_pZeDMD, frame.Data); - } - - public void RenderColoredGray2(ColoredFrame frame) - { - SetDimensions(frame.Dimensions); - SetPalette(frame.Palette); - ZeDMD_RenderGray2(_pZeDMD, frame.Data); - } - - public void RenderGray4(DmdFrame frame) - { - SetDimensions(frame.Dimensions); - ZeDMD_RenderGray4(_pZeDMD, frame.Data); - } - - public void RenderColoredGray4(ColoredFrame frame) - { - SetDimensions(frame.Dimensions); - SetPalette(frame.Palette); - ZeDMD_RenderGray4(_pZeDMD, frame.Data); - } - - public void RenderColoredGray6(ColoredFrame frame) - { - SetDimensions(frame.Dimensions); - SetPalette(frame.Palette); - ZeDMD_RenderColoredGray6(_pZeDMD, frame.Data, null); - _lastFrame = (ColoredFrame)frame.Clone(); - } - public void RenderRgb24(DmdFrame frame) { SetDimensions(frame.Dimensions); - ZeDMD_RenderRgb24EncodedAs565(_pZeDMD, frame.Data); + ZeDMD_RenderRgb888(_pZeDMD, frame.Data); } public void RenderRgb565(DmdFrame frame) { SetDimensions(frame.Dimensions); - ZeDMD_RenderRgb16(_pZeDMD, frame.Data); + ZeDMD_RenderRgb565(_pZeDMD, frame.Data); } } }