00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef COMPOSITE_MASK_HH_
00026 #define COMPOSITE_MASK_HH_
00027
00028 #include "mask_base.hh"
00029
00030 namespace ost { namespace img {
00031
00032 class OpBase
00033 {
00034 public:
00035 virtual ~OpBase() {}
00036 virtual OpBase* Clone()=0;
00037 virtual bool operator()(const MaskPtr& lhs,const MaskPtr& rhs, const Vec2& v) const =0;
00038 virtual String GetName() const =0;
00039 };
00040
00041 class AndOp:public OpBase
00042 {
00043 public:
00044 virtual OpBase* Clone(){return new AndOp();}
00045 virtual bool operator()(const MaskPtr& lhs,const MaskPtr& rhs, const Vec2& v) const;
00046 virtual String GetName() const {return "AND";}
00047 };
00048
00049 class OrOp:public OpBase
00050 {
00051 public:
00052 virtual OpBase* Clone(){return new OrOp();}
00053 virtual bool operator()(const MaskPtr& lhs,const MaskPtr& rhs, const Vec2& v) const;
00054 virtual String GetName() const {return "OR";}
00055 };
00056
00057 class XorOp:public OpBase
00058 {
00059 public:
00060 virtual OpBase* Clone(){return new XorOp();}
00061 virtual bool operator()(const MaskPtr& lhs,const MaskPtr& rhs, const Vec2& v) const;
00062 virtual String GetName() const {return "XOR";}
00063 };
00064 typedef boost::shared_ptr<OpBase> OpPtr;
00065
00066
00067 class DLLEXPORT_OST_IMG_BASE CompositeMask: public MaskBase
00068 {
00069 public:
00070 CompositeMask(const MaskPtr& lhs, const MaskPtr& rhs,const String& op);
00071 CompositeMask(const CompositeMask& m);
00072
00073 String GetOperatorName() {
00074 return op_->GetName();
00075 }
00076
00077 virtual ~CompositeMask();
00078 virtual MaskPtr Clone();
00079 virtual bool IsInside(const Vec2& v);
00080
00081 virtual void Shift(const Vec2& v);
00082 virtual void Expand(Real d);
00083 virtual void Scale(Real d);
00084
00085
00086 virtual void Apply(MaskVisitor& v);
00087
00088
00089 protected:
00090 static OpBase* create_op_(const String& name);
00091 MaskPtr lhs_;
00092 MaskPtr rhs_;
00093 OpBase* op_;
00094 };
00095
00096 }}
00097
00098
00099 #endif