示例#1
0
        public override void Run()
        {
            string ptstr = @"{\p1}m 0 0 l 1 0 1 1 0 1";

            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    ox  = 300;
            int    oy  = 300;
            Random rnd = new Random();

            Func <double, double, string> f1 = (a, b) => string.Format(" {0} {1}", (int)(Math.Round(a)), (int)(Math.Round(b)));
            Toy1 toy1 = new Toy1 {
                OX = 0, OY = 0, V = 50, MinR = 10, MaxR = 100, MinDAG = 0.2, MaxDAG = 0.5, IsSort = false
            };

            toy1.Reset();

            double dt = 0.04;

            for (double t = 0; t < 60; t += dt)
            {
                List <ASSPointF> pts = toy1.Next();
                string           s   = @"{\p1}m";
                s += f1(pts[0].X, pts[0].Y);
                s += " l";
                for (int i = 1; i < pts.Count; i++)
                {
                    s += f1(pts[i].X, pts[i].Y);
                }
                s += f1(pts[0].X, pts[0].Y);
                s += f1(pts[1].X, pts[1].Y);
                s += f1(pts[2].X, pts[2].Y);
                ass_out.AppendEvent(0, "pt", t, t + dt,
                                    ASSEffect.pos(ox, oy) + ASSEffect.an(7) +
                                    ASSEffect.a(1, "FF") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "00") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.bord(1) + ASSEffect.be(0) +
                                    s);
            }

            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);
        }
        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,30,&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,30,&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 != 0) 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 startx0 = x0;
                int y0      = PlayResY - MarginBottom - FontHeight;

                int kSum = 0;

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

                int           lumcount = 0;
                List <double> lumx     = new List <double>();
                List <double> lumy     = new List <double>();
                for (int lumx0 = -20; lumx0 < PlayResX;)
                {
                    lumx0 += Common.RandomInt(rnd, 25, 45);
                    lumx.Add(lumx0);
                    lumy.Add(Common.RandomInt(rnd, PlayResY - MarginBottom - FontHeight - 10, PlayResY - MarginBottom + 10));
                    lumcount++;
                }

                string[] lumcol =
                {
                    "003DB8",
                    "003DB8",
                    "000000",
                    "B54F00",
                    "0068B8",
                    "B88000"
                };

                string[] lum3 =
                {
                    "00B88F", //23:49.678
                    "003DB8", //23:50.429
                    "5972B8", //23:51.931
                    "B86459"  //23:54.516
                };
                double[] lum3t =
                {
                    23 * 60 + 49 + 0.65,
                    23 * 60 + 50 + 0.40,
                    23 * 60 + 51 + 0.91,
                    23 * 60 + 54 + 0.49
                };

                string[] lum4 =
                {
                    "003DB8" //24:06.528
                };
                double[] lum4t =
                {
                    24 * 60 + 6 + 0.50
                };


                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;

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

                    int bakx0 = x0;

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

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

                    if (iEv == 3)
                    {
                        ass_out.Events.Add(
                            ev.StartReplace(ev.Start + 0.5).EndReplace(ev.Start + 2.0).LayerReplace(20).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.a(3, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.c(3, "FFFFFF") +
                                ASSEffect.fad(0, 0.5) + ASSEffect.bord(9) + ASSEffect.blur(8) +
                                ke.KText));
                    }
                    if (iEv == 5)
                    {
                        ass_out.Events.Add(
                            ev.StartReplace(ev.End).EndReplace(ev.End + 1.5).LayerReplace(20).TextReplace(
                                ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.a(3, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.c(3, "FFFFFF") +
                                ASSEffect.fad(0.3, 0.5) + ASSEffect.bord(6) + ASSEffect.blur(6) +
                                ke.KText));
                    }

                    /*for (int i = 1; i <= 5; i++)
                     * {
                     *  ass_out.Events.Add(
                     *      ev.StartReplace(kStart + 0).EndReplace(t2 + 0.5).TextReplace(
                     *      ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.a(3, "FF") + ASSEffect.c(1, "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.X - bakx0) / mask.Width + 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]) / 30.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]) / 10.0;
                            if (wt0[i] > dis)
                            {
                                wt0[i] = dis;
                            }
                        }
                        string col0 = Common.scaleColor("222222", "FFFFFF", wt0[i]);
                        if (iEv == 2)
                        {
                            col0 = Common.scaleColor("444444", "FFFFFF", wt0[i]);
                        }
                        if (iEv >= 3)
                        {
                            col0 = Common.scaleColor("777777", "FFFFFF", wt0[i]);
                        }
                        double pt3 = t2 + wt[i] + Common.RandomDouble_Gauss(rnd, -0.08, 0.08, 2);

                        if (iEv >= 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));
                        }

                        if (iEv != 3 && iEv != 4)
                        {
                            string ptc = Common.scaleColor("FFFFFF", lumcol[iEv], 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));
                        }
                        else if (iEv == 3)
                        {
                            for (int j = 0; j <= lum3.Length; j++)
                            {
                                string ptc = Common.scaleColor("FFFFFF", (j > 0) ? lum3[j - 1] : lumcol[iEv], wt[i]);
                                double tlo = (j > 0) ? lum3t[j - 1] : t0;
                                double thi = (j < lum3.Length) ? lum3t[j] : pt3;
                                Func <double, double> flo = xx => (xx < tlo) ? tlo : xx;
                                Func <double, double> fhi = xx => (xx > thi) ? thi : xx;
                                ass_out.Events.Add(
                                    ev.StartReplace(flo(t0)).EndReplace(fhi(t1)).StyleReplace("pt").TextReplace(
                                        ASSEffect.a(1, bt) + ASSEffect.c(1, col0) + ASSEffect.fad((j == 0) ? 0.1 : 0, 0) + ASSEffect.a(3, "FF") +
                                        ASSEffect.move(ptx, pty, ptx0, pty0) + ptstr));
                                ass_out.Events.Add(
                                    ev.StartReplace(flo(t1)).EndReplace(fhi(pt2 + 0.2)).StyleReplace("pt").TextReplace(
                                        ASSEffect.a(1, bt) + ASSEffect.c(1, col0) + ASSEffect.a(3, "FF") +
                                        ASSEffect.fad(0, (j == lum3.Length) ? 0.3 : 0) +
                                        ASSEffect.pos(ptx0, pty0) + ptstr));
                                ass_out.Events.Add(
                                    ev.StartReplace(flo(pt2 - 0.1)).EndReplace(fhi(pt3)).StyleReplace("pt").TextReplace(
                                        ASSEffect.a(1, bt) + ASSEffect.c(1, ptc) + ASSEffect.a(3, "FF") +
                                        ASSEffect.fad((j == 0) ? 0.3 : 0, (j == lum3.Length) ? 0.3 : 0) +
                                        ASSEffect.pos(ptx0, pty0) + ptstr));
                            }
                        }
                        else if (iEv == 4)
                        {
                            for (int j = 0; j <= lum4.Length; j++)
                            {
                                string ptc = Common.scaleColor("FFFFFF", (j > 0) ? lum4[j - 1] : lumcol[iEv], wt[i]);
                                double tlo = (j > 0) ? lum4t[j - 1] : t0;
                                double thi = (j < lum4.Length) ? lum4t[j] : pt3;
                                Func <double, double> flo = xx => (xx < tlo) ? tlo : xx;
                                Func <double, double> fhi = xx => (xx > thi) ? thi : xx;
                                ass_out.Events.Add(
                                    ev.StartReplace(flo(t0)).EndReplace(fhi(t1)).StyleReplace("pt").TextReplace(
                                        ASSEffect.a(1, bt) + ASSEffect.c(1, col0) + ASSEffect.fad((j == 0) ? 0.1 : 0, 0) + ASSEffect.a(3, "FF") +
                                        ASSEffect.move(ptx, pty, ptx0, pty0) + ptstr));
                                ass_out.Events.Add(
                                    ev.StartReplace(flo(t1)).EndReplace(fhi(pt2 + 0.2)).StyleReplace("pt").TextReplace(
                                        ASSEffect.a(1, bt) + ASSEffect.c(1, col0) + ASSEffect.a(3, "FF") +
                                        ASSEffect.fad(0, (j == lum4.Length) ? 0.3 : 0) +
                                        ASSEffect.pos(ptx0, pty0) + ptstr));
                                ass_out.Events.Add(
                                    ev.StartReplace(flo(pt2 - 0.1)).EndReplace(fhi(pt3)).StyleReplace("pt").TextReplace(
                                        ASSEffect.a(1, bt) + ASSEffect.c(1, ptc) + ASSEffect.a(3, "FF") +
                                        ASSEffect.fad((j == 0) ? 0.3 : 0, (j == lum4.Length) ? 0.3 : 0) +
                                        ASSEffect.pos(ptx0, pty0) + ptstr));
                            }
                        }

                        if (iEv == 2 && Common.RandomBool(rnd, 0.05))
                        {
                            ass_out.Events.Add(
                                ev.StartReplace(pt2).EndReplace(pt2 + 1.5).StyleReplace("pt").LayerReplace(13).TextReplace(
                                    ASSEffect.move(ptx0, pty0, ptx0, pty0 + FontHeight + MarginBottom) +
                                    ASSEffect.fad(0, 0.6) + ASSEffect.a(1, "CC") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "00") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.t(0, Common.RandomDouble(rnd, 1.5, 3), ASSEffect.fry(-720).t()) +
                                    ASSEffect.bord(2) + ASSEffect.blur(2) + CreatePolygon(rnd, 30, 30, 4)));
                        }
                    }

                    if (iEv == 3)
                    {
                        for (int i = 0; i < (int)(Math.Round((kEnd - kStart) * 50)); i++)
                        {
                            ASSPoint pt = new ASSPoint {
                                X = Common.RandomInt(rnd, startx0, startx0 + (int)sw), Y = Common.RandomInt(rnd, y0, y0 + FontHeight)
                            };
                            double pt0 = Common.RandomDouble(rnd, ev.Start, ev.Start + 1.62);
                            double pt1 = pt0 + 0.5;
                            ass_out.Events.Add(
                                ev.StartReplace(pt0).EndReplace(pt1).StyleReplace("pt").TextReplace(
                                    ASSEffect.move(pt.X, pt.Y, Common.RandomInt(rnd, pt.X - 30, pt.X - 50), Common.RandomInt(rnd, pt.Y - 35, pt.Y - 55)) +
                                    ASSEffect.fad(0, 0.3) + ASSEffect.a(1, "CC") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "00") + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.t(0, Common.RandomDouble(rnd, 0.5, 1.5), ASSEffect.frz(Common.RandomInt(rnd, -500, 500)).t() + ASSEffect.fry(Common.RandomInt(rnd, -500, 500)).t() + ASSEffect.frx(Common.RandomInt(rnd, -500, 500)).t()) +
                                    ASSEffect.bord(3) + ASSEffect.blur(2) + CreatePolygon(rnd, 10, 25, Common.RandomInt(rnd, 5, 7))));
                        }
                        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[iEv];
                            for (int j = 0; j < lum3t.Length; j++)
                            {
                                if (pt0 >= lum3t[j] - 0.5)
                                {
                                    ptc = lum3[j];
                                }
                            }
                            ptc = Common.scaleColor(ptc, "FFFFFF", 0.75);
                            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)));
                        }
                    }

                    if (iEv == 4)
                    {
                        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[iEv];
                            if (pt0 >= lum4t[0] - 0.5)
                            {
                                ptc = lum4[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)));
                        }
                    }

                    if (iEv == 5)
                    {
                        for (int i = 0; i < 100; i++)
                        {
                            ASSPoint pt = new ASSPoint {
                                X = Common.RandomInt(rnd, startx0, startx0 + (int)sw), Y = Common.RandomInt(rnd, y0, y0 + FontHeight)
                            };
                            double pt0 = Common.RandomDouble(rnd, ev.End, ev.End + 1.8);
                            double pt1 = pt0 + 0.5;
                            string ptc = Common.scaleColor(lumcol[iEv], "FFFFFF", 0.9);
                            ass_out.Events.Add(
                                ev.StartReplace(pt0).EndReplace(pt1).StyleReplace("pt").TextReplace(
                                    ASSEffect.move(pt.X, pt.Y, Common.RandomInt(rnd, pt.X - 30, pt.X - 50), Common.RandomInt(rnd, pt.Y - 35, pt.Y - 55)) +
                                    ASSEffect.fad(0, 0.3) + ASSEffect.a(1, "CC") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, "00") + ASSEffect.c(3, ptc) +
                                    ASSEffect.t(0, Common.RandomDouble(rnd, 0.5, 1.5), ASSEffect.frz(Common.RandomInt(rnd, -500, 500)).t() + ASSEffect.fry(Common.RandomInt(rnd, -500, 500)).t() + ASSEffect.frx(Common.RandomInt(rnd, -500, 500)).t()) +
                                    ASSEffect.bord(3) + ASSEffect.blur(2) + CreatePolygon(rnd, 10, 25, Common.RandomInt(rnd, 5, 7))));
                        }
                        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[iEv];
                            ptc = Common.scaleColor(ptc, "FFFFFF", 0.75);
                            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>();

            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;

                //ASSColor col1 = Common.RandomColor(rnd, 1, new ASSColor { A = 0, R = 20, B = 20, G = 20 }, new ASSColor { A = 0, R = 235, B = 235, G = 235 });
                //ASSColor col2 = Common.RandomColor(rnd, 1, new ASSColor { A = 0, R = col1.R - 40, B = col1.B - 40, G = col1.G - 40 }, new ASSColor { A = 0, R = col1.R + 40, B = col1.B + 40, G = col1.G + 40 });
                ASSColor col1 = Common.RandomColor(rnd, 1);
                ASSColor col2 = Common.RandomColor(rnd, 1);

                while (Math.Abs(col1.R - col2.R) + Math.Abs(col1.G - col2.G) + Math.Abs(col1.B - col2.B) < 100)
                {
                    col1 = Common.RandomColor(rnd, 1);
                    col2 = Common.RandomColor(rnd, 1);
                }

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

                    string colStr = Common.scaleColor(col1, col2, r);

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

                    if (iEv % 2 != 0 && ev.Start - ass_in.Events[iEv - 1].End < 0.1)
                    {
                        y -= FontHeight + 3;
                    }

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

                    double t0 = ev.Start + r * 0.5 - 1.0;
                    if (iEv % 2 != 0)
                    {
                        t0 = ev.Start - r * 0.5 - 1.0;
                    }
                    double t01 = t0 + 0.5;
                    double t1  = kStart - 0.1;
                    if (t01 > t1)
                    {
                        t01 = t1;
                        t0  = t01 - 0.5;
                    }
                    double t2 = kStart + 0.2;
                    double t3 = kStart + 0.5;
                    double t4 = ev.End + r * 1.0 - 1.0;
                    if (iEv % 2 != 0)
                    {
                        t4 = ev.End - r * 1.0 + 1.0;
                    }
                    if (t4 < t3)
                    {
                        t4 = t3;
                    }
                    double t5 = t4 + 0.5;

                    double speed  = -20;
                    int    StartX = 848;
                    int    EndX   = 0;
                    if (iEv % 2 != 0)
                    {
                        speed  = 20;
                        StartX = 0;
                        EndX   = 848;
                    }

                    GetX_orgX      = x;
                    GetX_Speed     = speed;
                    GetX_StartTime = ev.Start;

                    ass_out.Events.Add(
                        ev.StartReplace(t0).EndReplace(t01).TextReplace(
                            ASSEffect.move(StartX, y, GetX(t01), y) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "AA") + ASSEffect.c(3, "FFFFFF") +
                            ASSEffect.xbord(2) + ASSEffect.ybord(2) + ASSEffect.be(10) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t01).EndReplace(t2).TextReplace(
                            ASSEffect.move(GetX(t01), y, GetX(t2), y) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "AA") + ASSEffect.c(3, "FFFFFF") +
                            ASSEffect.xbord(2) + ASSEffect.ybord(2) + ASSEffect.be(10) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t2).EndReplace(t3).TextReplace(
                            ASSEffect.move(GetX(t2), y, GetX(t3), y) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "AA") + ASSEffect.c(3, "FFFFFF") +
                            ASSEffect.xbord(2) + ASSEffect.ybord(2) + ASSEffect.be(10) + ASSEffect.t(0, t3 - t2, ASSEffect.a(1, "77").t() + ASSEffect.c(3, colStr).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t3).EndReplace(t4).TextReplace(
                            ASSEffect.move(GetX(t3), y, GetX(t4), y) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "77") + ASSEffect.c(3, colStr) +
                            ASSEffect.xbord(2) + ASSEffect.ybord(2) + ASSEffect.be(10) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t4).EndReplace(t5).TextReplace(
                            ASSEffect.move(GetX(t4), y, EndX, y) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "77") + ASSEffect.c(3, colStr) +
                            ASSEffect.xbord(2) + ASSEffect.ybord(2) + ASSEffect.be(10) +
                            ke.KText));

                    ass_out.Events.Add(
                        ev.StartReplace(t0).EndReplace(t01).TextReplace(
                            ASSEffect.move(StartX, y, GetX(t01), y) + ASSEffect.fad(t01 - t0, 0) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t01).EndReplace(t1).TextReplace(
                            ASSEffect.move(GetX(t01), y, GetX(t1), y) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t1).EndReplace(t2).TextReplace(
                            ASSEffect.move(GetX(t1), y, GetX(t2), y - 10) +
                            ASSEffect.t(0, t2 - t1, ASSEffect.frx(180 * 3).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t2).EndReplace(t3).TextReplace(
                            ASSEffect.move(GetX(t2), y - 10, GetX(t3), y) + ASSEffect.frx(180) +
                            ASSEffect.t(0, t3 - t2, ASSEffect.frx(360).t() + ASSEffect.c(1, colStr).t()) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t3).EndReplace(t4).TextReplace(
                            ASSEffect.move(GetX(t3), y, GetX(t4), y) + ASSEffect.c(1, colStr) +
                            ke.KText));
                    ass_out.Events.Add(
                        ev.StartReplace(t4).EndReplace(t5).TextReplace(
                            ASSEffect.move(GetX(t4), y, EndX, y) + ASSEffect.c(1, colStr) + ASSEffect.fad(0, t5 - t4) +
                            ke.KText));
                }
            }
            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>();

            this.Font      = new System.Drawing.Font("FA 瑞筆行書M", 26, GraphicsUnit.Pixel);
            this.MaskStyle = "Style: Default,FA 瑞筆行書M,26,&H00FFCEE7,&HFF0000FF,&H00FF2D49,&HFF0A5A84,-1,0,0,0,100,100,1,0,1,2,0,5,20,20,10,128";

            for (int i = 0; i < 21; i++)
            {
                ASSEvent        ev     = ass_in.Events[i];
                List <KElement> kelems = ev.SplitK(true);
                if (i >= 11)
                {
                    this.Font      = new System.Drawing.Font("華康行書體(P)", 26, GraphicsUnit.Pixel);
                    this.MaskStyle = "Style: Default,華康行書體(P),26,&H00FFCEE7,&HFF0000FF,&H00FF2D49,&HFF0A5A84,-1,0,0,0,100,100,1,0,1,2,0,5,20,20,10,136";
                }
                int sumw = GetTotalWidth(ev);
                int x0   = (PlayResX - MarginLeft - MarginRight - sumw) / 2 + MarginLeft;
                int kSum = 0;
                for (int ik = 0; ik < kelems.Count; ik++)
                {
                    Console.WriteLine("{0} / {1} : {2} / {3}", i + 1, ass_in.Events.Count, ik + 1, kelems.Count);
                    KElement elem = kelems[ik];
                    Size     sz   = this.GetSize(elem.KText);
                    int      x    = x0;
                    x0 += sz.Width + this.FontSpace;
                    int y = PlayResY - MarginBottom;
                    if (i == 5)
                    {
                        y -= FontHeight + 10;
                    }
                    if (i >= 11)
                    {
                        y = MarginTop + FontHeight;
                    }
                    double kStart = (double)kSum * 0.01;
                    double kEnd   = (double)(kSum + elem.KValue) * 0.01;
                    kEnd = kStart + 0.6;
                    double kMid = (kStart + kEnd) * 0.5;
                    double kQ1  = kStart + (kEnd - kStart) * 0.1;

                    double r  = (double)ik / (double)(kelems.Count - 1);
                    double r0 = 1.0 - r;

                    int fd_xof = (int)((double)(ik - (kelems.Count - 1) / 2) / (double)(kelems.Count - 1) * (double)PlayResX * 0.2);

                    // an7 -> an5
                    x += sz.Width / 2;
                    y -= FontHeight / 2;

                    // 0.5秒内出现
                    ass_out.Events.Add(ev.StartReplace(ev.Start - r0 * 0.5).EndReplace(ev.Start - r0 * 0.5 + 0.3).TextReplace(
                                           ASSEffect.move(x + fd_xof, y, x, y) + ASSEffect.an(5) + ASSEffect.be(1) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "FF") + ASSEffect.fsc(400, 400) +
                                           ASSEffect.t(0, 0.3, ASSEffect.fsc(100, 100).t() + ASSEffect.a(1, "00").t() + ASSEffect.a(3, "00").t() + ASSEffect.fry(-360).t()) +
                                           elem.KText));

                    double newStart = ev.Start;
                    if (ev.Start - r0 * 0.5 + 0.3 > ev.Start)
                    {
                        newStart = ev.Start - r0 * 0.5 + 0.3;
                    }
                    else
                    {
                        ass_out.Events.Add(ev.StartReplace(ev.Start - r0 * 0.5 + 0.3).EndReplace(ev.Start).TextReplace(
                                               ASSEffect.pos(x, y) + ASSEffect.an(5) + ASSEffect.be(1) + elem.KText));
                    }

                    //ass_out.Events.Add(ev.TextReplace(
                    //  ASSEffect.pos(x, y) + ASSEffect.an(5) + elem.KText));
                    if (i < 11)
                    {
                        ass_out.Events.Add(ev.StartReplace(newStart).EndReplace(ev.Start + kStart).TextReplace(
                                               ASSEffect.pos(x, y) + ASSEffect.an(5) + ASSEffect.be(1) + elem.KText));
                        ass_out.Events.Add(ev.StartReplace(ev.Start + kStart).EndReplace(ev.Start + kEnd).TextReplace(
                                               ASSEffect.pos(x, y) + ASSEffect.an(5) + ASSEffect.be(1) +
                                               ASSEffect.t(0, kQ1 - kStart, ASSEffect.c(1, "FFFFFF").t() + ASSEffect.c(1, "FFFFFF").t() + ASSEffect.fsc(200, 200).t()) +
                                               ASSEffect.t(kQ1 - kStart, kEnd - kStart, ASSEffect.c(3, "A4CEE7").t() + ASSEffect.c(1, "072D49").t() + ASSEffect.fsc(100, 100).t()) +
                                               elem.KText));
                        ass_out.Events.Add(ev.StartReplace(ev.Start + kEnd).EndReplace(ev.End).TextReplace(
                                               ASSEffect.pos(x, y) + ASSEffect.an(5) + ASSEffect.be(1) + ASSEffect.c(1, "072D49") + ASSEffect.c(3, "A4CEE7") + elem.KText));
                    }
                    else
                    {
                        ass_out.Events.Add(ev.StartReplace(newStart).TextReplace(
                                               ASSEffect.pos(x, y) + ASSEffect.an(5) + ASSEffect.be(1) + elem.KText));
                    }

                    // 0.5秒内消失
                    if (i < 11)
                    {
                        ass_out.Events.Add(ev.StartReplace(ev.End + r * 0.5).EndReplace(ev.End + r * 0.5 + 0.3).TextReplace(
                                               ASSEffect.move(x, y, x + fd_xof, y) + ASSEffect.be(1) + ASSEffect.an(5) + ASSEffect.c(1, "072D49") + ASSEffect.c(3, "A4CEE7") +
                                               ASSEffect.t(0, 0.3, ASSEffect.fsc(400, 400).t() + ASSEffect.a(1, "FF").t() + ASSEffect.a(3, "FF").t() + ASSEffect.fry(-360).t()) +
                                               elem.KText));
                        ass_out.Events.Add(ev.StartReplace(ev.End).EndReplace(ev.End + r * 0.5).TextReplace(
                                               ASSEffect.pos(x, y) + ASSEffect.an(5) + ASSEffect.be(1) + ASSEffect.c(1, "072D49") + ASSEffect.c(3, "A4CEE7") + elem.KText));
                    }
                    else
                    {
                        ass_out.Events.Add(ev.StartReplace(ev.End + r * 0.5).EndReplace(ev.End + r * 0.5 + 0.3).TextReplace(
                                               ASSEffect.move(x, y, x + fd_xof, y) + ASSEffect.be(1) + ASSEffect.an(5) +
                                               ASSEffect.t(0, 0.3, ASSEffect.fsc(400, 400).t() + ASSEffect.a(1, "FF").t() + ASSEffect.a(3, "FF").t() + ASSEffect.fry(-360).t()) +
                                               elem.KText));
                        ass_out.Events.Add(ev.StartReplace(ev.End).EndReplace(ev.End + r * 0.5).TextReplace(
                                               ASSEffect.pos(x, y) + ASSEffect.an(5) + ASSEffect.be(1) + elem.KText));
                    }

                    kSum += elem.KValue;
                }
            }

            ass_out.SaveFile(OutFileName);
        }
示例#6
0
        public override void Run()
        {
            string ptstr = @"{\p1}m 0 0 l 1 0 1 1 0 1";

            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    ox  = 300;
            int    oy  = 300;
            Random rnd = new Random();

            double r1 = 5;
            double r2 = 80;
            Func <double, double, string> f1 = (a, b) => string.Format(" {0} {1}", (int)(Math.Round(a)), (int)(Math.Round(b)));
            string s     = @"{\p1}m ";
            string s1    = @"{\p1}m ";
            string s2    = @"{\p1}m ";
            int    diag  = 3;
            double scale = 0.5;
            bool   first = true;

            for (int iag = 0; iag < 360;)
            {
                double ag = (double)iag / 360.0 * Math.PI * 2;
                r1 = Common.RandomDouble(rnd, 5, 12) * scale;
                r2 = Common.RandomDouble(rnd, 80, 120) * scale;
                double x  = Math.Cos(ag) * r1;
                double y  = Math.Sin(ag) * r1;
                double x3 = Math.Cos(ag) * r2;
                double y3 = Math.Sin(ag) * r2;
                iag += diag;
                ag   = (double)iag / 360.0 * Math.PI * 2;
                double x1 = Math.Cos(ag) * r2;
                double y1 = Math.Sin(ag) * r2;
                double x2 = Math.Cos(ag) * r2 * 0.5;
                double y2 = Math.Sin(ag) * r2 * 0.5;
                s  += f1(x, y);
                s1 += f1(x, y);
                if (Common.RandomBool(rnd, 0.8))
                {
                    s2 += f1(x3, y3);
                }
                else
                {
                    s2 += f1(x, y);
                }
                if (first)
                {
                    s    += " l";
                    s1   += " l";
                    s2   += " l";
                    first = false;
                }
                s   += f1(x1, y1);
                s1  += f1(x2, y2);
                s2  += f1(x1, y1);
                iag += diag;
            }
            ass_out.AppendEvent(20, "pt", 0, 10,
                                ASSEffect.pos(ox, oy) + ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "EE") + ASSEffect.blur(0.5) +
                                ASSEffect.bord(0) + ASSEffect.be(0) +
                                t(fsc(200, 200).t()) +
                                s1);
            ass_out.AppendEvent(10, "pt", 0, 10,
                                ASSEffect.pos(ox, oy) + ASSEffect.a(1, "00") + ASSEffect.c(1, "306BFF") + ASSEffect.a(3, "EE") + ASSEffect.blur(0.5) +
                                t(fsc(200, 200).t()) +
                                s);
            ass_out.AppendEvent(0, "pt", 0, 10,
                                ASSEffect.pos(ox, oy) + ASSEffect.a(1, "F7") + ASSEffect.c(1, "306BFF") + ASSEffect.a(3, "EE") + ASSEffect.blur(5) +
                                fsc(85, 85) +
                                t(fsc(170, 170).t()) +
                                s2);

            ass_out.SaveFile(OutFileName);
        }
示例#7
0
        public override void Run()
        {
            string ptstr = @"{\p1}m 0 0 l 1 0 1 1 0 1";

            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        x     = 300;
            int        y     = 200;
            StringMask mask  = GetMask("き", x, y);
            bool       first = true;

            ass_out.AppendEvent(0, "Default", 0, 10, ASSEffect.pos(265, y) + ASSEffect.an(5) + "拉");
            foreach (ASSPoint pt in mask.Points)
            {
                double ag  = (double)(pt.Y - mask.Y0) / (double)mask.Height * 0.25;
                int    iag = (int)(ag / Math.PI / 2 * 360);
                //ag = -0.2;
                int yy = (int)(150 * Math.Sin(ag));
                int xx = (int)(150 * Math.Cos(ag));
                ass_out.Events.Add(
                    new ASSEvent
                {
                    Effect  = "",
                    Layer   = 0,
                    MarginL = "0000",
                    MarginR = "0000",
                    MarginV = "0000",
                    Name    = "NTP",
                    Style   = "pt",
                    Start   = 1,
                    End     = 11,
                    Text    = ASSEffect.pos(pt.X, pt.Y) + ASSEffect.a(1, Common.ToHex2(255 - pt.Brightness)) + ASSEffect.c(1, "FFFFFF") + ASSEffect.a(3, "FF") + ptstr
                }
                    );
                //if (!first) continue;
                first = false;
                ass_out.Events.Add(
                    new ASSEvent
                {
                    Effect  = "",
                    Layer   = 1,
                    MarginL = "0000",
                    MarginR = "0000",
                    MarginV = "0000",
                    Name    = "NTP",
                    Style   = "pt",
                    Start   = 1,
                    End     = 11,
                    Text    = ASSEffect.pos(pt.X, pt.Y) + ASSEffect.frz(iag) + ASSEffect.t(0, 10, ASSEffect.fry(360 * 5).t()) + ASSEffect.an(7) + ASSEffect.a(1, "F0") + ASSEffect.c(1, "7879F5") + ASSEffect.a(3, "FF") + ASSEffect.bord(0) + ASSEffect.be(1) + @"{\p2}m 0 0 l -200 0 0 2"  //  @"{\p1}m 0 0 l " + xx + " " + yy + " 0 2"
                });
            }

            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>();

            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);
        }
示例#9
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);
        }
示例#10
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);
        }
        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);
        }
示例#12
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);
        }
示例#13
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);
        }
        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()
        {
            string ptstr = @"{\p1}m 0 0 l 1 0 1 1 0 1";

            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    ox    = 300;
            int    oy    = 300;
            double r     = 30;
            Random rnd   = new Random();
            int    sz    = 3;
            int    maxsz = 5;
            string cb    = "44";
            string cb2   = "11";
            string eb    = "55";
            string eb2   = "22";
            string col1  = "FFFC94";
            string col2  = "FF94D1";

            ASSPoint[] pt2 = new ASSPoint[10];
            for (int i = 0; i < pt2.Length; i++)
            {
                pt2[i] = new ASSPoint {
                    X = Common.RandomInt(rnd, ox - 15, ox + 15), Y = Common.RandomInt(rnd, oy - 70, oy - 40)
                }
            }
            ;

            for (double ag = 0; ag < Math.PI * 2; ag += 0.05)
            {
                double t0 = 2 + ag * 0.3;
                double t1 = 2 + Math.PI * 2 * 0.3 + Common.RandomDouble(rnd, 0, 0.3);
                double t2 = 2 + Math.PI * 2 * 0.3 + 1 + Common.RandomDouble(rnd, 0, 0.7);
                double t3 = t2 + 0.8;
                if (Common.RandomBool(rnd, (0.25 + 0.5 * (1.0 - (double)(sz - 1) / (double)(maxsz - 1)))))
                {
                    sz++;
                }
                else
                {
                    sz--;
                }
                if (sz < 1)
                {
                    sz = 1;
                }
                if (sz > maxsz)
                {
                    sz = maxsz;
                }
                double x = ox + r * Math.Cos(ag);
                double y = oy + r * Math.Sin(ag);

                double r1  = Common.RandomDouble(rnd, 0, 10);
                double ag1 = Common.RandomDouble(rnd, 0, Math.PI * 2);
                double x1  = ox + r1 * Math.Cos(ag1);
                double y1  = oy + r1 * Math.Sin(ag1);

                int    pt2i = Common.RandomInt(rnd, 0, pt2.Length - 1);
                double x2   = pt2[pt2i].X;
                double y2   = pt2[pt2i].Y;

                ass_out.AppendEvent(10, "pt", t0, t1,
                                    ASSEffect.pos(x, y) +
                                    ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, cb) + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.bord(1) + ASSEffect.be(1) +
                                    ASSEffect.t(0, (t1 - t0) * 1, ASSEffect.bord(sz).t() + ASSEffect.be(sz).t()) +
                                    ptstr);
                ass_out.AppendEvent(5, "pt", t0, t1,
                                    ASSEffect.pos(x, y) +
                                    ASSEffect.a(1, "FF") +
                                    ASSEffect.a(3, eb) + ASSEffect.c(3, col1) +
                                    ASSEffect.bord(2) + ASSEffect.blur(2) +
                                    ASSEffect.t(0, (t1 - t0) * 1, ASSEffect.bord(sz + 1).t() + ASSEffect.blur(sz + 1).t()) +
                                    ASSEffect.t(0, (t1 - t0) * 0.5, ASSEffect.c(3, col2).t()) +
                                    ASSEffect.t((t1 - t0) * 0.5, t1, ASSEffect.c(3, col1).t()) +
                                    ptstr);

                string ctmp = Common.scaleColor(col1, col2, Common.RandomDouble(rnd, 0, 1));
                ass_out.AppendEvent(10, "pt", t1, t2,
                                    ASSEffect.move(x, y, x1, y1) +
                                    ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, cb) + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.bord(sz) + ASSEffect.be(sz) +
                                    ptstr);
                ass_out.AppendEvent(5, "pt", t1, t2,
                                    ASSEffect.move(x, y, x1, y1) +
                                    ASSEffect.a(1, "FF") +
                                    ASSEffect.a(3, eb) + ASSEffect.c(3, col1) +
                                    ASSEffect.bord(sz + 1) + ASSEffect.blur(sz + 1) +
                                    ASSEffect.t(0, t2 - t1, ASSEffect.c(3, ctmp).t()) +
                                    ptstr);

                ass_out.AppendEvent(10, "pt", t2, t3,
                                    ASSEffect.fad(0, 0.5) +
                                    ASSEffect.move(x1, y1, x2, y2) +
                                    ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, cb2) + ASSEffect.c(3, "FFFFFF") +
                                    ASSEffect.bord(sz) + ASSEffect.be(sz) +
                                    ASSEffect.t(0, (t3 - t2) * 0.5, ASSEffect.bord(0).t() + ASSEffect.be(1).t()) +
                                    ptstr);
                ass_out.AppendEvent(5, "pt", t2, t3,
                                    ASSEffect.fad(0, 0.2) +
                                    ASSEffect.move(x1, y1, x2, y2) +
                                    ASSEffect.a(1, "00") + ASSEffect.c(1, "FFFFFF") +
                                    ASSEffect.a(3, eb2) + ASSEffect.c(3, ctmp) +
                                    ASSEffect.bord(sz + 1) + ASSEffect.blur(sz + 1) +
                                    ASSEffect.t(0, (t3 - t2) * 0.5, ASSEffect.bord(1).t() + ASSEffect.blur(1).t()) +
                                    ptstr);
            }

            ass_out.SaveFile(OutFileName);
        }
    }
示例#16
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>();

            this.Font = new System.Drawing.Font("FA 瑞筆行書M", 13);

            Particle pt = new Particle
            {
                AreaHeight    = 80,
                AreaWidth     = 200,
                IsRandomColor = true,
                Color         = new ASSColor {
                    A = 0, R = 255, G = 255, B = 255, Index = 1
                },
                Color1 = new ASSColor {
                    A = 0, R = 255, G = 255, B = 255, Index = 1
                },
                Color2 = new ASSColor {
                    A = 0, R = 0xEF, G = 0xF7, B = 0xFB, Index = 1
                },
                Count           = 100,
                FontSize        = this.FontHeight,
                MinLast         = 1,
                MaxLast         = 2,
                IsMove          = true,
                MoveStyle       = 2,
                IsPatternScale  = false,
                PatternScaleX   = 250,
                PatternScaleY   = 250,
                ParticlePattern = ParticlePatternType.o,
                Style           = "pt",
                XOffset         = 0,
                YOffset         = 0,
                IsRotate        = true,
                BE = 1
            };

            for (int i = 0; i < 20; i++)
            {
                if (i >= 10)
                {
                    this.Font = new System.Drawing.Font("華康行書體(P)", 13);
                }
                ASSEvent        ev     = ass_in.Events[i];
                List <KElement> kelems = ev.SplitK(false);
                int             sumw   = GetTotalWidth(ev);
                int             x0     = (PlayResX - MarginLeft - MarginRight - sumw) / 2 + MarginLeft;
                int             kSum   = 0;
                for (int ik = 0; ik < kelems.Count; ik++)
                {
                    KElement elem = kelems[ik];
                    Size     sz   = this.GetSize(elem.KText);
                    int      x    = x0;
                    x0 += sz.Width + this.FontSpace;
                    int y = PlayResY - MarginBottom;
                    if (i >= 10)
                    {
                        y = MarginTop + FontHeight;
                    }
                    double kStart = (double)kSum * 0.01;
                    double kEnd   = (double)(kSum + elem.KValue) * 0.01;
                    kEnd = kStart + 0.6;
                    double kMid = (kStart + kEnd) * 0.5;
                    double kQ1  = kStart + (kEnd - kStart) * 0.1;

                    double r  = (double)ik / (double)(kelems.Count - 1);
                    double r0 = 1.0 - r;

                    int fd_xof = (int)((double)(ik - (kelems.Count - 1) / 2) / (double)(kelems.Count - 1) * (double)PlayResX * 0.2);

                    // particle need an7 position
                    pt.X     = x;
                    pt.Y     = y - FontHeight;
                    pt.Start = ev.Start + kStart;
                    pt.End   = ev.Start + kEnd;

                    // an7 -> an5
                    x += FontWidth / 2;
                    y -= FontHeight / 2;

                    // 提前1秒出现
                    ass_out.Events.Add(ev.StartReplace(ev.Start - r0 * 1.0).TextReplace(
                                           ASSEffect.fad(0.3, 0) + ASSEffect.be(1) +
                                           ASSEffect.pos(x, y) + ASSEffect.an(5) +
                                           ASSEffect.t(kStart + r0 * 1.0, kEnd + r0 * 1.0, ASSEffect.be(10).t() + ASSEffect.a(1, "FF").t()) +
                                           ASSEffect.t(kStart + r0 * 1.0 + 0.2, kEnd + r0 * 1.0, ASSEffect.a(3, "FF").t()) +
                                           elem.KText));

                    ass_out.Events.AddRange(pt.Create());

                    kSum += elem.KValue;
                }
            }

            ass_out.SaveFile(OutFileName);
        }
示例#17
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);
        }