TuttleOFX  1
GammaPlugin.cpp
Go to the documentation of this file.
00001 #include "GammaPlugin.hpp"
00002 #include "GammaProcess.hpp"
00003 
00004 #include <boost/gil/gil_all.hpp>
00005 
00006 namespace tuttle {
00007 namespace plugin {
00008 namespace gamma {
00009 
00010 GammaPlugin::GammaPlugin( OfxImageEffectHandle handle )
00011         : ImageEffectGilPlugin( handle )
00012 {
00013         _gammaType = fetchChoiceParam( kGammaType );
00014         _master    = fetchDoubleParam( kMasterValue );
00015         _red       = fetchDoubleParam( kRedValue );
00016         _green     = fetchDoubleParam( kGreenValue );
00017         _blue      = fetchDoubleParam( kBlueValue );
00018         _alpha     = fetchDoubleParam( kAlphaValue );
00019         _invert    = fetchBooleanParam( kInvert );
00020 
00021         // For updating the UI
00022         OFX::InstanceChangedArgs instChangedArgs;
00023         instChangedArgs.reason        = OFX::eChangePluginEdit;
00024         instChangedArgs.renderScale.x = instChangedArgs.renderScale.y = 1.0;
00025         instChangedArgs.time          = 0;
00026         changedParam( instChangedArgs, kGammaType );
00027 }
00028 
00029 GammaProcessParams<GammaPlugin::Scalar> GammaPlugin::getProcessParams( const OfxPointD& renderScale ) const
00030 {
00031         GammaProcessParams<Scalar> params;
00032         EGammaType type;
00033         double master,
00034                red, green, blue,
00035                alpha;
00036         bool invert;
00037         double gamma, iGamma,
00038                rGamma, gGamma, bGamma,
00039                aGamma;
00040 
00041         type   = static_cast<EGammaType>( _gammaType->getValue() );
00042         master = _master->getValue();
00043         red    = _red->getValue();
00044         green  = _green->getValue();
00045         blue   = _blue->getValue();
00046         alpha  = _alpha->getValue();
00047         invert = _invert->getValue();
00048         switch( type )
00049         {
00050                 case eGammaTypeGlobal:
00051                         gamma = master;
00052                         if( invert == true )
00053                         {
00054                                 gamma = 1.0 / gamma;
00055                         }
00056                         iGamma         = ( gamma == 1.0 ? 1.0 : 1.0 / gamma );
00057                         params.iRGamma =
00058                                 params.iGGamma =
00059                                 params.iBGamma = iGamma;
00060                         params.iAGamma = 1.0;
00061                         break;
00062                 case eGammaTypeChannels:
00063                         rGamma = red;
00064                         gGamma = green;
00065                         bGamma = blue;
00066                         aGamma = alpha;
00067                         if( invert == true )
00068                         {
00069                                 rGamma = 1.0 / rGamma;
00070                                 gGamma = 1.0 / gGamma;
00071                                 bGamma = 1.0 / bGamma;
00072                                 aGamma = 1.0 / aGamma;
00073                         }
00074                         params.iRGamma = ( rGamma == 1.0 ? 1.0 : 1.0 / rGamma );
00075                         params.iGGamma = ( gGamma == 1.0 ? 1.0 : 1.0 / gGamma );
00076                         params.iBGamma = ( bGamma == 1.0 ? 1.0 : 1.0 / bGamma );
00077                         params.iAGamma = ( aGamma == 1.0 ? 1.0 : 1.0 / aGamma );
00078                         break;
00079         }
00080         return params;
00081 }
00082 
00083 /**
00084  * @brief The overridden render function
00085  * @param[in]   args     Rendering parameters
00086  */
00087 void GammaPlugin::render( const OFX::RenderArguments& args )
00088 {
00089         doGilRender<GammaProcess>( *this, args );
00090 }
00091 
00092 void GammaPlugin::changedParam( const OFX::InstanceChangedArgs& args, const std::string& paramName )
00093 {
00094         if( paramName == kGammaType )
00095         {
00096                 bool bMaster = false;
00097                 bool bRGBA   = false;
00098                 switch( getGammaType() )
00099                 {
00100                         case eGammaTypeGlobal:
00101                                 bMaster = false;
00102                                 bRGBA   = true;
00103                                 break;
00104                         case eGammaTypeChannels:
00105                                 bMaster = true;
00106                                 bRGBA   = false;
00107                                 break;
00108                 }
00109                 _master->setIsSecretAndDisabled( bMaster );
00110                 _red   ->setIsSecretAndDisabled( bRGBA );
00111                 _green ->setIsSecretAndDisabled( bRGBA );
00112                 _blue  ->setIsSecretAndDisabled( bRGBA );
00113                 _alpha ->setIsSecretAndDisabled( bRGBA );
00114         }
00115 }
00116 
00117 }
00118 }
00119 }