public MovParticle() { MainColor = new ASSColor { A = 0, R = 255, G = 255, B = 255, Index = 1 }; Path = new List <MovParticlePathElem>(); }
public override void Run() { ASS ass_in = ASS.FromFile(this.InFileName); ASS ass_out = new ASS(); ass_out.Header = ass_in.Header; ass_out.Events = new List <ASSEvent>(); int c = IntAdd(2, 3); Random rnd = new Random(); //string s = TestHelloWorld(); string fn = "FA 瑞筆行書M"; string ss = ""; char[] cc = new char[10000]; int cclen = 1; bool b1 = GetOutline(cc, ref cclen, '々', Encoding.Unicode.GetChars(Encoding.Unicode.GetBytes(fn)), 128, 30 * 8, 1000, 564, 424 * 8, 240 * 8); for (int i = 0; i < cclen; i++) { ss += cc[i]; } //ass_out.AppendEvent(0, "pt", 0, 1, ASSEffect.pos(424, 240) + @"{\an7\p4}" + ss); ass_out.AppendEvent(0, "pt", 0, 10, ASSEffect.pos(0, 0) + @"{\an7\clip(4," + ss + @")\1a&H77&\p1} m -1000 -1000 l 1000 -1000 1000 1000 -1000 1000"); for (int i = 0; i < 10; i++) { ASSColor co = Common.RandomColor(rnd, 1, ASSColor.FromBBGGRR(1, "000000"), ASSColor.FromBBGGRR(1, "FFFFFF")); ass_out.AppendEvent(1, "pt", (double)i * 0.5, (double)i * 0.5 + 1, ASSEffect.move(400, 0, 500, 0) + ASSEffect.c(1, co.ToColString()) + ASSEffect.c(3, co.ToColString()) + @"{\an7\clip(4," + ss + @")\1a&H00&\3a&H00&\bord25\blur25\p1} m 0 0 l 1 0 1 480 0 480"); } /* ass_out.AppendEvent(0, "pt", 0, 10, * ASSEffect.pos(0, 0) + @"{\an7\p1}m -1000 240 l 1000 240 1000 241 -1000 241" * ); * ass_out.AppendEvent(0, "pt", 0, 10, * ASSEffect.pos(0, 0) + @"{\an7\p1}m 424 -1000 l 425 -1000 425 1000 424 1000" * ); * ass_out.AppendEvent(0, "Default", 1, 10, * ASSEffect.pos(0, 0) + ASSEffect.an(7) + '々');*/ ass_out.SaveFile(OutFileName); }
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 ptString = @"{\p8}m 0 0 l 128 0 128 128 0 128"; string[] colString = { "4BFCCC", "CE8046", "52065D", "8F0036", "33AE52", "6ADB57" }; colString = colString.Select(s => ASSColor.HtmlToASS(s)).ToArray(); for (int iEv = 0; iEv < ass_in.Events.Count; iEv++) { Console.WriteLine("{0} / {1}", iEv + 1, ass_in.Events.Count); ASSEvent ev = ass_in.Events[iEv]; List <KElement> kelems = ev.SplitK(true); /// an7 pos int x0 = (PlayResX - GetTotalWidth(ev)) / 2; int y0 = PlayResY - MarginBottom - FontHeight; Random rnd = new Random(); int kSum = 0; string col0 = colString[iEv % colString.Length]; string col1 = (iEv >= 7 && iEv <= 10) ? "CCCCCC" : "CCCCCC"; string col20 = "FFFFFF"; string col21 = "CCCCCC"; string col22 = "888888"; string col23 = "444444"; string col24 = "111111"; if (iEv >= 7 && iEv <= 10) { col20 = "111111"; col21 = "444444"; col23 = "CCCCCC"; col24 = "FFFFFF"; } for (int iK = 0; iK < kelems.Count; iK++) { KElement ke = kelems[iK]; double r = (double)iK / (double)(kelems.Count - 1); Size sz = GetSize(ke.KText); /// an5 pos int x = x0 + this.FontSpace + sz.Width / 2; int y = y0 + FontHeight; int mask_x0 = x0 + 2; int mask_y0 = y0 + 0; StringMask mask = GetMask(ke.KText, mask_x0, mask_y0); if (ke.KText == "ト") { mask = GetMask(ke.KText, mask_x0 + 3, mask_y0); } if (ke.KText == "ル") { mask = GetMask(ke.KText, mask_x0 + 1, mask_y0); } if (ke.KText == "ば") { mask = GetMask(ke.KText, mask_x0 + 1, mask_y0); } if (ke.KText == "し") { mask = GetMask(ke.KText, mask_x0 + 1, mask_y0); } if (ke.KText == "ダ") { mask = GetMask(ke.KText, mask_x0 + 1, mask_y0); } if (ke.KText == "ユ") { mask = GetMask(ke.KText, mask_x0 + 1, mask_y0); } if (ke.KText == "ン") { mask = GetMask(ke.KText, mask_x0, mask_y0); } if (ke.KText == "ざ") { mask = GetMask(ke.KText, mask_x0, mask_y0); } if (ke.KText == "に") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "浮") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "な") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "く") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "の") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "肩") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "を") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "て") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "テ") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "熱") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "る") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "こ") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "読") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "ま") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "さ") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "波") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "時") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "間") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "柄") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } if (ke.KText == "焼") { mask = GetMask(ke.KText, mask_x0 - 1, mask_y0); } x0 += this.FontSpace + sz.Width; y0 = y0; double kStart = ev.Start + kSum * 0.01; kSum += ke.KValue; double kEnd = ev.Start + kSum * 0.01; double t0 = ev.Start + r * 1.0 - 1.0; double t1 = t0 + 0.2; double t2 = t0 + 0.4; double t3 = t0 + 0.6; double t4 = t0 + 0.8; double t5 = kStart - 0.1; double t6 = kStart + 0.05; double t7 = kStart + 0.15; double t8 = kStart + 0.3; double t9 = ev.End + r * 1.0 - 1.0; double tA = t9 + 0.4; ass_out.Events.Add( ev.StyleReplace("bd").StartReplace(t5).EndReplace(t7).TextReplace( ASSEffect.pos(x, y) + ASSEffect.fad(t6 - t5, 0) + ASSEffect.bord(15) + ASSEffect.a(1, "FF") + ASSEffect.c(3, col0) + ASSEffect.blur(10) + ke.KText)); ass_out.Events.Add( ev.StyleReplace("bd").StartReplace(t7).EndReplace(t8 + 0.15).TextReplace( ASSEffect.pos(x, y) + ASSEffect.bord(15) + ASSEffect.fad(0, t8 + 0.15 - t7) + ASSEffect.a(1, "FF") + ASSEffect.c(3, col0) + ASSEffect.blur(10) + ke.KText)); ass_out.Events.Add( ev.StyleReplace("bd").StartReplace(t7).EndReplace(t8 + 0.15).TextReplace( ASSEffect.pos(x, y) + ASSEffect.fad(t8 + 0.15 - t7, 0) + ASSEffect.a(1, "FF") + ASSEffect.c(3, col0) + ASSEffect.blur(10) + ASSEffect.a(3, "77") + ke.KText)); ass_out.Events.Add( ev.StyleReplace("bd").StartReplace(t8 + 0.15).EndReplace(t9).TextReplace( ASSEffect.pos(x, y) + ASSEffect.a(1, "FF") + ASSEffect.c(3, col0) + ASSEffect.blur(10) + ASSEffect.a(3, "77") + ke.KText)); ass_out.Events.Add( ev.StyleReplace("bd").StartReplace(t9).EndReplace(tA).TextReplace( ASSEffect.pos(x, y) + ASSEffect.fad(0, tA - t9) + ASSEffect.a(1, "FF") + ASSEffect.c(3, col0) + ASSEffect.blur(10) + ASSEffect.a(3, "77") + ke.KText)); ass_out.Events.Add( ev.StartReplace(kEnd - 0.1).EndReplace(t9).TextReplace( ASSEffect.pos(x, y) + ASSEffect.fad(t9 - kEnd + 0.1, 0) + ASSEffect.a(3, "FF") + ASSEffect.c(1, col0) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t9).EndReplace(tA).TextReplace( ASSEffect.pos(x, y) + ASSEffect.fad(0, tA - t9) + ASSEffect.a(3, "FF") + ASSEffect.c(1, col0) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t0).EndReplace(t1).TextReplace( ASSEffect.move(x, y, x, y - 75) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "FF") + ASSEffect.blur(1) + ASSEffect.c(3, col20) + ASSEffect.t(0, t1 - t0, ASSEffect.a(3, "C0").t() + ASSEffect.frx(180).t() + ASSEffect.c(3, col21).t()) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t1).EndReplace(t2).TextReplace( ASSEffect.move(x, y - 75, x, y) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "C0") + ASSEffect.frx(180) + ASSEffect.blur(1) + ASSEffect.c(3, col21) + ASSEffect.t(0, t2 - t1, ASSEffect.a(3, "80").t() + ASSEffect.frx(360).t() + ASSEffect.c(3, col22).t()) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t2).EndReplace(t3).TextReplace( ASSEffect.move(x, y, x, y - 75) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "80") + ASSEffect.blur(1) + ASSEffect.c(3, col22) + ASSEffect.t(0, t3 - t2, ASSEffect.a(3, "40").t() + ASSEffect.frx(180).t() + ASSEffect.c(3, col23).t()) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t3).EndReplace(t4).TextReplace( ASSEffect.move(x, y - 75, x, y) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "40") + ASSEffect.frx(180) + ASSEffect.blur(1) + ASSEffect.c(3, col23) + ASSEffect.t(0, t4 - t3, ASSEffect.a(3, "00").t() + ASSEffect.frx(360).t() + ASSEffect.c(3, col24).t() + ASSEffect.blur(1).t()) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t4).EndReplace(t5).TextReplace( ASSEffect.pos(x, y) + ASSEffect.c(3, col24) + ASSEffect.a(1, "FF") + ASSEffect.blur(1) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t5).EndReplace(t8 + 0.1).TextReplace( ASSEffect.pos(x, y) + ASSEffect.a(1, "FF") + ASSEffect.t(0, t8 + 0.1 - t5, ASSEffect.c(3, col20).t() + ASSEffect.fry(360 * 3).t()) + ASSEffect.blur(1) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t8 + 0.1).EndReplace(t9).TextReplace( ASSEffect.pos(x, y) + ASSEffect.a(1, "FF") + ASSEffect.c(3, col20) + ASSEffect.blur(1) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t9).EndReplace(tA).TextReplace( ASSEffect.pos(x, y) + ASSEffect.a(1, "FF") + ASSEffect.c(3, col20) + ASSEffect.blur(1) + ASSEffect.fad(0, tA - t9) + ASSEffect.t(0, tA - t9, ASSEffect.fry(700).t()) + ke.KText)); foreach (ASSPoint pt in mask.Points) { double ptx0 = Common.RandomInt_Gauss(rnd, pt.X, 10); double pty0 = Common.RandomInt_Gauss(rnd, pt.Y - 60, 10); double ptx1 = Common.RandomInt_Gauss(rnd, pt.X - 60, 20); double pty1 = Common.RandomInt_Gauss(rnd, pt.Y, 10); double pt_kt = ((double)(pt.X - mask.X0) / (double)mask.Width) * (kEnd - kStart) + kStart; double ptt0 = Common.RandomDouble(rnd, pt_kt - 0.4, pt_kt); double ptt1 = Common.RandomDouble(rnd, ptt0 + 0.25, ptt0 + 0.45); double ptt2 = ev.End - 1.0 * (1.0 - r) + 0.3 * (double)(pt.Y - y0) / (double)FontHeight + Common.RandomDouble(rnd, 0, 0.2); double ptt3 = Common.RandomDouble(rnd, ptt2 + 0.25, ptt2 + 0.45); string ptcol = Common.scaleColor(col0, col1, (double)(pt.Y - y0) / (double)FontHeight); ass_out.Events.Add( ev.StartReplace(ptt0).EndReplace(ptt1).StyleReplace("pt").TextReplace( ASSEffect.move(ptx0, pty0, pt.X, pt.Y) + ASSEffect.a(1, Common.ToHex2(255 - pt.Brightness)) + ASSEffect.c(1, ptcol) + ASSEffect.fad(0.4 * (ptt1 - ptt0), 0) + ptString )); ass_out.Events.Add( ev.StartReplace(ptt1).EndReplace(ptt2).StyleReplace("pt").TextReplace( ASSEffect.pos(pt.X, pt.Y) + ASSEffect.a(1, Common.ToHex2(255 - pt.Brightness)) + ASSEffect.c(1, ptcol) + ptString )); ass_out.Events.Add( ev.StartReplace(ptt2).EndReplace(ptt3).StyleReplace("pt").TextReplace( ASSEffect.move(pt.X, pt.Y, ptx1, pty1) + ASSEffect.a(1, Common.ToHex2(255 - pt.Brightness)) + ASSEffect.c(1, ptcol) + ASSEffect.fad(0, ptt3 - ptt2) + ptString )); } } } 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 pt0Str = @"{\blur3\bord4\p4}m 10 10 s 10 -10 -10 -10 -10 10"; string pt1Str = @"{\p4}m 0 100 l 1 1 100 0 1 -1 0 -100 -1 -1 -100 0 -1 1"; Random rnd = new Random(); double totalTime = 20; double timeStep = 0.01; double particleStopTime = 10; int particlePerStep = 5; double orgX = 0; double orgY = 0; //double dOrgY = this.PlayResY / totalTime; for (double time = 0; time < totalTime; time += timeStep) { Console.WriteLine(time); if (particleStopTime < time) { continue; } double r = time / particleStopTime; double a = time * 3; orgX = this.PlayResX * 0.5 + this.PlayResX * 0.55 * Math.Cos(a) * r; orgY = this.PlayResY * 0.5 + this.PlayResY * 0.55 * Math.Sin(a) * r; for (int iDot = 0; iDot < particlePerStep; iDot++) { ParticleDot dot = new ParticleDot(orgX, orgY, Common.RandomDouble(rnd, -30, 30), Common.RandomDouble(rnd, -30, 30), -Common.RandomDouble(rnd, 0.5, 2)); double liveTime = -1.0 / dot.dA; double startTime = time; double endTime = time + liveTime; double xEnd = dot.X + dot.dX * liveTime; double yEnd = dot.Y + dot.dY * liveTime; double r0 = 0.8; double g0 = 0.2; double b0 = 1; double r1 = 0; double g1 = 0; double b1 = 1; string colStart = ASSColor.ToBBGGRR(b0 * 256, g0 * 256, r0 * 256); string colEnd = ASSColor.ToBBGGRR(b1 * 256, g1 * 256, r1 * 256); ass_out.Events.Add(new ASSEvent { Effect = "", Layer = 0, MarginL = "0000", MarginR = "0000", MarginV = "0000", Name = "NTP", Style = "Default", Start = startTime, End = endTime, Text = ASSEffect.move(dot.X, dot.Y, xEnd, yEnd) + ASSEffect.c(3, colStart) + ASSEffect.fad(0, liveTime) + ASSEffect.t(0, liveTime, ASSEffect.c(3, colEnd).t()) + pt0Str }); ass_out.Events.Add(new ASSEvent { Effect = "", Layer = 0, MarginL = "0000", MarginR = "0000", MarginV = "0000", Name = "NTP", Style = "Default", Start = startTime, End = endTime, Text = ASSEffect.move(dot.X, dot.Y - 1, xEnd, yEnd - 1) + ASSEffect.a(1, "77") + ASSEffect.c(1, colStart) + ASSEffect.fad(0, liveTime) + ASSEffect.t(0, liveTime, ASSEffect.c(1, colEnd).t()) + pt1Str }); } } ass_out.SaveFile(OutFileName); }
public override void Run() { ASS ass_in = ASS.FromFile(this.InFileName); ASS ass_out = new ASS() { Header = ass_in.Header, Events = new List <ASSEvent>() }; for (int iEv = 0; iEv < ass_in.Events.Count; iEv++) { bool isJp = iEv <= 47; this.MaskStyle = "Style:Default,DFSoGei-W5,25,&H00FFFFFF,&HFFFFFFFF,&HFFFFFFFF,&HFFFFFFFF,0,0,0,0,100,100,0,0,1,1,0,5,0,0,0,1"; int jEv = isJp ? iEv : iEv - 48; //if (jEv > 0) continue; //if (iEv > 2) continue; ASSEvent ev = ass_in.Events[iEv]; List <KElement> kelems = ev.SplitK(false); List <ASSPointF> path = new List <ASSPointF>(); { int totalWidth = GetTotalWidth(ev); int x0 = (PlayResX - MarginRight - totalWidth - MarginLeft) / 2 + MarginLeft; int y0 = (isJp) ? (PlayResY - MarginBottom - FontHeight) : MarginTop; int kSum = 0; for (int iK = 0; iK < kelems.Count; iK++) { double sr = (double)iK / (double)(kelems.Count - 1); Console.WriteLine("{0} / {1} : {2} / {3}", iEv + 1, ass_in.Events.Count, iK + 1, kelems.Count); KElement ke = kelems[iK]; Size sz = GetSize(ke.KText); double kStart = ev.Start + kSum * 0.01; double kEnd = kStart + ke.KValue * 0.01; kSum += ke.KValue; int x = x0 + this.FontSpace + sz.Width / 2; int y = y0 + FontHeight / 2; int x_an7 = x0; int y_an7 = y0; x0 += this.FontSpace + sz.Width; if (ke.KText.Trim().Length == 0) { continue; } StringMask mask = GetMask(ke.KText, x, y); string evStyle = isJp ? "jp" : "roma"; path.Add(new ASSPointF { X = x, Y = y, Start = kStart, End = kEnd, T = kStart }); double t0 = ev.Start - 0.5 + iK * 0.065; double t1 = t0 + 0.5; double t2 = kStart; double t21 = kEnd; double t3 = ev.End - 0.5 + iK * 0.065; double t4 = t3 + 0.5; if (t21 > t3) { t21 = t3; } string MainColor = "0000A7"; { Line line = new Line { X0 = x, X1 = x, Y0 = y - 35, Y1 = y, Acc = 0.4 }; CompositeCurve curve = new CompositeCurve { MinT = t0, MaxT = t1 }; curve.AddCurve(t0, t1, line); foreach (ASSPointF pt in curve.GetPath_Dis(1, 1.1).OrderByDescending(xx => xx.T)) { ass_out.AppendEvent(40, evStyle, pt.T, pt.T + 0.3, pos(pt.X, pt.Y) + fad(0, 0.3) + a(1, "DD") + blur(1.8) + c(1, MainColor) + a(3, "DD") + c(3, "EEEEEE") + bord(1.8) + ke.KText); } } { Line line = new Line { X0 = x, X1 = x, Y0 = y, Y1 = y + 35, Acc = 0.4 }; CompositeCurve curve = new CompositeCurve { MinT = t3, MaxT = t4 }; curve.AddCurve(t3, t4, line); foreach (ASSPointF pt in curve.GetPath_Dis(1, 1.1).OrderByDescending(xx => xx.T)) { double last = 0.3 + 0.2 - Math.Abs((t4 - t3) * 0.5 + t3 - pt.T) * 1.2; ass_out.AppendEvent(40, evStyle, pt.T, pt.T + last, pos(pt.X, pt.Y) + fad(0, last) + a(1, "DD") + blur(1.8) + c(1, MainColor) + a(3, "DD") + c(3, "EEEEEE") + bord(1.8) + ke.KText); } } ass_out.AppendEvent(40, evStyle, t1 - 0.1, t2, fad(0.4, 0) + pos(x + 2, y + 2) + a(1, "77") + c(1, "000000") + blur(1) + ke.KText); ass_out.AppendEvent(40, evStyle, t21, t3 + 0.1, fad(0, 0.4) + pos(x + 2, y + 2) + a(1, "77") + c(1, "000000") + blur(1) + ke.KText); /* * ass_out.AppendEvent(50, evStyle, t1, t2, * pos(x, y) + a(1, "66") + c(1, MainColor) + blur(1) + a(3, "00") + c(3, "EEEEEE") + bord(1.8) + * ke.KText); * ass_out.AppendEvent(50, evStyle, t21, t3, * pos(x, y) + a(1, "66") + c(1, MainColor) + blur(1) + a(3, "00") + c(3, "EEEEEE") + bord(1.8) + * ke.KText); * */ { Func <double, double> tempFunc = xx => Math.Sin(xx * 1.4); Func <double, string> colFunc = xx => ((tempFunc(xx) > 0) ? ASSColor.FromRGB(1, tempFunc(xx) * 255.0, 0, 255.0).ToColString() : ASSColor.FromRGB(1, 0, -tempFunc(xx) * 255.0, 255.0).ToColString()); string tstring = ""; tstring += t(0, t2 - t1, c(1, colFunc(t2)).t()); tstring += t(t2 - t1, t2 - t1 + 0.01, a(1, "FF").t() + a(3, "FF").t()); tstring += t(t21 - t1 - 0.01, t21 - t1, a(1, "66").t() + a(3, "00").t() + c(1, colFunc(t21)).t()); tstring += t(t21 - t1, t3 - t1, c(1, MainColor).t()); ass_out.AppendEvent(50, evStyle, t1, t3, pos(x, y) + a(1, "66") + c(1, MainColor) + blur(1) + a(3, "00") + c(3, "EEEEEE") + bord(1.8) + tstring + ke.KText); for (double ti = t2; ti < t21 && ti < t2 + 0.2; ti += 0.01) { ass_out.AppendEvent(60, evStyle, ti, t21, fad(0, t21 - ti) + pos(x, y) + a(1, "AA") + c(1, "FFFFFF") + blur(0) + a(3, "EE") + c(3, colFunc(ti)) + bord(2.5) + t(0, 0.3, 0.6, fsc(150, 150).t()) + t(0.3, t21 - ti, blur(2.5).t() + bord(3.5).t()) + ke.KText); } } } } { double spd = 750; // pixel / sec double x0 = path[0].X - 30; double y0 = path[0].Y; double t0 = path[0].T - 0.3; CompositeCurve curve = new CompositeCurve { MinT = ev.Start - 0.3, MaxT = ev.End }; bool lastVertical = true; int p = 0; while (t0 < curve.MaxT) { double x1 = x0; double y1 = y0; while (p + 1 < path.Count && path[p].End <= t0) { p++; } int sig = Common.RandomSig(rnd); if (lastVertical) { if (x0 < path[p].X) { sig = 1; } else { sig = -1; } x1 = x0 + Common.RandomDouble(rnd, 5, 50) * sig; } else { if (y0 < path[p].Y) { sig = 1; } else { sig = -1; } y1 = y0 + Common.RandomDouble(rnd, 5, 40) * sig; } double t1 = t0 + Common.GetDistance(x0, y0, x1, y1) / spd; if (t1 >= curve.MaxT) { t1 = curve.MaxT; } curve.AddCurve(t0, t1, new Line { X0 = x0, Y0 = y0, X1 = x1, Y1 = y1 }); x0 = x1; y0 = y1; t0 = t1; lastVertical = !lastVertical; } foreach (ASSPointF pt in curve.GetPath_Dis(0.9, 1.0)) { double tt = Math.Sin(pt.T * 1.4); // DO NO CHANGE string col = ""; if (tt > 0) { col = ASSColor.FromRGB(1, tt * 255.0, 0, 255.0).ToColString(); } else { col = ASSColor.FromRGB(1, 0, -tt * 255.0, 255.0).ToColString(); } ass_out.AppendEvent(20, "pt", pt.T, pt.T + 1.5, fad(0, 0.5) + pos(pt.X, pt.Y) + bord(0.8) + blur(1) + a(1, "00") + a(3, "77") + c(1, Common.scaleColor("FFFFFF", col, 0.7)) + c(3, col) + ASSEffect.p(1) + "m 0 0 l 1 0 1 1 0 1"); } } } Console.WriteLine(ass_out.Events.Count); ass_out.SaveFile(this.OutFileName); }
public override void Run() { ASS ass_in = ASS.FromFile(this.InFileName); ASS ass_out = new ASS(); ass_out.Header = ass_in.Header; ass_out.Events = new List <ASSEvent>(); for (int iEv = 0; iEv < ass_in.Events.Count; iEv++) { ASSEvent ev = ass_in.Events[iEv]; List <KElement> kelems = ev.SplitK(false); /// an7 pos int x0 = (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 void Run() { ASS ass = ASS.FromFile(InFileName); ASS outass = new ASS(); outass.Header = ass.Header; outass.Events = new List <ASSEvent>(); Particle particle = new Particle { IsMove = false, IsRandomColor = false, IsPatternScale = true, Count = 1, FontSize = 26, MinLast = 0.5, MaxLast = 0.8, ParticlePattern = ParticlePatternType.Circle, PatternScaleX = 600, PatternScaleY = 600, Style = "Circle", XOffset = 0, YOffset = 0 }; ASSColor[] colors = { new ASSColor { A = 0, Index = 1, R = 0xCA, G = 0xB4, B = 0x6D }, new ASSColor { A = 0, Index = 1, R = 0xEE, G = 0x85, B = 0x57 }, new ASSColor { A = 0, Index = 1, R = 0xE4, G = 0x30, B = 0x99 }, new ASSColor { A = 0, Index = 1, R = 0x5D, G = 0xD3, B = 0xEE }, new ASSColor { A = 0, Index = 1, R = 0xE1, G = 0x32, B = 0x63 } }; for (int i = 0; i < ass.Events.Count; i++) { ASSEvent ev = ass.Events[i]; List <KElement> klist = ev.SplitK(); int ksum = 0; ASSColor lastcc = null; for (int j = 0; j < klist.Count; j++) { int x = (PlayResX - klist.Count * FontWidth) / 2 + j * FontWidth + FontWidth / 2; int y = PlayResY - MarginBottom - FontHeight / 2; if (i == 7) { y = MarginTop + FontHeight / 2; } double kStart = ksum * 0.01; double kEnd = (ksum + klist[j].KValue) * 0.01; ASSColor cc = colors[(i + j) % colors.Length]; /*while (lastcc == cc) * cc = colors[rnd.Next(colors.Length)]; * lastcc = cc;*/ if (!Char.IsWhiteSpace(klist[j].KText[0])) { outass.Events.Add(ev.TextReplace( ASSEffect.an(5) + ASSEffect.pos(x, y) + ASSEffect.a(1, "FF") + ASSEffect.t(kStart, kStart + 0.2, cc.ToString()) + (i % 4 <= 1 ? ASSEffect.t(ev.Last - 0.3 - 0.5 * (1 - ((double)j / (double)klist.Count)), ev.Last - 0.5 * (1 - ((double)j / (double)klist.Count)), @"\1a&HFF&\2a&HFF&\3a&HFF&\4a&HFF&" + ((i % 2 == 0) ? @"\frx700" : @"\fry700")) : (i % 4 == 3 ? ASSEffect.t(ev.Last - 0.5 * (1 - ((double)j / (double)klist.Count)), ev.Last - 0.5 * (1 - ((double)j / (double)klist.Count)) + 0.01, @"\1a&HFF&\2a&HFF&\3a&HFF&\4a&HFF&") : ASSEffect.t(ev.Last - 0.8 - 0.5 * (1 - ((double)j / (double)klist.Count)), ev.Last - 0.5 * (1 - ((double)j / (double)klist.Count)), @"\1a&HFF&\2a&HFF&\3a&HFF&\4a&HFF&" + @"\frz700"))) + klist[j].KText )); if (i % 4 == 3) { outass.Events.Add(ev.StartReplace(ev.Start + ev.Last - 0.5 * (1 - ((double)j / (double)klist.Count)) + 0.01).EndReplace(ev.Start + ev.Last - 0.5 * (1 - ((double)j / (double)klist.Count)) + 0.01 + 0.2).TextReplace( ASSEffect.an(5) + ASSEffect.move(x, y, x - 40, y) + ASSEffect.fad(0, 0.2) + ASSEffect.c(cc) + klist[j].KText)); } particle.X = x - FontWidth / 2; particle.Y = y - FontHeight / 2; particle.Start = ev.Start + kStart; particle.End = particle.Start; particle.Color = cc; outass.Events.AddRange(particle.Create()); } ksum += klist[j].KValue; } } outass.Shift(Shift); outass.SaveFile(OutFileName); }
public override void Run() { ASS ass_in = ASS.FromFile(this.InFileName); ASS ass_out = new ASS(); ass_out.Header = ass_in.Header; ass_out.Events = new List <ASSEvent>(); string pt0Str = @"{\blur3\bord4\p4}m 10 10 s 10 -10 -10 -10 -10 10"; string pt1Str = @"{\p4}m 0 100 l 1 1 100 0 1 -1 0 -100 -1 -1 -100 0 -1 1"; List <ParticleDot> dots = new List <ParticleDot>(); Random rnd = new Random(); double totalTime = 20; double timeStep = 0.04; double particleStopTime = 10; int particlePerStep = 5; double orgX = 0; double dOrgX = this.PlayResX / particleStopTime; double orgY = 0; //double dOrgY = this.PlayResY / totalTime; for (double time = 0; time < totalTime; time += timeStep) { Console.WriteLine(time); // Draw Dots dots = dots.Where(pd => !pd.Die).ToList(); foreach (ParticleDot dot in dots) { dot.A += dot.dA * timeStep; dot.R = dot.R; dot.G = 0.2 * dot.A; dot.B = 0.8 * dot.A; dot.X += dot.dX * timeStep; dot.Y += dot.dY * timeStep; double a0 = (1 - dot.A) * 256; if (a0 < 0) { a0 = 0; } if (a0 > 255) { a0 = 255; } string aStr = Common.ToHex2(a0); string cStr = ASSColor.ToBBGGRR(dot.R * 256, dot.G * 256, dot.B * 256); ass_out.Events.Add(new ASSEvent { Effect = "", Layer = 0, MarginL = "0000", MarginR = "0000", MarginV = "0000", Name = "NTP", Style = "Default", Start = time, End = time + timeStep, Text = ASSEffect.pos(dot.X, dot.Y) + ASSEffect.a(1, aStr) + ASSEffect.a(3, aStr) + ASSEffect.c(3, cStr) + pt0Str }); ass_out.Events.Add(new ASSEvent { Effect = "", Layer = 0, MarginL = "0000", MarginR = "0000", MarginV = "0000", Name = "NTP", Style = "Default", Start = time, End = time + timeStep, Text = ASSEffect.pos(dot.X, dot.Y - 1) + ASSEffect.a(1, aStr) + ASSEffect.a(3, aStr) + ASSEffect.c(1, cStr) + pt1Str }); } orgX += dOrgX * timeStep; //orgY += dOrgY * timeStep; orgY = this.PlayResY * 0.5 + this.PlayResY * 0.3 * Math.Sin(time * 2); if (particleStopTime < time) { continue; } for (int iDot = 0; iDot < particlePerStep; iDot++) { dots.Add(new ParticleDot(orgX, orgY, Common.RandomDouble(rnd, -30, 30), Common.RandomDouble(rnd, -30, 30), -Common.RandomDouble(rnd, 0.5, 1))); } } 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 ptStr = @"{\p4}m 0 100 l 1 1 100 0 1 -1 0 -100 -1 -1 -100 0 -1 1 c m 10 10 s 10 -10 -10 -10 -10 10 c"; GetMask("!", 0, 0); for (int iEv = 0; iEv < ass_in.Events.Count; iEv++) { ASSEvent ev = ass_in.Events[iEv]; List <KElement> kelems = ev.SplitK(false); /// an7 pos int x0 = (PlayResX - GetTotalWidth(ev)) / 2; int y0 = PlayResY - MarginBottom - FontHeight; Random rnd = new Random(); int kSum = 0; for (int iK = 0; iK < kelems.Count; iK++) { KElement ke = kelems[iK]; double r = (double)iK / (double)(kelems.Count - 1); Size sz = GetSize(ke.KText); /// an5 pos int x = x0 + this.FontSpace + sz.Width / 2; int y = y0 + FontHeight; StringMask mk = GetMask(ke.KText, x0, y0); if (ke.KText.ToLower() == "silky") { mk = GetMask(ke.KText, x0 - 2, y0); } int bx0 = x0; int by0 = y0; x0 += this.FontSpace + sz.Width; y0 = y0; double kStart = ev.Start + kSum * 0.01; kSum += ke.KValue; double kEnd = ev.Start + kSum * 0.01; double t0 = ev.Start + r * 1.0 - 1.0; double t1 = t0 + 0.2; double t2 = t0 + 0.4; double t3 = t0 + 0.6; double t4 = t0 + 0.8; double t5 = ev.End + r * 1.0 - 1.0; if (t5 < t4) { t5 = t4; } double t6 = t5 + 0.5; ass_out.Events.Add( ev.StartReplace(t0).EndReplace(t1).TextReplace( ASSEffect.move(x, y, x, y - 60) + ASSEffect.a(1, "FF") + ASSEffect.a(3, "FF") + ASSEffect.t(0, t1 - t0, ASSEffect.a(1, "C0").t() + ASSEffect.a(3, "C0").t() + ASSEffect.frx(180).t()) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t1).EndReplace(t2).TextReplace( ASSEffect.move(x, y - 60, x, y) + ASSEffect.a(1, "C0") + ASSEffect.a(3, "C0") + ASSEffect.frx(180) + ASSEffect.t(0, t2 - t1, ASSEffect.a(1, "80").t() + ASSEffect.a(3, "80").t() + ASSEffect.frx(360).t()) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t2).EndReplace(t3).TextReplace( ASSEffect.move(x, y, x, y - 60) + ASSEffect.a(1, "80") + ASSEffect.a(3, "80") + ASSEffect.t(0, t3 - t2, ASSEffect.a(1, "40").t() + ASSEffect.a(3, "40").t() + ASSEffect.frx(180).t()) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t3).EndReplace(t4).TextReplace( ASSEffect.move(x, y - 60, x, y) + ASSEffect.a(1, "40") + ASSEffect.a(3, "40") + ASSEffect.frx(180) + ASSEffect.t(0, t4 - t3, ASSEffect.a(1, "00").t() + ASSEffect.a(3, "00").t() + ASSEffect.frx(360).t()) + ke.KText)); ass_out.Events.Add( ev.StartReplace(t4).EndReplace(t5).TextReplace( ASSEffect.pos(x, y) + ASSEffect.a(1, "00") + ASSEffect.a(3, "00") + ke.KText)); ass_out.Events.Add( ev.StartReplace(t5).EndReplace(t6).TextReplace( ASSEffect.move(x, y, x + r * 100 - 50, y + 30) + ASSEffect.a(1, "00") + ASSEffect.a(3, "00") + ASSEffect.fad(0, t6 - t5) + ke.KText)); ASSColor col = Common.RandomColor(rnd, 1); foreach (ASSPoint pt in mk.Points) { if (!Common.RandomBool(rnd, 0.5)) { continue; } double r1 = Common.RandomDouble(rnd, kStart - 0.15, kEnd + 0.15); double r0 = r1 - 0.5; double r2 = Common.RandomDouble(rnd, kStart + 0.9, kStart + 1.2); double r3 = r2 + 0.5; int x_0 = Common.RandomInt(rnd, pt.X - 80, pt.X - 30); int y_0 = Common.RandomInt(rnd, pt.Y - 30, pt.Y + 30); int x_1 = Common.RandomInt(rnd, pt.X + 80, pt.X + 30); int y_1 = Common.RandomInt(rnd, pt.Y - 30, pt.Y + 30); ass_out.Events.Add( ev.StartReplace(r0).EndReplace(r1).StyleReplace("pt").TextReplace( ASSEffect.move(x_0, y_0, pt.X, pt.Y) + ASSEffect.c(col) + ASSEffect.fad(r1 - r0, 0) + ptStr)); ass_out.Events.Add( ev.StartReplace(r1).EndReplace(r2).StyleReplace("pt").TextReplace( ASSEffect.pos(pt.X, pt.Y) + ASSEffect.c(col) + ptStr)); ass_out.Events.Add( ev.StartReplace(r2).EndReplace(r3).StyleReplace("pt").TextReplace( ASSEffect.move(pt.X, pt.Y, x_1, y_1) + ASSEffect.c(col) + ASSEffect.fad(0, r3 - r2) + ptStr)); } } } ass_out.SaveFile(OutFileName); }
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); }