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 override void Run() { string ptstr = @"{\p1}m 0 0 l 1 0 1 1 0 1"; string lstr0 = @"{\p1}m -1 0 l 0 -50 0 0"; string lstr1 = @"{\p1}m -1 0 l 0 0 0 50"; 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(); string lcol = "00C6FF"; for (int count = 0; count < 50; count++) { double t0 = 2 + Common.RandomDouble(rnd, 0, 1); double t1 = t0 + 1; double x0 = Common.RandomDouble(rnd, ox - 10, ox + 10); double x1 = Common.RandomDouble(rnd, ox - 20, ox + 20); //if (Common.RandomBool(rnd, 0.5)) x1 = ox - 20; else x1 = ox + 20; int startag = Common.RandomInt(rnd, 0, 90); ass_out.AppendEvent(5, "pt", t0, t1, ASSEffect.fad(0.2, 0) + ASSEffect.move(x0, oy, x1, oy) + ASSEffect.a(1, "00") + ASSEffect.c(1, lcol) + ASSEffect.a(3, "FF") + ASSEffect.frx(startag) + ASSEffect.t(0, t1 - t0, ASSEffect.frx(90).t()) + lstr0); ass_out.AppendEvent(5, "pt", t0, t1, ASSEffect.fad(0.2, 0) + ASSEffect.move(x0, oy, x1, oy) + ASSEffect.a(1, "00") + ASSEffect.c(1, lcol) + ASSEffect.a(3, "FF") + ASSEffect.frx(startag) + ASSEffect.t(0, t1 - t0, ASSEffect.frx(90).t()) + lstr1); } 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 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>(); 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() { ASS ass_in = ASS.FromFile(this.InFileName); ASS ass_out = new ASS(); ass_out.Header = ass_in.Header; ass_out.Events = new List <ASSEvent>(); Random rnd = new Random(); for (int iEv = 0; iEv < ass_in.Events.Count; iEv++) { ASSEvent ev = ass_in.Events[iEv]; List <KElement> kelems = ev.SplitK(false); /// an7 pos int x0 = MarginLeft; int y0 = PlayResY - MarginBottom - FontHeight; int kSum = 0; for (int i = 0; i < kelems.Count; i++) { KElement ke = kelems[i]; double r = (double)i / (double)(kelems.Count - 1); double r0 = 1.0 - r; Size sz = GetSize(ke.KText); if (Char.IsWhiteSpace(ke.KText[0])) { sz.Width = 15; } double kStart = kSum * 0.01; double kEnd = kStart + ke.KValue * 0.01; /// an5 pos int x = x0 + FontSpace + sz.Width / 2; int y = y0 + FontHeight / 2; x0 += this.FontSpace + sz.Width; y0 = y0; kSum += ke.KValue; double t0 = ev.Start - r0 * 0.5; double t1 = t0 + 0.2; // 出现 double t2 = ev.Start + kStart - 0.1; // 保持框 double t3 = t2 + 0.5; // K效果 double t4 = ev.End - r0 * 0.5; // 保持 double t5 = t4 + 0.2; // 消失 double rect_x0 = x - sz.Width / 2 - 2; double rect_y0 = y - FontHeight / 2 - 2; double rect_x1 = x + sz.Width / 2 + 2; double rect_y1 = y + FontHeight / 2 + 2; if (ke.KText.Length > 1) { rect_x0 -= ke.KText.Length * 1; rect_x1 += ke.KText.Length * 1; } if (ke.KText == "with" || ke.KText == "find" || ke.KText == "world") { rect_x0 -= 2; rect_x1 += 1; } if (ke.KText == "DITE") { rect_x0 -= 3; rect_x1 += 3; } if (ke.KText == "alive") { rect_x0 -= 2; rect_x1 += 2; } double rect_xmid = (rect_x0 + rect_x1) * 0.5; double rect_ymid = (rect_y0 + rect_y1) * 0.5; if (ke.KText.Trim().Length > 0) { ass_out.Events.Add( ev.StartReplace(t0).EndReplace(t1).TextReplace( ASSEffect.move(x + 10, y - 10, x, y) + ASSEffect.fad(t1 - t0, 0) + ke.KText)); ass_out.Events.Add( CreateRectangle(t0, t1, "draw1", rect_x0, rect_y0, rect_x1, rect_y1, x, y, ASSEffect.move(x + 10, y - 10, x, y) + ASSEffect.fad(t1 - t0, 0)) ); int xC = 16; int yC = 16; if (ke.KText.Length > 1) { xC = (int)(Math.Round((double)yC / (rect_y1 - rect_y0) * (rect_x1 - rect_x0))); } switch (iEv) { case 0: case 1: ass_out.Events.Add( ev.StartReplace(t1).EndReplace(t4).TextReplace( ASSEffect.pos(x, y) + ke.KText)); ass_out.Events.Add( CreateRectangle(t1, t2, "draw1", rect_x0, rect_y0, rect_x1, rect_y1) ); ass_out.Events.Add( CreateRectangle(t2, t3, "draw1", rect_x0, rect_y0, rect_xmid, rect_y1, rect_x0, rect_ymid, ASSEffect.pos((int)Math.Round(rect_x0), (int)Math.Round(rect_ymid)) + ASSEffect.t(0, t3 - t2, ASSEffect.fry(-90).t()) + ASSEffect.fad(0, t3 - t2) )); ass_out.Events.Add( CreateRectangle(t2, t3, "draw1", rect_xmid, rect_y0, rect_x1, rect_y1, rect_x1, rect_ymid, ASSEffect.pos((int)Math.Round(rect_x1), (int)Math.Round(rect_ymid)) + ASSEffect.t(0, t3 - t2, ASSEffect.fry(90).t()) + ASSEffect.fad(0, t3 - t2) )); break; case 2: ass_out.Events.Add( ev.StartReplace(t1).EndReplace(t4).TextReplace( ASSEffect.pos(x, y) + ke.KText)); ass_out.Events.Add( CreateRectangle(t1, t2, "draw1", rect_x0, rect_y0, rect_x1, rect_y1) ); ass_out.Events.Add( CreateRectangle(t2, t3, "draw1", rect_x0, rect_y0, rect_x1, rect_ymid, rect_xmid, rect_y0, ASSEffect.pos((int)Math.Round(rect_xmid), (int)Math.Round(rect_y0)) + ASSEffect.t(0, t3 - t2, ASSEffect.frx(-90).t()) + ASSEffect.fad(0, t3 - t2) )); ass_out.Events.Add( CreateRectangle(t2, t3, "draw1", rect_x0, rect_ymid, rect_x1, rect_y1, rect_xmid, rect_y1, ASSEffect.pos((int)Math.Round(rect_xmid), (int)Math.Round(rect_y1)) + ASSEffect.t(0, t3 - t2, ASSEffect.frx(90).t()) + ASSEffect.fad(0, t3 - t2) )); break; case 7: case 8: ass_out.Events.Add( ev.StartReplace(t1).EndReplace(t4).TextReplace( ASSEffect.pos(x, y) + ke.KText)); ass_out.Events.Add( CreateRectangle(t1, t2, "draw1", rect_x0, rect_y0, rect_x1, rect_y1) ); for (int jR = 0; jR < yC; jR++) { double yy0 = rect_y0 + (rect_y1 - rect_y0) * (double)jR / (double)yC; double yy1 = yy0 + (rect_y1 - rect_y0) / (double)yC; double rStart = t2 + jR * 0.05; if (iEv == 8) { rStart = t2 + (yC - jR - 1) * 0.05; } double rEnd = rStart + 0.2; double yymid = (yy0 + yy1) * 0.5; ass_out.Events.Add( CreateRectangle(t2, rStart, "draw1", rect_x0, yy0, rect_x1, yy1) ); ass_out.Events.Add( CreateRectangle(rStart, rEnd, "draw1", rect_x0, yy0, rect_x1, yy1, rect_xmid, yymid, ASSEffect.pos(rect_xmid, yymid) + ASSEffect.fad(0, rEnd - rStart) )); } break; case 3: case 4: case 5: case 6: default: ass_out.Events.Add( ev.StartReplace(t1).EndReplace(t2).TextReplace( ASSEffect.pos(x, y) + ke.KText)); ass_out.Events.Add( CreateRectangle(t1, t2, "draw1", rect_x0, rect_y0, rect_x1, rect_y1) ); double t3_2 = ev.Start + kEnd; if (t3_2 > t4) { t3_2 = t4; } for (int iR = 0; iR < (int)(Math.Round((t3_2 - t2) / 0.01)); iR++) { double rStart = t2 + iR * 0.01; double rEnd = rStart + 0.01; ass_out.Events.Add( ev.StartReplace(rStart).EndReplace(rEnd).TextReplace( ASSEffect.pos(Common.RandomInt(rnd, x - 3, x + 3), Common.RandomInt(rnd, y - 3, y + 3)) + ke.KText)); } ass_out.Events.Add( ev.StartReplace(t3_2).EndReplace(t4).TextReplace( ASSEffect.pos(x, y) + ke.KText)); for (int iR = 0; iR < xC; iR++) { for (int jR = 0; jR < yC; jR++) { double xx0 = rect_x0 + (rect_x1 - rect_x0) * (double)iR / (double)xC; double yy0 = rect_y0 + (rect_y1 - rect_y0) * (double)jR / (double)yC; double xx1 = xx0 + (rect_x1 - rect_x0) / (double)xC; double yy1 = yy0 + (rect_y1 - rect_y0) / (double)yC; double dx = rnd.Next() % 20 + 8; double dy = rnd.Next() % 20 + 8; double xx2 = xx0; double yy2 = yy0; if (Common.RandomInt_Gauss2(rnd, xC, iR) <= xC / 2) { xx2 -= dx; } else { xx2 += dx; } if (Common.RandomInt_Gauss2(rnd, yC, jR) <= yC / 2) { yy2 -= dy; } else { yy2 += dy; } double rEnd = Common.RandomDouble(rnd, t2 + 0.3, t2 + 1.5); ass_out.Events.Add( CreateRectangle(t2, rEnd, "draw1", xx0, yy0, xx1, yy1, xx0, yy0, ASSEffect.move(xx0, yy0, xx2, yy2) + ASSEffect.fad(0, rEnd - t2) )); } } break; } ass_out.Events.Add( ev.StartReplace(t4).EndReplace(t5).TextReplace( ASSEffect.move(x, y, x - 10, y + 10) + ASSEffect.fad(0, t5 - t4) + ke.KText)); } } } ass_out.SaveFile(OutFileName); }