From: <jl...@us...> - 2009-06-21 15:56:07
|
Revision: 3950 http://hugin.svn.sourceforge.net/hugin/?rev=3950&view=rev Author: jlegg Date: 2009-06-21 15:56:06 +0000 (Sun, 21 Jun 2009) Log Message: ----------- Corrections from last Commit (thanks to Pablo for spotting them). Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-06-19 21:17:09 UTC (rev 3949) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-06-21 15:56:06 UTC (rev 3950) @@ -115,7 +115,6 @@ root.appendChild(cps); // lenses - // TODO move lenses stuff QDomElement lenses_ = doc.createElement("lenses"); for (std::vector<Lens>::iterator it = lenses.begin(); it != lenses.end(); ++it) { lenses_.appendChild(it->toXML(doc)); Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp 2009-06-19 21:17:09 UTC (rev 3949) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp 2009-06-21 15:56:06 UTC (rev 3950) @@ -328,7 +328,7 @@ } } -const VariableMap SrcPanoImage::getVariableMap() const +VariableMap SrcPanoImage::getVariableMap() const { // make a variable map vector @@ -375,7 +375,7 @@ } -const ImageOptions& SrcPanoImage::getOptions() const +ImageOptions SrcPanoImage::getOptions() const { // convert stuff to ImageOptions object for old stuff not using the new interface. ImageOptions opts; @@ -388,6 +388,8 @@ opts.m_flatfield = m_flatfield; opts.responseType = m_responseType; opts.active = m_active; + + return opts; } void SrcPanoImage::setOptions(const ImageOptions & opts) Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-06-19 21:17:09 UTC (rev 3949) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-06-21 15:56:06 UTC (rev 3950) @@ -416,7 +416,7 @@ * creates a map of all the variables, regardless of which ones are actually * needed, every time it is called. */ - const VariableMap getVariableMap() const; + VariableMap getVariableMap() const; /** get the optimisation and stitching options, like PanoImage. @@ -424,7 +424,7 @@ * Do not use: eventually we want to make everything using these to ask for * each wanted variable directly using the get* functions instead. */ - const ImageOptions& getOptions() const; + ImageOptions getOptions() const; /** set the optimisation and stitching options * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-06-23 14:02:11
|
Revision: 3959 http://hugin.svn.sourceforge.net/hugin/?rev=3959&view=rev Author: jlegg Date: 2009-06-23 14:02:08 +0000 (Tue, 23 Jun 2009) Log Message: ----------- Add link[var](SrcPanoImg *) and unlink[var]() functions to SrcPanoImg, to link and unlink image variables. Setting a variable with set[var](value) sets all variables linked to it. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h 2009-06-23 13:28:43 UTC (rev 3958) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h 2009-06-23 14:02:08 UTC (rev 3959) @@ -184,11 +184,11 @@ /** Find the first item in the list of links with this ImageVariable. */ - ImageVariable<Type> * findStart() const; + ImageVariable<Type> * findStart(); /** Find the last item in the list of links with this ImageVariable. */ - ImageVariable<Type> * findEnd() const; + ImageVariable<Type> * findEnd(); /** Set all linked variables earlier in the list to some given data. */ @@ -292,13 +292,13 @@ */ ImageVariable<Type> *end = findEnd(); ImageVariable<Type> *beginning = link->findStart(); - end.m_linkNext = beginning; - beginning.m_linkPrevious = end; + end->m_linkNext = beginning; + beginning->m_linkPrevious = end; // now we must set the data from what we were linked to. /* the link target has the same data, but the stuff previously linked * with us might have something different. */ - setBackwards(link.m_data); + setBackwards(link->m_data); } } @@ -339,11 +339,11 @@ bool ImageVariable<Type>::searchBackwards(const ImageVariable<Type> * otherVariable) const { // is this what we are looking for? - if (*this == otherVariable) return true; + if (this == otherVariable) return true; // are there any more items to check? if (!m_linkPrevious) return false; // try another one. - return m_linkPrevious->serarchBackward(otherVariable); + return m_linkPrevious->searchBackwards(otherVariable); } template <class Type> @@ -354,11 +354,11 @@ // are there any more items to check? if (!m_linkNext) return false; // try another one. - return m_linkNext->serarchForwards(otherVariable); + return m_linkNext->searchForwards(otherVariable); } template <class Type> -ImageVariable<Type> * ImageVariable<Type>::findStart() const +ImageVariable<Type> * ImageVariable<Type>::findStart() { // Is this the start of the list? if (!m_linkPrevious) return this; @@ -367,7 +367,7 @@ } template <class Type> -ImageVariable<Type> * ImageVariable<Type>::findEnd() const +ImageVariable<Type> * ImageVariable<Type>::findEnd() { // Is this the end of the list? if (!m_linkNext) return this; Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-06-23 13:28:43 UTC (rev 3958) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-06-23 14:02:08 UTC (rev 3959) @@ -253,6 +253,26 @@ void setOptions(const ImageOptions & opt); + /* The link[variable name] functions + * Pass a pointer to another SrcPanoImg and the respective image variable + * will be shared between the images. Afterwards, changing the variable with + * set[variable name] on either image also sets the other image. + */ +#define image_variable( name, type, default_value, pto_code ) \ + void link##name (SrcPanoImage * target) \ + { m_##name.linkWith(&(target->m_##name)); } +#include "image_variables.h" +#undef image_variable + + /* The unlink[variable name] functions + * Unlinking a variable makes it unique to this image. Then changing it will + * not affect the other images. + */ +#define image_variable( name, type, default_value, pto_code ) \ + void unlink##name () \ + { m_##name.removeLinks(); } +#include "image_variables.h" +#undef image_variable /** try to fill out information about the image, by examining the exif data * focalLength and cropFactor will be updated with the ones read from the exif data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-06-25 22:34:15
|
Revision: 3967 http://hugin.svn.sourceforge.net/hugin/?rev=3967&view=rev Author: jlegg Date: 2009-06-25 22:34:07 +0000 (Thu, 25 Jun 2009) Log Message: ----------- Updated SrcPanoImg::getVar, ::setVar, and ::getVariableMap to work with all necessary image variables using image_variables.h. It is not quite as elegant as I hoped. However, now each image variable has its name, type, and default value defined in a single line in image_variables.h; and a conversion for PanoramaVariable like structures defined in a single line in ImageVariableTranslate.h. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h hugin/branches/gsoc2009_layout/src/hugin_base/panodata/image_variables.h Added Paths: ----------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableTranslate.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h 2009-06-25 20:17:08 UTC (rev 3966) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h 2009-06-25 22:34:07 UTC (rev 3967) @@ -283,6 +283,7 @@ if (searchBackwards(link) || searchForwards(link)) { DEBUG_WARN("Attempt to link already linked variables"); + return; } else { Added: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableTranslate.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableTranslate.h (rev 0) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableTranslate.h 2009-06-25 22:34:07 UTC (rev 3967) @@ -0,0 +1,340 @@ +// -*- c-basic-offset: 4 -*- +/** @file ImageVariableTranslate.h + * + * @brief Convenience functions for SrcPanoImage to use on the image variables. + * + * @author James Legg + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _PANODATA_IMAGEVARIABLETRANSLATE_H +#define _PANODATA_IMAGEVARIABLETRANSLATE_H + +namespace HuginBase +{ +/* We define stuff to use the PTO codes i image_variables.h + */ +/** Parent class to anything that aids conversion between PTO file variables and + * the image variables of SrcPanoImg. + * + * Although this class doesn't really do anything itself, it will be used when + * the variable in SrcPanoImg is not written to a file. + * + * We derive children of these to handle more specific cases, which are usually + * templates to handle similar things (e.g. all vectors) + * We then typedef to make a convertor for each variable in SrcPanoImg. + */ +class PTOVariableConverterNoOp +{ +public: + /** Check if a given pto format variable name applies to this image + * variable. + * + * @return true if we can handle this variable name, false otherwise. + * @param name The code used to identify the variable in the PTO file + * format. For example "Eev". + */ + inline static bool checkApplicability(const std::string name) + { + return false; + } + + /** Get a pto format variable's value, given its name and a reference to the + * variable in SrcPanoImg. + * + * It is a precondition of this function that the checkApplicability + * function returns true when passed name. + * + * @return 0 in this case, but child objects should return the value to + * write in a pto file for this variable. + * @param name The code used to identify the variable in the PTO file + * format. For example "Eev". + * @param var Some ImageVariable used by SrcPanoImg to hold this variable. + * @tparam T the template parameter of the ImageVariable var. + */ + template <class T> + inline static double getValueFromVariable( + const std::string name, + const ImageVariable<T> & var + ) + { + return 0; + } + + /** Set a ImageVariable in SrcPanoImg given the pto format variable. + * + * It is a precondition of this function that the checkApplicability + * function returns true when passed name. + * + * @param name The name used in the PTO format image variable. + * @param var The image variable used in SrcPanoImg to change. + * @param value The value specified in the PTO format image variable. + * @tparam T The template parameter of ImageVariable var. + */ + template <class T> + inline static void setValueFromVariable( + const std::string name, + ImageVariable<T> & var, + const double value + ) + { + } + + /** Add all PTO format variables specifed by an image variable in SrcPanoImg + * to a VariableMap. + * + * @param var The image variable used in SrcPanoImg to get values from. + * @param map The VariableMap + * @tparam T The template parameter of ImageVariable var. + */ + template <class T> + inline static void addToVariableMap( + const ImageVariable<T> & var, + VariableMap & map + ) + { + } +}; + +/** Object to group conversion functions for PTO format variables of up to three + * characters representing a single variable in SrcPanoImg. + * @tparam code1 1st character of identifier used in PTO file format. + * @tparam code2 2nd character of identifier used in PTO file format (or '/0'). + * @tparam code3 3rd character of identifier used in PTO file format (or '/0'). + * @tparam T type used in the ImageVariable. Should really be double, but some + * are small integers or enumerations. + */ +template <char code1, char code2 = '\0', char code3 = '\0', class T = double> +class PTOVariableConverterSingle +{ +public: + inline static bool checkApplicability(const std::string name) + { + DEBUG_TRACE(name); + static const char code[] = {code1, code2, code3, '\0'}; + return ((std::string)code) == name; + } + + inline static double getValueFromVariable(const std::string name, const ImageVariable<T> & var) + { + DEBUG_TRACE(name); + return var.getData(); + } + + inline static void setValueFromVariable(const std::string name, ImageVariable<T> & var, const double value) + { + DEBUG_TRACE(name); + var.setData((T)value); + } + + inline static void addToVariableMap(const ImageVariable<T> & var, VariableMap & map) + { + static const char code[] = {code1, code2, code3, '\0'}; + DEBUG_TRACE(code) + map.insert(std::make_pair(code, Variable(code, (double)var.getData()))); + } +}; + + +/** Object to group conversion functions for PTO format variables representing + * a std::vector variable in SrcPanoImg, using an identifying first character. + * + * It can only represent PTO format variables that can be expressed as some + * constant character followed by a index character, where the first element of + * the vector has the index character 'a' and the others follow in order. + * + * @tparam base_code string used in PTO file format upto the the character. + * @tparam T type used in SrcImageVariable. Should really be double, but could + * be float or something. + * @tparam size The number of letters and the size of the vector. + */ +template <char base_code, class T = double, size_t size = 4> +class PTOVariableConverterVectorChar +{ +public: + inline static bool checkApplicability(const std::string name) + { + DEBUG_TRACE(name); + return name.size() == 2 && name[0] == base_code && name[1] >= 'a' && name[1] < 'a' + char(size); + } + + inline static double getValueFromVariable(const std::string name, const ImageVariable<std::vector<T> > & var) + { + DEBUG_TRACE(name); + return var.getData()[name[1]-'a']; + } + + inline static void setValueFromVariable(const std::string name, ImageVariable<std::vector<T> > & var, const double value) + { + DEBUG_TRACE(name); + std::vector<T> temp = var.getData(); + temp[name[1]-'a'] = value; + var.setData(temp); + } + + inline static void addToVariableMap(const ImageVariable<std::vector<T> > & var, VariableMap & map) + { + char s[3] = {base_code, 'a', '\0'}; + for (size_t index = 0; index < size; index++, s[1]++) + { + map.insert(std::make_pair(s, Variable(s, (double)var.getData()[index]))); + DEBUG_TRACE(s) + } + } +}; + +/** Object to group conversion functions for PTO format variables representing + * a std::vector variable in SrcPanoImg, using characters stating from 'a'. + * + * This can only be used for one variable, and it is RadialDistortion. + * + * @tparam base_code string used in PTO file format upto the the character. + * @tparam T type used in the ImageVariable. Should really be double, but could + * be float or something. + * @tparam size The number of letters and the size of the vector. + */ +template <class T = double, size_t size = 3> +class PTOVariableConverterVector +{ +public: + inline static bool checkApplicability(const std::string name) + { + return name[0] >= 'a' && name[0] < 'a' + char(size); + } + + inline static double getValueFromVariable(const std::string name, const ImageVariable<std::vector<T> > & var) + { + DEBUG_TRACE(name); + return var.getData()[name[0]-'a']; + } + + inline static void setValueFromVariable(const std::string name, ImageVariable<std::vector<T> > & var, const double value) + { + std::vector<T> temp = var.getData(); + temp[name[0]-'a'] = value; + var.setData(temp); + DEBUG_TRACE(name); + } + + inline static void addToVariableMap(const ImageVariable<std::vector<T> > & var, VariableMap & map) + { + char s[] = "a"; + for (size_t index = 0; index < size; index++, s[0]++) + { + map.insert(std::make_pair(s, Variable(s, (double)var.getData()[index]))); + DEBUG_TRACE(s) + } + } +}; + +/** Object to group conversion functions for PTO format variables representing + * a hugin_utils::FDiff2D variable in SrcPanoImg. Each element must have a pto + * file format code that is 1 or 2 characters in length. + * + * @tparam code_x The PTO format code that matches the x memeber in the FDiff2D. + * @tparam code_y The PTO format code that matches the y memeber in the FDiff2D. + */ +template <char code_x1, char code_y1, char code_x2 = '\0', char code_y2 = '\0'> +class PTOVariableConverterFDiff2D +{ +public: + inline static bool checkApplicability(const std::string name) + { + static const char code_x[] = {code_x1, code_x2, '\0'}; + static const char code_y[] = {code_y1, code_y2, '\0'}; + return name == (std::string) code_x || name == (std::string) code_y; + } + + inline static double getValueFromVariable(const std::string name, const ImageVariable<hugin_utils::FDiff2D> & var) + { + static const char code_x[] = {code_x1, code_x2, '\0'}; + return name == (std::string) code_x ? var.getData().x : var.getData().y; + } + + inline static void setValueFromVariable(const std::string name, ImageVariable<hugin_utils::FDiff2D> & var, const double value) + { + hugin_utils::FDiff2D temp = var.getData(); + static const char code_x[] = {code_x1, code_x2, '\0'}; + (name == (std::string)code_x ? temp.x : temp.y) = value; + var.setData(temp); + } + + inline static void addToVariableMap(const ImageVariable<hugin_utils::FDiff2D> & var, VariableMap & map) + { + static const char s_x[] = {code_x1, code_x2, '\0'}; + static const char s_y[] = {code_y1, code_y2, '\0'}; + map.insert(std::make_pair(s_x, Variable(s_x, var.getData().x))); + map.insert(std::make_pair(s_y, Variable(s_y, var.getData().y))); + DEBUG_TRACE(s_x) + DEBUG_TRACE(s_y) + } +}; + +// Now we can define a type to use for every PanoramaVariable. +// We should make sure that any given code is only applicable to one of these. +/// @see image_variables.h + +/// @todo This could be n, but it is a string, not a double. +typedef PTOVariableConverterNoOp PTOVariableConverterForFilename; +typedef PTOVariableConverterNoOp PTOVariableConverterForSize; +typedef PTOVariableConverterSingle<'f','\0', '\0', SrcPanoImage::Projection> PTOVariableConverterForProjection; +typedef PTOVariableConverterSingle<'v'> PTOVariableConverterForHFOV; + +typedef PTOVariableConverterNoOp PTOVariableConverterForResponseType; +typedef PTOVariableConverterVectorChar<'R', float, 5> PTOVariableConverterForEMoRParams; +typedef PTOVariableConverterSingle<'E', 'e', 'v'> PTOVariableConverterForExposureValue; +typedef PTOVariableConverterSingle<'g'> PTOVariableConverterForGamma ; +typedef PTOVariableConverterSingle<'E', 'r'> PTOVariableConverterForWhiteBalanceRed; +typedef PTOVariableConverterSingle<'E', 'b'> PTOVariableConverterForWhiteBalanceBlue; + +typedef PTOVariableConverterSingle<'r'> PTOVariableConverterForRoll; +typedef PTOVariableConverterSingle<'p'> PTOVariableConverterForPitch; +typedef PTOVariableConverterSingle<'y'> PTOVariableConverterForYaw; + +typedef PTOVariableConverterVector<double, 3> PTOVariableConverterForRadialDistortion; +typedef PTOVariableConverterNoOp PTOVariableConverterForRadialDistortionRed; +typedef PTOVariableConverterNoOp PTOVariableConverterForRadialDistortionBlue; +typedef PTOVariableConverterFDiff2D<'d', 'e'> PTOVariableConverterForRadialDistortionCenterShift; +typedef PTOVariableConverterFDiff2D<'g', 't'> PTOVariableConverterForShear; + +typedef PTOVariableConverterNoOp PTOVariableConverterForCropMode; +/// @todo This could be S, but it is 4 integers in the form a,b,c,d -hence not a double. +typedef PTOVariableConverterNoOp PTOVariableConverterForCropRect; +typedef PTOVariableConverterNoOp PTOVariableConverterForAutoCenterCrop; + +/// @todo This could be Vf, but it is a string, not a double. +typedef PTOVariableConverterNoOp PTOVariableConverterForFlatfieldFilename; +typedef PTOVariableConverterSingle<'V', 'm', '\0', int> PTOVariableConverterForVigCorrMode; +typedef PTOVariableConverterVectorChar<'V', double, 4> PTOVariableConverterForRadialVigCorrCoeff; +typedef PTOVariableConverterFDiff2D<'V','V', 'x','y'> PTOVariableConverterForRadialVigCorrCenterShift; + +typedef PTOVariableConverterNoOp PTOVariableConverterForExifModel; +typedef PTOVariableConverterNoOp PTOVariableConverterForExifMake; +typedef PTOVariableConverterNoOp PTOVariableConverterForExifCropFactor; +typedef PTOVariableConverterNoOp PTOVariableConverterForExifFocalLength; +typedef PTOVariableConverterNoOp PTOVariableConverterForExifOrientation; +typedef PTOVariableConverterNoOp PTOVariableConverterForExifAperture; +typedef PTOVariableConverterNoOp PTOVariableConverterForExifISO; +typedef PTOVariableConverterNoOp PTOVariableConverterForExifDistance; + +typedef PTOVariableConverterNoOp PTOVariableConverterForFeatherWidth; +typedef PTOVariableConverterNoOp PTOVariableConverterForMorph; +typedef PTOVariableConverterNoOp PTOVariableConverterForActive; +typedef PTOVariableConverterNoOp PTOVariableConverterForLensNr; +} + +#endif Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp 2009-06-25 20:17:08 UTC (rev 3966) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp 2009-06-25 22:34:07 UTC (rev 3967) @@ -46,6 +46,8 @@ #define log2(x) (log(x) / M_LN2) #endif /* __FreeBSD__ */ +#include "ImageVariableTranslate.h" + namespace HuginBase { using namespace hugin_utils; @@ -108,7 +110,7 @@ std::vector<double> RadialVigCorrCoeff_default(4, 0.0); RadialVigCorrCoeff_default[0] = 1; -#define image_variable( name, type, default_value, pto_code ) m_##name.setData(default_value); +#define image_variable( name, type, default_value ) m_##name.setData(default_value); #include "image_variables.h" #undef image_variable } @@ -174,8 +176,9 @@ bool BaseSrcPanoImage::operator==(const BaseSrcPanoImage & other) const { + DEBUG_TRACE(""); return ( -#define image_variable( name, type, default_value, pto_code ) \ +#define image_variable( name, type, default_value ) \ m_##name.getData() == other.m_##name.getData() && #include "image_variables.h" #undef image_variable @@ -184,80 +187,34 @@ } // convinience functions to extract a set of variables -double SrcPanoImage::getVar(const std::string & name) const +double SrcPanoImage::getVar(const std::string & code) const { - assert(name.size() > 0); - // TODO: support all variables - if (name == "Eev") - return m_ExposureValue.getData(); - else if (name == "Er") - return m_WhiteBalanceRed.getData(); - else if (name == "Eb") - return m_WhiteBalanceBlue.getData(); - else if (name == "Ra") - return m_EMoRParams.getData()[0]; - else if (name[0] == 'R') - { - assert(name.size() == 2); - int i = name[1] - 'a'; - return m_EMoRParams.getData()[i]; - } else if (name[0] == 'V') - { - int i = name[1] - 'a'; - if (i > 0 && i < 4) { - return m_RadialVigCorrCoeff.getData()[i]; - } else { - if (name[1] == 'x') { - return m_RadialVigCorrCenterShift.getData().x; - } else if (name[1] == 'y') { - return m_RadialVigCorrCenterShift.getData().y; - } - } - } else { - assert(0 || "Unknown variable in getVar()"); + DEBUG_TRACE(""); + assert(code.size() > 0); +#define image_variable( name, type, default_value ) \ + if (PTOVariableConverterFor##name::checkApplicability(code)) \ + return PTOVariableConverterFor##name::getValueFromVariable(code, m_##name );\ + else +#include "image_variables.h" +#undef image_variable + {// this is for the final else. + DEBUG_ERROR("Unknown variable " << code); } return 0; } -void SrcPanoImage::setVar(const std::string & name, double val) +void SrcPanoImage::setVar(const std::string & code, double val) { - assert(name.size() > 0); - // TODO: support all variables - if (name == "Eev") - m_ExposureValue.setData(val); - else if (name == "Er") - m_WhiteBalanceRed.setData(val); - else if (name == "Eb") - m_WhiteBalanceBlue.setData(val); - else if (name[0] == 'R') - { - assert(name.size() == 2); - int i = name[1] - 'a'; - std::vector<float> temp = m_EMoRParams.getData(); - temp[i] = val; - m_EMoRParams.setData(temp); - } else if (name[0] == 'V') - { - int i = name[1] - 'a'; - if (i >= 0 && i < 4) { - std::vector<double> temp = m_RadialVigCorrCoeff.getData(); - temp[i] = val; - m_RadialVigCorrCoeff.setData(temp); - } else { - if (name[1] == 'x') { - hugin_utils::FDiff2D temp = m_RadialVigCorrCenterShift.getData(); - temp.x = val; - m_RadialVigCorrCenterShift.setData(temp); - } else if (name[1] == 'y') { - hugin_utils::FDiff2D temp = m_RadialVigCorrCenterShift.getData(); - temp.y = val; - m_RadialVigCorrCenterShift.setData(temp); - } else { - DEBUG_ERROR("Unknown variable " << name); - } - } - } else { - DEBUG_ERROR("Unknown variable " << name); + DEBUG_TRACE(""); + assert(code.size() > 0); +#define image_variable( name, type, default_value ) \ + if (PTOVariableConverterFor##name::checkApplicability(code)) \ + {PTOVariableConverterFor##name::setValueFromVariable(code, m_##name, val);}\ + else +#include "image_variables.h" +#undef image_variable + {// this is for the final else. + DEBUG_ERROR("Unknown variable " << code); } } @@ -267,43 +224,14 @@ // fill variable map with details about this image. // position - using namespace std; + DEBUG_TRACE(""); VariableMap vars; - - vars.insert(make_pair("v", Variable("v", getHFOV()))); - vars.insert(make_pair("r", Variable("r", getRoll()))); - vars.insert(make_pair("p", Variable("p", getPitch()))); - vars.insert(make_pair("y", Variable("y", getYaw()))); - // distortion - vars.insert(make_pair("a", Variable("a", getRadialDistortion()[0]))); - vars.insert(make_pair("b", Variable("b", getRadialDistortion()[1]))); - vars.insert(make_pair("c", Variable("c", getRadialDistortion()[2]))); - vars.insert(make_pair("d", Variable("d", getRadialDistortionCenterShift().x))); - vars.insert(make_pair("e", Variable("e", getRadialDistortionCenterShift().y))); - vars.insert(make_pair("g", Variable("g", getShear().x))); - vars.insert(make_pair("t", Variable("t", getShear().y))); +#define image_variable( name, type, default_value ) \ + PTOVariableConverterFor##name::addToVariableMap(m_##name, vars); +#include "image_variables.h" +#undef image_variable - // vignetting correction - vars.insert(make_pair("Va", Variable("Va", getRadialVigCorrCoeff()[0]))); - vars.insert(make_pair("Vb", Variable("Vb", getRadialVigCorrCoeff()[1]))); - vars.insert(make_pair("Vc", Variable("Vc", getRadialVigCorrCoeff()[2]))); - vars.insert(make_pair("Vd", Variable("Vd", getRadialVigCorrCoeff()[3]))); - vars.insert(make_pair("Vx", Variable("Vx", getRadialVigCorrCenterShift().x))); - vars.insert(make_pair("Vy", Variable("Vy", getRadialVigCorrCenterShift().y))); - - // exposure and white balance - vars.insert(make_pair("Eev", Variable("Eev", getExposureValue()))); - vars.insert(make_pair("Er", Variable("Er", getWhiteBalanceRed()))); - vars.insert(make_pair("Eb", Variable("Eb", getWhiteBalanceBlue()))); - - // camera response parameters - vars.insert(make_pair("Ra", Variable("Ra", getEMoRParams()[0]))); - vars.insert(make_pair("Rb", Variable("Rb", getEMoRParams()[1]))); - vars.insert(make_pair("Rc", Variable("Rc", getEMoRParams()[2]))); - vars.insert(make_pair("Rd", Variable("Rd", getEMoRParams()[3]))); - vars.insert(make_pair("Re", Variable("Re", getEMoRParams()[4]))); - return vars; } Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-06-25 20:17:08 UTC (rev 3966) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-06-25 22:34:07 UTC (rev 3967) @@ -108,13 +108,13 @@ // property accessors public: // get[variable name] functions -#define image_variable( name, type, default_value, pto_code ) \ +#define image_variable( name, type, default_value ) \ type get##name() const { return m_##name.getData(); } #include "image_variables.h" #undef image_variable // set[variable name] functions -#define image_variable( name, type, default_value, pto_code ) \ +#define image_variable( name, type, default_value ) \ void set##name(type data) { m_##name.setData(data); } #include "image_variables.h" #undef image_variable @@ -124,7 +124,7 @@ void setDefaults(); // the image variables m_[variable name] -#define image_variable( name, type, default_value, pto_code ) \ +#define image_variable( name, type, default_value ) \ ImageVariable<type> m_##name; #include "image_variables.h" #undef image_variable @@ -258,7 +258,7 @@ * will be shared between the images. Afterwards, changing the variable with * set[variable name] on either image also sets the other image. */ -#define image_variable( name, type, default_value, pto_code ) \ +#define image_variable( name, type, default_value ) \ void link##name (SrcPanoImage * target) \ { m_##name.linkWith(&(target->m_##name)); } #include "image_variables.h" @@ -268,7 +268,7 @@ * Unlinking a variable makes it unique to this image. Then changing it will * not affect the other images. */ -#define image_variable( name, type, default_value, pto_code ) \ +#define image_variable( name, type, default_value ) \ void unlink##name () \ { m_##name.removeLinks(); } #include "image_variables.h" Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/image_variables.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/image_variables.h 2009-06-25 20:17:08 UTC (rev 3966) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/image_variables.h 2009-06-25 22:34:07 UTC (rev 3967) @@ -42,51 +42,69 @@ * -# the name of the variable * -# the type of the variable * -# the default value - * -# the code for the variable in the pto file format. * - * @todo I might need to rething the last argument, there is a lot of vectors - * with multiple pto format codes. + * @par + * There is some non automatic stuff in ImageVariableTranslate.h that will need + * changing if this list changes. That file handles the translation to and from + * PTO file format style variables. + * @see ImageVariableTranslate.h */ -image_variable( Filename, std::string, "", "n" ) -image_variable( Size, vigra::Size2D , vigra::Size2D(0,0), NO_CODE ) -image_variable( Projection, Projection, RECTILINEAR, "f" ) -image_variable( HFOV, double, 50.0, "v" ) +/* Hmmm... I'ld like commas in template arguments, but < and > aren't real + * brackets so the template arguments will be interprated as separate macro + * arguments instead. + * Solution: Have an object in ImageVariableTranslate.h which handles all the + * pto conversion code. We can generate the code in SrcPanoImg.h automatically + * as ImageVariableTranslate.h typedefs PTOVariableConverterFor[name] for each + * variable. + * So we don't have a parameter that specifies the codes to use in a PTO file. + */ -image_variable( ResponseType, ResponseType, RESPONSE_EMOR, "Vm" ) -/// @todo this -image_variable( EMoRParams, std::vector<float>, std::vector<float>(5, 0), NO_CODE ) -image_variable( ExposureValue, double, 1.0, "Eev" ) -image_variable( Gamma, double, 1.0, "g" ) -image_variable( WhiteBalanceRed, double, 1.0, "Er" ) -image_variable( WhiteBalanceBlue, double, 1.0, "Eb" ) +// file variables +image_variable( Filename, std::string, "" ) +image_variable( Size, vigra::Size2D , vigra::Size2D(0,0) ) +// projection variables +image_variable( Projection, Projection, RECTILINEAR ) +image_variable( HFOV, double, 50.0 ) +// colour response variables +image_variable( ResponseType, ResponseType, RESPONSE_EMOR ) +image_variable( EMoRParams, std::vector<float>, std::vector<float>(5, 0.0) ) +image_variable( ExposureValue, double, 1.0 ) +image_variable( Gamma, double, 1.0 ) +image_variable( WhiteBalanceRed, double, 1.0 ) +image_variable( WhiteBalanceBlue, double, 1.0 ) + // orientation in degrees -image_variable( Roll, double , 0.0, "r" ) -image_variable( Pitch, double , 0.0, "p" ) -image_variable( Yaw, double, 0.0, "y" ) +image_variable( Roll, double , 0.0 ) +image_variable( Pitch, double , 0.0 ) +image_variable( Yaw, double, 0.0 ) // radial lens distortion -image_variable( RadialDistortion, std::vector<double>, distortion_default, NO_CODE ) +image_variable( RadialDistortion, std::vector<double>, distortion_default ) + // radial lens distortion (red, blue channel), for TCA correction -image_variable( RadialDistortionRed, std::vector<double>, distortion_default, NO_CODE ) -image_variable( RadialDistortionBlue, std::vector<double>, distortion_default, NO_CODE ) +image_variable( RadialDistortionRed, std::vector<double>, distortion_default ) +image_variable( RadialDistortionBlue, std::vector<double>, distortion_default ) + // Center shift -image_variable( RadialDistortionCenterShift, hugin_utils::FDiff2D, hugin_utils::FDiff2D(0.0, 0.0), NO_CODE ) +image_variable( RadialDistortionCenterShift, hugin_utils::FDiff2D, hugin_utils::FDiff2D(0.0, 0.0) ) + // shear -image_variable( Shear, hugin_utils::FDiff2D, hugin_utils::FDiff2D(0, 0), NO_CODE ) +image_variable( Shear, hugin_utils::FDiff2D, hugin_utils::FDiff2D(0, 0) ) // crop description -image_variable( CropMode, CropMode, NO_CROP, NO_CODE ) -image_variable( CropRect, vigra::Rect2D, vigra::Rect2D(0, 0, 0, 0), NO_CODE ) -image_variable( AutoCenterCrop, bool, true, NO_CODE ) +image_variable( CropMode, CropMode, NO_CROP ) +image_variable( CropRect, vigra::Rect2D, vigra::Rect2D(0, 0, 0, 0) ) +image_variable( AutoCenterCrop, bool, true ) // vignetting correction -image_variable( VigCorrMode, int, VIGCORR_RADIAL|VIGCORR_DIV, "Vm" ) +image_variable( VigCorrMode, int, VIGCORR_RADIAL|VIGCORR_DIV ) + // coefficients for vignetting correction (even degrees: 0,2,4,6, ...) -image_variable( FlatfieldFilename, std::string, "", "p" ) -image_variable( RadialVigCorrCoeff, std::vector<double>, RadialVigCorrCoeff_default, NO_CODE ) -image_variable( RadialVigCorrCenterShift, hugin_utils::FDiff2D, hugin_utils::FDiff2D(0.0, 0.0), NO_CODE ) +image_variable( FlatfieldFilename, std::string, "" ) +image_variable( RadialVigCorrCoeff, std::vector<double>, RadialVigCorrCoeff_default ) +image_variable( RadialVigCorrCenterShift, hugin_utils::FDiff2D, hugin_utils::FDiff2D(0.0, 0.0) ) // linear pixel transform // (doesn't seem to be used, removing with #if 0) @@ -96,26 +114,26 @@ #endif // store camera information from exif tags... -image_variable( ExifModel, std::string, "", NO_CODE ) -image_variable( ExifMake, std::string, "", NO_CODE ) -image_variable( ExifCropFactor, double, 0, NO_CODE ) -image_variable( ExifFocalLength, double, 0, NO_CODE ) -image_variable( ExifOrientation, double, 0, NO_CODE ) -image_variable( ExifAperture, double, 0, NO_CODE ) -image_variable( ExifISO, double, 0, NO_CODE ) -image_variable( ExifDistance, double, 0, NO_CODE ) +image_variable( ExifModel, std::string, "" ) +image_variable( ExifMake, std::string, "" ) +image_variable( ExifCropFactor, double, 0 ) +image_variable( ExifFocalLength, double, 0 ) +image_variable( ExifOrientation, double, 0 ) +image_variable( ExifAperture, double, 0 ) +image_variable( ExifISO, double, 0 ) +image_variable( ExifDistance, double, 0 ) // // panotools options // // width of feather for stitching. -image_variable( FeatherWidth, unsigned int, 10, NO_CODE ) +image_variable( FeatherWidth, unsigned int, 10 ) // Morph-to-fit using control points. -image_variable( Morph, bool, false, NO_CODE ) +image_variable( Morph, bool, false ) // If the image is selected to be used in the preview and for optimisation. -image_variable( Active, bool, true, NO_CODE ) +image_variable( Active, bool, true ) /// @todo replace everything that uses LensNr. -image_variable( LensNr, unsigned int, 0, NO_CODE ) +image_variable( LensNr, unsigned int, 0 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-06-28 23:11:24
|
Revision: 3973 http://hugin.svn.sourceforge.net/hugin/?rev=3973&view=rev Author: jlegg Date: 2009-06-28 23:11:22 +0000 (Sun, 28 Jun 2009) Log Message: ----------- Detach ImageVariables when copied. Also switch more of the panorama object to using the images list instead of a vector of variables. This fixes editing variables in the GUI and loading pto files. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h hugin/branches/gsoc2009_layout/src/hugin_base/panodata/PanoramaData.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h 2009-06-28 22:30:16 UTC (rev 3972) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h 2009-06-28 23:11:22 UTC (rev 3973) @@ -64,6 +64,13 @@ */ ImageVariable(ImageVariable<Type> * link); + /** Copy constructor + * + * Genrally copied for a getSrcImage call, so make the copy independant from + * the other image variables. + */ + ImageVariable(const ImageVariable &source); + /// destructor ~ImageVariable(); @@ -245,6 +252,15 @@ linkWith(link); } +template <class Type> +ImageVariable<Type>::ImageVariable(const ImageVariable<Type> & source) +{ + // When creating a copy, make independant. + m_data = source.m_data; + m_linkNext = 0; + m_linkPrevious = 0; +} + // Destructor template <class Type> Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-06-28 22:30:16 UTC (rev 3972) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-06-28 23:11:22 UTC (rev 3973) @@ -175,9 +175,14 @@ return result; } -const VariableMapVector & Panorama::getVariables() const +VariableMapVector Panorama::getVariables() const { - return state.variables; + VariableMapVector map; + for (size_t i = 0; i < state.images.size(); i++) + { + map.push_back(state.images[i].getVariableMap()); + } + return map; } const VariableMap Panorama::getImageVariables(unsigned int imgNr) const @@ -256,32 +261,13 @@ { if (imgNr > state.images.size()) return; -// DEBUG_TRACE("image " << imgNr << " variable: " << var.getName()); - //DEBUG_ASSERT(imgNr < state.images.size()); - // update a single variable - // check corrosponding lens if we have to update some other images - // as well. + // update a single variable, and everything linked to it. unsigned int lensNr = state.images[imgNr].getLensNr(); DEBUG_ASSERT(lensNr < state.lenses.size()); // update value for this image -// state.variables[imgNr][var.getName()].setValue(var.getValue()); - const std::string & s = var.getName(); - Variable & tvar = map_get(state.variables[imgNr], s); - tvar.setValue(var.getValue()); - bool lensVar = set_contains(state.lenses[lensNr].variables, var.getName()); - if (lensVar) { - // special handling for lens variables. - // if they are inherited, update the value in the lens, and all - // image variables that use this lens. - LensVariable & lv = map_get(state.lenses[lensNr].variables,var.getName()); - if (lv.isLinked()) { -// DEBUG_DEBUG("updating image variable, lens var is linked"); - lv.setValue(var.getValue()); - updateLensVariable(lensNr,lv); - } - } - imageChanged(imgNr); + state.images[imgNr].setVar(var.getName(), var.getValue()); + imageChanged(imgNr); /// @todo call imageChange on linked images too. state.needsOptimization = true; } @@ -1494,50 +1480,16 @@ DEBUG_ASSERT(imgNr < state.images.size()); state.images[imgNr] = img; - imageChanged(imgNr); + /* Copy the variables. We don't assign directly so we can do the changes to + * any linked variables. + */ + SrcPanoImage *dest = &(state.images[imgNr]); + #define image_variable( name, type, default_value ) \ + dest->set##name (img.get##name()); + #include "image_variables.h" + #undef image_variable - return; - - /// @todo I think this stuff can be removed. - using namespace std; - - // get variable map vector - VariableMap vars = img.getVariableMap(); - - SrcPanoImage & pimg = state.images[imgNr]; - ImageOptions opts = pimg.getOptions(); - Lens & lens = state.lenses[pimg.getLensNr()]; - - // camera response parameters - opts.responseType = img.getResponseType(); - - // set variables - updateVariables(imgNr, vars); - - // update lens - // TODO move lens stuff - lens.setProjection((Lens::LensProjectionFormat)img.getProjection()); - lens.setImageSize(img.getSize()); - if (img.getExifCropFactor()) { - lens.setCropFactor(img.getExifCropFactor()); - } - - // update image - pimg.setFilename(img.getFilename()); - pimg.setSize(img.getSize()); - pimg.setLensNr(img.getLensNr()); - - // update image options - if (img.getCropMode() == SrcPanoImage::NO_CROP) { - opts.docrop = false; - } else { - opts.docrop = true; - } - opts.cropRect = img.getCropRect(); - opts.m_vigCorrMode = img.getVigCorrMode(); - opts.m_flatfield = img.getFlatfieldFilename(); - opts.responseType = img.getResponseType(); - setImageOptions(imgNr, opts); + /// @todo make the linked images change as well. imageChanged(imgNr); } @@ -2239,11 +2191,11 @@ } } - // create image and lens. + // create images. for (int i=0; i < nImgs; i++) { DEBUG_DEBUG("i line: " << i); - // read the variables & decide if to create a new lens or not + // read the variables VariableMap vars; int link = -2; fillVariableMap(vars); @@ -2377,6 +2329,11 @@ new_img.setResponseType((SrcPanoImage::ResponseType)iImgInfo[i].responseType); new_img.setAutoCenterCrop(iImgInfo[i].autoCenterCrop); new_img.setActive(iImgInfo[i].enabled); + // set all the variables in the new image from the variable map. + for (VariableMap::iterator var_it = vars.begin(); var_it != vars.end(); var_it++) + { + new_img.setVar((*var_it).first, (*var_it).second.getValue()); + } images.push_back(new_img); } Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-06-28 22:30:16 UTC (rev 3972) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-06-28 23:11:22 UTC (rev 3973) @@ -401,7 +401,7 @@ // = Variables = /// get variables of this panorama - const VariableMapVector & getVariables() const; + VariableMapVector getVariables() const; /** Get the variables of an image * Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/PanoramaData.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/PanoramaData.h 2009-06-28 22:30:16 UTC (rev 3972) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/PanoramaData.h 2009-06-28 23:11:22 UTC (rev 3973) @@ -296,7 +296,7 @@ * code using them. Instead, use getSrcImage. */ /// get variables of this panorama - virtual const VariableMapVector & getVariables() const =0; + virtual VariableMapVector getVariables() const =0; /** get variables of an image * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-06-29 01:18:19
|
Revision: 3974 http://hugin.svn.sourceforge.net/hugin/?rev=3974&view=rev Author: jlegg Date: 2009-06-29 01:17:12 +0000 (Mon, 29 Jun 2009) Log Message: ----------- Remove PanoramaMememto::variables completely. All variables are now generated when needed by SrcPanoImg::getVariableMap(). (This is fairly inefficent, getVariableMap processes most variables every time it is called. Eventually the rest of Hugin will be rewritten to get image variables through Panorama::getSrcImage or ::getImage instead, which will be faster.) Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-06-28 23:11:22 UTC (rev 3973) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-06-29 01:17:12 UTC (rev 3974) @@ -86,7 +86,6 @@ // TODO move lenses stuff state.lenses.clear(); state.images.clear(); - state.variables.clear(); state.options.reset(); state.optvec.clear(); state.needsOptimization = false; @@ -285,7 +284,7 @@ DEBUG_ASSERT(ok); unsigned int nr = state.images.size(); state.images.push_back(img); - state.variables.push_back(vars); + updateVariables(nr, vars); copyLensVariablesToImage(nr); // create empty optimisation vector state.optvec.push_back(std::set<std::string>()); @@ -293,69 +292,6 @@ return nr; } -#if 0 -unsigned int Panorama::addImage(const std::string & filename) -{ - // create a lens if we don't have one. - if (state.lenses.size() < 1) { - state.lenses.push_back(Lens()); - } - - - // read lens spec from image, if possible - // FIXME use a lens database (for example the one from PTLens) - // FIXME to initialize a,b,c etc. - - - // searches for the new image for an unused lens , if found takes this - // if no free lens is available creates a new one - int unsigned lensNr (0); - bool lens_belongs_to_image = false; - int unused_lens = -1; - while ( unused_lens < 0 ) { - lens_belongs_to_image = false; - for (ImageVector::iterator it = state.images.begin(); - it != state.images.end() ; ++it) { - if ((*it).getLens() == lensNr) - lens_belongs_to_image = true; - } - if ( lens_belongs_to_image == false ) - unused_lens = lensNr; - else - lensNr++; - } - bool lens_allready_inside = false; - for ( lensNr = 0 ; lensNr < state.lenses.size(); ++lensNr) { - if ( (int)lensNr == unused_lens ) - lens_allready_inside = true; - } -// DEBUG_INFO ( "lens_allready_inside= "<< lens_allready_inside <<" new lensNr: " << unused_lens <<"/"<< state.lenses.size() ) - Lens l; - if ( lens_allready_inside ) - l = state.lenses[unused_lens]; - l.readEXIF(filename); - if ( lens_allready_inside ) { - state.lenses[unused_lens] = l; - } else { - state.lenses.push_back(l); - unused_lens = state.lenses.size() - 1; - } - - unsigned int nr = state.images.size(); - state.images.push_back(PanoImage(filename)); - ImageOptions opts = state.images.back().getOptions(); - opts.lensNr = unused_lens; - state.images.back().setOptions(opts); - state.variables.push_back(ImageVariables()); - updateLens(nr); - adjustVarLinks(); - imageChanged(nr); - DEBUG_INFO ( "new lensNr: " << unused_lens <<"/"<< state.lenses.size() ) - return nr; -} - -#endif - void Panorama::removeImage(unsigned int imgNr) { DEBUG_DEBUG("Panorama::removeImage(" << imgNr << ")"); @@ -399,7 +335,7 @@ DEBUG_TRACE("Remove variables and image from panorama state") - state.variables.erase(state.variables.begin() + imgNr); + /// @todo move linked variable references in SrcPanoImg. state.images.erase(state.images.begin() + imgNr); state.optvec.erase(state.optvec.begin() + imgNr); @@ -578,7 +514,7 @@ const SrcPanoImage img = state.images[imgNr]; unsigned int lensNr = img.getLensNr(); Lens lens = state.lenses[lensNr]; - const VariableMap & vars = state.variables[imgNr]; + const VariableMap & vars = state.images[imgNr].getVariableMap(); /// @TODO don't use getOptions. ImageOptions iopts = img.getOptions(); @@ -833,7 +769,7 @@ unsigned int lensNr = img.getLensNr(); // DGSW FIXME - Unreferenced // const Lens & lens = state.lenses[lensNr]; - const VariableMap & vars = state.variables[imgNr]; + const VariableMap & vars = state.images[imgNr].getVariableMap(); o << "o w" << img.getSize().width() << " h" << img.getSize().height() <<" f" << state.lenses[lensNr].getProjection() << " "; @@ -1073,7 +1009,8 @@ // FIXME check for if really changed? imageChanged(i); if (var.isLinked()) { - map_get(state.variables[i], var.getName()).setValue(var.getValue()); + VariableMap variable_map = state.images[i].getVariableMap(); + map_get(variable_map, var.getName()).setValue(var.getValue()); } // check if the crop area should be automatically centered if ( var.getName() == "d" ) { @@ -1135,11 +1072,7 @@ state.images[img1] = state.images[img2]; state.images[img2] = pimg1; - // swap variables - /// @TODO swap variable links instead. - VariableMap vars1 = state.variables[img1]; - state.variables[img1] = state.variables[img2]; - state.variables[img2] = vars1; + /// @todo swap variable links. // update control points for (CPVector::iterator it=state.ctrlPoints.begin(); it != state.ctrlPoints.end(); ++it) { @@ -1386,7 +1319,8 @@ it != lens.variables.end();++it) { if (it->second.isLinked()) { - map_get(state.variables[imgNr], it->first).setValue(it->second.getValue()); + VariableMap variable_map = state.images[imgNr].getVariableMap(); + map_get(variable_map, it->first).setValue(it->second.getValue()); } DEBUG_DEBUG("updating " << it->second.getName() << " (key: " << it->first << ") for image: " << imgNr); } @@ -1512,15 +1446,16 @@ // copy images variables and lenses.. subset.state.images.clear(); - subset.state.variables.clear(); subset.state.optvec.clear(); unsigned int ic = 0; for (UIntSet::const_iterator imgNrIt = imgs.begin(); imgNrIt != imgs.end(); ++imgNrIt) { + /** @todo setup variable links across the subset. These are lost when + * the image is copied. + */ subset.state.images.push_back(state.images[*imgNrIt]); - subset.state.variables.push_back(state.variables[*imgNrIt]); subset.state.optvec.push_back(state.optvec[*imgNrIt]); imageNrMap[*imgNrIt] = ic; ic++; @@ -2279,7 +2214,6 @@ it->second.setValue(val); } } - variables.push_back(vars); DEBUG_DEBUG("lensNr after scanning " << lensNr); //l.projectionFormat = (Lens::LensProjectionFormat) iImgInfo[i].f; Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-06-28 23:11:22 UTC (rev 3973) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-06-29 01:17:12 UTC (rev 3974) @@ -86,12 +86,9 @@ */ ImageVector images; - // TODO remove this, and change all users of it to use images instead. - VariableMapVector variables; - CPVector ctrlPoints; - // TODO move the lenses stuff as well. + // TODO move the lenses stuff. LensVector lenses; PanoramaOptions options; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-07-07 01:46:50
|
Revision: 3998 http://hugin.svn.sourceforge.net/hugin/?rev=3998&view=rev Author: jlegg Date: 2009-07-07 01:46:47 +0000 (Tue, 07 Jul 2009) Log Message: ----------- Completed ImageVariableGroup implementation. I think certain functions of it should be wrapped in a PanoCommand derivative for undo and redo to work though, so it isn't ready for the user interface just yet. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableGroup.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableGroup.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableGroup.cpp 2009-07-06 22:34:11 UTC (rev 3997) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableGroup.cpp 2009-07-07 01:46:47 UTC (rev 3998) @@ -53,12 +53,21 @@ void ImageVariableGroup::unlinkVariablePart(ImageVariableEnum variable, unsigned int partNr) { + // find all images in the requested part. for (unsigned int i = 0; i < m_image_part_numbers.size(); i++) { if (m_image_part_numbers[i] == partNr) { - /// @todo unlink variable. - + // unlink the variable + switch (variable) + { +#define image_variable( name, type, default_value )\ + case name:\ + m_pano.unlinkImageVariable##name(i);\ + break; +#include "image_variables.h" +#undef image_variable + } } } setPartNumbers(); @@ -73,12 +82,30 @@ void ImageVariableGroup::linkVariablePart(ImageVariableEnum variable, unsigned int partNr) { + // find all images in the requested part. + bool found_first_image = false; + int first_image_number; for (unsigned int i = 0; i < m_image_part_numbers.size(); i++) { if (m_image_part_numbers[i] == partNr) { - /// @todo link variable. - + // make a note of the first image. + if (!found_first_image) + { + first_image_number = i; + found_first_image = true; + continue; + } + // for the other images, link the variable to the first image. + switch (variable) + { +#define image_variable( name, type, default_value )\ + case name:\ + m_pano.linkImageVariable##name(first_image_number, i);\ + break; +#include "image_variables.h" +#undef image_variable + } } } setPartNumbers(); @@ -90,7 +117,7 @@ linkVariablePart(variable, m_image_part_numbers[imageNr]); } -void ImageVariableGroup::switchParts (unsigned int ImageNr, unsigned int partNr) +void ImageVariableGroup::switchParts (unsigned int imageNr, unsigned int partNr) { if (partNr > m_num_parts) { @@ -98,8 +125,8 @@ return; } // find an image in this part. - unsigned int image_index; - for (image_index = 0; m_image_part_numbers[i] != partNr; image_index++); + unsigned int part_image_index; + for (part_image_index = 0; m_image_part_numbers[i] != partNr; part_image_index++); // Decide which variables to link. // Find which variables are linked in the other image. @@ -110,7 +137,7 @@ { #define image_variable( name, type, default_value ) \ case IVE_##name: \ - if(pano.getImage(image_index).is##nameLinked)\ + if(m_pano.getImage(part_image_index).is##nameLinked)\ {\ linked_variables.add(IVE_##name);\ }\ @@ -125,8 +152,34 @@ linked_variables = m_variables; } - /// @todo link the variables + // unlink the image from the part it originally was part off. + for(std::set<ImageVariableEnum>::iterator i = m_variables.begin(); i != m_variables.end(); i++) + { + switch (*i) + { +#define image_variable( name, type, default_value ) \ + case IVE_##name: \ + m_pano.unlinkImageVariable##name()\ + break; +#include "image_variables.h" +#undef image_variable + } + } + // link the variables + for(std::set<ImageVariableEnum>::iterator i = linked_variables.begin(); i != linked_variables.end(); i++) + { + switch (*i) + { +#define image_variable( name, type, default_value ) \ + case IVE_##name: \ + m_pano.linkImageVariable##name(part_image_index, ImageNr)\ + break; +#include "image_variables.h" +#undef image_variable + } + } + // update the mapping of image numbers to part numbers. setPartNumbers(); } @@ -141,11 +194,62 @@ m_observers.remove(observer); } +virtual void ImageVariableGroup::panoramaImagesChanged(PanoramaData& pano, + const UIntSet& changed) +{ + // The images have changed. The part numbers may be different. + setPartNumbers(); +} void ImageVariableGroup::setPartNumbers() { - /// @todo find links. + // Find links. + m_image_part_numbers.clear(); + /* We will keep a list of parts, containing the image number of the first + * image that uses that part. When we want to find if another image is in + * a part, we can then check if it is linked to any images in the list. + */ + std::vector<std::size_t> parts_first_image; + // image 0 always has part 0 + parts_first_image.add(0); + for (std::size_t i = 1; i < m_pano.getNrOfImages(); i++) + { + // find a part for this image. + for (std::size_t j = 0; j < parts_first_image.size(); j++) + { + /* we use parts_first_image.size() as a flag to determine when the + * images is not linked to any part we have previously found, as it + * is will be the part number when we are done.. */ + std::size_t part_number = parts_first_image.size(); + // check each variable in the group + for (std::vector<ImageVariableEnum>::iterator k = m_variables.begin(); + k != m_variables.end; k++) + { + switch (*k) + { + /** @todo Check for multiple parts. If there is some complex + * set of links, we may need to merge two parts together. + */ +#define image_variable( name, type, default_value ) \ + case IVE_##name:\ + if (m_pano.getImage(i).name##isLinkedWith(&(m_pano.getImage(parts_first_image[j]))) \ + part_number = j\ + break; +#include "image_variables.h" +#undef image_variable + } + } + // We should have a suitable part number for now. + m_image_part_numbers.push_back(part_number); + // If this is a new part, keep this image number to check links. + if (part_number == parts_first_image.size()) + { + parts_first_image.push_back(i); + } + } + } + // notify observers. std::set<*ImageVariableGroupObserver>::iterator it; for (it = m_observers.begin(); it != m_observers.end(); it++) Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-06 22:34:11 UTC (rev 3997) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-07 01:46:47 UTC (rev 3998) @@ -264,6 +264,33 @@ state.needsOptimization = true; } +// What counts as changed in terms of the image variable links? +// Should I call imageChanged on every image linked to sourceImg and destImg? +// destImg's variable will change value to sourceImg's, so the images linked to +// destImg should be linked. +/// @todo call imageChanged on those images changed by the linking. +#define image_variable( name, type, default_value )\ +void linkImageVariable##name(unsigned int sourceImgNr, unsigned int destImgNr)\ +{\ + state.images[destImgNr].link##name(&(state.images[sourceImgNr]))\ + state.imageChanged(destImgNr);\ + state.imageChanged(sourceImgNr); + state.needsOptimization = true;\ +} +#include "image_variables.h" +#undef image_variable + +/// @todo call imageChanged on those images changed by the unlinking. +#define image_variable( name, type, default_value )\ +void unlinkImageVariable##name(unsigned int imgNr)\ +{\ + state.images[imgNr].unlink##name()\ + state.imageChanged(imgNr);\ + state.needsOptimization = true;\ +} +#include "image_variables.h" +#undef image_variable + void Panorama::setOptimizeVector(const OptimizeVector & optvec) { DEBUG_ASSERT(optvec.size() == state.images.size()); Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-06 22:34:11 UTC (rev 3997) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-07 01:46:47 UTC (rev 3998) @@ -235,10 +235,22 @@ */ void swapImages(unsigned int img1, unsigned int img2); - /// get a complete description of a source image + /** get a description of a source image + * + * Notice the SrcPanoImage is a copy. This removes all references to the + * other images, which means you should use getImage instead if you + * would like to find out about the variable links. + * + * @warning Variable links cannot be accessed this way. + */ SrcPanoImage getSrcImage(unsigned imgNr) const; - /** set input image parameters */ + /** set input image parameters + * + * This sets the values of the image variables, but does not change the + * links. + * @warning Variable links cannot be set this way. + */ void setSrcImage(unsigned int nr, const SrcPanoImage & img); /** set a new image filename @@ -368,7 +380,23 @@ * variable is linked */ virtual void updateVariable(unsigned int imgNr, const Variable &var); + + /* Link image variable functions. Used to group image variables which + * should share the same value. The initial value is the one kept by + * the image with number sourceImgNr. + */ +#define image_variable( name, type, default_value ) \ + virtual void linkImageVariable##name(unsigned int sourceImgNr, unsigned int destImgNr); +#include "image_variables.h" +#undef image_variable + /* Unlink image variable functions. Makes a image variable independant + * of the other images. + */ +#define image_variable( name, type, default_value ) \ + virtual void unlinkImageVariable##name(); +#include "image_variables.h" +#undef image_variable // = Optimise Vector = Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-07-06 22:34:11 UTC (rev 3997) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-07-07 01:46:47 UTC (rev 3998) @@ -273,6 +273,25 @@ { m_##name.removeLinks(); } #include "image_variables.h" #undef image_variable + + /* The [variable name]isLinked functions + * Returns true if the variable has links, or false if it is independant. + */ +#define image_variable( name, type, default_value ) \ + bool name##isLinked () const \ + { return m_##name.isLinked(); } +#include "image_variables.h" +#undef image_variable + + /* The [variable name]isLinkedWith functions + * Returns true if the variable is linked with the equivalent variable in + * the specified image, flase otherwise. + */ +#define image_variable( name, type, default_value ) \ + bool name##isLinkedWith (SrcPanoImage & image) const \ + { return m_##name.isLinkedWith(&(image.m_##name)); } +#include "image_variables.h" +#undef image_variable /** try to fill out information about the image, by examining the exif data * focalLength and cropFactor will be updated with the ones read from the exif data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-07-10 17:49:33
|
Revision: 4023 http://hugin.svn.sourceforge.net/hugin/?rev=4023&view=rev Author: jlegg Date: 2009-07-10 17:49:27 +0000 (Fri, 10 Jul 2009) Log Message: ----------- Make the function Panorama::printPanoramaScript work without directly using lenses. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-10 15:05:32 UTC (rev 4022) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-10 17:49:27 UTC (rev 4023) @@ -26,6 +26,7 @@ #include "Panorama.h" #include "PTScriptParsing.h" +#include "ImageVariableTranslate.h" #include <fstream> #include <typeinfo> @@ -500,14 +501,17 @@ std::map<unsigned int, unsigned int> imageNrMap; o << std::endl << "# image lines" << std::endl; + + // somewhere to store the v lines, which give the variables to be optimised. + std::stringstream vlines; unsigned int ic = 0; for (UIntSet::const_iterator imgNrIt = imgs.begin(); imgNrIt != imgs.end(); ++imgNrIt) { unsigned int imgNr = *imgNrIt; imageNrMap[imgNr] = ic; - const SrcPanoImage img = state.images[imgNr]; - const VariableMap & vars = state.images[imgNr].getVariableMap(); + const SrcPanoImage & img = state.images[imgNr]; + VariableMap vars; /// @TODO don't use getOptions. ImageOptions iopts = img.getOptions(); @@ -528,56 +532,68 @@ <<" f" << img.getProjection() << " "; // print variables with links - for (VariableMap::const_iterator vit = vars.begin(); - vit != vars.end(); ++vit) - { - bool ptoptvar = set_contains(m_ptoptimizerVarNames,vit->first); - if (!ptoptvar && forPTOptimizer) { - continue; - } - bool printed=false; - // print links if needed - if (set_contains(lens.variables,vit->first) - && map_get(lens.variables, vit->first).isLinked()) - { - if (set_contains(linkAnchors, lensNr) - && linkAnchors[lensNr] != imageNrMap[imgNr]) - { - // print link -// DEBUG_DEBUG("printing link: " << vit->first); - // print link, anchor variable was already printed - map_get(lens.variables,vit->first).printLink(o,linkAnchors[lensNr]) << " "; - printed=true; - } else { -// DEBUG_DEBUG("printing value for linked var " << vit->first); - // first time, print value - linkAnchors[lensNr] = imageNrMap[imgNr]; - } - } - if (!printed) { - if (( (vit->first == "a" && set_contains(optvars[imgNr], "a") )|| - (vit->first == "b" && set_contains(optvars[imgNr], "b") )|| - (vit->first == "c" && set_contains(optvars[imgNr], "c") ) - ) - && forPTOptimizer && vit->second.getValue() == 0.0) - { - // work around a bug in PTOptimizer, a,b,c values will only be optmized - // if they not zero - o << vit->first << 1e-5 << " "; - } else if (( (vit->first == "r" && set_contains(optvars[imgNr], "r") ) || - (vit->first == "p" && set_contains(optvars[imgNr], "p") ) || - (vit->first == "r" && set_contains(optvars[imgNr], "r") ) - ) - && forPTOptimizer && fabs(vit->second.getValue()) < 1e-13) - { - // work around a bug in PTOptimizer, r,p,y values will only be optmized - // if they are not a very small number close to zero (zero itself is fine) - o << vit->first << 0 << " "; - } else { - vit->second.print(o) << " "; - } - } - } +/* Individually do all the variables specified by each SrcPanoImg variable. + * Clear the list after each SrcPanoImg variable. + * If there is any links to previous images, write that in the script. + * If there are no links to previous images, write the value instead. + * Each variable in SrcPanoImg may produce any number of variables in the map, + * but the linking properties are shared. + * Additionally, when we are writing variables by value which are set to be + * optimised, we should remember them so we can write them later as 'v' lines. + */ +#define image_variable( name, type, default_value )\ + PTOVariableConverterFor##name::addToVariableMap(state.images[imgNr].get##name##IV(), vars);\ + if (!vars.empty())\ + {\ + bool linking = false;\ + std::size_t link_target;\ + if (state.images[imgNr].name##isLinked())\ + {\ + for (link_target = 0; link_target < imgNr; link_target++)\ + {\ + if (state.images[imgNr].name##isLinkedWith(state.images[link_target]))\ + {\ + linking = true;\ + break;\ + }\ + }\ + }\ + for (VariableMap::const_iterator vit = vars.begin();\ + vit != vars.end(); ++vit)\ + {\ + if (forPTOptimizer && !set_contains(m_ptoptimizerVarNames,vit->first))\ + continue;\ + else if (linking)\ + {\ + o << vit->first << "=" << link_target << " ";\ + } else {\ + if (set_contains(optvars[imgNr], vit->first))\ + {\ + vlines << "v " << vit->first << imageNrMap[imgNr] << std::endl;\ + }\ + if (((vit->first == "a" && set_contains(optvars[imgNr], "a") )|| \ + (vit->first == "b" && set_contains(optvars[imgNr], "b") )|| \ + (vit->first == "c" && set_contains(optvars[imgNr], "c") )\ + )\ + && forPTOptimizer && vit->second.getValue() == 0.0) \ + {\ + o << vit->first << 1e-5 << " ";\ + } else if (( (vit->first == "r" && set_contains(optvars[imgNr], "r") ) || \ + (vit->first == "p" && set_contains(optvars[imgNr], "p") ) || \ + (vit->first == "y" && set_contains(optvars[imgNr], "y") ) \ + )\ + && forPTOptimizer && fabs(vit->second.getValue()) < 1e-13)\ + {\ + o << vit->first << 0 << " ";\ + } else {\ + vit->second.print(o) << " ";\ + }\ + }\ + }\ + }\ + vars.clear(); +#include "image_variables.h" +#undef image_variable if (iopts.docrop) { // print crop parameters @@ -620,30 +636,8 @@ o << std::endl << std::endl << "# specify variables that should be optimized" << std::endl - << "v "; - - int optVarCounter=0; - // be careful. linked variables should not be specified multiple times. - std::vector<std::set<std::string> > linkvars(state.lenses.size()); - - for (UIntSet::const_iterator imgNrIt = imgs.begin(); imgNrIt != imgs.end(); - ++imgNrIt) - { - unsigned int i = *imgNrIt; - const set<string> & optvar = optvars[i]; - for (set<string>::const_iterator sit = optvar.begin(); - sit != optvar.end(); ++sit ) - { - o << *sit << imageNrMap[i] << " "; - optVarCounter++; - } - } - // insert line break after 10 variables - if (optVarCounter > 0) { - o << std::endl << "v "; - optVarCounter = 0; - } - } + << vlines; + o << std::endl << std::endl << "# control points" << std::endl; for (CPVector::const_iterator it = state.ctrlPoints.begin(); it != state.ctrlPoints.end(); ++it) { @@ -739,13 +733,12 @@ for (UIntSet::const_iterator imgNrIt = imgs.begin(); imgNrIt != imgs.end(); ++imgNrIt) { unsigned int imgNr = *imgNrIt; const SrcPanoImage & img = state.images[imgNr]; - unsigned int lensNr = img.getLensNr(); // DGSW FIXME - Unreferenced // const Lens & lens = state.lenses[lensNr]; const VariableMap & vars = state.images[imgNr].getVariableMap(); o << "o w" << img.getSize().width() << " h" << img.getSize().height() - <<" f" << state.lenses[lensNr].getProjection() << " "; + <<" f" << img.getProjection() << " "; // print variables, without links VariableMap::const_iterator vit; for(vit = vars.begin(); vit != vars.end(); ++vit) @@ -1101,81 +1094,6 @@ { DEBUG_ASSERT(imgNr < state.images.size()); return state.images[imgNr]; - /// @TODO I think this stuff can be removed. - const SrcPanoImage & img = state.images[imgNr]; - const ImageOptions & opts = img.getOptions(); - const VariableMap & vars = getImageVariables(imgNr); - SrcPanoImage ret; - ret.setFilename(img.getFilename()); - ret.setSize(img.getSize()); - ret.setProjection((SrcPanoImage::Projection) lens.getProjection()); - ret.setExifCropFactor(lens.getCropFactor()); -// ret.setExifFocalLength(lens.getFocalLength()); - ret.setHFOV(const_map_get(vars,"v").getValue()); - ret.setRoll(const_map_get(vars,"r").getValue()); - ret.setPitch(const_map_get(vars,"p").getValue()); - ret.setYaw(const_map_get(vars,"y").getValue()); - - // geometrical distortion correction - std::vector<double> radialDist(4); - radialDist[0] = const_map_get(vars,"a").getValue(); - radialDist[1] = const_map_get(vars,"b").getValue(); - radialDist[2] = const_map_get(vars,"c").getValue(); - radialDist[3] = 1 - radialDist[0] - radialDist[1] - radialDist[2]; - ret.setRadialDistortion(radialDist); - FDiff2D t; - t.x = const_map_get(vars,"d").getValue(); - t.y = const_map_get(vars,"e").getValue(); - ret.setRadialDistortionCenterShift(t); - t.x = const_map_get(vars,"g").getValue(); - t.y = const_map_get(vars,"t").getValue(); - ret.setShear(t); - - // vignetting - ret.setVigCorrMode(opts.m_vigCorrMode); - ret.setFlatfieldFilename(opts.m_flatfield); - std::vector<double> vigCorrCoeff(4); - vigCorrCoeff[0] = const_map_get(vars,"Va").getValue(); - vigCorrCoeff[1] = const_map_get(vars,"Vb").getValue(); - vigCorrCoeff[2] = const_map_get(vars,"Vc").getValue(); - vigCorrCoeff[3] = const_map_get(vars,"Vd").getValue(); - ret.setRadialVigCorrCoeff(vigCorrCoeff); - t.x = const_map_get(vars,"Vx").getValue(); - t.y = const_map_get(vars,"Vy").getValue(); - ret.setRadialVigCorrCenterShift(t); - - // exposure and white balance parameters - ret.setExposureValue(const_map_get(vars,"Eev").getValue()); - ret.setWhiteBalanceRed(const_map_get(vars,"Er").getValue()); - ret.setWhiteBalanceBlue(const_map_get(vars,"Eb").getValue()); - - // camera response parameters - DEBUG_DEBUG("opts.resp: " << ((SrcPanoImage::ResponseType)opts.responseType)); - ret.setResponseType((SrcPanoImage::ResponseType) opts.responseType); - DEBUG_DEBUG("ret.resp (after set): " << ret.getResponseType()); - - std::vector<float> ep(5); - ep[0] = const_map_get(vars,"Ra").getValue(); - ep[1] = const_map_get(vars,"Rb").getValue(); - ep[2] = const_map_get(vars,"Rc").getValue(); - ep[3] = const_map_get(vars,"Rd").getValue(); - ep[4] = const_map_get(vars,"Re").getValue(); - ret.setEMoRParams(ep); - - // crop - if (!opts.docrop) { - ret.setCropMode(SrcPanoImage::NO_CROP); - } else if (ret.getProjection() == SrcPanoImage::CIRCULAR_FISHEYE) { - ret.setCropMode(SrcPanoImage::CROP_CIRCLE); - ret.setCropRect(opts.cropRect); - } else { - ret.setCropMode(SrcPanoImage::CROP_RECTANGLE); - ret.setCropRect(opts.cropRect); - } - - ret.setGamma(state.options.gamma); - - return ret; } void Panorama::setSrcImage(unsigned int imgNr, const SrcPanoImage & img) @@ -1347,8 +1265,10 @@ ptoVersion = 1; bool firstOptVecParse = true; + unsigned int lineNr = 0; while (i.good()) { std::getline(i, line); + lineNr++; DEBUG_DEBUG(lineNr << ": " << line); if (skipNextLine) { skipNextLine = false; Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-10 15:05:32 UTC (rev 4022) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-10 17:49:27 UTC (rev 4023) @@ -399,13 +399,17 @@ #undef image_variable // = Optimise Vector = - /** return the optimize settings stored inside panorama */ const OptimizeVector & getOptimizeVector() const { return state.optvec; }; /** set optimize setting */ void setOptimizeVector(const OptimizeVector & optvec); + + /** @note Is this the most appropriate way to remember which variables + * need optimisation? Can we have optimisation information in + * ImageVariables instead now? + */ // = Panorama options = Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-07-10 15:05:32 UTC (rev 4022) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-07-10 17:49:27 UTC (rev 4023) @@ -107,12 +107,18 @@ // property accessors public: - // get[variable name] functions + // get[variable name] functions. Return the value stored in the ImageVariable. #define image_variable( name, type, default_value ) \ type get##name() const { return m_##name.getData(); } #include "image_variables.h" #undef image_variable + // get[variable name]IV functions. Return a const reference to the ImageVariable. +#define image_variable( name, type, default_value ) \ + const ImageVariable<type> & get##name##IV() const { return m_##name; } +#include "image_variables.h" +#undef image_variable + // set[variable name] functions #define image_variable( name, type, default_value ) \ void set##name(type data) { m_##name.setData(data); } @@ -285,10 +291,10 @@ /* The [variable name]isLinkedWith functions * Returns true if the variable is linked with the equivalent variable in - * the specified image, flase otherwise. + * the specified image, false otherwise. */ #define image_variable( name, type, default_value ) \ - bool name##isLinkedWith (SrcPanoImage & image) const \ + bool name##isLinkedWith (const SrcPanoImage & image) const \ { return m_##name.isLinkedWith(&(image.m_##name)); } #include "image_variables.h" #undef image_variable This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-07-21 17:59:00
|
Revision: 4078 http://hugin.svn.sourceforge.net/hugin/?rev=4078&view=rev Author: jlegg Date: 2009-07-21 17:58:45 +0000 (Tue, 21 Jul 2009) Log Message: ----------- Fix changing lens numbers. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableGroup.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/StandardImageVariableGroups.cpp Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableGroup.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableGroup.cpp 2009-07-21 16:19:33 UTC (rev 4077) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariableGroup.cpp 2009-07-21 17:58:45 UTC (rev 4078) @@ -269,7 +269,7 @@ part_number = parts_first_image.size(); // check each variable in the group for (std::set<ImageVariableEnum>::const_iterator k = m_variables.begin(); - (k != m_variables.end()) || (part_number == j); k++) + (k != m_variables.end()) && (part_number != j); k++) { switch (*k) { Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/StandardImageVariableGroups.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/StandardImageVariableGroups.cpp 2009-07-21 16:19:33 UTC (rev 4077) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/StandardImageVariableGroups.cpp 2009-07-21 17:58:45 UTC (rev 4078) @@ -85,12 +85,14 @@ std::size_t number_of_images = m_pano.getNrOfImages(); for (image_number = 0; image_number < number_of_images; image_number++) { - if (m_lenses.getPartNumber(image_number)) + if (m_lenses.getPartNumber(image_number) == lens_number) { - break; + return getLensForImage(image_number); } } - return getLensForImage(image_number); + DEBUG_ERROR("Cannot find an image with requested lens number."); + DEBUG_ASSERT(false); + return getLensForImage(0); } Lens ConstStandardImageVariableGroups::getLensForImage(std::size_t image_number) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-07-24 02:04:05
|
Revision: 4093 http://hugin.svn.sourceforge.net/hugin/?rev=4093&view=rev Author: jlegg Date: 2009-07-24 02:03:58 +0000 (Fri, 24 Jul 2009) Log Message: ----------- Copy constructor and assignment operator for PanoramaMemento that takes care of the image links. Fixes undo. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-23 15:21:59 UTC (rev 4092) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-24 02:03:58 UTC (rev 4093) @@ -1241,6 +1241,63 @@ + +PanoramaMemento::PanoramaMemento(const PanoramaMemento & data) +{ + // Use the assignment operator to get the work done: see the next function. + *this = data; +} + +PanoramaMemento & PanoramaMemento::operator=(const PanoramaMemento & data) +{ + // Copy the PanoramaMemento. + + // Don't do anything in the case of self assignment. This is important as we + // are about to delete the image information. + if (&data == this) + { + return *this; + } + + // We should clear the images to make sure old links don't stay around. + images.clear(); + images = data.images; + // Copies of SrcPanoImage's variables aren't linked, so we have to create + // new links in the same pattern. + /** @todo This is quite inefficent, maybe we should store the links as a + * vector of sets of image numbers for each variable to speed up this? + * Links / unlinks should all go through the Panorama object, so we + * could keep track of them easily. + */ + std::size_t num_imgs = images.size(); + for (std::size_t i = 0; i < num_imgs; i++) + { + // copy this image's links. + // links to lower numbered images will have already been spotted, since + // they are bi-directional. + for (std::size_t j = i + 1; j < num_imgs; j++) + { +#define image_variable( name, type, default_value )\ + if (data.images[i].name##isLinkedWith(data.images[j]))\ + {\ + images[i].link##name(&images[j]);\ + } +#include "image_variables.h" +#undef image_variable + } + } + + ctrlPoints = data.ctrlPoints; + + options = data.options; + + optvec = data.optvec; + + needsOptimization = data.needsOptimization; + + return *this; +} + bool PanoramaMemento::loadPTScript(std::istream &i, int & ptoVersion, const std::string &prefix) { using namespace std; Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-23 15:21:59 UTC (rev 4092) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-24 02:03:58 UTC (rev 4093) @@ -51,10 +51,10 @@ {}; /// copy ctor. - // PanoramaMemento(const PanoramaMemento & o); + PanoramaMemento(const PanoramaMemento & o); /// assignment operator - // PanoramaMemento& operator=(const PanoramaMemento & o); + PanoramaMemento& operator=(const PanoramaMemento & o); virtual ~PanoramaMemento() {}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-07-26 13:23:29
|
Revision: 4102 http://hugin.svn.sourceforge.net/hugin/?rev=4102&view=rev Author: jlegg Date: 2009-07-26 13:23:20 +0000 (Sun, 26 Jul 2009) Log Message: ----------- Remove the lenses LensVector from PanoramaMemento. I've blocked out the remaining code that uses it, as it adds lenses which are never used, but I think it might have meant to do something important... Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-26 05:25:25 UTC (rev 4101) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-26 13:23:20 UTC (rev 4102) @@ -1783,8 +1783,11 @@ } // case } - // assemble images & lenses from the information read before.. + // assemble images from the information read before.. +/** @todo What is the PTGUI special case? What images use the lens created here? + */ +#if 0 // handle PTGUI special case if (PTGUILensLoaded) { // create lens with dummy info @@ -1797,6 +1800,7 @@ l.setProjection((Lens::LensProjectionFormat) PTGUILens.f); lenses.push_back(l); } +#endif /* // ugly hack to load PTGui script files @@ -1954,7 +1958,8 @@ * of shearing to a different target to the vertical component, not link the * vertical component at all). SrcPanoImage cannot handle this, so we end up * linking all components of the same variable to anything specified in the PTO - * script for one of the components. + * script for one of the components: most often we specify the same link + * multiple times. */ /** @todo Warn the user when the script links variables in a way not expressable * by SrcPanoImage. Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-26 05:25:25 UTC (rev 4101) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-26 13:23:20 UTC (rev 4102) @@ -88,8 +88,6 @@ CPVector ctrlPoints; - // TODO move the lenses stuff. - LensVector lenses; PanoramaOptions options; OptimizeVector optvec; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-07-29 15:14:41
|
Revision: 4123 http://hugin.svn.sourceforge.net/hugin/?rev=4123&view=rev Author: jlegg Date: 2009-07-29 15:14:28 +0000 (Wed, 29 Jul 2009) Log Message: ----------- Make PanoramaMemento use a vector of pointers to SrcPanoImage instead of a vector of SrcPanoImages. This means swapping and removing images can now occur without patching variable links. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-29 14:59:08 UTC (rev 4122) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.cpp 2009-07-29 15:14:28 UTC (rev 4123) @@ -84,7 +84,7 @@ // imageChanged(0); // delete all images and control points. state.ctrlPoints.clear(); - state.images.clear(); + state.deleteAllImages(); state.options.reset(); state.optvec.clear(); state.needsOptimization = false; @@ -178,7 +178,7 @@ VariableMapVector map; for (size_t i = 0; i < state.images.size(); i++) { - map.push_back(state.images[i].getVariableMap()); + map.push_back(state.images[i]->getVariableMap()); } return map; } @@ -186,7 +186,7 @@ const VariableMap Panorama::getImageVariables(unsigned int imgNr) const { assert(imgNr < state.images.size()); - return state.images[imgNr].getVariableMap(); + return state.images[imgNr]->getVariableMap(); } @@ -260,14 +260,14 @@ if (imgNr > state.images.size()) return; // update a single variable, and everything linked to it. - state.images[imgNr].setVar(var.getName(), var.getValue()); + state.images[imgNr]->setVar(var.getName(), var.getValue()); // call imageChanged for the images affected by this. #define image_variable( name, type, default_value ) \ if (PTOVariableConverterFor##name::checkApplicability(var.getName())) \ {\ for (std::size_t i = 0; i < getNrOfImages(); i++)\ {\ - if (state.images[imgNr].name##isLinkedWith(state.images[i]))\ + if (state.images[imgNr]->name##isLinkedWith(*state.images[i]))\ {\ imageChanged(i);\ }\ @@ -290,7 +290,7 @@ #define image_variable( name, type, default_value )\ void Panorama::linkImageVariable##name(unsigned int sourceImgNr, unsigned int destImgNr)\ {\ - state.images[destImgNr].link##name(&(state.images[sourceImgNr]));\ + state.images[destImgNr]->link##name(state.images[sourceImgNr]);\ imageChanged(destImgNr);\ imageChanged(sourceImgNr);\ state.needsOptimization = true;\ @@ -302,7 +302,7 @@ #define image_variable( name, type, default_value )\ void Panorama::unlinkImageVariable##name(unsigned int imgNr)\ {\ - state.images[imgNr].unlink##name();\ + state.images[imgNr]->unlink##name();\ imageChanged(imgNr);\ state.needsOptimization = true;\ } @@ -319,7 +319,7 @@ unsigned int Panorama::addImage(const SrcPanoImage &img, const VariableMap & vars) { unsigned int nr = state.images.size(); - state.images.push_back(img); + state.images.push_back(new SrcPanoImage(img)); /// @todo is this really necessary? Can we drop vars? updateVariables(nr, vars); // create empty optimisation vector @@ -348,7 +348,7 @@ } DEBUG_TRACE("Remove variables and image from panorama state") - /// @todo move linked variable references in SrcPanoImg. + delete state.images[imgNr]; state.images.erase(state.images.begin() + imgNr); state.optvec.erase(state.optvec.begin() + imgNr); @@ -375,7 +375,7 @@ void Panorama::setImageFilename(unsigned int i, const std::string & fname) { DEBUG_ASSERT(i < state.images.size()); - state.images[i].setFilename(fname); + state.images[i]->setFilename(fname); imageChanged(i); m_forceImagesUpdate = true; } @@ -384,7 +384,7 @@ { DEBUG_ASSERT(i < state.images.size()); // TODO: recenter crop, if required. - state.images[i].setOptions(opts); + state.images[i]->setOptions(opts); imageChanged(i); m_forceImagesUpdate = true; } @@ -527,9 +527,9 @@ { unsigned int imgNr = *imgNrIt; imageNrMap[imgNr] = ic; - const SrcPanoImage & img = state.images[imgNr]; + const SrcPanoImage & img = *state.images[imgNr]; VariableMap vars; - /// @TODO don't use getOptions. + /// @todo don't use getOptions. ImageOptions iopts = img.getOptions(); @@ -559,16 +559,16 @@ * optimised, we should remember them so we can write them later as 'v' lines. */ #define image_variable( name, type, default_value )\ - PTOVariableConverterFor##name::addToVariableMap(state.images[imgNr].get##name##IV(), vars);\ + PTOVariableConverterFor##name::addToVariableMap(state.images[imgNr]->get##name##IV(), vars);\ if (!vars.empty())\ {\ bool linking = false;\ std::size_t link_target;\ - if (state.images[imgNr].name##isLinked())\ + if (state.images[imgNr]->name##isLinked())\ {\ for (link_target = 0; link_target < imgNr; link_target++)\ {\ - if (state.images[imgNr].name##isLinkedWith(state.images[link_target]))\ + if (state.images[imgNr]->name##isLinkedWith(*state.images[link_target]))\ {\ linking = true;\ break;\ @@ -749,10 +749,10 @@ << "# output image lines" << std::endl; for (UIntSet::const_iterator imgNrIt = imgs.begin(); imgNrIt != imgs.end(); ++imgNrIt) { unsigned int imgNr = *imgNrIt; - const SrcPanoImage & img = state.images[imgNr]; + const SrcPanoImage & img = *state.images[imgNr]; // DGSW FIXME - Unreferenced // const Lens & lens = state.lenses[lensNr]; - const VariableMap & vars = state.images[imgNr].getVariableMap(); + const VariableMap & vars = state.images[imgNr]->getVariableMap(); o << "o w" << img.getSize().width() << " h" << img.getSize().height() <<" f" << img.getProjection() << " "; @@ -959,13 +959,11 @@ DEBUG_ASSERT(img1 < state.images.size()); DEBUG_ASSERT(img2 < state.images.size()); - // first, swap image struct - SrcPanoImage pimg1 = state.images[img1]; + // first, swap image pointers in the list. + SrcPanoImage * pimg1 = state.images[img1]; state.images[img1] = state.images[img2]; state.images[img2] = pimg1; - - /// @todo swap variable links. - + // update control points for (CPVector::iterator it=state.ctrlPoints.begin(); it != state.ctrlPoints.end(); ++it) { int n1 = (*it).image1Nr; @@ -1085,12 +1083,11 @@ void Panorama::activateImage(unsigned int imgNr, bool active) { assert(imgNr < state.images.size()); - ImageOptions o = getImage(imgNr).getOptions(); - if (o.active != active) { - o.active = active; - state.images[imgNr].setOptions(o); - imageChanged(imgNr); - } + if (state.images[imgNr]->getActive() != active) + { + state.images[imgNr]->setActive(active); + imageChanged(imgNr); + } } UIntSet Panorama::getActiveImages() const @@ -1098,8 +1095,9 @@ UIntSet activeImgs; for (unsigned int i = 0; i < state.images.size(); i++) { - if (state.images[i].getOptions().active) { - activeImgs.insert(i); + if (state.images[i]->getActive()) + { + activeImgs.insert(i); } } return activeImgs; @@ -1110,7 +1108,7 @@ SrcPanoImage Panorama::getSrcImage(unsigned imgNr) const { DEBUG_ASSERT(imgNr < state.images.size()); - return state.images[imgNr]; + return *state.images[imgNr]; } void Panorama::setSrcImage(unsigned int imgNr, const SrcPanoImage & img) @@ -1120,7 +1118,7 @@ /* Copy the variables. We don't assign directly so we can do the changes to * any linked variables. */ - SrcPanoImage *dest = &(state.images[imgNr]); + SrcPanoImage *dest = state.images[imgNr]; #define image_variable( name, type, default_value ) \ dest->set##name (img.get##name()); #include "image_variables.h" @@ -1130,7 +1128,7 @@ #define image_variable( name, type, default_value ) \ for (std::size_t i = 0; i < getNrOfImages(); i++)\ {\ - if(state.images[imgNr].name##isLinkedWith(state.images[i]))\ + if(state.images[imgNr]->name##isLinkedWith(*state.images[i]))\ {\ imageChanged(i);\ }\ @@ -1169,7 +1167,7 @@ for (UIntSet::const_iterator imgNrIt = imgs.begin(); imgNrIt != imgs.end(); ++imgNrIt) { - subset.state.images.push_back(state.images[*imgNrIt]); + subset.state.images.push_back(new SrcPanoImage(*state.images[*imgNrIt])); subset.state.optvec.push_back(state.optvec[*imgNrIt]); imageNrMap[*imgNrIt] = ic; ic++; @@ -1188,9 +1186,9 @@ * linked to the target. */ #define image_variable( name, type, default_value )\ - if (state.images[*i].name##isLinkedWith(state.images[*j]))\ + if (state.images[*i]->name##isLinkedWith(*state.images[*j]))\ {\ - subset.state.images[ic].link##name(&subset.state.images[jc]);\ + subset.state.images[ic]->link##name(subset.state.images[jc]);\ } #include "image_variables.h" #undef image_variable @@ -1284,9 +1282,14 @@ return *this; } - // We should clear the images to make sure old links don't stay around. - images.clear(); - images = data.images; + // Remove any images we currently had. + deleteAllImages(); + // copy image variables + for (std::vector<SrcPanoImage *>::const_iterator it = data.images.begin(); + it != data.images.end(); it++) + { + images.push_back(new SrcPanoImage(*(*it))); + } // Copies of SrcPanoImage's variables aren't linked, so we have to create // new links in the same pattern. /** @todo This is quite inefficent, maybe we should store the links as a @@ -1303,9 +1306,9 @@ for (std::size_t j = i + 1; j < num_imgs; j++) { #define image_variable( name, type, default_value )\ - if (data.images[i].name##isLinkedWith(data.images[j]))\ + if (data.images[i]->name##isLinkedWith(*data.images[j]))\ {\ - images[i].link##name(&images[j]);\ + images[i]->link##name(images[j]);\ } #include "image_variables.h" #undef image_variable @@ -1323,6 +1326,23 @@ return *this; } +PanoramaMemento::~PanoramaMemento() +{ + deleteAllImages(); +} + +void PanoramaMemento::deleteAllImages() +{ + // delete all the images pointed to by the images vector. + for (std::vector<SrcPanoImage *>::iterator it = images.begin(); + it != images.end(); it++) + { + delete *it; + } + // now clear the pointers themselves. + images.clear(); +} + bool PanoramaMemento::loadPTScript(std::istream &i, int & ptoVersion, const std::string &prefix) { using namespace std; @@ -1957,9 +1977,10 @@ DEBUG_DEBUG("filename: " << file); // Make a new SrcPanoImage in this list for expressing this one. - images.push_back(SrcPanoImage()); + SrcPanoImage * new_img_p = new SrcPanoImage(); + images.push_back(new_img_p); // and make a reference to it so we dont keep using images.back(), - SrcPanoImage & new_img = images.back(); + SrcPanoImage & new_img = *new_img_p; new_img.setFilename(file); new_img.setSize(vigra::Size2D(iImgInfo[i].width, iImgInfo[i].height)); @@ -2006,7 +2027,7 @@ return false;\ }\ DEBUG_DEBUG("anchored to image " << link);\ - new_img.link##name(&(images[link]));\ + new_img.link##name(images[link]);\ } else {\ double val = map_get(vars, vit->first).getValue();\ new_img.setVar(vit->first, val);\ Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-29 14:59:08 UTC (rev 4122) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/Panorama.h 2009-07-29 15:14:28 UTC (rev 4123) @@ -56,7 +56,7 @@ /// assignment operator PanoramaMemento& operator=(const PanoramaMemento & o); - virtual ~PanoramaMemento() {}; + virtual ~PanoramaMemento(); protected: @@ -82,9 +82,12 @@ /** The images inside the panorama. * - * The image variables are stored inside of the image class here. + * The image variables are stored inside. We use pointers to the real + * objects so that the memory addresses of them remain constant when we + * remove and swap the order of images. We should create and free images + * when necessary. */ - ImageVector images; + std::vector<SrcPanoImage *> images; CPVector ctrlPoints; @@ -96,6 +99,8 @@ // control points or lens parameters after the // last optimisation bool needsOptimization; + + void deleteAllImages(); }; @@ -192,23 +197,19 @@ const SrcPanoImage & getImage(std::size_t nr) const { assert(nr < state.images.size()); - return state.images[nr]; + return *state.images[nr]; }; /// set a panorama image, counting starts with 0 void setImage(std::size_t nr, SrcPanoImage img) { - assert(nr < state.images.size()); - state.images[nr] = img; + setSrcImage(nr, img); }; /// the the number for a specific image // unsigned int getImageNr(const PanoImage * image) const; /** add an Image to the panorama - * - * The Image must be initialized, the Lens must exist. - * */ unsigned int addImage(const SrcPanoImage &img, const VariableMap &vars); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-07-31 01:57:24
|
Revision: 4130 http://hugin.svn.sourceforge.net/hugin/?rev=4130&view=rev Author: jlegg Date: 2009-07-31 01:57:13 +0000 (Fri, 31 Jul 2009) Log Message: ----------- Fix incorrectly set croping regions when loading a file. The previews now work. :-) Also remove ImageVariable's debug info from the non-debug build. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h 2009-07-30 17:17:06 UTC (rev 4129) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/ImageVariable.h 2009-07-31 01:57:13 UTC (rev 4130) @@ -24,8 +24,6 @@ #ifndef _PANODATA_IMAGEVARIABLE_H #define _PANODATA_IMAGEVARIABLE_H -#include "ImageVariable.h" - namespace HuginBase { @@ -298,7 +296,7 @@ // We need to first check that we aren't linked already. if (searchBackwards(link) || searchForwards(link)) { - DEBUG_WARN("Attempt to link already linked variables"); + DEBUG_INFO("Attempt to link already linked variables"); return; } else Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp 2009-07-30 17:17:06 UTC (rev 4129) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.cpp 2009-07-31 01:57:13 UTC (rev 4130) @@ -167,6 +167,14 @@ } } +void SrcPanoImage::setSize(vigra::Size2D val) +{ + m_Size.setData(val); + if (m_CropMode.getData() == NO_CROP) { + m_CropRect.setData(vigra::Rect2D(val)); + } +} + double SrcPanoImage::getExposure() const { return 1.0/pow(2.0, m_ExposureValue.getData()); } @@ -258,10 +266,22 @@ // set variables from an ImageOptions object for the stuff using the old interface. m_FeatherWidth.setData(opts.featherWidth); m_Morph.setData(opts.morph); - /// @todo find when should this be CROP_CIRCLE instead. - m_CropMode.setData(opts.docrop ? CROP_RECTANGLE : NO_CROP); - m_AutoCenterCrop.setData(opts.autoCenterCrop); - m_CropRect.setData(opts.cropRect); + if (opts.docrop) + { + if (m_Projection.getData() == CIRCULAR_FISHEYE) + { + m_CropMode.setData(CROP_CIRCLE); + } + else + { + m_CropMode.setData(CROP_RECTANGLE); + } + m_CropRect.setData(opts.cropRect); + } else { + m_CropMode.setData(NO_CROP); + m_CropRect.setData((vigra::Rect2D)m_Size.getData()); + } + m_AutoCenterCrop.setData(opts.autoCenterCrop); m_VigCorrMode.setData(opts.m_vigCorrMode); m_FlatfieldFilename.setData(opts.m_flatfield); m_ResponseType.setData((ResponseType)opts.responseType); Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-07-30 17:17:06 UTC (rev 4129) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-07-31 01:57:13 UTC (rev 4130) @@ -237,6 +237,12 @@ */ void setCropMode(CropMode val); + /** Set the image size in pixels + * + * If we aren't cropping the image, set the size to the entire image + */ + void setSize(vigra::Size2D val); + hugin_utils::FDiff2D getRadialDistortionCenter() const; hugin_utils::FDiff2D getRadialVigCorrCenter() const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jl...@us...> - 2009-08-09 14:29:48
|
Revision: 4191 http://hugin.svn.sourceforge.net/hugin/?rev=4191&view=rev Author: jlegg Date: 2009-08-09 14:29:34 +0000 (Sun, 09 Aug 2009) Log Message: ----------- Fix links for j parameter set incorrectly when loading pto. Old projects are now correctly given unlinked j parameters, so appear as separate stacks. Modified Paths: -------------- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/PTScriptParsing.cpp hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/PTScriptParsing.cpp =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/PTScriptParsing.cpp 2009-08-09 11:28:03 UTC (rev 4190) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/PTScriptParsing.cpp 2009-08-09 14:29:34 UTC (rev 4191) @@ -207,7 +207,7 @@ // cannot use Lens::variableNames here, because r,p,v need to be included -const char * ImgInfo::varnames[] = {"v", "a","b","c", "d","e", "g","t", "r","p","y", +const char * ImgInfo::varnames[] = {"v", "a","b","c", "d","e", "g","t", "r","p","y", "j", "Va", "Vb", "Vc", "Vd", "Vx", "Vy", "Eev", "Er", "Eb", "Ra", "Rb", "Rc", "Rd", "Re", 0}; Modified: hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h =================================================================== --- hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-08-09 11:28:03 UTC (rev 4190) +++ hugin/branches/gsoc2009_layout/src/hugin_base/panodata/SrcPanoImage.h 2009-08-09 14:29:34 UTC (rev 4191) @@ -353,6 +353,9 @@ m_ResponseType.linkWith(&(target->m_ResponseType)); } + void linkStack (SrcPanoImage * target) + { m_Stack.linkWith(&(target->m_Stack)); } + /** try to fill out information about the image, by examining the exif data * focalLength and cropFactor will be updated with the ones read from the exif data * If no or not enought exif data was found and valid given focalLength and cropFactor This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |