/////////////////////// // Transform framerate void AssTransformFramerateFilter::TransformFrameRate(AssFile *subs) { int n=0; // Run through using std::list; AssEntry *curEntry; AssDialogue *curDialogue; for (entryIter cur=subs->Line.begin();cur!=subs->Line.end();cur++) { curEntry = *cur; curEntry->StartMS = Input->GetTimeAtFrame(Output->GetFrameAtTime(curEntry->StartMS,true),true); curDialogue = AssEntry::GetAsDialogue(curEntry); // Update dialogue entries if (curDialogue) { // Line data LineData data; data.line = curDialogue; data.k = 0; data.kf = 0; data.ko = 0; // Process stuff curDialogue->ParseASSTags(); curDialogue->ProcessParameters(TransformTimeTags,&data); curDialogue->Start.SetMS(Input->GetTimeAtFrame(Output->GetFrameAtTime(curDialogue->Start.GetMS(),true),true)); curDialogue->End.SetMS(Input->GetTimeAtFrame(Output->GetFrameAtTime(curDialogue->End.GetMS(),false),false)); curDialogue->UpdateText(); curDialogue->UpdateData(); curDialogue->ClearBlocks(); n++; } } }
void AssTransformFramerateFilter::TransformFrameRate(AssFile *subs) { if (!Input->IsLoaded() || !Output->IsLoaded()) return; for (entryIter cur=subs->Line.begin();cur!=subs->Line.end();cur++) { AssDialogue *curDialogue = dynamic_cast<AssDialogue*>(*cur); if (curDialogue) { line = curDialogue; newK = 0; oldK = 0; newStart = trunc_cs(ConvertTime(curDialogue->Start)); newEnd = trunc_cs(ConvertTime(curDialogue->End) + 9); // Process stuff curDialogue->ParseASSTags(); curDialogue->ProcessParameters(TransformTimeTags, this); curDialogue->Start = newStart; curDialogue->End = newEnd; curDialogue->UpdateText(); curDialogue->ClearBlocks(); } } }
//////////// // Resample void DialogResample::OnResample (wxCommandEvent &event) { // Resolutions AssFile *subs = AssFile::top; int x1,y1; subs->GetResolution(x1,y1); long x2 = 0; long y2 = 0; ResX->GetValue().ToLong(&x2); ResY->GetValue().ToLong(&y2); // Check for validity if (x1 == 0 || x2 == 0 || y1 == 0 || y2 == 0) { EndModal(0); return; } // Calculate resamples rx = double(x2)/double(x1); ry = double(y2)/double(y1); r = ry; if (Anamorphic->IsChecked()) ar = rx/ry; else ar = 1.0; // Iterate through subs AssStyle *curStyle; AssDialogue *curDiag; for (entryIter cur=subs->Line.begin();cur!=subs->Line.end();cur++) { // Apply to dialogues curDiag = AssEntry::GetAsDialogue(*cur); if (curDiag) { try { // Override tags curDiag->ParseASSTags(); curDiag->ProcessParameters(ResampleTags,curDiag); // Drawing tags size_t nblocks = curDiag->Blocks.size(); AssDialogueBlockDrawing *curBlock; for (size_t i=0;i<nblocks;i++) { curBlock = AssDialogueBlock::GetAsDrawing(curDiag->Blocks.at(i)); if (curBlock) { curBlock->MultiplyCoords(rx,ry); } } // Margins curDiag->MarginL = int(curDiag->MarginL * rx + 0.5); curDiag->MarginR = int(curDiag->MarginR * rx + 0.5); curDiag->MarginV = int(curDiag->MarginV * ry + 0.5); // Update curDiag->UpdateText(); curDiag->UpdateData(); curDiag->ClearBlocks(); continue; } catch (const wchar_t *err) { wxLogMessage(err); } catch (wxString err) { wxLogMessage(err); } } // Apply to styles curStyle = AssEntry::GetAsStyle(*cur); if (curStyle) { curStyle->fontsize = int(curStyle->fontsize * r + 0.5); //curStyle->outline_w *= r; //curStyle->shadow_w *= r; curStyle->spacing *= rx; curStyle->scalex *= ar; curStyle->MarginL = int(curStyle->MarginL * rx + 0.5); curStyle->MarginR = int(curStyle->MarginR * rx + 0.5); curStyle->MarginV = int(curStyle->MarginV * ry + 0.5); curStyle->UpdateData(); } } // Change script resolution subs->SetScriptInfo(_T("PlayResX"),wxString::Format(_T("%i"),x2)); subs->SetScriptInfo(_T("PlayResY"),wxString::Format(_T("%i"),y2)); // Flag as modified subs->FlagAsModified(); grid->CommitChanges();; EndModal(0); }