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)); } }