#include "stdfx.h" //#include "tsystem.h" #include "tfxparam.h" #include "tpixelutils.h" #include "tparamset.h" #include "trop.h" //=================================================================== class AdjustLevelsFx : public TStandardRasterFx { FX_PLUGIN_DECLARATION(AdjustLevelsFx) TRasterFxPort m_input; TRangeParamP m_in_rgb; TRangeParamP m_in_r; TRangeParamP m_in_g; TRangeParamP m_in_b; TRangeParamP m_in_m; TRangeParamP m_out_rgb; TRangeParamP m_out_r; TRangeParamP m_out_g; TRangeParamP m_out_b; TRangeParamP m_out_m; TDoubleParamP m_gamma_rgb; TDoubleParamP m_gamma_r; TDoubleParamP m_gamma_g; TDoubleParamP m_gamma_b; TDoubleParamP m_gamma_m; public: AdjustLevelsFx() : m_in_rgb(DoublePair(0.0, 255.0)), m_in_r(DoublePair(0.0, 255.0)), m_in_g(DoublePair(0.0, 255.0)), m_in_b(DoublePair(0.0, 255.0)), m_in_m(DoublePair(0.0, 255.0)), m_out_rgb(DoublePair(0.0, 255.0)), m_out_r(DoublePair(0.0, 255.0)), m_out_g(DoublePair(0.0, 255.0)), m_out_b(DoublePair(0.0, 255.0)), m_out_m(DoublePair(0.0, 255.0)), m_gamma_rgb(1.0), m_gamma_r(1.0), m_gamma_g(1.0), m_gamma_b(1.0), m_gamma_m(1.0) { bindParam(this, "in_rgb", m_in_rgb); bindParam(this, "in_r", m_in_r); bindParam(this, "in_g", m_in_g); bindParam(this, "in_b", m_in_b); bindParam(this, "in_m", m_in_m); bindParam(this, "out_rgb", m_out_rgb); bindParam(this, "out_r", m_out_r); bindParam(this, "out_g", m_out_g); bindParam(this, "out_b", m_out_b); bindParam(this, "out_m", m_out_m); bindParam(this, "gamma_rgb", m_gamma_rgb); bindParam(this, "gamma_r", m_gamma_r); bindParam(this, "gamma_g", m_gamma_g); bindParam(this, "gamma_b", m_gamma_b); bindParam(this, "gamma_m", m_gamma_m); addInputPort("Source", m_input); m_in_rgb->getMin()->setValueRange(0, 255); m_in_rgb->getMax()->setValueRange(0, 255); m_in_r->getMin()->setValueRange(0, 255); m_in_r->getMax()->setValueRange(0, 255); m_in_g->getMin()->setValueRange(0, 255); m_in_g->getMax()->setValueRange(0, 255); m_in_b->getMin()->setValueRange(0, 255); m_in_b->getMax()->setValueRange(0, 255); m_in_m->getMin()->setValueRange(0, 255); m_in_m->getMax()->setValueRange(0, 255); m_out_rgb->getMin()->setValueRange(0, 255); m_out_rgb->getMax()->setValueRange(0, 255); m_out_r->getMin()->setValueRange(0, 255); m_out_r->getMax()->setValueRange(0, 255); m_out_g->getMin()->setValueRange(0, 255); m_out_g->getMax()->setValueRange(0, 255); m_out_b->getMin()->setValueRange(0, 255); m_out_b->getMax()->setValueRange(0, 255); m_out_m->getMin()->setValueRange(0, 255); m_out_m->getMax()->setValueRange(0, 255); m_gamma_rgb->setValueRange(0.0, 200.0); m_gamma_r->setValueRange(0.0, 200.0); m_gamma_g->setValueRange(0.0, 200.0); m_gamma_b->setValueRange(0.0, 200.0); m_gamma_m->setValueRange(0.0, 200.0); } ~AdjustLevelsFx(){}; bool canHandle(const TRenderSettings &info, double frame) { return true; } bool doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info) { if (m_input.isConnected()) return m_input->doGetBBox(frame, bBox, info); else { bBox = TRectD(); return false; } } void doCompute(TTile &tile, double frame, const TRenderSettings &ri); }; //------------------------------------------------------------------ void AdjustLevelsFx::doCompute(TTile &tile, double frame, const TRenderSettings &ri) { if (!m_input.isConnected()) return; m_input->compute(tile, frame, ri); double gamma_rgb = m_gamma_rgb->getValue(frame); double gamma_r = m_gamma_r->getValue(frame); double gamma_g = m_gamma_g->getValue(frame); double gamma_b = m_gamma_b->getValue(frame); double gamma_m = m_gamma_m->getValue(frame); DoublePair vin_rgb = m_in_rgb->getValue(frame); DoublePair vin_r = m_in_r->getValue(frame); DoublePair vin_g = m_in_g->getValue(frame); DoublePair vin_b = m_in_b->getValue(frame); DoublePair vin_m = m_in_m->getValue(frame); DoublePair vout_rgb = m_out_rgb->getValue(frame); DoublePair vout_r = m_out_r->getValue(frame); DoublePair vout_g = m_out_g->getValue(frame); DoublePair vout_b = m_out_b->getValue(frame); DoublePair vout_m = m_out_m->getValue(frame); int in0[5], in1[5], out0[5], out1[5]; in0[0] = vin_rgb.first, in1[0] = vin_rgb.second; out0[0] = vout_rgb.first, out1[0] = vout_rgb.second; in0[1] = vin_r.first, in1[1] = vin_r.second; out0[1] = vout_r.first, out1[1] = vout_r.second; in0[2] = vin_g.first, in1[2] = vin_g.second; out0[2] = vout_g.first, out1[2] = vout_g.second; in0[3] = vin_b.first, in1[3] = vin_b.second; out0[3] = vout_b.first, out1[3] = vout_b.second; in0[4] = vin_m.first, in1[4] = vin_m.second; out0[4] = vout_m.first, out1[4] = vout_m.second; TRasterP ras = tile.getRaster(); TRop::rgbmAdjust(ras, ras, in0, in1, out0, out1); TRop::gammaCorrect(ras, gamma_rgb); TRop::gammaCorrectRGBM(ras, gamma_r, gamma_g, gamma_b, gamma_m); } FX_PLUGIN_IDENTIFIER(AdjustLevelsFx, "adjustLevelsFx");