示例#1
0
 public ASSEvent CreatePixel(double start, double end, int x, int y, string c1, string a1)
 {
     return
         (new ASSEvent
     {
         Start = start,
         End = end,
         Layer = 0,
         Style = "pt",
         Effect = "",
         MarginL = "0000",
         MarginR = "0000",
         MarginV = "0000",
         Name = "NTP",
         Text = ASSEffect.pos(x, y) + ASSEffect.c(1, c1) + ASSEffect.a(1, a1) + ASSEffect.frz(90) + '.'
     });
 }
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            Random rnd = new Random();

            string ptstr = @"{\p1}m 0 0 l 1 0 1 1 0 1";

            char       ch   = '雨';
            int        x    = 300;
            int        y    = 300;
            double     r0   = 15;
            double     r1   = 30;
            string     col1 = "FFFC94";
            string     col2 = "FF94D1";
            string     col3 = "FFFFFF";
            StringMask mask = GetMask(ch + "", x, y);

            double t0 = 0;
            double t3 = 10;

            ass_out.AppendEvent(0, "Default", t0, t3,
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "FF") + ASSEffect.c(1, col2) +
                                ASSEffect.a(3, "FF") +
                                ch);
            for (int i = 0; i < 1; i++)
            {
                ass_out.AppendEvent(0, "Default", t0, t3,
                                    ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, col2) +
                                    ASSEffect.org(x - 200, y) + ASSEffect.t(0, t3 - t0, ASSEffect.fry(-360).t()) +
                                    ASSEffect.a(3, "FF") + ASSEffect.be(1) + ASSEffect.bord(0) +
                                    ASSEffect.t(0, (t3 - t0) * 0.125, ASSEffect.fscx(30).t()) +
                                    ASSEffect.t((t3 - t0) * 0.125, (t3 - t0) * 0.125 * 2, ASSEffect.fscx(100).t()) +
                                    ASSEffect.t(0, (t3 - t0) * 0.25, ASSEffect.fscy(40).t()) +
                                    ASSEffect.bord(1) +
                                    ch);
            }

            /*
             * for (int agi = 0; agi < 360; agi += 20)
             * {
             *  double x0 = x + r0 * Math.Cos(0);
             *  double y0 = y + r0 * Math.Sin(0);
             *  double x1 = x + r1 * Math.Cos(0);
             *  double y1 = y + r1 * Math.Sin(0);
             *
             *  double t0 = 1;
             *  double t1 = t0 + 1.8;
             *
             *  ass_out.AppendEvent(2, "pt", t0, t1,
             *      ASSEffect.an(5) +
             *      ASSEffect.move(x0, y0, x1, y1) + ASSEffect.org(x, y) + ASSEffect.frz(agi) +
             *      ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
             *      ASSEffect.a(3, "44") + ASSEffect.c(3, "FFFFFF") +
             *      ASSEffect.t(0, t1 - t0, ASSEffect.frz(agi + 360).t()) +
             *      ASSEffect.ybord(10) + ASSEffect.xbord(0) + ASSEffect.be(1) +
             *      ptstr);
             *
             *  ass_out.AppendEvent(2, "pt", t0, t1,
             *      ASSEffect.an(5) +
             *      ASSEffect.move(x0, y0, x1, y1) + ASSEffect.org(x, y) + ASSEffect.frz(agi) +
             *      ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
             *      ASSEffect.a(3, "22") + ASSEffect.c(3, col1) +
             *      ASSEffect.t(0, t1 - t0, ASSEffect.frz(agi + 360).t()) +
             *      ASSEffect.ybord(11) + ASSEffect.xbord(0) + ASSEffect.blur(2) +
             *      ptstr);
             * }
             * */

            ass_out.SaveFile(OutFileName);
        }
示例#3
0
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            Random rnd = new Random();

            string ptstr  = @"{\p1}m 0 0 l 1 0 1 1 0 1";
            string pt1str = @"{\p4}m 0 0 l 50 49 100 0 51 50 100 100 50 51 0 100 49 50 0 0 m 45 45 s 55 45 55 55 45 55 c{\p0}";

            double dy = -0.5;
            double y  = 200;
            int    yl = 190;
            int    yh = 210;
            int    ag = 0;

            for (int x = 100; x <= 700; x++)
            {
                if (y == yh)
                {
                    dy = -0.5;
                }
                if (y == yl)
                {
                    dy = 0.5;
                }
                y  += dy;
                ag += 1;

                double t0 = (double)(x - 100) / 100;

                ass_out.AppendEvent(0, "pt", t0, t0 + 2,
                                    ASSEffect.pos(x, y) + ASSEffect.an(5) +
                                    ASSEffect.a(1, "E0") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "F0") + ASSEffect.c(3, "FFFFFF") + ASSEffect.bord(2) + ASSEffect.be(1) +
                                    ASSEffect.frx(ag) + ASSEffect.fry(ag) + ASSEffect.frz(ag) +
                                    ASSEffect.fad(0, 2) +
                                    ASSEffect.t(0, 2, ASSEffect.fsc(500, 500).t()) +
                                    pt1str);
            }

            ass_out.SaveFile(OutFileName);
        }
示例#4
0
        public ASSEvent CreateMovingPixel(double start, double end, int x0, int y0, int x1, int y1, string c1, string a1, int fade_mode)
        {
            string fade_string = "";

            switch (fade_mode)
            {
            case 0: break;

            case 1: fade_string = ASSEffect.fad(end - start, 0); break;

            case 2: fade_string = ASSEffect.fad(0, end - start); break;

            default: break;
            }
            return
                (new ASSEvent
            {
                Start = start,
                End = end,
                Layer = 0,
                Style = "pt",
                Effect = "",
                MarginL = "0000",
                MarginR = "0000",
                MarginV = "0000",
                Name = "NTP",
                Text = fade_string + ASSEffect.move(x0, y0, x1, y1) + ASSEffect.c(1, c1) + ASSEffect.a(1, a1) + '.'
            });
        }
示例#5
0
        /// <summary>
        /// \t, X, Y. 默认pos(-100, -100)
        /// </summary>
        /// <returns></returns>
        public List <KeyValuePair <XXParticleElement, List <string> > > RenderT()
        {
            List <KeyValuePair <XXParticleElement, List <string> > > result = new List <KeyValuePair <XXParticleElement, List <string> > >();

            foreach (KeyValuePair <XXParticleElement, List <ASSPointF> > pair in RenderPoint())
            {
                foreach (ASSPointF pt in pair.Value)
                {
                    pt.X += 100;
                    pt.Y += 100;
                }
                StringBuilder sbx = new StringBuilder();
                StringBuilder sby = new StringBuilder();
                for (int i = 0; i < pair.Value.Count; i += 10)
                {
                    List <ASSPointF> ptList = new List <ASSPointF>();
                    for (int j = i; j < i + 10 && j < pair.Value.Count; j++)
                    {
                        ptList.Add(pair.Value[j]);
                    }
                    if (ptList.Count > 0 && i == 0)
                    {
                        sbx.Append(ASSEffect.fscx((int)(ptList[0].X * 100)));
                        sby.Append(ASSEffect.fscy((int)(ptList[0].Y * 100)));
                    }
                    sbx.Append(ASSEffect.t(ptList[0].T - pair.Key.Born, ptList[ptList.Count - 1].T - pair.Key.Born + InterpolationPrecision, ASSEffect.fscx((int)(ptList[ptList.Count - 1].X * 100)).t()));
                    sby.Append(ASSEffect.t(ptList[0].T - pair.Key.Born, ptList[ptList.Count - 1].T - pair.Key.Born + InterpolationPrecision, ASSEffect.fscy((int)(ptList[ptList.Count - 1].Y * 100)).t()));
                }
                List <string> tmp = new List <string>();
                tmp.Add(sbx.ToString());
                tmp.Add(sby.ToString());
                result.Add(new KeyValuePair <XXParticleElement, List <string> >(pair.Key, tmp));
            }
            return(result);
        }
示例#6
0
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            int c = IntAdd(2, 3);

            Random rnd = new Random();

            //string s = TestHelloWorld();
            string fn = "FA 瑞筆行書M";
            string ss = "";

            char[] cc    = new char[10000];
            int    cclen = 1;
            bool   b1    = GetOutline(cc, ref cclen, '々', Encoding.Unicode.GetChars(Encoding.Unicode.GetBytes(fn)), 128, 30 * 8, 1000, 564, 424 * 8, 240 * 8);

            for (int i = 0; i < cclen; i++)
            {
                ss += cc[i];
            }

            //ass_out.AppendEvent(0, "pt", 0, 1, ASSEffect.pos(424, 240) + @"{\an7\p4}" + ss);
            ass_out.AppendEvent(0, "pt", 0, 10, ASSEffect.pos(0, 0) + @"{\an7\clip(4," + ss + @")\1a&H77&\p1} m -1000 -1000 l 1000 -1000 1000 1000 -1000 1000");
            for (int i = 0; i < 10; i++)
            {
                ASSColor co = Common.RandomColor(rnd, 1, ASSColor.FromBBGGRR(1, "000000"), ASSColor.FromBBGGRR(1, "FFFFFF"));
                ass_out.AppendEvent(1, "pt", (double)i * 0.5, (double)i * 0.5 + 1, ASSEffect.move(400, 0, 500, 0) + ASSEffect.c(1, co.ToColString()) + ASSEffect.c(3, co.ToColString()) + @"{\an7\clip(4," + ss + @")\1a&H00&\3a&H00&\bord25\blur25\p1} m 0 0 l 1 0 1 480 0 480");
            }

/*            ass_out.AppendEvent(0, "pt", 0, 10,
 *              ASSEffect.pos(0, 0) + @"{\an7\p1}m -1000 240 l 1000 240 1000 241 -1000 241"
 *              );
 *          ass_out.AppendEvent(0, "pt", 0, 10,
 *              ASSEffect.pos(0, 0) + @"{\an7\p1}m 424 -1000 l 425 -1000 425 1000 424 1000"
 *              );
 *          ass_out.AppendEvent(0, "Default", 1, 10,
 *              ASSEffect.pos(0, 0) + ASSEffect.an(7) + '々');*/

            ass_out.SaveFile(OutFileName);
        }
