/* set up and run a processor */ void InvertPlugin::setupAndProcess(InvertBase &processor, const OFX::RenderArguments &args) { // get a dst image std::auto_ptr<OFX::Image> dst(dstClip_->fetchImage(args.time)); if (!dst.get()) { OFX::throwSuiteStatusException(kOfxStatFailed); } OFX::BitDepthEnum dstBitDepth = dst->getPixelDepth(); OFX::PixelComponentEnum dstComponents = dst->getPixelComponents(); // fetch main input image std::auto_ptr<OFX::Image> src(srcClip_->fetchImage(args.time)); // make sure bit depths are sane if (src.get()) { OFX::BitDepthEnum srcBitDepth = src->getPixelDepth(); OFX::PixelComponentEnum srcComponents = src->getPixelComponents(); // see if they have the same depths and bytes and all if (srcBitDepth != dstBitDepth || srcComponents != dstComponents) { OFX::throwSuiteStatusException(kOfxStatErrImageFormat); } } // auto ptr for the mask. std::auto_ptr<OFX::Image> mask((getContext() != OFX::eContextFilter) ? maskClip_->fetchImage(args.time) : 0); // do we do masking if (getContext() != OFX::eContextFilter && maskClip_->isConnected()) { // say we are masking processor.doMasking(true); // Set it in the processor processor.setMaskImg(mask.get()); } bool red, green, blue, alpha; _paramProcessR->getValueAtTime(args.time, red); _paramProcessG->getValueAtTime(args.time, green); _paramProcessB->getValueAtTime(args.time, blue); _paramProcessA->getValueAtTime(args.time, alpha); double mix; _mix->getValueAtTime(args.time, mix); bool maskInvert; _maskInvert->getValueAtTime(args.time, maskInvert); processor.setValues(red, green, blue, alpha, mix, maskInvert); // set the images processor.setDstImg(dst.get()); processor.setSrcImg(src.get()); // set the render window processor.setRenderWindow(args.renderWindow); // Call the base class process member, this will call the derived templated process code processor.process(); }
/* set up and run a processor */ void BasicPlugin::setupAndProcess(ImageScalerBase &processor, const OFX::RenderArguments &args) { // get a dst image std::auto_ptr<OFX::Image> dst(dstClip_->fetchImage(args.time)); OFX::BitDepthEnum dstBitDepth = dst->getPixelDepth(); OFX::PixelComponentEnum dstComponents = dst->getPixelComponents(); // fetch main input image std::auto_ptr<OFX::Image> src(srcClip_->fetchImage(args.time)); // make sure bit depths are sane if(src.get()) { OFX::BitDepthEnum srcBitDepth = src->getPixelDepth(); OFX::PixelComponentEnum srcComponents = src->getPixelComponents(); // see if they have the same depths and bytes and all if(srcBitDepth != dstBitDepth || srcComponents != dstComponents) throw int(1); // HACK!! need to throw an sensible exception here! } // auto ptr for the mask. // Should do this inside the if statement below but the MS compiler I have doesn't have // a 'reset' function on the auto_ptr class std::auto_ptr<OFX::Image> mask(getContext() != OFX::eContextFilter ? maskClip_->fetchImage(args.time) : 0); // do we do masking if(getContext() != OFX::eContextFilter) { // say we are masking processor.doMasking(true); // Set it in the processor processor.setMaskImg(mask.get()); } // get the scale parameter values... double r, g, b, a = aScale_->getValueAtTime(args.time); r = g = b = scale_->getValueAtTime(args.time); // see if the individual component scales are enabled if(componentScalesEnabled_->getValueAtTime(args.time)) { r *= rScale_->getValueAtTime(args.time); g *= gScale_->getValueAtTime(args.time); b *= bScale_->getValueAtTime(args.time); } // set the images processor.setDstImg(dst.get()); processor.setSrcImg(src.get()); // set the render window processor.setRenderWindow(args.renderWindow); // set the scales processor.setScales((float)r, (float)g, (float)b, (float)a); // Call the base class process member, this will call the derived templated process code processor.process(); }
bool InvertPlugin::isIdentity(const RenderArguments &args, Clip * &identityClip, double &identityTime) { bool red, green, blue, alpha; double mix; _paramProcessR->getValueAtTime(args.time, red); _paramProcessG->getValueAtTime(args.time, green); _paramProcessB->getValueAtTime(args.time, blue); _paramProcessA->getValueAtTime(args.time, alpha); _mix->getValueAtTime(args.time, mix); if (mix == 0. || (!red && !green && !blue && !alpha)) { identityClip = srcClip_; return true; } else { return false; } }
// overridden is identity bool BasicPlugin:: isIdentity(const OFX::IsIdentityArguments &args, OFX::Clip * &identityClip, double &identityTime) { // get the scale parameters double scale = scale_->getValueAtTime(args.time); double rScale = 1, gScale = 1, bScale = 1, aScale = 1; if(componentScalesEnabled_->getValueAtTime(args.time)) { rScale = rScale_->getValueAtTime(args.time); gScale = gScale_->getValueAtTime(args.time); bScale = bScale_->getValueAtTime(args.time); aScale = aScale_->getValueAtTime(args.time); } rScale *= scale; gScale *= scale; bScale *= scale; // do we do any scaling ? if(rScale == 1 && gScale == 1 && bScale == 1 && aScale == 1) { identityClip = srcClip_; identityTime = args.time; return true; } // nope, idenity we is return false; }
/* set up and run a processor */ void AnaglyphPlugin::setupAndProcess(AnaglyphBase &processor, const OFX::RenderArguments &args) { // get a dst image std::auto_ptr<OFX::Image> dst(dstClip_->fetchImage(args.time)); if (!dst.get()) { OFX::throwSuiteStatusException(kOfxStatFailed); } if (dst->getRenderScale().x != args.renderScale.x || dst->getRenderScale().y != args.renderScale.y || dst->getField() != args.fieldToRender) { setPersistentMessage(OFX::Message::eMessageError, "", "OFX Host gave image with wrong scale or field properties"); OFX::throwSuiteStatusException(kOfxStatFailed); } OFX::BitDepthEnum dstBitDepth = dst->getPixelDepth(); OFX::PixelComponentEnum dstComponents = dst->getPixelComponents(); // fetch main input image std::auto_ptr<OFX::Image> srcLeft(srcClip_->fetchStereoscopicImage(args.time,0)); if (srcLeft.get()) { if (srcLeft->getRenderScale().x != args.renderScale.x || srcLeft->getRenderScale().y != args.renderScale.y || srcLeft->getField() != args.fieldToRender) { setPersistentMessage(OFX::Message::eMessageError, "", "OFX Host gave image with wrong scale or field properties"); OFX::throwSuiteStatusException(kOfxStatFailed); } } std::auto_ptr<OFX::Image> srcRight(srcClip_->fetchStereoscopicImage(args.time,1)); if (srcRight.get()) { if (srcRight->getRenderScale().x != args.renderScale.x || srcRight->getRenderScale().y != args.renderScale.y || srcRight->getField() != args.fieldToRender) { setPersistentMessage(OFX::Message::eMessageError, "", "OFX Host gave image with wrong scale or field properties"); OFX::throwSuiteStatusException(kOfxStatFailed); } } // make sure bit depths are sane if (srcLeft.get()) { OFX::BitDepthEnum srcBitDepth = srcLeft->getPixelDepth(); OFX::PixelComponentEnum srcComponents = srcLeft->getPixelComponents(); // see if they have the same depths and bytes and all if (srcBitDepth != dstBitDepth || srcComponents != dstComponents) OFX::throwSuiteStatusException(kOfxStatErrImageFormat); } if (srcRight.get()) { OFX::BitDepthEnum srcBitDepth = srcRight->getPixelDepth(); OFX::PixelComponentEnum srcComponents = srcRight->getPixelComponents(); // see if they have the same depths and bytes and all if (srcBitDepth != dstBitDepth || srcComponents != dstComponents) OFX::throwSuiteStatusException(kOfxStatErrImageFormat); } double amtcolour = amtcolour_->getValueAtTime(args.time); bool swap = swap_->getValueAtTime(args.time); int offset = offset_->getValueAtTime(args.time); // set the images processor.setDstImg(dst.get()); processor.setSrcLeftImg(srcLeft.get()); processor.setSrcRightImg(srcRight.get()); // set the render window processor.setRenderWindow(args.renderWindow); // set the parameters processor.setAmtColour(amtcolour); processor.setSwap(swap); processor.setOffset(offset); // Call the base class process member, this will call the derived templated process code processor.process(); }