Committing patch from issue 1240: "Partial profile handling"

This commit is contained in:
natureh 2012-02-26 03:23:08 +01:00
parent c21fa69aea
commit dd93fff44c
60 changed files with 2243 additions and 2214 deletions

View File

@ -731,10 +731,14 @@ PROFILEPANEL_PLASTPHOTO;Photo précédente
PROFILEPANEL_PLASTSAVED;Dernière sauvegarde PROFILEPANEL_PLASTSAVED;Dernière sauvegarde
PROFILEPANEL_PROFILE;Profil PROFILEPANEL_PROFILE;Profil
PROFILEPANEL_SAVEDLGLABEL;Enregistrer les paramètres de post-traitement... PROFILEPANEL_SAVEDLGLABEL;Enregistrer les paramètres de post-traitement...
PROFILEPANEL_TOOLTIPCOPY;Copie le profil courant dans le presse-papier PROFILEPANEL_COPYPPASTE;Paramètres à copier
PROFILEPANEL_TOOLTIPLOAD;Charger un profil depuis un fichier PROFILEPANEL_LOADPPASTE;Paramètres à charger
PROFILEPANEL_TOOLTIPPASTE; Colle le profil depuis le presse-papier PROFILEPANEL_PASTEPPASTE;Paramètres à coller
PROFILEPANEL_TOOLTIPSAVE;Enregistrer le profil actuel PROFILEPANEL_SAVEPPASTE;Paramètres à enregistrer
PROFILEPANEL_TOOLTIPCOPY;Copie le profil courant dans le presse-papier\nCTRL-clic pour sélectionner les paramètres à copier
PROFILEPANEL_TOOLTIPLOAD;Charger un profil depuis un fichier\nCTRL-clic pour sélectionner les paramètres à charger
PROFILEPANEL_TOOLTIPPASTE;Colle le profil depuis le presse-papier\nCTRL-clic pour sélectionner les paramètres à coller
PROFILEPANEL_TOOLTIPSAVE;Enregistrer le profil actuel\nCTRL-clic pour sélectionner les paramètres à enregistrer
PROGRESSBAR_BADPIXELS;Pixels chauds/morts... PROGRESSBAR_BADPIXELS;Pixels chauds/morts...
PROGRESSBAR_CACORRECTION;Correction de l'aberr. chomatique... PROGRESSBAR_CACORRECTION;Correction de l'aberr. chomatique...
PROGRESSBAR_DARKFRAME;Trame Noire... PROGRESSBAR_DARKFRAME;Trame Noire...
@ -808,6 +812,7 @@ TP_COLORSHIFT_GREENMAGENTA;Vert-Magenta
TP_COLORSHIFT_LABEL;Décalage couleur TP_COLORSHIFT_LABEL;Décalage couleur
TP_CROP_FIXRATIO;Ratio fixe: TP_CROP_FIXRATIO;Ratio fixe:
TP_CROP_GTDIAGONALS;Règle des diagonales TP_CROP_GTDIAGONALS;Règle des diagonales
TP_CROP_GTEPASSPORT;Passeport biométrique
TP_CROP_GTGRID;Grille TP_CROP_GTGRID;Grille
TP_CROP_GTHARMMEANS1;Manière harmonique 1 TP_CROP_GTHARMMEANS1;Manière harmonique 1
TP_CROP_GTHARMMEANS2;Manière harmonique 2 TP_CROP_GTHARMMEANS2;Manière harmonique 2
@ -927,6 +932,7 @@ TP_PERSPECTIVE_LABEL;Perspective
TP_PERSPECTIVE_VERTICAL;Verticale TP_PERSPECTIVE_VERTICAL;Verticale
TP_PREPROCESS_GREENEQUIL;Équilibrage du vert TP_PREPROCESS_GREENEQUIL;Équilibrage du vert
TP_PREPROCESS_HOTDEADPIXFILT;Filtrer les pixels chauds/morts TP_PREPROCESS_HOTDEADPIXFILT;Filtrer les pixels chauds/morts
TP_PREPROCESS_HOTDEADPIXTHRESH;Seuil de détection des pixels morts
TP_PREPROCESS_LABEL;Traitement pre-dématriçage TP_PREPROCESS_LABEL;Traitement pre-dématriçage
TP_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne TP_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne
TP_PREPROCESS_NO_FOUND;Aucun trouvé TP_PREPROCESS_NO_FOUND;Aucun trouvé

View File

@ -748,10 +748,14 @@ PROFILEPANEL_PLASTPHOTO;Last Photo
PROFILEPANEL_PLASTSAVED;Last Saved PROFILEPANEL_PLASTSAVED;Last Saved
PROFILEPANEL_PROFILE;Profile PROFILEPANEL_PROFILE;Profile
PROFILEPANEL_SAVEDLGLABEL;Save Postprocessing Parameters... PROFILEPANEL_SAVEDLGLABEL;Save Postprocessing Parameters...
PROFILEPANEL_TOOLTIPCOPY;Copy current profile to clipboard PROFILEPANEL_COPYPPASTE;Parameters to copy
PROFILEPANEL_TOOLTIPLOAD;Load a profile from file PROFILEPANEL_LOADPPASTE;Parameters to load
PROFILEPANEL_TOOLTIPPASTE; Paste profile from clipboard PROFILEPANEL_PASTEPPASTE;Parameters to paste
PROFILEPANEL_TOOLTIPSAVE;Save current profile PROFILEPANEL_SAVEPPASTE;Parameters to save
PROFILEPANEL_TOOLTIPCOPY;Copy current profile to clipboard\nCTRL-click to select the parameters to copy
PROFILEPANEL_TOOLTIPLOAD;Load a profile from file\nCTRL-click to select the parameters to load
PROFILEPANEL_TOOLTIPPASTE;Paste profile from clipboard\nCTRL-click key to select the parameters to paste
PROFILEPANEL_TOOLTIPSAVE;Save current profile\nCTRL-click key to select the parameters to save
PROGRESSBAR_BADPIXELS;Bad pixels... PROGRESSBAR_BADPIXELS;Bad pixels...
PROGRESSBAR_CACORRECTION;CA correction... PROGRESSBAR_CACORRECTION;CA correction...
PROGRESSBAR_DARKFRAME;Darkframe... PROGRESSBAR_DARKFRAME;Darkframe...
@ -955,6 +959,7 @@ TP_PERSPECTIVE_LABEL;Perspective
TP_PERSPECTIVE_VERTICAL;Vertical TP_PERSPECTIVE_VERTICAL;Vertical
TP_PREPROCESS_GREENEQUIL;Green equilibration TP_PREPROCESS_GREENEQUIL;Green equilibration
TP_PREPROCESS_HOTDEADPIXFILT;Apply hot/dead pixel filter TP_PREPROCESS_HOTDEADPIXFILT;Apply hot/dead pixel filter
TP_PREPROCESS_HOTDEADPIXTHRESH;Hot/dead pixel detection threshold
TP_PREPROCESS_LABEL;Preprocessing TP_PREPROCESS_LABEL;Preprocessing
TP_PREPROCESS_LINEDENOISE;Line noise filter TP_PREPROCESS_LINEDENOISE;Line noise filter
TP_PREPROCESS_NO_FOUND;None found TP_PREPROCESS_NO_FOUND;None found
@ -1101,4 +1106,5 @@ ZOOMPANEL_ZOOMFITSCREEN;Fit to screen <b>F</b>
ZOOMPANEL_ZOOMIN;Zoom In <b>+</b> ZOOMPANEL_ZOOMIN;Zoom In <b>+</b>
ZOOMPANEL_ZOOMOUT;Zoom Out <b>-</b> ZOOMPANEL_ZOOMOUT;Zoom Out <b>-</b>
#00 default translation file #00 default translation file
#01 Developers should add translations to this file and then run 'generateDifferences.sh' script to update other locales. #01 Developers should add translations to this file and then run 'generateTranslationDiffs' script to update other locales.
#02 WARNING: This script works on Linux only

View File

@ -19,7 +19,7 @@ Black=0
HighlightCompr=0 HighlightCompr=0
HighlightComprThreshold=33 HighlightComprThreshold=33
ShadowCompr=50 ShadowCompr=50
Curve=1;0;0;0.040000000000000015;0.029999999999999995;0.17684498029510265;0.21732319394192093;0.70232558139534862;0.74883720930232545;1;1; Curve=1;0;0;0.04;0.03;0.17684498029510265;0.21732319394192093;0.70232558139534862;0.74883720930232545;1;1;
[Channel Mixer] [Channel Mixer]
Red=100;0;0; Red=100;0;0;
@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4281
H=2871
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4281
H=2871
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,21 +74,11 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1.0 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
Threshold=50 Threshold=50
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4276
H=2836
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4276
Height=2836
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,21 +74,11 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1.0 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
Threshold=50 Threshold=50
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4276
H=2836
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4276
Height=2836
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4281
H=2871
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4281
H=2871
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4281
H=2871
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -11,7 +11,7 @@ InTrash=false
[Exposure] [Exposure]
Auto=true Auto=true
Clip=0 Clip=0
Compensation=-0 Compensation=0.0
Brightness=0 Brightness=0
Contrast=0 Contrast=0
Saturation=0 Saturation=0
@ -74,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5745 Temperature=5745
Green=1.0353332844067824 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -106,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -125,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4276
H=2836
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1.0
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -202,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -74,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5745 Temperature=5745
Green=1.0349999999999993 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -106,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -125,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4276
H=2836
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1.0
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4276
Height=2836
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -202,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=true Enabled=true
@ -97,15 +96,6 @@ Gamma=1.2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4281
H=2871
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=true Enabled=true
@ -97,15 +96,6 @@ Gamma=1.2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4281
H=2871
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5000 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4281
H=2871
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -0,0 +1,216 @@
[Version]
AppVersion=4.0.6
Version=301
[General]
Rank=0
ColorLabel=0
InTrash=false
[Exposure]
Auto=false
Clip=0.0000
Compensation=0
Brightness=0
Contrast=0
Saturation=0
Black=0
HighlightCompr=0
HighlightComprThreshold=0
ShadowCompr=0
Curve=0;
[Channel Mixer]
Red=100;0;0;
Green=0;100;0;
Blue=0;0;100;
[Luminance Curve]
Brightness=0
Contrast=0
Saturation=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=50
LCurve=0;
aCurve=0;
bCurve=0;
[Sharpening]
Enabled=false
Method=usm
Radius=0.5
Amount=125
Threshold=512
OnlyEdges=false
EdgedetectionRadius=1.9
EdgeTolerance=1800
HalocontrolEnabled=false
HalocontrolAmount=85
DeconvRadius=0.75
DeconvAmount=75
DeconvDamping=20
DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge]
Enabled=false
Passes=2
Strength=50
ThreeChannels=false
[SharpenMicro]
Enabled=false
Matrix=false
Strength=20
Uniformity=50
[White Balance]
Setting=Camera
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=false
Threshold=50
[Defringing]
Enabled=false
Radius=2.0
Threshold=25
[Directional Pyramid Denoising]
Enabled=false
Luma=5
Chroma=5
Gamma=2
LumCurve=0;
ChromCurve=0;
[Shadows & Highlights]
Enabled=false
HighQuality=false
Highlights=10
HighlightTonalWidth=80
Shadows=10
ShadowTonalWidth=80
LocalContrast=0
Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4276
H=2836
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations]
AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery]
Enabled=false
Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4276
Height=2836
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
WorkingProfile=sRGB
OutputProfile=RT_sRGB
Gammafree=default
Freegamma=false
GammaValue=2.22
GammaSlope=4.5
[Directional Pyramid Equalizer]
Enabled=false
Mult0=1
Mult1=1
Mult2=1
Mult3=1
Mult4=0.2
[HSV Equalizer]
HCurve=0;
SCurve=0;
VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false
CARed=0
CABlue=0
HotDeadPixels=false
HotDeadPixelThresh=40
LineDenoise=0
GreenEqThreshold=0
CcSteps=1
Method=amaze
DCBIterations=2
DCBEnhance=false
ALLEnhance=false
PreExposure=1
PrePreserv=0
PreBlackzero=0
PreBlackone=0
PreBlacktwo=0
PreBlackthree=0
PreTwoGreen=true

View File

@ -53,6 +53,15 @@ DeconvAmount=75
DeconvDamping=20 DeconvDamping=20
DeconvIterations=30 DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge] [SharpenEdge]
Enabled=false Enabled=false
Passes=2 Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20 Strength=20
Uniformity=50 Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance] [White Balance]
Setting=Camera Setting=Camera
Temperature=5200 Temperature=5745
Green=1 Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising] [Impulse Denoising]
Enabled=false Enabled=false
@ -86,7 +85,7 @@ Threshold=50
[Defringing] [Defringing]
Enabled=false Enabled=false
Radius=2 Radius=2.0
Threshold=25 Threshold=25
[Directional Pyramid Denoising] [Directional Pyramid Denoising]
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0; LumCurve=0;
ChromCurve=0; ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights] [Shadows & Highlights]
Enabled=false Enabled=false
HighQuality=false HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0 LocalContrast=0
Radius=30 Radius=30
[Crop]
Enabled=false
X=0
Y=0
W=4276
H=2836
FixedRatio=false
Ratio=3:2
Orientation=Landscape
Guide=None
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations] [Common Properties for Transformations]
AutoFill=false AutoFill=false
[Rotation]
Degree=0
[Distortion]
Amount=0
UseLensFun=false
[Perspective]
Horizontal=0
Vertical=0
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[HLRecovery] [HLRecovery]
Enabled=false Enabled=false
Method=Blend Method=Blend
[Resize]
Enabled=false
Scale=1
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4276
Height=2836
[Color Management] [Color Management]
InputProfile=(cameraICC) InputProfile=(cameraICC)
BlendCMSMatrix=true BlendCMSMatrix=true
@ -193,13 +136,12 @@ HCurve=0;
SCurve=0; SCurve=0;
VCurve=0; VCurve=0;
[RGB Curves]
rCurve=0;
gCurve=0;
bCurve=0;
[RAW] [RAW]
DarkFrame=
DarkFrameAuto=false
FlatFieldFile=
FlatFieldAutoSelect=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
CA=false CA=false
CARed=0 CARed=0
CABlue=0 CABlue=0

View File

@ -277,9 +277,9 @@ ImageData::~ImageData () {
iptc_data_free (iptc); iptc_data_free (iptc);
} }
const std::vector<procparams::IPTCPair> ImageData::getIPTCData () const { const procparams::IPTCPairs ImageData::getIPTCData () const {
std::vector<procparams::IPTCPair> iptcc; procparams::IPTCPairs iptcc;
if (!iptc) if (!iptc)
return iptcc; return iptcc;
@ -288,31 +288,28 @@ const std::vector<procparams::IPTCPair> ImageData::getIPTCData () const {
IptcDataSet* ds = iptc_data_get_next_dataset (iptc, NULL, IPTC_RECORD_APP_2, strTags[i].tag); IptcDataSet* ds = iptc_data_get_next_dataset (iptc, NULL, IPTC_RECORD_APP_2, strTags[i].tag);
if (ds) { if (ds) {
iptc_dataset_get_data (ds, buffer, 2100); iptc_dataset_get_data (ds, buffer, 2100);
procparams::IPTCPair ic; std::vector<Glib::ustring> icValues;
ic.field = strTags[i].field; icValues.push_back (safe_locale_to_utf8((char*)buffer));
ic.values.push_back (safe_locale_to_utf8((char*)buffer));
iptcc.push_back (ic); iptcc[strTags[i].field] = icValues;
iptc_dataset_unref (ds); iptc_dataset_unref (ds);
} }
} }
IptcDataSet* ds = NULL; IptcDataSet* ds = NULL;
procparams::IPTCPair ickw; std::vector<Glib::ustring> keywords;
ickw.field = "Keywords";
while ((ds=iptc_data_get_next_dataset (iptc, ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS))) { while ((ds=iptc_data_get_next_dataset (iptc, ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS))) {
iptc_dataset_get_data (ds, buffer, 2100); iptc_dataset_get_data (ds, buffer, 2100);
ickw.values.push_back (safe_locale_to_utf8((char*)buffer)); keywords.push_back (safe_locale_to_utf8((char*)buffer));
} }
iptcc.push_back (ickw); iptcc["Keywords"] = keywords;
ds = NULL; ds = NULL;
procparams::IPTCPair icsc; std::vector<Glib::ustring> suppCategories;
icsc.field = "SupplementalCategories";
while ((ds=iptc_data_get_next_dataset (iptc, ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY))) { while ((ds=iptc_data_get_next_dataset (iptc, ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY))) {
iptc_dataset_get_data (ds, buffer, 2100); iptc_dataset_get_data (ds, buffer, 2100);
icsc.values.push_back (safe_locale_to_utf8((char*)buffer)); suppCategories.push_back (safe_locale_to_utf8((char*)buffer));
iptc_dataset_unref (ds); iptc_dataset_unref (ds);
} }
iptcc.push_back (icsc); iptcc["SupplementalCategories"] = suppCategories;
return iptcc; return iptcc;
} }

View File

