/home/neoflo/smb4k/SERVEUR/Millie/trunk/src/Kernel.cpp

Aller à la documentation de ce fichier.
00001 /******************************************************************************
00002  *       __    _    _   _       _       _   _____                             *
00003  *       | \  / |  | | | |     | |     | |  | ___|                            *
00004  *       |  \/  |  | | | |     | |     | |  | |_                              *
00005  *       |      |  | | | |     | |     | |  |  _|                             *
00006  *       | |\/| |  | | | |__   | |__   | |  | |__                             *
00007  *       |_|  |_|  |_| |____|  |____|  |_|  |____|                            *
00008  * __________________________________________________________________________ *
00009  *                 Multifunctional Library For Image Processing               *
00010  *                                                                            *
00011  *                                                                            *
00012  *                                                                            *
00013  *      (c) Copyright 2007 by Humbert Florent                                 *
00014  *                                                                            *
00015  *      This program is free software; you can redistribute it and/or modify  *
00016  *      it under the terms of the GNU General Public License as published by  *
00017  *      the Free Software Foundation; only version 2 of the License.          *
00018  *                                                                            *
00019  *      This program is distributed in the hope that it will be useful,       *
00020  *      but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00021  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00022  *      GNU General Public License for more details.                          *
00023  *                                                                            *
00024  *      You should have received a copy of the GNU General Public License     *
00025  *      along with this program; if not, write to the Free Software           *
00026  *      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA             *
00027  *      02111-1307, USA.                                                      *
00028  ******************************************************************************/
00029 
00032 #include <iostream>
00033 
00034 #include "Kernel.hpp"
00035 
00036 
00037 using namespace Millie;
00038 
00040 Kernel::Kernel(int taillex, int tailley, int originex, int originey)
00041 {
00042 
00043   if(taillex<=0 | tailley<=0)
00044     throw IllegalArgument("Kernel::KernelP");
00045   if(originex>=taillex || originey>=tailley)
00046     throw IllegalArgument("Kernel::KernelP");
00047   if(originex<0 || originey<0)
00048     throw IllegalArgument("Kernel::KernelP");
00049 
00050   _largeur = taillex;
00051   _hauteur = tailley;
00052   _originex = originex;
00053   _originey = originey;
00054   _isSeparable = false;
00055 
00056 
00057   _data.resize(getHeight() * getWidth());
00058   for(int i = 0; i<_data.getSize(); i++)
00059    _data[i] = 0.0f;
00060 
00061 }
00062 
00063 Kernel::Kernel(int taillex, int tailley, int originex, int originey, const float * data)
00064 {
00065   if(data==NULL)
00066     throw NullPointer("Kernel::Kernel");
00067 
00068   if(taillex<=0 | tailley<=0)
00069     throw IllegalArgument("Kernel::Kernel");
00070   if(originex>=taillex || originey>=tailley)
00071     throw IllegalArgument("Kernel::Kernel");
00072   if(originex<0 || originey<0)
00073     throw IllegalArgument("Kernel::Kernel");
00074 
00075   _largeur = taillex;
00076   _hauteur = tailley;
00077   _originex = originex;
00078   _originey = originey;
00079   _isSeparable = false;
00080 
00081 
00082   _data.resize(getHeight() * getWidth());
00083   for(int i = 0; i< _data.getSize(); i++)
00084     _data[i] = data[i];
00085 
00086 }
00087 
00088 Kernel::Kernel(int taillex, int tailley, int originex, int originey, const float * datax, const float * datay)
00089 {
00090   if(datax==NULL || datay==NULL)
00091     throw NullPointer("Kernel::Kernel");
00092   if(taillex<=0 || tailley<=0)
00093     throw IllegalArgument("Kernel::Kernel");
00094   if(originex>=taillex || originey>=tailley)
00095     throw IllegalArgument("Kernel::Kernel");
00096   if(originex<0 || originey<0)
00097     throw IllegalArgument("Kernel::Kernel");
00098 
00099   _largeur = taillex;
00100   _hauteur = tailley;
00101   _originex = originex;
00102   _originey = originey;
00103   _isSeparable = true;
00104 
00105 
00106   _dataX.resize(getWidth());
00107   for(int i = 0; i< _dataX.getSize(); i++)
00108     _dataX[i] = datax[i];
00109 
00110   _dataY.resize(getHeight());
00111   for(int i = 0; i< _dataX.getSize(); i++)
00112     _dataY[i] = datay[i];
00113 
00114 
00115 }
00116 
00117 Kernel & Kernel::operator=(Kernel& origine)
00118 {
00119   if(origine.getHeight() != getHeight() | origine.getWidth() != getWidth())
00120   {
00121     throw IllegalArgument("Kernel::operator=");
00122   }
00123 
00124   _originex = origine.getXOrigin();
00125   _originey = origine.getYOrigin();
00126 
00127   if(origine.isSeparable())
00128   {
00129     _dataX = origine._dataX;
00130     _dataY = origine._dataY;
00131   }
00132   else
00133   {
00134     _data = origine._data;
00135   }
00136 
00137 
00138   _isSeparable = origine.isSeparable();
00139   return (*this);
00140 }
00141 
00142 Kernel::Kernel(const Kernel& origine)
00143 {
00144 
00145   _originex = origine.getXOrigin();
00146   _originey = origine.getYOrigin();
00147   _largeur = origine.getWidth();
00148   _hauteur = origine.getHeight();
00149 
00150   if(origine.isSeparable())
00151   {
00152     _dataX = origine._dataX;
00153     _dataY = origine._dataY;
00154   }
00155   else
00156   {
00157     _data = origine._data;
00158   }
00159 
00160   _isSeparable = origine.isSeparable();
00161 
00162 }
00163 
00164 bool Kernel::isSeparable() const
00165 {
00166   return _isSeparable;
00167 }
00168 
00169 Kernel::~Kernel()
00170 {
00171 }
00172 
00173 int Kernel::getXOrigin() const
00174 {
00175   return _originex;
00176 }
00177 
00178 int Kernel::getYOrigin() const
00179 {
00180   return _originey;
00181 }
00182 
00183 int Kernel::getWidth() const
00184 {
00185   return _largeur;
00186 }
00187 
00188 int Kernel::getHeight() const
00189 {
00190   return _hauteur;
00191 }
00192 
00193 
00194 float   Kernel::operator()(int x, int y) const
00195 {
00196   if(isSeparable())
00197     return (_dataX[x] * _dataY[y]);
00198   else
00199     return(_data[y * getWidth() + x]);
00200 }
00201 
00202 void Kernel::setValue(int x, int y, float value)
00203 {
00204   if(isSeparable())
00205     throw IllegalArgument("Kernel is separable, no sense !");
00206   else
00207    _data[y * getWidth() + x] = value;
00208 
00209 }
00210 
00211 int Kernel::getTopPadding() const
00212 {
00213   return getYOrigin();
00214 }
00215 
00216 int Kernel::getBottomPadding() const
00217 {
00218   return getHeight() - getYOrigin()-1;
00219 }
00220 
00221 int Kernel::getLeftPadding() const
00222 {
00223   return getXOrigin();
00224 }
00225 
00226 int Kernel::getRightPadding() const
00227 {
00228   return getWidth() - getXOrigin()-1;
00229 }

Généré le Fri May 18 23:24:34 2007 pour Millie par  doxygen 1.5.1