示例#7
0
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            string ms1   = "Style: Default,DFGMaruGothic-Md,35,&H00FF0000,&HFF000000,&HFFFFFFFF,&HFFFF0000,-1,0,0,0,100,100,2,0,1,2,0,5,25,25,25,128";
            string ptstr = @"{\p1}m 0 0 l 1 0 1 1 0 1";

            Random rnd = new Random();

            for (int iEv = 0; iEv < ass_in.Events.Count; iEv++)
            {
                //if (iEv != 1) continue;
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(false);

                this.MaskStyle = ms1;
                int x0      = MarginLeft;
                int startx0 = x0;
                int y0      = PlayResY - MarginBottom - FontHeight;

                if (iEv == -1)
                {
                    bool zz = false;
                    foreach (Beat bt in GetBeats())
                    {
                        ass_out.Events.Add(
                            ev.StartReplace(bt.Time).EndReplace(bt.Time + 0.3).TextReplace(
                                ASSEffect.pos(30, zz ? 30 : 80) + ASSEffect.an(7) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") +
                                ASSEffect.fad(0.05, 0.2) +
                                string.Format("ID:{0} STR:{1}", bt.Id, bt.Strength)));
                        zz = !zz;
                    }
                }

                if (iEv == 0)
                {
                    int   reg0      = 0;
                    int[] blurstrar = new int[] { 2, 3, 4, 5, 6, 7, 8 };
                    blurstrar = blurstrar.Select(bs => bs + 4).ToArray();
                    foreach (Beat bt in GetBeats())
                    {
                        if (bt.Id >= 151)
                        {
                            if (bt.Reg)
                            {
                                reg0 = 0;
                            }
                            else
                            {
                                reg0++;
                            }
                            int blurstr = blurstrar[reg0];
                            ass_out.Events.Add(
                                ev.StartReplace(bt.Time).EndReplace(bt.Time + 0.3).LayerReplace(5).TextReplace(
                                    ASSEffect.an(7) + ASSEffect.pos(0, 0) +
                                    ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "44") + ASSEffect.c(3, "ED6D64") +
                                    ASSEffect.fad(0.05, 0.2) +
                                    ASSEffect.blur(blurstr) + ASSEffect.bord(blurstr) +
                                    @"{\p1}m 0 678 l 1280 678 1280 679 0 679"));
                            ass_out.Events.Add(
                                ev.StartReplace(bt.Time).EndReplace(bt.Time + 0.3).LayerReplace(6).TextReplace(
                                    ASSEffect.an(7) + ASSEffect.pos(0, 0) +
                                    ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "44") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.fad(0.05, 0.2) +
                                    ASSEffect.blur(2) + ASSEffect.bord(2) +
                                    @"{\p1}m 0 678 l 1280 678 1280 679 0 679"));
                        }
                    }

                    foreach (Beat bt in GetBeats())
                    {
                        if (bt.Id < 151 || bt.Strength == 0)
                        {
                            continue;
                        }
                        for (int i = 0; i < 0.3 * 1500; i++)
                        {
                            double parx0 = Common.RandomInt(rnd, 0, PlayResX);
                            double pary0 = Common.RandomInt(rnd, 678 - 30, 678 + 20);
                            double parx1 = parx0 + Common.RandomInt(rnd, -5, 5);
                            double pary1 = pary0 - 30;
                            double part0 = bt.Time;
                            double part1 = bt.Time + 0.3;
                            ass_out.Events.Add(
                                ev.StartReplace(part0).EndReplace(part1).StyleReplace("pt").LayerReplace(3).TextReplace(
                                    ASSEffect.move(parx0, pary0, parx1, pary1) +
                                    ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "55") + ASSEffect.c(3, "ED6D64") +
                                    ASSEffect.bord(2) + ASSEffect.blur(2) +
                                    ASSEffect.fad(0.05, 0.2) +
                                    ASSEffect.frz(Common.RandomInt(rnd, 0, 360)) +
                                    CreatePolygon(rnd, 10, 25, 6)));
                        }
                    }
                }

                int kSum = 0;

                //if (!(iEv == 1 || iEv == 3 || iEv == 5 || iEv == 7))
                if (iEv + 1 < ass_in.Events.Count && ass_in.Events[iEv + 1].Start - ev.End > 0.5)
                {
                    ev.End = ass_in.Events[iEv + 1].Start - 0.5;
                }

                for (int iK = 0; iK < kelems.Count; iK++)
                {
                    //if (iK > 3) continue;
                    Console.WriteLine("{0} / {1} : {2} / {3}", iEv + 1, ass_in.Events.Count, iK + 1, kelems.Count);
                    KElement ke = kelems[iK];
                    double   r  = (double)iK / (double)(kelems.Count - 1);
                    this.MaskStyle = ms1;
                    Size sz = GetSize(ke.KText);
                    if (ke.KText.Trim() == "")
                    {
                        sz.Width = 15;
                    }
                    double kStart = ev.Start + kSum * 0.01;
                    double kEnd   = kStart + ke.KValue * 0.01;
                    kSum += ke.KValue;
                    if (iK + 1 == kelems.Count && kEnd < ev.End)
                    {
                        kEnd = ev.End;
                    }
                    int        x    = x0 + this.FontSpace + sz.Width / 2;
                    int        y    = y0 + FontHeight / 2;
                    StringMask mask = GetMask(ke.KText, x, y);
                    x0 += this.FontSpace + sz.Width;
                    y0  = y0;
                    if (ke.KText.Trim().Length == 0)
                    {
                        continue;
                    }

                    double r0 = ev.Start - 0.3;
                    double t0 = kStart - 0.4;
                    double t1 = t0 + 0.4;
                    double t2 = ev.End;

                    double r1 = r0 + 0.3;
                    if (!(iEv == 0 || iEv == 2 || iEv == 4 || iEv == 6 || iEv == 8))
                    {
                        for (int i = -1; i <= 1; i++)
                        {
                            ass_out.Events.Add(
                                ev.StartReplace(r0).EndReplace(r1).TextReplace(
                                    ASSEffect.move(x + i * 10, y, x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "00") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.xbord(20) + ASSEffect.be(20) + ASSEffect.ybord(0) +
                                    ASSEffect.t(0, r1 - r0, ASSEffect.xbord(0).t() + ASSEffect.be(0).t()) +
                                    ASSEffect.fad((r1 - r0) * 1, 0) +
                                    ke.KText));
                        }
                    }
                    else
                    {
                        ass_out.Events.Add(
                            ev.StartReplace(ev.Start - 0.3).EndReplace(t1).LayerReplace(10).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "77") + ASSEffect.c(1, "777777") + ASSEffect.a(3, "FF") +
                                ASSEffect.fad(0.5, 0) +
                                ke.KText));
                    }

                    if (iEv == 4 || iEv == 5)
                    {
                        ass_out.Events.Add(
                            ev.StartReplace(kStart - 0.1).EndReplace(kEnd).StyleReplace("pt").LayerReplace(0).TextReplace(
                                ASSEffect.an(7) + ASSEffect.pos(0, 0) +
                                ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                ASSEffect.a(3, "77") + ASSEffect.c(3, "ED6D64") +
                                ASSEffect.bord(10) + ASSEffect.blur(10) +
                                ASSEffect.fad(0.2, 0.2) +
                                @"{\p1}" + string.Format("m {0} {1} l {0} {2} {3} {2} {3} {1}", x, PlayResY, PlayResY - MarginBottom - FontHeight - 285, x + 1)));
                        ass_out.Events.Add(
                            ev.StartReplace(kStart - 0.1).EndReplace(kEnd).StyleReplace("pt").LayerReplace(1).TextReplace(
                                ASSEffect.an(7) + ASSEffect.pos(0, 0) +
                                ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                ASSEffect.a(3, "77") + ASSEffect.c(3, "FFFFFF") +
                                ASSEffect.bord(2) + ASSEffect.blur(2) +
                                ASSEffect.fad(0.2, 0.2) +
                                @"{\p1}" + string.Format("m {0} {1} l {0} {2} {3} {2} {3} {1}", x, PlayResY, PlayResY - MarginBottom - FontHeight - 285, x + 1)));
                        for (int i = 0; i < (int)((kEnd - kStart) * 200); i++)
                        {
                            double parx0 = Common.RandomInt(rnd, x - 5, x + 5);
                            double pary0 = Common.RandomInt(rnd, PlayResY - MarginBottom - FontHeight - 285, PlayResY);
                            double parx1 = parx0 + Common.RandomInt(rnd, -20, 20);
                            double pary1 = pary0 + Common.RandomInt(rnd, -5, 5);
                            double part0 = Common.RandomDouble(rnd, kStart - 0.1, kEnd - 0.1);
                            double part1 = part0 + Common.GetDistance(parx0, pary0, parx1, pary1) / 50.0;
                            ass_out.Events.Add(
                                ev.StartReplace(part0).EndReplace(part1).StyleReplace("pt").LayerReplace(3).TextReplace(
                                    ASSEffect.move(parx0, pary0, parx1, pary1) +
                                    ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "55") + ASSEffect.c(3, "ED6D64") +
                                    ASSEffect.bord(2) + ASSEffect.blur(2) +
                                    ASSEffect.fad(0.05, 0.2) +
                                    ASSEffect.frz(Common.RandomInt(rnd, 0, 360)) +
                                    CreatePolygon(rnd, 10, 25, 6)));
                        }
                    }

                    if (iEv == 0 || iEv == 2 || iEv == 4 || iEv == 6 || iEv == 8)
                    {
                        double dt = 0.002;
                        double dx, dy;
                        {
                            double t   = t1;
                            double ag  = Math.PI * 2.0 * (t - t0) / (t1 - t0) - Math.PI * 0.5;
                            double ca  = 40;
                            double cb  = 18;
                            double cx0 = ca * Math.Cos(ag);
                            double cy0 = cb * Math.Sin(-ag);
                            double cag = Math.PI * 0.25;
                            double cx1 = cx0 * Math.Cos(cag) + cy0 * Math.Sin(cag);
                            double cy1 = -cx0 *Math.Sin(cag) + cy0 * Math.Cos(cag);

                            dx = -cx1;
                            dy = -cy1;
                        }
                        for (double t = t0; t <= t1; t += dt)
                        {
                            double ag  = Math.PI * 2.0 * (t - t0) / (t1 - t0) - Math.PI * 0.5;
                            double ca  = 40;
                            double cb  = 18;
                            double cx0 = ca * Math.Cos(ag);
                            double cy0 = cb * Math.Sin(-ag);
                            double cag = Math.PI * 0.25;
                            double cx1 = cx0 * Math.Cos(cag) + cy0 * Math.Sin(cag);
                            double cy1 = -cx0 *Math.Sin(cag) + cy0 * Math.Cos(cag);

                            cx1 += x + dx;
                            cy1 += y + dy;
                            int fs = (int)((double)this.FontHeight * (t - t0) / (t1 - t0) + 1);
                            ass_out.Events.Add(
                                ev.StartReplace(t).EndReplace(t + 0.4).LayerReplace(20).TextReplace(
                                    ASSEffect.pos(cx1, cy1) + ASSEffect.fs(fs) +
                                    ASSEffect.a(1, "E0") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "E0") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.fad(0, 0.3) +
                                    ASSEffect.bord(1) + ASSEffect.blur(1) +
                                    ke.KText));
                            ass_out.Events.Add(
                                ev.StartReplace(t).EndReplace(t + dt).TextReplace(
                                    ASSEffect.pos(cx1, cy1) + ASSEffect.fs(fs) +
                                    ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") +
                                    ke.KText));
                        }
                        ass_out.Events.Add(
                            ev.StartReplace(t1).EndReplace(t1 + 0.35).LayerReplace(30).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "00") + ASSEffect.c(3, "FFFFFF") +
                                ASSEffect.bord(8) + ASSEffect.blur(8) + ASSEffect.fad(0.05, 0.2) +
                                ke.KText));
                        ass_out.Events.Add(
                            ev.StartReplace(t1).EndReplace(t2 + 0.2).LayerReplace(30).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "BB") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "BB") + ASSEffect.c(3, "FFFFFF") +
                                ASSEffect.bord(2) + ASSEffect.blur(2) + ASSEffect.fad(0.2, 0.2) +
                                ke.KText));
                        ass_out.Events.Add(
                            ev.StartReplace(t1).EndReplace(t2).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") +
                                ke.KText));
                    }
                    else
                    {
                        t0 += 0.2;
                        t1 += 0.2;
                        if (t0 < ev.Start)
                        {
                            t0 = ev.Start;
                            t1 = t0 + 0.4;
                        }
                        ass_out.Events.Add(
                            ev.StartReplace(r1 - 0.2).EndReplace(t0 + 0.2).LayerReplace(30).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "E0") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "E0") + ASSEffect.c(3, "FFFFFF") +
                                ASSEffect.bord(2) + ASSEffect.blur(2) + ASSEffect.fad(0.2, 0.2) +
                                ke.KText));
                        ass_out.Events.Add(
                            ev.StartReplace(r1).EndReplace(t0).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") +
                                ke.KText));
                        double dt = 0.002;
                        double dx, dy;
                        {
                            double t   = t1;
                            double ag  = Math.PI * 2.0 * (t - t0) / (t1 - t0) - Math.PI * 0.5;
                            double ca  = 40;
                            double cb  = 18;
                            double cx0 = ca * Math.Cos(ag);
                            double cy0 = cb * Math.Sin(-ag);
                            double cag = Math.PI * 0.25;
                            double cx1 = cx0 * Math.Cos(cag) + cy0 * Math.Sin(cag);
                            double cy1 = -cx0 *Math.Sin(cag) + cy0 * Math.Cos(cag);

                            dx = -cx1;
                            dy = -cy1;
                        }
                        for (double t = t0; t <= t1; t += dt)
                        {
                            double ag  = Math.PI * 2.0 * (t1 - t) / (t1 - t0) - Math.PI * 0.5;
                            double ca  = 40;
                            double cb  = 18;
                            double cx0 = ca * Math.Cos(ag);
                            double cy0 = cb * Math.Sin(-ag);
                            double cag = Math.PI * 0.25;
                            double cx1 = cx0 * Math.Cos(cag) + cy0 * Math.Sin(cag);
                            double cy1 = -cx0 *Math.Sin(cag) + cy0 * Math.Cos(cag);

                            cx1 += x + dx;
                            cy1 += y + dy;
                            int fs = (int)((double)this.FontHeight * (t1 - t) / (t1 - t0) + 1);
                            ass_out.Events.Add(
                                ev.StartReplace(t).EndReplace(t + 0.4).LayerReplace(20).TextReplace(
                                    ASSEffect.pos(cx1, cy1) + ASSEffect.fs(fs) +
                                    ASSEffect.a(1, "BB") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "BB") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.fad(0, 0.3) +
                                    ASSEffect.bord(1) + ASSEffect.blur(1) +
                                    ke.KText));
                            ass_out.Events.Add(
                                ev.StartReplace(t).EndReplace(t + dt).TextReplace(
                                    ASSEffect.pos(cx1, cy1) + ASSEffect.fs(fs) +
                                    ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") +
                                    ke.KText));
                        }
                    }

                    double bt_lo = t1;
                    bt_lo = ev.Start - 0.3 + 0.2;
                    double bt_hi            = t2;
                    Func <double, bool> bbt = ti => ti >= t1;
                    if (!(iEv == 0 || iEv == 2 || iEv == 4 || iEv == 6 || iEv == 8))
                    {
                        bt_lo = ev.Start - 0.2;
                        bt_hi = t1;
                        bbt   = ti => ti < kStart;
                    }
                    if (iEv == 0 || iEv == 2 || iEv == 4 || iEv == 6 || iEv == 8)
                    {
                        double t3 = t2 + 0.3;
                        if (iEv + 1 < ass_in.Events.Count && ass_in.Events[iEv + 1].Start - ev.End < 0.3)
                        {
                            t3 = t2 + 0.1;
                        }
                        for (int i = -1; i <= 1; i++)
                        {
                            ass_out.Events.Add(
                                ev.StartReplace(t2).EndReplace(t3).TextReplace(
                                    ASSEffect.move(x, y, x + i * 10, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "00") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.bord(0) + ASSEffect.blur(0) +
                                    ASSEffect.t(0, t3 - t2, ASSEffect.xbord(20).t() + ASSEffect.be(20).t()) +
                                    ASSEffect.fad(0, t3 - t2) +
                                    ke.KText));
                        }
                    }
                    else
                    {
                        double te = ev.End + 0.5;
                        //if (iEv == 9) te -= 1;
                        bt_hi = te - 0.5;
                        ass_out.Events.Add(
                            ev.EndReplace(te).LayerReplace(10).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "77") + ASSEffect.c(1, "777777") + ASSEffect.a(3, "FF") +
                                ASSEffect.fad(0, 0.5) +
                                ke.KText));
                    }

                    foreach (Beat bt in GetBeats())
                    {
                        if (bt.Strength == 0)
                        {
                            continue;
                        }
                        if (bt.Time >= bt_lo && bt.Time < bt_hi)
                        {
                            string col     = "FFFFFF";
                            int    blurstr = 4;
                            string ac      = "44";
                            if (bt.Strength == 2)
                            {
                                col     = "EEEEEE";
                                blurstr = 3;
                                ac      = "77";
                            }
                            if (bt.Strength == 10)
                            {
                                blurstr = 5;
                                ac      = "00";
                            }
                            if (!bbt(bt.Time))
                            {
                                blurstr = 2;
                                col     = "111111";
                            }
                            ass_out.Events.Add(
                                ev.StartReplace(bt.Time).EndReplace(bt.Time + 0.3).LayerReplace(55).TextReplace(
                                    ASSEffect.pos(x, y) + ASSEffect.fad(0.05, 0.2) +
                                    ASSEffect.a(1, ac) + ASSEffect.c(1, col) + ASSEffect.a(3, ac) + ASSEffect.c(3, col) +
                                    ASSEffect.bord(blurstr) + ASSEffect.blur(blurstr) +
                                    ke.KText));
                        }
                    }
                }
            }

            ass_out.SaveFile(OutFileName);
            Console.WriteLine("Lines : {0}", ass_out.Events.Count);
        }