@ -55,7 +55,7 @@ class ImageData : public ImageMetaData {
virtual ~ImageData (); virtual ~ImageData ();
const rtexif::TagDirectory* getExifData () const { return root; } const rtexif::TagDirectory* getExifData () const { return root; }
const std::vector<procparams::IPTCPair> getIPTCData () const; const procparams::IPTCPairs getIPTCData () const;
bool hasExif () const { return root && root->getCount(); } bool hasExif () const { return root && root->getCount(); }
bool hasIPTC () const { return iptc; } bool hasIPTC () const { return iptc; }

View File

@ -61,14 +61,17 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot) {
} }
// For merging with RT specific data // For merging with RT specific data
void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const std::vector<ExifPair>& exif, const std::vector<IPTCPair>& iptcc) { void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const rtengine::procparams::ExifPairs& exif, const rtengine::procparams::IPTCPairs& iptcc) {
// store exif info // store exif info
exifChange.resize (exif.size()); exifChange.clear();
for (int i=0; i<exif.size(); i++) { exifChange = exif;
exifChange[i].first = exif[i].field; /*unsigned int j=0;
exifChange[i].second = exif[i].value; for (rtengine::procparams::ExifPairs::const_iterator i=exif.begin(); i!=exif.end(); i++) {
} exifChange.at(j).first = i->first;
exifChange.at(j).second = i->second;
j++;
}*/
if (exifRoot!=NULL) { delete exifRoot; exifRoot = NULL; } if (exifRoot!=NULL) { delete exifRoot; exifRoot = NULL; }
@ -82,23 +85,23 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const std::vector<
return; return;
iptc = iptc_data_new (); iptc = iptc_data_new ();
for (int i=0; i<iptcc.size(); i++) { for (rtengine::procparams::IPTCPairs::const_iterator i=iptcc.begin(); i!=iptcc.end(); i++) {
if (iptcc[i].field == "Keywords" && !(iptcc[i].values.empty())) { if (i->first == "Keywords" && !(i->second.empty())) {
for (int j=0; j<iptcc[i].values.size(); j++) { for (unsigned int j=0; j<i->second.size(); j++) {
IptcDataSet * ds = iptc_dataset_new (); IptcDataSet * ds = iptc_dataset_new ();
iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS);
std::string loc = safe_locale_to_utf8(iptcc[i].values[j]); std::string loc = safe_locale_to_utf8(i->second.at(j));
iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), MIN(64,loc.size()), IPTC_DONT_VALIDATE); iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), MIN(64,loc.size()), IPTC_DONT_VALIDATE);
iptc_data_add_dataset (iptc, ds); iptc_data_add_dataset (iptc, ds);
iptc_dataset_unref (ds); iptc_dataset_unref (ds);
} }
continue; continue;
} }
else if (iptcc[i].field == "SupplementalCategories" && !(iptcc[i].values.empty())) { else if (i->first == "SupplementalCategories" && !(i->second.empty())) {
for (int j=0; j<iptcc[i].values.size(); j++) { for (unsigned int j=0; j<i->second.size(); j++) {
IptcDataSet * ds = iptc_dataset_new (); IptcDataSet * ds = iptc_dataset_new ();
iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY);
std::string loc = safe_locale_to_utf8(iptcc[i].values[j]); std::string loc = safe_locale_to_utf8(i->second.at(j));
iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), MIN(32,loc.size()), IPTC_DONT_VALIDATE); iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), MIN(32,loc.size()), IPTC_DONT_VALIDATE);
iptc_data_add_dataset (iptc, ds); iptc_data_add_dataset (iptc, ds);
iptc_dataset_unref (ds); iptc_dataset_unref (ds);
@ -106,10 +109,10 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const std::vector<
continue; continue;
} }
for (int j=0; j<16; j++) for (int j=0; j<16; j++)
if (iptcc[i].field == strTags[j].field && !(iptcc[i].values.empty())) { if (i->first == strTags[j].field && !(i->second.empty())) {
IptcDataSet * ds = iptc_dataset_new (); IptcDataSet * ds = iptc_dataset_new ();
iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, strTags[j].tag); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, strTags[j].tag);
std::string loc = safe_locale_to_utf8(iptcc[i].values[0]); std::string loc = safe_locale_to_utf8(i->second.at(0));
iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), MIN(strTags[j].size,loc.size()), IPTC_DONT_VALIDATE); iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), MIN(strTags[j].size,loc.size()), IPTC_DONT_VALIDATE);
iptc_data_add_dataset (iptc, ds); iptc_data_add_dataset (iptc, ds);
iptc_dataset_unref (ds); iptc_dataset_unref (ds);
@ -243,7 +246,7 @@ int ImageIO::loadPNG (Glib::ustring fname) {
png_read_row (png, (png_byte*)row, NULL); png_read_row (png, (png_byte*)row, NULL);
if (bit_depth==16) { // convert scanline to host byte order if (bit_depth==16) { // convert scanline to host byte order
unsigned short* srow = (unsigned short*)row; unsigned short* srow = (unsigned short*)row;
for (int j=0; j<width*3; j++) for (unsigned int j=0; j<width*3; j++)
srow[j] = ntohs (srow[j]); srow[j] = ntohs (srow[j]);
} }
setScanline (i, row, bit_depth); setScanline (i, row, bit_depth);
@ -565,7 +568,7 @@ int ImageIO::savePNG (Glib::ustring fname, int compression, volatile int bps) {
unsigned char *row = new unsigned char [rowlen]; unsigned char *row = new unsigned char [rowlen];
png_write_info(png,info); png_write_info(png,info);
for (unsigned int i=0;i<height;i++) { for (int i=0;i<height;i++) {
getScanline (i, row, bps); getScanline (i, row, bps);
if (bps==16) { if (bps==16) {
// convert to network byte order // convert to network byte order
@ -892,7 +895,7 @@ void png_flush(png_structp png_ptr) {
int ImageIO::load (Glib::ustring fname) { int ImageIO::load (Glib::ustring fname) {
int lastdot = fname.find_last_of ('.'); unsigned int lastdot = fname.find_last_of ('.');
if( Glib::ustring::npos == lastdot ) if( Glib::ustring::npos == lastdot )
return IMIO_FILETYPENOTSUPPORTED; return IMIO_FILETYPENOTSUPPORTED;
if (!fname.casefold().compare (lastdot, 4, ".png")) if (!fname.casefold().compare (lastdot, 4, ".png"))
@ -906,7 +909,7 @@ int ImageIO::load (Glib::ustring fname) {
int ImageIO::save (Glib::ustring fname) { int ImageIO::save (Glib::ustring fname) {
int lastdot = fname.find_last_of ('.'); unsigned int lastdot = fname.find_last_of ('.');
if( Glib::ustring::npos == lastdot ) if( Glib::ustring::npos == lastdot )
return IMIO_FILETYPENOTSUPPORTED; return IMIO_FILETYPENOTSUPPORTED;
if (!fname.casefold().compare (lastdot, 4, ".png")) if (!fname.casefold().compare (lastdot, 4, ".png"))

View File

@ -44,7 +44,7 @@ class ImageIO {
int profileLength; int profileLength;
char* loadedProfileData; char* loadedProfileData;
int loadedProfileLength; int loadedProfileLength;
std::vector<std::pair<std::string,std::string> > exifChange; procparams::ExifPairs exifChange;
IptcData* iptc; IptcData* iptc;
const rtexif::TagDirectory* exifRoot; const rtexif::TagDirectory* exifRoot;
Glib::Mutex imutex; Glib::Mutex imutex;
@ -83,7 +83,7 @@ class ImageIO {
void getEmbeddedProfileData (int& length, unsigned char*& pdata) { length = loadedProfileLength; pdata = (unsigned char*)loadedProfileData; } void getEmbeddedProfileData (int& length, unsigned char*& pdata) { length = loadedProfileLength; pdata = (unsigned char*)loadedProfileData; }
void setMetadata (const rtexif::TagDirectory* eroot); void setMetadata (const rtexif::TagDirectory* eroot);
void setMetadata (const rtexif::TagDirectory* eroot, const std::vector<rtengine::procparams::ExifPair>& exif, const std::vector<rtengine::procparams::IPTCPair>& iptcc); void setMetadata (const rtexif::TagDirectory* eroot, const rtengine::procparams::ExifPairs& exif, const rtengine::procparams::IPTCPairs& iptcc);
void setOutputProfile (char* pdata, int plen); void setOutputProfile (char* pdata, int plen);
Glib::Mutex& mutex () { return imutex; } Glib::Mutex& mutex () { return imutex; }
}; };

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,8 @@
#include <glibmm.h> #include <glibmm.h>
#include <vector> #include <vector>
class ParamsEdited;
namespace rtengine { namespace rtengine {
namespace procparams { namespace procparams {
@ -126,14 +128,14 @@ class VibranceParams {
/** /**
* Parameters of the color boost * Parameters of the color boost
*/ */
class ColorBoostParams { /*class ColorBoostParams {
public: public:
int amount; int amount;
bool avoidclip; bool avoidclip;
bool enable_saturationlimiter; bool enable_saturationlimiter;
double saturationlimit; double saturationlimit;
}; };*/
/** /**
* Parameters of the white balance adjustments * Parameters of the white balance adjustments
@ -179,36 +181,35 @@ class WBParams {
/** /**
* Parameters of the color shift * Parameters of the color shift
*/ */
class ColorShiftParams { /*class ColorShiftParams {
public: public:
double a; double a;
double b; double b;
}; };*/
/** /**
* Parameters of the luminance denoising * Parameters of the luminance denoising
*/ */
class LumaDenoiseParams { /*class LumaDenoiseParams {
public: public:
bool enabled; bool enabled;
double radius; double radius;
int edgetolerance; int edgetolerance;
}; };*/
/** /**
* Parameters of the color denoising * Parameters of the color denoising
*/ */
class ColorDenoiseParams { /*class ColorDenoiseParams {
public: public:
bool enabled; bool enabled;
double radius;
int edgetolerance; int edgetolerance;
bool edgesensitive; bool edgesensitive;
int amount; int amount;
}; };*/
/** /**
* Parameters of defringing * Parameters of defringing
@ -243,8 +244,6 @@ class ColorDenoiseParams {
int luma; int luma;
int chroma; int chroma;
float gamma; float gamma;
std::vector<double> lumcurve;
std::vector<double> chromcurve;
}; };
//EPD related parameters. //EPD related parameters.
@ -420,24 +419,14 @@ class ColorManagementParams {
}; };
/** /**
* A class representing a key/value for the exif metadata information * Typedef for representing a key/value for the exif metadata information
*/ */
class ExifPair { typedef std::map<Glib::ustring, Glib::ustring> ExifPairs;
public:
Glib::ustring field;
Glib::ustring value;
};
/** /**
* The IPTC key/value pairs * The IPTC key/value pairs
*/ */
class IPTCPair { typedef std::map<Glib::ustring, std::vector<Glib::ustring> > IPTCPairs;
public:
Glib::ustring field;
std::vector<Glib::ustring> values;
};
/** /**
* Directional pyramid equalizer params * Directional pyramid equalizer params
@ -522,11 +511,11 @@ class ProcParams {
SharpenEdgeParams sharpenEdge; ///< Sharpen edge parameters SharpenEdgeParams sharpenEdge; ///< Sharpen edge parameters
SharpenMicroParams sharpenMicro; ///< Sharpen microcontrast parameters SharpenMicroParams sharpenMicro; ///< Sharpen microcontrast parameters
VibranceParams vibrance; ///< Vibrance parameters VibranceParams vibrance; ///< Vibrance parameters
ColorBoostParams colorBoost; ///< Color boost parameters //ColorBoostParams colorBoost; ///< Color boost parameters
WBParams wb; ///< White balance parameters WBParams wb; ///< White balance parameters
ColorShiftParams colorShift; ///< Color shift parameters //ColorShiftParams colorShift; ///< Color shift parameters
LumaDenoiseParams lumaDenoise; ///< Luminance denoising parameters //LumaDenoiseParams lumaDenoise; ///< Luminance denoising parameters
ColorDenoiseParams colorDenoise; ///< Color denoising parameters //ColorDenoiseParams colorDenoise; ///< Color denoising parameters
DefringeParams defringe; ///< Defringing parameters DefringeParams defringe; ///< Defringing parameters
ImpulseDenoiseParams impulseDenoise; ///< Impulse denoising parameters ImpulseDenoiseParams impulseDenoise; ///< Impulse denoising parameters
DirPyrDenoiseParams dirpyrDenoise; ///< Directional Pyramid denoising parameters DirPyrDenoiseParams dirpyrDenoise; ///< Directional Pyramid denoising parameters
@ -544,19 +533,19 @@ class ProcParams {
HRecParams hlrecovery; ///< Highlight recovery parameters HRecParams hlrecovery; ///< Highlight recovery parameters
ResizeParams resize; ///< Resize parameters ResizeParams resize; ///< Resize parameters
ColorManagementParams icm; ///< profiles/color spaces used during the image processing ColorManagementParams icm; ///< profiles/color spaces used during the image processing
ColorManagementParams gam; ///< profiles/color spaces used during the image processing
RAWParams raw; ///< RAW parameters before demosaicing RAWParams raw; ///< RAW parameters before demosaicing
DirPyrEqualizerParams dirpyrequalizer; ///< directional pyramid equalizer parameters DirPyrEqualizerParams dirpyrequalizer; ///< directional pyramid equalizer parameters
HSVEqualizerParams hsvequalizer; ///< hsv equalizer parameters HSVEqualizerParams hsvequalizer; ///< hsv equalizer parameters
std::vector<ExifPair> exif; ///< List of modifications appplied on the exif tags of the input image
std::vector<IPTCPair> iptc; ///< The IPTC tags and values to be saved to the output image
char rank; ///< Custom image quality ranking char rank; ///< Custom image quality ranking
char colorlabel; ///< Custom color label char colorlabel; ///< Custom color label
bool inTrash; ///< Marks deleted image bool inTrash; ///< Marks deleted image
Glib::ustring appVersion; ///< Version of the application that generated the parameters Glib::ustring appVersion; ///< Version of the application that generated the parameters
int ppVersion; ///< Version of the PP file from which the parameters have been read int ppVersion; ///< Version of the PP file from which the parameters have been read
ExifPairs exif; ///< List of modifications appplied on the exif tags of the input image
IPTCPairs iptc; ///< The IPTC tags and values to be saved to the output image
/** /**
* The constructor only sets the hand-wired defaults. * The constructor only sets the hand-wired defaults.
*/ */
@ -570,15 +559,17 @@ class ProcParams {
* save the same file in two different location, i.e. the cache and the image's directory * save the same file in two different location, i.e. the cache and the image's directory
* @param fname the name of the first file (can be an empty string) * @param fname the name of the first file (can be an empty string)
* @param fname2 the name of the second file (can be an empty string) (optional) * @param fname2 the name of the second file (can be an empty string) (optional)
* @param pedited pointer to a ParamsEdited object (optional) to store which values has to be saved
* @return Error code (=0 if all supplied filenames where created correctly) * @return Error code (=0 if all supplied filenames where created correctly)
*/ */
int save (Glib::ustring fname, Glib::ustring fname2 = "") const; int save (Glib::ustring fname, Glib::ustring fname2 = "", ParamsEdited* pedited=NULL) const;
/** /**
* Loads the parameters from a file. * Loads the parameters from a file.
* @param fname the name of the file * @param fname the name of the file
* @params pedited pointer to a ParamsEdited object (optional) to store which values has been loaded
* @return Error code (=0 if no error) * @return Error code (=0 if no error)
*/ */
int load (Glib::ustring fname); int load (Glib::ustring fname, ParamsEdited* pedited=NULL);
/** Creates a new instance of ProcParams. /** Creates a new instance of ProcParams.
* @return a pointer to the new ProcParams instance. */ * @return a pointer to the new ProcParams instance. */
@ -603,6 +594,32 @@ class ProcParams {
int write (Glib::ustring &fname, Glib::ustring &content) const; int write (Glib::ustring &fname, Glib::ustring &content) const;
}; };
/**
* This class associate a ProcParams object and a ParamEdited object through a pointer
* to instance of each type in order to handle partial pp3 file loading (and later maybe
* saving too)
*
* PartialProfile is not responsible of ProcParams and ParamsEdited object creation
* and hence is not responsible of their destructions. The function that instanciate
* PartialProfile object has to handle all this itself.
*/
class PartialProfile {
public:
rtengine::procparams::ProcParams* pparams;
ParamsEdited* pedited;
PartialProfile& operator=(PartialProfile& rhs) { pparams=rhs.pparams; pedited=rhs.pedited; return *this; };
PartialProfile (bool createInstance=false);
PartialProfile (ProcParams* pp, ParamsEdited* pe=NULL, bool fullCopy=false);
PartialProfile (const ProcParams* pp, const ParamsEdited* pe=NULL);
void deleteInstance ();
void clearGeneral ();
int load (Glib::ustring fName);
void set (bool v);
void applyTo (ProcParams *destParams) const ;
};
} }
} }
#endif #endif

View File

@ -58,7 +58,7 @@ namespace rtengine {
virtual bool hasIPTC () const =0; virtual bool hasIPTC () const =0;
/** Returns the directory of IPTC tags. /** Returns the directory of IPTC tags.
* @return The directory of IPTC tags */ * @return The directory of IPTC tags */
virtual const std::vector<procparams::IPTCPair> getIPTCData () const =0; virtual const procparams::IPTCPairs getIPTCData () const =0;
/** @return a struct containing the date and time of the image */ /** @return a struct containing the date and time of the image */
virtual struct tm getDateTime () const =0; virtual struct tm getDateTime () const =0;
/** @return a timestamp containing the date and time of the image */ /** @return a timestamp containing the date and time of the image */

View File

@ -3,8 +3,17 @@ add_library (rtexif rtexif.cc stdattribs.cc nikonattribs.cc canonattribs.cc
IF (WIN32) IF (WIN32)
set_target_properties (rtexif PROPERTIES COMPILE_FLAGS " -ffast-math -fexpensive-optimizations") set_target_properties (rtexif PROPERTIES COMPILE_FLAGS " -ffast-math -fexpensive-optimizations")
include_directories (${EXTRA_INCDIR} ${GLIB2_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS}
${GTK_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS})
link_directories (. ../rtexif ${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS} ${GLIBMM_LIBRARY_DIRS}
${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS})
#set_target_properties (rth PROPERTIES LINK_FLAGS "-mwindows")
ELSE (WIN32) ELSE (WIN32)
set_target_properties (rtexif PROPERTIES COMPILE_FLAGS " -ffast-math -fexpensive-optimizations -fPIC") set_target_properties (rtexif PROPERTIES COMPILE_FLAGS " -ffast-math -fexpensive-optimizations -fPIC")
include_directories (${EXTRA_INCDIR} ${GLIB2_INCLUDE_DIRS}
${GLIBMM_INCLUDE_DIRS} ${GTK_INCLUDE_DIRS} ${GTKMM_INCLUDE_DIRS})
link_directories (${EXTRA_LIBDIR} ${GLIB2_LIBRARY_DIRS}
${GLIBMM_LIBRARY_DIRS} ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS})
ENDIF (WIN32) ENDIF (WIN32)
IF (BUILD_SHARED_LIBS) IF (BUILD_SHARED_LIBS)

View File

@ -1404,7 +1404,7 @@ const std::vector<Tag*>& ExifManager::getDefaultTIFFTags (TagDirectory* forthis)
int ExifManager::createJPEGMarker (const TagDirectory* root, const std::vector< std::pair<std::string,std::string> >& changeList, int W, int H, unsigned char* buffer) { int ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char* buffer) {
// write tiff header // write tiff header
int offs = 6; int offs = 6;
@ -1423,8 +1423,8 @@ int ExifManager::createJPEGMarker (const TagDirectory* root, const std::vector<
else else
cl = new TagDirectory (NULL, ifdAttribs, INTEL); cl = new TagDirectory (NULL, ifdAttribs, INTEL);
for (int i=0; i<changeList.size(); i++) for (rtengine::procparams::ExifPairs::const_iterator i=changeList.begin(); i!=changeList.end(); i++)
cl->applyChange (changeList[i].first, changeList[i].second); cl->applyChange (i->first, i->second);
getDefaultTIFFTags (cl); getDefaultTIFFTags (cl);
@ -1442,7 +1442,7 @@ int ExifManager::createJPEGMarker (const TagDirectory* root, const std::vector<
return size + 6; return size + 6;
} }
int ExifManager::createTIFFHeader (const TagDirectory* root, const std::vector< std::pair<std::string,std::string> >& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char* buffer) { int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char* buffer) {
// write tiff header // write tiff header
int offs = 0; int offs = 0;
@ -1489,8 +1489,8 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const std::vector<
} }
// apply list of changes // apply list of changes
for (int i=0; i<changeList.size(); i++) for (rtengine::procparams::ExifPairs::const_iterator i=changeList.begin(); i!=changeList.end(); i++)
cl->applyChange (changeList[i].first, changeList[i].second); cl->applyChange (i->first, i->second);
// append default properties // append default properties
getDefaultTIFFTags (cl); getDefaultTIFFTags (cl);

View File

@ -26,6 +26,7 @@
#include <sstream> #include <sstream>
#include <cstdlib> #include <cstdlib>
#include <cmath> #include <cmath>
#include "../rtengine/procparams.h"
namespace rtexif { namespace rtexif {
@ -203,8 +204,8 @@ class ExifManager {
static void parseCIFF (FILE* f, int base, int length, TagDirectory* root); static void parseCIFF (FILE* f, int base, int length, TagDirectory* root);
static const std::vector<Tag*>& getDefaultTIFFTags (TagDirectory* forthis); static const std::vector<Tag*>& getDefaultTIFFTags (TagDirectory* forthis);
static int createJPEGMarker (const TagDirectory* root, const std::vector< std::pair<std::string,std::string> >& changeList, int W, int H, unsigned char* buffer); static int createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char* buffer);
static int createTIFFHeader (const TagDirectory* root, const std::vector< std::pair<std::string,std::string> >& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char* buffer); static int createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char* buffer);
}; };
class Interpreter { class Interpreter {

View File

@ -45,8 +45,6 @@ else (WIN32)
${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${GIO_LIBRARY_DIRS} ${GIOMM_LIBRARY_DIRS} ${IPTCDATA_LIBRARY_DIRS} ${LCMS_LIBRARY_DIRS} ${GTHREAD_LIBRARY_DIRS} ${GOBJECT_LIBRARY_DIRS}) ${GTK_LIBRARY_DIRS} ${GTKMM_LIBRARY_DIRS} ${GIO_LIBRARY_DIRS} ${GIOMM_LIBRARY_DIRS} ${IPTCDATA_LIBRARY_DIRS} ${LCMS_LIBRARY_DIRS} ${GTHREAD_LIBRARY_DIRS} ${GOBJECT_LIBRARY_DIRS})
endif (WIN32) endif (WIN32)
# create config.h which defines where data are stored # create config.h which defines where data are stored
message (STATUS --- CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR})
message (STATUS --- CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR})
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h)
add_executable (rth ${EXTRA_SRC} ${BASESOURCEFILES}) add_executable (rth ${EXTRA_SRC} ${BASESOURCEFILES})

View File

@ -77,7 +77,7 @@ void BatchToolPanelCoordinator::closeSession (bool save) {
for (unsigned int j=0; j<toolPanels.size(); j++) for (unsigned int j=0; j<toolPanels.size(); j++)
toolPanels[j]->trimValues (&newParams); toolPanels[j]->trimValues (&newParams);
selected[i]->setProcParams (newParams, BATCHEDITOR, true); selected[i]->setProcParams (newParams, NULL, BATCHEDITOR, true);
} }
} }
for (int i=0; i<paramcListeners.size(); i++) for (int i=0; i<paramcListeners.size(); i++)
@ -95,6 +95,7 @@ void BatchToolPanelCoordinator::initSession () {
selected[i]->addThumbnailListener (this); selected[i]->addThumbnailListener (this);
} }
// compare all the ProcParams and describe which parameters has different (i.e. inconsistent) values in pparamsEdited
pparamsEdited.initFrom (initialPP); pparamsEdited.initFrom (initialPP);
crop->setDimensions (100000, 100000); crop->setDimensions (100000, 100000);
@ -188,7 +189,7 @@ void BatchToolPanelCoordinator::initSession () {
if (options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]) pparams.sharpenMicro.uniformity = 0; if (options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]) pparams.sharpenMicro.uniformity = 0;
if (options.baBehav[ADDSET_CHMIXER]) for (int i=0; i<3; i++) pparams.chmixer.red[i] = pparams.chmixer.green[i] = pparams.chmixer.blue[i] = 0; if (options.baBehav[ADDSET_CHMIXER]) for (int i=0; i<3; i++) pparams.chmixer.red[i] = pparams.chmixer.green[i] = pparams.chmixer.blue[i] = 0;
if (options.baBehav[ADDSET_LD_EDGETOLERANCE]) pparams.lumaDenoise.edgetolerance = 0; //if (options.baBehav[ADDSET_LD_EDGETOLERANCE]) pparams.lumaDenoise.edgetolerance = 0;
if (options.baBehav[ADDSET_WB_TEMPERATURE]) pparams.wb.temperature = 0; if (options.baBehav[ADDSET_WB_TEMPERATURE]) pparams.wb.temperature = 0;
if (options.baBehav[ADDSET_WB_GREEN]) pparams.wb.green = 0; if (options.baBehav[ADDSET_WB_GREEN]) pparams.wb.green = 0;
@ -199,10 +200,10 @@ void BatchToolPanelCoordinator::initSession () {
if (options.baBehav[ADDSET_FREE_OUPUT_GAMMA]) pparams.icm.gampos = 0; if (options.baBehav[ADDSET_FREE_OUPUT_GAMMA]) pparams.icm.gampos = 0;
if (options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]) pparams.icm.slpos = 0; if (options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]) pparams.icm.slpos = 0;
if (options.baBehav[ADDSET_CBOOST_AMOUNT]) pparams.colorBoost.amount = 0; //if (options.baBehav[ADDSET_CBOOST_AMOUNT]) pparams.colorBoost.amount = 0;
if (options.baBehav[ADDSET_CS_BLUEYELLOW]) pparams.colorShift.a = 0; //if (options.baBehav[ADDSET_CS_BLUEYELLOW]) pparams.colorShift.a = 0;
if (options.baBehav[ADDSET_CS_GREENMAGENTA]) pparams.colorShift.b = 0; //if (options.baBehav[ADDSET_CS_GREENMAGENTA]) pparams.colorShift.b = 0;
if (options.baBehav[ADDSET_ROTATE_DEGREE]) pparams.rotate.degree = 0; if (options.baBehav[ADDSET_ROTATE_DEGREE]) pparams.rotate.degree = 0;
if (options.baBehav[ADDSET_DIST_AMOUNT]) pparams.distortion.amount = 0; if (options.baBehav[ADDSET_DIST_AMOUNT]) pparams.distortion.amount = 0;
@ -228,6 +229,7 @@ void BatchToolPanelCoordinator::initSession () {
toolPanels[i]->read (&pparams, &pparamsEdited); toolPanels[i]->read (&pparams, &pparamsEdited);
} }
for (int i=0; i<paramcListeners.size(); i++) for (int i=0; i<paramcListeners.size(); i++)
// send this initial state to the History
paramcListeners[i]->procParamsChanged (&pparams, rtengine::EvPhotoLoaded, M("BATCH_PROCESSING"), &pparamsEdited); paramcListeners[i]->procParamsChanged (&pparams, rtengine::EvPhotoLoaded, M("BATCH_PROCESSING"), &pparamsEdited);
} }
} }
@ -271,7 +273,7 @@ void BatchToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const G
for (unsigned int j=0; j<toolPanels.size(); j++) for (unsigned int j=0; j<toolPanels.size(); j++)
toolPanels[j]->trimValues (&newParams); toolPanels[j]->trimValues (&newParams);
selected[i]->setProcParams (newParams, BATCHEDITOR, false); selected[i]->setProcParams (newParams, NULL, BATCHEDITOR, false);
} }
for (int i=0; i<paramcListeners.size(); i++) for (int i=0; i<paramcListeners.size(); i++)
@ -304,13 +306,26 @@ void BatchToolPanelCoordinator::procParamsChanged (Thumbnail* thm, int whoChange
} }
} }
void BatchToolPanelCoordinator::profileChange (const ProcParams *nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited) { /*
* WARNING: profileChange is actually called by the History only.
* Using aProfile panel in the batch tool panel editor is actually
* not supported by BatchToolPanelCoordinator::profileChange!
*/
void BatchToolPanelCoordinator::profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited) {
pparams = *nparams; if (event==rtengine::EvProfileChanged) {
// a profile has been selected in a hypothetical Profile panel
// -> ACTUALLY NOT SUPPORTED
return;
}
pparams = *(nparams->pparams);
if (paramsEdited) if (paramsEdited)
pparamsEdited = *paramsEdited; pparamsEdited = *paramsEdited;
for (int i=0; i<toolPanels.size(); i++) for (int i=0; i<toolPanels.size(); i++)
// writing the values to the GUI
toolPanels[i]->read (&pparams, &pparamsEdited); toolPanels[i]->read (&pparams, &pparamsEdited);
somethingChanged = true; somethingChanged = true;
@ -319,12 +334,12 @@ void BatchToolPanelCoordinator::profileChange (const ProcParams *nparams, rteng
for (int i=0; i<toolPanels.size(); i++) for (int i=0; i<toolPanels.size(); i++)
toolPanels[i]->write (&pparams, &pparamsEdited); toolPanels[i]->write (&pparams, &pparamsEdited);
// combine with initial parameters and set // combine with initial parameters of each image and set
ProcParams newParams; ProcParams newParams;
for (int i=0; i<selected.size(); i++) { for (int i=0; i<selected.size(); i++) {
newParams = initialPP[i]; newParams = initialPP[i];
pparamsEdited.combine (newParams, pparams, true); pparamsEdited.combine (newParams, pparams, true);
selected[i]->setProcParams (newParams, BATCHEDITOR, false); selected[i]->setProcParams (newParams, NULL, BATCHEDITOR, false);
} }
for (int i=0; i<paramcListeners.size(); i++) for (int i=0; i<paramcListeners.size(); i++)

View File

@ -55,7 +55,7 @@ class BatchToolPanelCoordinator :
void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr); void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr);
// profilechangelistener interface // profilechangelistener interface
void profileChange (const rtengine::procparams::ProcParams* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited=NULL); void profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited=NULL);
// wbprovider interface // wbprovider interface
void getAutoWB (double& temp, double& green); void getAutoWB (double& temp, double& green);

View File

@ -19,3 +19,51 @@
#include "clipboard.h" #include "clipboard.h"
Clipboard clipboard; Clipboard clipboard;
Clipboard::Clipboard () : partProfile (false) {}
Clipboard::~Clipboard () {
partProfile.deleteInstance();
}
/*
* set both the "pparams" and "pedited" field of the PartialProfile; each one can be NULL
*/
void Clipboard::setPartialProfile (const rtengine::procparams::PartialProfile& pprofile) {
if (pprofile.pparams) {
if (!partProfile.pparams) partProfile.pparams = new rtengine::procparams::ProcParams();
*partProfile.pparams = *pprofile.pparams;
}
else {
if (partProfile.pparams) {
delete partProfile.pparams;
partProfile.pparams = NULL;
}
}
if (pprofile.pedited) {
if (!partProfile.pedited) partProfile.pedited = new ParamsEdited();
*partProfile.pedited = *pprofile.pedited;
}
else {
if (partProfile.pedited) {
delete partProfile.pedited;
partProfile.pedited = NULL;
}
}
}
/*
* this method copy the procparams to "pparams" and delete "pedited"
*/
void Clipboard::setProcParams (const rtengine::procparams::ProcParams& pparams) {
// copy procparams
if (!partProfile.pparams) partProfile.pparams = new rtengine::procparams::ProcParams();
*partProfile.pparams = pparams;
// delete pedited
if (partProfile.pedited) {
delete partProfile.pedited;
partProfile.pedited = NULL;
}
}

View File

@ -21,31 +21,37 @@
#include <vector> #include <vector>
#include "../rtengine/rtengine.h" #include "../rtengine/rtengine.h"
#include "../rtengine/procparams.h"
#include "paramsedited.h"
#include "mydiagonalcurve.h" #include "mydiagonalcurve.h"
class Clipboard { class Clipboard {
bool _hasIPTC; bool _hasIPTC;
std::vector<rtengine::procparams::IPTCPair> iptc; rtengine::procparams::IPTCPairs iptc;
bool _hasProcParams; rtengine::procparams::PartialProfile partProfile;
rtengine::procparams::ProcParams procParams;
DiagonalCurveType hasCurveDataType; DiagonalCurveType hasCurveDataType;
std::vector<double> curve; std::vector<double> curve;
public: public:
void setIPTC (const std::vector<rtengine::procparams::IPTCPair>& iptcc) { iptc = iptcc; _hasIPTC = true;} void setIPTC (const rtengine::procparams::IPTCPairs& iptcc) { iptc = iptcc; _hasIPTC = true;}
const std::vector<rtengine::procparams::IPTCPair>& getIPTC () { return iptc; } const rtengine::procparams::IPTCPairs& getIPTC () { return iptc; }
bool hasIPTC () { return _hasIPTC; } bool hasIPTC () { return _hasIPTC; }
void setProcParams (const rtengine::procparams::ProcParams& pparams) { procParams = pparams; _hasProcParams = true; } void setPartialProfile (const rtengine::procparams::PartialProfile& pprofile);
const rtengine::procparams::ProcParams& getProcParams () { return procParams; } const rtengine::procparams::PartialProfile& getPartialProfile () { return partProfile; };
bool hasProcParams () { return _hasProcParams; } void setProcParams (const rtengine::procparams::ProcParams& pparams);
const rtengine::procparams::ProcParams& getProcParams () { return *partProfile.pparams; }
bool hasProcParams () { return partProfile.pparams; }
bool hasPEdited () { return partProfile.pedited; }
void setCurveData (std::vector<double>& p, DiagonalCurveType type ) { curve = p; hasCurveDataType = type; return; } void setCurveData (std::vector<double>& p, DiagonalCurveType type ) { curve = p; hasCurveDataType = type; return; }
const std::vector<double> & getCurveData () { return curve; } const std::vector<double> & getCurveData () { return curve; }
DiagonalCurveType hasCurveData () { return hasCurveDataType; } DiagonalCurveType hasCurveData () { return hasCurveDataType; }
Clipboard ();
~Clipboard ();
}; };

