tsubtitlessettings.cpp

来自「ffshow源码」· C++ 代码 · 共 827 行 · 第 1/3 页

CPP
827
字号
   {"Ugaritic", _l("uga", NULL},
   {"Umbundu", _l("umb", NULL},
   {"Undetermined", _l("und", NULL},
   {"Vai", _l("vai", NULL},
   {"Venda", _l("ven", _l("ve")},
   {"Votic", _l("vot", NULL},
   {"Wakashan languages", _l("wak", NULL},
   {"Walamo", _l("wal", NULL},
   {"Walloon", _l("wln", _l("wa")},
   {"Waray", _l("war", NULL},
   {"Washo", _l("was", NULL},
   {"Yakut", _l("sah", NULL},
   {"Yao", _l("yao", NULL},
   {"Yapese", _l("yap", NULL},
   {"Yupik languages", _l("ypk", NULL},
   {"Zande", _l("znd", NULL},
   {"Zapotec", _l("zap", NULL},
   {"Zenaga", _l("zen", NULL},
   {"Zulu", _l("zul", _l("zu")},
   {"Zuni", _l("zun", NULL},
   {NULL, NULL, NULL}};
*/

const char_t* TsubtitlesSettings::durations[]=
{
 _l("subtitle"),
 _l("line"),
 _l("character"),
 NULL
};

const char_t* TsubtitlesSettings::fixIls[]=
{
 _l("English (may work with other languages)"),
 _l("French"),
 _l("Deutsch"),
 _l("Czech"),
 _l("Italian"),
 _l("Polish"),
 NULL
};

const TfilterIDFF TsubtitlesSettings::idffs=
{
 /*name*/      _l("Subtitles"),
 /*id*/        IDFF_filterSubtitles,
 /*is*/        IDFF_isSubtitles,
 /*order*/     IDFF_orderSubtitles,
 /*show*/      IDFF_showSubtitles,
 /*full*/      IDFF_fullSubtitles,
 /*half*/      0,
 /*dlgId*/     IDD_SUBTITLES,
};

TsubtitlesSettings::TsubtitlesSettings(TintStrColl *Icoll,TfilterIDFFs *filters):TfilterSettingsVideo(sizeof(*this),Icoll,filters,&idffs),font(Icoll)
{
 deepcopy=true;
 memset(flnm,0,sizeof(flnm));
 half=0;
 static const TintOptionT<TsubtitlesSettings> iopts[]=
  {
   IDFF_isSubtitles            ,&TsubtitlesSettings::is                      ,0,0,_l(""),1, 
     _l("isSubtitles"), 0,
   IDFF_showSubtitles          ,&TsubtitlesSettings::show                    ,0,0,_l(""),1,
     _l("showSubtitles"), 1,
   IDFF_orderSubtitles         ,&TsubtitlesSettings::order                   ,1,1,_l(""),1,
     _l("orderSubtitles"), 0,
   IDFF_fullSubtitles          ,&TsubtitlesSettings::full                    ,0,0,_l(""),1,
     _l("fullSubtitles"), 1,
   IDFF_subAutoFlnm            ,&TsubtitlesSettings::autoFlnm                ,0,0,_l(""),1,
     _l("subAutoFlnm"), 1,
   IDFF_subPosX                ,&TsubtitlesSettings::posX                    ,0,100,_l(""),1,
     _l("subPosX"), 50,
   IDFF_subPosY                ,&TsubtitlesSettings::posY                    ,0,100,_l(""),1,
     _l("subPosY"), 90,
   IDFF_subAlign               ,&TsubtitlesSettings::align                   ,0,3,_l(""),1,
     _l("subAlign"), ALIGN_FFDSHOW,
   IDFF_subIsExpand            ,&TsubtitlesSettings::isExpand                ,0,0,_l(""),1,
     _l("subIsExpand"), -1,
   IDFF_subExpand              ,&TsubtitlesSettings::expandCode              ,1,1,_l(""),1,
     _l("subExpand"), 1,
   IDFF_subDelay               ,&TsubtitlesSettings::delay                   ,1,1,_l("Subtitles delay"), 1,
     _l("subDelay"), delayDef,
   IDFF_subSpeed               ,&TsubtitlesSettings::speed                   ,1,INT_MAX/2,_l(""),1,
     _l("subSpeed"), speedDef,
   IDFF_subSpeed2              ,&TsubtitlesSettings::speed2                  ,1,INT_MAX/2,_l(""),1,
     _l("subSpeed2"), speedDef,
   IDFF_subStereoscopic        ,&TsubtitlesSettings::stereoscopic            ,0,0,_l(""),1,
     _l("subStereoscopic"), 0,
   IDFF_subStereoscopicPar     ,&TsubtitlesSettings::stereoscopicPar         ,-100,100,_l(""),1,
     _l("subStereoscopicPar"), 0,
   IDFF_subDefLang             ,&TsubtitlesSettings::deflang                 ,1,1,_l(""),1,
     _l("subDefLang"), 0,
   IDFF_subDefLang2            ,&TsubtitlesSettings::deflang2                ,1,1,_l(""),1,
     _l("subDefLang2"), 0,
   IDFF_subVobsub              ,&TsubtitlesSettings::vobsub                  ,0,0,_l(""),1,
     _l("subVobsub"), 1,
   IDFF_subVobsubAA            ,&TsubtitlesSettings::vobsubAA                ,0,4,_l(""),1,
     _l("subVobsubAA"), 4,
   IDFF_subVobsubAAswgauss     ,&TsubtitlesSettings::vobsubAAswgauss         ,1,2000,_l(""),1,
     _l("subVobsubAAswgauss"), 700,
   IDFF_subVobsubChangePosition,&TsubtitlesSettings::vobsubChangePosition    ,0,0,_l(""),1,
     _l("subVobsubChangePosition"), 0,
   IDFF_subVobsubScale         ,&TsubtitlesSettings::vobsubScale             ,0x10,0x300,_l(""),1,
     _l("subVobsubScale"), 0x100,
   IDFF_subLinespacing         ,&TsubtitlesSettings::linespacing             ,0,200,_l(""),1,
     _l("subLinespacing"), 100,
   IDFF_subTimeOverlap         ,&TsubtitlesSettings::timeoverlap             ,0,0,_l(""),1,
     _l("subTimeOverlap"), 0,
   IDFF_subIsMinDuration       ,&TsubtitlesSettings::isMinDuration           ,0,0,_l(""),1,
     _l("subIsMinDuration"), 0,
   IDFF_subMinDurationType     ,&TsubtitlesSettings::minDurationType         ,0,2,_l(""),1,
     _l("subMinDurationType"), 1,
   IDFF_subMinDurationSub      ,&TsubtitlesSettings::minDurationSubtitle     ,0,3600000,_l(""),1,
     _l("subMinDurationSubtitle"), 3000,
   IDFF_subMinDurationLine     ,&TsubtitlesSettings::minDurationLine         ,0,3600000,_l(""),1,
     _l("subMinDurationLine"), 1500,
   IDFF_subMinDurationChar     ,&TsubtitlesSettings::minDurationChar         ,0,3600000,_l(""),1,
     _l("subMinDurationChar"), 30,

   IDFF_subFix                 ,&TsubtitlesSettings::fix                     ,1,1,_l(""),1,
     _l("subFix"),0,
   IDFF_subFixLang             ,&TsubtitlesSettings::fixLang                 ,0,5,_l(""),1,
     _l("subFixLang"),0,
   IDFF_subOpacity             ,&TsubtitlesSettings::opacity                 ,0,256,_l(""),1,
     _l("subOpacity"),256,
   IDFF_subSplitBorder         ,&TsubtitlesSettings::splitBorder             ,0,4096,_l(""),1,
     _l("subSplitBorder"),0,
     
   IDFF_subCC                  ,&TsubtitlesSettings::cc                      ,0,0,_l(""),1,
     _l("subCC"),1,  
     
   0
  }; 
 addOptions(iopts); 
 static const TstrOption sopts[]=
  { 
   IDFF_subFilename ,(TstrVal)&TsubtitlesSettings::flnm    ,MAX_PATH ,_l(""),1,
     _l("subFlnm"),_l(""),
   IDFF_subFixDict  ,(TstrVal)&TsubtitlesSettings::fixDict ,60       ,_l(""),1,
     _l("subFixDict"),_l(""),
   0
  };
 addOptions(sopts);

 static const TcreateParamList2<Tlang> listLang(langs,&Tlang::desc);setParamList(IDFF_subDefLang,&listLang);setParamList(IDFF_subDefLang2,&listLang);
 static const TcreateParamList1 listVobsubAA(vobsubAAs);setParamList(IDFF_subVobsubAA,&listVobsubAA);
 static const TcreateParamList1 listAlign(alignments);setParamList(IDFF_subAlign,&listAlign);
 static const TcreateParamList1 listDurations(durations);setParamList(IDFF_subMinDurationType,&listDurations);
 static const TcreateParamList1 listIls(fixIls);setParamList(IDFF_subFixLang,&listIls);
}

void TsubtitlesSettings::copy(const TfilterSettings *src)
{
 memcpy(((uint8_t*)this)+sizeof(Toptions),((uint8_t*)src)+sizeof(Toptions),sizeof(*this)-sizeof(font)-sizeof(Toptions));
 font=((TsubtitlesSettings*)src)->font;
}

const char_t* TsubtitlesSettings::getLangDescr(const char_t *lang)
{
 //short lang=(short)Ttranslate::lang2int(langS);
 for (int i=1;langs[i].desc;i++)
  if (langs[i].lang && stricmp(langs[i].lang,lang)==0)
   return langs[i].desc;
 return lang;
}
const char_t* TsubtitlesSettings::getLangDescrIso(const char_t *isolang)
{
 for (int i=0;langs[i].desc;i++)
  if (langs[i].isolang && stricmp(langs[i].isolang,isolang)==0)
   return langs[i].desc;
 return isolang;
}

void TsubtitlesSettings::createFilters(size_t filtersorder,Tfilters *filters,TfilterQueue &queue) const
{
 idffOnChange(idffs,filters,queue.temporary);
 if ((is && show) || filters->isdvdproc)
  {
   TimgFilterSubtitles *sub=queueFilter<TimgFilterSubtitles>(filtersorder,filters,queue); 
   if (!queue.temporary)
    {
     setOnChange(IDFF_subAutoFlnm,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subTimeOverlap,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subIsMinDuration,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subMinDurationType,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subMinDurationSub,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subMinDurationLine,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subMinDurationChar,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subFix,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subFixLang,sub,&TimgFilterSubtitles::onSubFlnmChange);
     setOnChange(IDFF_subFilename,sub,&TimgFilterSubtitles::onSubFlnmChangeStr);
     setOnChange(IDFF_subFixDict,sub,&TimgFilterSubtitles::onSubFlnmChangeStr);
    } 
  } 
}
void TsubtitlesSettings::createPages(TffdshowPageDec *parent) const
{
 parent->addFilterPage<TsubtitlesPage>(&idffs);
 parent->addFilterPage<TsubtitlesTextPage>(&idffs);
 parent->addFilterPage<TfontPageSubtitles>(&idffs);
 parent->addFilterPage<TvobsubPage>(&idffs);
}

void TsubtitlesSettings::getPosHoriz(int x,char_t *s,Twindow *w,int id)
{
 const char_t *posS;
 if (x<40) posS=_l("left");
 else if (x>60) posS=_l("right");
 else posS=_l("center");
 tsprintf(s,_l("%s %3i%% (%s)"),w?w->_(id):_l("Horizontal position"),x,w?w->_(id,posS):posS);
}
void TsubtitlesSettings::getPosVert(int x,char_t *s,Twindow *w,int id)
{
 const char_t *posS;
 if (x<40) posS=_l("top");
 else if (x>60) posS=_l("bottom");
 else posS=_l("center");
 tsprintf(s,_l("%s %3i%% (%s)"),w?w->_(id):_l("Vertical position:"),x,w?w->_(id,posS):posS);
}
void TsubtitlesSettings::getExpand(int is,int code,int *x,int *y)
{
 switch (code*(is?1:0))
  {
   case 0:*x=0;*y=0;return;
   case 1:*x=4;*y=3;return;
   case 2:*x=16;*y=9;return;
   default:*x=std::max(1,(int)HIWORD(code));*y=std::max(1,(int)LOWORD(code));return;
  }
}
void TsubtitlesSettings::getExpand(int *x,int *y) const
{
 getExpand(isExpand,expandCode,x,y);
}

bool TsubtitlesSettings::getTip(unsigned int pageId,char_t *buf,size_t len)
{
 if (pageId==1)
  {
   char_t tipS[256];
   char_t horiz[256],vert[256];getPosHoriz(posX,horiz,NULL,0);getPosVert(posY,vert,NULL,0);
   tsprintf(tipS,_l("%s, %s"),horiz,vert);
   if (delay!=delayDef)
    strcatf(tipS,_l("\nDelay: %i ms"),delay);
   if (speed!=speedDef || speed2!=speedDef)
    strcatf(tipS,_l("\nSpeed: %i/%i"),speed,speed2);
   strncpy(buf,tipS,len);
   buf[len-1]='\0'; 
  } 
 else if (pageId==2)
  font.getTip(buf,len); 
 return true; 
}

void TsubtitlesSettings::reg_op(TregOp &t)
{
 TfilterSettingsVideo::reg_op(t);
 font.reg_op(t);
 if (isExpand==-1)
  isExpand=expandCode?1:0;
}

const int* TsubtitlesSettings::getResets(unsigned int pageId)
{
 if (pageId==0 || pageId==3)
  {
   static const int idResets[]={
    IDFF_subVobsubAA,IDFF_subVobsubAAswgauss,IDFF_subVobsubChangePosition,IDFF_subVobsubScale,
    0};
   return idResets; 
  }
 else
  return NULL; 
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?