TuttleOFX
1
|
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 }