public CompressedDesktop GetCompressedReferenceDesktop()
        {
            // New compressed desktop
            CompressedDesktop Desktop = new CompressedDesktop();

            // Get ref image
            Xor = new XOR();
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Start Watch
            StartWatch();
            // Capture desktop with mouse
            ReferenceImage = Capture.CaptureDesktop();
            // Calc capturing time
            Desktop.PackingTime.CapturingTime = StopWatch();
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Save the ref image in Xor object for later comparison
            Xor.SetRefImage(new Bitmap(ReferenceImage));
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Start Watch
            StartWatch();
            // Temp compressed desktop
            CompressedDesktop _Desktop = Compressor.CompressDesktop(ReferenceImage);

            // Calc compression time
            Desktop.PackingTime.CompressionTime = StopWatch();
            // Assign compressed image
            Desktop.ImageBytes = _Desktop.ImageBytes;
            // Assign compressed sizes
            Desktop.CompressionSizes = _Desktop.CompressionSizes;
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Return compressed desktop
            return(Desktop);
        }
        public DecompressedDesktop GetDecompressedDifferenceDesktop(CompressedDesktop PresenterDesktop)
        {
            // New decompressed desktop
            DecompressedDesktop Desktop = new DecompressedDesktop();

            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Start Watch
            StartWatch();
            // Unpack compressed desktop
            DecompressedDesktop _Desktop = Decompressor.DecompressDesktop(PresenterDesktop);

            // Calc decompression time
            Desktop.UnpackingTime.CompressionTime = StopWatch();
            // Assign decompressed image
            Desktop.Image = _Desktop.Image;
            // Assign decompressed sizes
            Desktop.DecompressionSizes = _Desktop.DecompressionSizes;
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Start Watch
            StartWatch();
            // Xor the difference image with the reference image, and assign the result to desktop.image
            Desktop.Image = Xor.XORing(new Bitmap(Desktop.Image));
            // Calc Xoring time
            Desktop.UnpackingTime.XoringTime = StopWatch();
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Keep instance of reference image in XOR object to compare it later with new difference
            Xor.SetRefImage(new Bitmap(Desktop.Image));
            // return ready to use desktop image, with cursor included!
            return(Desktop);
        }
        public DecompressedDesktop GetDecompressedReferenceDesktop(CompressedDesktop PresenterDesktop)
        {
            // New decompressed desktop
            DecompressedDesktop Desktop = new DecompressedDesktop();

            // New XOR object
            Xor = new XOR();
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Start Watch
            StartWatch();
            // Unpack compressed desktop
            DecompressedDesktop _Desktop = Decompressor.DecompressDesktop(PresenterDesktop);

            // Calc decompression time
            Desktop.UnpackingTime.CompressionTime = StopWatch();
            // Assign decompressed image
            Desktop.Image = _Desktop.Image;
            // Assign decompressed sizes
            Desktop.DecompressionSizes = _Desktop.DecompressionSizes;
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Save the ref image in the XOR object
            Xor.SetRefImage(new Bitmap(Desktop.Image));
            // return ready to use desktop image, with cursor included!
            return(Desktop);
        }
        public DecompressedDesktop DecompressDesktop(CompressedDesktop CDesktop)
        {
            // New instance of decompressed image structure
            DecompressedDesktop DDesktop = new DecompressedDesktop();

            // Store the size of image before decompression
            DDesktop.DecompressionSizes.SizeBefore = CDesktop.ImageBytes.LongLength;
            // Decompressing the image
            byte[] DecompressedImageBytes = AcedInflator.Instance.Decompress(CDesktop.ImageBytes, 0, 0, 0);
            // Store the size of image after decompression
            DDesktop.DecompressionSizes.SizeAfter = DecompressedImageBytes.LongLength;
            // Set image object
            DDesktop.Image = new Bitmap(ImageConverter.ByteArrayToImage(DecompressedImageBytes));
            // Return decompressed image
            return(DDesktop);
        }
        public CompressedDesktop CompressDesktop(Bitmap DesktopImage)
        {
            // New instance of compressed image structure
            CompressedDesktop Desktop = new CompressedDesktop();

            // Convert the given image to byte[]
            byte[] ImageToBytes = ImageConverter.ImageToByteArray(DesktopImage);
            // Store the size of image before compression
            Desktop.CompressionSizes.SizeBefore = ImageToBytes.LongLength;
            // Compressing the image
            byte[] CompressedImage = AcedDeflator.Instance.Compress(ImageToBytes, 0, ImageToBytes.Length, Global.CompressionLevel, 0, 0);
            // Store the size of image after compression
            Desktop.CompressionSizes.SizeAfter = CompressedImage.LongLength;
            // Set image byte[]
            Desktop.ImageBytes = CompressedImage;
            // Return compressed image as a CompressedDesktop object
            return(Desktop);
        }
        public CompressedDesktop GetCompressedDifferenceDesktop()
        {
            // New compressed desktop
            CompressedDesktop Desktop = new CompressedDesktop();

            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Start Watch
            StartWatch();
            // Capture the desktop
            ReferenceImage = Capture.CaptureDesktop();
            // Calc capturing time
            Desktop.PackingTime.CapturingTime = StopWatch();
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Start Watch
            StartWatch();
            // XOR ref image with newly captured image
            ResultImage = Xor.XORing(new Bitmap(ReferenceImage));
            // Calc Xoring time
            Desktop.PackingTime.XoringTime = StopWatch();
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Start Watch
            StartWatch();
            // Temp compressed desktop
            CompressedDesktop _Desktop = Compressor.CompressDesktop(ResultImage);

            // Calc compression time
            Desktop.PackingTime.CompressionTime = StopWatch();
            // Save the ref image to use it later.
            Xor.SetRefImage(new Bitmap(ReferenceImage));
            // Assign compressed image
            Desktop.ImageBytes = _Desktop.ImageBytes;
            // Assign compressed sizes
            Desktop.CompressionSizes = _Desktop.CompressionSizes;
            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
            // Clean
            ReferenceImage = null;
            ResultImage    = null;
            // Return
            return(Desktop);
        }