/// <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); }
/// <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); }