From: Pablo d'A. <da...@us...> - 2006-01-06 16:03:22
|
Update of /cvsroot/hugin/hugin/src/hugin In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30926/src/hugin Modified Files: CPZoomDisplayPanel.cpp ImageCache.cpp LensPanel.cpp MainFrame.cpp Makefile.am NonaStitcherPanel.cpp OptimizePanel.cpp PTStitcherPanel.cpp PanoPanel.cpp PreviewFrame.cpp PreviewPanel.cpp hugin.vcproj huginApp.cpp Log Message: added vignetting and brightness correction functions Index: PTStitcherPanel.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/PTStitcherPanel.cpp,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- PTStitcherPanel.cpp 31 Oct 2005 11:10:24 -0000 1.17 +++ PTStitcherPanel.cpp 6 Jan 2006 16:02:34 -0000 1.18 @@ -31,8 +31,6 @@ #include "panoinc.h" -#include "PT/Stitcher.h" - #include "hugin/RunStitcherFrame.h" #include "hugin/CommandHistory.h" //#include "hugin/ImageCache.h" @@ -136,7 +134,6 @@ PTStitcherPanel::~PTStitcherPanel(void) { DEBUG_TRACE("dtor"); - // FIXME. why does the crash at exit? m_GammaText->PopEventHandler(true); m_ColorCorrRefSpin->PopEventHandler(true); m_FeatherWidthSpin->PopEventHandler(true); Index: hugin.vcproj =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/hugin.vcproj,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- hugin.vcproj 31 Aug 2005 21:00:56 -0000 1.15 +++ hugin.vcproj 6 Jan 2006 16:02:34 -0000 1.16 @@ -317,6 +317,9 @@ RelativePath=".\TextKillFocusHandler.cpp"> </File> <File + RelativePath=".\VigCorrDialog.cpp"> + </File> + <File RelativePath=".\win_prep.h"> </File> </Filter> @@ -432,6 +435,9 @@ RelativePath="..\include\hugin\TextKillFocusHandler.h"> </File> <File + RelativePath="..\include\hugin\VigCorrDialog.h"> + </File> + <File RelativePath="..\include\hugin\wxPanoCommand.h"> </File> </Filter> Index: huginApp.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/huginApp.cpp,v retrieving revision 1.91 retrieving revision 1.92 diff -u -d -r1.91 -r1.92 --- huginApp.cpp 2 Nov 2005 19:48:01 -0000 1.91 +++ huginApp.cpp 6 Jan 2006 16:02:34 -0000 1.92 @@ -261,6 +261,7 @@ wxXmlResource::Get()->Load(xrcPrefix + wxT("help.xrc")); wxXmlResource::Get()->Load(xrcPrefix + wxT("keyboard_help.xrc")); wxXmlResource::Get()->Load(xrcPrefix + wxT("pref_dialog.xrc")); + wxXmlResource::Get()->Load(xrcPrefix + wxT("vig_corr_dlg.xrc")); #ifdef USE_WX253 wxXmlResource::Get()->Load(xrcPrefix + wxT("cp_editor_panel-2.5.xrc")); wxXmlResource::Get()->Load(xrcPrefix + wxT("images_panel-2.5.xrc")); Index: PreviewPanel.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/PreviewPanel.cpp,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- PreviewPanel.cpp 15 Dec 2005 16:05:23 -0000 1.48 +++ PreviewPanel.cpp 6 Jan 2006 16:02:34 -0000 1.49 @@ -53,7 +53,7 @@ // EVT_MOTION(CPImageCtrl::mouseMoveEvent) // EVT_LEFT_UP(CPImageCtrl::mouseReleaseEvent) EVT_SIZE(PreviewPanel::OnResize) -// EVT_MOUSE_EVENTS ( PreviewPanel::OnMouse ) + EVT_MOUSE_EVENTS ( PreviewPanel::OnMouse ) EVT_PAINT ( PreviewPanel::OnDraw ) END_EVENT_TABLE() @@ -92,7 +92,7 @@ DEBUG_DEBUG("VFOV changed"); dirty = true; } - if (newOpts.projectionFormat != opts.projectionFormat) { + if (newOpts.getProjection() != opts.getProjection()) { DEBUG_DEBUG("projection changed"); dirty = true; } @@ -361,6 +361,8 @@ void PreviewPanel::OnMouse(wxMouseEvent & e) { DEBUG_DEBUG("OnMouse: " << e.m_x << "x" << e.m_y); + // display current pixel values in status bar + } void PreviewPanel::DrawOutline(const vector<FDiff2D> & points, wxDC & dc, int offX, int offY) Index: NonaStitcherPanel.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/NonaStitcherPanel.cpp,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- NonaStitcherPanel.cpp 15 Dec 2005 16:05:23 -0000 1.57 +++ NonaStitcherPanel.cpp 6 Jan 2006 16:02:34 -0000 1.58 @@ -56,6 +56,7 @@ BEGIN_EVENT_TABLE(NonaStitcherPanel, wxWindow) EVT_CHOICE ( XRCID("nona_choice_interpolator"),NonaStitcherPanel::InterpolatorChanged) + EVT_TEXT_ENTER ( XRCID("nona_text_gamma"),NonaStitcherPanel::GammaChanged ) EVT_SPINCTRL(XRCID("nona_jpeg_quality"), NonaStitcherPanel::OnSetQuality) EVT_CHECKBOX( XRCID("nona_check_enblend"), NonaStitcherPanel::OnEnblendChanged) EVT_CHECKBOX( XRCID("nona_save_cropped"), NonaStitcherPanel::OnSaveCropped) @@ -79,6 +80,9 @@ m_InterpolatorChoice = XRCCTRL(*this, "nona_choice_interpolator", wxChoice); DEBUG_ASSERT(m_InterpolatorChoice); + m_gammaTxt = XRCCTRL(*this, "nona_text_gamma", wxTextCtrl); + m_gammaTxt->PushEventHandler(new TextKillFocusHandler(this)); + DEBUG_ASSERT(m_gammaTxt); m_FormatChoice = XRCCTRL(*this, "nona_choice_format_final", wxChoice); DEBUG_ASSERT(m_FormatChoice); m_JPEGQualitySpin = XRCCTRL(*this, "nona_jpeg_quality", wxSpinCtrl); @@ -110,6 +114,7 @@ NonaStitcherPanel::~NonaStitcherPanel(void) { DEBUG_TRACE("dtor"); + m_gammaTxt->PopEventHandler(true); pano.removeObserver(this); DEBUG_TRACE("dtor end"); } @@ -145,7 +150,8 @@ //} // - m_InterpolatorChoice->SetSelection(opt.interpolator); + m_InterpolatorChoice->SetSelection(opt.interpolator); + m_gammaTxt->SetValue(wxString::Format (wxT("%.2f"), opt.gamma)); // translate format int format; @@ -318,12 +324,12 @@ opts.outputFormat = PanoramaOptions::TIFF_m; opts.tiff_saveROI = (wxConfigBase::Get()->Read(wxT("/Enblend/UseCroppedFiles"), - HUGIN_ENBLEND_USE_CROPPED_FILES)); + HUGIN_ENBLEND_USE_CROPPED_FILES)) != 0; } // stitch panorama PT::stitchPanorama(pano, opts, pdisp, opts.outfile, imgs); - } catch (std::bad_alloc & e) { + } catch (std::bad_alloc &) { wxMessageBox(_("Out of memory.\nTry again with a smaller panorama image size\n"), _("Error during stitching"), wxICON_ERROR | wxOK); @@ -536,3 +542,21 @@ new PT::SetPanoOptionsCmd( pano, opt ) ); } + +void NonaStitcherPanel::GammaChanged ( wxCommandEvent & e ) +{ + if (updatesDisabled) return; + PanoramaOptions opt = pano.getOptions(); + double val; + wxString text = m_gammaTxt->GetValue(); + if (str2double(text, val)) { + opt.gamma = val; + GlobalCmdHist::getInstance().addCommand( + new PT::SetPanoOptionsCmd( pano, opt ) + ); + DEBUG_DEBUG( val ); + } else { + wxLogError(_("gamma must be a number")); + } +} + Index: Makefile.am =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/Makefile.am,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- Makefile.am 30 Aug 2005 21:22:57 -0000 1.16 +++ Makefile.am 6 Jan 2006 16:02:34 -0000 1.17 @@ -17,7 +17,7 @@ PreviewPanel.cpp ImageCenter.cpp OptimizePanel.cpp RunOptimizerFrame.cpp RunStitcherFrame.cpp CPListFrame.cpp \ TextKillFocusHandler.cpp ImageOrientationPanel.cpp ImageOrientationFrame.cpp PanoDruid.cpp \ CPZoomDisplayPanel.cpp CPFineTuneFrame.cpp \ - PreferencesDialog.cpp LocalizedFileTipProvider.cpp + PreferencesDialog.cpp LocalizedFileTipProvider.cpp VigCorrDialog.cpp if HAVE_MINGW WIN_SRC = hugin_rc.rc Index: ImageCache.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/ImageCache.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- ImageCache.cpp 26 Jan 2005 22:38:15 -0000 1.36 +++ ImageCache.cpp 6 Jan 2006 16:02:34 -0000 1.37 @@ -36,7 +36,9 @@ #include <vigra/rgbvalue.hxx> #include <vigra/impex.hxx> #include <vigra/impexalpha.hxx> -#include "vigra_ext/Pyramid.h" +#include <vigra_ext/Pyramid.h> +#include <vigra_ext/ImageTransforms.h> + #include "hugin/ImageCache.h" @@ -351,7 +353,6 @@ linearIntensityTransform<DestComponentType>(scale)); } - ImagePtr ImageCache::getImage(const std::string & filename) { // softFlush(); @@ -604,27 +605,110 @@ return m_images[imgNr]; } + typedef BRGBImage::traverser sI; + typedef BRGBImage::Accessor sA; + typedef BRGBImage::const_traverser csI; + typedef BRGBImage::ConstAccessor csA; + + typedef BasicImageView<RGBValue<unsigned char> > BRGBImageView; + typedef BRGBImageView::const_traverser csvI; + typedef BRGBImageView::ConstAccessor csvA; + + typedef sA::value_type PixelType; + typedef vigra::NumericTraits<PixelType>::RealPromote RPixelType; + // remap image DEBUG_DEBUG("remapping image " << imgNr); // load image const PanoImage & img = pano.getImage(imgNr); + const PT::ImageOptions & iopts = img.getOptions(); + wxImage * src = ImageCache::getInstance().getSmallImage(img.getFilename().c_str()); if (!src->Ok()) { throw std::runtime_error("could not retrieve small source image for preview generation"); } // image view - BasicImageView<RGBValue<unsigned char> > srcImg((RGBValue<unsigned char> *)src->GetData(), - src->GetWidth(), - src->GetHeight()); - // mask image - BImage srcAlpha(src->GetWidth(), src->GetHeight(), 255); - + BRGBImageView srcImg((RGBValue<unsigned char> *)src->GetData(), + src->GetWidth(), + src->GetHeight()); MRemappedImage *remapped = new MRemappedImage; - remapped->remapImage(pano, opts, - srcImageRange(srcImg), - srcImage(srcAlpha), - imgNr, progress); + + if (opts.gamma != 1.0 || img.getOptions().m_vigCorrMode != 0) { + BRGBImage srcCorrImg(src->GetWidth(), src->GetHeight()); + + // prepare some information required by multiple types of vignetting correction + bool vigCorrDivision = (iopts.m_vigCorrMode & ImageOptions::VIGCORR_DIV)>0; + + RPixelType ka,kb; + bool doBrightnessConversion = convertKParams(pano.getImageVariables(imgNr), ka, kb); + + double gMaxVal = vigra_ext::VigCorrTraits<PixelType>::max(); + if (iopts.m_vigCorrMode & ImageOptions::VIGCORR_FLATFIELD) { + // load flatfield image. + + progress.setMessage(std::string("flatfield vignetting correction ") + utils::stripPath(img.getFilename())); + wxImage * flatsrc = ImageCache::getInstance().getSmallImage(iopts.m_flatfield.c_str()); + if (!flatsrc->Ok()) { + throw std::runtime_error("could not retrieve flatfield image for preview generation"); + } + + // image view + BRGBImageView flatImg((RGBValue<unsigned char> *)flatsrc->GetData(), + flatsrc->GetWidth(), + flatsrc->GetHeight()); + vigra_ext::flatfieldVigCorrection(vigra::srcImageRange(srcImg), + std::make_pair(flatImg.upperLeft(), vigra::RedAccessor<PixelType>()), + vigra::destImage(srcCorrImg), opts.gamma, gMaxVal, vigCorrDivision, ka, kb); + + } else if (iopts.m_vigCorrMode & ImageOptions::VIGCORR_RADIAL) { + progress.setMessage(std::string("vignetting correction ") + utils::stripPath(img.getFilename())); + double radCoeff[4]; + radCoeff[0] = const_map_get(pano.getImageVariables(imgNr),"Va").getValue(); + radCoeff[1] = const_map_get(pano.getImageVariables(imgNr),"Vb").getValue(); + radCoeff[2] = const_map_get(pano.getImageVariables(imgNr),"Vc").getValue(); + radCoeff[3] = const_map_get(pano.getImageVariables(imgNr),"Vd").getValue(); + + double scale = (double) srcImg.width() / img.getWidth(); + + double centerShiftX = const_map_get(pano.getImageVariables(imgNr),"Vx").getValue(); + double centerShiftY = const_map_get(pano.getImageVariables(imgNr),"Vy").getValue(); + // take scale factor into accout.. + double cx = (img.getWidth()/2 + centerShiftX) * scale; + double cy = (img.getHeight()/2 + centerShiftY) * scale; + + vigra_ext::radialVigCorrection(srcImageRange(srcImg), destImage(srcCorrImg), + opts.gamma, gMaxVal, + radCoeff, cx, cy, + vigCorrDivision, ka, kb); + } else if (opts.gamma != 1.0 && doBrightnessConversion ) { + progress.setMessage(std::string("inverse gamma correction ") + utils::stripPath(img.getFilename())); + vigra_ext::applyGammaAndBrightCorrection(srcImageRange(srcImg), destImage(srcCorrImg), + opts.gamma, gMaxVal, ka,kb); + } else if (doBrightnessConversion ) { + progress.setMessage(std::string("brightness correction ") + utils::stripPath(img.getFilename())); + vigra_ext::applyBrightnessCorrection(srcImageRange(srcImg), destImage(srcCorrImg), + ka,kb); + } else if (opts.gamma != 1.0 ) { + progress.setMessage(std::string("inverse gamma correction ") + utils::stripPath(img.getFilename())); + vigra_ext::applyGammaCorrection(srcImageRange(srcImg), destImage(srcCorrImg), + opts.gamma, gMaxVal); + } + + remapped->remapImage(pano, opts, + srcImageRange(srcCorrImg), + imgNr, progress); + + if (opts.gamma != 1.0) { + progress.setMessage(std::string("gamma correction ") + utils::stripPath(img.getFilename())); + vigra_ext::applyGammaCorrection(srcImageRange(remapped->m_image), destImage(remapped->m_image), + 1/opts.gamma, gMaxVal); + } + } else { + remapped->remapImage(pano, opts, + srcImageRange(srcImg), + imgNr, progress); + } m_images[imgNr] = remapped; return remapped; } Index: PreviewFrame.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/PreviewFrame.cpp,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- PreviewFrame.cpp 15 Dec 2005 16:05:23 -0000 1.56 +++ PreviewFrame.cpp 6 Jan 2006 16:02:34 -0000 1.57 @@ -44,6 +44,8 @@ #include "hugin/ImagesPanel.h" #include "hugin/CommandHistory.h" +#include <vigra_ext/ImageTransforms.h> + using namespace utils; // a random id, hope this doesn't break something.. @@ -279,7 +281,7 @@ const PanoramaOptions & opts = pano.getOptions(); wxString projection; - switch (opts.projectionFormat) { + switch (opts.getProjection()) { case PanoramaOptions::RECTILINEAR: projection = _("rectilinear"); break; @@ -523,10 +525,10 @@ { wxString cMsg; if (it->getProgress() > 0) { - cMsg.Printf(wxT("%s %s [%3.0f%%]"), + cMsg.Printf(wxT("%s [%3.0f%%]: %s "), wxString(it->getShortMessage().c_str(), *wxConvCurrent).c_str(), - wxString(it->getMessage().c_str(), *wxConvCurrent).c_str(), - 100 * it->getProgress()); + 100 * it->getProgress(), + wxString(it->getMessage().c_str(), *wxConvCurrent).c_str()); } else { cMsg.Printf(wxT("%s %s"),wxString(it->getShortMessage().c_str(), *wxConvCurrent).c_str(), wxString(it->getMessage().c_str(), *wxConvCurrent).c_str()); Index: MainFrame.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/MainFrame.cpp,v retrieving revision 1.165 retrieving revision 1.166 diff -u -d -r1.165 -r1.166 --- MainFrame.cpp 6 Nov 2005 13:26:50 -0000 1.165 +++ MainFrame.cpp 6 Jan 2006 16:02:34 -0000 1.166 @@ -1229,8 +1229,8 @@ { wxString msg; // build the message: - for (std::vector<ProgressTask>::iterator it = tasks.begin(); - it != tasks.end(); ++it) + for (std::vector<ProgressTask>::reverse_iterator it = tasks.rbegin(); + it != tasks.rend(); ++it) { wxString cMsg; if (it->getProgress() > 0) { @@ -1243,7 +1243,7 @@ wxString(it->getMessage().c_str(), *wxConvCurrent).c_str()); } // append to main message - if (it == tasks.begin()) { + if (it == tasks.rbegin()) { msg = cMsg; } else { msg.Append(wxT(" | ")); Index: OptimizePanel.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/OptimizePanel.cpp,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- OptimizePanel.cpp 10 Aug 2005 22:05:45 -0000 1.33 +++ OptimizePanel.cpp 6 Jan 2006 16:02:34 -0000 1.34 @@ -588,7 +588,7 @@ // try to select sensible position optimisation parameters, // dependent on output projection - switch (m_pano->getOptions().projectionFormat) { + switch (m_pano->getOptions().getProjection()) { case PT::PanoramaOptions::RECTILINEAR: m_roll_list->Check(refImg, (nHCP > 0 || nVCP > 0)); m_yaw_list->Check(refImg, (nHCP > 0)); Index: LensPanel.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/LensPanel.cpp,v retrieving revision 1.86 retrieving revision 1.87 diff -u -d -r1.86 -r1.87 --- LensPanel.cpp 5 Dec 2005 08:29:09 -0000 1.86 +++ LensPanel.cpp 6 Jan 2006 16:02:34 -0000 1.87 @@ -48,6 +48,7 @@ #include "hugin/huginApp.h" #include "hugin/TextKillFocusHandler.h" #include "hugin/wxPanoCommand.h" +#include "hugin/VigCorrDialog.h" using namespace PT; using namespace utils; @@ -84,6 +85,7 @@ EVT_TEXT_ENTER ( XRCID("lens_val_g"), LensPanel::OnVarChanged ) EVT_TEXT_ENTER ( XRCID("lens_val_t"), LensPanel::OnVarChanged ) EVT_BUTTON ( XRCID("lens_button_center"), LensPanel::SetCenter ) + EVT_BUTTON ( XRCID("lens_button_vig"), LensPanel::EditVigCorr ) EVT_BUTTON ( XRCID("lens_button_loadEXIF"), LensPanel::OnReadExif ) EVT_BUTTON ( XRCID("lens_button_save"), LensPanel::OnSaveLensParameters ) EVT_BUTTON ( XRCID("lens_button_load"), LensPanel::OnLoadLensParameters ) @@ -250,7 +252,7 @@ lens.getProjection() ); } - for (char** varname = Lens::variableNames; *varname != 0; ++varname) { + for (char** varname = m_varNames; *varname != 0; ++varname) { // update parameters int ndigits = m_distDigitsEdit; if (strcmp(*varname, "hfov") == 0 || strcmp(*varname, "d") == 0 || @@ -432,7 +434,7 @@ if ((varname == "a" || varname == "b" || varname == "c") && val == 0.0 ){ // set value to a very small one. PTOptimizer will not optimise a // distortion parameter whos value is exactly 0 - val = 0.0000001; + //val = 0.0000001; } Variable var(varname,val); GlobalCmdHist::getInstance().addCommand( @@ -486,6 +488,15 @@ } } +void LensPanel::EditVigCorr ( wxCommandEvent & e ) +{ + if (m_selectedImages.size() > 0) { + VigCorrDialog *dlg = new VigCorrDialog(this, pano, *(m_selectedImages.begin())); + dlg->Show(); + } +} + + void LensPanel::SetCenter ( wxCommandEvent & e ) { // wxLogError(_("temporarily disabled")); @@ -594,6 +605,7 @@ XRCCTRL(*this, "lens_button_save", wxButton)->Disable(); XRCCTRL(*this, "lens_button_newlens", wxButton)->Disable(); XRCCTRL(*this, "lens_button_changelens", wxButton)->Disable(); + XRCCTRL(*this, "lens_button_vig", wxButton)->Disable(); } else { // m_editImageNr = *sel.begin(); @@ -631,6 +643,7 @@ DEBUG_DEBUG("updating LensPanel with Image " << img); XRCCTRL(*this, "lens_button_load", wxButton)->Enable(); XRCCTRL(*this, "lens_button_save", wxButton)->Enable(); + XRCCTRL(*this, "lens_button_vig", wxButton)->Enable(); UpdateLensDisplay(); } else { XRCCTRL(*this, "lens_val_v", wxTextCtrl)->Clear(); @@ -654,6 +667,7 @@ XRCCTRL(*this, "lens_button_load", wxButton)->Disable(); XRCCTRL(*this, "lens_button_save", wxButton)->Disable(); + XRCCTRL(*this, "lens_button_vig", wxButton)->Disable(); } } } @@ -713,6 +727,9 @@ wxSAVE, wxDefaultPosition); if (dlg.ShowModal() == wxID_OK) { fname = dlg.GetPath(); + if (fname.Right(4) != wxT(".ini")) { + fname.Append(wxT(".ini")); + } wxConfig::Get()->Write(wxT("lensPath"), dlg.GetDirectory()); // remember for later // set numeric locale to C, for correct number output char * old_locale = setlocale(LC_NUMERIC,NULL); @@ -723,20 +740,23 @@ cfg.Write(wxT("Lens/hfov"), const_map_get(vars,"v").getValue()); cfg.Write(wxT("Lens/hfov_link"), const_map_get(lens.variables,"v").isLinked() ? 1:0); cfg.Write(wxT("Lens/crop"), lens.getCropFactor()); - cfg.Write(wxT("Lens/a"), const_map_get(vars,"a").getValue()); - cfg.Write(wxT("Lens/a_link"), const_map_get(lens.variables,"a").isLinked() ? 1:0); - cfg.Write(wxT("Lens/b"), const_map_get(vars,"b").getValue()); - cfg.Write(wxT("Lens/b_link"), const_map_get(lens.variables,"b").isLinked() ? 1:0); - cfg.Write(wxT("Lens/c"), const_map_get(vars,"c").getValue()); - cfg.Write(wxT("Lens/c_link"), const_map_get(lens.variables,"c").isLinked() ? 1:0); - cfg.Write(wxT("Lens/d"), const_map_get(vars,"d").getValue()); - cfg.Write(wxT("Lens/d_link"), const_map_get(lens.variables,"d").isLinked() ? 1:0); - cfg.Write(wxT("Lens/e"), const_map_get(vars,"e").getValue()); - cfg.Write(wxT("Lens/e_link"), const_map_get(lens.variables,"e").isLinked() ? 1:0); - cfg.Write(wxT("Lens/t"), const_map_get(vars,"t").getValue()); - cfg.Write(wxT("Lens/t_link"), const_map_get(lens.variables,"t").isLinked() ? 1:0); - cfg.Write(wxT("Lens/g"), const_map_get(vars,"g").getValue()); - cfg.Write(wxT("Lens/g_link"), const_map_get(lens.variables,"g").isLinked() ? 1:0); + + // loop to save lens variables + char ** varname = Lens::variableNames; + while (*varname) { + wxString key(wxT("Lens/")); + key.append(wxString(*varname, *wxConvCurrent)); + cfg.Write(key, const_map_get(vars,*varname).getValue()); + key.append(wxT("_link")); + cfg.Write(key, const_map_get(lens.variables,*varname).isLinked() ? 1:0); + varname++; + } + + ImageOptions imgopts = pano.getImage(imgNr).getOptions(); + cfg.Write(wxT("Lens/vigCorrMode"), imgopts.m_vigCorrMode); + cfg.Write(wxT("Lens/flatfield"), + wxString(imgopts.m_flatfield.c_str(), *wxConvCurrent) ); + // TODO: save crop cfg.Flush(); } // reset locale @@ -755,6 +775,7 @@ unsigned int lensNr = pano.getImage(imgNr).getLensNr(); Lens lens = pano.getLens(lensNr); VariableMap vars = pano.getImageVariables(imgNr); + ImageOptions imgopts = pano.getImage(imgNr).getOptions(); wxString fname; wxFileDialog dlg(this, _("Load lens parameters"), @@ -775,38 +796,33 @@ lens.setProjection ((Lens::LensProjectionFormat) integer); cfg.Read(wxT("Lens/hfov"), &d);map_get(vars,"v").setValue(d); cfg.Read(wxT("Lens/crop"), &d);lens.setCropFactor(d); - cfg.Read(wxT("Lens/a"), &d);map_get(vars,"a").setValue(d); - cfg.Read(wxT("Lens/b"), &d);map_get(vars,"b").setValue(d); - cfg.Read(wxT("Lens/c"), &d);map_get(vars,"c").setValue(d); - cfg.Read(wxT("Lens/d"), &d);map_get(vars,"d").setValue(d); - cfg.Read(wxT("Lens/e"), &d);map_get(vars,"e").setValue(d); - cfg.Read(wxT("Lens/t"), &d);map_get(vars,"t").setValue(d); - cfg.Read(wxT("Lens/g"), &d);map_get(vars,"g").setValue(d); - integer = 1; - cfg.Read(wxT("Lens/hfov_link"), &integer); - map_get(lens.variables, "v").setLinked(integer != 0); - integer = 1; - cfg.Read(wxT("Lens/a_link"), &integer); - map_get(lens.variables, "a").setLinked(integer != 0); - integer = 1; - cfg.Read(wxT("Lens/b_link"), &integer); - map_get(lens.variables, "b").setLinked(integer != 0); - integer = 1; - cfg.Read(wxT("Lens/c_link"), &integer); - map_get(lens.variables, "c").setLinked(integer != 0); - integer = 1; - cfg.Read(wxT("Lens/d_link"), &integer); - map_get(lens.variables, "d").setLinked(integer != 0); - integer = 1; - cfg.Read(wxT("Lens/e_link"), &integer); - map_get(lens.variables, "e").setLinked(integer != 0); - integer = 0; - cfg.Read(wxT("Lens/t_link"), &integer); - map_get(lens.variables, "t").setLinked(integer != 0); - integer = 0; - cfg.Read(wxT("Lens/g_link"), &integer); - map_get(lens.variables, "g").setLinked(integer != 0); + // loop to load lens variables + char ** varname = Lens::variableNames; + while (*varname) { + wxString key(wxT("Lens/")); + key.append(wxString(*varname, *wxConvCurrent)); + d = 0; + cfg.Read(key,&d); + map_get(vars,*varname).setValue(d); + + integer = 1; + key.append(wxT("_link")); + cfg.Read(key, &integer); + map_get(lens.variables, *varname).setLinked(integer != 0); + + varname++; + } + long vigCorrMode=0; + cfg.Read(wxT("Lens/vigCorrMode"), &vigCorrMode); + imgopts.m_vigCorrMode = vigCorrMode; + + wxString flatfield; + bool readok = cfg.Read(wxT("Lens/flatfield"), &flatfield); + imgopts.m_flatfield = std::string((const char *)flatfield.mb_str()); + + // TODO: crop parameters + } // reset locale setlocale(LC_NUMERIC,old_locale); @@ -817,6 +833,18 @@ GlobalCmdHist::getInstance().addCommand( new PT::UpdateImageVariablesCmd(pano, imgNr, vars) ); + + // get all images with the current lens. + UIntSet imgs; + for (unsigned int i = 0; i < pano.getNrOfImages(); i++) { + if (pano.getImage(i).getLensNr() == lensNr) { + imgs.insert(i); + } + } + + // set image options. + GlobalCmdHist::getInstance().addCommand( + new PT::SetImageOptionsCmd(pano, imgopts, imgs) ); } } else { wxLogError(_("Please select an image and try again")); @@ -861,7 +889,6 @@ bool initLensFromFile(const std::string & filename, double &cropFactor, Lens & l) { - if (!l.initFromFile(filename, cropFactor)) { if (cropFactor == -1) { cropFactor = 1; @@ -879,3 +906,6 @@ } return true; } + +char *LensPanel::m_varNames[] = { "v", "a", "b", "c", "d", "e", "g", "t", 0}; + Index: CPZoomDisplayPanel.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/CPZoomDisplayPanel.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- CPZoomDisplayPanel.cpp 17 Jan 2005 01:29:39 -0000 1.8 +++ CPZoomDisplayPanel.cpp 6 Jan 2006 16:02:34 -0000 1.9 @@ -383,6 +383,7 @@ destImage(srcAlpha), Diff2D(0,0), m_t_center2img, + false, vigra_ext::INTERP_CUBIC, dummy); Index: PanoPanel.cpp =================================================================== RCS file: /cvsroot/hugin/hugin/src/hugin/PanoPanel.cpp,v retrieving revision 1.91 retrieving revision 1.92 diff -u -d -r1.91 -r1.92 --- PanoPanel.cpp 15 Dec 2005 16:05:23 -0000 1.91 +++ PanoPanel.cpp 6 Jan 2006 16:02:34 -0000 1.92 @@ -197,7 +197,7 @@ void PanoPanel::UpdateDisplay(const PanoramaOptions & opt) { - switch (opt.projectionFormat) { + switch (opt.getProjection()) { case PanoramaOptions::RECTILINEAR: m_HFOVSpin->SetRange(1,179); m_VFOVSpin->SetRange(1,179); @@ -216,7 +216,7 @@ break; } - m_ProjectionChoice->SetSelection(opt.projectionFormat); + m_ProjectionChoice->SetSelection(opt.getProjection()); m_HFOVSpin->SetValue(roundi(opt.getHFOV())); m_VFOVSpin->SetValue(roundi(opt.getVFOV())); @@ -230,7 +230,7 @@ PanoramaOptions opt = pano.getOptions(); int lt = m_ProjectionChoice->GetSelection(); wxString Ip; - opt.projectionFormat = (PanoramaOptions::ProjectionFormat) lt; + opt.setProjection( (PanoramaOptions::ProjectionFormat) lt ); GlobalCmdHist::getInstance().addCommand( new PT::SetPanoOptionsCmd( pano, opt ) ); |