Exemplo n.º 1
0
        /// <summary>
        /// Kreed's SuperSaI
        /// </summary>
        public static void SuperSaI(IPixelWorker <sPixel> worker)
        {
            var c0 = worker.SourceM1M1();
            var c1 = worker.SourceP0M1();
            var c2 = worker.SourceP1M1();
            var d3 = worker.SourceP2M1();
            var c3 = worker.SourceM1P0();
            var c4 = worker.SourceP0P0();
            var c5 = worker.SourceP1P0();
            var d4 = worker.SourceP2P0();
            var c6 = worker.SourceM1P1();
            var c7 = worker.SourceP0P1();
            var c8 = worker.SourceP1P1();
            var d5 = worker.SourceP2P1();
            var d0 = worker.SourceM1P2();
            var d1 = worker.SourceP0P2();
            var d2 = worker.SourceP1P2();
            var d6 = worker.SourceP2P2();

            sPixel e01, e10, e11;
            var    e00 = e01 = e11 = c4;

            if (c7.IsLike(c5) && c4.IsNotLike(c8))
            {
                var c57 = sPixel.Interpolate(c7, c5);
                e11 = c57;
                e01 = c57;
            }
            else if (c4.IsLike(c8) && c7.IsNotLike(c5))
            {
                //nothing
            }
            else if (c4.IsLike(c8) && c7.IsLike(c5))
            {
                var c57    = sPixel.Interpolate(c7, c5);
                var c48    = sPixel.Interpolate(c4, c8);
                var conc2D = 0;
                conc2D += _Conc2D(c57, c48, c6, d1);
                conc2D += _Conc2D(c57, c48, c3, c1);
                conc2D += _Conc2D(c57, c48, d2, d5);
                conc2D += _Conc2D(c57, c48, c2, d4);

                if (conc2D > 0)
                {
                    e11 = c57;
                    e01 = c57;
                }
                else if (conc2D == 0)
                {
                    e11 = sPixel.Interpolate(c48, c57);
                    e01 = sPixel.Interpolate(c48, c57);
                }
            }
            else
            {
                if (c8.IsLike(c5) && c8.IsLike(d1) && c7.IsNotLike(d2) && c8.IsNotLike(d0))
                {
                    e11 = sPixel.Interpolate(sPixel.Interpolate(c8, c5, d1), c7, 3, 1);
                }
                else if (c7.IsLike(c4) && c7.IsLike(d2) && c7.IsNotLike(d6) && c8.IsNotLike(d1))
                {
                    e11 = sPixel.Interpolate(sPixel.Interpolate(c7, c4, d2), c8, 3, 1);
                }
                else
                {
                    e11 = sPixel.Interpolate(c7, c8);
                }
                if (c5.IsLike(c8) && c5.IsLike(c1) && c5.IsNotLike(c0) && c4.IsNotLike(c2))
                {
                    e01 = sPixel.Interpolate(sPixel.Interpolate(c5, c8, c1), c4, 3, 1);
                }
                else if (c4.IsLike(c7) && c4.IsLike(c2) && c5.IsNotLike(c1) && c4.IsNotLike(d3))
                {
                    e01 = sPixel.Interpolate(sPixel.Interpolate(c4, c7, c2), c5, 3, 1);
                }
                else
                {
                    e01 = sPixel.Interpolate(c4, c5);
                }
            }
            if (c4.IsLike(c8) && c4.IsLike(c3) && c7.IsNotLike(c5) && c4.IsNotLike(d2))
            {
                e10 = sPixel.Interpolate(c7, sPixel.Interpolate(c4, c8, c3));
            }
            else if (c4.IsLike(c6) && c4.IsLike(c5) && c7.IsNotLike(c3) && c4.IsNotLike(d0))
            {
                e10 = sPixel.Interpolate(c7, sPixel.Interpolate(c4, c6, c5));
            }
            else
            {
                e10 = c7;
            }

            if (c7.IsLike(c5) && c7.IsLike(c6) && c4.IsNotLike(c8) && c7.IsNotLike(c2))
            {
                e00 = sPixel.Interpolate(sPixel.Interpolate(c7, c5, c6), c4);
            }
            else if (c7.IsLike(c3) && c7.IsLike(c8) && c4.IsNotLike(c6) && c7.IsNotLike(c0))
            {
                e00 = sPixel.Interpolate(sPixel.Interpolate(c7, c3, c8), c4);
            }

            worker.TargetP0P0(e00);
            worker.TargetP1P0(e01);
            worker.TargetP0P1(e10);
            worker.TargetP1P1(e11);
        }