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
00026
00027
00028
00029
00032 #include "AreaOperator.hpp"
00033
00034 using namespace Millie;
00035
00036 AreaOperator::AreaOperator(const LocalAreaOperator & localOp)
00037 {
00038 _localOp = 0;
00039 _localOp = localOp.clone();
00040 }
00041
00042 AreaOperator::AreaOperator(LocalAreaOperator* areaOp)
00043 {
00044 if(areaOp == 0)
00045 throw NullPointer("AAreaOperator");
00046
00047 _localOp = areaOp;
00048 }
00049
00050 AreaOperator::~AreaOperator()
00051 {
00052 delete _localOp;
00053 }
00054
00055 void AreaOperator::compute(Image & out, const Image& in)
00056 {
00057 if(out.getNumComponents() != in.getNumComponents())
00058 throw IllegalArgument("AreaOperator::compute");
00059
00060 LocalAreaOperator& localAreaOp = getLocalAreaOperator();
00061
00062 int leftpadding = getLeftPadding();
00063 int rightpadding = getRightPadding();
00064 int toppadding = getTopPadding();
00065 int bottompadding = getBottomPadding();
00066 int hauteur = in.getHeight();
00067 int largeur = in.getWidth();
00068
00069 out.resize(largeur - (rightpadding + leftpadding), hauteur - (toppadding+bottompadding));
00070
00071
00072 for(int canal=0; canal< in.getNumComponents(); canal++)
00073 for(int j = toppadding; j< hauteur - bottompadding; j++)
00074 {
00075 for(int i = leftpadding; i< largeur - rightpadding; i++)
00076 {
00077 out.setPixel(i - leftpadding, j - toppadding,
00078 canal, localAreaOp.computeLocalArea(in, i,j, canal));
00079
00080 }
00081 }
00082 }
00083
00084 void AreaOperator::compute(Image& out, const Image& in, const BorderExtender& extender)
00085 {
00086 Image tempo(in.getNumComponents());
00087
00088 extender.extend(tempo, in, getTopPadding(),
00089 getLeftPadding(),
00090 getRightPadding(),
00091 getBottomPadding());
00092
00093 compute(out, tempo);
00094 }
00095
00096
00097 LocalAreaOperator& AreaOperator::getLocalAreaOperator()
00098 {
00099 return *_localOp;
00100 }
00101
00102 int AreaOperator::getTopPadding() const
00103 {
00104 return _localOp->getTopPadding();
00105 }
00106
00107 int AreaOperator::getBottomPadding() const
00108 {
00109 return _localOp->getBottomPadding();
00110 }
00111
00112 int AreaOperator::getLeftPadding() const
00113 {
00114 return _localOp->getLeftPadding() ;
00115 }
00116
00117
00118 int AreaOperator::getRightPadding() const
00119 {
00120 return _localOp->getRightPadding();
00121 }
00122
00123
00124 AreaOperator * AreaOperator::clone() const
00125 {
00126 return new AreaOperator(*this);
00127 }