/// <summary>
        /// Tuät luägä obs Frame mit und ohni Maskä mätscht. Faus ja de wirds
        /// grad aagwandt, d.h. Palettäwächsu odr Animazion, und d Planes womer
        /// berächnet hend zrugggäh, und faus nei gits null zrugg.
        /// </summary>
        /// <param name="frame">S Frame wo grad cho isch</param>
        /// <returns></returns>
        protected byte[][] HashFrame(byte[] frame)
        {
            // Zersch dimmer s Frame i Planes uifteilä
            var planes = FrameUtil.Split(Dimensions.Value.Width, Dimensions.Value.Height, 4, frame);
            var match  = false;

            // Jedi Plane wird einisch duräghäscht
            for (var i = 0; i < 4; i++)
            {
                var checksum = FrameUtil.Checksum(planes[i]);

                // Wemer dr Häsch hett de luägemr grad obs ächt äs Mäpping drzuäg git
                match = ApplyMapping(planes, checksum, "unmasked");

                // Faus ja de grad awändä und guät isch
                if (match)
                {
                    break;
                }
            }

            // Faus nei de gemmr Maskä fir Maskä durä und luägid ob da eppis passt
            if (!match && Coloring.Masks.Length > 0)
            {
                var maskedPlane = new byte[512];
                for (var i = 0; i < 4; i++)
                {
                    foreach (var mask in Coloring.Masks)
                    {
                        var plane = new BitArray(planes[i]);
                        plane.And(new BitArray(mask)).CopyTo(maskedPlane, 0);
                        var checksum = FrameUtil.Checksum(maskedPlane);
                        if (ApplyMapping(planes, checksum, "masked"))
                        {
                            match = true;
                            break;
                        }
                    }
                }
            }

            if (!match)
            {
                LastChecksum = 0x0;
            }

            // Wenn än Animazion am laifä nisch de wird niid zrugg gäh
            return(IsAnimationRunning ? null : planes);
        }
Example #2
0
        /// <summary>
        /// Tuät Bitplane fir Bitplane häschä unds erschtä Mäpping wo gfundä
        /// wordä isch zrugg gäh.
        /// </summary>
        /// <param name="planes">Bitplanes vom Biud</param>
        /// <returns>Mäpping odr null wenn nid gfundä</returns>
        private Mapping FindMapping(byte[][] planes)
        {
            var maskSize = Dimensions.Value.Width * Dimensions.Value.Height / 8;

            // Jedi Plane wird einisch duräghäscht
            for (var i = 0; i < 2; i++)
            {
                var checksum = FrameUtil.Checksum(planes[i]);

                var mapping = _coloring.FindMapping(checksum);
                if (mapping != null)
                {
                    return(mapping);
                }

                // Wenn kä Maskä definiert, de nächschti Bitplane
                if (_coloring.Masks == null || _coloring.Masks.Length <= 0)
                {
                    continue;
                }

                // Sisch gemmr Maskä fir Maskä durä und luägid ob da eppis passt
                var maskedPlane = new byte[maskSize];
                foreach (var mask in _coloring.Masks)
                {
                    var plane = new BitArray(planes[i]);
                    plane.And(new BitArray(mask)).CopyTo(maskedPlane, 0);
                    checksum = FrameUtil.Checksum(maskedPlane);
                    mapping  = _coloring.FindMapping(checksum);
                    if (mapping != null)
                    {
                        return(mapping);
                    }
                }
            }
            return(null);
        }
        /// <summary>
        /// Tuät luägä obs Frame mit und ohni Maskä mätscht. Faus ja de wirds
        /// grad aagwandt, d.h. Palettäwächsu odr Animazion, und d Planes womer
        /// berächnet hend zrugggäh, und faus nei gits null zrugg.
        /// </summary>
        /// <remarks>
        /// Äs cha si dass meh Planes as vorhär zruggäh wärdit, i dem Fau ischs
        /// Frame erwiitered wordä.
        /// </remarks>
        /// <param name="frame">S Frame wo grad cho isch</param>
        /// <returns></returns>
        protected byte[][] HashFrame(byte[] frame)
        {
            // Zersch dimmer s Frame i Planes uifteilä
            var planes = FrameUtil.Split(Dimensions.Value.Width, Dimensions.Value.Height, 2, frame);
            var match  = false;

            // Jedi Plane wird einisch duräghäscht
            for (var i = 0; i < 2; i++)
            {
                var checksum = FrameUtil.Checksum(planes[i]);

                //FrameUtil.DumpBinary(Width, Height, planes[i]);
                //Logger.Trace("Hash bit {0}: {1}", i, checksum.ToString("X"));

                // Wemer dr Häsch hett de luägemr grad obs ächt äs Mäpping drzuäg git
                match = ApplyMapping(planes, checksum, "unmasked");

                // Faus ja de grad awändä und guät isch
                if (match)
                {
                    break;
                }
            }

            // Faus nei de gemmr Maskä fir Maskä durä und luägid ob da eppis passt
            if (!match && Coloring.Masks.Length > 0)
            {
                var maskedPlane = new byte[512];
                for (var i = 0; i < 2; i++)
                {
                    foreach (var mask in Coloring.Masks)
                    {
                        var plane = new BitArray(planes[i]);
                        plane.And(new BitArray(mask)).CopyTo(maskedPlane, 0);
                        var checksum = FrameUtil.Checksum(maskedPlane);
                        if (ApplyMapping(planes, checksum, "masked"))
                        {
                            match = true;
                            break;
                        }
                    }
                }
            }
            if (!match)
            {
                LastChecksum = 0x0;
            }

            // Wenn än Animazion am laifä nisch de wird niid zrugg gäh
            if (IsAnimationRunning)
            {
                //Logger.Trace("[timing] VPM Frame #{0} dropped ({1} ms).", FrameCounter++, (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - LastFrame);
                return(null);
            }

            // Wenn än Enhancer am laifä nisch de wirds Biud a däh gschickt
            if (IsEnhancerRunning)
            {
                CurrentEnhancer.NextVpmFrame(planes);
                //Logger.Trace("[timing] VPM Frame #{0} updated ({1} ms).", FrameCounter++, (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - LastFrame);
                return(null);
            }

            return(planes);
        }