TuttleOFX
1
|
00001 #include "imageEffect.hpp" 00002 00003 #include <tuttle/common/exceptions.hpp> 00004 00005 #include <ofxCore.h> 00006 00007 #include <boost/lexical_cast.hpp> 00008 00009 namespace tuttle { 00010 namespace ofx { 00011 namespace imageEffect { 00012 00013 /** @brief map a std::string to a context */ 00014 EContext mapContextStringToEnum( const std::string& s ) 00015 { 00016 if( s == kOfxImageEffectContextGenerator ) 00017 return eContextGenerator; 00018 if( s == kOfxImageEffectContextFilter ) 00019 return eContextFilter; 00020 if( s == kOfxImageEffectContextTransition ) 00021 return eContextTransition; 00022 if( s == kOfxImageEffectContextPaint ) 00023 return eContextPaint; 00024 if( s == kOfxImageEffectContextGeneral ) 00025 return eContextGeneral; 00026 if( s == kOfxImageEffectContextRetimer ) 00027 return eContextRetimer; 00028 if( s == kOfxImageEffectContextReader ) 00029 return eContextReader; 00030 if( s == kOfxImageEffectContextWriter ) 00031 return eContextWriter; 00032 BOOST_THROW_EXCEPTION( exception::Value() 00033 << exception::dev() + s ); 00034 return eContextGeneral; 00035 } 00036 00037 /** @brief map a std::string to a context */ 00038 const std::string mapContextEnumToString( const EContext s ) 00039 { 00040 switch( s ) 00041 { 00042 case eContextGenerator: 00043 return kOfxImageEffectContextGenerator; 00044 case eContextFilter: 00045 return kOfxImageEffectContextFilter; 00046 case eContextTransition: 00047 return kOfxImageEffectContextTransition; 00048 case eContextPaint: 00049 return kOfxImageEffectContextPaint; 00050 case eContextGeneral: 00051 return kOfxImageEffectContextGeneral; 00052 case eContextRetimer: 00053 return kOfxImageEffectContextRetimer; 00054 case eContextReader: 00055 return kOfxImageEffectContextReader; 00056 case eContextWriter: 00057 return kOfxImageEffectContextWriter; 00058 case eContextNone: 00059 return "ContextNone..."; 00060 } 00061 BOOST_THROW_EXCEPTION( exception::Value() 00062 << exception::dev() + "Unknown image effect context enum." ); 00063 return ""; 00064 } 00065 00066 //const std::string mapMessageTypeEnumToString( const OFX::Message::EMessageType type ) 00067 //{ 00068 // if( type == OFX::Message::eMessageFatal ) 00069 // return kOfxMessageFatal; 00070 // else if( type == OFX::Message::eMessageError ) 00071 // return kOfxMessageError; 00072 // else if( type == OFX::Message::eMessageMessage ) 00073 // return kOfxMessageMessage; 00074 // else if( type == OFX::Message::eMessageLog ) 00075 // return kOfxMessageLog; 00076 // else if( type == OFX::Message::eMessageQuestion ) 00077 // return kOfxMessageQuestion; 00078 // BOOST_THROW_EXCEPTION( exception::Value() 00079 // << exception::dev() + type ); 00080 // return kOfxMessageError; 00081 //} 00082 // 00083 //OFX::Message::EMessageReply mapMessageReplyStatusToEnum( const OfxStatus stat ) 00084 //{ 00085 // if( stat == kOfxStatOK ) 00086 // return OFX::Message::eMessageReplyOK; 00087 // else if( stat == kOfxStatReplyYes ) 00088 // return OFX::Message::eMessageReplyYes; 00089 // else if( stat == kOfxStatReplyNo ) 00090 // return OFX::Message::eMessageReplyNo; 00091 // else if( stat == kOfxStatFailed ) 00092 // return OFX::Message::eMessageReplyFailed; 00093 // BOOST_THROW_EXCEPTION( exception::Value() 00094 // << exception::dev() + stat ); 00095 // return OFX::Message::eMessageReplyFailed; 00096 //} 00097 // 00098 //OfxStatus mapMessageReplyEnumToStatus( const OFX::Message::EMessageReply stat ) 00099 //{ 00100 // switch( stat ) 00101 // { 00102 // case OFX::Message::eMessageReplyOK: 00103 // return kOfxStatOK; 00104 // case OFX::Message::eMessageReplyYes: 00105 // return kOfxStatReplyYes; 00106 // case OFX::Message::eMessageReplyNo: 00107 // return kOfxStatReplyNo; 00108 // case OFX::Message::eMessageReplyFailed: 00109 // return kOfxStatFailed; 00110 // } 00111 // BOOST_THROW_EXCEPTION( exception::Value() 00112 // << exception::dev() + stat ); 00113 // return kOfxStatFailed; 00114 //} 00115 // 00116 ///** @brief map a std::string to a context */ 00117 //InstanceChangeReason mapInstanceChangedReasonStringToEnum( const std::string& s ) 00118 //{ 00119 // if( s == kOfxChangePluginEdited ) 00120 // return eChangePluginEdit; 00121 // if( s == kOfxChangeUserEdited ) 00122 // return eChangeUserEdit; 00123 // if( s == kOfxChangeTime ) 00124 // return eChangeTime; 00125 // BOOST_THROW_EXCEPTION( exception::Value() 00126 // << exception::dev() + s ); 00127 // return eChangePluginEdit; 00128 //} 00129 00130 /** @brief turns a bit depth string into and enum */ 00131 EBitDepth mapBitDepthStringToEnum( const std::string& str ) 00132 { 00133 if( str == kOfxBitDepthByte ) 00134 { 00135 return eBitDepthUByte; 00136 } 00137 else if( str == kOfxBitDepthShort ) 00138 { 00139 return eBitDepthUShort; 00140 } 00141 else if( str == kOfxBitDepthFloat ) 00142 { 00143 return eBitDepthFloat; 00144 } 00145 else if( str == kOfxBitDepthNone ) 00146 { 00147 return eBitDepthNone; 00148 } 00149 else 00150 { 00151 return eBitDepthCustom; 00152 } 00153 } 00154 00155 const std::string mapBitDepthEnumToString( const EBitDepth e ) 00156 { 00157 switch( e ) 00158 { 00159 case eBitDepthUByte: 00160 return kOfxBitDepthByte; 00161 case eBitDepthUShort: 00162 return kOfxBitDepthShort; 00163 case eBitDepthFloat: 00164 return kOfxBitDepthFloat; 00165 case eBitDepthNone: 00166 return kOfxBitDepthNone; 00167 case eBitDepthCustom: 00168 return "eBitDepthCustom"; 00169 } 00170 BOOST_THROW_EXCEPTION( exception::Value() 00171 << exception::dev() + "BitDepth enum: " + e ); 00172 return kOfxBitDepthNone; 00173 } 00174 00175 /** @brief turns a pixel component string into and enum */ 00176 EPixelComponent mapPixelComponentStringToEnum( const std::string& str ) 00177 { 00178 if( str == kOfxImageComponentRGBA ) 00179 { 00180 return ePixelComponentRGBA; 00181 } 00182 else if( str == kOfxImageComponentRGB ) 00183 { 00184 return ePixelComponentRGB; 00185 } 00186 else if( str == kOfxImageComponentAlpha ) 00187 { 00188 return ePixelComponentAlpha; 00189 } 00190 else if( str == kOfxImageComponentNone ) 00191 { 00192 return ePixelComponentNone; 00193 } 00194 else 00195 { 00196 return ePixelComponentCustom; 00197 } 00198 } 00199 00200 std::string mapPixelComponentEnumToString( const EPixelComponent e ) 00201 { 00202 switch( e ) 00203 { 00204 case ePixelComponentRGBA: 00205 return kOfxImageComponentRGBA; 00206 case ePixelComponentRGB: 00207 return kOfxImageComponentRGB; 00208 case ePixelComponentAlpha: 00209 return kOfxImageComponentAlpha; 00210 case ePixelComponentNone: 00211 return kOfxImageComponentNone; 00212 case ePixelComponentCustom: 00213 return "ePixelComponentCustom"; 00214 } 00215 BOOST_THROW_EXCEPTION( exception::Value() 00216 << exception::user() + "PixelComponent enum: " + e ); 00217 } 00218 00219 ///** @brief turns a premultiplication string into and enum */ 00220 //EPreMultiplication mapPreMultiplicationStringToEnum( const std::string& str ) 00221 //{ 00222 // if( str == kOfxImageOpaque ) 00223 // { 00224 // return eImageOpaque; 00225 // } 00226 // else if( str == kOfxImagePreMultiplied ) 00227 // { 00228 // return eImagePreMultiplied; 00229 // } 00230 // else if( str == kOfxImageUnPreMultiplied ) 00231 // { 00232 // return eImageUnPreMultiplied; 00233 // } 00234 // BOOST_THROW_EXCEPTION( exception::Value() 00235 // << exception::user() + str ); 00236 // return eImageOpaque; 00237 //} 00238 // 00239 //std::string mapPreMultiplicationEnumToString( const EPreMultiplication e ) 00240 //{ 00241 // switch( e ) 00242 // { 00243 // case eImageOpaque: 00244 // return kOfxImageOpaque; 00245 // case eImagePreMultiplied: 00246 // return kOfxImagePreMultiplied; 00247 // case eImageUnPreMultiplied: 00248 // return kOfxImageUnPreMultiplied; 00249 // } 00250 // BOOST_THROW_EXCEPTION( exception::Value() 00251 // << exception::user() + "PreMultiplication enum: " + e ); 00252 // return ""; 00253 //} 00254 // 00255 ///** @brief turns a field string into and enum */ 00256 //EField mapFieldStringToEnum( const std::string& str ) 00257 //{ 00258 // if( str == kOfxImageFieldNone ) 00259 // { 00260 // return eFieldNone; 00261 // } 00262 // else if( str == kOfxImageFieldBoth ) 00263 // { 00264 // return eFieldBoth; 00265 // } 00266 // else if( str == kOfxImageFieldLower ) 00267 // { 00268 // return eFieldLower; 00269 // } 00270 // else if( str == kOfxImageFieldUpper ) 00271 // { 00272 // return eFieldUpper; 00273 // } 00274 // BOOST_THROW_EXCEPTION( exception::Value() 00275 // << exception::user() + str ); 00276 // return eFieldNone; 00277 //} 00278 // 00279 //std::string mapFieldEnumToString( const EField e ) 00280 //{ 00281 // switch( e ) 00282 // { 00283 // case eFieldNone: 00284 // return kOfxImageFieldNone; 00285 // case eFieldBoth: 00286 // return kOfxImageFieldBoth; 00287 // case eFieldLower: 00288 // return kOfxImageFieldLower; 00289 // case eFieldUpper: 00290 // return kOfxImageFieldUpper; 00291 // } 00292 // BOOST_THROW_EXCEPTION( exception::Value() 00293 // << exception::user() + e ); 00294 // return ""; 00295 //} 00296 00297 /// get me deepest bit depth 00298 std::string findDeepestBitDepth( const std::string& s1, const std::string& s2 ) 00299 { 00300 if( s1 == kOfxBitDepthNone ) 00301 { 00302 return s2; 00303 } 00304 else if( s1 == kOfxBitDepthByte ) 00305 { 00306 if( s2 == kOfxBitDepthShort || s2 == kOfxBitDepthFloat ) 00307 return s2; 00308 return s1; 00309 } 00310 else if( s1 == kOfxBitDepthShort ) 00311 { 00312 if( s2 == kOfxBitDepthFloat ) 00313 return s2; 00314 return s1; 00315 } 00316 else if( s1 == kOfxBitDepthFloat ) 00317 { 00318 return s1; 00319 } 00320 else 00321 { 00322 BOOST_THROW_EXCEPTION( exception::Value() 00323 << exception::user() + "Unrecognized bitdepth " + quotes( s1 ) + "." 00324 << exception::dev() + "We can't find the deepest bit depth between " + quotes( s1 ) + " and " + quotes( s2 ) ); 00325 return s2; 00326 } 00327 } 00328 00329 } 00330 } 00331 } 00332