示例#8
0
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            Random rnd = new Random();

            string ptstr = @"{\p1}m 0 0 l 1 0 1 1 0 1";

            string ts  = "この空のかなたへと 一人思いはせる";
            int    x0  = 50;
            int    y0  = 420;
            double stt = 0;

            foreach (char ch in ts)
            {
                Console.WriteLine(ch);
                stt += 0.2;
                if (Char.IsWhiteSpace(ch))
                {
                    x0 += 30;
                    continue;
                }
                StringMask mask = GetMask(ch + "", x0, y0);
                ASSPoint   p1   = Common.RandomPoint(rnd, x0 - 25, x0 - 15, y0 - 40, y0 + 40);
                ASSPoint   p2   = Common.RandomPoint(rnd, x0 - 45, x0 + 5, y0 - 40, y0 + 40);
                ASSPoint   p3   = Common.RandomPoint(rnd, x0 - 45, x0 + 5, y0 - 40, y0 + 40);
                ASSPoint   p4   = Common.RandomPoint(rnd, x0 - 25, x0 - 15, y0 - 40, y0 + 40);
                Bezier     bz   = new Bezier(p1, p2, p3, p4);
                ASSPoint   p5   = Common.RandomPoint(rnd, x0 - 25, x0 - 15, y0 - 40, y0 + 40);
                ASSPoint   p6   = Common.RandomPoint(rnd, x0 - 45, x0 + 5, y0 - 40, y0 + 40);
                ASSPoint   p7   = Common.RandomPoint(rnd, x0 - 45, x0 + 5, y0 - 40, y0 + 40);
                ASSPoint   p8   = Common.RandomPoint(rnd, x0 - 25, x0 - 15, y0 - 40, y0 + 40);
                Bezier     bz2  = new Bezier(p5, p6, p7, p8);
                Bezier[]   bzs  = new Bezier[20];
                for (int i = 0; i < bzs.Length; i++)
                {
                    bzs[i] = CreateBezier3(rnd, Common.RandomDouble(rnd, x0 + i * FontWidth - 40, x0 + i * FontWidth + 40), Common.RandomDouble(rnd, y0 - 40, y0 + 40), Common.RandomDouble(rnd, 10, 50), Common.RandomDouble(rnd, 10, 50));
                }
                bz  = CreateBezier3(rnd, x0 - 20, y0, 20, 40);
                bz2 = CreateBezier3(rnd, x0 - 20, y0, 20, 40);

                /*foreach (ASSPoint pt in bzs[0].Create(0.01f))
                 * {
                 *  ass_out.Events.Add(
                 *      new ASSEvent
                 *      {
                 *          Effect = "",
                 *          Style = "pt",
                 *          Layer = 10,
                 *          MarginL = "0000",
                 *          MarginR = "0000",
                 *          MarginV = "0000",
                 *          Name = "",
                 *          Start = 0,
                 *          End = 100,
                 *          Text = ASSEffect.pos(pt.X, pt.Y) + ASSEffect.a(1, "00") + ASSEffect.a(3, "FF") + ASSEffect.c(1, "FFFFFF") + ptstr
                 *      });
                 * }*/
                double t = (float)Common.RandomDouble(rnd, 0, 1);
                foreach (ASSPoint pt in mask.Points)
                {
                    string a1   = Common.ToHex2(255 - pt.Brightness);
                    string tarc = Common.scaleColor("0000FF", "FFFFFF", Math.Abs(Common.RandomDouble_Gauss(rnd, -1, 1, 2)));
                    double te   = stt + 1 + (0.5 - Math.Abs(((double)t - 0.5)));
                    ass_out.Events.Add(
                        new ASSEvent
                    {
                        Effect  = "",
                        Style   = "pt",
                        Layer   = 0,
                        MarginL = "0000",
                        MarginR = "0000",
                        MarginV = "0000",
                        Name    = "",
                        Start   = stt,
                        End     = te,
                        Text    = ASSEffect.pos(pt.X, pt.Y) + ASSEffect.a(1, a1) + ASSEffect.a(3, "FF") + ASSEffect.c(1, "0000FF") +
                                  ptstr
                    });

                    /*
                     * ASSPoint tar = bz.Get(t);
                     * if (Common.RandomBool(rnd, 0.5)) tar = bz2.Get(t);
                     * ass_out.Events.Add(
                     *  new ASSEvent
                     *  {
                     *      Effect = "",
                     *      Style = "pt",
                     *      Layer = 0,
                     *      MarginL = "0000",
                     *      MarginR = "0000",
                     *      MarginV = "0000",
                     *      Name = "",
                     *      Start = stt + 1,
                     *      End = stt + 2 + (0.5 - Math.Abs(((double)t - 0.5))),
                     *      Text = ASSEffect.move(pt.X, pt.Y, tar.X, tar.Y) + ASSEffect.fad(0, 0.5) +
                     *              ASSEffect.a(1, "77") + ASSEffect.a(3, "E7") + ASSEffect.c(1, "FFFFFF") + ASSEffect.c(3, "0000FF") +
                     *              ASSEffect.bord(2) + ASSEffect.blur(2) +
                     *              ptstr
                     *  });*/
                    double lastx = pt.X;
                    double lasty = pt.Y;
                    double tt0   = Common.RandomDouble(rnd, 0.2, 1);
                    tt0 = 1;
                    double tt1 = tt0 / 3;
                    t = (float)Common.RandomDouble(rnd, 0, 1);
                    for (int i = 0; i < bzs.Length; i++)
                    {
                        //if (t < 0.5) t = 0.5 - t; else t = 1.5 - t;
                        ASSPoint pb  = bzs[i].Get((float)t);
                        double   te0 = te + tt0 + (tt1 - Math.Abs(((double)t - 0.5)) / 0.5 * tt1);
                        ass_out.Events.Add(
                            new ASSEvent
                        {
                            Effect  = "",
                            Style   = "pt",
                            Layer   = 0,
                            MarginL = "0000",
                            MarginR = "0000",
                            MarginV = "0000",
                            Name    = "",
                            Start   = te,
                            End     = te0,
                            Text    = ASSEffect.move(lastx, lasty, pb.X, pb.Y) + ASSEffect.fad(0, ((i + 1 == bzs.Length) ? 0.5 : 0)) +
                                      ASSEffect.a(1, "77") + ASSEffect.a(3, "E0") + ASSEffect.c(1, "FFFFFF") + ASSEffect.c(3, "0000FF") +
                                      ASSEffect.bord(3) + ASSEffect.blur(3) +
                                      ptstr
                        });
                        lastx = pb.X;
                        lasty = pb.Y;
                        te    = te0;
                    }
                }
                break;
                x0 += mask.Width + this.FontSpace;
            }

            ass_out.SaveFile(OutFileName);
        }
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            for (int iEv = 0; iEv < ass_in.Events.Count; iEv++)
            {
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(false);

                /// an7 pos
                int x0 = MarginLeft;
                int y0 = PlayResY - MarginBottom - FontHeight;

                int kSum = 0;

                for (int i = 0; i < kelems.Count; i++)
                {
                    KElement ke = kelems[i];
                    double   r  = (double)i / (double)(kelems.Count - 1);
                    Size     sz = GetSize(ke.KText);

                    double kStart = kSum * 0.01;
                    double kEnd   = kStart + ke.KValue * 0.01;

                    /// an5 pos
                    int x = x0 + this.FontSpace + sz.Width / 2;
                    int y = y0;

                    x0 += this.FontSpace + sz.Width;
                    y0  = y0;

                    double t0 = ev.Start + kStart;
                    double t1 = t0 + 0.2;               // K出现
                    double t2 = ev.End - 0.5 + r * 0.5; // 保持
                    if (t1 > t2)
                    {
                        t2 = t1;
                    }
                    double t3 = t2 + 0.2; // 消失

                    string col = (iEv >= 3 && iEv <= 6) ? "111111" : "EEEEEE";
                    col = "FFDF3A";
                    if (iEv > 1)
                    {
                        col = "111111";
                    }
                    if (iEv > 6)
                    {
                        col = "FFDF3A";
                    }

                    ass_out.Events.Add(
                        ev.StartReplace(t0).EndReplace(t1).TextReplace(
                            ASSEffect.pos(x, y) +
                            ASSEffect.c(1, col) + ASSEffect.c(3, col) +
                            ASSEffect.ybord(18) + ASSEffect.be(18) +
                            //ASSEffect.a(1, "00").t() +
                            ASSEffect.t(0, t1 - t0, ASSEffect.a(3, "00").t() + ASSEffect.ybord(1).t() + ASSEffect.be(1).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t1).EndReplace(t2).TextReplace(
                            ASSEffect.pos(x, y) +
                            ASSEffect.c(1, col) + ASSEffect.c(3, col) +
                            ASSEffect.blur(1) +
                            //ASSEffect.a(1, "00") +
                            ASSEffect.a(3, "00") +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t2).EndReplace(t3).TextReplace(
                            ASSEffect.pos(x, y) +
                            ASSEffect.c(1, col) + ASSEffect.c(3, col) +
                            //ASSEffect.a(1, "00") +
                            ASSEffect.a(3, "00") + ASSEffect.blur(1) +
                            ASSEffect.t(0, t3 - t2, ASSEffect.a(1, "FF").t() + ASSEffect.a(3, "FF").t() + ASSEffect.ybord(18).t() + ASSEffect.blur(18).t()) +
                            ke.KText));

                    kSum += ke.KValue;
                }
            }

            ass_out.SaveFile(OutFileName);
        }
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            for (int iEv = 0; iEv < ass_in.Events.Count; iEv++)
            {
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(iEv > 130);
                StringBuilder   sb     = new StringBuilder();
                int             kSum   = 30;
                ev.Start -= 0.3;
                for (int iK = 0; iK < kelems.Count; iK++)
                {
                    KElement ke     = kelems[iK];
                    double   kStart = kSum * 0.01;
                    sb.Append(
                        ASSEffect.be(1) +
                        ASSEffect.a(3, "FF") + ASSEffect.a(1, "FF") + ASSEffect.t(0, 0.3, ASSEffect.a(3, "00").t() + ASSEffect.a(1, "00").t()) +
                        //ASSEffect.t(kStart, kStart + 0.3, ASSEffect.a(1, "77").t()) +
                        ASSEffect.t(kStart + 0, kStart + 0.5, ASSEffect.a(1, "FF").t() + ASSEffect.a(3, "FF").t()) +
                        ke.KText + ASSEffect.r()
                        );
                    kSum += ke.KValue;
                    if (ev.Last < kStart + 1.0)
                    {
                        ev.End += (kStart + 1.0 - ev.Last);
                    }
                }
                ass_out.Events.Add(ev.LayerReplace(iEv).TextReplace(sb.ToString()));
            }

            ass_out.SaveFile(OutFileName);
        }
