From f2853d8742f9b36e60f064f3d6d8baac8d348757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 12 Sep 2017 20:58:20 +0200 Subject: [PATCH] Some little cleanups to `rtlensfun.*` - Sanitize `std::unique_ptr<>` handling - Use `NonCopyable` - Employ `explicit operator bool()` - Correct use of `std::vector::emplace_back()` - Cleanup includes - Streamline implementation order --- rtengine/iptransform.cc | 21 ++++++------ rtengine/rawimagesource.cc | 2 +- rtengine/rtlensfun.cc | 62 ++++++++++++++++++++-------------- rtengine/rtlensfun.h | 69 ++++++++++++++++++++++---------------- 4 files changed, 89 insertions(+), 65 deletions(-) diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index 84464af97..e5f3a7af1 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -319,18 +319,21 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, float focusDist = metadata->getFocusDist(); double fNumber = metadata->getFNumber(); - LensCorrection *pLCPMap = nullptr; + std::unique_ptr pLCPMap; if (needsLensfun()) { - pLCPMap = LFDatabase::findModifier(params->lensProf, metadata, oW, oH, params->coarse, rawRotationDeg); + pLCPMap = std::move(LFDatabase::findModifier(params->lensProf, metadata, oW, oH, params->coarse, rawRotationDeg)); } else if (needsLCP()) { // don't check focal length to allow distortion correction for lenses without chip const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile (params->lensProf.lcpFile); if (pLCPProf) { - pLCPMap = new LCPMapper (pLCPProf, focalLen, focalLen35mm, - focusDist, fNumber, false, - params->lensProf.useDist, - oW, oH, params->coarse, rawRotationDeg); + pLCPMap.reset( + new LCPMapper (pLCPProf, focalLen, focalLen35mm, + focusDist, fNumber, false, + params->lensProf.useDist, + oW, oH, params->coarse, rawRotationDeg + ) + ); } } @@ -345,11 +348,7 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, } else { mode = TRANSFORM_HIGH_QUALITY_FULLIMAGE; } - transformGeneral(mode, original, transformed, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap); - } - - if (pLCPMap) { - delete pLCPMap; + transformGeneral(mode, original, transformed, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get()); } } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 131fc354c..1dd63339c 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1858,7 +1858,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if (!hasFlatField && lensProf.useVign) { std::unique_ptr pmap; if (lensProf.useLensfun) { - pmap.reset(LFDatabase::findModifier(lensProf, idata, W, H, coarse, -1)); + pmap = std::move(LFDatabase::findModifier(lensProf, idata, W, H, coarse, -1)); } else { const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile(lensProf.lcpFile); diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 626d333aa..87a7272e9 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -1,5 +1,5 @@ /* -*- C++ -*- - * + * * This file is part of RawTherapee. * * Copyright (c) 2017 Alberto Griggio @@ -30,14 +30,6 @@ extern const Settings *settings; // LFModifier //----------------------------------------------------------------------------- -LFModifier::LFModifier(lfModifier *m, bool swap_xy, int flags): - data_(m), - swap_xy_(swap_xy), - flags_(flags) -{ -} - - LFModifier::~LFModifier() { if (data_) { @@ -45,7 +37,8 @@ LFModifier::~LFModifier() } } -bool LFModifier::ok() const + +LFModifier::operator bool() const { return data_; } @@ -53,7 +46,7 @@ bool LFModifier::ok() const void LFModifier::correctDistortion(double &x, double &y, int cx, int cy, double scale) const { - if (!ok()) { + if (!data_) { return; } @@ -77,6 +70,17 @@ void LFModifier::correctDistortion(double &x, double &y, int cx, int cy, double } +bool LFModifier::isCACorrectionAvailable() const +{ + return false; +} + + +void LFModifier::correctCA(double &x, double &y, int channel) const +{ +} + + void LFModifier::processVignetteLine(int width, int y, float *line) const { data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_1(INTENSITY), 0); @@ -114,6 +118,14 @@ Glib::ustring LFModifier::getDisplayString() const } +LFModifier::LFModifier(lfModifier *m, bool swap_xy, int flags): + data_(m), + swap_xy_(swap_xy), + flags_(flags) +{ +} + + //----------------------------------------------------------------------------- // LFCamera //----------------------------------------------------------------------------- @@ -124,7 +136,7 @@ LFCamera::LFCamera(): } -bool LFCamera::ok() const +LFCamera::operator bool() const { return data_; } @@ -180,7 +192,7 @@ LFLens::LFLens(): } -bool LFLens::ok() const +LFLens::operator bool() const { return data_; } @@ -274,11 +286,11 @@ std::vector LFDatabase::getCameras() const if (data_) { auto cams = data_->GetCameras(); while (*cams) { - ret.emplace_back(LFCamera()); + ret.emplace_back(); ret.back().data_ = *cams; ++cams; } - } + } return ret; } @@ -289,7 +301,7 @@ std::vector LFDatabase::getLenses() const if (data_) { auto lenses = data_->GetLenses(); while (*lenses) { - ret.emplace_back(LFLens()); + ret.emplace_back(); ret.back().data_ = *lenses; ++lenses; } @@ -317,7 +329,7 @@ LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) c LFLens ret; if (data_) { Glib::ustring lname = name; - bool stdlens = camera.ok() && (name.empty() || name.find("Unknown") == 0); + bool stdlens = camera && (name.empty() || name.find("Unknown") == 0); if (stdlens) { lname = camera.getModel(); // "Standard" } @@ -341,27 +353,27 @@ LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) c } -LFModifier *LFDatabase::getModifier(const LFCamera &camera, const LFLens &lens, +std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, const LFLens &lens, float focalLen, float aperture, float focusDist, int width, int height, bool swap_xy) const { - LFModifier *ret = nullptr; + std::unique_ptr ret; if (data_) { - if (camera.ok() && lens.ok()) { + if (camera && lens) { lfModifier *mod = lfModifier::Create(lens.data_, camera.getCropFactor(), width, height); int flags = LF_MODIFY_DISTORTION | LF_MODIFY_SCALE; if (aperture > 0) { flags |= LF_MODIFY_VIGNETTING; } flags = mod->Initialize(lens.data_, LF_PF_F32, focalLen, aperture, focusDist > 0 ? focusDist : 1000, 0.0, LF_RECTILINEAR, flags, false); - ret = new LFModifier(mod, swap_xy, flags); + ret.reset(new LFModifier(mod, swap_xy, flags)); } } return ret; } -LFModifier *LFDatabase::findModifier(const LensProfParams &lensProf, const ImageMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg) +std::unique_ptr LFDatabase::findModifier(const LensProfParams &lensProf, const ImageMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg) { const LFDatabase *db = getInstance(); Glib::ustring make, model, lens; @@ -394,8 +406,8 @@ LFModifier *LFDatabase::findModifier(const LensProfParams &lensProf, const Image std::swap(width, height); } } - - LFModifier *ret = db->getModifier(c, l, idata->getFocalLen(), idata->getFNumber(), idata->getFocusDist(), width, height, swap_xy); + + std::unique_ptr ret = db->getModifier(c, l, idata->getFocalLen(), idata->getFNumber(), idata->getFocusDist(), width, height, swap_xy); if (settings->verbose) { std::cout << "LENSFUN:\n" @@ -407,6 +419,6 @@ LFModifier *LFDatabase::findModifier(const LensProfParams &lensProf, const Image return ret; } - + } // namespace rtengine diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 1d54d9444..5774968ee 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -1,5 +1,5 @@ /* -*- C++ -*- - * + * * This file is part of RawTherapee. * * Copyright (c) 2017 Alberto Griggio @@ -20,43 +20,52 @@ #pragma once -#include -#include #include +#include + +#include + +#include + #include "lcp.h" +#include "noncopyable.h" #include "procparams.h" namespace rtengine { -class LFModifier: public LensCorrection { +class LFModifier final : + public LensCorrection, + public NonCopyable +{ public: ~LFModifier(); - bool ok() const; - - void correctDistortion(double &x, double &y, int cx, int cy, double scale) const; - bool isCACorrectionAvailable() const { return false; } - void correctCA(double &x, double &y, int channel) const {} - void processVignetteLine(int width, int y, float *line) const; + + explicit operator bool() const; + + void correctDistortion(double &x, double &y, int cx, int cy, double scale) const override; + bool isCACorrectionAvailable() const override; + void correctCA(double &x, double &y, int channel) const override; + void processVignetteLine(int width, int y, float *line) const override; void processVignetteLine3Channels(int width, int y, float *line) const; Glib::ustring getDisplayString() const; - + private: - explicit LFModifier(lfModifier *m, bool swap_xy, int flags); - LFModifier(const LFModifier &); - LFModifier &operator=(const LFModifier &); - + LFModifier(lfModifier *m, bool swap_xy, int flags); + friend class LFDatabase; lfModifier *data_; bool swap_xy_; int flags_; }; -class LFCamera { +class LFCamera final +{ public: LFCamera(); - bool ok() const; - + + explicit operator bool() const; + Glib::ustring getMake() const; Glib::ustring getModel() const; float getCropFactor() const; @@ -68,42 +77,46 @@ private: const lfCamera *data_; }; -class LFLens { +class LFLens final +{ public: LFLens(); - bool ok() const; + + explicit operator bool() const; + Glib::ustring getMake() const; Glib::ustring getLens() const; Glib::ustring getDisplayString() const { return getLens(); } float getCropFactor() const; bool hasVignettingCorrection() const; bool hasDistortionCorrection() const; + private: friend class LFDatabase; const lfLens *data_; }; -class LFDatabase { +class LFDatabase final : + public NonCopyable +{ public: static bool init(); static const LFDatabase *getInstance(); ~LFDatabase(); - + std::vector getCameras() const; std::vector getLenses() const; LFCamera findCamera(const Glib::ustring &make, const Glib::ustring &model) const; LFLens findLens(const LFCamera &camera, const Glib::ustring &name) const; - static LFModifier *findModifier(const LensProfParams &lensProf, const ImageMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg); + static std::unique_ptr findModifier(const LensProfParams &lensProf, const ImageMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg); private: - LFModifier *getModifier(const LFCamera &camera, const LFLens &lens, - float focalLen, float aperture, float focusDist, - int width, int height, bool swap_xy) const; + std::unique_ptr getModifier(const LFCamera &camera, const LFLens &lens, + float focalLen, float aperture, float focusDist, + int width, int height, bool swap_xy) const; LFDatabase(); - LFDatabase(const LFDatabase &); - LFDatabase &operator=(const LFDatabase &); static LFDatabase instance_; lfDatabase *data_; };