View File

@ -479,7 +479,7 @@ void EditorPanel::saveProfile () {
ipc->getParams (&params); ipc->getParams (&params);
// Will call updateCache, which will update both the cached and sidecar files if necessary // Will call updateCache, which will update both the cached and sidecar files if necessary
openThm->setProcParams (params, EDITOR); openThm->setProcParams (params, NULL, EDITOR);
} }
} }
@ -592,7 +592,7 @@ void EditorPanel::refreshProcessingState (bool inProcessingP) {
if (ipc && openThm && tpc->getChangedState()) { if (ipc && openThm && tpc->getChangedState()) {
rtengine::procparams::ProcParams pparams; rtengine::procparams::ProcParams pparams;
ipc->getParams (&pparams); ipc->getParams (&pparams);
openThm->setProcParams (pparams, EDITOR, false); openThm->setProcParams (pparams, NULL, EDITOR, false);
} }
// Ring a sound if it was a long event // Ring a sound if it was a long event
@ -908,8 +908,13 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) {
void EditorPanel::procParamsChanged (Thumbnail* thm, int whoChangedIt) { void EditorPanel::procParamsChanged (Thumbnail* thm, int whoChangedIt) {
if (whoChangedIt!=EDITOR) if (whoChangedIt!=EDITOR) {
tpc->profileChange (&openThm->getProcParams(), rtengine::EvProfileChangeNotification, M("PROGRESSDLG_PROFILECHANGEDINBROWSER")); PartialProfile pp(true);
pp.set(true);
*(pp.pparams) = openThm->getProcParams();
tpc->profileChange (&pp, rtengine::EvProfileChangeNotification, M("PROGRESSDLG_PROFILECHANGEDINBROWSER"));
pp.deleteInstance();
}
} }
bool EditorPanel::idle_saveImage (ProgressConnector<rtengine::IImage16*> *pc, Glib::ustring fname, SaveFormat sf) { bool EditorPanel::idle_saveImage (ProgressConnector<rtengine::IImage16*> *pc, Glib::ustring fname, SaveFormat sf) {

View File

@ -515,24 +515,12 @@ void ExifPanel::updateChangeList (Gtk::TreeModel::Children root, std::string pre
Gtk::TreeModel::iterator iter; Gtk::TreeModel::iterator iter;
for (iter = root.begin(); iter!=root.end(); iter++) { for (iter = root.begin(); iter!=root.end(); iter++) {
if (iter->get_value (exifColumns.edited) == true) { if (iter->get_value (exifColumns.edited) == true)
ExifPair ec; changeList[ prefix+iter->get_value (exifColumns.field_nopango) ] = iter->get_value (exifColumns.value_nopango);
ec.field = prefix + iter->get_value (exifColumns.field_nopango); else if (iter->get_value (exifColumns.action) == WRITE && iter->get_value (exifColumns.icon) == delicon)
ec.value = iter->get_value (exifColumns.value_nopango); changeList[ prefix+iter->get_value (exifColumns.field_nopango) ] = "#delete";
changeList.push_back (ec); else if (iter->get_value (exifColumns.action) == DONTWRITE && iter->get_value (exifColumns.icon) == keepicon)
} changeList[ prefix+iter->get_value (exifColumns.field_nopango) ] = "#keep";
else if (iter->get_value (exifColumns.action) == WRITE && iter->get_value (exifColumns.icon) == delicon) {
ExifPair ec;
ec.field = prefix + iter->get_value (exifColumns.field_nopango);
ec.value = "#delete";
changeList.push_back (ec);
}
else if (iter->get_value (exifColumns.action) == DONTWRITE && iter->get_value (exifColumns.icon) == keepicon) {
ExifPair ec;
ec.field = prefix + iter->get_value (exifColumns.field_nopango);
ec.value = "#keep";
changeList.push_back (ec);
}
if (iter->get_value (exifColumns.icon) == keepicon) if (iter->get_value (exifColumns.icon) == keepicon)
updateChangeList (iter->children(), prefix + iter->get_value (exifColumns.field_nopango)); updateChangeList (iter->children(), prefix + iter->get_value (exifColumns.field_nopango));
} }
@ -546,8 +534,8 @@ void ExifPanel::updateChangeList () {
void ExifPanel::applyChangeList () { void ExifPanel::applyChangeList () {
for (int i=0; i<changeList.size(); i++) for (rtengine::procparams::ExifPairs::iterator i=changeList.begin(); i!=changeList.end(); i++)
editTag (exifTreeModel->children(), changeList[i].field, changeList[i].value); editTag (exifTreeModel->children(), i->first, i->second);
} }
void ExifPanel::row_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column) { void ExifPanel::row_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column) {

View File

@ -28,8 +28,8 @@ class ExifPanel : public Gtk::VBox, public ToolPanel {
const rtengine::ImageMetaData* idata; const rtengine::ImageMetaData* idata;
int fullw, fullh, cx, cy, cw, ch; int fullw, fullh, cx, cy, cw, ch;
bool crenabled; bool crenabled;
std::vector<rtengine::procparams::ExifPair> changeList; rtengine::procparams::ExifPairs changeList;
std::vector<rtengine::procparams::ExifPair> defChangeList; rtengine::procparams::ExifPairs defChangeList;
bool recursiveOp; bool recursiveOp;
class ExifColumns : public Gtk::TreeModelColumnRecord { class ExifColumns : public Gtk::TreeModelColumnRecord {

View File

@ -50,8 +50,8 @@ ExportPanel::ExportPanel () : listener (NULL) {
bypass_sharpening = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SHARPENING"))); bypass_sharpening = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SHARPENING")));
bypass_sharpenEdge = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SHARPENEDGE"))); bypass_sharpenEdge = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SHARPENEDGE")));
bypass_sharpenMicro = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SHARPENMICRO"))); bypass_sharpenMicro = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SHARPENMICRO")));
bypass_lumaDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_LUMADENOISE"))); //bypass_lumaDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_LUMADENOISE")));
bypass_colorDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_COLORDENOISE"))); //bypass_colorDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_COLORDENOISE")));
bypass_defringe = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_DEFRINGE"))); bypass_defringe = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_DEFRINGE")));
bypass_dirpyrDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_DIRPYRDENOISE"))); bypass_dirpyrDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_DIRPYRDENOISE")));
bypass_sh_hq = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SH_HQ"))); bypass_sh_hq = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SH_HQ")));
@ -162,8 +162,8 @@ ExportPanel::ExportPanel () : listener (NULL) {
bypass_sharpeningConn = bypass_sharpening->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_sharpeningConn = bypass_sharpening->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true));
bypass_sharpenEdgeConn = bypass_sharpenEdge->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_sharpenEdgeConn = bypass_sharpenEdge->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true));
bypass_sharpenMicroConn = bypass_sharpenMicro->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_sharpenMicroConn = bypass_sharpenMicro->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true));
bypass_lumaDenoiseConn = bypass_lumaDenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); //bypass_lumaDenoiseConn = bypass_lumaDenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true));
bypass_colorDenoiseConn = bypass_colorDenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); //bypass_colorDenoiseConn = bypass_colorDenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true));
bypass_defringeConn = bypass_defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_defringeConn = bypass_defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true));
bypass_dirpyrDenoiseConn = bypass_dirpyrDenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_dirpyrDenoiseConn = bypass_dirpyrDenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true));
bypass_sh_hqConn = bypass_sh_hq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_sh_hqConn = bypass_sh_hq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true));
@ -201,8 +201,8 @@ void ExportPanel::SaveSettingsAsDefault(){
options.fastexport_bypass_sharpening = bypass_sharpening->get_active (); options.fastexport_bypass_sharpening = bypass_sharpening->get_active ();
options.fastexport_bypass_sharpenEdge = bypass_sharpenEdge->get_active (); options.fastexport_bypass_sharpenEdge = bypass_sharpenEdge->get_active ();
options.fastexport_bypass_sharpenMicro = bypass_sharpenMicro->get_active (); options.fastexport_bypass_sharpenMicro = bypass_sharpenMicro->get_active ();
options.fastexport_bypass_lumaDenoise = bypass_lumaDenoise->get_active (); //options.fastexport_bypass_lumaDenoise = bypass_lumaDenoise->get_active ();
options.fastexport_bypass_colorDenoise = bypass_colorDenoise->get_active (); //options.fastexport_bypass_colorDenoise = bypass_colorDenoise->get_active ();
options.fastexport_bypass_defringe = bypass_defringe->get_active (); options.fastexport_bypass_defringe = bypass_defringe->get_active ();
options.fastexport_bypass_dirpyrDenoise = bypass_dirpyrDenoise->get_active (); options.fastexport_bypass_dirpyrDenoise = bypass_dirpyrDenoise->get_active ();
options.fastexport_bypass_sh_hq = bypass_sh_hq->get_active (); options.fastexport_bypass_sh_hq = bypass_sh_hq->get_active ();
@ -254,8 +254,8 @@ void ExportPanel::LoadDefaultSettings(){
bypass_sharpening->set_active (options.fastexport_bypass_sharpening ); bypass_sharpening->set_active (options.fastexport_bypass_sharpening );
bypass_sharpenEdge->set_active (options.fastexport_bypass_sharpenEdge ); bypass_sharpenEdge->set_active (options.fastexport_bypass_sharpenEdge );
bypass_sharpenMicro->set_active (options.fastexport_bypass_sharpenMicro ); bypass_sharpenMicro->set_active (options.fastexport_bypass_sharpenMicro );
bypass_lumaDenoise->set_active (options.fastexport_bypass_lumaDenoise ); //bypass_lumaDenoise->set_active (options.fastexport_bypass_lumaDenoise );
bypass_colorDenoise->set_active (options.fastexport_bypass_colorDenoise ); //bypass_colorDenoise->set_active (options.fastexport_bypass_colorDenoise );
bypass_defringe->set_active (options.fastexport_bypass_defringe ); bypass_defringe->set_active (options.fastexport_bypass_defringe );
bypass_dirpyrDenoise->set_active (options.fastexport_bypass_dirpyrDenoise ); bypass_dirpyrDenoise->set_active (options.fastexport_bypass_dirpyrDenoise );
bypass_sh_hq->set_active (options.fastexport_bypass_sh_hq ); bypass_sh_hq->set_active (options.fastexport_bypass_sh_hq );
@ -323,8 +323,8 @@ void ExportPanel::bypassALL_Toggled(){
bypass_sharpeningConn.block (true); bypass_sharpeningConn.block (true);
bypass_sharpenEdgeConn.block (true); bypass_sharpenEdgeConn.block (true);
bypass_sharpenMicroConn.block (true); bypass_sharpenMicroConn.block (true);
bypass_lumaDenoiseConn.block (true); //bypass_lumaDenoiseConn.block (true);
bypass_colorDenoiseConn.block (true); //bypass_colorDenoiseConn.block (true);
bypass_defringeConn.block (true); bypass_defringeConn.block (true);
bypass_dirpyrDenoiseConn.block (true); bypass_dirpyrDenoiseConn.block (true);
bypass_sh_hqConn.block (true); bypass_sh_hqConn.block (true);
@ -344,8 +344,8 @@ void ExportPanel::bypassALL_Toggled(){
bypass_sharpening->set_active(bypass_ALL->get_active()); bypass_sharpening->set_active(bypass_ALL->get_active());
bypass_sharpenEdge->set_active(bypass_ALL->get_active()); bypass_sharpenEdge->set_active(bypass_ALL->get_active());
bypass_sharpenMicro->set_active(bypass_ALL->get_active()); bypass_sharpenMicro->set_active(bypass_ALL->get_active());
bypass_lumaDenoise->set_active(bypass_ALL->get_active()); //bypass_lumaDenoise->set_active(bypass_ALL->get_active());
bypass_colorDenoise->set_active(bypass_ALL->get_active()); //bypass_colorDenoise->set_active(bypass_ALL->get_active());
bypass_defringe->set_active(bypass_ALL->get_active()); bypass_defringe->set_active(bypass_ALL->get_active());
bypass_dirpyrDenoise->set_active(bypass_ALL->get_active()); bypass_dirpyrDenoise->set_active(bypass_ALL->get_active());
bypass_sh_hq->set_active(bypass_ALL->get_active()); bypass_sh_hq->set_active(bypass_ALL->get_active());
@ -363,8 +363,8 @@ void ExportPanel::bypassALL_Toggled(){
bypass_sharpeningConn.block (false); bypass_sharpeningConn.block (false);
bypass_sharpenEdgeConn.block (false); bypass_sharpenEdgeConn.block (false);
bypass_sharpenMicroConn.block (false); bypass_sharpenMicroConn.block (false);
bypass_lumaDenoiseConn.block (false); //bypass_lumaDenoiseConn.block (false);
bypass_colorDenoiseConn.block (false); //bypass_colorDenoiseConn.block (false);
bypass_defringeConn.block (false); bypass_defringeConn.block (false);
bypass_dirpyrDenoiseConn.block (false); bypass_dirpyrDenoiseConn.block (false);
bypass_sh_hqConn.block (false); bypass_sh_hqConn.block (false);

View File

@ -39,8 +39,8 @@ class ExportPanel : public Gtk::VBox {
Gtk::CheckButton* bypass_sharpenEdge; Gtk::CheckButton* bypass_sharpenEdge;
Gtk::CheckButton* bypass_sharpenMicro; Gtk::CheckButton* bypass_sharpenMicro;
Gtk::CheckButton* bypass_sharpening; Gtk::CheckButton* bypass_sharpening;
Gtk::CheckButton* bypass_lumaDenoise; //Gtk::CheckButton* bypass_lumaDenoise;
Gtk::CheckButton* bypass_colorDenoise; //Gtk::CheckButton* bypass_colorDenoise;
Gtk::CheckButton* bypass_defringe; Gtk::CheckButton* bypass_defringe;
Gtk::CheckButton* bypass_dirpyrDenoise; Gtk::CheckButton* bypass_dirpyrDenoise;
Gtk::CheckButton* bypass_sh_hq; Gtk::CheckButton* bypass_sh_hq;
@ -77,8 +77,8 @@ class ExportPanel : public Gtk::VBox {
sigc::connection bypass_sharpeningConn ; sigc::connection bypass_sharpeningConn ;
sigc::connection bypass_sharpenEdgeConn ; sigc::connection bypass_sharpenEdgeConn ;
sigc::connection bypass_sharpenMicroConn ; sigc::connection bypass_sharpenMicroConn ;
sigc::connection bypass_lumaDenoiseConn ; //sigc::connection bypass_lumaDenoiseConn ;
sigc::connection bypass_colorDenoiseConn ; //sigc::connection bypass_colorDenoiseConn ;
sigc::connection bypass_defringeConn ; sigc::connection bypass_defringeConn ;
sigc::connection bypass_dirpyrDenoiseConn ; sigc::connection bypass_dirpyrDenoiseConn ;
sigc::connection bypass_sh_hqConn ; sigc::connection bypass_sh_hqConn ;

View File

@ -32,7 +32,7 @@
extern Options options; extern Options options;
FileBrowser::FileBrowser () FileBrowser::FileBrowser ()
: tbl(NULL),numFiltered(0) { : tbl(NULL),numFiltered(0), partialPasteDlg(M("PARTIALPASTE_DIALOGLABEL")) {
fbih = new FileBrowserIdleHelper; fbih = new FileBrowserIdleHelper;
fbih->fbrowser = this; fbih->fbrowser = this;
@ -514,7 +514,7 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) {
rtengine::procparams::ProcParams pp=mselected[i]->thumbnail->getProcParams(); rtengine::procparams::ProcParams pp=mselected[i]->thumbnail->getProcParams();
pp.raw.df_autoselect= true; pp.raw.df_autoselect= true;
pp.raw.dark_frame.clear(); pp.raw.dark_frame.clear();
mselected[i]->thumbnail->setProcParams(pp,FILEBROWSER,false); mselected[i]->thumbnail->setProcParams(pp,NULL,FILEBROWSER,false);
} }
}else if (m==selectDF){ }else if (m==selectDF){
if( !mselected.empty() ){ if( !mselected.empty() ){
@ -531,7 +531,7 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) {
rtengine::procparams::ProcParams pp=mselected[i]->thumbnail->getProcParams(); rtengine::procparams::ProcParams pp=mselected[i]->thumbnail->getProcParams();
pp.raw.dark_frame= fc.get_filename(); pp.raw.dark_frame= fc.get_filename();
pp.raw.df_autoselect= false; pp.raw.df_autoselect= false;
mselected[i]->thumbnail->setProcParams(pp,FILEBROWSER,false); mselected[i]->thumbnail->setProcParams(pp,NULL,FILEBROWSER,false);
} }
} }
} }
@ -553,7 +553,7 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) {
rtengine::procparams::ProcParams pp=mselected[i]->thumbnail->getProcParams(); rtengine::procparams::ProcParams pp=mselected[i]->thumbnail->getProcParams();
pp.raw.ff_AutoSelect= true; pp.raw.ff_AutoSelect= true;
pp.raw.ff_file.clear(); pp.raw.ff_file.clear();
mselected[i]->thumbnail->setProcParams(pp,FILEBROWSER,false); mselected[i]->thumbnail->setProcParams(pp,NULL,FILEBROWSER,false);
} }
} }
else if (m==selectFF){ else if (m==selectFF){
@ -571,7 +571,7 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) {
rtengine::procparams::ProcParams pp=mselected[i]->thumbnail->getProcParams(); rtengine::procparams::ProcParams pp=mselected[i]->thumbnail->getProcParams();
pp.raw.ff_file= fc.get_filename(); pp.raw.ff_file= fc.get_filename();
pp.raw.ff_AutoSelect= false; pp.raw.ff_AutoSelect= false;
mselected[i]->thumbnail->setProcParams(pp,FILEBROWSER,false); mselected[i]->thumbnail->setProcParams(pp,NULL,FILEBROWSER,false);
} }
} }
} }
@ -605,7 +605,7 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) {
// Empty run to update the thumb // Empty run to update the thumb
rtengine::procparams::ProcParams params = mselected[i]->thumbnail->getProcParams (); rtengine::procparams::ProcParams params = mselected[i]->thumbnail->getProcParams ();
mselected[i]->thumbnail->setProcParams (params, FILEBROWSER); mselected[i]->thumbnail->setProcParams (params, NULL, FILEBROWSER);
} }
} else if (m==clearFromCache) { } else if (m==clearFromCache) {
for (int i=0; i<mselected.size(); i++) for (int i=0; i<mselected.size(); i++)
@ -627,40 +627,60 @@ void FileBrowser::copyProfile () {
void FileBrowser::pasteProfile () { void FileBrowser::pasteProfile () {
if (clipboard.hasProcParams()) {
std::vector<FileBrowserEntry*> mselected; std::vector<FileBrowserEntry*> mselected;
for (int i=0; i<selected.size(); i++) for (unsigned int i=0; i<selected.size(); i++)
mselected.push_back (static_cast<FileBrowserEntry*>(selected[i])); mselected.push_back (static_cast<FileBrowserEntry*>(selected[i]));
if (!tbl || mselected.empty()) if (!tbl || mselected.empty())
return; return;
for (int i=0; i<mselected.size(); i++) for (unsigned int i=0; i<mselected.size(); i++) {
mselected[i]->thumbnail->setProcParams (clipboard.getProcParams(), FILEBROWSER); // copying read only clipboard PartialProfile to a temporary one
rtengine::procparams::PartialProfile cbPartProf = clipboard.getPartialProfile();
rtengine::procparams::PartialProfile pastedPartProf(cbPartProf.pparams, cbPartProf.pedited, true);
// applying the PartialProfile to the thumb's ProcParams
mselected[i]->thumbnail->setProcParams (*pastedPartProf.pparams, pastedPartProf.pedited, FILEBROWSER);
pastedPartProf.deleteInstance();
}
queue_draw (); queue_draw ();
}
} }
void FileBrowser::partPasteProfile () { void FileBrowser::partPasteProfile () {
if (clipboard.hasProcParams()) {
std::vector<FileBrowserEntry*> mselected; std::vector<FileBrowserEntry*> mselected;
for (int i=0; i<selected.size(); i++) for (unsigned int i=0; i<selected.size(); i++)
mselected.push_back (static_cast<FileBrowserEntry*>(selected[i])); mselected.push_back (static_cast<FileBrowserEntry*>(selected[i]));
if (!tbl || mselected.empty()) if (!tbl || mselected.empty())
return; return;
if (partialPasteDlg.run ()) { int i = partialPasteDlg.run ();
if (i == Gtk::RESPONSE_OK) {
for (int i=0; i<mselected.size(); i++) { for (unsigned int i=0; i<mselected.size(); i++) {
// copying read only clipboard PartialProfile to a temporary one, initialized to the thumb's ProcParams
mselected[i]->thumbnail->createProcParamsForUpdate(false,false); // this can execute customprofilebuilder to generate param file mselected[i]->thumbnail->createProcParamsForUpdate(false,false); // this can execute customprofilebuilder to generate param file
rtengine::procparams::ProcParams params = mselected[i]->thumbnail->getProcParams (); rtengine::procparams::PartialProfile cbPartProf = clipboard.getPartialProfile();
partialPasteDlg.applyPaste (&params, &clipboard.getProcParams()); rtengine::procparams::PartialProfile pastedPartProf(&mselected[i]->thumbnail->getProcParams (), NULL);
mselected[i]->thumbnail->setProcParams (params, FILEBROWSER);
// pushing the selected values of the clipboard PartialProfile to the temporary PartialProfile
partialPasteDlg.applyPaste (pastedPartProf.pparams, pastedPartProf.pedited, cbPartProf.pparams, cbPartProf.pedited);
// applying the temporary PartialProfile to the thumb's ProcParams
mselected[i]->thumbnail->setProcParams (*pastedPartProf.pparams, pastedPartProf.pedited, FILEBROWSER);
pastedPartProf.deleteInstance();
} }
queue_draw (); queue_draw ();
} }
partialPasteDlg.hide (); partialPasteDlg.hide ();
}
} }
void FileBrowser::openDefaultViewer (int destination) { void FileBrowser::openDefaultViewer (int destination) {
@ -726,10 +746,10 @@ bool FileBrowser::keyPressed (GdkEventKey* event) {
void FileBrowser::applyMenuItemActivated (Glib::ustring ppname) { void FileBrowser::applyMenuItemActivated (Glib::ustring ppname) {
rtengine::procparams::ProcParams* pparams = profileStore.getProfile (ppname); rtengine::procparams::PartialProfile* partProfile = profileStore.getProfile (ppname);
if (pparams && !selected.empty()) { if (partProfile->pparams && !selected.empty()) {
for (int i=0; i<selected.size(); i++) for (int i=0; i<selected.size(); i++)
(static_cast<FileBrowserEntry*>(selected[i]))->thumbnail->setProcParams (*pparams, FILEBROWSER); (static_cast<FileBrowserEntry*>(selected[i]))->thumbnail->setProcParams (*partProfile->pparams, partProfile->pedited, FILEBROWSER);
queue_draw (); queue_draw ();
} }
} }
@ -739,17 +759,20 @@ void FileBrowser::applyPartialMenuItemActivated (Glib::ustring ppname) {
if (!tbl || selected.empty()) if (!tbl || selected.empty())
return; return;
rtengine::procparams::ProcParams* pparams = profileStore.getProfile (ppname); rtengine::procparams::PartialProfile* srcProfiles = profileStore.getProfile (ppname);
if (pparams) { if (srcProfiles->pparams) {
if (partialPasteDlg.run ()) { if (partialPasteDlg.run()==Gtk::RESPONSE_OK) {
for (int i=0; i<selected.size(); i++) { for (int i=0; i<selected.size(); i++) {
selected[i]->thumbnail->createProcParamsForUpdate(false, false); // this can execute customprofilebuilder to generate param file selected[i]->thumbnail->createProcParamsForUpdate(false, false); // this can execute customprofilebuilder to generate param file
rtengine::procparams::ProcParams params = (static_cast<FileBrowserEntry*>(selected[i]))->thumbnail->getProcParams (); rtengine::procparams::PartialProfile dstProfile(true);
partialPasteDlg.applyPaste (&params, pparams); *dstProfile.pparams = (static_cast<FileBrowserEntry*>(selected[i]))->thumbnail->getProcParams ();
(static_cast<FileBrowserEntry*>(selected[i]))->thumbnail->setProcParams (params, FILEBROWSER); dstProfile.set(true);
partialPasteDlg.applyPaste (dstProfile.pparams, dstProfile.pedited, srcProfiles->pparams, srcProfiles->pedited);
(static_cast<FileBrowserEntry*>(selected[i]))->thumbnail->setProcParams (*dstProfile.pparams, dstProfile.pedited, FILEBROWSER);
dstProfile.deleteInstance();
} }
queue_draw (); queue_draw ();
} }

View File

@ -102,8 +102,8 @@ class FileBrowser : public ThumbBrowserBase,
FileBrowserListener* tbl; FileBrowserListener* tbl;
BrowserFilter filter; BrowserFilter filter;
PartialPasteDlg partialPasteDlg;
int numFiltered; int numFiltered;
PartialPasteDlg partialPasteDlg;
FileBrowserIdleHelper* fbih; FileBrowserIdleHelper* fbih;
void toTrashRequested (std::vector<FileBrowserEntry*> tbe); void toTrashRequested (std::vector<FileBrowserEntry*> tbe);

View File

@ -867,8 +867,8 @@ void FileCatalog::developRequested (std::vector<FileBrowserEntry*> tbe, bool fas
if (options.fastexport_bypass_sharpening ) params.sharpening.enabled = false; if (options.fastexport_bypass_sharpening ) params.sharpening.enabled = false;
if (options.fastexport_bypass_sharpenEdge ) params.sharpenEdge.enabled = false; if (options.fastexport_bypass_sharpenEdge ) params.sharpenEdge.enabled = false;
if (options.fastexport_bypass_sharpenMicro ) params.sharpenMicro.enabled = false; if (options.fastexport_bypass_sharpenMicro ) params.sharpenMicro.enabled = false;
if (options.fastexport_bypass_lumaDenoise ) params.lumaDenoise.enabled = false; //if (options.fastexport_bypass_lumaDenoise ) params.lumaDenoise.enabled = false;
if (options.fastexport_bypass_colorDenoise ) params.colorDenoise.enabled = false; //if (options.fastexport_bypass_colorDenoise ) params.colorDenoise.enabled = false;
if (options.fastexport_bypass_defringe ) params.defringe.enabled = false; if (options.fastexport_bypass_defringe ) params.defringe.enabled = false;
if (options.fastexport_bypass_dirpyrDenoise ) params.dirpyrDenoise.enabled = false; if (options.fastexport_bypass_dirpyrDenoise ) params.dirpyrDenoise.enabled = false;
if (options.fastexport_bypass_sh_hq ) params.sh.hq = false; if (options.fastexport_bypass_sh_hq ) params.sh.hq = false;

View File

@ -144,9 +144,12 @@ void History::historySelectionChanged () {
if (row) if (row)
bTreeView->get_selection()->unselect_all (); bTreeView->get_selection()->unselect_all ();
if (row && tpc) { if (row && tpc) {
ProcParams params = row[historyColumns.params]; ProcParams pparams = row[historyColumns.params];
ParamsEdited pe;
pe.set(true);
PartialProfile pp(&pparams, &pe);
ParamsEdited paramsEdited = row[historyColumns.paramsEdited]; ParamsEdited paramsEdited = row[historyColumns.paramsEdited];
tpc->profileChange (&params, EvHistoryBrowsed, row[historyColumns.text], &paramsEdited); tpc->profileChange (&pp, EvHistoryBrowsed, row[historyColumns.text], &paramsEdited);
} }
if (blistener && blistenerLock==false) { if (blistener && blistenerLock==false) {
Gtk::TreeModel::Path path = historyModel->get_path (iter); Gtk::TreeModel::Path path = historyModel->get_path (iter);
@ -167,9 +170,12 @@ void History::bookmarkSelectionChanged () {
if (row) if (row)
hTreeView->get_selection()->unselect_all (); hTreeView->get_selection()->unselect_all ();
if (row && tpc) { if (row && tpc) {
ProcParams params = row[bookmarkColumns.params]; ProcParams pparams = row[bookmarkColumns.params];
ParamsEdited pe;
pe.set(true);
PartialProfile pp(&pparams, &pe);
ParamsEdited paramsEdited = row[bookmarkColumns.paramsEdited]; ParamsEdited paramsEdited = row[bookmarkColumns.paramsEdited];
tpc->profileChange (&params, EvBookmarkSelected, row[bookmarkColumns.text], &paramsEdited); tpc->profileChange (&pp, EvBookmarkSelected, row[bookmarkColumns.text], &paramsEdited);
} }
} }
} }
@ -201,7 +207,7 @@ void History::procParamsChanged (ProcParams* params, ProcEvent ev, Glib::ustring
if (size>0) if (size>0)
row = historyModel->children()[size-1]; row = historyModel->children()[size-1];
// if there is no last item or its chev!=ev, create a new one // if there is no last item or its chev!=ev, create a new one
if (size==0 || !row || row[historyColumns.chev]!=ev) { if (size==0 || !row || row[historyColumns.chev]!=ev || ev==EvProfileChanged) {
Gtk::TreeModel::Row newrow = *(historyModel->append()); Gtk::TreeModel::Row newrow = *(historyModel->append());
newrow[historyColumns.realText] = eventDescrArray[ev]; newrow[historyColumns.realText] = eventDescrArray[ev];
newrow[historyColumns.text] = text; newrow[historyColumns.text] = text;

View File

@ -339,6 +339,7 @@ IPTCPanel::IPTCPanel () {
void IPTCPanel::read (const ProcParams* pp, const ParamsEdited* pedited) { void IPTCPanel::read (const ProcParams* pp, const ParamsEdited* pedited) {
disableListener (); disableListener ();
changeList.clear();
if (!pp->iptc.empty()) if (!pp->iptc.empty())
changeList = pp->iptc; changeList = pp->iptc;
else else
@ -377,7 +378,7 @@ void IPTCPanel::addKeyWord () {
keyword->get_entry()->select_region (0, keyword->get_entry()->get_text().size()); keyword->get_entry()->select_region (0, keyword->get_entry()->get_text().size());
for (int i=0; i<keywords->size(); i++) for (unsigned int i=0; i<keywords->size(); i++)
if (keywords->get_text (i) == keyword->get_entry()->get_text()) if (keywords->get_text (i) == keyword->get_entry()->get_text())
return; return;
@ -390,7 +391,7 @@ void IPTCPanel::addKeyWord () {
items.push_back (s); items.push_back (s);
} }
keyword->clear_items (); keyword->clear_items ();
for (int i=0; i<10 && i<items.size(); i++) for (unsigned int i=0; i<10 && i<items.size(); i++)
keyword->append_text (items[i]); keyword->append_text (items[i]);
keywords->scroll_to_row (keywords->get_model()->get_path(--keywords->get_model()->children().end())); keywords->scroll_to_row (keywords->get_model()->get_path(--keywords->get_model()->children().end()));
@ -402,11 +403,11 @@ void IPTCPanel::delKeyWord () {
std::vector<int> selection = keywords->get_selected (); std::vector<int> selection = keywords->get_selected ();
if (!selection.empty()) { if (!selection.empty()) {
std::vector<Glib::ustring> keep; std::vector<Glib::ustring> keep;
for (int i=0; i<keywords->size(); i++) for (unsigned int i=0; i<keywords->size(); i++)
if (std::find (selection.begin(), selection.end(), i) == selection.end()) if (std::find (selection.begin(), selection.end(), i) == selection.end())
keep.push_back (keywords->get_text (i)); keep.push_back (keywords->get_text (i));
keywords->clear_items (); keywords->clear_items ();
for (int i=0; i<keep.size(); i++) for (unsigned int i=0; i<keep.size(); i++)
keywords->append_text (keep[i]); keywords->append_text (keep[i]);
} }
@ -415,7 +416,7 @@ void IPTCPanel::delKeyWord () {
void IPTCPanel::addSuppCategory () { void IPTCPanel::addSuppCategory () {
for (int i=0; i<suppCategories->size(); i++) for (unsigned int i=0; i<suppCategories->size(); i++)
if (suppCategories->get_text (i) == suppCategory->get_entry()->get_text()) if (suppCategories->get_text (i) == suppCategory->get_entry()->get_text())
return; return;
@ -428,7 +429,7 @@ void IPTCPanel::addSuppCategory () {
items.push_back (s); items.push_back (s);
} }
suppCategory->clear_items (); suppCategory->clear_items ();
for (int i=0; i<10 && i<items.size(); i++) for (unsigned int i=0; i<10 && i<items.size(); i++)
suppCategory->append_text (items[i]); suppCategory->append_text (items[i]);
suppCategories->scroll_to_row (suppCategories->get_model()->get_path(--suppCategories->get_model()->children().end())); suppCategories->scroll_to_row (suppCategories->get_model()->get_path(--suppCategories->get_model()->children().end()));
suppCategory->get_entry()->select_region (0, suppCategory->get_entry()->get_text().size()); suppCategory->get_entry()->select_region (0, suppCategory->get_entry()->get_text().size());
@ -441,11 +442,11 @@ void IPTCPanel::delSuppCategory () {
std::vector<int> selection = suppCategories->get_selected (); std::vector<int> selection = suppCategories->get_selected ();
if (!selection.empty()) { if (!selection.empty()) {
std::vector<Glib::ustring> keep; std::vector<Glib::ustring> keep;
for (int i=0; i<suppCategories->size(); i++) for (unsigned int i=0; i<suppCategories->size(); i++)
if (std::find (selection.begin(), selection.end(), i) == selection.end()) if (std::find (selection.begin(), selection.end(), i) == selection.end())
keep.push_back (suppCategories->get_text (i)); keep.push_back (suppCategories->get_text (i));
suppCategories->clear_items (); suppCategories->clear_items ();
for (int i=0; i<keep.size(); i++) for (unsigned int i=0; i<keep.size(); i++)
suppCategories->append_text (keep[i]); suppCategories->append_text (keep[i]);
} }
@ -455,45 +456,30 @@ void IPTCPanel::delSuppCategory () {
void IPTCPanel::updateChangeList () { void IPTCPanel::updateChangeList () {
changeList.clear (); changeList.clear ();
changeList.resize (18); changeList["Caption" ].push_back (captionText->get_text ());
changeList[0].field = "Caption"; changeList["CaptionWriter" ].push_back (captionWriter->get_text ());
changeList[0].values.push_back (captionText->get_text ()); changeList["Headline" ].push_back (headline->get_text ());
changeList[1].field = "CaptionWriter"; changeList["Instructions" ].push_back (instructions->get_text ());
changeList[1].values.push_back (captionWriter->get_text ());
changeList[2].field = "Headline"; for (unsigned int i=0; i<keywords->size(); i++)
changeList[2].values.push_back (headline->get_text ()); changeList["Keywords" ].push_back (keywords->get_text (i));
changeList[3].field = "Instructions";
changeList[3].values.push_back (instructions->get_text ()); changeList["Category" ].push_back (category->get_entry()->get_text ());
changeList[4].field = "Keywords";
for (int i=0; i<keywords->size(); i++) for (unsigned int i=0; i<suppCategories->size(); i++)
changeList[4].values.push_back (keywords->get_text (i)); changeList["SupplementalCategories"].push_back (suppCategories->get_text (i));
changeList[5].field = "Category";
changeList[5].values.push_back (category->get_entry()->get_text ()); changeList["Author" ].push_back (author->get_text ());
changeList[6].field = "SupplementalCategories"; changeList["AuthorsPosition"].push_back (authorPos->get_text ());
for (int i=0; i<suppCategories->size(); i++) changeList["Credit" ].push_back (credit->get_text ());
changeList[6].values.push_back (suppCategories->get_text (i)); changeList["Source" ].push_back (source->get_text ());
changeList[7].field = "Author"; changeList["Copyright" ].push_back (copyright->get_text ());
changeList[7].values.push_back (author->get_text ()); changeList["City" ].push_back (city->get_text ());
changeList[8].field = "AuthorsPosition"; changeList["Province" ].push_back (province->get_text ());
changeList[8].values.push_back (authorPos->get_text ()); changeList["Country" ].push_back (country->get_text ());
changeList[9].field = "Credit"; changeList["Title" ].push_back (title->get_text ());
changeList[9].values.push_back (credit->get_text ()); changeList["DateCreated" ].push_back (dateCreated->get_text ());
changeList[10].field = "Source"; changeList["TransReference" ].push_back (transReference->get_text ());
changeList[10].values.push_back (source->get_text ());
changeList[11].field = "Copyright";
changeList[11].values.push_back (copyright->get_text ());
changeList[12].field = "City";
changeList[12].values.push_back (city->get_text ());
changeList[13].field = "Province";
changeList[13].values.push_back (province->get_text ());
changeList[14].field = "Country";
changeList[14].values.push_back (country->get_text ());
changeList[15].field = "Title";
changeList[15].values.push_back (title->get_text ());
changeList[16].field = "DateCreated";
changeList[16].values.push_back (dateCreated->get_text ());
changeList[17].field = "TransReference";
changeList[17].values.push_back (transReference->get_text ());
notifyListener (); notifyListener ();
} }
@ -524,45 +510,47 @@ void IPTCPanel::applyChangeList () {
keyword->get_entry()->set_text (""); keyword->get_entry()->set_text ("");
suppCategory->get_entry()->set_text (""); suppCategory->get_entry()->set_text ("");
for (int i=0; i<changeList.size(); i++) for (rtengine::procparams::IPTCPairs::iterator i=changeList.begin(); i!=changeList.end(); i++) {
if (changeList[i].field == "Caption" && !changeList[i].values.empty()) printf("- %s: %s\n", i->first.c_str(), i->second.empty()?"[vide]":i->second.at(0).c_str());
captionText->set_text (changeList[i].values[0]); if (i->first == "Caption" && !i->second.empty())
else if (changeList[i].field == "CaptionWriter" && !changeList[i].values.empty()) captionText->set_text (i->second.at(0));
captionWriter->set_text (changeList[i].values[0]); else if (i->first == "CaptionWriter" && !i->second.empty())
else if (changeList[i].field == "Headline" && !changeList[i].values.empty()) captionWriter->set_text (i->second.at(0));
headline->set_text (changeList[i].values[0]); else if (i->first == "Headline" && !i->second.empty())
else if (changeList[i].field == "Instructions" && !changeList[i].values.empty()) headline->set_text (i->second.at(0));
instructions->set_text (changeList[i].values[0]); else if (i->first == "Instructions" && !i->second.empty())
else if (changeList[i].field == "Keywords") instructions->set_text (i->second.at(0));
for (int j=0; j<changeList[i].values.size(); j++) else if (i->first == "Keywords")
keywords->append_text (changeList[i].values[j]); for (unsigned int j=0; j<i->second.size(); j++)
else if (changeList[i].field == "Category" && !changeList[i].values.empty()) keywords->append_text (i->second.at(j));
category->get_entry()->set_text (changeList[i].values[0]); else if (i->first == "Category" && !i->second.empty())
else if (changeList[i].field == "SupplementalCategories") category->get_entry()->set_text (i->second.at(0));
for (int j=0; j<changeList[i].values.size(); j++) else if (i->first == "SupplementalCategories")
suppCategories->append_text (changeList[i].values[j]); for (unsigned int j=0; j<i->second.size(); j++)
else if (changeList[i].field == "Author" && !changeList[i].values.empty()) suppCategories->append_text (i->second.at(j));
author->set_text (changeList[i].values[0]); else if (i->first == "Author" && !i->second.empty())
else if (changeList[i].field == "AuthorsPosition" && !changeList[i].values.empty()) author->set_text (i->second.at(0));
authorPos->set_text (changeList[i].values[0]); else if (i->first == "AuthorsPosition" && !i->second.empty())
else if (changeList[i].field == "Credit" && !changeList[i].values.empty()) authorPos->set_text (i->second.at(0));
credit->set_text (changeList[i].values[0]); else if (i->first == "Credit" && !i->second.empty())
else if (changeList[i].field == "Source" && !changeList[i].values.empty()) credit->set_text (i->second.at(0));
source->set_text (changeList[i].values[0]); else if (i->first == "Source" && !i->second.empty())
else if (changeList[i].field == "Copyright" && !changeList[i].values.empty()) source->set_text (i->second.at(0));
copyright->set_text (changeList[i].values[0]); else if (i->first == "Copyright" && !i->second.empty())
else if (changeList[i].field == "City" && !changeList[i].values.empty()) copyright->set_text (i->second.at(0));
city->set_text (changeList[i].values[0]); else if (i->first == "City" && !i->second.empty())
else if (changeList[i].field == "Province" && !changeList[i].values.empty()) city->set_text (i->second.at(0));
province->set_text (changeList[i].values[0]); else if (i->first == "Province" && !i->second.empty())
else if (changeList[i].field == "Country" && !changeList[i].values.empty()) province->set_text (i->second.at(0));
country->set_text (changeList[i].values[0]); else if (i->first == "Country" && !i->second.empty())
else if (changeList[i].field == "Title" && !changeList[i].values.empty()) country->set_text (i->second.at(0));
title->set_text (changeList[i].values[0]); else if (i->first == "Title" && !i->second.empty())
else if (changeList[i].field == "DateCreated" && !changeList[i].values.empty()) title->set_text (i->second.at(0));
dateCreated->set_text (changeList[i].values[0]); else if (i->first == "DateCreated" && !i->second.empty())
else if (changeList[i].field == "TransReference" && !changeList[i].values.empty()) dateCreated->set_text (i->second.at(0));
transReference->set_text (changeList[i].values[0]); else if (i->first == "TransReference" && !i->second.empty())
transReference->set_text (i->second.at(0));
}
for (int i=0; i<16; i++) for (int i=0; i<16; i++)
conns[i].block (false); conns[i].block (false);

View File

@ -26,9 +26,9 @@
class IPTCPanel : public Gtk::VBox, public ToolPanel { class IPTCPanel : public Gtk::VBox, public ToolPanel {
private: private:
std::vector<rtengine::procparams::IPTCPair> changeList; rtengine::procparams::IPTCPairs changeList;
std::vector<rtengine::procparams::IPTCPair> defChangeList; rtengine::procparams::IPTCPairs defChangeList;
std::vector<rtengine::procparams::IPTCPair> embeddedData; rtengine::procparams::IPTCPairs embeddedData;
Gtk::TextView* captionView; Gtk::TextView* captionView;
Glib::RefPtr<Gtk::TextBuffer> captionText; Glib::RefPtr<Gtk::TextBuffer> captionText;

View File

@ -58,7 +58,8 @@ bool simpleEditor;
* 1 to start GUI (with a dir or file option) * 1 to start GUI (with a dir or file option)
* 2 to start GUI because no files found * 2 to start GUI because no files found
* -1 if there is an error in parameters * -1 if there is an error in parameters
* -2 if an error occurred during processing */ * -2 if an error occurred during processing
* -3 if at least one required procparam file was not found */
int processLineParams( int argc, char **argv ); int processLineParams( int argc, char **argv );
int main(int argc, char **argv) int main(int argc, char **argv)
@ -164,24 +165,36 @@ int main(int argc, char **argv)
return 0; return 0;
} }
void deleteProcParams(std::vector<rtengine::procparams::PartialProfile*> &pparams) {
for (unsigned int i=0; i<pparams.size(); i++) {
pparams[i]->deleteInstance();
delete pparams[i];
pparams[i] = NULL;
}
return;
}
int processLineParams( int argc, char **argv ) int processLineParams( int argc, char **argv )
{ {
rtengine::procparams::PartialProfile *rawParams=NULL, *imgParams=NULL;
std::vector<Glib::ustring> inputFiles; std::vector<Glib::ustring> inputFiles;
Glib::ustring outputPath = ""; Glib::ustring outputPath = "";
Glib::ustring processingParams = ""; std::vector<rtengine::procparams::PartialProfile*> processingParams;
bool isDirectory=false; bool isDirectory=false;
bool outputDirectory=false; bool outputDirectory=false;
bool overwriteFiles=false; bool overwriteFiles=false;
bool sideProcParams=false; bool sideProcParams=false;
bool copyParamsFile=false; bool copyParamsFile=false;
bool useDefaultIfAbsent=true; bool skipIfNoSidecar=false;
bool useDefault=false;
unsigned int sideCarFilePos = 0;
int compression=100; int compression=100;
int bits=-1; int bits=-1;
std::string outputType = ""; std::string outputType = "";
unsigned errors=0; unsigned errors=0;
for( int iArg=1; iArg<argc; iArg++){ for( int iArg=1; iArg<argc; iArg++){
if( argv[iArg][0]=='-' ){ if( argv[iArg][0]=='-' ){
switch( argv[iArg][1]){ switch( argv[iArg][1] ){
case 'O': case 'O':
copyParamsFile = true; copyParamsFile = true;
case 'o': // outputfile or dir case 'o': // outputfile or dir
@ -192,16 +205,35 @@ int processLineParams( int argc, char **argv )
outputDirectory=true; outputDirectory=true;
} }
break; break;
case 'p': // processing parameters for all inputs case 'p': // processing parameters for all inputs; all set procparams are required, so
// RT stop if any of them can't be loaded for any reason.
if( iArg+1 <argc ){ if( iArg+1 <argc ){
iArg++; iArg++;
processingParams = safe_filename_to_utf8 ( argv[iArg] ); Glib::ustring fname = safe_filename_to_utf8 ( argv[iArg] );
if (fname.at(0) == '-') {
std::cerr << "Error: filename missing next to the -p switch" << std::endl;
deleteProcParams(processingParams);
return -3;
}
rtengine::procparams::PartialProfile* currentParams = new rtengine::procparams::PartialProfile(true);
if (!(currentParams->load ( fname ))) {
processingParams.push_back(currentParams);
}
else {
std::cerr << "Error: \""<< fname <<"\" not found" << std::endl;
deleteProcParams(processingParams);
return -3;
}
} }
break; break;
case 'S': case 'S':
useDefaultIfAbsent=false; skipIfNoSidecar=true;
case 's': // Processing params next to file (.pp3 appended) case 's': // Processing params next to file (file extension appended)
sideProcParams = true; sideProcParams = true;
sideCarFilePos = processingParams.size();
break;
case 'd':
useDefault = true;
break; break;
case 'Y': case 'Y':
overwriteFiles =true; overwriteFiles =true;
@ -232,7 +264,7 @@ int processLineParams( int argc, char **argv )
safe_build_file_list (dir, names, argv[iArg] ); safe_build_file_list (dir, names, argv[iArg] );
for(size_t iFile=0; iFile< names.size(); iFile++ ){ for(size_t iFile=0; iFile< names.size(); iFile++ ){
if( !safe_file_test( names[iFile] , Glib::FILE_TEST_IS_DIR)){ if( !safe_file_test( names[iFile] , Glib::FILE_TEST_IS_DIR)){
// skip files without extension and pp3 files // skip files without extension and without sidecar files
Glib::ustring s(names[iFile]); Glib::ustring s(names[iFile]);
Glib::ustring::size_type ext= s.find_last_of('.'); Glib::ustring::size_type ext= s.find_last_of('.');
if( Glib::ustring::npos == ext ) if( Glib::ustring::npos == ext )
@ -250,27 +282,41 @@ int processLineParams( int argc, char **argv )
case 'h': case 'h':
case '?': case '?':
default: default:
std::cerr << "RawTherapee, " << VERSION << std::endl; {
std::cerr << "Copyright (c)2004-2011 Gabor Horvath <hgabor@rawtherapee.com>"<< std::endl << std::endl; Glib::ustring pparamsExt = paramFileExtension.substr(1);
std::cerr << "RawTherapee, V" << VERSION << std::endl;
std::cerr << "Copyright (c)2004-2012 Gabor Horvath <hgabor@rawtherapee.com>"<< std::endl << std::endl;
std::cerr << "Usage:"<< std::endl; std::cerr << "Usage:"<< std::endl;
std::cerr << Glib::path_get_basename(argv[0]) << " [<selected dir>] : start RT GUI browser inside dir."<< std::endl; std::cerr << Glib::path_get_basename(argv[0]) << " [<selected dir>] : start RT GUI browser inside dir."<< std::endl;
std::cerr << Glib::path_get_basename(argv[0]) << " <file> : start GUI editor with file."<< std::endl; std::cerr << Glib::path_get_basename(argv[0]) << " <file> : start GUI editor with file."<< std::endl;
std::cerr << Glib::path_get_basename(argv[0]) << " -c <inputDir>|<file list> : convert files in batch with default parameters."<< std::endl<< std::endl; std::cerr << Glib::path_get_basename(argv[0]) << " -c <inputDir>|<file list> : convert files in batch with default parameters."<< std::endl<< std::endl;
std::cerr << "Other options used with -c (that must be last option) "<< std::endl; std::cerr << "Other options used with -c (that must be last option) "<< std::endl;
std::cerr << Glib::path_get_basename(argv[0]) <<" [-o <output> | -O <output>] [-s | -S | -p <file>] [-j[1-100]|-t|-n] -Y -c <input>"<< std::endl; std::cerr << Glib::path_get_basename(argv[0]) <<" [-o <output> | -O <output>] [-s|-S] [-p <file>] [-d] [-j[1-100]|-t|-n] -Y -c <input>"<< std::endl;
std::cerr << " -o <outputFile>|<outputDir> : select output directory."<< std::endl; std::cerr << " -o <outputFile>|<outputDir> : select output directory."<< std::endl;
std::cerr << " -O <outputFile>|<outputDir> : select output dir and copy pp3 file into it"<< std::endl; std::cerr << " -O <outputFile>|<outputDir> : select output dir and copy " << pparamsExt << " file into it"<< std::endl;
std::cerr << " -s : select parameters to be pp3 file next to input file (with same name)"<< std::endl; std::cerr << " -s : include the " << pparamsExt << " file next to the input file (with same name) to build the image's parameters"<< std::endl;
std::cerr << " ex: for IMG001.NEF there should be IMG001.NEF.pp3 in the same dir" << std::endl; std::cerr << " ex: for IMG001.NEF there should be IMG001.NEF." << pparamsExt << " in the same dir" << std::endl;
std::cerr << " if absent use default" << std::endl; std::cerr << " if absent use default" << std::endl;
std::cerr << " -S : like -s but skip if pp3 file not found." << std::endl; std::cerr << " -S : like -s but skip if " << pparamsExt << " file not found." << std::endl;
std::cerr << " -p <file.pp3> : specify pp3 file to be used for all conversions."<< std::endl; std::cerr << " -p <file." << pparamsExt << "> : specify " << pparamsExt << " file to be used for all conversions."<< std::endl;
std::cerr << " you can specify as much -p option as you want (see the note below)."<< std::endl;
std::cerr << " -d : use the default Raw or Image " << pparamsExt << " file to build the image's parameters"<< std::endl;
std::cerr << " -j[compression] : specify output to be jpeg.(default)"<< std::endl; std::cerr << " -j[compression] : specify output to be jpeg.(default)"<< std::endl;
std::cerr << " -t : specify output to be tif."<< std::endl; std::cerr << " -t : specify output to be uncompressed tiff."<< std::endl;
std::cerr << " -t1: specify output to be compressed tiff."<< std::endl;
std::cerr << " -n : specify output to be png."<< std::endl; std::cerr << " -n : specify output to be png."<< std::endl;
std::cerr << " -Y : overwrite output if present."<< std::endl; std::cerr << " -Y : overwrite output if present."<< std::endl<<std::endl;
std::cerr << "NOTE: Your " << pparamsExt << " files can be incomplete, RawTherapee will set the values like that:"<< std::endl;
std::cerr << " - the " << pparamsExt << " file is built with internal default values;"<< std::endl;
std::cerr << " - then overrided by those found in the default Raw or Image " << pparamsExt << " file (if -d has been set);"<< std::endl;
std::cerr << " - then overrided by those found in the " << pparamsExt << " files provided by -p,"<< std::endl;
std::cerr << " each one overriding the previous values;" << std::endl;
std::cerr << " * then overrided by the sidecar file if -s is set and if the file exists;"<< std::endl;
std::cerr << " the time where the sidecar file is used depend of the position of the -s switch"<< std::endl;
std::cerr << " in the command line regarding to the -p parameters (e.g. \"-p first." << pparamsExt << " -p second." << pparamsExt << " -s -p fourth." << pparamsExt << "\")"<< std::endl;
return -1; return -1;
} }
}
}else{ }else{
argv1 = safe_filename_to_utf8 ( argv[iArg] ); argv1 = safe_filename_to_utf8 ( argv[iArg] );
if( outputDirectory ){ if( outputDirectory ){
@ -299,17 +345,33 @@ int processLineParams( int argc, char **argv )
if( inputFiles.empty() ) if( inputFiles.empty() )
return 2; return 2;
rtengine::procparams::ProcParams params,paramsRaw,paramsImg, *currentParams; if (useDefault) {
if( !sideProcParams ){ rawParams = new rtengine::procparams::PartialProfile(true);
if( processingParams.length()>0 ) if (rawParams->load(options.profilePath+"/" + options.defProfRaw + paramFileExtension)) {
params.load ( processingParams ); std::cerr << "Error: default Raw procparams file \""<< (options.profilePath+"/" + options.defProfRaw + paramFileExtension) << "\" not found" << std::endl;
else{ rawParams->deleteInstance();
paramsRaw.load(options.profilePath+"/"+options.defProfRaw+paramFileExtension); delete rawParams;
paramsImg.load(options.profilePath+"/"+options.defProfImg+paramFileExtension); deleteProcParams(processingParams);
return -3;
}
imgParams = new rtengine::procparams::PartialProfile(true);
if (imgParams->load(options.profilePath+"/" + options.defProfImg + paramFileExtension)) {
std::cerr << "Error: default Image procparams file \""<< (options.profilePath+"/" + options.defProfImg + paramFileExtension) << "\" not found" << std::endl;
imgParams->deleteInstance();
delete imgParams;
rawParams->deleteInstance();
delete rawParams;
deleteProcParams(processingParams);
return -3;
} }
} }
ParamsEdited paramsEdited;
for( size_t iFile=0; iFile< inputFiles.size(); iFile++){ for( size_t iFile=0; iFile< inputFiles.size(); iFile++){
// Has to be reinstanciated at each profile to have a ProcParams object with default values
rtengine::procparams::ProcParams currentParams;
Glib::ustring inputFile = inputFiles[iFile]; Glib::ustring inputFile = inputFiles[iFile];
std::cout << "Processing: " << inputFile << std::endl; std::cout << "Processing: " << inputFile << std::endl;
@ -354,27 +416,48 @@ int processLineParams( int argc, char **argv )
std::cerr << "Error loading file: "<< inputFile << std::endl; std::cerr << "Error loading file: "<< inputFile << std::endl;
continue; continue;
} }
if( sideProcParams ){
if (useDefault) {
if (isRaw) {
std::cout << " Merging default Raw profile" << std::endl;
rawParams->applyTo(&currentParams);
}
else {
std::cout << " Merging default Image profile" << std::endl;
imgParams->applyTo(&currentParams);
}
}
bool sideCarFound = false;
unsigned int i=0;
// Iterate the procparams file list in order to build the final ProcParams
do {
if (sideProcParams && i==sideCarFilePos) {
// using the sidecar file
Glib::ustring sideProcessingParams = inputFile + paramFileExtension; Glib::ustring sideProcessingParams = inputFile + paramFileExtension;
if( !safe_file_test( sideProcessingParams, Glib::FILE_TEST_EXISTS ) || params.load ( sideProcessingParams )){ // the "load" method don't reset the procparams values anymore, so values found in the procparam file override the one of currentParams
if( useDefaultIfAbsent ){ if( !safe_file_test( sideProcessingParams, Glib::FILE_TEST_EXISTS ) || currentParams.load ( sideProcessingParams ))
currentParams = isRaw? &paramsRaw: &paramsImg; std::cerr << "Warning: sidecar file requested but not found for: "<< sideProcessingParams << std::endl;
}else{ else {
sideCarFound = true;
std::cout << " Merging sidecar procparams" << std::endl;
}
}
if( processingParams.size()>i ) {
std::cout << " Merging procparams #" << i << std::endl;
processingParams[i]->applyTo(&currentParams);
}
i++;
} while (i < processingParams.size()+(sideProcParams?1:0));
if( sideProcParams && !sideCarFound && skipIfNoSidecar ){
delete ii; delete ii;
errors++; errors++;
std::cerr << "Error loading processing params: "<< sideProcessingParams << std::endl; std::cerr << "Error: no sidecar procparams found for: "<< inputFile << std::endl;
continue; continue;
} }
}else
currentParams = &params; job = rtengine::ProcessingJob::create (ii, currentParams);
}else if( processingParams.length()>0 ){
currentParams = &params;
}else if(isRaw ){
currentParams = &paramsRaw;
}else{
currentParams = &paramsImg;
}
job = rtengine::ProcessingJob::create (ii, *currentParams);
if( !job ){ if( !job ){
errors++; errors++;
std::cerr << "Error creating processing for: "<< inputFile << std::endl; std::cerr << "Error creating processing for: "<< inputFile << std::endl;
@ -406,12 +489,17 @@ int processLineParams( int argc, char **argv )
}else{ }else{
if( copyParamsFile ){ if( copyParamsFile ){
Glib::ustring outputProcessingParams = outputFile + paramFileExtension; Glib::ustring outputProcessingParams = outputFile + paramFileExtension;
currentParams->save( outputProcessingParams ); currentParams.save( outputProcessingParams );
} }
} }
ii->decreaseRef(); ii->decreaseRef();
resultImage->free(); resultImage->free();
} }
if (imgParams) { imgParams->deleteInstance(); delete imgParams; }
if (rawParams) { rawParams->deleteInstance(); delete rawParams; }
deleteProcParams(processingParams);
return errors>0?-2:0; return errors>0?-2:0;
} }

View File

@ -76,6 +76,7 @@ void Options::setDefaults () {
startupDir = STARTUPDIR_LAST; // was STARTUPDIR_HOME ; an empty startupPath is now correctly handled (open in the Home dir) startupDir = STARTUPDIR_LAST; // was STARTUPDIR_HOME ; an empty startupPath is now correctly handled (open in the Home dir)
startupPath = ""; startupPath = "";
profilePath = "profiles"; profilePath = "profiles";
loadSaveProfilePath = "";
dirBrowserWidth = 200; dirBrowserWidth = 200;
dirBrowserHeight = 150; dirBrowserHeight = 150;
preferencesWidth = 0; preferencesWidth = 0;
@ -165,8 +166,8 @@ void Options::setDefaults () {
fastexport_bypass_sharpening = true; fastexport_bypass_sharpening = true;
fastexport_bypass_sharpenEdge = true; fastexport_bypass_sharpenEdge = true;
fastexport_bypass_sharpenMicro = true; fastexport_bypass_sharpenMicro = true;
fastexport_bypass_lumaDenoise = true; //fastexport_bypass_lumaDenoise = true;
fastexport_bypass_colorDenoise = true; //fastexport_bypass_colorDenoise = true;
fastexport_bypass_defringe = true; fastexport_bypass_defringe = true;
fastexport_bypass_dirpyrDenoise = true; fastexport_bypass_dirpyrDenoise = true;
fastexport_bypass_sh_hq = true; fastexport_bypass_sh_hq = true;
@ -211,12 +212,12 @@ void Options::setDefaults () {
0, // ADDSET_LC_BRIGHTNESS 0, // ADDSET_LC_BRIGHTNESS
0, // ADDSET_LC_CONTRAST 0, // ADDSET_LC_CONTRAST
0, // ADDSET_SHARP_AMOUNT 0, // ADDSET_SHARP_AMOUNT
0, // ADDSET_LD_EDGETOLERANCE //0, // ADDSET_LD_EDGETOLERANCE -- From obsolete and removed tool
0, // ADDSET_WB_TEMPERATURE 0, // ADDSET_WB_TEMPERATURE
0, // ADDSET_WB_GREEN 0, // ADDSET_WB_GREEN
0, // ADDSET_CBOOST_AMOUNT //0, // ADDSET_CBOOST_AMOUNT -- From obsolete and removed tool
0, // ADDSET_CS_BLUEYELLOW //0, // ADDSET_CS_BLUEYELLOW -- From obsolete and removed tool
0, // ADDSET_CS_GREENMAGENTA //0, // ADDSET_CS_GREENMAGENTA -- From obsolete and removed tool
0, // ADDSET_ROTATE_DEGREE 0, // ADDSET_ROTATE_DEGREE
0, // ADDSET_DIST_AMOUNT 0, // ADDSET_DIST_AMOUNT
0, // ADDSET_PERSPECTIVE 0, // ADDSET_PERSPECTIVE
@ -368,6 +369,7 @@ if (keyFile.has_group ("Output")) {
if (keyFile.has_group ("Profiles")) { if (keyFile.has_group ("Profiles")) {
if (keyFile.has_key ("Profiles", "Directory")) profilePath = keyFile.get_string ("Profiles", "Directory"); if (keyFile.has_key ("Profiles", "Directory")) profilePath = keyFile.get_string ("Profiles", "Directory");
if (keyFile.has_key ("Profiles", "LoadSaveProfilePath")) loadSaveProfilePath = keyFile.get_string ("Profiles", "LoadSaveProfilePath");
if (keyFile.has_key ("Profiles", "RawDefault")) defProfRaw = keyFile.get_string ("Profiles", "RawDefault"); if (keyFile.has_key ("Profiles", "RawDefault")) defProfRaw = keyFile.get_string ("Profiles", "RawDefault");
if (keyFile.has_key ("Profiles", "ImgDefault")) defProfImg = keyFile.get_string ("Profiles", "ImgDefault"); if (keyFile.has_key ("Profiles", "ImgDefault")) defProfImg = keyFile.get_string ("Profiles", "ImgDefault");
if (keyFile.has_key ("Profiles", "SaveParamsWithFile")) saveParamsFile = keyFile.get_boolean ("Profiles", "SaveParamsWithFile"); if (keyFile.has_key ("Profiles", "SaveParamsWithFile")) saveParamsFile = keyFile.get_boolean ("Profiles", "SaveParamsWithFile");
@ -494,8 +496,8 @@ if (keyFile.has_group ("Fast Export")) {
if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpening" )) fastexport_bypass_sharpening = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpening" ); if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpening" )) fastexport_bypass_sharpening = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpening" );
if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpenEdge" )) fastexport_bypass_sharpenEdge = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpenEdge" ); if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpenEdge" )) fastexport_bypass_sharpenEdge = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpenEdge" );
if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpenMicro" )) fastexport_bypass_sharpenMicro = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpenMicro" ); if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpenMicro" )) fastexport_bypass_sharpenMicro = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpenMicro" );
if (keyFile.has_key ("Fast Export", "fastexport_bypass_lumaDenoise" )) fastexport_bypass_lumaDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" ); //if (keyFile.has_key ("Fast Export", "fastexport_bypass_lumaDenoise" )) fastexport_bypass_lumaDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" );
if (keyFile.has_key ("Fast Export", "fastexport_bypass_colorDenoise" )) fastexport_bypass_colorDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_colorDenoise" ); //if (keyFile.has_key ("Fast Export", "fastexport_bypass_colorDenoise" )) fastexport_bypass_colorDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_colorDenoise" );
if (keyFile.has_key ("Fast Export", "fastexport_bypass_defringe" )) fastexport_bypass_defringe = keyFile.get_boolean ("Fast Export", "fastexport_bypass_defringe" ); if (keyFile.has_key ("Fast Export", "fastexport_bypass_defringe" )) fastexport_bypass_defringe = keyFile.get_boolean ("Fast Export", "fastexport_bypass_defringe" );
if (keyFile.has_key ("Fast Export", "fastexport_bypass_dirpyrDenoise" )) fastexport_bypass_dirpyrDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" ); if (keyFile.has_key ("Fast Export", "fastexport_bypass_dirpyrDenoise" )) fastexport_bypass_dirpyrDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" );
if (keyFile.has_key ("Fast Export", "fastexport_bypass_sh_hq" )) fastexport_bypass_sh_hq = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sh_hq" ); if (keyFile.has_key ("Fast Export", "fastexport_bypass_sh_hq" )) fastexport_bypass_sh_hq = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sh_hq" );
@ -622,6 +624,7 @@ int Options::saveToFile (Glib::ustring fname) {
keyFile.set_boolean ("Output", "TunnelMetaData", tunnelMetaData); keyFile.set_boolean ("Output", "TunnelMetaData", tunnelMetaData);
keyFile.set_string ("Profiles", "Directory", profilePath); keyFile.set_string ("Profiles", "Directory", profilePath);
keyFile.set_string ("Profiles", "LoadSaveProfilePath", loadSaveProfilePath);
keyFile.set_string ("Profiles", "RawDefault", defProfRaw); keyFile.set_string ("Profiles", "RawDefault", defProfRaw);
keyFile.set_string ("Profiles", "ImgDefault", defProfImg); keyFile.set_string ("Profiles", "ImgDefault", defProfImg);
keyFile.set_boolean ("Profiles", "SaveParamsWithFile", saveParamsFile); keyFile.set_boolean ("Profiles", "SaveParamsWithFile", saveParamsFile);
@ -700,8 +703,8 @@ int Options::saveToFile (Glib::ustring fname) {
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpening" , fastexport_bypass_sharpening ); keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpening" , fastexport_bypass_sharpening );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenEdge" , fastexport_bypass_sharpenEdge ); keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenEdge" , fastexport_bypass_sharpenEdge );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenMicro" , fastexport_bypass_sharpenMicro ); keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenMicro" , fastexport_bypass_sharpenMicro );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" , fastexport_bypass_lumaDenoise ); //keyFile.set_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" , fastexport_bypass_lumaDenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_colorDenoise" , fastexport_bypass_colorDenoise ); //keyFile.set_boolean ("Fast Export", "fastexport_bypass_colorDenoise" , fastexport_bypass_colorDenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_defringe" , fastexport_bypass_defringe ); keyFile.set_boolean ("Fast Export", "fastexport_bypass_defringe" , fastexport_bypass_defringe );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" , fastexport_bypass_dirpyrDenoise ); keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" , fastexport_bypass_dirpyrDenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sh_hq" , fastexport_bypass_sh_hq ); keyFile.set_boolean ("Fast Export", "fastexport_bypass_sh_hq" , fastexport_bypass_sh_hq );

View File

@ -61,6 +61,7 @@ class Options {
int startupDir; int startupDir;
Glib::ustring startupPath; Glib::ustring startupPath;
Glib::ustring profilePath; Glib::ustring profilePath;
Glib::ustring loadSaveProfilePath;
Glib::ustring lastSaveAsPath; Glib::ustring lastSaveAsPath;
int saveAsDialogWidth; int saveAsDialogWidth;
int saveAsDialogHeight; int saveAsDialogHeight;
@ -167,8 +168,8 @@ class Options {
bool fastexport_bypass_sharpening; bool fastexport_bypass_sharpening;
bool fastexport_bypass_sharpenEdge; bool fastexport_bypass_sharpenEdge;
bool fastexport_bypass_sharpenMicro; bool fastexport_bypass_sharpenMicro;
bool fastexport_bypass_lumaDenoise; //bool fastexport_bypass_lumaDenoise;
bool fastexport_bypass_colorDenoise; //bool fastexport_bypass_colorDenoise;
bool fastexport_bypass_defringe; bool fastexport_bypass_defringe;
bool fastexport_bypass_dirpyrDenoise; bool fastexport_bypass_dirpyrDenoise;
bool fastexport_bypass_sh_hq; bool fastexport_bypass_sh_hq;

View File

@ -28,6 +28,10 @@ ParamsEdited::ParamsEdited () {
void ParamsEdited::set (bool v) { void ParamsEdited::set (bool v) {
general.rank = v;
general.colorlabel = v;
general.intrash = v;
toneCurve.curve = v; toneCurve.curve = v;
toneCurve.brightness = v; toneCurve.brightness = v;
toneCurve.black = v; toneCurve.black = v;
@ -80,20 +84,20 @@ void ParamsEdited::set (bool v) {
vibrance.protectskins = v; vibrance.protectskins = v;
vibrance.avoidcolorshift = v; vibrance.avoidcolorshift = v;
vibrance.pastsattog = v; vibrance.pastsattog = v;
colorBoost.amount = v; //colorBoost.amount = v;
colorBoost.avoidclip = v; //colorBoost.avoidclip = v;
colorBoost.enable_saturationlimiter = v; //colorBoost.enable_saturationlimiter = v;
colorBoost.saturationlimit = v; //colorBoost.saturationlimit = v;
wb.method = v; wb.method = v;
wb.green = v; wb.green = v;
wb.temperature = v; wb.temperature = v;
colorShift.a = v; //colorShift.a = v;
colorShift.b = v; //colorShift.b = v;
lumaDenoise.enabled = v; //lumaDenoise.enabled = v;
lumaDenoise.radius = v; //lumaDenoise.radius = v;
lumaDenoise.edgetolerance = v; //lumaDenoise.edgetolerance = v;
colorDenoise.enabled = v; //colorDenoise.enabled = v;
colorDenoise.amount = v; //colorDenoise.amount = v;
defringe.enabled = v; defringe.enabled = v;
defringe.radius = v; defringe.radius = v;
defringe.threshold = v; defringe.threshold = v;
@ -176,7 +180,8 @@ void ParamsEdited::set (bool v) {
raw.caBlue = v; raw.caBlue = v;
raw.caRed = v; raw.caRed = v;
raw.greenEq = v; raw.greenEq = v;
raw.hotDeadPixel = v; raw.hotDeadPixelFilter = v;
raw.hotDeadPixelThresh = v;
raw.linenoise = v; raw.linenoise = v;
raw.darkFrame = v; raw.darkFrame = v;
raw.dfAuto = v; raw.dfAuto = v;
@ -199,8 +204,8 @@ void ParamsEdited::set (bool v) {
hsvequalizer.hcurve = v; hsvequalizer.hcurve = v;
hsvequalizer.scurve = v; hsvequalizer.scurve = v;
hsvequalizer.vcurve = v; hsvequalizer.vcurve = v;
exif.clear (); exif = v;
iptc.clear (); iptc = v;
} }
using namespace rtengine; using namespace rtengine;
@ -267,20 +272,20 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
vibrance.protectskins = vibrance.protectskins && p.vibrance.protectskins == other.vibrance.protectskins; vibrance.protectskins = vibrance.protectskins && p.vibrance.protectskins == other.vibrance.protectskins;
vibrance.avoidcolorshift = vibrance.avoidcolorshift && p.vibrance.avoidcolorshift == other.vibrance.avoidcolorshift; vibrance.avoidcolorshift = vibrance.avoidcolorshift && p.vibrance.avoidcolorshift == other.vibrance.avoidcolorshift;
vibrance.pastsattog = vibrance.pastsattog && p.vibrance.pastsattog == other.vibrance.pastsattog; vibrance.pastsattog = vibrance.pastsattog && p.vibrance.pastsattog == other.vibrance.pastsattog;
colorBoost.amount = colorBoost.amount && p.colorBoost.amount == other.colorBoost.amount; //colorBoost.amount = colorBoost.amount && p.colorBoost.amount == other.colorBoost.amount;
colorBoost.avoidclip = colorBoost.avoidclip && p.colorBoost.avoidclip == other.colorBoost.avoidclip; //colorBoost.avoidclip = colorBoost.avoidclip && p.colorBoost.avoidclip == other.colorBoost.avoidclip;
colorBoost.enable_saturationlimiter = colorBoost.enable_saturationlimiter && p.colorBoost.enable_saturationlimiter == other.colorBoost.enable_saturationlimiter; //colorBoost.enable_saturationlimiter = colorBoost.enable_saturationlimiter && p.colorBoost.enable_saturationlimiter == other.colorBoost.enable_saturationlimiter;
colorBoost.saturationlimit = colorBoost.saturationlimit && p.colorBoost.saturationlimit == other.colorBoost.saturationlimit; //colorBoost.saturationlimit = colorBoost.saturationlimit && p.colorBoost.saturationlimit == other.colorBoost.saturationlimit;
wb.method = wb.method && p.wb.method == other.wb.method; wb.method = wb.method && p.wb.method == other.wb.method;
wb.green = wb.green && p.wb.green == other.wb.green; wb.green = wb.green && p.wb.green == other.wb.green;
wb.temperature = wb.temperature && p.wb.temperature == other.wb.temperature; wb.temperature = wb.temperature && p.wb.temperature == other.wb.temperature;
colorShift.a = colorShift.a && p.colorShift.a == other.colorShift.a; //colorShift.a = colorShift.a && p.colorShift.a == other.colorShift.a;
colorShift.b = colorShift.b && p.colorShift.b == other.colorShift.b; //colorShift.b = colorShift.b && p.colorShift.b == other.colorShift.b;
lumaDenoise.enabled = lumaDenoise.enabled && p.lumaDenoise.enabled == other.lumaDenoise.enabled; //lumaDenoise.enabled = lumaDenoise.enabled && p.lumaDenoise.enabled == other.lumaDenoise.enabled;
lumaDenoise.radius = lumaDenoise.radius && p.lumaDenoise.radius == other.lumaDenoise.radius; //lumaDenoise.radius = lumaDenoise.radius && p.lumaDenoise.radius == other.lumaDenoise.radius;
lumaDenoise.edgetolerance = lumaDenoise.edgetolerance && p.lumaDenoise.edgetolerance == other.lumaDenoise.edgetolerance; //lumaDenoise.edgetolerance = lumaDenoise.edgetolerance && p.lumaDenoise.edgetolerance == other.lumaDenoise.edgetolerance;
colorDenoise.enabled = colorDenoise.enabled && p.colorDenoise.enabled == other.colorDenoise.enabled; //colorDenoise.enabled = colorDenoise.enabled && p.colorDenoise.enabled == other.colorDenoise.enabled;
colorDenoise.amount = colorDenoise.amount && p.colorDenoise.amount == other.colorDenoise.amount; //colorDenoise.amount = colorDenoise.amount && p.colorDenoise.amount == other.colorDenoise.amount;
defringe.enabled = defringe.enabled && p.defringe.enabled == other.defringe.enabled; defringe.enabled = defringe.enabled && p.defringe.enabled == other.defringe.enabled;
defringe.radius = defringe.radius && p.defringe.radius == other.defringe.radius; defringe.radius = defringe.radius && p.defringe.radius == other.defringe.radius;
defringe.threshold = defringe.threshold && p.defringe.threshold == other.defringe.threshold; defringe.threshold = defringe.threshold && p.defringe.threshold == other.defringe.threshold;
@ -367,7 +372,8 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
raw.caRed = raw.caRed && p.raw.cared == other.raw.cared; raw.caRed = raw.caRed && p.raw.cared == other.raw.cared;
raw.caBlue = raw.caBlue && p.raw.cablue == other.raw.cablue; raw.caBlue = raw.caBlue && p.raw.cablue == other.raw.cablue;
raw.greenEq = raw.greenEq && p.raw.greenthresh == other.raw.greenthresh; raw.greenEq = raw.greenEq && p.raw.greenthresh == other.raw.greenthresh;
raw.hotDeadPixel = raw.hotDeadPixel && p.raw.hotdeadpix_filt == other.raw.hotdeadpix_filt; raw.hotDeadPixelFilter = raw.hotDeadPixelFilter && p.raw.hotdeadpix_filt == other.raw.hotdeadpix_filt;
raw.hotDeadPixelThresh = raw.hotDeadPixelThresh && p.raw.hotdeadpix_thresh == other.raw.hotdeadpix_thresh;
raw.linenoise = raw.linenoise && p.raw.linenoise == other.raw.linenoise; raw.linenoise = raw.linenoise && p.raw.linenoise == other.raw.linenoise;
raw.darkFrame = raw.darkFrame && p.raw.dark_frame == other.raw.dark_frame; raw.darkFrame = raw.darkFrame && p.raw.dark_frame == other.raw.dark_frame;
raw.dfAuto = raw.dfAuto && p.raw.df_autoselect == other.raw.df_autoselect; raw.dfAuto = raw.dfAuto && p.raw.df_autoselect == other.raw.df_autoselect;
@ -390,6 +396,8 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
hsvequalizer.hcurve = hsvequalizer.hcurve && p.hsvequalizer.hcurve == other.hsvequalizer.hcurve; hsvequalizer.hcurve = hsvequalizer.hcurve && p.hsvequalizer.hcurve == other.hsvequalizer.hcurve;
hsvequalizer.scurve = hsvequalizer.scurve && p.hsvequalizer.scurve == other.hsvequalizer.scurve; hsvequalizer.scurve = hsvequalizer.scurve && p.hsvequalizer.scurve == other.hsvequalizer.scurve;
hsvequalizer.vcurve = hsvequalizer.vcurve && p.hsvequalizer.vcurve == other.hsvequalizer.vcurve; hsvequalizer.vcurve = hsvequalizer.vcurve && p.hsvequalizer.vcurve == other.hsvequalizer.vcurve;
// How the hell can we handle that???
// exif = exif && p.exif==other.exif // exif = exif && p.exif==other.exif
// iptc = other.iptc; // iptc = other.iptc;
} }
@ -454,24 +462,20 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (vibrance.avoidcolorshift) toEdit.vibrance.avoidcolorshift = mods.vibrance.avoidcolorshift; if (vibrance.avoidcolorshift) toEdit.vibrance.avoidcolorshift = mods.vibrance.avoidcolorshift;
if (vibrance.pastsattog) toEdit.vibrance.pastsattog = mods.vibrance.pastsattog; if (vibrance.pastsattog) toEdit.vibrance.pastsattog = mods.vibrance.pastsattog;
//if (colorBoost.amount) toEdit.colorBoost.amount = dontforceSet && options.baBehav[ADDSET_CBOOST_AMOUNT] ? toEdit.colorBoost.amount + mods.colorBoost.amount : mods.colorBoost.amount;
//if (colorBoost.avoidclip) toEdit.colorBoost.avoidclip = mods.colorBoost.avoidclip;
//if (colorBoost.enable_saturationlimiter)toEdit.colorBoost.enable_saturationlimiter = mods.colorBoost.enable_saturationlimiter;
//if (colorBoost.saturationlimit) toEdit.colorBoost.saturationlimit = mods.colorBoost.saturationlimit;
if (colorBoost.amount) toEdit.colorBoost.amount = dontforceSet && options.baBehav[ADDSET_CBOOST_AMOUNT] ? toEdit.colorBoost.amount + mods.colorBoost.amount : mods.colorBoost.amount;
if (colorBoost.avoidclip) toEdit.colorBoost.avoidclip = mods.colorBoost.avoidclip;
if (colorBoost.enable_saturationlimiter)toEdit.colorBoost.enable_saturationlimiter = mods.colorBoost.enable_saturationlimiter;
if (colorBoost.saturationlimit) toEdit.colorBoost.saturationlimit = mods.colorBoost.saturationlimit;
if (wb.method) toEdit.wb.method = mods.wb.method; if (wb.method) toEdit.wb.method = mods.wb.method;
if (wb.green) toEdit.wb.green = dontforceSet && options.baBehav[ADDSET_WB_GREEN] ? toEdit.wb.green + mods.wb.green : mods.wb.green; if (wb.green) toEdit.wb.green = dontforceSet && options.baBehav[ADDSET_WB_GREEN] ? toEdit.wb.green + mods.wb.green : mods.wb.green;
if (wb.temperature) toEdit.wb.temperature = dontforceSet && options.baBehav[ADDSET_WB_TEMPERATURE] ? toEdit.wb.temperature + mods.wb.temperature : mods.wb.temperature; if (wb.temperature) toEdit.wb.temperature = dontforceSet && options.baBehav[ADDSET_WB_TEMPERATURE] ? toEdit.wb.temperature + mods.wb.temperature : mods.wb.temperature;
if (colorShift.a) toEdit.colorShift.a = dontforceSet && options.baBehav[ADDSET_CS_BLUEYELLOW] ? toEdit.colorShift.a + mods.colorShift.a : mods.colorShift.a; //if (colorShift.a) toEdit.colorShift.a = dontforceSet && options.baBehav[ADDSET_CS_BLUEYELLOW] ? toEdit.colorShift.a + mods.colorShift.a : mods.colorShift.a;
if (colorShift.b) toEdit.colorShift.b = dontforceSet && options.baBehav[ADDSET_CS_GREENMAGENTA] ? toEdit.colorShift.b + mods.colorShift.b : mods.colorShift.b; //if (colorShift.b) toEdit.colorShift.b = dontforceSet && options.baBehav[ADDSET_CS_GREENMAGENTA] ? toEdit.colorShift.b + mods.colorShift.b : mods.colorShift.b;
if (lumaDenoise.enabled) toEdit.lumaDenoise.enabled = mods.lumaDenoise.enabled; //if (lumaDenoise.enabled) toEdit.lumaDenoise.enabled = mods.lumaDenoise.enabled;
if (lumaDenoise.radius) toEdit.lumaDenoise.radius = mods.lumaDenoise.radius; //if (lumaDenoise.radius) toEdit.lumaDenoise.radius = mods.lumaDenoise.radius;
if (lumaDenoise.edgetolerance) toEdit.lumaDenoise.edgetolerance = dontforceSet && options.baBehav[ADDSET_LD_EDGETOLERANCE] ? toEdit.lumaDenoise.edgetolerance + mods.lumaDenoise.edgetolerance : mods.lumaDenoise.edgetolerance; //if (lumaDenoise.edgetolerance) toEdit.lumaDenoise.edgetolerance = dontforceSet && options.baBehav[ADDSET_LD_EDGETOLERANCE] ? toEdit.lumaDenoise.edgetolerance + mods.lumaDenoise.edgetolerance : mods.lumaDenoise.edgetolerance;
if (colorDenoise.enabled) toEdit.colorDenoise.enabled = mods.colorDenoise.enabled; //if (colorDenoise.enabled) toEdit.colorDenoise.enabled = mods.colorDenoise.enabled;
if (colorDenoise.amount) toEdit.colorDenoise.amount = mods.colorDenoise.amount; //if (colorDenoise.amount) toEdit.colorDenoise.amount = mods.colorDenoise.amount;
if (defringe.enabled) toEdit.defringe.enabled = mods.defringe.enabled; if (defringe.enabled) toEdit.defringe.enabled = mods.defringe.enabled;
if (defringe.radius) toEdit.defringe.radius = mods.defringe.radius; if (defringe.radius) toEdit.defringe.radius = mods.defringe.radius;
@ -512,7 +516,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (coarse.hflip) toEdit.coarse.hflip = mods.coarse.hflip ? !toEdit.coarse.hflip : toEdit.coarse.hflip; if (coarse.hflip) toEdit.coarse.hflip = mods.coarse.hflip ? !toEdit.coarse.hflip : toEdit.coarse.hflip;
if (coarse.vflip) toEdit.coarse.vflip = mods.coarse.vflip ? !toEdit.coarse.vflip : toEdit.coarse.vflip; if (coarse.vflip) toEdit.coarse.vflip = mods.coarse.vflip ? !toEdit.coarse.vflip : toEdit.coarse.vflip;
if (commonTrans.autofill) toEdit.commonTrans.autofill = mods.commonTrans.autofill; if (commonTrans.autofill) toEdit.commonTrans.autofill = mods.commonTrans.autofill;
if (rotate.degree) toEdit.rotate.degree = dontforceSet && options.baBehav[17] ? toEdit.rotate.degree + mods.rotate.degree : mods.rotate.degree; if (rotate.degree) toEdit.rotate.degree = dontforceSet && options.baBehav[ADDSET_ROTATE_DEGREE] ? toEdit.rotate.degree + mods.rotate.degree : mods.rotate.degree;
if (distortion.uselensfun) toEdit.distortion.uselensfun = mods.distortion.uselensfun; if (distortion.uselensfun) toEdit.distortion.uselensfun = mods.distortion.uselensfun;
if (distortion.amount) toEdit.distortion.amount = dontforceSet && options.baBehav[ADDSET_DIST_AMOUNT] ? toEdit.distortion.amount + mods.distortion.amount : mods.distortion.amount; if (distortion.amount) toEdit.distortion.amount = dontforceSet && options.baBehav[ADDSET_DIST_AMOUNT] ? toEdit.distortion.amount + mods.distortion.amount : mods.distortion.amount;
if (perspective.horizontal) toEdit.perspective.horizontal = dontforceSet && options.baBehav[ADDSET_PERSPECTIVE] ? toEdit.perspective.horizontal + mods.perspective.horizontal : mods.perspective.horizontal; if (perspective.horizontal) toEdit.perspective.horizontal = dontforceSet && options.baBehav[ADDSET_PERSPECTIVE] ? toEdit.perspective.horizontal + mods.perspective.horizontal : mods.perspective.horizontal;
@ -566,7 +570,8 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (raw.exTwoGreen) toEdit.raw.twogreen = mods.raw.twogreen; if (raw.exTwoGreen) toEdit.raw.twogreen = mods.raw.twogreen;
if (raw.greenEq) toEdit.raw.greenthresh = dontforceSet && options.baBehav[ADDSET_PREPROCESS_GREENEQUIL] ? toEdit.raw.greenthresh + mods.raw.greenthresh : mods.raw.greenthresh; if (raw.greenEq) toEdit.raw.greenthresh = dontforceSet && options.baBehav[ADDSET_PREPROCESS_GREENEQUIL] ? toEdit.raw.greenthresh + mods.raw.greenthresh : mods.raw.greenthresh;
if (raw.hotDeadPixel) toEdit.raw.hotdeadpix_filt = mods.raw.hotdeadpix_filt; if (raw.hotDeadPixelFilter) toEdit.raw.hotdeadpix_filt = mods.raw.hotdeadpix_filt;
if (raw.hotDeadPixelThresh) toEdit.raw.hotdeadpix_thresh = mods.raw.hotdeadpix_thresh;
if (raw.linenoise) toEdit.raw.linenoise = dontforceSet && options.baBehav[ADDSET_PREPROCESS_LINEDENOISE] ? toEdit.raw.linenoise + mods.raw.linenoise : mods.raw.linenoise; if (raw.linenoise) toEdit.raw.linenoise = dontforceSet && options.baBehav[ADDSET_PREPROCESS_LINEDENOISE] ? toEdit.raw.linenoise + mods.raw.linenoise : mods.raw.linenoise;
if (raw.darkFrame) toEdit.raw.dark_frame = mods.raw.dark_frame; if (raw.darkFrame) toEdit.raw.dark_frame = mods.raw.dark_frame;
if (raw.dfAuto) toEdit.raw.df_autoselect = mods.raw.df_autoselect; if (raw.dfAuto) toEdit.raw.df_autoselect = mods.raw.df_autoselect;
@ -584,12 +589,21 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (hsvequalizer.scurve) toEdit.hsvequalizer.scurve = mods.hsvequalizer.scurve; if (hsvequalizer.scurve) toEdit.hsvequalizer.scurve = mods.hsvequalizer.scurve;
if (hsvequalizer.vcurve) toEdit.hsvequalizer.vcurve = mods.hsvequalizer.vcurve; if (hsvequalizer.vcurve) toEdit.hsvequalizer.vcurve = mods.hsvequalizer.vcurve;
// if (exif) toEdit.exif==mo.exif = mods.exif==other.exif; // Exif changes are added to the existing ones
// if (iptc;) toEdit.iptc==other.iptc; = mods.iptc==other.iptc;; if (exif)
for (procparams::ExifPairs::const_iterator i=mods.exif.begin(); i!=mods.exif.end(); i++) {
toEdit.exif[i->first] = i->second;
}
// IPTC changes are added to the existing ones
if (iptc)
for (procparams::IPTCPairs::const_iterator i=mods.iptc.begin(); i!=mods.iptc.end(); i++) {
toEdit.iptc[i->first] = i->second;
}
} }
bool RAWParamsEdited::isUnchanged() const { bool RAWParamsEdited::isUnchanged() const {
return ccSteps && dmethod && dcbIterations && dcbEnhance && allEnhance && caCorrection && caRed && caBlue && greenEq return ccSteps && dmethod && dcbIterations && dcbEnhance && allEnhance && caCorrection && caRed && caBlue && greenEq
&& hotDeadPixel && linenoise && darkFrame && dfAuto && ff_file && ff_AutoSelect && ff_BlurRadius && ff_BlurType && hotDeadPixelFilter && hotDeadPixelThresh && linenoise && darkFrame && dfAuto && ff_file && ff_AutoSelect && ff_BlurRadius && ff_BlurType
&& exPos && exPreser && exBlackzero && exBlackone && exBlacktwo && exBlackthree && exTwoGreen; && exPos && exPreser && exBlackzero && exBlackone && exBlacktwo && exBlackthree && exTwoGreen;
} }

View File

@ -21,8 +21,16 @@
#include <glibmm.h> #include <glibmm.h>
#include <vector> #include <vector>
#include "../rtengine/rtengine.h"
#include "../rtengine/procparams.h" #include "../rtengine/procparams.h"
#include "../rtengine/rtengine.h"
class GeneralParamsEdited {
public:
bool rank;
bool colorlabel;
bool intrash;
};
class ToneCurveParamsEdited { class ToneCurveParamsEdited {
@ -111,14 +119,14 @@ class VibranceParamsEdited {
bool pastsattog; bool pastsattog;
}; };
class ColorBoostParamsEdited { /*class ColorBoostParamsEdited {
public: public:
bool amount; bool amount;
bool avoidclip; bool avoidclip;
bool enable_saturationlimiter; bool enable_saturationlimiter;
bool saturationlimit; bool saturationlimit;
}; };*/
class WBParamsEdited { class WBParamsEdited {
@ -128,27 +136,27 @@ class WBParamsEdited {
bool green; bool green;
}; };
class ColorShiftParamsEdited { /*class ColorShiftParamsEdited {
public: public:
bool a; bool a;
bool b; bool b;
}; };*/
class LumaDenoiseParamsEdited { /*class LumaDenoiseParamsEdited {
public: public:
bool enabled; bool enabled;
bool radius; bool radius;
bool edgetolerance; bool edgetolerance;
}; };*/
class ColorDenoiseParamsEdited { /*class ColorDenoiseParamsEdited {
public: public:
bool enabled; bool enabled;
bool amount; bool amount;
}; };*/
class DefringeParamsEdited { class DefringeParamsEdited {
@ -331,7 +339,8 @@ class RAWParamsEdited {
bool caRed; bool caRed;
bool caBlue; bool caBlue;
bool greenEq; bool greenEq;
bool hotDeadPixel; bool hotDeadPixelFilter;
bool hotDeadPixelThresh;
bool linenoise; bool linenoise;
bool darkFrame; bool darkFrame;
bool dfAuto; bool dfAuto;
@ -350,23 +359,10 @@ class RAWParamsEdited {
bool isUnchanged() const; bool isUnchanged() const;
}; };
class ExifPairEdited {
public:
Glib::ustring field;
bool value;
};
class IPTCPairEdited {
public:
Glib::ustring field;
bool values;
};
class ParamsEdited { class ParamsEdited {
public: public:
GeneralParamsEdited general;
ToneCurveParamsEdited toneCurve; ToneCurveParamsEdited toneCurve;
LCurveParamsEdited labCurve; LCurveParamsEdited labCurve;
RGBCurvesParamsEdited rgbCurves; RGBCurvesParamsEdited rgbCurves;
@ -374,11 +370,11 @@ class ParamsEdited {
SharpenEdgeParamsEdited sharpenEdge; SharpenEdgeParamsEdited sharpenEdge;
SharpenMicroParamsEdited sharpenMicro; SharpenMicroParamsEdited sharpenMicro;
VibranceParamsEdited vibrance; VibranceParamsEdited vibrance;
ColorBoostParamsEdited colorBoost; //ColorBoostParamsEdited colorBoost;
WBParamsEdited wb; WBParamsEdited wb;
ColorShiftParamsEdited colorShift; //ColorShiftParamsEdited colorShift;
LumaDenoiseParamsEdited lumaDenoise; //LumaDenoiseParamsEdited lumaDenoise;
ColorDenoiseParamsEdited colorDenoise; //ColorDenoiseParamsEdited colorDenoise;
DefringeParamsEdited defringe; DefringeParamsEdited defringe;
DirPyrDenoiseParamsEdited dirpyrDenoise; DirPyrDenoiseParamsEdited dirpyrDenoise;
EPDParamsEdited edgePreservingDecompositionUI; EPDParamsEdited edgePreservingDecompositionUI;
@ -399,8 +395,8 @@ class ParamsEdited {
RAWParamsEdited raw; RAWParamsEdited raw;
DirPyrEqualizerParamsEdited dirpyrequalizer; DirPyrEqualizerParamsEdited dirpyrequalizer;
HSVEqualizerParamsEdited hsvequalizer; HSVEqualizerParamsEdited hsvequalizer;
std::vector<ExifPairEdited> exif; bool exif;
std::vector<IPTCPairEdited> iptc; bool iptc;
ParamsEdited (); ParamsEdited ();

View File

@ -18,11 +18,12 @@
*/ */
#include "partialpastedlg.h" #include "partialpastedlg.h"
#include "multilangmgr.h" #include "multilangmgr.h"
#include "paramsedited.h"
PartialPasteDlg::PartialPasteDlg () { PartialPasteDlg::PartialPasteDlg (Glib::ustring title) {
set_modal (true); set_modal (true);
set_title (M("PARTIALPASTE_DIALOGLABEL")); set_title (title);
everything = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EVERYTHING"))); everything = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EVERYTHING")));
everything ->set_name("partialPasteHeader"); everything ->set_name("partialPasteHeader");
@ -47,6 +48,7 @@ PartialPasteDlg::PartialPasteDlg () {
exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE"))); exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE")));
hlrec = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_HLRECONSTRUCTION"))); hlrec = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_HLRECONSTRUCTION")));
sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS"))); sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS")));
epd = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD")));
labcurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LABCURVE"))); labcurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LABCURVE")));
// options in detail: // options in detail:
@ -56,7 +58,6 @@ PartialPasteDlg::PartialPasteDlg () {
impden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IMPULSEDENOISE"))); impden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IMPULSEDENOISE")));
dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER"))); dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER")));
defringe = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEFRINGE"))); defringe = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEFRINGE")));
edgePreservingDecompositionUI = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD")));
// options in color: // options in color:
vibrance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_VIBRANCE"))); vibrance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_VIBRANCE")));
@ -122,6 +123,7 @@ PartialPasteDlg::PartialPasteDlg () {
vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*hlrec, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*hlrec, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*epd, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*labcurve, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*labcurve, Gtk::PACK_SHRINK, 2);
vboxes[1]->pack_start (*detail, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*detail, Gtk::PACK_SHRINK, 2);
@ -132,7 +134,6 @@ PartialPasteDlg::PartialPasteDlg () {
vboxes[1]->pack_start (*impden, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*impden, Gtk::PACK_SHRINK, 2);
vboxes[1]->pack_start (*dirpyrden, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*dirpyrden, Gtk::PACK_SHRINK, 2);
vboxes[1]->pack_start (*defringe, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*defringe, Gtk::PACK_SHRINK, 2);
vboxes[1]->pack_start (*edgePreservingDecompositionUI, Gtk::PACK_SHRINK, 2);
vboxes[1]->pack_start (*dirpyreq, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*dirpyreq, Gtk::PACK_SHRINK, 2);
//vboxes[1]->pack_start (*waveq, Gtk::PACK_SHRINK, 2); //vboxes[1]->pack_start (*waveq, Gtk::PACK_SHRINK, 2);
@ -239,6 +240,7 @@ PartialPasteDlg::PartialPasteDlg () {
exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
hlrecConn = hlrec->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); hlrecConn = hlrec->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
epdConn = epd->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
labcurveConn = labcurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); labcurveConn = labcurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
sharpenConn = sharpen->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); sharpenConn = sharpen->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
@ -249,7 +251,6 @@ PartialPasteDlg::PartialPasteDlg () {
dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
//waveqConn = waveq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); //waveqConn = waveq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
defringeConn = defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); defringeConn = defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
edgePreservingDecompositionUIConn = edgePreservingDecompositionUI->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
vibranceConn = vibrance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); vibranceConn = vibrance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
chmixerConn = chmixer->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); chmixerConn = chmixer->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
@ -294,10 +295,10 @@ PartialPasteDlg::PartialPasteDlg () {
ff_BlurRadiusConn = ff_BlurRadius->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_BlurRadiusConn = ff_BlurRadius->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
ff_BlurTypeConn = ff_BlurType->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_BlurTypeConn = ff_BlurType->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
add_button (Gtk::StockID("gtk-ok"), 1); add_button (Gtk::StockID("gtk-ok"), Gtk::RESPONSE_OK);
add_button (Gtk::StockID("gtk-cancel"), 0); add_button (Gtk::StockID("gtk-cancel"), Gtk::RESPONSE_CANCEL);
set_response_sensitive (1); set_response_sensitive (Gtk::RESPONSE_OK);
set_default_response (1); set_default_response (Gtk::RESPONSE_OK);
show_all_children (); show_all_children ();
} }
@ -414,6 +415,7 @@ void PartialPasteDlg::basicToggled () {
exposureConn.block (true); exposureConn.block (true);
hlrecConn.block (true); hlrecConn.block (true);
shConn.block (true); shConn.block (true);
epdConn.block(true);
labcurveConn.block (true); labcurveConn.block (true);
basic->set_inconsistent (false); basic->set_inconsistent (false);
@ -422,13 +424,15 @@ void PartialPasteDlg::basicToggled () {
exposure->set_active (basic->get_active ()); exposure->set_active (basic->get_active ());
hlrec->set_active (basic->get_active ()); hlrec->set_active (basic->get_active ());
sh->set_active (basic->get_active ()); sh->set_active (basic->get_active ());
epd->set_active (basic->get_active ());
labcurve->set_active (basic->get_active ()); labcurve->set_active (basic->get_active ());
wbConn.block (false); wbConn.block (false);
exposureConn.block (false); exposureConn.block (false);
hlrecConn.block (false); hlrecConn.block (false);
labcurveConn.block (false);
shConn.block (false); shConn.block (false);
epdConn.block (false);
labcurveConn.block (false);
} }
void PartialPasteDlg::detailToggled () { void PartialPasteDlg::detailToggled () {
@ -439,7 +443,6 @@ void PartialPasteDlg::detailToggled () {
impdenConn.block (true); impdenConn.block (true);
dirpyrdenConn.block (true); dirpyrdenConn.block (true);
defringeConn.block (true); defringeConn.block (true);
edgePreservingDecompositionUIConn.block(true);
dirpyreqConn.block (true); dirpyreqConn.block (true);
//waveqConn.block (true); //waveqConn.block (true);
@ -451,7 +454,6 @@ void PartialPasteDlg::detailToggled () {
impden->set_active (detail->get_active ()); impden->set_active (detail->get_active ());
dirpyrden->set_active (detail->get_active ()); dirpyrden->set_active (detail->get_active ());
defringe->set_active (detail->get_active ()); defringe->set_active (detail->get_active ());
edgePreservingDecompositionUI->set_active (detail->get_active ());
dirpyreq->set_active (detail->get_active ()); dirpyreq->set_active (detail->get_active ());
//waveq->set_active (detail->get_active ()); //waveq->set_active (detail->get_active ());
@ -461,7 +463,6 @@ void PartialPasteDlg::detailToggled () {
impdenConn.block (false); impdenConn.block (false);
dirpyrdenConn.block (false); dirpyrdenConn.block (false);
defringeConn.block (false); defringeConn.block (false);
edgePreservingDecompositionUIConn.block (false);
dirpyreqConn.block (false); dirpyreqConn.block (false);
//waveqConn.block (false); //waveqConn.block (false);
} }
@ -553,70 +554,94 @@ void PartialPasteDlg::metaicmToggled () {
} }
void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dst, const rtengine::procparams::ProcParams* src) { /*
* Copies the selected items from the source ProcParams+ParamsEdited(optional)
* to the destination ProcParams.
*/
void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, ParamsEdited* dstPE, const rtengine::procparams::ProcParams* srcPP, const ParamsEdited* srcPE) {
if (wb->get_active ()) dst->wb = src->wb; ParamsEdited falsePE; // falsePE is a workaround to set a group of ParamsEdited to false
if (exposure->get_active ()) dst->toneCurve = src->toneCurve; ParamsEdited filterPE; // Contains the initial information about the loaded values
if (hlrec->get_active ()) dst->hlrecovery = src->hlrecovery; if (srcPE) {
if (sh->get_active ()) dst->sh = src->sh; filterPE = *srcPE;
if (labcurve->get_active ()) dst->labCurve = src->labCurve;
if (sharpen->get_active ()) dst->sharpening = src->sharpening;
if (sharpenedge->get_active ()) dst->sharpenEdge = src->sharpenEdge;
if (sharpenmicro->get_active()) dst->sharpenMicro = src->sharpenMicro;
if (impden->get_active ()) dst->impulseDenoise = src->impulseDenoise;
if (dirpyreq->get_active ()) dst->dirpyrequalizer = src->dirpyrequalizer;
if (defringe->get_active ()) dst->defringe = src->defringe;
if (dirpyrden->get_active ()) dst->dirpyrDenoise = src->dirpyrDenoise;
if (vibrance->get_active ()) dst->vibrance = src->vibrance;
if (chmixer->get_active ()) dst->chmixer = src->chmixer;
if (hsveq->get_active ()) dst->hsvequalizer = src->hsvequalizer;
if (rgbcurves->get_active ()) dst->rgbCurves = src->rgbCurves;
if (icm->get_active ()) dst->icm = src->icm;
if (distortion->get_active ()) dst->distortion = src->distortion;
if (cacorr->get_active ()) dst->cacorrection = src->cacorrection;
if (vignetting->get_active ()) dst->vignetting = src->vignetting;
if (coarserot->get_active ()) dst->coarse = src->coarse;
if (finerot->get_active ()) dst->rotate = src->rotate;
if (crop->get_active ()) dst->crop = src->crop;
if (resize->get_active ()) dst->resize = src->resize;
if (perspective->get_active ()) dst->perspective = src->perspective;
if (commonTrans->get_active ()) dst->commonTrans = src->commonTrans;
if (exifch->get_active ()) dst->exif = src->exif;
if (iptc->get_active ()) dst->iptc = src->iptc;
if (icm->get_active ()) dst->icm = src->icm;
if (gam->get_active ()) dst->gam = src->gam;
if (raw_dmethod->get_active ()) dst->raw.dmethod =src->raw.dmethod;
if (raw_ccSteps->get_active ()) dst->raw.ccSteps =src->raw.ccSteps;
if (raw_dcb_iterations->get_active ()) dst->raw.dcb_iterations =src->raw.dcb_iterations;
if (raw_dcb_enhance->get_active ()) dst->raw.dcb_enhance =src->raw.dcb_enhance;
if (raw_all_enhance->get_active ()) dst->raw.all_enhance =src->raw.all_enhance;
if (raw_expos->get_active ()) dst->raw.expos =src->raw.expos;
if (raw_preser->get_active ()) dst->raw.preser =src->raw.preser;
if (raw_black->get_active ()){
dst->raw.blackzero =src->raw.blackzero;
dst->raw.blackone =src->raw.blackone;
dst->raw.blacktwo =src->raw.blacktwo;
dst->raw.blackthree =src->raw.blackthree;
dst->raw.twogreen =src->raw.twogreen;
} }
if (raw_ca_autocorrect->get_active ()) dst->raw.ca_autocorrect =src->raw.ca_autocorrect; else {
if (raw_cared->get_active ()) dst->raw.cared =src->raw.cared; // By default, everything has to be copied
if (raw_cablue->get_active ()) dst->raw.cablue =src->raw.cablue; filterPE.set(true);
if (raw_hotdeadpix_filt->get_active ()) dst->raw.hotdeadpix_filt=src->raw.hotdeadpix_filt; }
if (raw_linenoise->get_active ()) dst->raw.linenoise =src->raw.linenoise;
if (raw_greenthresh->get_active ()) dst->raw.greenthresh =src->raw.greenthresh;
if (df_file->get_active ()) dst->raw.dark_frame = src->raw.dark_frame; // the general section is always ignored, whichever operation we use the PartialPaste for
if (df_AutoSelect->get_active ()) dst->raw.df_autoselect = src->raw.df_autoselect; filterPE.general = falsePE.general;
if (ff_file->get_active ()) dst->raw.ff_file = src->raw.ff_file;
if (ff_AutoSelect->get_active ()) dst->raw.ff_AutoSelect = src->raw.ff_AutoSelect;
if (ff_BlurRadius->get_active ()) dst->raw.ff_BlurRadius = src->raw.ff_BlurRadius; // Now we filter out the filter depending on the checked items
if (ff_BlurType->get_active ()) dst->raw.ff_BlurType = src->raw.ff_BlurType; if (!wb->get_active ()) filterPE.wb = falsePE.wb;
if (!exposure->get_active ()) filterPE.toneCurve = falsePE.toneCurve;
if (!hlrec->get_active ()) filterPE.hlrecovery = falsePE.hlrecovery;
if (!sh->get_active ()) filterPE.sh = falsePE.sh;
if (!epd->get_active ()) filterPE.edgePreservingDecompositionUI = falsePE.edgePreservingDecompositionUI;
if (!labcurve->get_active ()) filterPE.labCurve = falsePE.labCurve;
if (!sharpen->get_active ()) filterPE.sharpening = falsePE.sharpening;
if (!sharpenedge->get_active ()) filterPE.sharpenEdge = falsePE.sharpenEdge;
if (!sharpenmicro->get_active()) filterPE.sharpenMicro = falsePE.sharpenMicro;
if (!impden->get_active ()) filterPE.impulseDenoise = falsePE.impulseDenoise;
if (!dirpyreq->get_active ()) filterPE.dirpyrequalizer = falsePE.dirpyrequalizer;
if (!defringe->get_active ()) filterPE.defringe = falsePE.defringe;
if (!dirpyrden->get_active ()) filterPE.dirpyrDenoise = falsePE.dirpyrDenoise;
if (!vibrance->get_active ()) filterPE.vibrance = falsePE.vibrance;
if (!chmixer->get_active ()) filterPE.chmixer = falsePE.chmixer;
if (!hsveq->get_active ()) filterPE.hsvequalizer = falsePE.hsvequalizer;
if (!rgbcurves->get_active ()) filterPE.rgbCurves = falsePE.rgbCurves;
if (!icm->get_active ()) filterPE.icm = falsePE.icm;
if (!distortion->get_active ()) filterPE.distortion = falsePE.distortion;
if (!cacorr->get_active ()) filterPE.cacorrection = falsePE.cacorrection;
if (!vignetting->get_active ()) filterPE.vignetting = falsePE.vignetting;
if (!coarserot->get_active ()) filterPE.coarse = falsePE.coarse;
if (!finerot->get_active ()) filterPE.rotate = falsePE.rotate;
if (!crop->get_active ()) filterPE.crop = falsePE.crop;
if (!resize->get_active ()) filterPE.resize = falsePE.resize;
if (!perspective->get_active ()) filterPE.perspective = falsePE.perspective;
if (!commonTrans->get_active ()) filterPE.commonTrans = falsePE.commonTrans;
if (!exifch->get_active ()) filterPE.exif = falsePE.exif;
if (!iptc->get_active ()) filterPE.iptc = falsePE.iptc;
if (!icm->get_active ()) filterPE.icm = falsePE.icm;
if (!raw_dmethod->get_active ()) filterPE.raw.dmethod = falsePE.raw.dmethod;
if (!raw_ccSteps->get_active ()) filterPE.raw.ccSteps = falsePE.raw.ccSteps;
if (!raw_dcb_iterations->get_active ()) filterPE.raw.dcbIterations = falsePE.raw.dcbIterations;
if (!raw_dcb_enhance->get_active ()) filterPE.raw.dcbEnhance = falsePE.raw.dcbEnhance;
if (!raw_all_enhance->get_active ()) filterPE.raw.allEnhance = falsePE.raw.allEnhance;
if (!raw_expos->get_active ()) filterPE.raw.exPos = falsePE.raw.exPos;
if (!raw_preser->get_active ()) filterPE.raw.exPreser = falsePE.raw.exPreser;
if (!raw_black->get_active ()) { filterPE.raw.exBlackzero = falsePE.raw.exBlackzero;
filterPE.raw.exBlackone = falsePE.raw.exBlackone;
filterPE.raw.exBlacktwo = falsePE.raw.exBlacktwo;
filterPE.raw.exBlackthree = falsePE.raw.exBlackthree;
filterPE.raw.exTwoGreen = falsePE.raw.exTwoGreen; }
if (!raw_ca_autocorrect->get_active ()) filterPE.raw.caCorrection = falsePE.raw.caCorrection;
if (!raw_cared->get_active ()) filterPE.raw.caRed = falsePE.raw.caRed;
if (!raw_cablue->get_active ()) filterPE.raw.caBlue = falsePE.raw.caBlue;
if (!raw_hotdeadpix_filt->get_active ()) { filterPE.raw.hotDeadPixelFilter = falsePE.raw.hotDeadPixelFilter;
filterPE.raw.hotDeadPixelThresh = falsePE.raw.hotDeadPixelThresh; }
if (!raw_linenoise->get_active ()) filterPE.raw.linenoise = falsePE.raw.linenoise;
if (!raw_greenthresh->get_active ()) filterPE.raw.greenEq = falsePE.raw.greenEq;
if (!df_file->get_active ()) filterPE.raw.darkFrame = falsePE.raw.darkFrame;
if (!df_AutoSelect->get_active ()) filterPE.raw.dfAuto = falsePE.raw.dfAuto;
if (!ff_file->get_active ()) filterPE.raw.ff_file = falsePE.raw.ff_file;
if (!ff_AutoSelect->get_active ()) filterPE.raw.ff_AutoSelect = falsePE.raw.ff_AutoSelect;
if (!ff_BlurRadius->get_active ()) filterPE.raw.ff_BlurRadius = falsePE.raw.ff_BlurRadius;
if (!ff_BlurType->get_active ()) filterPE.raw.ff_BlurType = falsePE.raw.ff_BlurType;
if (dstPE) *dstPE = filterPE;
// Apply the filter!
filterPE.combine(*dstPP, *srcPP, true);
} }

View File

@ -42,6 +42,7 @@ class PartialPasteDlg : public Gtk::Dialog {
Gtk::CheckButton* exposure; Gtk::CheckButton* exposure;
Gtk::CheckButton* hlrec; Gtk::CheckButton* hlrec;
Gtk::CheckButton* sh; Gtk::CheckButton* sh;
Gtk::CheckButton* epd;
Gtk::CheckButton* labcurve; Gtk::CheckButton* labcurve;
// options in detail: // options in detail:
@ -49,10 +50,9 @@ class PartialPasteDlg : public Gtk::Dialog {
Gtk::CheckButton* sharpenedge; Gtk::CheckButton* sharpenedge;
Gtk::CheckButton* sharpenmicro; Gtk::CheckButton* sharpenmicro;
Gtk::CheckButton* impden; Gtk::CheckButton* impden;
Gtk::CheckButton* waveq; //Gtk::CheckButton* waveq;
Gtk::CheckButton* dirpyrden; Gtk::CheckButton* dirpyrden;
Gtk::CheckButton* defringe; Gtk::CheckButton* defringe;
Gtk::CheckButton* edgePreservingDecompositionUI;
Gtk::CheckButton* dirpyreq; Gtk::CheckButton* dirpyreq;
// options in color: // options in color:
@ -107,7 +107,7 @@ class PartialPasteDlg : public Gtk::Dialog {
sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaicmConn, rawConn;; sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaicmConn, rawConn;;
sigc::connection wbConn, exposureConn, hlrecConn, shConn, labcurveConn; sigc::connection wbConn, exposureConn, hlrecConn, shConn, labcurveConn;
sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, waveqConn, defringeConn, edgePreservingDecompositionUIConn, dirpyreqConn; sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, waveqConn, defringeConn, epdConn, dirpyreqConn;
sigc::connection vibranceConn, chmixerConn, hsveqConn, rgbcurvesConn; sigc::connection vibranceConn, chmixerConn, hsveqConn, rgbcurvesConn;
sigc::connection distortionConn, cacorrConn, vignettingConn; sigc::connection distortionConn, cacorrConn, vignettingConn;
sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, perspectiveConn, commonTransConn; sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, perspectiveConn, commonTransConn;
@ -116,9 +116,9 @@ class PartialPasteDlg : public Gtk::Dialog {
sigc::connection raw_caredConn, raw_cablueConn, raw_ca_autocorrectConn, raw_hotdeadpix_filtConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_dmethodConn, raw_dcb_iterationsConn, raw_all_enhanceConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn; sigc::connection raw_caredConn, raw_cablueConn, raw_ca_autocorrectConn, raw_hotdeadpix_filtConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_dmethodConn, raw_dcb_iterationsConn, raw_all_enhanceConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn;
public: public:
PartialPasteDlg (); PartialPasteDlg (Glib::ustring title);
void applyPaste (rtengine::procparams::ProcParams* dst, const rtengine::procparams::ProcParams* src); void applyPaste (rtengine::procparams::ProcParams* dstPP, ParamsEdited* dstPE, const rtengine::procparams::ProcParams* srcPP, const ParamsEdited* srcPE=NULL);
void everythingToggled (); void everythingToggled ();
void basicToggled (); void basicToggled ();

View File

@ -57,7 +57,7 @@ void PreProcess::read(const rtengine::procparams::ProcParams* pp, const ParamsEd
hdpixelconn.block (true); hdpixelconn.block (true);
if(pedited ){ if(pedited ){
hotDeadPixel->set_inconsistent (!pedited->raw.hotDeadPixel); hotDeadPixel->set_inconsistent (!pedited->raw.hotDeadPixelFilter);
lineDenoise->setEditedState( pedited->raw.linenoise ? Edited : UnEdited ); lineDenoise->setEditedState( pedited->raw.linenoise ? Edited : UnEdited );
greenEqThreshold->setEditedState( pedited->raw.greenEq ? Edited : UnEdited ); greenEqThreshold->setEditedState( pedited->raw.greenEq ? Edited : UnEdited );
} }
@ -81,7 +81,7 @@ void PreProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedi
if (pedited) { if (pedited) {
pedited->raw.linenoise = lineDenoise->getEditedState (); pedited->raw.linenoise = lineDenoise->getEditedState ();
pedited->raw.greenEq= greenEqThreshold->getEditedState (); pedited->raw.greenEq= greenEqThreshold->getEditedState ();
pedited->raw.hotDeadPixel = !hotDeadPixel->get_inconsistent(); pedited->raw.hotDeadPixelFilter = !hotDeadPixel->get_inconsistent();
} }
} }

View File

@ -25,7 +25,7 @@
class ProfileChangeListener { class ProfileChangeListener {
public: public:
virtual void profileChange (const rtengine::procparams::ProcParams* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited=NULL) {} virtual void profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited=NULL) {}
virtual void setDefaults (rtengine::procparams::ProcParams* defparams) {} virtual void setDefaults (rtengine::procparams::ProcParams* defparams) {}
}; };

View File

@ -29,7 +29,18 @@ using namespace rtengine::procparams;
extern Glib::ustring argv0; extern Glib::ustring argv0;
ProfilePanel::ProfilePanel () { PartialPasteDlg* ProfilePanel::partialProfileDlg;
void ProfilePanel::init () {
partialProfileDlg = new PartialPasteDlg("Foo");
}
void ProfilePanel::cleanup () {
delete partialProfileDlg;
}
ProfilePanel::ProfilePanel (bool readOnly) {
tpc = NULL; tpc = NULL;
@ -40,25 +51,25 @@ ProfilePanel::ProfilePanel () {
pack_start (*hbox, Gtk::PACK_SHRINK, 4); pack_start (*hbox, Gtk::PACK_SHRINK, 4);
save = Gtk::manage (new Gtk::Button ());
save->add (*Gtk::manage (new RTImage ("gtk-save-large.png")));
load = Gtk::manage (new Gtk::Button ()); load = Gtk::manage (new Gtk::Button ());
load->add (*Gtk::manage (new RTImage ("gtk-open.png"))); load->add (*Gtk::manage (new RTImage ("gtk-open.png")));
copy = Gtk::manage (new Gtk::Button ()); if (!readOnly) save = Gtk::manage (new Gtk::Button ());
copy->add (*Gtk::manage (new RTImage ("edit-copy.png"))); if (!readOnly) save->add (*Gtk::manage (new RTImage ("gtk-save-large.png")));
if (!readOnly) copy = Gtk::manage (new Gtk::Button ());
if (!readOnly) copy->add (*Gtk::manage (new RTImage ("edit-copy.png")));
paste = Gtk::manage (new Gtk::Button ()); paste = Gtk::manage (new Gtk::Button ());
paste->add (*Gtk::manage (new RTImage ("edit-paste.png"))); paste->add (*Gtk::manage (new RTImage ("edit-paste.png")));
hbox->pack_start (*profiles); hbox->pack_start (*profiles);
hbox->pack_start (*load, Gtk::PACK_SHRINK, 1); hbox->pack_start (*load, Gtk::PACK_SHRINK, 1);
hbox->pack_start (*save, Gtk::PACK_SHRINK, 1); if (!readOnly) hbox->pack_start (*save, Gtk::PACK_SHRINK, 1);
hbox->pack_start (*copy, Gtk::PACK_SHRINK, 1); hbox->pack_start (*copy, Gtk::PACK_SHRINK, 1);
hbox->pack_start (*paste, Gtk::PACK_SHRINK, 1); if (!readOnly) hbox->pack_start (*paste, Gtk::PACK_SHRINK, 1);
load->signal_clicked().connect( sigc::mem_fun(*this, &ProfilePanel::load_clicked) ); load->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &ProfilePanel::load_clicked) );
save->signal_clicked().connect( sigc::mem_fun(*this, &ProfilePanel::save_clicked) ); if (!readOnly) save->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &ProfilePanel::save_clicked) );
copy->signal_clicked().connect( sigc::mem_fun(*this, &ProfilePanel::copy_clicked) ); if (!readOnly) copy->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &ProfilePanel::copy_clicked) );
paste->signal_clicked().connect( sigc::mem_fun(*this, &ProfilePanel::paste_clicked) ); paste->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &ProfilePanel::paste_clicked) );
custom = NULL; custom = NULL;
lastphoto = NULL; lastphoto = NULL;
@ -71,9 +82,9 @@ ProfilePanel::ProfilePanel () {
old = profiles->get_active_text(); old = profiles->get_active_text();
changeconn = profiles->signal_changed().connect( sigc::mem_fun(*this, &ProfilePanel::selection_changed) ); changeconn = profiles->signal_changed().connect( sigc::mem_fun(*this, &ProfilePanel::selection_changed) );
save->set_tooltip_text (M("PROFILEPANEL_TOOLTIPSAVE"));
load->set_tooltip_text (M("PROFILEPANEL_TOOLTIPLOAD")); load->set_tooltip_text (M("PROFILEPANEL_TOOLTIPLOAD"));
copy->set_tooltip_text (M("PROFILEPANEL_TOOLTIPCOPY")); if (!readOnly) save->set_tooltip_text (M("PROFILEPANEL_TOOLTIPSAVE"));
if (!readOnly) copy->set_tooltip_text (M("PROFILEPANEL_TOOLTIPCOPY"));
paste->set_tooltip_text (M("PROFILEPANEL_TOOLTIPPASTE")); paste->set_tooltip_text (M("PROFILEPANEL_TOOLTIPPASTE"));
show_all_children (); show_all_children ();
@ -81,9 +92,9 @@ ProfilePanel::ProfilePanel () {
ProfilePanel::~ProfilePanel () { ProfilePanel::~ProfilePanel () {
delete custom; if (custom) { custom->deleteInstance(); delete custom; }
delete lastsaved; if (lastsaved) { lastsaved->deleteInstance(); delete lastsaved; }
delete lastphoto; if (lastphoto) { lastphoto->deleteInstance(); delete lastphoto; }
} }
void ProfilePanel::refreshProfileList () { void ProfilePanel::refreshProfileList () {
@ -98,7 +109,7 @@ void ProfilePanel::refreshProfileList () {
// re-parse profile directories (deletes old ones) // re-parse profile directories (deletes old ones)
profileStore.parseProfiles (); profileStore.parseProfiles ();
pparams = profileStore.getProfileNames (); pparams = profileStore.getProfileNames ();
for (int i=0; i<pparams.size(); i++) for (unsigned int i=0; i<pparams.size(); i++)
profiles->append_text (pparams[i]); profiles->append_text (pparams[i]);
if (custom) if (custom)
@ -112,10 +123,15 @@ void ProfilePanel::refreshProfileList () {
changeconn.block (false); changeconn.block (false);
} }
void ProfilePanel::save_clicked () { void ProfilePanel::save_clicked (GdkEventButton* event) {
if (event->button != 1)
return;
Gtk::FileChooserDialog dialog(M("PROFILEPANEL_SAVEDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_SAVE); Gtk::FileChooserDialog dialog(M("PROFILEPANEL_SAVEDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_SAVE);
if (options.multiUser) if (options.loadSaveProfilePath.length())
dialog.set_current_folder (options.loadSaveProfilePath);
else if (options.multiUser)
dialog.set_current_folder (Options::rtdir + "/" + options.profilePath); dialog.set_current_folder (Options::rtdir + "/" + options.profilePath);
else else
dialog.set_current_folder (argv0 + "/" + options.profilePath); dialog.set_current_folder (argv0 + "/" + options.profilePath);
@ -140,11 +156,15 @@ void ProfilePanel::save_clicked () {
savedialog = &dialog; savedialog = &dialog;
bool done = false;
do {
int result = dialog.run(); int result = dialog.run();
dialog.hide();
if (result==Gtk::RESPONSE_OK) { if (result==Gtk::RESPONSE_OK) {
std::string fname = dialog.get_filename(); std::string fname = dialog.get_filename();
options.loadSaveProfilePath = Glib::path_get_dirname(fname);
bool hasext = true; bool hasext = true;
int dotpos = fname.find_last_of ('.'); int dotpos = fname.find_last_of ('.');
@ -165,10 +185,11 @@ void ProfilePanel::save_clicked () {
Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_YES_NO, true); Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_YES_NO, true);
int response = msgd.run (); int response = msgd.run ();
if (response==Gtk::RESPONSE_NO) if (response==Gtk::RESPONSE_NO)
return; // make another try
continue;
} }
ProcParams* toSave = NULL; PartialProfile* toSave = NULL;
if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")") if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")")
toSave = custom; toSave = custom;
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")") else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")")
@ -179,15 +200,41 @@ void ProfilePanel::save_clicked () {
toSave = profileStore.getProfile (profiles->get_active_text()); toSave = profileStore.getProfile (profiles->get_active_text());
if (toSave) { if (toSave) {
toSave->save (fname); if (event->state & Gdk::CONTROL_MASK) {
// opening the partial paste dialog window
partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE"));
int i = partialProfileDlg->run();
partialProfileDlg->hide();
if (i != Gtk::RESPONSE_OK)
return;
// saving the partial profile
PartialProfile ppTemp(true);
partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited);
ppTemp.pparams->save (fname, "", ppTemp.pedited);
ppTemp.deleteInstance();
}
else {
// saving a full profile
toSave->pparams->save (fname);
}
refreshProfileList (); refreshProfileList ();
} }
} }
done = true;
} while (!done);
return;
} }
void ProfilePanel::copy_clicked () { /*
* Copy the actual full profile to the clipboard
*/
void ProfilePanel::copy_clicked (GdkEventButton* event) {
ProcParams* toSave = NULL; if (event->button != 1)
return;
PartialProfile* toSave = NULL;
if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")") if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")")
toSave = custom; toSave = custom;
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")") else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")")
@ -197,14 +244,40 @@ void ProfilePanel::copy_clicked () {
else else
toSave = profileStore.getProfile (profiles->get_active_text()); toSave = profileStore.getProfile (profiles->get_active_text());
if (toSave) // toSave has to be a complete procparams
clipboard.setProcParams (*toSave); if (toSave) {
if (event->state & Gdk::CONTROL_MASK) {
// opening the partial paste dialog window
partialProfileDlg->set_title(M("PROFILEPANEL_COPYPPASTE"));
int i = partialProfileDlg->run();
partialProfileDlg->hide();
if (i != Gtk::RESPONSE_OK)
return;
// saving a partial profile
PartialProfile ppTemp(true);
partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited);
clipboard.setPartialProfile(ppTemp);
ppTemp.deleteInstance();
}
else
clipboard.setProcParams (*toSave->pparams);
}
return;
} }
void ProfilePanel::load_clicked () { /*
* Load a potentially partial profile
*/
void ProfilePanel::load_clicked (GdkEventButton* event) {
if (event->button != 1)
return;
Gtk::FileChooserDialog dialog(M("PROFILEPANEL_LOADDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN); Gtk::FileChooserDialog dialog(M("PROFILEPANEL_LOADDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN);
if (options.multiUser) if (options.loadSaveProfilePath.length())
dialog.set_current_folder (options.loadSaveProfilePath);
else if (options.multiUser)
dialog.set_current_folder (Options::rtdir + "/" + options.profilePath); dialog.set_current_folder (Options::rtdir + "/" + options.profilePath);
else else
dialog.set_current_folder (argv0 + "/" + options.profilePath); dialog.set_current_folder (argv0 + "/" + options.profilePath);
@ -226,65 +299,100 @@ void ProfilePanel::load_clicked () {
dialog.add_filter(filter_any); dialog.add_filter(filter_any);
int result = dialog.run(); int result = dialog.run();
dialog.hide();
if (result==Gtk::RESPONSE_OK) { if (result==Gtk::RESPONSE_OK) {
if (!custom) { bool prevState = changeconn.block(true);
custom = new ProcParams (); Glib::ustring fname = dialog.get_filename();
profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")"); options.loadSaveProfilePath = Glib::path_get_dirname(fname);
if (event->state & Gdk::CONTROL_MASK) {
// opening the partial paste dialog window
partialProfileDlg->set_title(M("PROFILEPANEL_LOADPPASTE"));
int i = partialProfileDlg->run();
partialProfileDlg->hide();
if (i != Gtk::RESPONSE_OK)
return;
} }
custom->load (dialog.get_filename()); bool customCreated = false;
if (!custom) {
custom = new PartialProfile (true);
custom->set(true);
customCreated = true;
}
int err = custom->load (fname);
if (!err) {
profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
profiles->set_active_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")"); profiles->set_active_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
old = profiles->get_active_text(); old = profiles->get_active_text();
changeconn.block(prevState);
if (event->state & Gdk::CONTROL_MASK) {
// applying partial profile
PartialProfile ppTemp(true);
// the 2 next line modify custom->pedited without modifying custom->pparams
partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, custom->pparams, custom->pedited);
*custom->pedited = *ppTemp.pedited;
ppTemp.deleteInstance();
}
changeTo (custom, M("PROFILEPANEL_PFILE")); changeTo (custom, M("PROFILEPANEL_PFILE"));
} }
else if (customCreated) {
// we delete custom
custom->deleteInstance();
delete custom;
}
}
return;
} }
void ProfilePanel::paste_clicked () { /*
* Paste a full profile from the clipboard
*/
void ProfilePanel::paste_clicked (GdkEventButton* event) {
if (event->button != 1)
return;
if (!clipboard.hasProcParams()) if (!clipboard.hasProcParams())
return; return;
if (event->state & Gdk::CONTROL_MASK) {
partialProfileDlg->set_title(M("PROFILEPANEL_PASTEPPASTE"));
int i = partialProfileDlg->run();
partialProfileDlg->hide();
if (i != Gtk::RESPONSE_OK)
return;
}
if (!custom) { if (!custom) {
custom = new ProcParams (); custom = new PartialProfile (true);
custom->pedited->set(true);
profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")"); profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
} }
*custom = clipboard.getProcParams (); ProcParams pp = clipboard.getProcParams ();
custom->pparams = &pp;
profiles->set_active_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")"); profiles->set_active_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
old = profiles->get_active_text(); old = profiles->get_active_text();
if (event->state & Gdk::CONTROL_MASK) {
// applying partial profile
PartialProfile ppTemp(true);
// the 2 next line modify custom->pedited without modifying custom->pparams
partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, custom->pparams, custom->pedited);
*custom->pedited = *ppTemp.pedited;
ppTemp.deleteInstance();
}
changeTo (custom, M("HISTORY_FROMCLIPBOARD")); changeTo (custom, M("HISTORY_FROMCLIPBOARD"));
return;
} }
void ProfilePanel::changeTo (ProcParams* newpp, Glib::ustring profname) { void ProfilePanel::changeTo (PartialProfile* newpp, Glib::ustring profname) {
if (!newpp) if (!newpp)
return; return;
// Keep transformation parameters while changing the profile
/* int cropx = working->crop_x;
int cropy = working->crop_y;
int cropw = working->crop_w;
int croph = working->crop_h;
bool crope = working->crop_enabled;
int rotcor = working->rotate_coarse;
double rotfine = working->rotate_fine;
double lenscorr = working->lens_distortion;
bool hflip = working->horizontal_flip;
bool vflip = working->vertical_flip;
working->copy (newpp);
working->crop_x = cropx;
working->crop_y = cropy;
working->crop_w = cropw;
working->crop_h = croph;
working->crop_enabled = crope;
working->rotate_coarse = rotcor;
working->rotate_fine = rotfine;
working->lens_distortion = lenscorr;
working->horizontal_flip = hflip;
working->vertical_flip = vflip;
*/
if (tpc) if (tpc)
tpc->profileChange (newpp, EvProfileChanged, profname); tpc->profileChange (newpp, EvProfileChanged, profname);
} }
@ -300,7 +408,7 @@ void ProfilePanel::selection_changed () {
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")") else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")")
changeTo (lastphoto, Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")"); changeTo (lastphoto, Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")");
else { else {
ProcParams* s = profileStore.getProfile (profiles->get_active_text()); PartialProfile* s = profileStore.getProfile (profiles->get_active_text());
if (s) if (s)
changeTo (s, profiles->get_active_text()); changeTo (s, profiles->get_active_text());
} }
@ -310,24 +418,26 @@ void ProfilePanel::selection_changed () {
void ProfilePanel::procParamsChanged (rtengine::procparams::ProcParams* p, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited) { void ProfilePanel::procParamsChanged (rtengine::procparams::ProcParams* p, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited) {
// to prevent recursion filter out the events caused by the profilepanel // to prevent recursion, filter out the events caused by the profilepanel
if (ev==EvProfileChanged || ev==EvPhotoLoaded) if (ev==EvProfileChanged || ev==EvPhotoLoaded)
return; return;
if (profiles->get_active_text() != Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")") { if (profiles->get_active_text() != Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")") {
dontupdate = true; dontupdate = true;
if (!custom) { if (!custom) {
custom = new ProcParams (); custom = new PartialProfile (true);
custom->set(true);
profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")"); profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
} }
*custom = *p;
profiles->set_active_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")"); profiles->set_active_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
old = profiles->get_active_text(); old = profiles->get_active_text();
} }
else *(custom->pparams) = *p;
*custom = *p;
} }
/*
* TODO: "lastPhoto" is not used anymore, a code cleanup should delete everything related to it
*/
void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastSaved, ProcParams* lastPhoto) { void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastSaved, ProcParams* lastPhoto) {
changeconn.block (true); changeconn.block (true);
@ -336,18 +446,36 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS
pparams.clear (); pparams.clear ();
pparams = profileStore.getProfileNames (); pparams = profileStore.getProfileNames ();
for (int i=0; i<pparams.size(); i++) for (unsigned int i=0; i<pparams.size(); i++)
profiles->append_text (pparams[i]); profiles->append_text (pparams[i]);
delete custom; if (custom) {
custom = NULL; custom->deleteInstance();
delete lastsaved; delete custom; custom = NULL;
lastsaved = lastSaved; }
delete lastphoto;
lastphoto = lastPhoto; if (lastsaved) {
lastsaved->deleteInstance();
delete lastsaved; lastsaved = NULL;
}
if (lastSaved) {
ParamsEdited* pe = new ParamsEdited();
pe->set(true);
lastsaved = new PartialProfile(lastSaved, pe);
}
if (lastphoto) {
lastphoto->deleteInstance();
delete lastphoto; lastphoto = NULL;
}
if (lastPhoto) {
ParamsEdited* pe = new ParamsEdited();
pe->set(true);
lastphoto = new PartialProfile(lastPhoto, pe);
}
Glib::ustring defline = profname; Glib::ustring defline = profname;
ProcParams* defprofile = profileStore.getProfile (profname); PartialProfile* defprofile = profileStore.getProfile (profname);
if (lastphoto) if (lastphoto)
profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")"); profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")");
@ -360,9 +488,9 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS
if (tpc) { if (tpc) {
if (lastsaved) if (lastsaved)
tpc->setDefaults (lastsaved); tpc->setDefaults (lastsaved->pparams);
else else
tpc->setDefaults (profileStore.getProfile (profname)); tpc->setDefaults (profileStore.getProfile (profname)->pparams);
} }
if (defprofile) { if (defprofile) {
old = defline; old = defline;
@ -372,16 +500,26 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS
tpc->profileChange (defprofile, EvPhotoLoaded, defline); tpc->profileChange (defprofile, EvPhotoLoaded, defline);
} }
else { else {
bool dels = false;
// select first valid profile // select first valid profile
old = ""; old = "";
profiles->set_active (0); profiles->set_active (0);
ProcParams* s = profileStore.getProfile (profiles->get_active_text()); PartialProfile* s = profileStore.getProfile (profiles->get_active_text());
if (!s) if (!s) {
s = new ProcParams (); s = new PartialProfile (true);
s->set(true);
dels = true; // we've created a temporary PartialProfile, so we set a flag to destroy it
}
changeconn.block (false); changeconn.block (false);
if (tpc) if (tpc)
tpc->profileChange (s, EvPhotoLoaded, profiles->get_active_text()); tpc->profileChange (s, EvPhotoLoaded, profiles->get_active_text());
if (dels) {
s->deleteInstance();
delete s;
}
} }
} }