示例#11
0
        public override void Run()
        {
            string ms3 = "Style: Default,DFGMaruMoji-SL,44,&H0000FFFF,&HFF000000,&H00FF0000,&HFF000000,0,0,0,0,100,100,2,0,1,2,0,5,30,30,10,128";
            string msc = "Style: Default,華康少女文字W5(P),44,&H0000FFFF,&HFF000000,&H00FF0000,&HFF000000,0,0,0,0,100,100,2,0,1,2,0,5,30,30,10,136";
            // 8BFF97 green

            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            Random rnd = new Random();

            int testEv = -1;

            for (int iEv = 0; iEv <= 22; iEv++)
            {
                if (testEv >= 0 && iEv != testEv)
                {
                    continue;
                }
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(false);

                this.MaskStyle = ms3;
                double sw = (iEv % 2 == 0) ? 0 : GetTotalWidth(ev);
                /// an7 pos
                int x0 = (iEv % 2 == 0) ? MarginLeft : (int)(PlayResX - MarginRight - sw);
                int y0 = PlayResY - MarginBottom - FontHeight;

                int kSum = 0;

                for (int iK = 0; iK < kelems.Count; iK++)
                {
                    //if (iK > 3) continue;
                    Console.WriteLine("{0} / {1} : {2} / {3}", iEv + 1, ass_in.Events.Count, iK + 1, kelems.Count);
                    KElement ke = kelems[iK];
                    double   r  = (double)iK / (double)(kelems.Count - 1);
                    this.MaskStyle = ms3;
                    StringMask mask = GetMask(ke.KText, x0, y0);
                    Size       sz   = new Size(mask.Width, mask.Height);

                    double kStart = ev.Start + kSum * 0.01;
                    double kEnd   = kStart + ke.KValue * 0.01;
                    kSum += ke.KValue;

                    /// an5 pos
                    int x = x0 + this.FontSpace + sz.Width / 2;
                    int y = y0 + FontHeight / 2;

                    x0 += this.FontSpace + sz.Width;
                    y0  = y0;

                    if (ke.KText.Trim().Length == 0)
                    {
                        continue;
                    }

                    string col1  = "3CD846";
                    string green = col1;
                    if (iEv == 1)
                    {
                        col1 = "C13BA5";
                    }
                    if (iEv == 2)
                    {
                        col1 = "3E58A6";
                    }
                    if (iEv == 3)
                    {
                        col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                    }
                    if (iEv == 4)
                    {
                        if (iK <= 7)
                        {
                            col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                        }
                        else if (iK <= 9)
                        {
                            col1 = "1FBD3E";
                        }
                        else
                        {
                            col1 = "C41426";
                        }
                    }
                    if (iEv == 5)
                    {
                        if (iK >= 8 && iK <= 10)
                        {
                            col1 = "F1D53C";
                        }
                    }
                    if (iEv == 6)
                    {
                        if (iK >= 4 && iK <= 8)
                        {
                            col1 = "F1D53C";
                        }
                        else if (iK >= 10)
                        {
                            col1 = "F25756";
                        }
                    }
                    if (iEv == 7)
                    {
                        if (iK >= 6 && iK <= 10)
                        {
                            col1 = "5D477C";
                        }
                    }
                    if (iEv == 8)
                    {
                        if (iK <= 1)
                        {
                            col1 = "5D477C";
                        }
                    }
                    if (iEv == 9)
                    {
                        col1 = "4399AE";
                    }
                    if (iEv == 10 || iEv == 11)
                    {
                        col1 = "AE4343";
                    }
                    if (iEv == 12)
                    {
                        col1 = "4344AE";
                    }
                    if (iEv == 13)
                    {
                        col1 = (iK % 2 == 0) ? green : "DC49A6";
                    }
                    if (iEv == 14)
                    {
                        col1 = (iK % 2 == 0) ? green : "C13BA5";
                    }
                    if (iEv == 15)
                    {
                        col1 = (iK % 2 == 0) ? green : "3E58A6";
                    }
                    if (iEv == 16)
                    {
                        col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                    }
                    if (iEv == 17)
                    {
                        if (iK <= 7)
                        {
                            col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                        }
                        else if (iK <= 9)
                        {
                            col1 = "1FBD3E";
                        }
                        else
                        {
                            col1 = "C41426";
                        }
                    }
                    if (iEv == 18 || iEv == 19)
                    {
                        col1 = (iK % 2 == 0) ? green : "4B84C7";
                    }
                    if (iEv == 20)
                    {
                        col1 = (iK % 2 == 0) ? green : "C3577F";
                    }
                    if (iEv == 21)
                    {
                        col1 = (iK % 2 == 0) ? green : "882DB5";
                    }
                    if (iEv == 22)
                    {
                        if (iK >= 5 && iK <= 10)
                        {
                            col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                        }
                        else if (iK <= 12)
                        {
                            col1 = "1FBD3E";
                        }
                        else
                        {
                            col1 = "C41426";
                        }
                    }


                    col1 = ASSColor.HtmlToASS(col1);

                    // bezier
                    if (iEv >= 5)
                    {
                        List <ASSPoint> pts = new Bezier(
                            new ASSPoint {
                            X = (iEv % 2 == 0) ? x - 100 : x + 100, Y = y - 50
                        },
                            new ASSPoint {
                            X = x + ((iEv % 2 == 0) ? 50 : -40), Y = y - 50
                        },
                            new ASSPoint {
                            X = x + ((iEv % 2 == 0) ? 50 : -40), Y = y + 30
                        },
                            new ASSPoint {
                            X = (iEv % 2 == 0) ? x - 100 : x + 100, Y = y + 30
                        }
                            ).Create(0.005f);
                        double lastt0 = kStart - 0.3;
                        for (int i = 0; i < pts.Count; i++)
                        {
                            ASSPoint pt = pts[i];
                            double   t0 = kStart - 0.3 + 0.6 * (double)i / (double)pts.Count;
                            double   t1 = t0 + 0.3;
                            ass_out.Events.Add(
                                ev.StartReplace(t0).EndReplace(t1).StyleReplace("pt").LayerReplace(15).TextReplace(
                                    ASSEffect.pos(pt.X, pt.Y) + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(1, "00") +
                                    ASSEffect.c(3, col1) + ASSEffect.a(3, "77") + ASSEffect.bord((iEv >= 0) ? 2 : 1) + ASSEffect.blur((iEv >= 0) ? 2 : 1) + ASSEffect.fad(0, 0.3) +
                                    ASSEffect.t(0, t1 - t0, ASSEffect.c(1, "FFFFFF").t() + ASSEffect.c(3, "FFFFFF").t()) +
                                    @"{\p1}m 0 0 l 1 0 1 1 0 1"));
                            if (t0 - lastt0 >= 0.04 || i + 1 == pts.Count)
                            {
                                string colb = Common.scaleColor(col1, "FFFFFF", 0.3);
                                ass_out.Events.Add(
                                    ev.StartReplace(t0).EndReplace(t0 + 0.04).StyleReplace("pt").LayerReplace(16).TextReplace(
                                        ASSEffect.pos(pt.X, pt.Y) + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(1, "00") +
                                        ASSEffect.c(3, colb) + ASSEffect.a(3, "00") + ASSEffect.bord((iEv >= 0) ? 6 : 4) + ASSEffect.blur((iEv >= 0) ? 5 : 3) +
                                        @"{\p1}m 0 0 l 1 0 1 1 0 1"));
                                lastt0 = t0;
                            }
                        }
                    }

                    //if (iEv <= 2)
                    {
                        double jumpTime            = 0.5;
                        double t0                  = kStart - jumpTime;
                        double t1                  = t0;
                        double dt                  = 0.01;
                        Func <double, double> f_y  = ti => y - 1100.0 * (0.25 * jumpTime * jumpTime - ((ti - t0) - 0.5 * jumpTime) * ((ti - t0) - 0.5 * jumpTime));
                        Func <double, double> f_x  = ti => x;
                        Func <double, int>    f_fs = ti => (int)(1 + Math.Round((ti - kStart + jumpTime) / jumpTime * FontWidth));
                        if (iEv >= 5 && iEv <= 12)
                        {
                            f_y  = ti => y;
                            f_x  = ti => x - 100 * (ti - t0) / jumpTime + 100;
                            f_fs = ti => FontWidth;
                        }
                        double d12 = 0.2;
                        if (iEv > 12)
                        {
                            t0  -= d12;
                            t1   = t0;
                            f_fs = ti => (int)(1 + Math.Round((ti - kStart + d12 + jumpTime) / jumpTime * FontWidth));
                        }
                        for (; t1 <= kStart - ((iEv > 12) ? d12 : 0); t1 += dt)
                        {
                            ass_out.Events.Add(
                                ev.StartReplace(t1 - dt - 0.1).EndReplace(t1 - 0.1).TextReplace(
                                    ASSEffect.pos(f_x(t1), f_y(t1)) + ASSEffect.fs(f_fs(t1)) +
                                    ASSEffect.c(1, (iEv >= 5) ? "555555" : col1) + ASSEffect.c(3, "FFFFFF") +
                                    ke.KText));
                            ass_out.Events.Add(
                                ev.StartReplace(t1 - dt - 0.1).EndReplace(t1 - dt - 0.1 + 0.4).LayerReplace(5).TextReplace(
                                    ASSEffect.pos(f_x(t1), f_y(t1)) + ASSEffect.fs(f_fs(t1)) + ASSEffect.be(1) +
                                    ASSEffect.c(1, "FFFFFF") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.a(1, "AA") + ASSEffect.a(3, "AA") + ASSEffect.fad(0, 0.3) +
                                    ke.KText));
                        }
                        t1 -= dt + 0.1;
                        double t2 = ev.End + r * 1 - 0.9;
                        if (iEv >= 5)
                        {
                            if (iEv >= 9)
                            {
                                ass_out.Events.Add(
                                    ev.StartReplace(kStart - 0.05).EndReplace(t2).LayerReplace(8).TextReplace(
                                        ASSEffect.pos(x, y) + ASSEffect.a(3, "44") + ASSEffect.a(1, "FF") + ASSEffect.c(3, col1) +
                                        ASSEffect.bord((iEv >= 13) ? 8 : 5) + ASSEffect.blur((iEv >= 13) ? 7 : 4) + ASSEffect.fad(0, 0.3) +
                                        ke.KText));
                            }
                            else
                            {
                                ass_out.Events.Add(
                                    ev.StartReplace(kStart - 0.05).EndReplace(t2).LayerReplace(8).TextReplace(
                                        ASSEffect.pos(x, y) + ASSEffect.a(3, "44") + ASSEffect.a(1, "FF") + ASSEffect.c(3, "FFFFFF") +
                                        ASSEffect.bord(3) + ASSEffect.blur(2) + ASSEffect.fad(0, 0.3) +
                                        ke.KText));
                            }
                            ass_out.Events.Add(
                                ev.StartReplace(kStart - 0.05).EndReplace(kStart + ((iEv >= 13) ? 0.3 : 0.15)).LayerReplace(15).TextReplace(
                                    ASSEffect.pos(x, y) + ASSEffect.a(3, "00") + ASSEffect.c(3, "FFFFFF") + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.bord(5) + ASSEffect.blur(4) +
                                    ASSEffect.fad(0, 0.2) + ke.KText));
                            ass_out.Events.Add(
                                ev.StartReplace(kStart - 0.05).EndReplace(t2).LayerReplace(13).TextReplace(
                                    ASSEffect.pos(x, y) + ASSEffect.a(3, "FF") + ASSEffect.a(1, "00") + ASSEffect.c(1, col1) +
                                    ke.KText));
                        }
                        ass_out.Events.Add(
                            ev.StartReplace(t1).EndReplace(t2).TextReplace(
                                ASSEffect.pos(x, y) +
                                ASSEffect.c(1, (iEv >= 5) ? "555555" : col1) + ASSEffect.c(3, "FFFFFF") +
                                ke.KText));
                        {
                            double ag = Common.RandomDouble(rnd, 0, Math.PI * 2);
                            if (iEv >= 9 && iEv <= 11)
                            {
                                ag = Math.PI * 0.75;
                            }
                            double ra    = 100;
                            double x1    = x + ra * Math.Cos(ag);
                            double y1    = y + ra * Math.Sin(ag);
                            bool   first = true;
                            for (double t3 = t2; t3 < t2 + 0.4; t3 += 0.02)
                            {
                                double t4   = t3 + 0.5;
                                string cole = Common.scaleColor(col1, "FFFFFF", (t3 - t2) / 0.5);
                                if (iEv <= 3)
                                {
                                    cole = "FFFFFF";
                                }
                                if (iEv >= 9 && iEv <= 11)
                                {
                                    cole = "FFFFFF";
                                }
                                ass_out.Events.Add(
                                    ev.StartReplace(t3).EndReplace(t4).LayerReplace(first ? 10 : 5).TextReplace(
                                        ASSEffect.move(x, y, x1, y1) + ASSEffect.fad(0, 0.3) + ASSEffect.be(first ? 0 : 1) +
                                        ASSEffect.c(1, first ? col1 : cole) + ASSEffect.a(1, first ? "00" : "AA") +
                                        ASSEffect.c(3, first ? "FFFFFF" : cole) + ASSEffect.a(3, first ? "00" : "AA") +
                                        ke.KText));
                                first = false;
                            }
                        }
                    }
                }
            }

            for (int iiEv = 23; iiEv <= 45; iiEv++)
            {
                break;
                int iEv = iiEv - 23;
                if (testEv >= 0 && iEv != testEv)
                {
                    continue;
                }
                ASSEvent        ev     = ass_in.Events[iiEv];
                List <KElement> kelems = ev.SplitK(true);

                this.MaskStyle = msc;
                double sw = (iEv % 2 == 0) ? 0 : GetTotalWidth(ev);
                /// an7 pos
                int x0 = (iEv % 2 == 0) ? MarginLeft : (int)(PlayResX - MarginRight - sw);
                int y0 = MarginTop;

                int kSum = 0;

                for (int iK = 0; iK < kelems.Count; iK++)
                {
                    //if (iK > 3) continue;
                    Console.WriteLine("{0} / {1} : {2} / {3}", iiEv + 1, ass_in.Events.Count, iK + 1, kelems.Count);
                    KElement ke = kelems[iK];
                    double   r  = (double)iK / (double)(kelems.Count - 1);
                    this.MaskStyle = ms3;
                    Size sz = GetSize(ke.KText);

                    double kStart = ev.Start + kSum * 0.01;
                    double kEnd   = kStart + ke.KValue * 0.01;
                    kSum += ke.KValue;

                    /// an5 pos
                    int x = x0 + this.FontSpace + sz.Width / 2;
                    int y = y0 + FontHeight / 2;

                    x0 += this.FontSpace + sz.Width;
                    y0  = y0;

                    if (ke.KText.Trim().Length == 0)
                    {
                        continue;
                    }

                    string col1  = "3CD846";
                    string green = col1;
                    if (iEv == 1)
                    {
                        col1 = "C13BA5";
                    }
                    if (iEv == 2)
                    {
                        col1 = "3E58A6";
                    }
                    if (iEv == 3)
                    {
                        col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                    }
                    if (iEv == 4)
                    {
                        if (iK <= 12)
                        {
                            col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                        }
                        else if (iK <= 13)
                        {
                            col1 = "1FBD3E";
                        }
                        else
                        {
                            col1 = "C41426";
                        }
                    }
                    if (iEv == 5)
                    {
                        if (iK >= 10)
                        {
                            col1 = "F1D53C";
                        }
                    }
                    if (iEv == 6)
                    {
                        if (iK >= 4 && iK <= 5)
                        {
                            col1 = "F1D53C";
                        }
                        else if (iK >= 10)
                        {
                            col1 = "F25756";
                        }
                    }
                    if (iEv == 7)
                    {
                        if (iK >= 5)
                        {
                            col1 = "5D477C";
                        }
                    }
                    if (iEv == 8)
                    {
                        if (iK >= 3 && iK <= 4)
                        {
                            col1 = "5D477C";
                        }
                    }
                    if (iEv == 9)
                    {
                        col1 = "4399AE";
                    }
                    if (iEv == 10 || iEv == 11)
                    {
                        col1 = "AE4343";
                    }
                    if (iEv == 12)
                    {
                        col1 = "4344AE";
                    }
                    if (iEv == 13)
                    {
                        col1 = (iK % 2 == 0) ? green : "DC49A6";
                    }
                    if (iEv == 14)
                    {
                        col1 = (iK % 2 == 0) ? green : "C13BA5";
                    }
                    if (iEv == 15)
                    {
                        col1 = (iK % 2 == 0) ? green : "3E58A6";
                    }
                    if (iEv == 16)
                    {
                        col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                    }
                    if (iEv == 17)
                    {
                        if (iK <= 12)
                        {
                            col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                        }
                        else if (iK <= 13)
                        {
                            col1 = "1FBD3E";
                        }
                        else
                        {
                            col1 = "C41426";
                        }
                    }
                    if (iEv == 18 || iEv == 19)
                    {
                        col1 = (iK % 2 == 0) ? green : "4B84C7";
                    }
                    if (iEv == 20)
                    {
                        col1 = (iK % 2 == 0) ? green : "C3577F";
                    }
                    if (iEv == 21)
                    {
                        col1 = (iK % 2 == 0) ? green : "882DB5";
                    }
                    if (iEv == 22)
                    {
                        if (iK >= 4 && iK <= 11)
                        {
                            col1 = (iK % 2 == 0) ? "D4004D" : "E79805";
                        }
                        else if (iK <= 12)
                        {
                            col1 = "1FBD3E";
                        }
                        else
                        {
                            col1 = "C41426";
                        }
                    }


                    col1 = ASSColor.HtmlToASS(col1);

                    {
                        double jumpTime            = 0.5;
                        double t0                  = kStart - jumpTime;
                        double t1                  = t0;
                        double dt                  = 0.01;
                        Func <double, double> f_y  = ti => y;
                        Func <double, double> f_x  = ti => x - 100 * (ti - t0) / jumpTime + 100;
                        Func <double, int>    f_fs = ti => FontWidth;
                        for (; t1 <= kStart; t1 += dt)
                        {
                            ass_out.Events.Add(
                                ev.StartReplace(t1 - dt - 0.1).EndReplace(t1 - 0.1).TextReplace(
                                    ASSEffect.pos(f_x(t1), f_y(t1)) + ASSEffect.fs(f_fs(t1)) +
                                    ASSEffect.c(1, col1) + ASSEffect.c(3, "FFFFFF") +
                                    ke.KText));
                            ass_out.Events.Add(
                                ev.StartReplace(t1 - dt - 0.1).EndReplace(t1 - dt - 0.1 + 0.4).LayerReplace(5).TextReplace(
                                    ASSEffect.pos(f_x(t1), f_y(t1)) + ASSEffect.fs(f_fs(t1)) + ASSEffect.be(1) +
                                    ASSEffect.c(1, "FFFFFF") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.a(1, "AA") + ASSEffect.a(3, "AA") + ASSEffect.fad(0, 0.3) +
                                    ke.KText));
                        }
                        t1 -= dt + 0.1;
                        double t2 = ev.End + r * 1 - 0.9;
                        ass_out.Events.Add(
                            ev.StartReplace(t1).EndReplace(t2).TextReplace(
                                ASSEffect.pos(x, y) +
                                ASSEffect.c(1, col1) + ASSEffect.c(3, "FFFFFF") +
                                ke.KText));
                        {
                            double ag = Common.RandomDouble(rnd, 0, Math.PI * 2);
                            if (iEv >= 9 && iEv <= 11)
                            {
                                ag = Math.PI * 1.25;
                            }
                            double ra    = 100;
                            double x1    = x + ra * Math.Cos(ag);
                            double y1    = y + ra * Math.Sin(ag);
                            bool   first = true;
                            for (double t3 = t2; t3 < t2 + 0.4; t3 += 0.02)
                            {
                                double t4   = t3 + 0.5;
                                string cole = Common.scaleColor(col1, "FFFFFF", (t3 - t2) / 0.5);
                                if (iEv <= 3)
                                {
                                    cole = "FFFFFF";
                                }
                                if (iEv >= 9 && iEv <= 11)
                                {
                                    cole = "FFFFFF";
                                }
                                ass_out.Events.Add(
                                    ev.StartReplace(t3).EndReplace(t4).LayerReplace(first ? 10 : 5).TextReplace(
                                        ASSEffect.move(x, y, x1, y1) + ASSEffect.fad(0, 0.3) + ASSEffect.be(first ? 0 : 1) +
                                        ASSEffect.c(1, first ? col1 : cole) + ASSEffect.a(1, first ? "00" : "AA") +
                                        ASSEffect.c(3, first ? "FFFFFF" : cole) + ASSEffect.a(3, first ? "00" : "AA") +
                                        ke.KText));
                                first = false;
                            }
                        }
                    }
                }
            }

            ass_out.SaveFile(OutFileName);
            Console.WriteLine("Lines : {0}", ass_out.Events.Count);
        }
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            string ptStr = @"{\p1}m 0 0 l 1 0 1 1 0 1";

            string s   = "見上げて 祈りさえも";
            int    x0  = 100;
            Random rnd = new Random();

            string[] cols = { "FFFFFF", "FF0000" };
            foreach (char ch in s)
            {
                StringMask mask = GetMask(ch + "", x0, 100);
                x0 += mask.Width + FontSpace;
                foreach (ASSPoint pt in mask.Points)
                {
                    foreach (string col in cols)
                    {
                        ass_out.Events.Add(
                            new ASSEvent
                        {
                            Effect  = "",
                            Layer   = 0,
                            MarginL = "0000",
                            MarginR = "0000",
                            MarginV = "0000",
                            Name    = "NTP",
                            Style   = "Default",
                            Start   = 1,
                            End     = 11,
                            Text    = ASSEffect.pos(pt.X, pt.Y) + ASSEffect.c(1, col) + ASSEffect.t(0, 10, ASSEffect.c(1, cols[0]).t()) + ASSEffect.t(0, Common.RandomDouble(rnd, 10, 20), ASSEffect.a(1, "FFFFFF").t()) + ptStr
                        }
                            );
                    }
                }
                //break;
            }

            ass_out.SaveFile(OutFileName);
        }
