From d1148539bb32a33986a75f938766206108342d6b Mon Sep 17 00:00:00 2001 From: Daniel Gao Date: Thu, 7 Nov 2024 17:41:18 -0500 Subject: [PATCH] Implement load/save for FramingParams * Implement writing FramingParams to keyfile * Implement reading FramingParams from keyfile --- rtengine/procparams.cc | 178 +++++++++++++++++++++++++++++++++++++++++ rtgui/framing.cc | 12 +++ 2 files changed, 190 insertions(+) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 0a0c9bd68..4dad02ed8 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -427,6 +427,178 @@ bool saveToKeyfile( return false; } +namespace ProfileKeys { + +#define DEFINE_KEY(VAR, NAME) \ + constexpr const char* VAR = NAME; + +DEFINE_KEY(TOOL_ENABLED, "Enabled"); + +namespace Framing +{ + DEFINE_KEY(TOOL_NAME, "Framing"); + + // Fields + DEFINE_KEY(FRAMING_METHOD, "FramingMethod"); + DEFINE_KEY(ASPECT_RATIO, "AspectRatio"); + DEFINE_KEY(ORIENTATION, "Orientation"); + DEFINE_KEY(FRAMED_WIDTH, "FramedWidth"); + DEFINE_KEY(FRAMED_HEIGHT, "FramedHeight"); + DEFINE_KEY(ALLOW_UPSCALING, "AllowUpscaling"); + + DEFINE_KEY(BORDER_SIZING_METHOD, "BorderSizingMethod"); + DEFINE_KEY(BASIS, "Basis"); + DEFINE_KEY(RELATIVE_BORDER_SIZE, "RelativeBorderSize"); + DEFINE_KEY(MIN_SIZE_ENABLED, "MinSizeEnabled"); + DEFINE_KEY(MIN_WIDTH, "MinWidth"); + DEFINE_KEY(MIN_HEIGHT, "MinHeight"); + DEFINE_KEY(ABS_WIDTH, "AbsWidth"); + DEFINE_KEY(ABS_HEIGHT, "AbsHeight"); + + DEFINE_KEY(BORDER_RED, "BorderRed"); + DEFINE_KEY(BORDER_GREEN, "BorderGreen"); + DEFINE_KEY(BORDER_BLUE, "BorderBlue"); + + // Enum mappings + DEFINE_KEY(FRAMING_METHOD_STANDARD, "Standard"); + DEFINE_KEY(FRAMING_METHOD_BBOX, "BoundingBox"); + DEFINE_KEY(FRAMING_METHOD_FIXED_SIZE, "FixedSize"); + DEFINE_KEY(ORIENT_AS_IMAGE, "AsImage"); + DEFINE_KEY(ORIENT_LANDSCAPE, "Landscape"); + DEFINE_KEY(ORIENT_PORTRAIT, "Portait"); + DEFINE_KEY(BORDER_SIZING_PERCENTAGE, "Percentage"); + DEFINE_KEY(BORDER_SIZING_FIXED_SIZE, "FixedSize"); + DEFINE_KEY(BASIS_AUTO, "Auto"); + DEFINE_KEY(BASIS_WIDTH, "Width"); + DEFINE_KEY(BASIS_HEIGHT, "Height"); + DEFINE_KEY(BASIS_LONG, "Long"); + DEFINE_KEY(BASIS_SHORT, "Short"); +} // namespace Framing + +} // namespace ProfileKeys + +void loadFramingParams( + const Glib::KeyFile& keyFile, + rtengine::procparams::FramingParams& params, + FramingParamsEdited& edited +) +{ + using namespace ProfileKeys; + using namespace ProfileKeys::Framing; + using FramingParams = rtengine::procparams::FramingParams; + + const Glib::ustring group{TOOL_NAME}; + if (!keyFile.has_group(group)) return; + + assignFromKeyfile(keyFile, group, TOOL_ENABLED, params.enabled, edited.enabled); + + using FramingMethod = FramingParams::FramingMethod; + const std::map framingMethodMapping = { + {FRAMING_METHOD_STANDARD, FramingMethod::STANDARD}, + {FRAMING_METHOD_BBOX, FramingMethod::BBOX}, + {FRAMING_METHOD_FIXED_SIZE, FramingMethod::FIXED_SIZE} + }; + assignFromKeyfile(keyFile, group, FRAMING_METHOD, framingMethodMapping, params.framingMethod, edited.framingMethod); + assignFromKeyfile(keyFile, group, ASPECT_RATIO, params.aspectRatio, edited.aspectRatio); + using Orientation = FramingParams::Orientation; + const std::map orientationMapping = { + {ORIENT_AS_IMAGE, Orientation::AS_IMAGE}, + {ORIENT_LANDSCAPE, Orientation::LANDSCAPE}, + {ORIENT_PORTRAIT, Orientation::PORTRAIT}, + }; + assignFromKeyfile(keyFile, group, ORIENTATION, orientationMapping, params.orientation, edited.orientation); + assignFromKeyfile(keyFile, group, FRAMED_WIDTH, params.framedWidth, edited.framedWidth); + assignFromKeyfile(keyFile, group, FRAMED_HEIGHT, params.framedHeight, edited.framedHeight); + assignFromKeyfile(keyFile, group, ALLOW_UPSCALING, params.allowUpscaling, edited.allowUpscaling); + + using BorderSizing = FramingParams::BorderSizing; + const std::map borderSizingMapping = { + {BORDER_SIZING_PERCENTAGE, BorderSizing::PERCENTAGE}, + {BORDER_SIZING_FIXED_SIZE, BorderSizing::FIXED_SIZE} + }; + assignFromKeyfile(keyFile, group, BORDER_SIZING_METHOD, borderSizingMapping, params.borderSizingMethod, edited.borderSizingMethod); + using Basis = FramingParams::Basis; + const std::map basisMapping = { + {BASIS_AUTO, Basis::AUTO}, + {BASIS_WIDTH, Basis::WIDTH}, + {BASIS_HEIGHT, Basis::HEIGHT}, + {BASIS_LONG, Basis::LONG}, + {BASIS_SHORT, Basis::SHORT} + }; + assignFromKeyfile(keyFile, group, BASIS, basisMapping, params.basis, edited.basis); + assignFromKeyfile(keyFile, group, RELATIVE_BORDER_SIZE, params.relativeBorderSize, edited.relativeBorderSize); + assignFromKeyfile(keyFile, group, MIN_SIZE_ENABLED, params.minSizeEnabled, edited.minSizeEnabled); + assignFromKeyfile(keyFile, group, MIN_WIDTH, params.minWidth, edited.minWidth); + assignFromKeyfile(keyFile, group, MIN_HEIGHT, params.minHeight, edited.minHeight); + assignFromKeyfile(keyFile, group, ABS_WIDTH, params.absWidth, edited.absWidth); + assignFromKeyfile(keyFile, group, ABS_HEIGHT, params.absHeight, edited.absHeight); + + assignFromKeyfile(keyFile, group, BORDER_RED, params.borderRed, edited.borderRed); + assignFromKeyfile(keyFile, group, BORDER_GREEN, params.borderGreen, edited.borderGreen); + assignFromKeyfile(keyFile, group, BORDER_BLUE, params.borderBlue, edited.borderBlue); +} + +void saveFramingParams( + Glib::KeyFile& keyFile, + const rtengine::procparams::FramingParams& params, + const ParamsEdited* pedited +) +{ + using namespace ProfileKeys; + using namespace ProfileKeys::Framing; + using FramingParams = rtengine::procparams::FramingParams; + + const Glib::ustring group{TOOL_NAME}; + + const FramingParamsEdited& edited = pedited->framing; + + saveToKeyfile(!pedited || edited.enabled, group, TOOL_ENABLED, params.enabled, keyFile); + + using FramingMethod = FramingParams::FramingMethod; + const std::map framingMethodMapping = { + {FramingMethod::STANDARD, FRAMING_METHOD_STANDARD}, + {FramingMethod::BBOX, FRAMING_METHOD_BBOX}, + {FramingMethod::FIXED_SIZE, FRAMING_METHOD_FIXED_SIZE} + }; + saveToKeyfile(!pedited || edited.framingMethod, group, FRAMING_METHOD, framingMethodMapping, params.framingMethod, keyFile); + saveToKeyfile(!pedited || edited.aspectRatio, group, ASPECT_RATIO, params.aspectRatio, keyFile); + using Orientation = FramingParams::Orientation; + const std::map orientationMapping = { + {Orientation::AS_IMAGE, ORIENT_AS_IMAGE}, + {Orientation::LANDSCAPE, ORIENT_LANDSCAPE}, + {Orientation::PORTRAIT, ORIENT_PORTRAIT}, + }; + saveToKeyfile(!pedited || edited.orientation, group, ORIENTATION, orientationMapping, params.orientation, keyFile); + saveToKeyfile(!pedited || edited.framedWidth, group, FRAMED_WIDTH, params.framedWidth, keyFile); + saveToKeyfile(!pedited || edited.framedHeight, group, FRAMED_HEIGHT, params.framedHeight, keyFile); + saveToKeyfile(!pedited || edited.allowUpscaling, group, ALLOW_UPSCALING, params.allowUpscaling, keyFile); + + using BorderSizing = FramingParams::BorderSizing; + const std::map borderSizingMapping = { + {BorderSizing::PERCENTAGE, BORDER_SIZING_PERCENTAGE}, + {BorderSizing::FIXED_SIZE, BORDER_SIZING_FIXED_SIZE} + }; + saveToKeyfile(!pedited || edited.borderSizingMethod, group, BORDER_SIZING_METHOD, borderSizingMapping, params.borderSizingMethod, keyFile); + using Basis = FramingParams::Basis; + const std::map basisMapping = { + {Basis::AUTO, BASIS_AUTO}, + {Basis::WIDTH, BASIS_WIDTH}, + {Basis::HEIGHT, BASIS_HEIGHT}, + {Basis::LONG, BASIS_LONG}, + {Basis::SHORT, BASIS_SHORT} + }; + saveToKeyfile(!pedited || edited.basis, group, BASIS, basisMapping, params.basis, keyFile); + saveToKeyfile(!pedited || edited.relativeBorderSize, group, RELATIVE_BORDER_SIZE, params.relativeBorderSize, keyFile); + saveToKeyfile(!pedited || edited.minSizeEnabled, group, MIN_SIZE_ENABLED, params.minSizeEnabled, keyFile); + saveToKeyfile(!pedited || edited.minWidth, group, MIN_WIDTH, params.minWidth, keyFile); + saveToKeyfile(!pedited || edited.minHeight, group, MIN_HEIGHT, params.minHeight, keyFile); + saveToKeyfile(!pedited || edited.absWidth, group, ABS_WIDTH, params.absWidth, keyFile); + saveToKeyfile(!pedited || edited.absHeight, group, ABS_HEIGHT, params.absHeight, keyFile); + + saveToKeyfile(!pedited || edited.borderRed, group, BORDER_RED, params.borderRed, keyFile); + saveToKeyfile(!pedited || edited.borderGreen, group, BORDER_GREEN, params.borderGreen, keyFile); + saveToKeyfile(!pedited || edited.borderBlue, group, BORDER_BLUE, params.borderBlue, keyFile); +} } // namespace @@ -6401,6 +6573,8 @@ void ProcParams::setDefaults() resize = {}; + framing = {}; + icm = {}; wavelet = {}; @@ -7740,6 +7914,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->resize.shortedge, "Resize", "ShortEdge", resize.shortedge, keyFile); saveToKeyfile(!pedited || pedited->resize.allowUpscaling, "Resize", "AllowUpscaling", resize.allowUpscaling, keyFile); + saveFramingParams(keyFile, framing, pedited); + // Post demosaic sharpening saveToKeyfile(!pedited || pedited->pdsharpening.enabled, "PostDemosaicSharpening", "Enabled", pdsharpening.enabled, keyFile); saveToKeyfile(!pedited || pedited->pdsharpening.contrast, "PostDemosaicSharpening", "Contrast", pdsharpening.contrast, keyFile); @@ -10261,6 +10437,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } + loadFramingParams(keyFile, framing, pedited->framing); + if (keyFile.has_group ("Spot removal")) { assignFromKeyfile(keyFile, "Spot removal", "Enabled", spot.enabled, pedited->spot.enabled); int i = 0; diff --git a/rtgui/framing.cc b/rtgui/framing.cc index eafd9dffc..b687e2508 100644 --- a/rtgui/framing.cc +++ b/rtgui/framing.cc @@ -502,7 +502,9 @@ void Framing::readParams(const rtengine::procparams::ProcParams* pp) aspectRatio->set_active(aspectRatioData->findIndex(params.aspectRatio)); orientation->set_active(mapOrientation(params.orientation)); width.setValue(params.framedWidth); + width.isDirty = false; height.setValue(params.framedHeight); + height.isDirty = false; allowUpscaling->set_active(params.allowUpscaling); borderSizeMethod->set_active(mapBorderSizeMethod(params.borderSizingMethod)); @@ -510,9 +512,13 @@ void Framing::readParams(const rtengine::procparams::ProcParams* pp) relativeBorderSize->setValue(params.relativeBorderSize); minSizeEnabled->set_active(params.minSizeEnabled); minWidth.setValue(params.minWidth); + minWidth.isDirty = false; minHeight.setValue(params.minHeight); + minHeight.isDirty = false; absWidth.setValue(params.absWidth); + absWidth.isDirty = false; absHeight.setValue(params.absHeight); + absHeight.isDirty = false; redAdj->setValue(params.borderRed); greenAdj->setValue(params.borderGreen); @@ -745,10 +751,12 @@ void Framing::onOrientationChanged() void Framing::onWidthChanged() { + width.isDirty = true; } void Framing::onHeightChanged() { + height.isDirty = true; } void Framing::onAllowUpscalingToggled() @@ -771,16 +779,20 @@ void Framing::onMinSizeToggled() void Framing::onMinWidthChanged() { + minWidth.isDirty = true; } void Framing::onMinHeightChanged() { + minHeight.isDirty = true; } void Framing::onAbsWidthChanged() { + absWidth.isDirty = true; } void Framing::onAbsHeightChanged() { + absHeight.isDirty = true; } \ No newline at end of file