View File

@ -24,47 +24,52 @@
#include "../rtengine/rtengine.h" #include "../rtengine/rtengine.h"
#include "pparamschangelistener.h" #include "pparamschangelistener.h"
#include "profilechangelistener.h" #include "profilechangelistener.h"
#include "partialpastedlg.h"
#include "guiutils.h" #include "guiutils.h"
class ProfilePanel : public Gtk::VBox, public PParamsChangeListener { class ProfilePanel : public Gtk::VBox, public PParamsChangeListener {
protected: protected:
static PartialPasteDlg* partialProfileDlg;
Gtk::Button* save; Gtk::Button* save;
Gtk::Button* load; Gtk::Button* load;
Gtk::Button* copy; Gtk::Button* copy;
Gtk::Button* paste; Gtk::Button* paste;
MyComboBoxText* profiles; MyComboBoxText* profiles;
std::vector<Glib::ustring> pparams; std::vector<Glib::ustring> pparams;
rtengine::procparams::ProcParams* custom; rtengine::procparams::PartialProfile* custom;
rtengine::procparams::ProcParams* lastsaved; rtengine::procparams::PartialProfile* lastsaved;
rtengine::procparams::ProcParams* lastphoto; rtengine::procparams::PartialProfile* lastphoto;
Glib::ustring old; Glib::ustring old;
ProfileChangeListener* tpc; ProfileChangeListener* tpc;
bool dontupdate; bool dontupdate;
sigc::connection changeconn; sigc::connection changeconn;
Gtk::FileChooserDialog* savedialog; Gtk::FileChooserDialog* savedialog;
void changeTo (rtengine::procparams::ProcParams* newpp, Glib::ustring profname); void changeTo (rtengine::procparams::PartialProfile* newpp, Glib::ustring profname);
void refreshProfileList (); void refreshProfileList ();
public: public:
ProfilePanel (); ProfilePanel (bool readOnly=false);
virtual ~ProfilePanel (); virtual ~ProfilePanel ();
void setProfileChangeListener (ProfileChangeListener* ppl) { tpc = ppl; } void setProfileChangeListener (ProfileChangeListener* ppl) { tpc = ppl; }
static void init ();
static void cleanup ();
void initProfile (const Glib::ustring& profname, rtengine::procparams::ProcParams* lastSaved, rtengine::procparams::ProcParams* lastPhoto); void initProfile (const Glib::ustring& profname, rtengine::procparams::ProcParams* lastSaved, rtengine::procparams::ProcParams* lastPhoto);
// PParamsChangeListener interface // PParamsChangeListener interface
void procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited=NULL); void procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited=NULL);
// gui callbacks // gui callbacks
void save_clicked (); void save_clicked (GdkEventButton* event);
void load_clicked (); void load_clicked (GdkEventButton* event);
void copy_clicked (); void copy_clicked (GdkEventButton* event);
void paste_clicked (); void paste_clicked (GdkEventButton* event);
void selection_changed (); void selection_changed ();
}; };