示例#13
0
        public List <ASSEvent> Create(IMovingObject imo)
        {
            List <ASSEvent> result = new List <ASSEvent>();
            //string pt0Str = @"{\blur3\bord4\p4}m 10 10 s 10 -10 -10 -10 -10 10";
            string pt0Str = @"{\blur" + (Pt0Size - 1) + @"\bord" + Pt0Size + @"\p4}m 10 10 s 10 -10 -10 -10 -10 10";
            string pt1Str = @"{\p4}m 0 100 l 1 1 100 0 1 -1 0 -100 -1 -1 -100 0 -1 1";

            for (double time = ParticleStartTime; time < ParticleEndTime; time += TimeStep)
            {
                for (int iDot = 0; iDot < ParticlePerStep; iDot++)
                {
                    ASSPointF   orgP      = imo.GetPosition(time);
                    double      orgX      = orgP.X;
                    double      orgY      = orgP.Y;
                    ParticleDot dot       = new ParticleDot(orgX, orgY, Common.RandomDouble(rnd, MinDX, MaxDX), Common.RandomDouble(rnd, MinDY, MaxDY), -Common.RandomDouble(rnd, MinDA, MaxDA));
                    double      liveTime  = -1.0 / dot.dA;
                    double      startTime = time;
                    double      endTime   = time + liveTime;
                    double      xEnd      = dot.X + dot.dX * liveTime;
                    double      yEnd      = dot.Y + dot.dY * liveTime;
                    result.Add(new ASSEvent
                    {
                        Effect  = "",
                        Layer   = 0,
                        MarginL = "0000",
                        MarginR = "0000",
                        MarginV = "0000",
                        Name    = "NTP",
                        Style   = "Default",
                        Start   = startTime,
                        End     = endTime,
                        Text    = ASSEffect.move(dot.X, dot.Y, xEnd, yEnd) + ASSEffect.a(1, "FF") + ASSEffect.c(3, ColorStart) + ASSEffect.fad(0, liveTime) + ASSEffect.t(0, liveTime, ASSEffect.c(3, ColorEnd).t()) + pt0Str
                    });
                    if (Star)
                    {
                        result.Add(new ASSEvent
                        {
                            Effect  = "",
                            Layer   = 0,
                            MarginL = "0000",
                            MarginR = "0000",
                            MarginV = "0000",
                            Name    = "NTP",
                            Style   = "Default",
                            Start   = startTime,
                            End     = endTime,
                            Text    = ASSEffect.move(dot.X, dot.Y - 1, xEnd, yEnd - 1) + ASSEffect.a(1, "77") + ASSEffect.c(1, ColorStart) + ASSEffect.fad(0, liveTime) + ASSEffect.t(0, liveTime, ASSEffect.c(1, ColorEnd).t()) + pt1Str
                        });
                    }
                }
            }
            return(result);
        }
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            Random rnd = new Random();

            for (int iEv = 0; iEv < ass_in.Events.Count; iEv++)
            {
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(false);

                /// an7 pos
                int x0 = MarginLeft;
                int y0 = PlayResY - MarginBottom - FontHeight;

                int kSum = 0;

                for (int i = 0; i < kelems.Count; i++)
                {
                    KElement ke = kelems[i];
                    double   r  = (double)i / (double)(kelems.Count - 1);
                    double   r0 = 1.0 - r;
                    Size     sz = GetSize(ke.KText);

                    if (Char.IsWhiteSpace(ke.KText[0]))
                    {
                        sz.Width = 15;
                    }

                    double kStart = kSum * 0.01;
                    double kEnd   = kStart + ke.KValue * 0.01;

                    /// an5 pos
                    int x = x0 + FontSpace + sz.Width / 2;
                    int y = y0 + FontHeight / 2;

                    x0 += this.FontSpace + sz.Width;
                    y0  = y0;

                    kSum += ke.KValue;

                    double t0 = ev.Start - r0 * 0.5;
                    double t1 = t0 + 0.2;                // 出现
                    double t2 = ev.Start + kStart - 0.1; // 保持框
                    double t3 = t2 + 0.5;                // K效果
                    double t4 = ev.End - r0 * 0.5;       // 保持
                    double t5 = t4 + 0.2;                // 消失

                    double rect_x0 = x - sz.Width / 2 - 2;
                    double rect_y0 = y - FontHeight / 2 - 2;
                    double rect_x1 = x + sz.Width / 2 + 2;
                    double rect_y1 = y + FontHeight / 2 + 2;
                    if (ke.KText.Length > 1)
                    {
                        rect_x0 -= ke.KText.Length * 1;
                        rect_x1 += ke.KText.Length * 1;
                    }
                    if (ke.KText == "with" || ke.KText == "find" || ke.KText == "world")
                    {
                        rect_x0 -= 2;
                        rect_x1 += 1;
                    }
                    if (ke.KText == "DITE")
                    {
                        rect_x0 -= 3;
                        rect_x1 += 3;
                    }
                    if (ke.KText == "alive")
                    {
                        rect_x0 -= 2;
                        rect_x1 += 2;
                    }

                    double rect_xmid = (rect_x0 + rect_x1) * 0.5;
                    double rect_ymid = (rect_y0 + rect_y1) * 0.5;

                    if (ke.KText.Trim().Length > 0)
                    {
                        ass_out.Events.Add(
                            ev.StartReplace(t0).EndReplace(t1).TextReplace(
                                ASSEffect.move(x + 10, y - 10, x, y) +
                                ASSEffect.fad(t1 - t0, 0) +
                                ke.KText));
                        ass_out.Events.Add(
                            CreateRectangle(t0, t1, "draw1", rect_x0, rect_y0, rect_x1, rect_y1, x, y, ASSEffect.move(x + 10, y - 10, x, y) + ASSEffect.fad(t1 - t0, 0))
                            );

                        int xC = 16;
                        int yC = 16;
                        if (ke.KText.Length > 1)
                        {
                            xC = (int)(Math.Round((double)yC / (rect_y1 - rect_y0) * (rect_x1 - rect_x0)));
                        }
                        switch (iEv)
                        {
                        case 0:
                        case 1:
                            ass_out.Events.Add(
                                ev.StartReplace(t1).EndReplace(t4).TextReplace(
                                    ASSEffect.pos(x, y) +
                                    ke.KText));
                            ass_out.Events.Add(
                                CreateRectangle(t1, t2, "draw1", rect_x0, rect_y0, rect_x1, rect_y1)
                                );

                            ass_out.Events.Add(
                                CreateRectangle(t2, t3, "draw1", rect_x0, rect_y0, rect_xmid, rect_y1, rect_x0, rect_ymid,
                                                ASSEffect.pos((int)Math.Round(rect_x0), (int)Math.Round(rect_ymid)) + ASSEffect.t(0, t3 - t2, ASSEffect.fry(-90).t()) + ASSEffect.fad(0, t3 - t2)
                                                ));
                            ass_out.Events.Add(
                                CreateRectangle(t2, t3, "draw1", rect_xmid, rect_y0, rect_x1, rect_y1, rect_x1, rect_ymid,
                                                ASSEffect.pos((int)Math.Round(rect_x1), (int)Math.Round(rect_ymid)) + ASSEffect.t(0, t3 - t2, ASSEffect.fry(90).t()) + ASSEffect.fad(0, t3 - t2)
                                                ));
                            break;

                        case 2:
                            ass_out.Events.Add(
                                ev.StartReplace(t1).EndReplace(t4).TextReplace(
                                    ASSEffect.pos(x, y) +
                                    ke.KText));
                            ass_out.Events.Add(
                                CreateRectangle(t1, t2, "draw1", rect_x0, rect_y0, rect_x1, rect_y1)
                                );

                            ass_out.Events.Add(
                                CreateRectangle(t2, t3, "draw1", rect_x0, rect_y0, rect_x1, rect_ymid, rect_xmid, rect_y0,
                                                ASSEffect.pos((int)Math.Round(rect_xmid), (int)Math.Round(rect_y0)) + ASSEffect.t(0, t3 - t2, ASSEffect.frx(-90).t()) + ASSEffect.fad(0, t3 - t2)
                                                ));
                            ass_out.Events.Add(
                                CreateRectangle(t2, t3, "draw1", rect_x0, rect_ymid, rect_x1, rect_y1, rect_xmid, rect_y1,
                                                ASSEffect.pos((int)Math.Round(rect_xmid), (int)Math.Round(rect_y1)) + ASSEffect.t(0, t3 - t2, ASSEffect.frx(90).t()) + ASSEffect.fad(0, t3 - t2)
                                                ));
                            break;

                        case 7:
                        case 8:
                            ass_out.Events.Add(
                                ev.StartReplace(t1).EndReplace(t4).TextReplace(
                                    ASSEffect.pos(x, y) +
                                    ke.KText));
                            ass_out.Events.Add(
                                CreateRectangle(t1, t2, "draw1", rect_x0, rect_y0, rect_x1, rect_y1)
                                );

                            for (int jR = 0; jR < yC; jR++)
                            {
                                double yy0    = rect_y0 + (rect_y1 - rect_y0) * (double)jR / (double)yC;
                                double yy1    = yy0 + (rect_y1 - rect_y0) / (double)yC;
                                double rStart = t2 + jR * 0.05;
                                if (iEv == 8)
                                {
                                    rStart = t2 + (yC - jR - 1) * 0.05;
                                }
                                double rEnd  = rStart + 0.2;
                                double yymid = (yy0 + yy1) * 0.5;
                                ass_out.Events.Add(
                                    CreateRectangle(t2, rStart, "draw1", rect_x0, yy0, rect_x1, yy1)
                                    );
                                ass_out.Events.Add(
                                    CreateRectangle(rStart, rEnd, "draw1", rect_x0, yy0, rect_x1, yy1, rect_xmid, yymid,
                                                    ASSEffect.pos(rect_xmid, yymid) + ASSEffect.fad(0, rEnd - rStart)
                                                    ));
                            }
                            break;

                        case 3:
                        case 4:
                        case 5:
                        case 6:
                        default:
                            ass_out.Events.Add(
                                ev.StartReplace(t1).EndReplace(t2).TextReplace(
                                    ASSEffect.pos(x, y) +
                                    ke.KText));
                            ass_out.Events.Add(
                                CreateRectangle(t1, t2, "draw1", rect_x0, rect_y0, rect_x1, rect_y1)
                                );

                            double t3_2 = ev.Start + kEnd;
                            if (t3_2 > t4)
                            {
                                t3_2 = t4;
                            }
                            for (int iR = 0; iR < (int)(Math.Round((t3_2 - t2) / 0.01)); iR++)
                            {
                                double rStart = t2 + iR * 0.01;
                                double rEnd   = rStart + 0.01;
                                ass_out.Events.Add(
                                    ev.StartReplace(rStart).EndReplace(rEnd).TextReplace(
                                        ASSEffect.pos(Common.RandomInt(rnd, x - 3, x + 3), Common.RandomInt(rnd, y - 3, y + 3)) +
                                        ke.KText));
                            }

                            ass_out.Events.Add(
                                ev.StartReplace(t3_2).EndReplace(t4).TextReplace(
                                    ASSEffect.pos(x, y) +
                                    ke.KText));

                            for (int iR = 0; iR < xC; iR++)
                            {
                                for (int jR = 0; jR < yC; jR++)
                                {
                                    double xx0 = rect_x0 + (rect_x1 - rect_x0) * (double)iR / (double)xC;
                                    double yy0 = rect_y0 + (rect_y1 - rect_y0) * (double)jR / (double)yC;
                                    double xx1 = xx0 + (rect_x1 - rect_x0) / (double)xC;
                                    double yy1 = yy0 + (rect_y1 - rect_y0) / (double)yC;
                                    double dx  = rnd.Next() % 20 + 8;
                                    double dy  = rnd.Next() % 20 + 8;
                                    double xx2 = xx0;
                                    double yy2 = yy0;
                                    if (Common.RandomInt_Gauss2(rnd, xC, iR) <= xC / 2)
                                    {
                                        xx2 -= dx;
                                    }
                                    else
                                    {
                                        xx2 += dx;
                                    }
                                    if (Common.RandomInt_Gauss2(rnd, yC, jR) <= yC / 2)
                                    {
                                        yy2 -= dy;
                                    }
                                    else
                                    {
                                        yy2 += dy;
                                    }
                                    double rEnd = Common.RandomDouble(rnd, t2 + 0.3, t2 + 1.5);
                                    ass_out.Events.Add(
                                        CreateRectangle(t2, rEnd, "draw1", xx0, yy0, xx1, yy1, xx0, yy0,
                                                        ASSEffect.move(xx0, yy0, xx2, yy2) + ASSEffect.fad(0, rEnd - t2)
                                                        ));
                                }
                            }
                            break;
                        }

                        ass_out.Events.Add(
                            ev.StartReplace(t4).EndReplace(t5).TextReplace(
                                ASSEffect.move(x, y, x - 10, y + 10) +
                                ASSEffect.fad(0, t5 - t4) +
                                ke.KText));
                    }
                }
            }

            ass_out.SaveFile(OutFileName);
        }
