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_PROFILE;Profil
PROFILEPANEL_SAVEDLGLABEL;Enregistrer les paramètres de post-traitement...
PROFILEPANEL_TOOLTIPCOPY;Copie le profil courant dans le presse-papier
PROFILEPANEL_TOOLTIPLOAD;Charger un profil depuis un fichier
PROFILEPANEL_TOOLTIPPASTE; Colle le profil depuis le presse-papier
PROFILEPANEL_TOOLTIPSAVE;Enregistrer le profil actuel
PROFILEPANEL_COPYPPASTE;Paramètres à copier
PROFILEPANEL_LOADPPASTE;Paramètres à charger
PROFILEPANEL_PASTEPPASTE;Paramètres à coller
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_CACORRECTION;Correction de l'aberr. chomatique...
PROGRESSBAR_DARKFRAME;Trame Noire...
@ -808,6 +812,7 @@ TP_COLORSHIFT_GREENMAGENTA;Vert-Magenta
TP_COLORSHIFT_LABEL;Décalage couleur
TP_CROP_FIXRATIO;Ratio fixe:
TP_CROP_GTDIAGONALS;Règle des diagonales
TP_CROP_GTEPASSPORT;Passeport biométrique
TP_CROP_GTGRID;Grille
TP_CROP_GTHARMMEANS1;Manière harmonique 1
TP_CROP_GTHARMMEANS2;Manière harmonique 2
@ -927,6 +932,7 @@ TP_PERSPECTIVE_LABEL;Perspective
TP_PERSPECTIVE_VERTICAL;Verticale
TP_PREPROCESS_GREENEQUIL;Équilibrage du vert
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_LINEDENOISE;Filtre de bruit de ligne
TP_PREPROCESS_NO_FOUND;Aucun trouvé

View File

@ -748,10 +748,14 @@ PROFILEPANEL_PLASTPHOTO;Last Photo
PROFILEPANEL_PLASTSAVED;Last Saved
PROFILEPANEL_PROFILE;Profile
PROFILEPANEL_SAVEDLGLABEL;Save Postprocessing Parameters...
PROFILEPANEL_TOOLTIPCOPY;Copy current profile to clipboard
PROFILEPANEL_TOOLTIPLOAD;Load a profile from file
PROFILEPANEL_TOOLTIPPASTE; Paste profile from clipboard
PROFILEPANEL_TOOLTIPSAVE;Save current profile
PROFILEPANEL_COPYPPASTE;Parameters to copy
PROFILEPANEL_LOADPPASTE;Parameters to load
PROFILEPANEL_PASTEPPASTE;Parameters to paste
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_CACORRECTION;CA correction...
PROGRESSBAR_DARKFRAME;Darkframe...
@ -955,6 +959,7 @@ TP_PERSPECTIVE_LABEL;Perspective
TP_PERSPECTIVE_VERTICAL;Vertical
TP_PREPROCESS_GREENEQUIL;Green equilibration
TP_PREPROCESS_HOTDEADPIXFILT;Apply hot/dead pixel filter
TP_PREPROCESS_HOTDEADPIXTHRESH;Hot/dead pixel detection threshold
TP_PREPROCESS_LABEL;Preprocessing
TP_PREPROCESS_LINEDENOISE;Line noise filter
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_ZOOMOUT;Zoom Out <b>-</b>
#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
HighlightComprThreshold=33
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]
Red=100;0;0;
@ -53,6 +53,15 @@ 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
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0
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]
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=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -193,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0
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]
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=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -193,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,21 +74,11 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Temperature=5745
Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising]
Enabled=false
Threshold=50
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ 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
@ -193,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,21 +74,11 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Temperature=5745
Green=1.0
[Color Shift]
ChannelA=0
ChannelB=0
[Impulse Denoising]
Enabled=false
Threshold=50
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ 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
@ -193,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0
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]
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=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -193,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0
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]
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=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -193,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0
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]
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=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -193,13 +136,12 @@ 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

View File

@ -11,7 +11,7 @@ InTrash=false
[Exposure]
Auto=true
Clip=0
Compensation=-0
Compensation=0.0
Brightness=0
Contrast=0
Saturation=0
@ -74,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5745
Green=1.0353332844067824
[Color Shift]
ChannelA=0
ChannelB=0
Green=1.0
[Impulse Denoising]
Enabled=false
@ -106,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -125,60 +106,13 @@ 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.0
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -202,13 +136,12 @@ 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

View File

@ -74,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5745
Green=1.0349999999999993
[Color Shift]
ChannelA=0
ChannelB=0
Green=1.0
[Impulse Denoising]
Enabled=false
@ -106,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -125,60 +106,13 @@ 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.0
AppliesTo=Cropped area
Method=Bicubic
DataSpecified=0
Width=4276
Height=2836
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -202,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=true
@ -97,15 +96,6 @@ Gamma=1.2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0
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]
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=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -193,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=true
@ -97,15 +96,6 @@ Gamma=1.2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0
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]
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=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -193,13 +136,12 @@ 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

View File

@ -53,6 +53,15 @@ 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
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5000
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=false
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,60 +106,13 @@ ShadowTonalWidth=80
LocalContrast=0
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]
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=4281
Height=2871
[Color Management]
InputProfile=(cameraICC)
BlendCMSMatrix=true
@ -193,13 +136,12 @@ 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

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
DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=50
Saturated=50
PSThreshold=75
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
[SharpenEdge]
Enabled=false
Passes=2
@ -65,20 +74,10 @@ Matrix=false
Strength=20
Uniformity=50
[Color Boost]
Amount=0
AvoidColorClipping=false
SaturationLimiter=false
SaturationLimit=75
[White Balance]
Setting=Camera
Temperature=5200
Green=1
[Color Shift]
ChannelA=0
ChannelB=0
Temperature=5745
Green=1.0
[Impulse Denoising]
Enabled=false
@ -86,7 +85,7 @@ Threshold=50
[Defringing]
Enabled=false
Radius=2
Radius=2.0
Threshold=25
[Directional Pyramid Denoising]
@ -97,15 +96,6 @@ Gamma=2
LumCurve=0;
ChromCurve=0;
[Luminance Denoising]
Enabled=false
Radius=2.5
EdgeTolerance=1500
[Chrominance Denoising]
Enabled=false
Amount=20
[Shadows & Highlights]
Enabled=false
HighQuality=false
@ -116,69 +106,22 @@ 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
InputProfile=(cameraICC)
BlendCMSMatrix=true
WorkingProfile=sRGB
OutputProfile=RT_sRGB
Gammafree=default
Freegamma=false
GammaValue=2.22
GammaSlope=4.5
GammaValue=2.22
GammaSlope=4.5
[Directional Pyramid Equalizer]
Enabled=false
@ -193,13 +136,12 @@ 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

View File

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

View File