View File

@ -28,12 +28,23 @@ using namespace rtengine::procparams;
extern Glib::ustring argv0; extern Glib::ustring argv0;
ProfileStore::~ProfileStore () {
for (std::map<Glib::ustring,PartialProfile*>::iterator i = partProfiles.begin(); i!=partProfiles.end(); i++) {
if (i->second->pparams) delete i->second->pparams;
if (i->second->pedited) delete i->second->pedited;
delete i->second;
}
}
void ProfileStore::parseProfiles () { void ProfileStore::parseProfiles () {
// clear loaded profiles // clear loaded profiles
for (std::map<Glib::ustring,ProcParams*>::iterator i = pparams.begin(); i!=pparams.end(); i++) for (std::map<Glib::ustring,PartialProfile*>::iterator i = partProfiles.begin(); i!=partProfiles.end(); i++) {
delete i->second->pparams;
delete i->second->pedited;
delete i->second; delete i->second;
pparams.clear (); }
partProfiles.clear ();
if (options.multiUser) { if (options.multiUser) {
Glib::ustring userPD = options.rtdir + "/" + options.profilePath; Glib::ustring userPD = options.rtdir + "/" + options.profilePath;
@ -68,16 +79,21 @@ void ProfileStore::parseDir (const Glib::ustring& pdir) {
if( options.rtSettings.verbose ) if( options.rtSettings.verbose )
printf ("Processing file %s...\n", fname.c_str()); printf ("Processing file %s...\n", fname.c_str());
Glib::ustring name = sname.substr(0,lastdot); Glib::ustring name = sname.substr(0,lastdot);
if (pparams.find(name)!=pparams.end()) { std::map<Glib::ustring,PartialProfile*>::iterator j = partProfiles.find(name);
delete pparams[name]; if (j!=partProfiles.end()) {
pparams.erase (pparams.find(name)); j->second->deleteInstance();
delete j->second;
partProfiles.erase (j);
}
PartialProfile* pProf = new PartialProfile (true);
int res = pProf->load (fname);
if (!res && pProf->pparams->ppVersion>=220) {
partProfiles[name] = pProf;
}
else {
pProf->deleteInstance();
delete pProf;
} }
ProcParams* pp = new ProcParams ();
int res = pp->load (fname);
if (!res && pp->ppVersion>=220)
pparams[name] = pp;
else
delete pp;
} }
} }
} }
@ -85,26 +101,31 @@ void ProfileStore::parseDir (const Glib::ustring& pdir) {
} }
} }
rtengine::procparams::ProcParams* ProfileStore::getProfile (const Glib::ustring& profname) { PartialProfile* ProfileStore::getProfile (const Glib::ustring& profname) {
return pparams[profname]; std::map<Glib::ustring, PartialProfile*>::iterator prof = partProfiles.find(profname);
if (prof != partProfiles.end())
return partProfiles[profname];
else
return NULL;
} }
std::vector<Glib::ustring> ProfileStore::getProfileNames () { std::vector<Glib::ustring> ProfileStore::getProfileNames () {
std::vector<Glib::ustring> ret; std::vector<Glib::ustring> ret;
for (std::map<Glib::ustring,ProcParams*>::iterator i = pparams.begin(); i!=pparams.end(); i++) for (std::map<Glib::ustring,PartialProfile*>::iterator i = partProfiles.begin(); i!=partProfiles.end(); i++)
ret.push_back (i->first); ret.push_back (i->first);
return ret; return ret;
} }
rtengine::procparams::ProcParams* ProfileStore::getDefaultProcParams (bool isRaw) { ProcParams* ProfileStore::getDefaultProcParams (bool isRaw) {
rtengine::procparams::ProcParams* pp = getProfile (isRaw ? options.defProfRaw : options.defProfImg); PartialProfile* pProf = getProfile (isRaw ? options.defProfRaw : options.defProfImg);
if (!pp) { if (!pProf) {
pp = new ProcParams (); Glib::ustring profName = isRaw ? options.defProfRaw : options.defProfImg;
pparams[isRaw ? options.defProfRaw : options.defProfImg] = pp; pProf = new PartialProfile (true);
partProfiles[profName] = pProf;
} }
return pp; return pProf->pparams;
} }

