本文发布于 244 天前。
xy-VSFilter中,存在两个(或许更多)ASS手册中未提及的特效标签用法。
fs的正负号使用
\fs
标签通常直接接数字,例如\fs50
表示将字号重设为50。
但是vsfilter还支持\fs+n
或\fs-n
,其作用为,将字号调整为(1±n/10)*原字号
。在计算结果<=0
时,会返回原始字号。
RTS.cpp @L2481
case CMD_fs:
{
if(!p.IsEmpty())
{
if(p[0] == L'-' || p[0] == L'+')
{
double n = CalcAnimation(style.fontSize + style.fontSize*wcstod(p, NULL)/10, style.fontSize, fAnimate);
style.fontSize = (n > 0) ? n : org.fontSize;
}
else
{
double n = CalcAnimation(wcstod(p, NULL), style.fontSize, fAnimate);
style.fontSize = (n > 0) ? n : org.fontSize;
}
}
else
{
style.fontSize = org.fontSize;
}
break;
}
fad 和 fade归一化
ASS手册中对fad
和fade
是分开介绍的:
渐变:
\fad(<fadein>,<fadeout>)
复杂渐变:\fade(<a1>,<a2>,<a3>,<t1>,<t2>,<t3>,<t4>)
但实际上,vsfilter的渲染过程中,是把他们当做同一标签判断的,如果参数数量为2,则应用简单的淡入淡出;参数数量为7时则应用复杂的效果。
RTS.cpp @L2371
case CMD_fade:
case CMD_fad:
{
sub->m_fAnimated2 = true;
if(params.GetCount() == 7 && !sub->m_effects[EF_FADE])// {\fade(a1=param[0], a2=param[1], a3=param[2], t1=t[0], t2=t[1], t3=t[2], t4=t[3])
{
if(Effect* e = DEBUG_NEW Effect)
{
for(int i = 0; i < 3; i++)
e->param[i] = wcstol(params[i], NULL, 10);
for(int i = 0; i < 4; i++)
e->t[i] = wcstol(params[3+i], NULL, 10);
sub->m_effects[EF_FADE] = e;
}
}
else if(params.GetCount() == 2 && !sub->m_effects[EF_FADE]) // {\fad(t1=t[1], t2=t[2])
{
if(Effect* e = DEBUG_NEW Effect)
{
e->param[0] = e->param[2] = 0xff;
e->param[1] = 0x00;
for(int i = 1; i < 3; i++)
e->t[i] = wcstol(params[i-1], NULL, 10);
e->t[0] = e->t[3] = -1; // will be substituted with "start" and "end"
sub->m_effects[EF_FADE] = e;
}
}
break;
}