@ -55,7 +55,7 @@ class ImageData : public ImageMetaData {
virtual ~ImageData ();
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 hasIPTC () const { return iptc; }

View File

@ -61,14 +61,17 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot) {
}
// 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
exifChange.resize (exif.size());
for (int i=0; i<exif.size(); i++) {
exifChange[i].first = exif[i].field;
exifChange[i].second = exif[i].value;
}
exifChange.clear();
exifChange = exif;
/*unsigned int j=0;
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; }
@ -82,23 +85,23 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const std::vector<
return;
iptc = iptc_data_new ();
for (int i=0; i<iptcc.size(); i++) {
if (iptcc[i].field == "Keywords" && !(iptcc[i].values.empty())) {
for (int j=0; j<iptcc[i].values.size(); j++) {
for (rtengine::procparams::IPTCPairs::const_iterator i=iptcc.begin(); i!=iptcc.end(); i++) {
if (i->first == "Keywords" && !(i->second.empty())) {
for (unsigned int j=0; j<i->second.size(); j++) {
IptcDataSet * ds = iptc_dataset_new ();
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_data_add_dataset (iptc, ds);
iptc_dataset_unref (ds);
}
continue;
}
else if (iptcc[i].field == "SupplementalCategories" && !(iptcc[i].values.empty())) {
for (int j=0; j<iptcc[i].values.size(); j++) {
else if (i->first == "SupplementalCategories" && !(i->second.empty())) {
for (unsigned int j=0; j<i->second.size(); j++) {
IptcDataSet * ds = iptc_dataset_new ();
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_data_add_dataset (iptc, ds);
iptc_dataset_unref (ds);
@ -106,10 +109,10 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const std::vector<
continue;
}
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 ();
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_data_add_dataset (iptc, ds);
iptc_dataset_unref (ds);
@ -243,7 +246,7 @@ int ImageIO::loadPNG (Glib::ustring fname) {
png_read_row (png, (png_byte*)row, NULL);
if (bit_depth==16) { // convert scanline to host byte order
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]);
}
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];
png_write_info(png,info);
for (unsigned int i=0;i<height;i++) {
for (int i=0;i<height;i++) {
getScanline (i, row, bps);
if (bps==16) {
// convert to network byte order
@ -892,7 +895,7 @@ void png_flush(png_structp png_ptr) {
int ImageIO::load (Glib::ustring fname) {
int lastdot = fname.find_last_of ('.');
unsigned int lastdot = fname.find_last_of ('.');
if( Glib::ustring::npos == lastdot )
return IMIO_FILETYPENOTSUPPORTED;
if (!fname.casefold().compare (lastdot, 4, ".png"))
@ -906,7 +909,7 @@ int ImageIO::load (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 )
return IMIO_FILETYPENOTSUPPORTED;
if (!fname.casefold().compare (lastdot, 4, ".png"))

View File

@ -44,23 +44,23 @@ class ImageIO {
int profileLength;
char* loadedProfileData;
int loadedProfileLength;
std::vector<std::pair<std::string,std::string> > exifChange;
procparams::ExifPairs exifChange;
IptcData* iptc;
const rtexif::TagDirectory* exifRoot;
Glib::Mutex imutex;
public:
static Glib::ustring errorMsg[6];
ImageIO () : pl (NULL), embProfile(NULL), profileData(NULL), loadedProfileData(NULL), loadedProfileLength(0), iptc(NULL), exifRoot (NULL) {}
virtual ~ImageIO ();
void setProgressListener (ProgressListener* l) { pl = l; }
virtual int getW () =0;
virtual int getH () =0;
virtual void allocate (int width, int height) =0;
virtual int getH () =0;
virtual void allocate (int width, int height) =0;
virtual int getBPS () =0;
virtual void getScanline (int row, unsigned char* buffer, int bps) {}
virtual void setScanline (int row, unsigned char* buffer, int bps) {}
@ -78,12 +78,12 @@ class ImageIO {
int savePNG (Glib::ustring fname, int compression = -1, volatile int bps = -1);
int saveJPEG (Glib::ustring fname, int quality = 100);
int saveTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false);
cmsHPROFILE getEmbeddedProfile () { return embProfile; }
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, const std::vector<rtengine::procparams::ExifPair>& exif, const std::vector<rtengine::procparams::IPTCPair>& iptcc);
void setMetadata (const rtexif::TagDirectory* eroot);
void setMetadata (const rtexif::TagDirectory* eroot, const rtengine::procparams::ExifPairs& exif, const rtengine::procparams::IPTCPairs& iptcc);
void setOutputProfile (char* pdata, int plen);
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 <vector>
class ParamsEdited;
namespace rtengine {
namespace procparams {
@ -126,14 +128,14 @@ class VibranceParams {
/**
* Parameters of the color boost
*/
class ColorBoostParams {
/*class ColorBoostParams {
public:
int amount;
bool avoidclip;
bool enable_saturationlimiter;
double saturationlimit;
};
};*/
/**
* Parameters of the white balance adjustments
@ -179,36 +181,35 @@ class WBParams {
/**
* Parameters of the color shift
*/
class ColorShiftParams {
/*class ColorShiftParams {
public:
double a;
double b;
};
};*/
/**
* Parameters of the luminance denoising
*/
class LumaDenoiseParams {
/*class LumaDenoiseParams {
public:
bool enabled;
double radius;
int edgetolerance;
};
};*/
/**
* Parameters of the color denoising
*/
class ColorDenoiseParams {
/*class ColorDenoiseParams {
public:
bool enabled;
double radius;
int edgetolerance;
bool edgesensitive;
int amount;
};
};*/
/**
* Parameters of defringing
@ -243,8 +244,6 @@ class ColorDenoiseParams {
int luma;
int chroma;
float gamma;
std::vector<double> lumcurve;
std::vector<double> chromcurve;
};
//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 {
public:
Glib::ustring field;
Glib::ustring value;
};
typedef std::map<Glib::ustring, Glib::ustring> ExifPairs;
/**
* The IPTC key/value pairs
*/
class IPTCPair {
public:
Glib::ustring field;
std::vector<Glib::ustring> values;
};
typedef std::map<Glib::ustring, std::vector<Glib::ustring> > IPTCPairs;
/**
* Directional pyramid equalizer params
@ -522,11 +511,11 @@ class ProcParams {
SharpenEdgeParams sharpenEdge; ///< Sharpen edge parameters
SharpenMicroParams sharpenMicro; ///< Sharpen microcontrast parameters
VibranceParams vibrance; ///< Vibrance parameters
ColorBoostParams colorBoost; ///< Color boost parameters
//ColorBoostParams colorBoost; ///< Color boost parameters
WBParams wb; ///< White balance parameters
ColorShiftParams colorShift; ///< Color shift parameters
LumaDenoiseParams lumaDenoise; ///< Luminance denoising parameters
ColorDenoiseParams colorDenoise; ///< Color denoising parameters
//ColorShiftParams colorShift; ///< Color shift parameters
//LumaDenoiseParams lumaDenoise; ///< Luminance denoising parameters
//ColorDenoiseParams colorDenoise; ///< Color denoising parameters
DefringeParams defringe; ///< Defringing parameters
ImpulseDenoiseParams impulseDenoise; ///< Impulse denoising parameters
DirPyrDenoiseParams dirpyrDenoise; ///< Directional Pyramid denoising parameters
@ -544,18 +533,18 @@ class ProcParams {
HRecParams hlrecovery; ///< Highlight recovery parameters
ResizeParams resize; ///< Resize parameters
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
DirPyrEqualizerParams dirpyrequalizer; ///< directional pyramid 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 colorlabel; ///< Custom color label
bool inTrash; ///< Marks deleted image
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
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
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.
@ -568,17 +557,19 @@ class ProcParams {
/**
* Saves the parameters to possibly two files. This is a performance improvement if a function has to
* 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 fname2 the name of the second file (can be an empty string) (optional)
* @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 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)
*/
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.
* @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)
*/
int load (Glib::ustring fname);
int load (Glib::ustring fname, ParamsEdited* pedited=NULL);
/** Creates a new instance of ProcParams.
* @return a pointer to the new ProcParams instance. */
@ -603,6 +594,32 @@ class ProcParams {
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

View File

@ -58,7 +58,7 @@ namespace rtengine {
virtual bool hasIPTC () const =0;
/** Returns 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 */
virtual struct tm getDateTime () const =0;
/** @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)
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)
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)
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
int offs = 6;
@ -1423,8 +1423,8 @@ int ExifManager::createJPEGMarker (const TagDirectory* root, const std::vector<
else
cl = new TagDirectory (NULL, ifdAttribs, INTEL);
for (int i=0; i<changeList.size(); i++)
cl->applyChange (changeList[i].first, changeList[i].second);
for (rtengine::procparams::ExifPairs::const_iterator i=changeList.begin(); i!=changeList.end(); i++)
cl->applyChange (i->first, i->second);
getDefaultTIFFTags (cl);
@ -1442,7 +1442,7 @@ int ExifManager::createJPEGMarker (const TagDirectory* root, const std::vector<
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
int offs = 0;
@ -1489,8 +1489,8 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const std::vector<
}
// apply list of changes
for (int i=0; i<changeList.size(); i++)
cl->applyChange (changeList[i].first, changeList[i].second);
for (rtengine::procparams::ExifPairs::const_iterator i=changeList.begin(); i!=changeList.end(); i++)
cl->applyChange (i->first, i->second);
// append default properties
getDefaultTIFFTags (cl);

View File

@ -26,6 +26,7 @@
#include <sstream>
#include <cstdlib>
#include <cmath>
#include "../rtengine/procparams.h"
namespace rtexif {
@ -203,8 +204,8 @@ class ExifManager {
static void parseCIFF (FILE* f, int base, int length, TagDirectory* root);
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 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 createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, 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 {

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})
endif (WIN32)
# 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)
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++)
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++)
@ -95,6 +95,7 @@ void BatchToolPanelCoordinator::initSession () {
selected[i]->addThumbnailListener (this);
}
// compare all the ProcParams and describe which parameters has different (i.e. inconsistent) values in pparamsEdited
pparamsEdited.initFrom (initialPP);
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_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_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_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_GREENMAGENTA]) pparams.colorShift.b = 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_ROTATE_DEGREE]) pparams.rotate.degree = 0;
if (options.baBehav[ADDSET_DIST_AMOUNT]) pparams.distortion.amount = 0;
@ -228,6 +229,7 @@ void BatchToolPanelCoordinator::initSession () {
toolPanels[i]->read (&pparams, &pparamsEdited);
}
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);
}
}
@ -271,7 +273,7 @@ void BatchToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const G
for (unsigned int j=0; j<toolPanels.size(); j++)
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++)
@ -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)
pparamsEdited = *paramsEdited;
for (int i=0; i<toolPanels.size(); i++)
// writing the values to the GUI
toolPanels[i]->read (&pparams, &pparamsEdited);
somethingChanged = true;
@ -319,12 +334,12 @@ void BatchToolPanelCoordinator::profileChange (const ProcParams *nparams, rteng
for (int i=0; i<toolPanels.size(); i++)
toolPanels[i]->write (&pparams, &pparamsEdited);
// combine with initial parameters and set
// combine with initial parameters of each image and set
ProcParams newParams;
for (int i=0; i<selected.size(); i++) {
newParams = initialPP[i];
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++)

View File

@ -55,7 +55,7 @@ class BatchToolPanelCoordinator :
void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr);
// 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
void getAutoWB (double& temp, double& green);

View File

@ -19,3 +19,51 @@
#include "clipboard.h"
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 "../rtengine/rtengine.h"
#include "../rtengine/procparams.h"
#include "paramsedited.h"
#include "mydiagonalcurve.h"
class Clipboard {
bool _hasIPTC;
std::vector<rtengine::procparams::IPTCPair> iptc;
bool _hasProcParams;
rtengine::procparams::ProcParams procParams;
rtengine::procparams::IPTCPairs iptc;
rtengine::procparams::PartialProfile partProfile;
DiagonalCurveType hasCurveDataType;
std::vector<double> curve;
public:
void setIPTC (const std::vector<rtengine::procparams::IPTCPair>& iptcc) { iptc = iptcc; _hasIPTC = true;}
const std::vector<rtengine::procparams::IPTCPair>& getIPTC () { return iptc; }
void setIPTC (const rtengine::procparams::IPTCPairs& iptcc) { iptc = iptcc; _hasIPTC = true;}
const rtengine::procparams::IPTCPairs& getIPTC () { return iptc; }
bool hasIPTC () { return _hasIPTC; }
void setProcParams (const rtengine::procparams::ProcParams& pparams) { procParams = pparams; _hasProcParams = true; }
const rtengine::procparams::ProcParams& getProcParams () { return procParams; }
bool hasProcParams () { return _hasProcParams; }
void setPartialProfile (const rtengine::procparams::PartialProfile& pprofile);
const rtengine::procparams::PartialProfile& getPartialProfile () { return partProfile; };
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; }
const std::vector<double> & getCurveData () { return curve; }
DiagonalCurveType hasCurveData () { return hasCurveDataType; }
Clipboard ();
~Clipboard ();
};

View File

@ -479,7 +479,7 @@ void EditorPanel::saveProfile () {
ipc->getParams (&params);
// 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()) {
rtengine::procparams::ProcParams pparams;
ipc->getParams (&pparams);
openThm->setProcParams (pparams, EDITOR, false);
openThm->setProcParams (pparams, NULL, EDITOR, false);
}
// 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) {
if (whoChangedIt!=EDITOR)
tpc->profileChange (&openThm->getProcParams(), rtengine::EvProfileChangeNotification, M("PROGRESSDLG_PROFILECHANGEDINBROWSER"));
if (whoChangedIt!=EDITOR) {
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) {

View File

@ -512,27 +512,15 @@ void ExifPanel::updateChangeList (Gtk::TreeModel::Children root, std::string pre
if (prefix!="")
prefix = prefix + ".";
Gtk::TreeModel::iterator iter;
for (iter = root.begin(); iter!=root.end(); iter++) {
if (iter->get_value (exifColumns.edited) == true) {
ExifPair ec;
ec.field = prefix + iter->get_value (exifColumns.field_nopango);
ec.value = iter->get_value (exifColumns.value_nopango);
changeList.push_back (ec);
}
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.edited) == true)
changeList[ prefix+iter->get_value (exifColumns.field_nopango) ] = iter->get_value (exifColumns.value_nopango);
else if (iter->get_value (exifColumns.action) == WRITE && iter->get_value (exifColumns.icon) == delicon)
changeList[ prefix+iter->get_value (exifColumns.field_nopango) ] = "#delete";
else if (iter->get_value (exifColumns.action) == DONTWRITE && iter->get_value (exifColumns.icon) == keepicon)
changeList[ prefix+iter->get_value (exifColumns.field_nopango) ] = "#keep";
if (iter->get_value (exifColumns.icon) == keepicon)
updateChangeList (iter->children(), prefix + iter->get_value (exifColumns.field_nopango));
}
@ -546,8 +534,8 @@ void ExifPanel::updateChangeList () {
void ExifPanel::applyChangeList () {
for (int i=0; i<changeList.size(); i++)
editTag (exifTreeModel->children(), changeList[i].field, changeList[i].value);
for (rtengine::procparams::ExifPairs::iterator i=changeList.begin(); i!=changeList.end(); i++)
editTag (exifTreeModel->children(), i->first, i->second);
}
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;
int fullw, fullh, cx, cy, cw, ch;
bool crenabled;
std::vector<rtengine::procparams::ExifPair> changeList;
std::vector<rtengine::procparams::ExifPair> defChangeList;
rtengine::procparams::ExifPairs changeList;
rtengine::procparams::ExifPairs defChangeList;
bool recursiveOp;
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_sharpenEdge = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SHARPENEDGE")));
bypass_sharpenMicro = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_SHARPENMICRO")));
bypass_lumaDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_LUMADENOISE")));
bypass_colorDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_COLORDENOISE")));
//bypass_lumaDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_LUMADENOISE")));
//bypass_colorDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_COLORDENOISE")));
bypass_defringe = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_DEFRINGE")));
bypass_dirpyrDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_DIRPYRDENOISE")));
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_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_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_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_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_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_sharpenEdge = bypass_sharpenEdge->get_active ();
options.fastexport_bypass_sharpenMicro = bypass_sharpenMicro->get_active ();
options.fastexport_bypass_lumaDenoise = bypass_lumaDenoise->get_active ();
options.fastexport_bypass_colorDenoise = bypass_colorDenoise->get_active ();
//options.fastexport_bypass_lumaDenoise = bypass_lumaDenoise->get_active ();
//options.fastexport_bypass_colorDenoise = bypass_colorDenoise->get_active ();
options.fastexport_bypass_defringe = bypass_defringe->get_active ();
options.fastexport_bypass_dirpyrDenoise = bypass_dirpyrDenoise->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_sharpenEdge->set_active (options.fastexport_bypass_sharpenEdge );
bypass_sharpenMicro->set_active (options.fastexport_bypass_sharpenMicro );
bypass_lumaDenoise->set_active (options.fastexport_bypass_lumaDenoise );
bypass_colorDenoise->set_active (options.fastexport_bypass_colorDenoise );
//bypass_lumaDenoise->set_active (options.fastexport_bypass_lumaDenoise );
//bypass_colorDenoise->set_active (options.fastexport_bypass_colorDenoise );
bypass_defringe->set_active (options.fastexport_bypass_defringe );
bypass_dirpyrDenoise->set_active (options.fastexport_bypass_dirpyrDenoise );
bypass_sh_hq->set_active (options.fastexport_bypass_sh_hq );
@ -323,8 +323,8 @@ void ExportPanel::bypassALL_Toggled(){
bypass_sharpeningConn.block (true);
bypass_sharpenEdgeConn.block (true);
bypass_sharpenMicroConn.block (true);
bypass_lumaDenoiseConn.block (true);
bypass_colorDenoiseConn.block (true);
//bypass_lumaDenoiseConn.block (true);
//bypass_colorDenoiseConn.block (true);
bypass_defringeConn.block (true);
bypass_dirpyrDenoiseConn.block (true);
bypass_sh_hqConn.block (true);
@ -344,8 +344,8 @@ void ExportPanel::bypassALL_Toggled(){
bypass_sharpening->set_active(bypass_ALL->get_active());
bypass_sharpenEdge->set_active(bypass_ALL->get_active());
bypass_sharpenMicro->set_active(bypass_ALL->get_active());
bypass_lumaDenoise->set_active(bypass_ALL->get_active());
bypass_colorDenoise->set_active(bypass_ALL->get_active());
//bypass_lumaDenoise->set_active(bypass_ALL->get_active());
//bypass_colorDenoise->set_active(bypass_ALL->get_active());
bypass_defringe->set_active(bypass_ALL->get_active());
bypass_dirpyrDenoise->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_sharpenEdgeConn.block (false);
bypass_sharpenMicroConn.block (false);
bypass_lumaDenoiseConn.block (false);
bypass_colorDenoiseConn.block (false);
//bypass_lumaDenoiseConn.block (false);
//bypass_colorDenoiseConn.block (false);
bypass_defringeConn.block (false);
bypass_dirpyrDenoiseConn.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_sharpenMicro;
Gtk::CheckButton* bypass_sharpening;
Gtk::CheckButton* bypass_lumaDenoise;
Gtk::CheckButton* bypass_colorDenoise;
//Gtk::CheckButton* bypass_lumaDenoise;
//Gtk::CheckButton* bypass_colorDenoise;
Gtk::CheckButton* bypass_defringe;
Gtk::CheckButton* bypass_dirpyrDenoise;
Gtk::CheckButton* bypass_sh_hq;
@ -77,8 +77,8 @@ class ExportPanel : public Gtk::VBox {
sigc::connection bypass_sharpeningConn ;
sigc::connection bypass_sharpenEdgeConn ;
sigc::connection bypass_sharpenMicroConn ;
sigc::connection bypass_lumaDenoiseConn ;
sigc::connection bypass_colorDenoiseConn ;
//sigc::connection bypass_lumaDenoiseConn ;
//sigc::connection bypass_colorDenoiseConn ;
sigc::connection bypass_defringeConn ;
sigc::connection bypass_dirpyrDenoiseConn ;
sigc::connection bypass_sh_hqConn ;

View File

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

View File

@ -102,8 +102,8 @@ class FileBrowser : public ThumbBrowserBase,
FileBrowserListener* tbl;
BrowserFilter filter;
PartialPasteDlg partialPasteDlg;
int numFiltered;
PartialPasteDlg partialPasteDlg;
FileBrowserIdleHelper* fbih;
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_sharpenEdge ) params.sharpenEdge.enabled = false;
if (options.fastexport_bypass_sharpenMicro ) params.sharpenMicro.enabled = false;
if (options.fastexport_bypass_lumaDenoise ) params.lumaDenoise.enabled = false;
if (options.fastexport_bypass_colorDenoise ) params.colorDenoise.enabled = false;
//if (options.fastexport_bypass_lumaDenoise ) params.lumaDenoise.enabled = false;
//if (options.fastexport_bypass_colorDenoise ) params.colorDenoise.enabled = false;
if (options.fastexport_bypass_defringe ) params.defringe.enabled = false;
if (options.fastexport_bypass_dirpyrDenoise ) params.dirpyrDenoise.enabled = false;
if (options.fastexport_bypass_sh_hq ) params.sh.hq = false;

View File

@ -144,9 +144,12 @@ void History::historySelectionChanged () {
if (row)
bTreeView->get_selection()->unselect_all ();
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];
tpc->profileChange (&params, EvHistoryBrowsed, row[historyColumns.text], &paramsEdited);
tpc->profileChange (&pp, EvHistoryBrowsed, row[historyColumns.text], &paramsEdited);
}
if (blistener && blistenerLock==false) {
Gtk::TreeModel::Path path = historyModel->get_path (iter);
@ -167,9 +170,12 @@ void History::bookmarkSelectionChanged () {
if (row)
hTreeView->get_selection()->unselect_all ();
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];
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)
row = historyModel->children()[size-1];
// 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());
newrow[historyColumns.realText] = eventDescrArray[ev];
newrow[historyColumns.text] = text;

View File

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

View File

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

View File

@ -58,7 +58,8 @@ bool simpleEditor;
* 1 to start GUI (with a dir or file option)
* 2 to start GUI because no files found
* -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 main(int argc, char **argv)
@ -164,24 +165,36 @@ int main(int argc, char **argv)
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 )
{
rtengine::procparams::PartialProfile *rawParams=NULL, *imgParams=NULL;
std::vector<Glib::ustring> inputFiles;
Glib::ustring outputPath = "";
Glib::ustring processingParams = "";
std::vector<rtengine::procparams::PartialProfile*> processingParams;
bool isDirectory=false;
bool outputDirectory=false;
bool overwriteFiles=false;
bool sideProcParams=false;
bool copyParamsFile=false;
bool useDefaultIfAbsent=true;
bool skipIfNoSidecar=false;
bool useDefault=false;
unsigned int sideCarFilePos = 0;
int compression=100;
int bits=-1;
std::string outputType = "";
unsigned errors=0;
for( int iArg=1; iArg<argc; iArg++){
if( argv[iArg][0]=='-' ){
switch( argv[iArg][1]){
switch( argv[iArg][1] ){
case 'O':
copyParamsFile = true;
case 'o': // outputfile or dir
@ -192,16 +205,35 @@ int processLineParams( int argc, char **argv )
outputDirectory=true;
}
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 ){
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;
case 'S':
useDefaultIfAbsent=false;
case 's': // Processing params next to file (.pp3 appended)
skipIfNoSidecar=true;
case 's': // Processing params next to file (file extension appended)
sideProcParams = true;
sideCarFilePos = processingParams.size();
break;
case 'd':
useDefault = true;
break;
case 'Y':
overwriteFiles =true;
@ -232,7 +264,7 @@ int processLineParams( int argc, char **argv )
safe_build_file_list (dir, names, argv[iArg] );
for(size_t iFile=0; iFile< names.size(); iFile++ ){
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::size_type ext= s.find_last_of('.');
if( Glib::ustring::npos == ext )
@ -250,27 +282,41 @@ int processLineParams( int argc, char **argv )
case 'h':
case '?':
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 << 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]) << " -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 << 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 dir and copy pp3 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 << " ex: for IMG001.NEF there should be IMG001.NEF.pp3 in the same dir" << std::endl;
std::cerr << " -O <outputFile>|<outputDir> : select output dir and copy " << pparamsExt << " file into it"<< 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." << pparamsExt << " in the same dir" << 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 << " -p <file.pp3> : specify pp3 file to be used for all conversions."<< std::endl;
std::cerr << " -S : like -s but skip if " << pparamsExt << " file not found." << 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 << " -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 << " -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;
}
}
}else{
argv1 = safe_filename_to_utf8 ( argv[iArg] );
if( outputDirectory ){
@ -299,17 +345,33 @@ int processLineParams( int argc, char **argv )
if( inputFiles.empty() )
return 2;
rtengine::procparams::ProcParams params,paramsRaw,paramsImg, *currentParams;
if( !sideProcParams ){
if( processingParams.length()>0 )
params.load ( processingParams );
else{
paramsRaw.load(options.profilePath+"/"+options.defProfRaw+paramFileExtension);
paramsImg.load(options.profilePath+"/"+options.defProfImg+paramFileExtension);
if (useDefault) {
rawParams = new rtengine::procparams::PartialProfile(true);
if (rawParams->load(options.profilePath+"/" + options.defProfRaw + paramFileExtension)) {
std::cerr << "Error: default Raw procparams file \""<< (options.profilePath+"/" + options.defProfRaw + paramFileExtension) << "\" not found" << std::endl;
rawParams->deleteInstance();
delete rawParams;
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++){
// Has to be reinstanciated at each profile to have a ProcParams object with default values
rtengine::procparams::ProcParams currentParams;
Glib::ustring inputFile = inputFiles[iFile];
std::cout << "Processing: " << inputFile << std::endl;
@ -354,27 +416,48 @@ int processLineParams( int argc, char **argv )
std::cerr << "Error loading file: "<< inputFile << std::endl;
continue;
}
if( sideProcParams ){
Glib::ustring sideProcessingParams = inputFile + paramFileExtension;
if( !safe_file_test( sideProcessingParams, Glib::FILE_TEST_EXISTS ) || params.load ( sideProcessingParams )){
if( useDefaultIfAbsent ){
currentParams = isRaw? &paramsRaw: &paramsImg;
}else{
delete ii;
errors++;
std::cerr << "Error loading processing params: "<< sideProcessingParams << std::endl;
continue;
}
}else
currentParams = &params;
}else if( processingParams.length()>0 ){
currentParams = &params;
}else if(isRaw ){
currentParams = &paramsRaw;
}else{
currentParams = &paramsImg;
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);
}
}
job = rtengine::ProcessingJob::create (ii, *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;
// the "load" method don't reset the procparams values anymore, so values found in the procparam file override the one of currentParams
if( !safe_file_test( sideProcessingParams, Glib::FILE_TEST_EXISTS ) || currentParams.load ( sideProcessingParams ))
std::cerr << "Warning: sidecar file requested but not found for: "<< sideProcessingParams << std::endl;
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;
errors++;
std::cerr << "Error: no sidecar procparams found for: "<< inputFile << std::endl;
continue;
}
job = rtengine::ProcessingJob::create (ii, currentParams);
if( !job ){
errors++;
std::cerr << "Error creating processing for: "<< inputFile << std::endl;
@ -406,12 +489,17 @@ int processLineParams( int argc, char **argv )
}else{
if( copyParamsFile ){
Glib::ustring outputProcessingParams = outputFile + paramFileExtension;
currentParams->save( outputProcessingParams );
currentParams.save( outputProcessingParams );
}
}
ii->decreaseRef();
resultImage->free();
}
if (imgParams) { imgParams->deleteInstance(); delete imgParams; }
if (rawParams) { rawParams->deleteInstance(); delete rawParams; }
deleteProcParams(processingParams);
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)
startupPath = "";
profilePath = "profiles";
loadSaveProfilePath = "";
dirBrowserWidth = 200;
dirBrowserHeight = 150;
preferencesWidth = 0;
@ -165,8 +166,8 @@ void Options::setDefaults () {
fastexport_bypass_sharpening = true;
fastexport_bypass_sharpenEdge = true;
fastexport_bypass_sharpenMicro = true;
fastexport_bypass_lumaDenoise = true;
fastexport_bypass_colorDenoise = true;
//fastexport_bypass_lumaDenoise = true;
//fastexport_bypass_colorDenoise = true;
fastexport_bypass_defringe = true;
fastexport_bypass_dirpyrDenoise = true;
fastexport_bypass_sh_hq = true;
@ -211,12 +212,12 @@ void Options::setDefaults () {
0, // ADDSET_LC_BRIGHTNESS
0, // ADDSET_LC_CONTRAST
0, // ADDSET_SHARP_AMOUNT
0, // ADDSET_LD_EDGETOLERANCE
//0, // ADDSET_LD_EDGETOLERANCE -- From obsolete and removed tool
0, // ADDSET_WB_TEMPERATURE
0, // ADDSET_WB_GREEN
0, // ADDSET_CBOOST_AMOUNT
0, // ADDSET_CS_BLUEYELLOW
0, // ADDSET_CS_GREENMAGENTA
//0, // ADDSET_CBOOST_AMOUNT -- From obsolete and removed tool
//0, // ADDSET_CS_BLUEYELLOW -- From obsolete and removed tool
//0, // ADDSET_CS_GREENMAGENTA -- From obsolete and removed tool
0, // ADDSET_ROTATE_DEGREE
0, // ADDSET_DIST_AMOUNT
0, // ADDSET_PERSPECTIVE
@ -367,12 +368,13 @@ if (keyFile.has_group ("Output")) {
}
if (keyFile.has_group ("Profiles")) {
if (keyFile.has_key ("Profiles", "Directory")) profilePath = keyFile.get_string ("Profiles", "Directory");
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", "SaveParamsWithFile")) saveParamsFile = keyFile.get_boolean ("Profiles", "SaveParamsWithFile");
if (keyFile.has_key ("Profiles", "SaveParamsToCache")) saveParamsCache = keyFile.get_boolean ("Profiles", "SaveParamsToCache");
if (keyFile.has_key ("Profiles", "LoadParamsFromLocation")) paramsLoadLocation = (PPLoadLocation)keyFile.get_integer ("Profiles", "LoadParamsFromLocation");
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", "ImgDefault")) defProfImg = keyFile.get_string ("Profiles", "ImgDefault");
if (keyFile.has_key ("Profiles", "SaveParamsWithFile")) saveParamsFile = keyFile.get_boolean ("Profiles", "SaveParamsWithFile");
if (keyFile.has_key ("Profiles", "SaveParamsToCache")) saveParamsCache = keyFile.get_boolean ("Profiles", "SaveParamsToCache");
if (keyFile.has_key ("Profiles", "LoadParamsFromLocation")) paramsLoadLocation = (PPLoadLocation)keyFile.get_integer ("Profiles", "LoadParamsFromLocation");
if (keyFile.has_key ("Profiles", "CustomProfileBuilder")) customProfileBuilder = keyFile.get_string ("Profiles", "CustomProfileBuilder");
}
@ -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_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_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_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_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_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_string ("Profiles", "Directory", profilePath);
keyFile.set_string ("Profiles", "LoadSaveProfilePath", loadSaveProfilePath);
keyFile.set_string ("Profiles", "RawDefault", defProfRaw);
keyFile.set_string ("Profiles", "ImgDefault", defProfImg);
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_sharpenEdge" , fastexport_bypass_sharpenEdge );
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_colorDenoise" , fastexport_bypass_colorDenoise );
//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_defringe" , fastexport_bypass_defringe );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" , fastexport_bypass_dirpyrDenoise );
keyFile.set_boolean ("Fast Export", "fastexport_bypass_sh_hq" , fastexport_bypass_sh_hq );

View File

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

View File

@ -28,7 +28,11 @@ ParamsEdited::ParamsEdited () {
void ParamsEdited::set (bool v) {
toneCurve.curve = v;
general.rank = v;
general.colorlabel = v;
general.intrash = v;
toneCurve.curve = v;
toneCurve.brightness = v;
toneCurve.black = v;
toneCurve.contrast = v;
@ -80,20 +84,20 @@ void ParamsEdited::set (bool v) {
vibrance.protectskins = v;
vibrance.avoidcolorshift = v;
vibrance.pastsattog = v;
colorBoost.amount = v;
colorBoost.avoidclip = v;
colorBoost.enable_saturationlimiter = v;
colorBoost.saturationlimit = v;
//colorBoost.amount = v;
//colorBoost.avoidclip = v;
//colorBoost.enable_saturationlimiter = v;
//colorBoost.saturationlimit = v;
wb.method = v;
wb.green = v;
wb.temperature = v;
colorShift.a = v;
colorShift.b = v;
lumaDenoise.enabled = v;
lumaDenoise.radius = v;
lumaDenoise.edgetolerance = v;
colorDenoise.enabled = v;
colorDenoise.amount = v;
//colorShift.a = v;
//colorShift.b = v;
//lumaDenoise.enabled = v;
//lumaDenoise.radius = v;
//lumaDenoise.edgetolerance = v;
//colorDenoise.enabled = v;
//colorDenoise.amount = v;
defringe.enabled = v;
defringe.radius = v;
defringe.threshold = v;
@ -176,7 +180,8 @@ void ParamsEdited::set (bool v) {
raw.caBlue = v;
raw.caRed = v;
raw.greenEq = v;
raw.hotDeadPixel = v;
raw.hotDeadPixelFilter = v;
raw.hotDeadPixelThresh = v;
raw.linenoise = v;
raw.darkFrame = v;
raw.dfAuto = v;
@ -199,8 +204,8 @@ void ParamsEdited::set (bool v) {
hsvequalizer.hcurve = v;
hsvequalizer.scurve = v;
hsvequalizer.vcurve = v;
exif.clear ();
iptc.clear ();
exif = v;
iptc = v;
}
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.avoidcolorshift = vibrance.avoidcolorshift && p.vibrance.avoidcolorshift == other.vibrance.avoidcolorshift;
vibrance.pastsattog = vibrance.pastsattog && p.vibrance.pastsattog == other.vibrance.pastsattog;
colorBoost.amount = colorBoost.amount && p.colorBoost.amount == other.colorBoost.amount;
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.saturationlimit = colorBoost.saturationlimit && p.colorBoost.saturationlimit == other.colorBoost.saturationlimit;
//colorBoost.amount = colorBoost.amount && p.colorBoost.amount == other.colorBoost.amount;
//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.saturationlimit = colorBoost.saturationlimit && p.colorBoost.saturationlimit == other.colorBoost.saturationlimit;
wb.method = wb.method && p.wb.method == other.wb.method;
wb.green = wb.green && p.wb.green == other.wb.green;
wb.temperature = wb.temperature && p.wb.temperature == other.wb.temperature;
colorShift.a = colorShift.a && p.colorShift.a == other.colorShift.a;
colorShift.b = colorShift.b && p.colorShift.b == other.colorShift.b;
lumaDenoise.enabled = lumaDenoise.enabled && p.lumaDenoise.enabled == other.lumaDenoise.enabled;
lumaDenoise.radius = lumaDenoise.radius && p.lumaDenoise.radius == other.lumaDenoise.radius;
lumaDenoise.edgetolerance = lumaDenoise.edgetolerance && p.lumaDenoise.edgetolerance == other.lumaDenoise.edgetolerance;
colorDenoise.enabled = colorDenoise.enabled && p.colorDenoise.enabled == other.colorDenoise.enabled;
colorDenoise.amount = colorDenoise.amount && p.colorDenoise.amount == other.colorDenoise.amount;
//colorShift.a = colorShift.a && p.colorShift.a == other.colorShift.a;
//colorShift.b = colorShift.b && p.colorShift.b == other.colorShift.b;
//lumaDenoise.enabled = lumaDenoise.enabled && p.lumaDenoise.enabled == other.lumaDenoise.enabled;
//lumaDenoise.radius = lumaDenoise.radius && p.lumaDenoise.radius == other.lumaDenoise.radius;
//lumaDenoise.edgetolerance = lumaDenoise.edgetolerance && p.lumaDenoise.edgetolerance == other.lumaDenoise.edgetolerance;
//colorDenoise.enabled = colorDenoise.enabled && p.colorDenoise.enabled == other.colorDenoise.enabled;
//colorDenoise.amount = colorDenoise.amount && p.colorDenoise.amount == other.colorDenoise.amount;
defringe.enabled = defringe.enabled && p.defringe.enabled == other.defringe.enabled;
defringe.radius = defringe.radius && p.defringe.radius == other.defringe.radius;
defringe.threshold = defringe.threshold && p.defringe.threshold == other.defringe.threshold;
@ -364,24 +369,25 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
raw.dcbEnhance = raw.dcbEnhance && p.raw.dcb_enhance == other.raw.dcb_enhance;
raw.allEnhance = raw.allEnhance && p.raw.all_enhance == other.raw.all_enhance;
raw.caCorrection = raw.caCorrection && p.raw.ca_autocorrect == other.raw.ca_autocorrect;
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.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.darkFrame = raw.darkFrame && p.raw.dark_frame == other.raw.dark_frame;
raw.dfAuto = raw.dfAuto && p.raw.df_autoselect == other.raw.df_autoselect;
raw.ff_file = raw.ff_file && p.raw.ff_file == other.raw.ff_file;
raw.ff_file = raw.ff_file && p.raw.ff_file == other.raw.ff_file;
raw.ff_AutoSelect = raw.ff_AutoSelect && p.raw.ff_AutoSelect == other.raw.ff_AutoSelect;
raw.ff_BlurRadius = raw.ff_BlurRadius && p.raw.ff_BlurRadius == other.raw.ff_BlurRadius;
raw.ff_BlurType = raw.ff_BlurType && p.raw.ff_BlurType == other.raw.ff_BlurType;
raw.exPos = raw.exPos && p.raw.expos == other.raw.expos;
raw.exPreser = raw.exPreser && p.raw.preser == other.raw.preser;
raw.exBlackzero = raw.exBlackzero && p.raw.blackzero == other.raw.blackzero;
raw.exBlackone = raw.exBlackone && p.raw.blackone == other.raw.blackone;
raw.exBlacktwo = p.raw.blacktwo == other.raw.blacktwo;
raw.exBlackthree = p.raw.blackthree == other.raw.blackthree;
raw.exTwoGreen = p.raw.twogreen == other.raw.twogreen;
raw.ff_BlurType = raw.ff_BlurType && p.raw.ff_BlurType == other.raw.ff_BlurType;
raw.exPos = raw.exPos && p.raw.expos == other.raw.expos;
raw.exPreser = raw.exPreser && p.raw.preser == other.raw.preser;
raw.exBlackzero = raw.exBlackzero && p.raw.blackzero == other.raw.blackzero;
raw.exBlackone = raw.exBlackone && p.raw.blackone == other.raw.blackone;
raw.exBlacktwo = p.raw.blacktwo == other.raw.blacktwo;
raw.exBlackthree = p.raw.blackthree == other.raw.blackthree;
raw.exTwoGreen = p.raw.twogreen == other.raw.twogreen;
dirpyrequalizer.enabled = dirpyrequalizer.enabled && p.dirpyrequalizer.enabled == other.dirpyrequalizer.enabled;
for(int i = 0; i < 8; i++) {
@ -390,8 +396,10 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
hsvequalizer.hcurve = hsvequalizer.hcurve && p.hsvequalizer.hcurve == other.hsvequalizer.hcurve;
hsvequalizer.scurve = hsvequalizer.scurve && p.hsvequalizer.scurve == other.hsvequalizer.scurve;
hsvequalizer.vcurve = hsvequalizer.vcurve && p.hsvequalizer.vcurve == other.hsvequalizer.vcurve;
// exif = exif && p.exif==other.exif
// iptc = other.iptc;
// How the hell can we handle that???
// exif = exif && p.exif==other.exif
// iptc = other.iptc;
}
}
@ -453,25 +461,21 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (vibrance.protectskins) toEdit.vibrance.protectskins = mods.vibrance.protectskins;
if (vibrance.avoidcolorshift) toEdit.vibrance.avoidcolorshift = mods.vibrance.avoidcolorshift;
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.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 (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 (lumaDenoise.enabled) toEdit.lumaDenoise.enabled = mods.lumaDenoise.enabled;
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 (colorDenoise.enabled) toEdit.colorDenoise.enabled = mods.colorDenoise.enabled;
if (colorDenoise.amount) toEdit.colorDenoise.amount = mods.colorDenoise.amount;
//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 (lumaDenoise.enabled) toEdit.lumaDenoise.enabled = mods.lumaDenoise.enabled;
//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 (colorDenoise.enabled) toEdit.colorDenoise.enabled = mods.colorDenoise.enabled;
//if (colorDenoise.amount) toEdit.colorDenoise.amount = mods.colorDenoise.amount;
if (defringe.enabled) toEdit.defringe.enabled = mods.defringe.enabled;
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.vflip) toEdit.coarse.vflip = mods.coarse.vflip ? !toEdit.coarse.vflip : toEdit.coarse.vflip;
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.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;
@ -547,7 +551,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (icm.gampos) toEdit.icm.gampos = dontforceSet && options.baBehav[ADDSET_FREE_OUPUT_GAMMA] ? toEdit.icm.gampos + mods.icm.gampos : mods.icm.gampos;
if (icm.slpos) toEdit.icm.slpos = dontforceSet && options.baBehav[ADDSET_FREE_OUTPUT_SLOPE] ? toEdit.icm.slpos + mods.icm.slpos : mods.icm.slpos;
if (icm.gamma) toEdit.icm.gamma = mods.icm.gamma;
if (icm.freegamma) toEdit.icm.freegamma = mods.icm.freegamma;
if (icm.freegamma) toEdit.icm.freegamma = mods.icm.freegamma;
if (raw.ccSteps) toEdit.raw.ccSteps = mods.raw.ccSteps;
if (raw.dmethod) toEdit.raw.dmethod = mods.raw.dmethod;
if (raw.dcbIterations) toEdit.raw.dcb_iterations = mods.raw.dcb_iterations;
@ -565,11 +569,12 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (raw.exBlackthree) toEdit.raw.blackthree = dontforceSet && options.baBehav[ADDSET_RAWEXPOS_BLACKS] ? toEdit.raw.blackthree + mods.raw.blackthree : mods.raw.blackthree;
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.hotDeadPixel) toEdit.raw.hotdeadpix_filt = mods.raw.hotdeadpix_filt;
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.dfAuto) toEdit.raw.df_autoselect = mods.raw.df_autoselect;
if (raw.greenEq) toEdit.raw.greenthresh = dontforceSet && options.baBehav[ADDSET_PREPROCESS_GREENEQUIL] ? toEdit.raw.greenthresh + mods.raw.greenthresh : mods.raw.greenthresh;
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.darkFrame) toEdit.raw.dark_frame = mods.raw.dark_frame;
if (raw.dfAuto) toEdit.raw.df_autoselect = mods.raw.df_autoselect;
if (raw.ff_file) toEdit.raw.ff_file = mods.raw.ff_file;
if (raw.ff_AutoSelect) toEdit.raw.ff_AutoSelect = mods.raw.ff_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.vcurve) toEdit.hsvequalizer.vcurve = mods.hsvequalizer.vcurve;
// if (exif) toEdit.exif==mo.exif = mods.exif==other.exif;
// if (iptc;) toEdit.iptc==other.iptc; = mods.iptc==other.iptc;;
// Exif changes are added to the existing ones
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 {
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;
}

View File

@ -21,8 +21,16 @@
#include <glibmm.h>
#include <vector>
#include "../rtengine/rtengine.h"
#include "../rtengine/procparams.h"
#include "../rtengine/rtengine.h"
class GeneralParamsEdited {
public:
bool rank;
bool colorlabel;
bool intrash;
};
class ToneCurveParamsEdited {
@ -111,14 +119,14 @@ class VibranceParamsEdited {
bool pastsattog;
};
class ColorBoostParamsEdited {
/*class ColorBoostParamsEdited {
public:
bool amount;
bool avoidclip;
bool enable_saturationlimiter;
bool saturationlimit;
};
};*/
class WBParamsEdited {
@ -128,27 +136,27 @@ class WBParamsEdited {
bool green;
};
class ColorShiftParamsEdited {
/*class ColorShiftParamsEdited {
public:
bool a;
bool b;
};
};*/
class LumaDenoiseParamsEdited {
/*class LumaDenoiseParamsEdited {
public:
bool enabled;
bool radius;
bool edgetolerance;
};
};*/
class ColorDenoiseParamsEdited {
/*class ColorDenoiseParamsEdited {
public:
bool enabled;
bool amount;
};
};*/
class DefringeParamsEdited {
@ -326,47 +334,35 @@ class RAWParamsEdited {
bool dmethod;
bool dcbIterations;
bool dcbEnhance;
bool allEnhance;
bool allEnhance;
bool caCorrection;
bool caRed;
bool caBlue;
bool caRed;
bool caBlue;
bool greenEq;
bool hotDeadPixel;
bool hotDeadPixelFilter;
bool hotDeadPixelThresh;
bool linenoise;
bool darkFrame;
bool dfAuto;
bool ff_file;
bool ff_AutoSelect;
bool ff_BlurRadius;
bool ff_BlurType;
bool exPos;
bool exPreser;
bool exBlackzero;
bool exBlackone;
bool exBlacktwo;
bool exBlackthree;
bool exTwoGreen;
bool ff_file;
bool ff_AutoSelect;
bool ff_BlurRadius;
bool ff_BlurType;
bool exPos;
bool exPreser;
bool exBlackzero;
bool exBlackone;
bool exBlacktwo;
bool exBlackthree;
bool exTwoGreen;
bool isUnchanged() const;
};
class ExifPairEdited {
public:
Glib::ustring field;
bool value;
};
class IPTCPairEdited {
public:
Glib::ustring field;
bool values;
};
class ParamsEdited {
public:
GeneralParamsEdited general;
ToneCurveParamsEdited toneCurve;
LCurveParamsEdited labCurve;
RGBCurvesParamsEdited rgbCurves;
@ -374,22 +370,22 @@ class ParamsEdited {
SharpenEdgeParamsEdited sharpenEdge;
SharpenMicroParamsEdited sharpenMicro;
VibranceParamsEdited vibrance;
ColorBoostParamsEdited colorBoost;
//ColorBoostParamsEdited colorBoost;
WBParamsEdited wb;
ColorShiftParamsEdited colorShift;
LumaDenoiseParamsEdited lumaDenoise;
ColorDenoiseParamsEdited colorDenoise;
//ColorShiftParamsEdited colorShift;
//LumaDenoiseParamsEdited lumaDenoise;
//ColorDenoiseParamsEdited colorDenoise;
DefringeParamsEdited defringe;
DirPyrDenoiseParamsEdited dirpyrDenoise;
EPDParamsEdited edgePreservingDecompositionUI;
EPDParamsEdited edgePreservingDecompositionUI;
ImpulseDenoiseParamsEdited impulseDenoise;
SHParamsEdited sh;
CropParamsEdited crop;
CoarseTransformParamsEdited coarse;
CommonTransformParamsEdited commonTrans;
CommonTransformParamsEdited commonTrans;
RotateParamsEdited rotate;
DistortionParamsEdited distortion;
PerspectiveParamsEdited perspective;
PerspectiveParamsEdited perspective;
CACorrParamsEdited cacorrection;
VignettingParamsEdited vignetting;
ChannelMixerParamsEdited chmixer;
@ -399,8 +395,8 @@ class ParamsEdited {
RAWParamsEdited raw;
DirPyrEqualizerParamsEdited dirpyrequalizer;
HSVEqualizerParamsEdited hsvequalizer;
std::vector<ExifPairEdited> exif;
std::vector<IPTCPairEdited> iptc;
bool exif;
bool iptc;
ParamsEdited ();

View File

@ -18,11 +18,12 @@
*/
#include "partialpastedlg.h"
#include "multilangmgr.h"
#include "paramsedited.h"
PartialPasteDlg::PartialPasteDlg () {
PartialPasteDlg::PartialPasteDlg (Glib::ustring title) {
set_modal (true);
set_title (M("PARTIALPASTE_DIALOGLABEL"));
set_title (title);
everything = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EVERYTHING")));
everything ->set_name("partialPasteHeader");
@ -47,6 +48,7 @@ PartialPasteDlg::PartialPasteDlg () {
exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE")));
hlrec = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_HLRECONSTRUCTION")));
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")));
// options in detail:
@ -56,7 +58,6 @@ PartialPasteDlg::PartialPasteDlg () {
impden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IMPULSEDENOISE")));
dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER")));
defringe = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEFRINGE")));
edgePreservingDecompositionUI = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD")));
// options in color:
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 (*hlrec, 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[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 (*dirpyrden, 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 (*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));
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));
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));
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));
//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));
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));
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_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-cancel"), 0);
set_response_sensitive (1);
set_default_response (1);
add_button (Gtk::StockID("gtk-ok"), Gtk::RESPONSE_OK);
add_button (Gtk::StockID("gtk-cancel"), Gtk::RESPONSE_CANCEL);
set_response_sensitive (Gtk::RESPONSE_OK);
set_default_response (Gtk::RESPONSE_OK);
show_all_children ();
}
@ -414,6 +415,7 @@ void PartialPasteDlg::basicToggled () {
exposureConn.block (true);
hlrecConn.block (true);
shConn.block (true);
epdConn.block(true);
labcurveConn.block (true);
basic->set_inconsistent (false);
@ -422,13 +424,15 @@ void PartialPasteDlg::basicToggled () {
exposure->set_active (basic->get_active ());
hlrec->set_active (basic->get_active ());
sh->set_active (basic->get_active ());
epd->set_active (basic->get_active ());
labcurve->set_active (basic->get_active ());
wbConn.block (false);
exposureConn.block (false);
hlrecConn.block (false);
labcurveConn.block (false);
shConn.block (false);
epdConn.block (false);
labcurveConn.block (false);
}
void PartialPasteDlg::detailToggled () {
@ -439,7 +443,6 @@ void PartialPasteDlg::detailToggled () {
impdenConn.block (true);
dirpyrdenConn.block (true);
defringeConn.block (true);
edgePreservingDecompositionUIConn.block(true);
dirpyreqConn.block (true);
//waveqConn.block (true);
@ -448,10 +451,9 @@ void PartialPasteDlg::detailToggled () {
sharpen->set_active (detail->get_active ());
sharpenedge->set_active (detail->get_active ());
sharpenmicro->set_active (detail->get_active ());
impden->set_active (detail->get_active ());
impden->set_active (detail->get_active ());
dirpyrden->set_active (detail->get_active ());
defringe->set_active (detail->get_active ());
edgePreservingDecompositionUI->set_active (detail->get_active ());
dirpyreq->set_active (detail->get_active ());
//waveq->set_active (detail->get_active ());
@ -461,32 +463,31 @@ void PartialPasteDlg::detailToggled () {
impdenConn.block (false);
dirpyrdenConn.block (false);
defringeConn.block (false);
edgePreservingDecompositionUIConn.block (false);
dirpyreqConn.block (false);
//waveqConn.block (false);
}
void PartialPasteDlg::colorToggled () {
vibranceConn.block (true);
vibranceConn.block (true);
chmixerConn.block (true);
hsveqConn.block (true);
rgbcurvesConn.block (true);
gamcsconn.block (true);
gamcsconn.block (true);
color->set_inconsistent (false);
vibrance->set_active (color->get_active ());
chmixer->set_active (color->get_active ());
hsveq->set_active (color->get_active ());
rgbcurves->set_active (color->get_active ());
icm->set_active (color->get_active ());
vibranceConn.block (false);
hsveq->set_active (color->get_active ());
rgbcurves->set_active (color->get_active ());
icm->set_active (color->get_active ());
vibranceConn.block (false);
chmixerConn.block (false);
hsveqConn.block (false);
rgbcurvesConn.block (false);
gamcsconn.block (false);
gamcsconn.block (false);
}
void PartialPasteDlg::lensToggled () {
@ -537,7 +538,7 @@ void PartialPasteDlg::metaicmToggled () {
exifchConn.block (true);
iptcConn.block (true);
icmConn.block (true);
gamcsconn.block (true);
gamcsconn.block (true);
metaicm->set_inconsistent (false);
exifch->set_active (metaicm->get_active ());
@ -548,75 +549,99 @@ void PartialPasteDlg::metaicmToggled () {
exifchConn.block (false);
iptcConn.block (false);
icmConn.block (false);
gamcsconn.block (false);
gamcsconn.block (false);
}
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;
if (exposure->get_active ()) dst->toneCurve = src->toneCurve;
if (hlrec->get_active ()) dst->hlrecovery = src->hlrecovery;
if (sh->get_active ()) dst->sh = src->sh;
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;
ParamsEdited falsePE; // falsePE is a workaround to set a group of ParamsEdited to false
ParamsEdited filterPE; // Contains the initial information about the loaded values
if (srcPE) {
filterPE = *srcPE;
}
if (raw_ca_autocorrect->get_active ()) dst->raw.ca_autocorrect =src->raw.ca_autocorrect;
if (raw_cared->get_active ()) dst->raw.cared =src->raw.cared;
if (raw_cablue->get_active ()) dst->raw.cablue =src->raw.cablue;
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;
if (df_AutoSelect->get_active ()) dst->raw.df_autoselect = src->raw.df_autoselect;
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;
if (ff_BlurType->get_active ()) dst->raw.ff_BlurType = src->raw.ff_BlurType;
else {
// By default, everything has to be copied
filterPE.set(true);
}
// the general section is always ignored, whichever operation we use the PartialPaste for
filterPE.general = falsePE.general;
// Now we filter out the filter depending on the checked items
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

@ -26,7 +26,7 @@ class PartialPasteDlg : public Gtk::Dialog {
public:
Gtk::CheckButton* everything;
Gtk::CheckButton* everything;
// main groups:
Gtk::CheckButton* basic;
@ -42,24 +42,24 @@ class PartialPasteDlg : public Gtk::Dialog {
Gtk::CheckButton* exposure;
Gtk::CheckButton* hlrec;
Gtk::CheckButton* sh;
Gtk::CheckButton* epd;
Gtk::CheckButton* labcurve;
// options in detail:
Gtk::CheckButton* sharpen;
Gtk::CheckButton* sharpenedge;
Gtk::CheckButton* sharpenmicro;
Gtk::CheckButton* impden;
Gtk::CheckButton* waveq;
Gtk::CheckButton* dirpyrden;
Gtk::CheckButton* defringe;
Gtk::CheckButton* edgePreservingDecompositionUI;
Gtk::CheckButton* dirpyreq;
Gtk::CheckButton* impden;
//Gtk::CheckButton* waveq;
Gtk::CheckButton* dirpyrden;
Gtk::CheckButton* defringe;
Gtk::CheckButton* dirpyreq;
// options in color:
Gtk::CheckButton* vibrance;
Gtk::CheckButton* chmixer;
Gtk::CheckButton* hsveq;
Gtk::CheckButton* rgbcurves;
Gtk::CheckButton* hsveq;
Gtk::CheckButton* rgbcurves;
// Gtk::CheckButton* icm;
// options in lens:
@ -96,18 +96,18 @@ class PartialPasteDlg : public Gtk::Dialog {
Gtk::CheckButton* raw_dcb_iterations;
Gtk::CheckButton* raw_dcb_enhance;
Gtk::CheckButton* raw_all_enhance;
Gtk::CheckButton* df_file;
Gtk::CheckButton* df_AutoSelect;
Gtk::CheckButton* ff_file;
Gtk::CheckButton* ff_AutoSelect;
Gtk::CheckButton* ff_BlurRadius;
Gtk::CheckButton* ff_BlurType;
Gtk::CheckButton* df_AutoSelect;
Gtk::CheckButton* ff_file;
Gtk::CheckButton* ff_AutoSelect;
Gtk::CheckButton* ff_BlurRadius;
Gtk::CheckButton* ff_BlurType;
sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaicmConn, rawConn;;
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 distortionConn, cacorrConn, vignettingConn;
sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, perspectiveConn, commonTransConn;
@ -115,19 +115,19 @@ class PartialPasteDlg : public Gtk::Dialog {
sigc::connection df_fileConn, df_AutoSelectConn, ff_fileConn, ff_AutoSelectConn, ff_BlurRadiusConn, ff_BlurTypeConn;
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:
PartialPasteDlg ();
public:
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 basicToggled ();
void detailToggled ();
void colorToggled ();
void lensToggled ();
void compositionToggled ();
void metaicmToggled ();
void rawToggled ();
void everythingToggled ();
void basicToggled ();
void detailToggled ();
void colorToggled ();
void lensToggled ();
void compositionToggled ();
void metaicmToggled ();
void rawToggled ();
};
#endif

View File

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

View File

@ -29,7 +29,18 @@ using namespace rtengine::procparams;
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;
@ -40,25 +51,25 @@ ProfilePanel::ProfilePanel () {
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->add (*Gtk::manage (new RTImage ("gtk-open.png")));
copy = Gtk::manage (new Gtk::Button ());
copy->add (*Gtk::manage (new RTImage ("edit-copy.png")));
if (!readOnly) save = Gtk::manage (new Gtk::Button ());
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->add (*Gtk::manage (new RTImage ("edit-paste.png")));
hbox->pack_start (*profiles);
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 (*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) );
save->signal_clicked().connect( sigc::mem_fun(*this, &ProfilePanel::save_clicked) );
copy->signal_clicked().connect( sigc::mem_fun(*this, &ProfilePanel::copy_clicked) );
paste->signal_clicked().connect( sigc::mem_fun(*this, &ProfilePanel::paste_clicked) );
load->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &ProfilePanel::load_clicked) );
if (!readOnly) save->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &ProfilePanel::save_clicked) );
if (!readOnly) copy->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &ProfilePanel::copy_clicked) );
paste->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &ProfilePanel::paste_clicked) );
custom = NULL;
lastphoto = NULL;
@ -71,9 +82,9 @@ ProfilePanel::ProfilePanel () {
old = profiles->get_active_text();
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"));
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"));
show_all_children ();
@ -81,9 +92,9 @@ ProfilePanel::ProfilePanel () {
ProfilePanel::~ProfilePanel () {
delete custom;
delete lastsaved;
delete lastphoto;
if (custom) { custom->deleteInstance(); delete custom; }
if (lastsaved) { lastsaved->deleteInstance(); delete lastsaved; }
if (lastphoto) { lastphoto->deleteInstance(); delete lastphoto; }
}
void ProfilePanel::refreshProfileList () {
@ -98,7 +109,7 @@ void ProfilePanel::refreshProfileList () {
// re-parse profile directories (deletes old ones)
profileStore.parseProfiles ();
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]);
if (custom)
@ -112,10 +123,15 @@ void ProfilePanel::refreshProfileList () {
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);
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);
else
dialog.set_current_folder (argv0 + "/" + options.profilePath);
@ -140,54 +156,85 @@ void ProfilePanel::save_clicked () {
savedialog = &dialog;
int result = dialog.run();
bool done = false;
do {
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;
int dotpos = fname.find_last_of ('.');
if (dotpos==Glib::ustring::npos)
hasext = false;
int dirpos1 = fname.find_last_of ('/');
if (dirpos1!=Glib::ustring::npos && dirpos1>dotpos)
hasext = false;
int dirpos2 = fname.find_last_of ('\\');
if (dirpos2!=Glib::ustring::npos && dirpos2>dotpos)
hasext = false;
bool hasext = true;
int dotpos = fname.find_last_of ('.');
if (dotpos==Glib::ustring::npos)
hasext = false;
int dirpos1 = fname.find_last_of ('/');
if (dirpos1!=Glib::ustring::npos && dirpos1>dotpos)
hasext = false;
int dirpos2 = fname.find_last_of ('\\');
if (dirpos2!=Glib::ustring::npos && dirpos2>dotpos)
hasext = false;
if (!hasext)
fname = fname + paramFileExtension;
if (!hasext)
fname = fname + paramFileExtension;
if (safe_file_test (fname, Glib::FILE_TEST_EXISTS)) {
Glib::ustring msg_ = Glib::ustring("<b>") + fname + ": " + M("MAIN_MSG_ALREADYEXISTS") + "\n" + M("MAIN_MSG_QOVERWRITE") + "</b>";
Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_YES_NO, true);
int response = msgd.run ();
if (response==Gtk::RESPONSE_NO)
return;
if (safe_file_test (fname, Glib::FILE_TEST_EXISTS)) {
Glib::ustring msg_ = Glib::ustring("<b>") + fname + ": " + M("MAIN_MSG_ALREADYEXISTS") + "\n" + M("MAIN_MSG_QOVERWRITE") + "</b>";
Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_YES_NO, true);
int response = msgd.run ();
if (response==Gtk::RESPONSE_NO)
// make another try
continue;
}
PartialProfile* toSave = NULL;
if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")")
toSave = custom;
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")")
toSave = lastsaved;
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")")
toSave = lastphoto;
else
toSave = profileStore.getProfile (profiles->get_active_text());
if (toSave) {
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 ();
}
}
ProcParams* toSave = NULL;
if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")")
toSave = custom;
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")")
toSave = lastsaved;
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")")
toSave = lastphoto;
else
toSave = profileStore.getProfile (profiles->get_active_text());
if (toSave) {
toSave->save (fname);
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") + ")")
toSave = custom;
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")")
@ -196,15 +243,41 @@ void ProfilePanel::copy_clicked () {
toSave = lastphoto;
else
toSave = profileStore.getProfile (profiles->get_active_text());
if (toSave)
clipboard.setProcParams (*toSave);
// toSave has to be a complete procparams
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);
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);
else
dialog.set_current_folder (argv0 + "/" + options.profilePath);
@ -226,65 +299,100 @@ void ProfilePanel::load_clicked () {
dialog.add_filter(filter_any);
int result = dialog.run();
dialog.hide();
if (result==Gtk::RESPONSE_OK) {
if (!custom) {
custom = new ProcParams ();
profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
bool prevState = changeconn.block(true);
Glib::ustring fname = dialog.get_filename();
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;
}
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") + ")");
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"));
}
else if (customCreated) {
// we delete custom
custom->deleteInstance();
delete custom;
}
custom->load (dialog.get_filename());
profiles->set_active_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
old = profiles->get_active_text();
changeTo (custom, M("PROFILEPANEL_PFILE"));
}
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())
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) {
custom = new ProcParams ();
custom = new PartialProfile (true);
custom->pedited->set(true);
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") + ")");
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"));
return;
}
void ProfilePanel::changeTo (ProcParams* newpp, Glib::ustring profname) {
void ProfilePanel::changeTo (PartialProfile* newpp, Glib::ustring profname) {
if (!newpp)
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)
tpc->profileChange (newpp, EvProfileChanged, profname);
}
@ -300,7 +408,7 @@ void ProfilePanel::selection_changed () {
else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")")
changeTo (lastphoto, Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")");
else {
ProcParams* s = profileStore.getProfile (profiles->get_active_text());
PartialProfile* s = profileStore.getProfile (profiles->get_active_text());
if (s)
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) {
// 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)
return;
if (profiles->get_active_text() != Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")") {
dontupdate = true;
if (!custom) {
custom = new ProcParams ();
custom = new PartialProfile (true);
custom->set(true);
profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
}
*custom = *p;
profiles->set_active_text (Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")");
old = profiles->get_active_text();
}
else
*custom = *p;
*(custom->pparams) = *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) {
changeconn.block (true);
@ -336,18 +446,36 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS
pparams.clear ();
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]);
delete custom;
custom = NULL;
delete lastsaved;
lastsaved = lastSaved;
delete lastphoto;
lastphoto = lastPhoto;
if (custom) {
custom->deleteInstance();
delete custom; custom = NULL;
}
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;
ProcParams* defprofile = profileStore.getProfile (profname);
PartialProfile* defprofile = profileStore.getProfile (profname);
if (lastphoto)
profiles->append_text (Glib::ustring("(") + M("PROFILEPANEL_PLASTPHOTO") + ")");
@ -360,9 +488,9 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS
if (tpc) {
if (lastsaved)
tpc->setDefaults (lastsaved);
tpc->setDefaults (lastsaved->pparams);
else
tpc->setDefaults (profileStore.getProfile (profname));
tpc->setDefaults (profileStore.getProfile (profname)->pparams);
}
if (defprofile) {
old = defline;
@ -372,16 +500,26 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS
tpc->profileChange (defprofile, EvPhotoLoaded, defline);
}
else {
bool dels = false;
// select first valid profile
old = "";
profiles->set_active (0);
ProcParams* s = profileStore.getProfile (profiles->get_active_text());
if (!s)
s = new ProcParams ();
PartialProfile* s = profileStore.getProfile (profiles->get_active_text());
if (!s) {
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);
if (tpc)
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 "pparamschangelistener.h"
#include "profilechangelistener.h"
#include "partialpastedlg.h"
#include "guiutils.h"
class ProfilePanel : public Gtk::VBox, public PParamsChangeListener {
protected:
static PartialPasteDlg* partialProfileDlg;
Gtk::Button* save;
Gtk::Button* load;
Gtk::Button* copy;
Gtk::Button* paste;
MyComboBoxText* profiles;
std::vector<Glib::ustring> pparams;
rtengine::procparams::ProcParams* custom;
rtengine::procparams::ProcParams* lastsaved;
rtengine::procparams::ProcParams* lastphoto;
rtengine::procparams::PartialProfile* custom;
rtengine::procparams::PartialProfile* lastsaved;
rtengine::procparams::PartialProfile* lastphoto;
Glib::ustring old;
ProfileChangeListener* tpc;
bool dontupdate;
sigc::connection changeconn;
Gtk::FileChooserDialog* savedialog;
void changeTo (rtengine::procparams::ProcParams* newpp, Glib::ustring profname);
void changeTo (rtengine::procparams::PartialProfile* newpp, Glib::ustring profname);
void refreshProfileList ();
public:
ProfilePanel ();
ProfilePanel (bool readOnly=false);
virtual ~ProfilePanel ();
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);
// PParamsChangeListener interface
void procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited=NULL);
// gui callbacks
void save_clicked ();
void load_clicked ();
void copy_clicked ();
void paste_clicked ();
void save_clicked (GdkEventButton* event);
void load_clicked (GdkEventButton* event);
void copy_clicked (GdkEventButton* event);
void paste_clicked (GdkEventButton* event);
void selection_changed ();
};