View File

@ -22,17 +22,19 @@
#include <map> #include <map>
#include <vector> #include <vector>
#include "../rtengine/rtengine.h" #include "../rtengine/rtengine.h"
#include "paramsedited.h"
#include <glibmm.h> #include <glibmm.h>
class ProfileStore { class ProfileStore {
std::map<Glib::ustring,rtengine::procparams::ProcParams*> pparams; std::map<Glib::ustring, rtengine::procparams::PartialProfile*> partProfiles;
void parseDir (const Glib::ustring& pdir); void parseDir (const Glib::ustring& pdir);
public: public:
~ProfileStore();
void parseProfiles (); void parseProfiles ();
rtengine::procparams::ProcParams* getProfile (const Glib::ustring& profname); rtengine::procparams::PartialProfile* getProfile (const Glib::ustring& profname);
std::vector<Glib::ustring> getProfileNames (); std::vector<Glib::ustring> getProfileNames ();
rtengine::procparams::ProcParams* getDefaultProcParams (bool isRaw); rtengine::procparams::ProcParams* getDefaultProcParams (bool isRaw);
}; };

View File

@ -34,6 +34,7 @@ RTWindow::RTWindow ()
cacheMgr->init (); cacheMgr->init ();
WhiteBalance::init(); WhiteBalance::init();
ProfilePanel::init();
Glib::ustring fName = "rt-logo.png"; Glib::ustring fName = "rt-logo.png";
Glib::ustring fullPath = RTImage::findIconAbsolutePath(fName); Glib::ustring fullPath = RTImage::findIconAbsolutePath(fName);
@ -450,6 +451,7 @@ bool RTWindow::on_delete_event(GdkEventAny* event) {
cacheMgr->closeCache (); // also makes cleanup if too large cacheMgr->closeCache (); // also makes cleanup if too large
WhiteBalance::cleanup(); WhiteBalance::cleanup();
ProfilePanel::cleanup();
if (!options.windowMaximized) { if (!options.windowMaximized) {

View File

@ -174,7 +174,10 @@ const ProcParams& Thumbnail::getProcParams () {
return pparams; // there is no valid pp to return, but we have to return something return pparams; // there is no valid pp to return, but we have to return something
} }
// Create default params on demand and returns a new updatable object /*
* Create default params on demand and returns a new updatable object
* The loaded profile may be partial, but it return a complete ProcParams (i.e. without ParamsEdited)
*/
rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool returnParams, bool forceCPB) { rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool returnParams, bool forceCPB) {
// try to load the last saved parameters from the cache or from the paramfile file // try to load the last saved parameters from the cache or from the paramfile file
ProcParams* ldprof = NULL; ProcParams* ldprof = NULL;
@ -195,7 +198,7 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu
bool success = safe_spawn_command_line_sync (cmdLine + strm.str()); bool success = safe_spawn_command_line_sync (cmdLine + strm.str());
// Now they SHOULD be there, so try to load them // Now they SHOULD be there (and potentially "partial"), so try to load them and store it as a full procparam
if (success) loadProcParams(); if (success) loadProcParams();
} }
@ -212,6 +215,14 @@ void Thumbnail::notifylisterners_procParamsChanged(int whoChangedIt){
listeners[i]->procParamsChanged (this, whoChangedIt); listeners[i]->procParamsChanged (this, whoChangedIt);
} }
/*
* Load the procparams from the cache or from the sidecar file (priority set in
* the Preferences).
*
* The result is a complete ProcParams with default values merged with the values
* from the default Raw or Image ProcParams, then with the values from the loaded
* ProcParams (sidecar or cache file).
*/
void Thumbnail::loadProcParams () { void Thumbnail::loadProcParams () {
// TODO: Check for Linux // TODO: Check for Linux
#ifdef WIN32 #ifdef WIN32
@ -219,17 +230,22 @@ void Thumbnail::loadProcParams () {
#endif #endif
pparamsValid = false; pparamsValid = false;
pparams.setDefaults();
// WARNING: loading the default Raw or Img pp3 file at each thumbnail may be a performance bottleneck
pparams.load(options.profilePath+"/" + (getType()==FT_Raw?options.defProfRaw:options.defProfImg) + paramFileExtension);
if (options.paramsLoadLocation==PLL_Input) { if (options.paramsLoadLocation==PLL_Input) {
// try to load it from params file next to the image file // try to load it from params file next to the image file
int ppres = pparams.load (fname + paramFileExtension); int ppres = pparams.load (fname + paramFileExtension);
pparamsValid = !ppres && pparams.ppVersion>=220; pparamsValid = !ppres && pparams.ppVersion>=220;
// if no success, try to load the cached version of the procparams
if (!pparamsValid) if (!pparamsValid)
pparamsValid = !pparams.load (getCacheFileName ("profiles")+paramFileExtension); pparamsValid = !pparams.load (getCacheFileName ("profiles")+paramFileExtension);
} }
else { else {
// try to load it from cache // try to load it from cache
pparamsValid = !pparams.load (getCacheFileName ("profiles")+paramFileExtension); pparamsValid = !pparams.load (getCacheFileName ("profiles")+paramFileExtension);
// if no success, load it from params file next to the image file // if no success, try to load it from params file next to the image file
if (!pparamsValid) { if (!pparamsValid) {
int ppres = pparams.load (fname + paramFileExtension); int ppres = pparams.load (fname + paramFileExtension);
pparamsValid = !ppres && pparams.ppVersion>=220; pparamsValid = !ppres && pparams.ppVersion>=220;
@ -304,7 +320,7 @@ bool Thumbnail::hasProcParams () {
return pparamsValid; return pparamsValid;
} }
void Thumbnail::setProcParams (const ProcParams& pp, int whoChangedIt, bool updateCacheNow) { void Thumbnail::setProcParams (const ProcParams& pp, ParamsEdited* pe, int whoChangedIt, bool updateCacheNow) {
// TODO: Check for Linux // TODO: Check for Linux
#ifdef WIN32 #ifdef WIN32
Glib::Mutex::Lock lock(mutex); Glib::Mutex::Lock lock(mutex);
@ -318,7 +334,13 @@ void Thumbnail::setProcParams (const ProcParams& pp, int whoChangedIt, bool upda
int colorlabel = getColorLabel(); int colorlabel = getColorLabel();
int inTrash = getStage(); int inTrash = getStage();
pparams = pp; if (pe) {
// coarse.rotate works in ADD mode only, so we set it to 0 first
if (pe->coarse.rotate)
pparams.coarse.rotate = 0;
pe->combine(pparams, pp, true);
}
else pparams = pp;
pparamsValid = true; pparamsValid = true;
needsReProcessing = true; needsReProcessing = true;

View File

@ -86,7 +86,7 @@ class Thumbnail {
// Use this to create params on demand for update // Use this to create params on demand for update
rtengine::procparams::ProcParams* createProcParamsForUpdate (bool returnParams, bool forceCPB); rtengine::procparams::ProcParams* createProcParamsForUpdate (bool returnParams, bool forceCPB);
void setProcParams (const rtengine::procparams::ProcParams& pp, int whoChangedIt=-1, bool updateCacheNow=true); void setProcParams (const rtengine::procparams::ProcParams& pp, ParamsEdited* pe=NULL, int whoChangedIt=-1, bool updateCacheNow=true);
void clearProcParams (int whoClearedIt=-1); void clearProcParams (int whoClearedIt=-1);
void loadProcParams (); void loadProcParams ();

View File

@ -263,26 +263,40 @@ void ToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib::
paramcListeners[i]->procParamsChanged (params, event, descr); paramcListeners[i]->procParamsChanged (params, event, descr);
} }
void ToolPanelCoordinator::profileChange (const ProcParams *nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited) { void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited) {
int fw, fh, tr; int fw, fh, tr;
if (!ipc) return; if (!ipc) return;
ProcParams *params = ipc->beginUpdateParams (); ProcParams *params = ipc->beginUpdateParams ();
ProcParams *mergedParams = new ProcParams();
// Copy the current params as default values for the fusion
*mergedParams = *params;
// Reset IPTC values when switching procparams from the History
if (event == rtengine::EvHistoryBrowsed) {
mergedParams->iptc.clear();
mergedParams->exif.clear();
}
// And apply the partial profile nparams to mergedParams
nparams->applyTo(mergedParams);
// Derive the effective changes, if it's a profile change, to prevent slow RAW rerendering if not necessary // Derive the effective changes, if it's a profile change, to prevent slow RAW rerendering if not necessary
bool filterRawRefresh=false; bool filterRawRefresh=false;
if (event!=rtengine::EvPhotoLoaded) { if (event!=rtengine::EvPhotoLoaded) {
ParamsEdited pe; ParamsEdited pe;
std::vector<rtengine::procparams::ProcParams> lParams(2); std::vector<rtengine::procparams::ProcParams> lParams(2);
lParams[0]=*params; lParams[1]=*nparams; lParams[0]=*params; lParams[1]=*mergedParams;
pe.set(true); pe.set(true);
pe.initFrom (lParams); pe.initFrom (lParams);
filterRawRefresh=pe.raw.isUnchanged(); filterRawRefresh=pe.raw.isUnchanged();
} }
*params = *nparams; *params = *mergedParams;
delete mergedParams;
tr = TR_NONE; tr = TR_NONE;
if (params->coarse.rotate==90) tr |= TR_R90; if (params->coarse.rotate==90) tr |= TR_R90;

View File

@ -185,7 +185,7 @@ class ToolPanelCoordinator : public ToolPanelListener,
void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr); void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr);
// profilechangelistener interface // profilechangelistener interface
void profileChange (const rtengine::procparams::ProcParams* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited=NULL); void profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited=NULL);
void setDefaults (rtengine::procparams::ProcParams* defparams); void setDefaults (rtengine::procparams::ProcParams* defparams);
// to support the GUI: // to support the GUI: