Exemple #1
0
OutputSocket *KeyingNode::setupPreBlur(ExecutionSystem *graph, InputSocket *inputImage, int size, OutputSocket **originalImage)
{
	ConvertRGBToYCCOperation *convertRGBToYCCOperation = new ConvertRGBToYCCOperation();
	convertRGBToYCCOperation->setMode(0);  /* ITU 601 */

	inputImage->relinkConnections(convertRGBToYCCOperation->getInputSocket(0), 0, graph);
	graph->addOperation(convertRGBToYCCOperation);

	CombineChannelsOperation *combineOperation = new CombineChannelsOperation();
	graph->addOperation(combineOperation);

	for (int channel = 0; channel < 4; channel++) {
		SeparateChannelOperation *separateOperation = new SeparateChannelOperation();
		separateOperation->setChannel(channel);
		addLink(graph, convertRGBToYCCOperation->getOutputSocket(0), separateOperation->getInputSocket(0));
		graph->addOperation(separateOperation);

		if (channel == 0 || channel == 3) {
			addLink(graph, separateOperation->getOutputSocket(0), combineOperation->getInputSocket(channel));
		}
		else {
			KeyingBlurOperation *blurXOperation = new KeyingBlurOperation();
			KeyingBlurOperation *blurYOperation = new KeyingBlurOperation();

			blurXOperation->setSize(size);
			blurXOperation->setAxis(KeyingBlurOperation::BLUR_AXIS_X);
			blurXOperation->setbNode(this->getbNode());

			blurYOperation->setSize(size);
			blurYOperation->setAxis(KeyingBlurOperation::BLUR_AXIS_Y);
			blurYOperation->setbNode(this->getbNode());

			addLink(graph, separateOperation->getOutputSocket(), blurXOperation->getInputSocket(0));
			addLink(graph, blurXOperation->getOutputSocket(), blurYOperation->getInputSocket(0));
			addLink(graph, blurYOperation->getOutputSocket(0), combineOperation->getInputSocket(channel));

			graph->addOperation(blurXOperation);
			graph->addOperation(blurYOperation);
		}
	}

	ConvertYCCToRGBOperation *convertYCCToRGBOperation = new ConvertYCCToRGBOperation();
	convertYCCToRGBOperation->setMode(0);  /* ITU 601 */
	addLink(graph, combineOperation->getOutputSocket(0), convertYCCToRGBOperation->getInputSocket(0));
	graph->addOperation(convertYCCToRGBOperation);

	*originalImage = convertRGBToYCCOperation->getInputSocket(0)->getConnection()->getFromSocket();

	return convertYCCToRGBOperation->getOutputSocket(0);
}
void SeparateRGBANode::convertToOperations(ExecutionSystem *graph, CompositorContext *context)
{
	InputSocket *imageSocket = this->getInputSocket(0);
	OutputSocket *outputRSocket = this->getOutputSocket(0);
	OutputSocket *outputGSocket = this->getOutputSocket(1);
	OutputSocket *outputBSocket = this->getOutputSocket(2);
	OutputSocket *outputASocket = this->getOutputSocket(3);

	if (outputRSocket->isConnected()) {
		SeparateChannelOperation *operation = new SeparateChannelOperation();
		operation->setChannel(0);
		imageSocket->relinkConnectionsDuplicate(operation->getInputSocket(0), 0, graph);
		outputRSocket->relinkConnections(operation->getOutputSocket(0));
		graph->addOperation(operation);
	}
	if (outputGSocket->isConnected()) {
		SeparateChannelOperation *operation = new SeparateChannelOperation();
		operation->setChannel(1);
		imageSocket->relinkConnectionsDuplicate(operation->getInputSocket(0), 0, graph);
		outputGSocket->relinkConnections(operation->getOutputSocket(0));
		graph->addOperation(operation);
	}
	if (outputBSocket->isConnected()) {
		SeparateChannelOperation *operation = new SeparateChannelOperation();
		operation->setChannel(2);
		imageSocket->relinkConnectionsDuplicate(operation->getInputSocket(0), 0, graph);
		outputBSocket->relinkConnections(operation->getOutputSocket(0));
		graph->addOperation(operation);
	}
	if (outputASocket->isConnected()) {
		SeparateChannelOperation *operation = new SeparateChannelOperation();
		operation->setChannel(3);
		imageSocket->relinkConnectionsDuplicate(operation->getInputSocket(0), 0, graph);
		outputASocket->relinkConnections(operation->getOutputSocket(0));
		graph->addOperation(operation);
	}
	
	/* remove the original connection to the node, this has been duplicated for all operations */
	imageSocket->unlinkConnections(graph);
}
void SeparateColorNode::convertToOperations(NodeConverter &converter, const CompositorContext &context) const
{
	NodeInput *imageSocket = this->getInputSocket(0);
	NodeOutput *outputRSocket = this->getOutputSocket(0);
	NodeOutput *outputGSocket = this->getOutputSocket(1);
	NodeOutput *outputBSocket = this->getOutputSocket(2);
	NodeOutput *outputASocket = this->getOutputSocket(3);
	
	NodeOperation *color_conv = getColorConverter(context);
	if (color_conv) {
		converter.addOperation(color_conv);
		
		converter.mapInputSocket(imageSocket, color_conv->getInputSocket(0));
	}
	
	{
		SeparateChannelOperation *operation = new SeparateChannelOperation();
		operation->setChannel(0);
		converter.addOperation(operation);
		
		if (color_conv)
			converter.addLink(color_conv->getOutputSocket(), operation->getInputSocket(0));
		else
			converter.mapInputSocket(imageSocket, operation->getInputSocket(0));
		converter.mapOutputSocket(outputRSocket, operation->getOutputSocket(0));
	}
	
	{
		SeparateChannelOperation *operation = new SeparateChannelOperation();
		operation->setChannel(1);
		converter.addOperation(operation);
		
		if (color_conv)
			converter.addLink(color_conv->getOutputSocket(), operation->getInputSocket(0));
		else
			converter.mapInputSocket(imageSocket, operation->getInputSocket(0));
		converter.mapOutputSocket(outputGSocket, operation->getOutputSocket(0));
	}
	
	{
		SeparateChannelOperation *operation = new SeparateChannelOperation();
		operation->setChannel(2);
		converter.addOperation(operation);
		
		if (color_conv)
			converter.addLink(color_conv->getOutputSocket(), operation->getInputSocket(0));
		else
			converter.mapInputSocket(imageSocket, operation->getInputSocket(0));
		converter.mapOutputSocket(outputBSocket, operation->getOutputSocket(0));
	}
	
	{
		SeparateChannelOperation *operation = new SeparateChannelOperation();
		operation->setChannel(3);
		converter.addOperation(operation);
		
		if (color_conv)
			converter.addLink(color_conv->getOutputSocket(), operation->getInputSocket(0));
		else
			converter.mapInputSocket(imageSocket, operation->getInputSocket(0));
		converter.mapOutputSocket(outputASocket, operation->getOutputSocket(0));
	}
}