using System; namespace ScreenConnect; public class ScreenCodecFactory { private static int DefaultZStandardCompressionLevel => 6; private static int DefaultZStandardWindowLog => 28; private static int TestZStandardWindowLog => 20; public ScreenCodec CreateEncoder(ScreenCodecID codecID) { return codecID switch { ScreenCodecID.Grayscale_DeflateDefault_ZlibWrapper => new GrayscaleScreenEncoder(new DeflateEncoder(CoderCompressionLevel.Default, CoderCompressionStrategy.Default, DeflateWrapper.Zlib)), ScreenCodecID.TrueColor_DeflateDefault_ZlibWrapper_RowPrefix => new TrueColorScreenEncoder(new DeflateEncoder(CoderCompressionLevel.Default, CoderCompressionStrategy.Default, DeflateWrapper.Zlib), useRowFilter: true), ScreenCodecID.TrueColorEx_DeflateDefault => throw new NotSupportedException(), ScreenCodecID.TrueColor_DeflateDefault => new TrueColorScreenEncoder(new DeflateEncoder(CoderCompressionLevel.Default, CoderCompressionStrategy.Default, DeflateWrapper.None), useRowFilter: false), ScreenCodecID.WebColor_DeflateDefault => new WebColorScreenEncoder(new DeflateEncoder(CoderCompressionLevel.Default, CoderCompressionStrategy.Default, DeflateWrapper.None)), ScreenCodecID.Grayscale_DeflateDefault => new GrayscaleScreenEncoder(new DeflateEncoder(CoderCompressionLevel.Default, CoderCompressionStrategy.Default, DeflateWrapper.None)), ScreenCodecID.TrueColor_DeflateHighSpeed => new TrueColorScreenEncoder(new DeflateEncoder(CoderCompressionLevel.BestSpeed, CoderCompressionStrategy.Default, DeflateWrapper.None), useRowFilter: false), ScreenCodecID.WebColor_DeflateHighSpeed => new WebColorScreenEncoder(new DeflateEncoder(CoderCompressionLevel.BestSpeed, CoderCompressionStrategy.Default, DeflateWrapper.None)), ScreenCodecID.Grayscale_DeflateHighSpeed => new GrayscaleScreenEncoder(new DeflateEncoder(CoderCompressionLevel.BestSpeed, CoderCompressionStrategy.Default, DeflateWrapper.None)), ScreenCodecID.WebP => new WebPEncoder(80f), ScreenCodecID.TrueColor_ZStandard => new TrueColorScreenEncoder(new ZStandardEncoder(DefaultZStandardCompressionLevel, DefaultZStandardWindowLog), useRowFilter: false), ScreenCodecID.WebColor_ZStandard => new WebColorScreenEncoder(new ZStandardEncoder(DefaultZStandardCompressionLevel, DefaultZStandardWindowLog)), ScreenCodecID.Grayscale_ZStandard => new GrayscaleScreenEncoder(new ZStandardEncoder(DefaultZStandardCompressionLevel, DefaultZStandardWindowLog)), ScreenCodecID.TestCoder_ZStandard => new TrueColorScreenEncoder(new ZStandardEncoder(DefaultZStandardCompressionLevel, TestZStandardWindowLog), useRowFilter: false), ScreenCodecID.TrueColor_Raw => new TrueColorScreenEncoder(null, useRowFilter: false), ScreenCodecID.WebColor_Raw => new WebColorScreenEncoder(null), ScreenCodecID.Grayscale_Raw => new GrayscaleScreenEncoder(null), _ => throw new ArgumentOutOfRangeException(), }; } public ScreenCodec CreateDecoder(ScreenCodecID codecID) { switch (codecID) { case ScreenCodecID.Grayscale_DeflateDefault_ZlibWrapper: return new GrayscaleScreenDecoder(new DeflateDecoder(DeflateWrapper.Zlib)); case ScreenCodecID.TrueColor_DeflateDefault_ZlibWrapper_RowPrefix: return new TrueColorFilterScreenDecoder(new DeflateDecoder(DeflateWrapper.Zlib)); case ScreenCodecID.TrueColorEx_DeflateDefault: throw new NotSupportedException(); case ScreenCodecID.TrueColor_ZStandard: return new TrueColorScreenDecoder(new ZStandardDecoder()); case ScreenCodecID.WebColor_ZStandard: return new WebColorScreenDecoder(new ZStandardDecoder()); case ScreenCodecID.Grayscale_ZStandard: return new GrayscaleScreenDecoder(new ZStandardDecoder()); case ScreenCodecID.TrueColor_DeflateDefault: case ScreenCodecID.TrueColor_DeflateHighSpeed: return new TrueColorScreenDecoder(CreateDeflateDecoder(DeflateWrapper.None)); case ScreenCodecID.WebColor_DeflateDefault: case ScreenCodecID.WebColor_DeflateHighSpeed: return new WebColorScreenDecoder(CreateDeflateDecoder(DeflateWrapper.None)); case ScreenCodecID.Grayscale_DeflateDefault: case ScreenCodecID.Grayscale_DeflateHighSpeed: return new GrayscaleScreenDecoder(CreateDeflateDecoder(DeflateWrapper.None)); case ScreenCodecID.TrueColor_Raw: return new TrueColorScreenDecoder(null); case ScreenCodecID.WebColor_Raw: return new WebColorScreenDecoder(null); case ScreenCodecID.Grayscale_Raw: return new GrayscaleScreenDecoder(null); case ScreenCodecID.WebP: return new WebPDecoder(); default: throw new ArgumentOutOfRangeException(); } } protected virtual IMultiCallCoder CreateDeflateDecoder(DeflateWrapper wrapper) { return new DeflateDecoder(wrapper); } }