void ImageNode::compute( ValuePlug *output, const Context *context ) const { ImagePlug *imagePlug = output->parent<ImagePlug>(); if( !imagePlug ) { ComputeNode::compute( output, context ); return; } // we're computing part of an ImagePlug if( !enabled() ) { // disabled nodes just output a default black image. output->setToDefault(); return; } // node is enabled - defer to our derived classes to perform the appropriate computation if( output == imagePlug->formatPlug() ) { static_cast<AtomicFormatPlug *>( output )->setValue( computeFormat( context, imagePlug ) ); } else if( output == imagePlug->dataWindowPlug() ) { static_cast<AtomicBox2iPlug *>( output )->setValue( computeDataWindow( context, imagePlug ) ); } else if( output == imagePlug->metadataPlug() ) { static_cast<CompoundObjectPlug *>( output )->setValue( computeMetadata( context, imagePlug ) ); } else if( output == imagePlug->channelNamesPlug() ) { static_cast<StringVectorDataPlug *>( output )->setValue( computeChannelNames( context, imagePlug ) ); } else if( output == imagePlug->channelDataPlug() ) { std::string channelName = context->get<string>( ImagePlug::channelNameContextName ); if( channelEnabled( channelName ) ) { V2i tileOrigin = context->get<V2i>( ImagePlug::tileOriginContextName ); if( tileOrigin.x % ImagePlug::tileSize() || tileOrigin.y % ImagePlug::tileSize() ) { throw Exception( "The image:tileOrigin must be a multiple of ImagePlug::tileSize()" ); } static_cast<FloatVectorDataPlug *>( output )->setValue( computeChannelData( channelName, tileOrigin, context, imagePlug ) ); } else { output->setToDefault(); } } }