#include <HxMfBpo.h>
Public Methods | |
HxMfBpo (HxImageData *src1, HxImageData *src2, HxString bpoName) | |
Constructor. More... | |
~HxMfBpo () | |
Destructor. More... | |
HxImageData * | source1 () const |
The first argument image of the frame. More... | |
HxImageData * | source2 () const |
The second argument image of the frame. More... | |
HxImageData * | result () const |
The result image of the frame. More... | |
bool | preOpIsOk () const |
Indicates whether initialization was OK. More... |
|
Constructor.
00018 : _src1(src1), _src2(src2), _tmpSrc1(0), _tmpSrc2(0), _preOpIsOk(true) 00019 { 00020 if (!src1 || !src2) 00021 { 00022 _preOpIsOk = false; 00023 return; 00024 } 00025 00026 HxImageSignature src1Sig(src1->signature()); 00027 HxImageSignature src2Sig(src2->signature()); 00028 HxImageSignature broadestSig(src1Sig.broadest(src2Sig)); 00029 HxImageSignature resultSig; 00030 00031 HxImgFtorRuleBase::QueryResultType qRes; 00032 00033 qRes = HxImgFtorRuleBase::instance().getResultType( 00034 src1Sig, "bpo", 00035 src1Sig.toString(), src2Sig.toString(), bpoName); 00036 00037 if (qRes) 00038 { 00039 /* 00040 * Only very specific combinations of argument types allowed. 00041 * Argument types stay what they are. 00042 */ 00043 resultSig = qRes; 00044 } 00045 else 00046 { 00047 // Type of result and second argument depends on type of first 00048 // argument. 00049 00050 qRes = HxImgFtorRuleBase::instance().getArgumentType( 00051 src1Sig, "bpo", src1Sig.toString(), bpoName); 00052 00053 src1Sig = (qRes && src2Sig.isEqual(qRes)) ? src1Sig : broadestSig; 00054 00055 // If type of second argument does not fit the required type 00056 // another attempt is made with the broadest signature. 00057 /* 24/01/2001 IMPORTANT DESIGN NOTE: 00058 * One can argue that if a second argument type can be found 00059 * when querying with the original first argument type as key, 00060 * and the given second argument type does not match the query result, 00061 * the second argument should be converted to the query result, but 00062 * only when the query result is broader than the second argument 00063 * type. 00064 */ 00065 // src1Sig = (qRes && src2Sig.broadest(qRes).isEqual(qRes)) 00066 // ? src1Sig : broadestSig; 00067 00068 qRes = HxImgFtorRuleBase::instance().getArgumentType( 00069 src2Sig, "bpo", src1Sig.toString(), bpoName); 00070 00071 if (!qRes) 00072 { 00073 HxEnvironment::instance()->errorStream() 00074 << "Cannot apply binary pixel operation " << bpoName << " to " 00075 << "images with type " << src1Sig.toString() << " and " 00076 << src2Sig.toString() << STD_ENDL; 00077 HxEnvironment::instance()->flush(); 00078 _preOpIsOk = false; 00079 } 00080 else 00081 { 00082 src2Sig = qRes; 00083 } 00084 00085 resultSig = HxImgFtorRuleBase::instance().getResultType( 00086 src1Sig, "bpo", src1Sig.toString(), bpoName); 00087 } 00088 00089 HxSizes sizes = src1->sizes().sup(src2->sizes()); 00090 00091 if (!src1Sig.isEqual(src1->signature())) { 00092 _tmpSrc1 = HxImgDataFactory::instance().makeImage(src1Sig, sizes); 00093 _tmpSrc1->set(src1); 00094 _src1 = _tmpSrc1; 00095 } 00096 00097 if (!src2Sig.isEqual(src2->signature())) { 00098 _tmpSrc2 = HxImgDataFactory::instance().makeImage(src2Sig, sizes); 00099 _tmpSrc2->set(src2); 00100 _src2 = _tmpSrc2; 00101 } 00102 00103 _result = HxImgDataFactory::instance().makeImage(resultSig, sizes); 00104 00105 } |
|
Destructor.
00108 { 00109 if (_tmpSrc1) 00110 delete _tmpSrc1; 00111 if (_tmpSrc2) 00112 delete _tmpSrc2; 00113 } |
|
The first argument image of the frame.
00117 { 00118 return _src1; 00119 } |
|
The second argument image of the frame.
00123 { 00124 return _src2; 00125 } |
|
The result image of the frame.
00129 { 00130 return _result; 00131 } |
|
Indicates whether initialization was OK.
00054 { 00055 return _preOpIsOk; 00056 } |