View File

@ -28,12 +28,23 @@ using namespace rtengine::procparams;
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 () {
// 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;
pparams.clear ();
}
partProfiles.clear ();
if (options.multiUser) {
Glib::ustring userPD = options.rtdir + "/" + options.profilePath;
@ -68,16 +79,21 @@ void ProfileStore::parseDir (const Glib::ustring& pdir) {
if( options.rtSettings.verbose )
printf ("Processing file %s...\n", fname.c_str());
Glib::ustring name = sname.substr(0,lastdot);
if (pparams.find(name)!=pparams.end()) {
delete pparams[name];
pparams.erase (pparams.find(name));
std::map<Glib::ustring,PartialProfile*>::iterator j = partProfiles.find(name);
if (j!=partProfiles.end()) {
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> 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);
return ret;
}
rtengine::procparams::ProcParams* ProfileStore::getDefaultProcParams (bool isRaw) {
ProcParams* ProfileStore::getDefaultProcParams (bool isRaw) {
rtengine::procparams::ProcParams* pp = getProfile (isRaw ? options.defProfRaw : options.defProfImg);
if (!pp) {
pp = new ProcParams ();
pparams[isRaw ? options.defProfRaw : options.defProfImg] = pp;
}
return pp;
PartialProfile* pProf = getProfile (isRaw ? options.defProfRaw : options.defProfImg);
if (!pProf) {
Glib::ustring profName = isRaw ? options.defProfRaw : options.defProfImg;
pProf = new PartialProfile (true);
partProfiles[profName] = pProf;
}
return pProf->pparams;
}

View File

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

View File

@ -34,6 +34,7 @@ RTWindow::RTWindow ()
cacheMgr->init ();
WhiteBalance::init();
ProfilePanel::init();
Glib::ustring fName = "rt-logo.png";
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
WhiteBalance::cleanup();
ProfilePanel::cleanup();
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
}
// 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) {
// try to load the last saved parameters from the cache or from the paramfile file
ProcParams* ldprof = NULL;
@ -195,7 +198,7 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu
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();
}
@ -212,6 +215,14 @@ void Thumbnail::notifylisterners_procParamsChanged(int 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 () {
// TODO: Check for Linux
#ifdef WIN32
@ -219,17 +230,22 @@ void Thumbnail::loadProcParams () {
#endif
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) {
// try to load it from params file next to the image file
int ppres = pparams.load (fname + paramFileExtension);
pparamsValid = !ppres && pparams.ppVersion>=220;
// if no success, try to load the cached version of the procparams
if (!pparamsValid)
pparamsValid = !pparams.load (getCacheFileName ("profiles")+paramFileExtension);
pparamsValid = !pparams.load (getCacheFileName ("profiles")+paramFileExtension);
}
else {
// try to load it from cache
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) {
int ppres = pparams.load (fname + paramFileExtension);
pparamsValid = !ppres && pparams.ppVersion>=220;
@ -304,7 +320,7 @@ bool Thumbnail::hasProcParams () {
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
#ifdef WIN32
Glib::Mutex::Lock lock(mutex);
@ -318,7 +334,13 @@ void Thumbnail::setProcParams (const ProcParams& pp, int whoChangedIt, bool upda
int colorlabel = getColorLabel();
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;
needsReProcessing = true;

View File

@ -86,7 +86,7 @@ class Thumbnail {
// Use this to create params on demand for update
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 loadProcParams ();

View File

@ -85,7 +85,7 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(NULL) {
addPanel (detailsPanel, sharpenEdge, M("TP_SHARPENEDGE_LABEL")); toolPanels.push_back (sharpenEdge);
addPanel (detailsPanel, sharpenMicro, M("TP_SHARPENMICRO_LABEL")); toolPanels.push_back (sharpenMicro);
addPanel (colorPanel, hsvequalizer, M("TP_HSVEQUALIZER_LABEL")); toolPanels.push_back (hsvequalizer);
addPanel (colorPanel, rgbcurves, M("TP_RGBCURVES_LABEL")); toolPanels.push_back (rgbcurves);
addPanel (colorPanel, rgbcurves, M("TP_RGBCURVES_LABEL")); toolPanels.push_back (rgbcurves);
addPanel (exposurePanel, edgePreservingDecompositionUI, M("TP_EPD_LABEL")); toolPanels.push_back (edgePreservingDecompositionUI);
addPanel (exposurePanel, lcurve, M("TP_LABCURVE_LABEL")); toolPanels.push_back (lcurve);
addPanel (detailsPanel, impulsedenoise, M("TP_IMPULSEDENOISE_LABEL")); toolPanels.push_back (impulsedenoise);
@ -263,26 +263,40 @@ void ToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib::
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;
if (!ipc) return;
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
bool filterRawRefresh=false;
if (event!=rtengine::EvPhotoLoaded) {
ParamsEdited pe;
std::vector<rtengine::procparams::ProcParams> lParams(2);
lParams[0]=*params; lParams[1]=*nparams;
lParams[0]=*params; lParams[1]=*mergedParams;
pe.set(true);
pe.initFrom (lParams);
filterRawRefresh=pe.raw.isUnchanged();
}
*params = *nparams;
*params = *mergedParams;
delete mergedParams;
tr = TR_NONE;
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);
// 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);
// to support the GUI: