#pragma once #include "Document/Curves.h" #include "Document/Filters.h" #include "Document/HueSaturation.h" #include "Document/ImageAdjustments.h" #include "Document/Levels.h" #include #include #include #include // An adjustment layer's kind, in the Layer menu's order. enum class AdjustmentKind { hsv, levels, curves, exposure, gradientMap, grain, addNoise, gaussianBlur, motionBlur, invert, blackWhite, colorBalance }; inline constexpr std::array allAdjustmentKinds{AdjustmentKind::hsv, AdjustmentKind::levels, AdjustmentKind::curves, AdjustmentKind::exposure, AdjustmentKind::gradientMap, AdjustmentKind::grain, AdjustmentKind::addNoise, AdjustmentKind::gaussianBlur, AdjustmentKind::motionBlur, AdjustmentKind::invert, AdjustmentKind::blackWhite, AdjustmentKind::colorBalance}; // Swift's rawValue: the new layer's name and the manifest's word. QString rawValue(AdjustmentKind kind); // The kind a manifest names, or none. std::optional adjustmentKind(const QString &text); // The filter panel that edits it; Levels, Hue/Saturation, Invert: none. std::optional filterKind(AdjustmentKind kind); // Every kind but Invert opens an editor. bool isEditable(AdjustmentKind kind); // An adjustment layer's settings; its kind reads only its own. struct LayerAdjustment { AdjustmentKind kind; double hue = 0; double saturation = 0; double lightness = 0; bool colorize = false; // Absent in projects from before range-aware Hue/Saturation. std::optional hsvSettings = std::nullopt; LevelsSettings levels{}; CurvesSettings curves{}; // Absent unless set, so older kinds save exactly as before. std::optional exposureSettings = std::nullopt; std::optional gradientMapSettings = std::nullopt; std::optional grainSettings = std::nullopt; std::optional blackWhiteSettings = std::nullopt; std::optional colorBalanceSettings = std::nullopt; // Absent in projects from before blur and noise layers. std::optional blurRadius = std::nullopt; std::optional motionAngle = std::nullopt; std::optional motionDistance = std::nullopt; std::optional noiseAmount = std::nullopt; std::optional noiseGaussian = std::nullopt; std::optional noiseMonochromatic = std::nullopt; std::optional noiseSeed = std::nullopt; HueSaturationSettings resolvedHSV() const; // Swift's computed properties over the optional settings. ExposureSettings exposure() const; void setExposure(const ExposureSettings &value); GradientMapSettings gradientMap() const; void setGradientMap(const GradientMapSettings &value); GrainSettings grain() const; void setGrain(const GrainSettings &value); BlackWhiteSettings blackWhite() const; void setBlackWhite(const BlackWhiteSettings &value); ColorBalanceSettings colorBalance() const; void setColorBalance(const ColorBalanceSettings &value); double gaussianRadius() const; void setGaussianRadius(double value); double resolvedMotionAngle() const; void setResolvedMotionAngle(double value); double resolvedMotionDistance() const; void setResolvedMotionDistance(double value); double resolvedNoiseAmount() const; void setResolvedNoiseAmount(double value); bool resolvedNoiseGaussian() const; void setResolvedNoiseGaussian(bool value); bool resolvedNoiseMonochromatic() const; void setResolvedNoiseMonochromatic(bool value); quint32 resolvedNoiseSeed() const; void setResolvedNoiseSeed(quint32 value); // Document pixels a partial redraw reads past its rect. double samplingMargin() const; bool isValid() const; // Region: the document shown; scale: image pixels a document pixel. QImage apply(const QImage &image, std::optional region = std::nullopt, double scale = 1) const; friend bool operator==(const LayerAdjustment &, const LayerAdjustment &) = default; };