예제 #1
0
void AssTransformFramerateFilter::TransformFrameRate(AssFile *subs) {
	if (!Input->IsLoaded() || !Output->IsLoaded()) return;
	for (auto& curDialogue : subs->Events) {
		line = &curDialogue;
		newK = 0;
		oldK = 0;
		newStart = trunc_cs(ConvertTime(curDialogue.Start));
		newEnd = trunc_cs(ConvertTime(curDialogue.End) + 9);

		// Process stuff
		auto blocks = line->ParseTags();
		for (auto block : blocks | agi::of_type<AssDialogueBlockOverride>())
			block->ProcessParameters(TransformTimeTags, this);
		curDialogue.Start = newStart;
		curDialogue.End = newEnd;
		curDialogue.UpdateText(blocks);
	}
}
예제 #2
0
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();
		}
	}
}
예제 #3
0
void AssTransformFramerateFilter::TransformTimeTags(std::string const& name, AssOverrideParameter *curParam, void *curData) {
	VariableDataType type = curParam->GetType();
	if (type != VariableDataType::INT && type != VariableDataType::FLOAT) return;

	AssTransformFramerateFilter *instance = static_cast<AssTransformFramerateFilter*>(curData);
	AssDialogue *curDiag = instance->line;

	int parVal = curParam->Get<int>();

	switch (curParam->classification) {
		case AssParameterClass::RELATIVE_TIME_START: {
			int value = instance->ConvertTime(trunc_cs(curDiag->Start) + parVal) - instance->newStart;

			// An end time of 0 is actually the end time of the line, so ensure
			// nonzero is never converted to 0
			// Needed here rather than the end case because start/end here mean
			// which end of the line the time is relative to, not whether it's
			// the start or end time (compare \move and \fad)
			if (value == 0 && parVal != 0) value = 1;
			curParam->Set(value);
			break;
		}
		case AssParameterClass::RELATIVE_TIME_END:
			curParam->Set(instance->newEnd - instance->ConvertTime(trunc_cs(curDiag->End) - parVal));
			break;
		case AssParameterClass::KARAOKE: {
			int start = curDiag->Start / 10 + instance->oldK + parVal;
			int value = (instance->ConvertTime(start * 10) - instance->newStart) / 10 - instance->newK;
			instance->oldK += parVal;
			instance->newK += value;
			curParam->Set(value);
			break;
		}
		default:
			return;
	}
}