示例#15
0
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            string ms1    = "Style: Default,DFGMaruGothic-Md,26,&H00FF0000,&HFF600D00,&H000000FF,&HFF0A5A84,-1,0,0,0,100,100,0,0,0,2,0,5,20,20,20,128";
            string ms3    = "Style: Default,DFGMaruGothic-Md,26,&H000000FF,&HFF600D00,&H00FF0000,&HFF0A5A84,-1,0,0,0,100,100,0,0,0,2,0,5,20,20,20,128";
            string ptstr  = @"{\p1}m 0 0 l 1 0 1 1 0 1";
            string pt0Str = @"{\blur2\bord3\p4}m 5 5 s 5 -5 -5 -5 -5 5";

            Random rnd = new Random();

            InitBFS();

            for (int iEv = 0; iEv < ass_in.Events.Count; iEv++)
            {
                //if (iEv < 8) continue;
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(false);

                this.MaskStyle = ms3;
                /// an7 pos
                int x0 = PlayResX - MarginRight - FontWidth;
                if (iEv % 2 == 0)
                {
                    x0 = MarginLeft;
                }
                int startx0 = x0;
                int y0      = MarginTop;

                int kSum = 0;

                int           lum0count = 0;
                List <double> lum0x     = new List <double>();
                List <double> lum0y     = new List <double>();
                for (int lumy0 = -20; lumy0 < PlayResY;)
                {
                    lumy0 += Common.RandomInt(rnd, 5, 10);
                    lum0y.Add(lumy0);
                    lum0x.Add(Common.RandomInt(rnd, x0 - 2, x0 + FontWidth + 2));
                    lum0count++;
                }

                int           lumcount = 0;
                List <double> lumx     = new List <double>();
                List <double> lumy     = new List <double>();
                for (int lumy0 = -20; lumy0 < PlayResY;)
                {
                    lumy0 += Common.RandomInt(rnd, 20, 40);
                    lumy.Add(lumy0);
                    lumx.Add(Common.RandomInt(rnd, x0 - 10, x0 + FontWidth + 10));
                    lumcount++;
                }

                string[] lumcol =
                {
                    "003DB8",
                };

                for (int iK = 0; iK < kelems.Count; iK++)
                {
                    if (iK == 16)
                    {
                        int sadf = 2;
                    }
                    //if (iK > 3) continue;
                    Console.WriteLine("{0} / {1} : {2} / {3}", iEv + 1, ass_in.Events.Count, iK + 1, kelems.Count);
                    KElement ke = kelems[iK];
                    double   r  = (double)iK / (double)(kelems.Count - 1);
                    this.MaskStyle = ms3;
                    StringMask mask = GetMask(ke.KText, x0, y0);
                    Size       sz   = new Size(mask.Width, mask.Height);

                    double kStart = ev.Start + kSum * 0.01;
                    double kEnd   = kStart + ke.KValue * 0.01;
                    kSum += ke.KValue;

                    /// an5 pos
                    int x     = x0 + FontWidth / 2;
                    int y     = y0 + FontHeight / 2;
                    int baky0 = y0;
                    y0 += sz.Height + FontSpace;

                    Console.WriteLine(y0);

                    this.MaskStyle = ms1;
                    mask           = GetMask(ke.KText, x, y);

                    int bakx0 = x0;

                    if (ke.KText.Trim().Length == 0)
                    {
                        continue;
                    }

                    double t0  = ev.Start - 1.0 + r * 2;
                    double t1  = t0 + 1;
                    double t11 = kStart - 0.4;
                    double t2  = ev.End;

                    ass_out.Events.Add(
                        ev.StartReplace(t11).EndReplace(t11 + 0.8).TextReplace(
                            ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.a(3, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.c(3, "FFFFFF") +
                            ASSEffect.fad(0.2, 0.6) + ASSEffect.bord(0) + ASSEffect.blur(0) +
                            ASSEffect.t(0, 1, ASSEffect.bord(5).t() + ASSEffect.blur(5).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t11 + 0.4).EndReplace(t2 + 0.5).TextReplace(
                            ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.a(3, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.c(3, "FFFFFF") +
                            ASSEffect.fad(0.4, 1) + ASSEffect.bord(2) + ASSEffect.blur(2) +
                            ke.KText));

                    int[]    ind = CalculateBFSOrder(mask);
                    double[] wt  = new double[mask.Points.Count];
                    double[] wt0 = new double[mask.Points.Count];
                    for (int i = 0; i < ind.Length; i++)
                    {
                        ASSPoint pt = mask.Points[i];
                        double   ag = Common.GetAngle(pt.X, pt.Y, x, y);
                        double   r0 = Common.GetDistance(pt.X, pt.Y, x, y) * 1.0;
                        double   r1 = Common.GetDistance(pt.X, pt.Y, x, y) * 1.3;
                        //double r2 = Common.GetDistance(pt.X, pt.Y, x, y) * 1.1;
                        double ptx0 = pt.X; // (double)x + Math.Cos(ag) * r0;
                        double pty0 = pt.Y; // (double)y - Math.Sin(ag) * r0;
                        double ptx  = (double)x + Math.Cos(ag) * r1;
                        double pty  = (double)y - Math.Sin(ag) * r1;
                        //double ptx2 = (double)x + Math.Cos(ag) * r2;
                        //double pty2 = (double)y - Math.Sin(ag) * r2;
                        string bt  = Common.ToHex2((255 - pt.Brightness) * Common.RandomDouble(rnd, 0.7, 0.9));
                        string bt2 = bt;
                        string bt3 = Common.ToHex2((255 - pt.Brightness * 0.8) * Common.RandomDouble(rnd, 0.7, 0.9));
                        double pt2 = kStart + (kEnd - kStart) * (pt.Y - baky0) / mask.Height + Common.RandomDouble_Gauss(rnd, -0.15, 0.00, 2);
                        wt[i] = 1;
                        for (int j = 0; j < lumcount; j++)
                        {
                            double dis = Common.GetDistance(pt.X, pt.Y, lumx[j], lumy[j]) / 35.0;
                            if (wt[i] > dis)
                            {
                                wt[i] = dis;
                            }
                        }
                        wt0[i] = 1;
                        for (int j = 0; j < lum0count; j++)
                        {
                            double dis = Common.GetDistance(pt.X, pt.Y, lum0x[j], lum0y[j]) / 8.0;
                            if (wt0[i] > dis)
                            {
                                wt0[i] = dis;
                            }
                        }
                        string col0 = Common.scaleColor("222222", "FFFFFF", wt0[i]);
                        double pt3  = t2 + wt[i] + Common.RandomDouble_Gauss(rnd, -0.08, 0.08, 2);

                        ass_out.Events.Add(
                            ev.StartReplace(pt2 - 0.1).EndReplace(pt2).StyleReplace("pt").LayerReplace(15).TextReplace(
                                ASSEffect.a(1, "CC") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "CC") + ASSEffect.c(1, "FFFFFF") +
                                ASSEffect.bord(1) + ASSEffect.be(1) +
                                ASSEffect.pos(ptx0, pty0) + ptstr));

                        string ptc = Common.scaleColor("FFFFFF", lumcol[0], wt[i]);
                        ass_out.Events.Add(
                            ev.StartReplace(t0).EndReplace(t1).StyleReplace("pt").TextReplace(
                                ASSEffect.a(1, bt) + ASSEffect.c(1, col0) + ASSEffect.fad(0.1, 0) + ASSEffect.a(3, "FF") +
                                ASSEffect.move(ptx, pty, ptx0, pty0) + ptstr));
                        ass_out.Events.Add(
                            ev.StartReplace(t1).EndReplace(pt2 + 0.2).StyleReplace("pt").TextReplace(
                                ASSEffect.a(1, bt) + ASSEffect.c(1, col0) + ASSEffect.a(3, "FF") +
                                ASSEffect.fad(0, 0.3) +
                                ASSEffect.pos(ptx0, pty0) + ptstr));
                        ass_out.Events.Add(
                            ev.StartReplace(pt2 - 0.1).EndReplace(pt3).StyleReplace("pt").TextReplace(
                                ASSEffect.a(1, bt2) + ASSEffect.c(1, ptc) + ASSEffect.a(3, "FF") +
                                ASSEffect.fad(0.3, 0.3) +
                                ASSEffect.pos(ptx0, pty0) + ptstr));
                    }

                    for (int i = 0; i < (int)(Math.Round((kEnd - kStart) * 200)); i++)
                    {
                        ASSPoint pt  = mask.Points[Common.RandomInt(rnd, 0, mask.Points.Count - 1)];
                        double   pt0 = Common.RandomDouble(rnd, kStart, kEnd);
                        double   pt1 = pt0 + 1.5;
                        string   ptc = lumcol[0];
                        ptc = Common.scaleColor(ptc, "FFFFFF", 0.65);
                        ass_out.Events.Add(
                            ev.StartReplace(pt0).EndReplace(pt1).StyleReplace("pt").LayerReplace(5).TextReplace(
                                ASSEffect.move(pt.X, pt.Y, Common.RandomInt(rnd, pt.X + 50, pt.X - 50), Common.RandomInt(rnd, pt.Y + 35, pt.Y - 35)) +
                                ASSEffect.fad(0, 0.3) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                ASSEffect.a(3, "00") + ASSEffect.c(3, ptc) +
                                ASSEffect.bord(2) + ASSEffect.blur(2) + CreatePolygon(rnd, 15, 15, 6)));
                    }
                }
            }

            ass_out.SaveFile(OutFileName);
            Console.WriteLine("Lines : {0}", ass_out.Events.Count);
        }
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            Particle2 Par;

            string[] colList =
            {
                "05C1FF",
                "05C1FF",
                "0505FF",
                "0505FF",
                "FF6305",
                "FF0528",
                "0505FF",
                "FF6305",
                "FF6305",
                "FF6305",
                "FF6305",
                "FF6305",
            };

            for (int iEv = 0; iEv < ass_in.Events.Count; iEv++)
            {
                //if (iEv > 1) continue;
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(false);

                double sw = GetTotalWidth(ev);
                /// an7 pos
                int x0 = (iEv % 2 == 0) ? MarginLeft : (PlayResX - MarginRight - (int)sw);
                int y0 = PlayResY - MarginBottom - FontHeight;

                int kSum = 0;

                int bak_x0 = x0;

                string col1 = colList[iEv];
                string col3 = col1;

                for (int i = 0; i < kelems.Count; i++)
                {
                    KElement ke = kelems[i];
                    double   r  = (double)i / (double)(kelems.Count - 1);
                    Size     sz = GetSize(ke.KText);

                    double kStart = kSum * 0.01;
                    double kEnd   = kStart + ke.KValue * 0.01;
                    kSum += ke.KValue;

                    /// an5 pos
                    int x = x0 + this.FontSpace + sz.Width / 2;
                    int y = y0 + FontHeight / 2;

                    x0 += this.FontSpace + sz.Width;
                    y0  = y0;

                    if (ke.KText.Trim().Length == 0)
                    {
                        continue;
                    }

                    double t0 = ev.Start + r * 0.6 - 0.9;
                    if (iEv % 2 == 1)
                    {
                        t0 = ev.Start - r * 0.6 - 0.3;
                    }
                    double t1 = t0 + 0.3;
                    double t2 = ev.Start + kStart;
                    if (t1 > t2)
                    {
                        t2 = t1;
                    }
                    double t3 = t2 + 0.3;
                    double t4 = ev.End + r * 0.6 - 0.6;
                    if (iEv % 2 == 1)
                    {
                        t4 = ev.End - r * 0.6;
                    }
                    double t5 = t4 + 0.3;

                    string colBak = col1;
                    for (int yScan = y0; yScan <= y0 + FontHeight; yScan++)
                    {
                        col1 = col3 = Common.scaleColor(colBak, "FFFFFF", y0, y0 + FontHeight, yScan);
                        string colb = Common.scaleColor("000000", "777777", y0, y0 + FontHeight, yScan);
                        for (int j = -5; j <= 5; j++)
                        {
                            ass_out.Events.Add(
                                ev.StartReplace(t0).EndReplace(t1).TextReplace(
                                    ASSEffect.clip(0, yScan, PlayResX, yScan + 1) +
                                    ASSEffect.move(x + j * 5, y, x, y) + ASSEffect.a(1, Common.ToHex2(Math.Abs(j) * 40)) + ASSEffect.fad(t1 - t0, 0) + ASSEffect.c(1, colb) +
                                    ke.KText));
                        }
                        ass_out.Events.Add(
                            ev.StartReplace(t0).EndReplace(t2).TextReplace(
                                ASSEffect.clip(0, yScan, PlayResX, yScan + 1) +
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.fad(t1 - t0, 0) + ASSEffect.c(1, colb) +
                                ke.KText));
                        ass_out.Events.Add(
                            ev.StartReplace(t2).EndReplace(t3).TextReplace(
                                ASSEffect.clip(0, yScan, PlayResX, yScan + 1) +
                                //                        ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "111111") + ASSEffect.t(0, t3 - t2, ASSEffect.c(1, col1).t() + ASSEffect.a(1, "FF").t() + ASSEffect.a(3, "00").t() + ASSEffect.blur(2).t()) + ASSEffect.c(3, col3) +
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, "111111") + ASSEffect.t(0, t3 - t2, ASSEffect.c(1, col1).t()) +
                                ke.KText));
                        ass_out.Events.Add(
                            ev.StartReplace(t3).EndReplace(t4).TextReplace(
                                ASSEffect.clip(0, yScan, PlayResX, yScan + 1) +
                                //ASSEffect.pos(x, y) + ASSEffect.a(1, "FF") + ASSEffect.blur(2) + ASSEffect.a(3, "00") + ASSEffect.c(3, col3) +
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.c(1, col1) +
                                ke.KText));
                        for (int j = -5; j <= 5; j++)
                        {
                            ass_out.Events.Add(
                                ev.StartReplace(t4).EndReplace(t5).LayerReplace(5).TextReplace(
                                    ASSEffect.clip(0, yScan, PlayResX, yScan + 1) +
                                    //ASSEffect.move(x, y, x + j * 5, y) + ASSEffect.a(1, Common.ToHex2(Math.Abs(j) * 40)) + ASSEffect.c(1, col1) + ASSEffect.fad(0, t1 - t0) + ASSEffect.blur(2) + ASSEffect.a(3, "00") + ASSEffect.c(3, col3) +
                                    ASSEffect.move(x, y, x + j * 5, y) + ASSEffect.a(1, Common.ToHex2(Math.Abs(j) * 40)) + ASSEffect.c(1, col1) + ASSEffect.fad(0, t1 - t0) +
                                    ke.KText));
                        }
                        ass_out.Events.Add(
                            ev.StartReplace(t4).EndReplace(t5).TextReplace(
                                ASSEffect.clip(0, yScan, PlayResX, yScan + 1) +
                                //ASSEffect.pos(x, y) + ASSEffect.a(1, "FF") + ASSEffect.fad(0, t5 - t4) + ASSEffect.blur(2) + ASSEffect.c(3, col3) +
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.fad(0, t5 - t4) + ASSEffect.c(1, col1) +
                                ke.KText));
                    }
                    col1 = col3 = colBak;
                    for (int j = 1; j <= 5; j++)
                    {
                        ass_out.Events.Add(
                            ev.StartReplace(t2 + j * 0.04).EndReplace(t3 + j * 0.04).TextReplace(
                                ASSEffect.move(x, y, x, y - 20) + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(1, Common.ToHex2(Math.Abs(j) * 40)) + ASSEffect.fsc(100 + j * 8, 100 + j * 8) + ASSEffect.t(0, t3 - t2, ASSEffect.fsc(100 + j * 8 + 20, 100 + j * 8 + 20).t()) +
                                ke.KText));
                    }
                    ass_out.Events.Add(
                        ev.StartReplace(t2 + 0.15).EndReplace(t2 + 1).TextReplace(
                            ASSEffect.move(x, y, x, y + 30) + ASSEffect.a(1, "77") + ASSEffect.c(1, col1) + ASSEffect.fad(0, 0.5) + ASSEffect.fsc(70, 70) +
                            ke.KText));

                    Par = new Particle2("FFDE7D", "FFCC33", t2, t2 + 0.3, 0.001, 1, -15, 15, -15, 15, 1, 2)
                    {
                        Star = false, Pt0Size = 2
                    };
                    ass_out.Events.AddRange(Par.Create(new MovingRound(t2, t2 + 0.3, x, y, 30, -Math.PI)
                    {
                        MinDX = -2, MaxDX = 2, MinDY = 2, MaxDY = 2
                    }));
                }
                x0 = bak_x0;
                string arcCol = "FFFFFF";
                if (iEv % 2 == 0)
                {
                    Par = new Particle2(arcCol, "FFCC33", ev.Start - 0.6 - 0.3, ev.Start - 0.3, 0.005, 8, sw / 0.6 - 40, sw / 0.6 + 40, -10, 10, 2, 5)
                    {
                        Star = false, Pt0Size = 2
                    };
                    ass_out.Events.AddRange(Par.Create(new MovingArc(ev.Start - 0.6 - 0.3, ev.Start - 0.3, x0 - 80, y0 + FontHeight / 2, x0 + sw - 80, y0 + FontHeight / 2, 60, -1.2, 1.2)
                    {
                        GaussRnd = 2
                    }));
                }
                else
                {
                    Par = new Particle2(arcCol, "FFCC33", ev.Start - 0.6 - 0.3, ev.Start - 0.3, 0.005, 8, -sw / 0.6 - 40, -sw / 0.6 + 40, -10, 10, 2, 5)
                    {
                        Star = false, Pt0Size = 2
                    };
                    ass_out.Events.AddRange(Par.Create(new MovingArc(ev.Start - 0.6 - 0.3, ev.Start - 0.3, x0 + sw + 80, y0 + FontHeight / 2, x0 + 80, y0 + FontHeight / 2, 60, Math.PI - 1.2, Math.PI + 1.2)
                    {
                        GaussRnd = 2
                    }));
                }
            }

            ass_out.SaveFile(OutFileName);
        }
        public List <ASSEvent> Create()
        {
            List <ASSEvent> result = new List <ASSEvent>();

            for (int iCount = 0; iCount < Count; iCount++)
            {
                ASSEvent ev = new ASSEvent
                {
                    Layer   = 0,
                    Effect  = "",
                    Name    = "NTP",
                    MarginL = "0000",
                    MarginR = "0000",
                    MarginV = "0000",
                    Style   = Style,
                    Start   = Common.RandomDouble(rnd, Start, End)
                };
                double last = Common.RandomDouble(rnd, MinLast, MaxLast);
                ev.End  = Start + last;
                ev.Text = ASSEffect.an(5) + ASSEffect.fad(0, last);
                if (IsMove && MoveStyle == 1)
                {
                    int x1 = Common.RandomInt(rnd, X, X + FontSize);
                    int y1 = Common.RandomInt(rnd, Y, Y + FontSize);
                    int y2 = Common.RandomInt(rnd, Y + FontSize / 2 - AreaHeight / 2, Y + FontSize / 2 + AreaHeight / 2);
                    int x2 = Common.RandomInt(rnd, X - AreaWidth, X);
                    ev.Text += ASSEffect.move(x1 + XOffset, y1 + YOffset, x2 + XOffset, y2 + YOffset);
                }
                else if (IsMove && MoveStyle == 2)
                {
                    int x1 = Common.RandomInt(rnd, X, X + FontSize);
                    int y1 = Common.RandomInt(rnd, Y, Y + FontSize);
                    int y2 = Common.RandomInt(rnd, Y + FontSize / 2 - AreaHeight / 2, Y + FontSize / 2 + AreaHeight / 2);
                    int x2 = Common.RandomInt(rnd, X + FontSize / 2 - AreaWidth / 2, X + FontSize / 2 + AreaWidth / 2);
                    ev.Text += ASSEffect.move(x1 + XOffset, y1 + YOffset, x2 + XOffset, y2 + YOffset);
                }
                else if (IsMove && MoveStyle == 3)
                {
                    int x1 = X + FontSize / 2;
                    int y1 = Y + FontSize / 2;
                    int y2 = Common.RandomInt(rnd, y1 - AreaHeight / 2, y1 + AreaHeight / 2);
                    int x2 = Common.RandomInt(rnd, x1 - AreaWidth / 2, x1 + AreaWidth / 2);
                    ev.Text += ASSEffect.move(x1 + XOffset, y1 + YOffset, x2 + XOffset, y2 + YOffset);
                }
                else
                {
                    ev.Text += ASSEffect.pos(X + FontSize / 2 + XOffset, Y + FontSize / 2 + YOffset);
                }
                if (!IsRandomColor)
                {
                    ev.Text += ASSEffect.c(Color);
                }
                else
                {
                    ev.Text += ASSEffect.c(Common.RandomColor(rnd, 1, Color1, Color2));
                }
                if (BE > 0)
                {
                    ev.Text += ASSEffect.be(BE);
                }
                if (IsPatternScale)
                {
                    ev.Text += ASSEffect.t(0, last, @"\fscx" + PatternScaleX + @"\fscy" + PatternScaleY);
                }
                if (IsRotate)
                {
                    ev.Text += ASSEffect.t(0, last, ASSEffect.frz((int)(last * 1000)).t());
                }
                ev.Text += (char)ParticlePattern;

                result.Add(ev);
            }
            return(result);
        }
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            this.Font             = new System.Drawing.Font("HGGyoshotai", 28);
            this.Mask_HeightScale = 1;

            string src = "もう少しだけ";

            /*
             * int x0 = 100;
             * Random rnd = new Random();
             * foreach (char ch in src)
             * {
             *  List<Point> pts = GetMask(ch, x0, 100);
             *  foreach (Point pt in pts)
             *      ass_out.Events.Add(new ASSEvent
             *      {
             *          Start = 0,
             *          End = 1,
             *          Layer = 0,
             *          Style = "pt",
             *          Effect = "",
             *          MarginL = "0000",
             *          MarginR = "0000",
             *          MarginV = "0000",
             *          Name = "NTP",
             *          Text = ASSEffect.an(5) + ASSEffect.move(pt.X, pt.Y, pt.X - rnd.Next() % 50, pt.Y - rnd.Next() % 80 + 40) +  'o'
             *      }
             *      );
             *
             *  x0 += FontWidth;
             * }
             * */
            int x0 = 200;
            int y0 = 200;
            int x1 = 200;
            int y1 = 200;

            int p1_x = 100;
            int p1_y = 170;
            int p2_x = 380;
            int p2_y = 250;

            List <ASSPoint> pts0 = GetMask("彼", x0, y0).Points;
            List <ASSPoint> pts1 = GetMask("雷", x1, y1).Points;

            int y0min = 200;
            int y0max = 240;
            int y1min = 200;
            int y1max = 240;

            foreach (ASSPoint pt in pts0)
            {
                ass_out.Events.Add(new ASSEvent
                {
                    Start   = 0,
                    End     = 1,
                    Layer   = 0,
                    Style   = "pt",
                    Effect  = "",
                    MarginL = "0000",
                    MarginR = "0000",
                    MarginV = "0000",
                    Name    = "NTP",
                    Text    = ASSEffect.an(5) + ASSEffect.pos(pt.X, pt.Y) + ASSEffect.c(1, Common.scaleColor("7A93EB", "6939C8", y0min, y0max, pt.Y)) + '.'
                });
            }

            Random rnd = new Random();

            bool[] used0 = new bool[pts0.Count];
            for (int i = 0; i < used0.Length; i++)
            {
                used0[i] = false;
            }
            foreach (ASSPoint pt1 in pts1)
            {
                int k0 = rnd.Next() % pts0.Count;
                used0[k0] = true;
                int             p1_xx      = Common.RandomInt_Gauss(rnd, p1_x, 80);
                int             p1_yy      = Common.RandomInt_Gauss(rnd, p1_y, 80);
                int             p2_xx      = Common.RandomInt_Gauss(rnd, p2_x, 80);
                int             p2_yy      = Common.RandomInt_Gauss(rnd, p2_y, 80);
                string          startColor = Common.scaleColor("7A93EB", "6939C8", y0min, y0max, pts0[k0].Y);
                string          endColor   = Common.scaleColor("A3E789", "D9AB85", y1min, y1max, pt1.Y);
                List <ASSPoint> bez_pts    = new Bezier(pts0[k0], new ASSPoint {
                    X = p1_xx, Y = p1_yy
                }, new ASSPoint {
                    X = p2_xx, Y = p2_yy
                }, pt1).Create(0.1f);
                for (int i = 0; i + 1 < bez_pts.Count; i++)
                {
                    ass_out.Events.Add(new ASSEvent
                    {
                        Start   = 1 + i * 0.2,
                        End     = 1 + (i + 1) * 0.2,
                        Layer   = 0,
                        Style   = "pt",
                        Effect  = "",
                        MarginL = "0000",
                        MarginR = "0000",
                        MarginV = "0000",
                        Name    = "NTP",
                        Text    = ASSEffect.an(5) + ASSEffect.move(bez_pts[i].X, bez_pts[i].Y, bez_pts[i + 1].X, bez_pts[i + 1].Y) +
                                  ASSEffect.c(1, Common.scaleColor(startColor, endColor, (double)i / (double)bez_pts.Count)) + '.'
                    });
                }
            }

            double last_end = ass_out.Events[ass_out.Events.Count - 1].End;

            foreach (ASSPoint pt in pts1)
            {
                ass_out.Events.Add(new ASSEvent
                {
                    Start   = last_end,
                    End     = last_end + 1,
                    Layer   = 0,
                    Style   = "pt",
                    Effect  = "",
                    MarginL = "0000",
                    MarginR = "0000",
                    MarginV = "0000",
                    Name    = "NTP",
                    Text    = ASSEffect.an(5) + ASSEffect.pos(pt.X, pt.Y) + ASSEffect.c(1, Common.scaleColor("A3E789", "D9AB85", y1min, y1max, pt.Y)) + '.'
                });
            }

            ass_out.SaveFile(OutFileName);
        }
示例#19
0
        public void Run()
        {
            ASS ass    = ASS.FromFile(InFileName);
            ASS outass = new ASS();

            outass.Header = ass.Header;
            outass.Events = new List <ASSEvent>();

            for (int countEvent = 0; countEvent < 1; countEvent++)
            {
                ASSEvent        ev     = ass.Events[countEvent];
                List <KElement> kelems = ev.SplitK();
                int             kSum   = 0;
                for (int iKelems = 0; iKelems < kelems.Count; iKelems++)
                {
                    KElement kelem  = kelems[iKelems];
                    int      x      = (PlayResX - MarginLeft - MarginRight - (kelems.Count * FontWidth)) / 2 + MarginLeft + iKelems * FontWidth;
                    int      y      = MarginTop;
                    double   scale  = (double)(kelems.Count - iKelems) / (double)kelems.Count;
                    double   kStart = (double)kSum * 0.01;
                    double   kEnd   = (double)(kSum + kelem.KValue) * 0.01;
                    kSum += kelem.KValue;
                    outass.Events.Add(ev.StartOffset(-0.8 * scale).TextReplace(
                                          ASSEffect.t(0, 0.6, @"\1a&HDD&\3a&H11&") +                                               // fade in
                                          ASSEffect.t(kStart + 0.8 * scale + 0.2, kStart + 0.8 * scale + 0.2 + 0.1, @"\3a&HFF&") + // remove outline
                                          ASSEffect.t(ev.Last - 0.6 - 0.8 * scale, ev.Last - 0.8 * scale, @"\1a&HFF&\3a&HFF&") +   // fade out
                                          ASSEffect.pos(x, y) + kelem.KText));
                    outass.Events.Add(ev.LayerReplace(1).StartOffset(kStart + 0.2).TextReplace(
                                          ASSEffect.a(1, "00") + ASSEffect.c(1, "333333") + ASSEffect.a(3, "FF") +                                         // color
                                          ASSEffect.fad(0.3, 0) +                                                                                          // fade
                                          ASSEffect.t(0, 0.1, @"\3a&HFF&") +                                                                               // remove outline
                                          ASSEffect.t(ev.Last - (kStart + 0.2) - 0.6 - 0.8 * scale, ev.Last - (kStart + 0.2) - 0.8 * scale, @"\1a&HFF&") + // fade out
                                          ASSEffect.pos(x, y) + kelem.KText));
                    outass.Events.Add(ev.LayerReplace(1).StartOffset(kStart).EndReplace(ev.Start + kStart + 0.3).TextReplace(
                                          ASSEffect.a(1, "AA") + ASSEffect.c(1, "333333") + ASSEffect.a(3, "FF") + // color
                                          ASSEffect.fad(0.2, 0.1) +                                                // fade
                                          ASSEffect.move(x, y - 5, x, y) + kelem.KText));
                    outass.Events.Add(ev.LayerReplace(1).StartOffset(kStart).EndReplace(ev.Start + kStart + 0.3).TextReplace(
                                          ASSEffect.a(1, "AA") + ASSEffect.c(1, "333333") + ASSEffect.a(3, "FF") + // color
                                          ASSEffect.fad(0.2, 0.1) +                                                // fade
                                          ASSEffect.move(x, y + 5, x, y) + kelem.KText));
                }
            }

            for (int countEvent = 1; countEvent < 4; countEvent++)
            {
                ASSEvent        ev     = ass.Events[countEvent];
                List <KElement> kelems = ev.SplitK();
                int             kSum   = 0;
                for (int iKelems = 0; iKelems < kelems.Count; iKelems++)
                {
                    KElement kelem  = kelems[iKelems];
                    int      x      = (PlayResX - MarginLeft - MarginRight - (kelems.Count * FontWidth)) / 2 + MarginLeft + iKelems * FontWidth;
                    int      y      = MarginTop;
                    double   scale  = (double)(kelems.Count - iKelems) / (double)kelems.Count;
                    double   kStart = (double)kSum * 0.01;
                    double   kEnd   = (double)(kSum + kelem.KValue) * 0.01;
                    kSum += kelem.KValue;
                    outass.Events.Add(ev.StartOffset(-0.8 * scale).TextReplace(
                                          ASSEffect.t(0, 0.6, @"\1a&HDD&\3a&H11&") +                                             // fade in
                                          ASSEffect.t(ev.Last - 0.6 - 0.8 * scale, ev.Last - 0.8 * scale, @"\1a&HFF&\3a&HFF&") + // fade out
                                          ASSEffect.pos(x, y) + kelem.KText));
                    outass.Events.Add(ev.LayerReplace(1).StartOffset(kStart + 0.2).TextReplace(
                                          ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") +                                         // color
                                          ASSEffect.fad(0.3, 0) +                                                                                          // fade
                                          ASSEffect.t(ev.Last - (kStart + 0.2) - 0.6 - 0.8 * scale, ev.Last - (kStart + 0.2) - 0.8 * scale, @"\1a&HFF&") + // fade out
                                          ASSEffect.pos(x, y) + kelem.KText));
                    outass.Events.Add(ev.LayerReplace(1).StartOffset(kStart).EndReplace(ev.Start + kStart + 0.3).TextReplace(
                                          ASSEffect.a(1, "AA") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") + // color
                                          ASSEffect.fad(0.2, 0.1) +                                                // fade
                                          ASSEffect.move(x, y - 5, x, y) + kelem.KText));
                    outass.Events.Add(ev.LayerReplace(1).StartOffset(kStart).EndReplace(ev.Start + kStart + 0.3).TextReplace(
                                          ASSEffect.a(1, "AA") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") + // color
                                          ASSEffect.fad(0.2, 0.1) +                                                // fade
                                          ASSEffect.move(x, y + 5, x, y) + kelem.KText));
                }
            }

            for (int countEvent = 4; countEvent < 8; countEvent++)
            {
                ASSEvent        ev     = ass.Events[countEvent];
                List <KElement> kelems = ev.SplitK();
                int             kSum   = 0;
                for (int iKelems = 0; iKelems < kelems.Count; iKelems++)
                {
                    KElement kelem  = kelems[iKelems];
                    int      x      = (countEvent <= 5) ? (MarginLeft + iKelems * FontWidth) : (PlayResX - MarginRight - (kelems.Count - iKelems) * FontWidth);
                    int      y      = MarginTop;
                    double   scale  = (double)(kelems.Count - iKelems) / (double)kelems.Count;
                    double   kStart = (double)kSum * 0.01;
                    double   kEnd   = (double)(kSum + kelem.KValue) * 0.01;
                    kSum += kelem.KValue;

                    double t1 = ev.Start - 0.8 * scale;
                    double t2 = t1 + 0.6;
                    double t3 = ev.End - 0.8 * scale;
                    double t4 = t3 + 0.6;
                    outass.Events.Add(ev.StartReplace(t1).EndReplace(t2).TextReplace(
                                          ASSEffect.a(2, "00") + ASSEffect.c(2, "FFFFFF") +
                                          ASSEffect.t(0, 0.6, @"\1a&HDD&\3a&H11&") + // fade in
                                          ASSEffect.move(x, y - 8, x, y) + kelem.KText));
                    outass.Events.Add(ev.StartReplace(t2).EndReplace(t3).TextReplace(
                                          ASSEffect.a(2, "00") + ASSEffect.c(2, "FFFFFF") +
                                          ASSEffect.a(1, "DD") + ASSEffect.a(3, "11") + // hold
                                          ASSEffect.pos(x, y) + kelem.KText));
                    outass.Events.Add(ev.StartReplace(t3).EndReplace(t4).TextReplace(
                                          ASSEffect.a(1, "00") + ASSEffect.c(2, "FFFFFF") + ASSEffect.a(3, "11") +
                                          ASSEffect.t(0, 0.6, @"\1a&HFF&\3a&HFF&") + // fade out
                                          ASSEffect.move(x, y, x, y + 8) + kelem.KText));
                    outass.Events.Add(ev.LayerReplace(1).StartReplace(ev.Start + kStart).EndReplace(t3).TextReplace(
                                          ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                          ASSEffect.a(2, "DD") +
                                          ASSEffect.K(kEnd - kStart) + // karaoke
                                          ASSEffect.pos(x, y) + kelem.KText));
                }
            }

            for (int countEvent = 8; countEvent < 12; countEvent++)
            {
                ASSEvent        ev     = ass.Events[countEvent];
                List <KElement> kelems = ev.SplitK();
                int             kSum   = 0;
                for (int iKelems = 0; iKelems < kelems.Count; iKelems++)
                {
                    KElement kelem  = kelems[iKelems];
                    int      x      = MarginLeft + (countEvent - 8) * FontWidth;
                    int      y      = MarginTop + iKelems * FontHeight;
                    double   scale  = (double)(kelems.Count - iKelems) / (double)kelems.Count;
                    double   kStart = (double)kSum * 0.01;
                    double   kEnd   = (double)(kSum + kelem.KValue) * 0.01;
                    kSum += kelem.KValue;
                    outass.Events.Add(ev.EndOffset(1.0).TextReplace(
                                          ASSEffect.t(0, 0.2, @"\1a&HDD&\3a&H11&") +                             // fade in
                                          ASSEffect.t(ev.Last + 1.0 - 0.6, ev.Last + 1.0, @"\1a&HFF&\3a&HFF&") + // fade out
                                          ASSEffect.pos(x, y) + kelem.KText));
                    outass.Events.Add(ev.StartOffset(kStart).EndReplace(ev.Start + kStart + 0.3).TextReplace(
                                          ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                          ASSEffect.fad(0.2, 0.1) +
                                          ASSEffect.pos(x, y) + kelem.KText));
                }
            }

            for (int countEvent = 12; countEvent < 16; countEvent++)
            {
                ASSEvent        ev     = ass.Events[countEvent];
                List <KElement> kelems = ev.SplitK();
                int             kSum   = 0;
                for (int iKelems = 0; iKelems < kelems.Count; iKelems++)
                {
                    KElement kelem  = kelems[iKelems];
                    int      x      = PlayResX - MarginRight - (countEvent - 11) * FontWidth;
                    int      y      = MarginTop + iKelems * FontHeight;
                    double   scale  = (double)(kelems.Count - iKelems) / (double)kelems.Count;
                    double   kStart = (double)kSum * 0.01;
                    double   kEnd   = (double)(kSum + kelem.KValue) * 0.01;
                    kSum += kelem.KValue;
                    outass.Events.Add(ev.EndOffset(1.0).TextReplace(
                                          ASSEffect.t(0, 0.2, @"\1a&HDD&\3a&H11&") +                             // fade in
                                          ASSEffect.t(ev.Last + 1.0 - 0.6, ev.Last + 1.0, @"\1a&HFF&\3a&HFF&") + // fade out
                                          ASSEffect.pos(x, y) + kelem.KText));
                    outass.Events.Add(ev.StartOffset(kStart).EndReplace(ev.Start + kStart + 0.3).TextReplace(
                                          ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                          ASSEffect.fad(0.2, 0.1) +
                                          ASSEffect.pos(x, y) + kelem.KText));
                }
            }

            for (int countEvent = 16; countEvent < 20; countEvent++)
            {
                ASSEvent        ev     = ass.Events[countEvent];
                List <KElement> kelems = ev.SplitK();
                int             kSum   = 0;
                for (int iKelems = 0; iKelems < kelems.Count; iKelems++)
                {
                    KElement kelem  = kelems[iKelems];
                    int      x      = MarginLeft + (countEvent - 16) * FontWidth;
                    int      y      = MarginTop + iKelems * FontHeight;
                    double   scale  = (double)(kelems.Count - iKelems) / (double)kelems.Count;
                    double   kStart = (double)kSum * 0.01;
                    double   kEnd   = (double)(kSum + kelem.KValue) * 0.01;
                    kSum += kelem.KValue;
                    outass.Events.Add(ev.EndOffset(1.0).TextReplace(
                                          ASSEffect.t(0, 0.2, @"\1a&HDD&\3a&H11&") +                             // fade in
                                          ASSEffect.t(ev.Last + 1.0 - 0.6, ev.Last + 1.0, @"\1a&HFF&\3a&HFF&") + // fade out
                                          ASSEffect.pos(x, y) + kelem.KText));
                    outass.Events.Add(ev.StartOffset(kStart).EndReplace(ev.Start + kStart + 0.3).TextReplace(
                                          ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                          ASSEffect.fad(0.2, 0.1) +
                                          ASSEffect.pos(x, y) + kelem.KText));
                }
            }

            for (int countEvent = 20; countEvent < 23; countEvent++)
            {
                ASSEvent        ev     = ass.Events[countEvent];
                List <KElement> kelems = ev.SplitK();
                int             kSum   = 0;
                for (int iKelems = 0; iKelems < kelems.Count; iKelems++)
                {
                    KElement kelem  = kelems[iKelems];
                    int      x      = PlayResX - MarginRight - (countEvent - 19) * FontWidth;
                    int      y      = MarginTop + iKelems * FontHeight;
                    double   scale  = (double)(kelems.Count - iKelems) / (double)kelems.Count;
                    double   kStart = (double)kSum * 0.01;
                    double   kEnd   = (double)(kSum + kelem.KValue) * 0.01;
                    kSum += kelem.KValue;
                    outass.Events.Add(ev.EndOffset(1.0).TextReplace(
                                          ASSEffect.t(0, 0.2, @"\1a&HDD&\3a&H11&") +                             // fade in
                                          ASSEffect.t(ev.Last + 1.0 - 0.6, ev.Last + 1.0, @"\1a&HFF&\3a&HFF&") + // fade out
                                          ASSEffect.pos(x, y) + kelem.KText));
                    if (countEvent == 22 && iKelems == kelems.Count - 1)
                    {
                        outass.Events.Add(ev.StartOffset(kStart).EndReplace(ev.Start + kStart + 1.2).TextReplace(
                                              ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                              ASSEffect.fad(0.2, 1) +
                                              ASSEffect.pos(x, y) + kelem.KText));
                    }
                    else
                    {
                        outass.Events.Add(ev.StartOffset(kStart).EndReplace(ev.Start + kStart + 0.3).TextReplace(
                                              ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                              ASSEffect.fad(0.2, 0.1) +
                                              ASSEffect.pos(x, y) + kelem.KText));
                    }
                }
            }

            for (int countEvent = 23; countEvent < ass.Events.Count; countEvent++)
            {
                outass.Events.Add(ass.Events[countEvent]);
            }

            outass.Shift(Shift);
            outass.SaveFile(OutFileName);
        }
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            string ptStr = @"{\p4}m 0 100 l 1 1 100 0 1 -1 0 -100 -1 -1 -100 0 -1 1 c m 10 10 s 10 -10 -10 -10 -10 10 c";

            GetMask("!", 0, 0);

            for (int iEv = 0; iEv < ass_in.Events.Count; iEv++)
            {
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(false);

                /// an7 pos
                int x0 = (PlayResX - GetTotalWidth(ev)) / 2;
                int y0 = PlayResY - MarginBottom - FontHeight;

                Random rnd = new Random();

                int kSum = 0;

                for (int iK = 0; iK < kelems.Count; iK++)
                {
                    KElement ke = kelems[iK];
                    double   r  = (double)iK / (double)(kelems.Count - 1);
                    Size     sz = GetSize(ke.KText);

                    /// an5 pos
                    int x = x0 + this.FontSpace + sz.Width / 2;
                    int y = y0 + FontHeight;

                    StringMask mk = GetMask(ke.KText, x0, y0);
                    if (ke.KText.ToLower() == "silky")
                    {
                        mk = GetMask(ke.KText, x0 - 2, y0);
                    }

                    int bx0 = x0;
                    int by0 = y0;

                    x0 += this.FontSpace + sz.Width;
                    y0  = y0;

                    double kStart = ev.Start + kSum * 0.01;
                    kSum += ke.KValue;
                    double kEnd = ev.Start + kSum * 0.01;

                    double t0 = ev.Start + r * 1.0 - 1.0;
                    double t1 = t0 + 0.2;
                    double t2 = t0 + 0.4;
                    double t3 = t0 + 0.6;
                    double t4 = t0 + 0.8;
                    double t5 = ev.End + r * 1.0 - 1.0;
                    if (t5 < t4)
                    {
                        t5 = t4;
                    }
                    double t6 = t5 + 0.5;

                    ass_out.Events.Add(
                        ev.StartReplace(t0).EndReplace(t1).TextReplace(
                            ASSEffect.move(x, y, x, y - 60) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "FF") +
                            ASSEffect.t(0, t1 - t0, ASSEffect.a(1, "C0").t() + ASSEffect.a(3, "C0").t() + ASSEffect.frx(180).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t1).EndReplace(t2).TextReplace(
                            ASSEffect.move(x, y - 60, x, y) + ASSEffect.a(1, "C0") + ASSEffect.a(3, "C0") + ASSEffect.frx(180) +
                            ASSEffect.t(0, t2 - t1, ASSEffect.a(1, "80").t() + ASSEffect.a(3, "80").t() + ASSEffect.frx(360).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t2).EndReplace(t3).TextReplace(
                            ASSEffect.move(x, y, x, y - 60) + ASSEffect.a(1, "80") + ASSEffect.a(3, "80") +
                            ASSEffect.t(0, t3 - t2, ASSEffect.a(1, "40").t() + ASSEffect.a(3, "40").t() + ASSEffect.frx(180).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t3).EndReplace(t4).TextReplace(
                            ASSEffect.move(x, y - 60, x, y) + ASSEffect.a(1, "40") + ASSEffect.a(3, "40") + ASSEffect.frx(180) +
                            ASSEffect.t(0, t4 - t3, ASSEffect.a(1, "00").t() + ASSEffect.a(3, "00").t() + ASSEffect.frx(360).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t4).EndReplace(t5).TextReplace(
                            ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.a(3, "00") +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t5).EndReplace(t6).TextReplace(
                            ASSEffect.move(x, y, x + r * 100 - 50, y + 30) + ASSEffect.a(1, "00") + ASSEffect.a(3, "00") +
                            ASSEffect.fad(0, t6 - t5) +
                            ke.KText));

                    ASSColor col = Common.RandomColor(rnd, 1);

                    foreach (ASSPoint pt in mk.Points)
                    {
                        if (!Common.RandomBool(rnd, 0.5))
                        {
                            continue;
                        }
                        double r1  = Common.RandomDouble(rnd, kStart - 0.15, kEnd + 0.15);
                        double r0  = r1 - 0.5;
                        double r2  = Common.RandomDouble(rnd, kStart + 0.9, kStart + 1.2);
                        double r3  = r2 + 0.5;
                        int    x_0 = Common.RandomInt(rnd, pt.X - 80, pt.X - 30);
                        int    y_0 = Common.RandomInt(rnd, pt.Y - 30, pt.Y + 30);
                        int    x_1 = Common.RandomInt(rnd, pt.X + 80, pt.X + 30);
                        int    y_1 = Common.RandomInt(rnd, pt.Y - 30, pt.Y + 30);
                        ass_out.Events.Add(
                            ev.StartReplace(r0).EndReplace(r1).StyleReplace("pt").TextReplace(
                                ASSEffect.move(x_0, y_0, pt.X, pt.Y) + ASSEffect.c(col) + ASSEffect.fad(r1 - r0, 0) + ptStr));
                        ass_out.Events.Add(
                            ev.StartReplace(r1).EndReplace(r2).StyleReplace("pt").TextReplace(
                                ASSEffect.pos(pt.X, pt.Y) + ASSEffect.c(col) + ptStr));
                        ass_out.Events.Add(
                            ev.StartReplace(r2).EndReplace(r3).StyleReplace("pt").TextReplace(
                                ASSEffect.move(pt.X, pt.Y, x_1, y_1) + ASSEffect.c(col) + ASSEffect.fad(0, r3 - r2) + ptStr));
                    }
                }
            }
            ass_out.SaveFile(OutFileName);
        }
示例#21
0
        public override void Run()
        {
            ASS ass_in  = ASS.FromFile(this.InFileName);
            ASS ass_out = new ASS();

            ass_out.Header = ass_in.Header;
            ass_out.Events = new List <ASSEvent>();

            Random rnd = new Random();

            int mask_xOffset = -4;

            double pp = 0.6;

            for (int iEv = 0; iEv < ass_in.Events.Count; iEv++)
            {
                ASSEvent        ev     = ass_in.Events[iEv];
                List <KElement> kelems = ev.SplitK(false);

                /// an7 pos
                int x0 = MarginLeft;
                int y0 = PlayResY - MarginBottom - FontHeight;

                int kSum = 0;

                for (int i = 0; i < kelems.Count; i++)
                {
                    KElement ke = kelems[i];
                    double   r  = (double)i / (double)(kelems.Count - 1);
                    double   r0 = 1.0 - r;
                    //Size sz = GetSize(ke.KText);
                    StringMask mask = GetMask(ke.KText, x0 + FontSpace, y0);
                    Size       sz   = new Size(mask.Width, mask.Height);

                    double kStart = kSum * 0.01;
                    double kEnd   = kStart + ke.KValue * 0.01;

                    /// an5 pos
                    int x = x0 + FontSpace + sz.Width / 2;
                    int y = y0 + FontHeight / 2;

                    x0 += this.FontSpace + sz.Width;
                    y0  = y0;

                    kSum += ke.KValue;

                    double t0 = ev.Start - r0 * 0.5;
                    double t1 = t0 + 0.2;          // 出现
                    double t2 = ev.Start + kStart; // 保持
                    double t3 = t2 + 0.2;          // K效果
                    double t4 = ev.End - r0 * 0.5; // 保持
                    double t5 = t4 + 0.2;          // 消失

                    ass_out.Events.Add(
                        ev.StartReplace(t0).EndReplace(t1).TextReplace(
                            ASSEffect.pos(x, y) + ASSEffect.be(100) +
                            ASSEffect.fad(t1 - t0, 0) + ASSEffect.t(0, t1 - t0, ASSEffect.be(1).t()) +
                            ke.KText));

                    ass_out.Events.Add(
                        ev.StartReplace(t1).EndReplace(t2).TextReplace(
                            ASSEffect.pos(x, y) + ASSEffect.be(1) +
                            ke.KText));

                    ass_out.Events.Add(
                        ev.StartReplace(t2).EndReplace(t4).TextReplace(
                            ASSEffect.pos(x, y) + ASSEffect.be(1) + ASSEffect.a(1, "FF") + ASSEffect.c(3, "FFFFFF") +
                            ke.KText));

                    foreach (ASSPoint pt in mask.Points)
                    {
                        if (!Common.RandomBool(rnd, pp))
                        {
                            continue;
                        }
                        double rStart = t2;
                        double rEnd   = t2 + Common.RandomDouble(rnd, 0.1, 1.5);
                        int    dx     = rnd.Next() % 20 + 8;
                        int    dy     = rnd.Next() % 20 + 8;
                        int    xx2    = pt.X;
                        int    yy2    = pt.Y;
                        if (Common.RandomBool(rnd, (double)(pt.X - mask.X0) / (double)mask.Width))
                        {
                            xx2 += dx;
                        }
                        else
                        {
                            xx2 -= dx;
                        }
                        if (Common.RandomBool(rnd, (double)(pt.Y - mask.Y0) / (double)mask.Height))
                        {
                            yy2 += dy;
                        }
                        else
                        {
                            yy2 -= dy;
                        }
                        ass_out.Events.Add(
                            ev.StartReplace(rStart).EndReplace(rEnd).StyleReplace("pt").TextReplace(
                                ASSEffect.move(pt.X, pt.Y, xx2, yy2) + ASSEffect.fad(0, rEnd - rStart) +
                                "o"));
                    }

                    ass_out.Events.Add(
                        ev.StartReplace(t4).EndReplace(t5).TextReplace(
                            ASSEffect.pos(x, y) + ASSEffect.be(1) + ASSEffect.a(1, "FF") + ASSEffect.c(3, "FFFFFF") +
                            ASSEffect.fad(0, t5 - t4) + ASSEffect.t(0, t5 - t4, ASSEffect.be(100).t()) +
                            ke.KText));
                }
            }

            ass_out.SaveFile(OutFileName);
        }