Solving issue 1894: "White balance adjustements" ; Warning: it is recommended to clear the "cache\data" folder
This commit is contained in:
parent
6ae0dd0166
commit
1a6619a035
BIN
rtdata/images/Dark/actions/wb-water.png
Normal file
BIN
rtdata/images/Dark/actions/wb-water.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 648 B |
BIN
rtdata/images/Light/actions/wb-water.png
Normal file
BIN
rtdata/images/Light/actions/wb-water.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 644 B |
@ -443,6 +443,7 @@ HISTORY_MSG_204;Niveau d'amélioration LMMSE
|
||||
HISTORY_MSG_205;CAM02 pixels chauds/morts
|
||||
HISTORY_MSG_206;CAT02 - Adapt. auto à la scène
|
||||
HISTORY_MSG_207;A.C. - Teinte
|
||||
HISTORY_MSG_208;Égaliseur Bleu/Rouge
|
||||
HISTORY_NEWSNAPSHOTAS;Sous...
|
||||
HISTORY_NEWSNAPSHOT;Ajouter
|
||||
HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: <b>Alt-s</b>
|
||||
@ -554,7 +555,7 @@ MAIN_TAB_DETAIL;Détail
|
||||
MAIN_TAB_DETAIL_TOOLTIP;<b>Alt-d</b>
|
||||
MAIN_TAB_DEVELOP; Développer
|
||||
MAIN_TAB_EXIF;EXIF
|
||||
MAIN_TAB_EXPORT; Exporter
|
||||
MAIN_TAB_EXPORT;Export Rapide
|
||||
MAIN_TAB_EXPOSURE;Exposition
|
||||
MAIN_TAB_EXPOSURE_TOOLTIP;<b>Alt-e</b>
|
||||
MAIN_TAB_FILTER; Filtrer
|
||||
@ -787,8 +788,8 @@ PREFERENCES_MULTITABDUALMON;Éditeurs multiple, si possible sur un second monite
|
||||
PREFERENCES_MULTITAB;Éditeurs multiple
|
||||
PREFERENCES_OUTDIRFOLDERHINT;Place les images traitées dans le dossier selectionné
|
||||
PREFERENCES_OUTDIRFOLDER;Dossier de sauvegarde
|
||||
PREFERENCES_OUTDIRHINT;<i>Vous pouvez utiliser les paramètres de chaîne formatées suivants:</i>\n<b>%f, %d1, %d2, ..., %p1, %p2, ...</b>\n<i>\nCes paramètres de chaînes formatées se réfèrent aux dossiers et sous-chemins du chemin du fichier RAW.\n\nPar exemple, si </i> <b>/home/tom/image/02-09-2006/dsc0012.nef</b><i>a été ouvert, la signification des paramètres est:\n</i><b>%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n</b><i>\nSi vous voulez enregistrer l'image de sortie là où se trouve l'originale, écrivez:\n</i><b>%p1/%f\n</b><i>\nSi vous voulez enregistrer l'image de sortie dans un dossier 'convertis' situé dans le dossier de l'originale, écrivez:\n</i><b>%p1/convertis/%f\n</b><i>\nSi vous voulez enregistrer l'image de sortie dans le dossier '/home/tom/convertis' en conservant le même sous-dossier de dates, écrivez:\n</i><b>%p2/convertis/%d1/%f</b>
|
||||
PREFERENCES_OUTDIRTEMPLATEHINT;<i>Vous pouvez utiliser les paramètres de chaîne formatées suivants:</i>\n<b>%f, %d1, %d2, ..., %p1, %p2, ...</b>\n<i>\nCes paramètres de chaînes formatées se réfèrent aux dossiers et sous-chemins du chemin du fichier RAW.\n\nPar exemple, si </i> <b>/home/tom/image/02-09-2006/dsc0012.nef</b><i>a été ouvert, la signification des paramètres est:\n</i><b>%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n</b><i>\nSi vous voulez enregistrer l'image de sortie là où se trouve l'originale, écrivez:\n</i><b>%p1/%f\n</b><i>\nSi vous voulez enregistrer l'image de sortie dans un dossier 'convertis' situé dans le dossier de l'originale, écrivez:\n</i><b>%p1/convertis/%f\n</b><i>\nSi vous voulez enregistrer l'image de sortie dans le dossier '/home/tom/convertis' en conservant le même sous-dossier de dates, écrivez:\n</i><b>%p2/convertis/%d1/%f</b>
|
||||
PREFERENCES_OUTDIRHINT;Vous pouvez utiliser les paramètres de chaîne formatées suivants:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>\n\nCes chaînes de formattage se réfèrent aux différentes parties du chemin de la photo ou certains de ses attributs.\n\nPar exemple, si la photo en cours de traitement a le chemin suivant:\n<b><i>/home/tom/image/02-09-2006/dsc0012.nef</i></b>\nla signification des chaînes de formattage est:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b> sera remplacé par le rang de la photo. Si la photo n'a pas de rang, %r sera remplacé par '0'. Si la photo est dans la corbeille de RawTherapee, %r sera remplacé par 'x'.\n\nSi vous voulez enregistrer l'image de sortie là où se trouve l'originale, écrivez:\n<b>%p1/%f</b>\n\nSi vous voulez enregistrer l'image de sortie dans un dossier nommé "<i>convertis</i>" situé dans le dossier de l'originale, écrivez:\n<b>%p1/convertis/%f</b>\n\nSi vous voulez enregistrer l'image de sortie dans un dossier nommé "<i>/home/tom/photos/convertis/2010-10-31</i>", écrivez:\n<b>%p2/convertis/%d1/%f</b>
|
||||
PREFERENCES_OUTDIRTEMPLATEHINT;Vous pouvez utiliser les paramètres de chaîne formatées suivants:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ..., <b>%r</b>, <b>%s1</b>, <b>%s2</b>, ...\n\nCes chaînes de formattage se réfèrent aux différentes parties du chemin de la photo, certains de ses attributs ou un numéro de séquence arbitraire dans le traitement par lot.\n\nPar exemple, si la photo en cours de traitement a le chemin suivant:\n<b><i>/home/tom/image/02-09-2006/dsc0012.nef</i></b>\nla signification des chaînes de formattage est:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b> sera remplacé par le rang de la photo. Si la photo n'a pas de rang, %r sera remplacé par '0'. Si la photo est dans la corbeille de RawTherapee, %r sera remplacé par 'x'.\n\n<b>%s1</b>, <b>%s2</b>, etc. sera remplacé par un index de séquence constitué de 1 à 9 chiffre. L'index de la séquence commencera à 1 à chaque fois que le file de traitement est démarrée, et est incrémenté de 1 pour chaque image traitée.\n\nSi vous voulez enregistrer l'image de sortie là où se trouve l'originale, écrivez:\n<b>%p1/%f</b>\n\nSi vous voulez enregistrer l'image de sortie dans un dossier nommé "<i>convertis</i>" situé dans le dossier de l'originale, écrivez:\n<b>%p1/convertis/%f</b>\n\nSi vous voulez enregistrer l'image de sortie dans un dossier nommé "<i>/home/tom/photos/convertis/2010-10-31</i>", écrivez:\n<b>%p2/convertis/%d1/%f</b>
|
||||
PREFERENCES_OUTDIRTEMPLATE;Utiliser le modèle
|
||||
PREFERENCES_OUTDIR;Dossier de sortie
|
||||
PREFERENCES_OVERLAY_FILENAMES;Superposer les noms de fichier sur les vignettes
|
||||
@ -979,11 +980,11 @@ TP_COLORAPP_GAMUT_TOOLTIP;Permet le controle du gamut en mode Lab
|
||||
TP_COLORAPP_HUE;Teinte (h)
|
||||
TP_COLORAPP_HUE_TOOLTIP;Teinte (h) - angle entre 0° et 360°
|
||||
TP_COLORAPP_LABEL;Apparence de la Couleur (CIECAM02)
|
||||
TP_COLORAPP_LABEL_CAM02;Édition de l'image avec CIECAM
|
||||
TP_COLORAPP_LABEL_CAM02;Édition de l'image avec CIE-CAM 2002
|
||||
TP_COLORAPP_LABEL_SCENE;Conditions de la scène
|
||||
TP_COLORAPP_LABEL_VIEWING;Conditions de visionnage
|
||||
TP_COLORAPP_LIGHT;Luminosité (J)
|
||||
TP_COLORAPP_LIGHT_TOOLTIP;Luminosité dans CIECAM02 est différent de Lab et RVB
|
||||
TP_COLORAPP_LIGHT_TOOLTIP;Luminosité dans CIECAM02 est différent de celui de Lab et RVB
|
||||
TP_COLORAPP_MODEL;Modèle de Point Blanc
|
||||
TP_COLORAPP_MODEL_TOOLTIP;<b>BB [RT] + [sortie]:</b>\nLa BB de RT est utilisée pour la scène, CIECAM est réglé sur D50, le blanc du périphérique de sortie utilise la valeur réglée dans Préférences\n\n<b>BB [RT+CAT02] + [sortie]:</b>\nLes réglages de BB de RT sont utilisés par CAT02 et le blanc du périphérique de sortie utilise la valeur réglée dans Préférences
|
||||
TP_COLORAPP_RSTPRO;Protection des tons chairs et rouges
|
||||
@ -1006,8 +1007,8 @@ TP_COLORAPP_TCMODE_LABEL2;Courbe mode 2
|
||||
TP_COLORAPP_TCMODE_LABEL3;Courbe chroma mode
|
||||
TP_COLORAPP_TCMODE_LIGHTNESS;Luminosité
|
||||
TP_COLORAPP_TCMODE_SATUR;Saturation
|
||||
TP_COLORAPP_TONECIE;Compression tonale avec brillance Q CIECAM
|
||||
TP_COLORAPP_TONECIE_TOOLTIP;Si vous choisissez cette option, tous les réglages "compression tonale" (si activé) seront utilisés par CIECAM
|
||||
TP_COLORAPP_TONECIE;Compression Tonale utilisant la Brillance CIECAM02 (Q)
|
||||
TP_COLORAPP_TONECIE_TOOLTIP;Si cette option est désactivée, la compression tonale est faite dans l'espace Lab.\nSi cette options est activée, la compression tonale est faite en utilisant CIECAM02.\nL'outil Compression Tonale doit être activé pour que ce réglage prenne effet
|
||||
TP_COLORAPP_WBCAM;BB [RT+CAT02] + [sortie]
|
||||
TP_COLORAPP_WBRT;BB [RT] + [sortie]
|
||||
TP_CROP_FIXRATIO;Ratio fixe:
|
||||
@ -1317,10 +1318,14 @@ TP_VIGNETTING_LABEL;Correction vignettage
|
||||
TP_VIGNETTING_RADIUS;Rayon
|
||||
TP_VIGNETTING_STRENGTH;Force
|
||||
TP_WBALANCE_AUTO;Auto
|
||||
TP_WBALANCE_EQBLUERED;Égaliseur Bleu/Rouge
|
||||
TP_WBALANCE_EQBLUERED_TOOLTIP;Permet de dévier du comportement normal de la "balance des blancs" en modulant la balance bleu/rouge.\nCeci peut être utile lorsque les conditions de prise de vue:\na) sont loins de l'illuminant strandard (ex: sous-marin)\nb) sont loins des conditions où a été réalisé le calibrage\nc) où les matrices ou les profiles ICC sont incorrect
|
||||
TP_WBALANCE_CAMERA;Appareil photo
|
||||
TP_WBALANCE_CLOUDY;Nuageux
|
||||
TP_WBALANCE_CUSTOM;Personnalisé
|
||||
TP_WBALANCE_DAYLIGHT;Lumière du jour (ensoleillé)
|
||||
TP_WBALANCE_WATER1;Sous-marin 1
|
||||
TP_WBALANCE_WATER2;Sous-marin 2
|
||||
TP_WBALANCE_FLASH55;Leica
|
||||
TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus
|
||||
TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta
|
||||
@ -1338,6 +1343,7 @@ TP_WBALANCE_FLUO10;F10 - Philips TL85
|
||||
TP_WBALANCE_FLUO11;F11 - Philips TL84
|
||||
TP_WBALANCE_FLUO12;F12 - Philips TL83
|
||||
TP_WBALANCE_FLUO_HEADER;Fluorescent
|
||||
TP_WBALANCE_WATER_HEADER;Sous-marin
|
||||
TP_WBALANCE_GREEN;Teinte
|
||||
TP_WBALANCE_GTI;GTI
|
||||
TP_WBALANCE_HMI;HMI
|
||||
|
@ -442,6 +442,7 @@ HISTORY_MSG_204;LMMSE Enhancement Steps
|
||||
HISTORY_MSG_205;CAM02 hot/bad pixels
|
||||
HISTORY_MSG_206;CAT02 - Adapt scene auto
|
||||
HISTORY_MSG_207;Defringing Hue curve
|
||||
HISTORY_MSG_208;Blue/Red Equalizer
|
||||
HISTORY_NEWSNAPSHOTAS;As...
|
||||
HISTORY_NEWSNAPSHOT;Add
|
||||
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: <b>Alt-s</b>
|
||||
@ -1297,10 +1298,14 @@ TP_VIGNETTING_LABEL;Vignetting Correction
|
||||
TP_VIGNETTING_RADIUS;Radius
|
||||
TP_VIGNETTING_STRENGTH;Strength
|
||||
TP_WBALANCE_AUTO;Auto
|
||||
TP_WBALANCE_EQBLUERED;Blue/Red Equalizer
|
||||
TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater)\nb) are far from conditions where calibrations were performed\nc) where the matrices or ICC profiles are unsuitable
|
||||
TP_WBALANCE_CAMERA;Camera
|
||||
TP_WBALANCE_CLOUDY;Cloudy
|
||||
TP_WBALANCE_CUSTOM;Custom
|
||||
TP_WBALANCE_DAYLIGHT;Daylight (sunny)
|
||||
TP_WBALANCE_WATER1;UnderWater 1
|
||||
TP_WBALANCE_WATER2;UnderWater 2
|
||||
TP_WBALANCE_FLASH55;Leica
|
||||
TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus
|
||||
TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta
|
||||
@ -1318,6 +1323,7 @@ TP_WBALANCE_FLUO10;F10 - Philips TL85
|
||||
TP_WBALANCE_FLUO11;F11 - Philips TL84
|
||||
TP_WBALANCE_FLUO12;F12 - Philips TL83
|
||||
TP_WBALANCE_FLUO_HEADER;Fluorescent
|
||||
TP_WBALANCE_WATER_HEADER;UnderWater
|
||||
TP_WBALANCE_GREEN;Tint
|
||||
TP_WBALANCE_GTI;GTI
|
||||
TP_WBALANCE_HMI;HMI
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5325
|
||||
Green=1.162
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=true
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5325
|
||||
Green=1.162
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=true
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5388
|
||||
Green=1.101
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=true
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=7922
|
||||
Green=1.159
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=true
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=7922
|
||||
Green=1.159
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Version]
|
||||
AppVersion=4.0.11.0
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=true
|
||||
@ -80,6 +80,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=5745
|
||||
Green=1.0
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
[Version]
|
||||
AppVersion=4.0.11
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -81,6 +81,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=4500
|
||||
Green=1.073
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=true
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
[Version]
|
||||
AppVersion=4.0.11
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -81,6 +81,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=4500
|
||||
Green=1.073
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=true
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
[Version]
|
||||
AppVersion=4.0.11
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -81,6 +81,7 @@ Uniformity=50
|
||||
Setting=Camera
|
||||
Temperature=4500
|
||||
Green=1.073
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=true
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
[Version]
|
||||
AppVersion=4.0.11
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -80,7 +80,8 @@ Uniformity=50
|
||||
[White Balance]
|
||||
Setting=Camera
|
||||
Temperature=5699
|
||||
Green=1.0329999999999999
|
||||
Green=1.033
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=true
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
[Version]
|
||||
AppVersion=4.0.11
|
||||
Version=308
|
||||
AppVersion=4.0.11.20
|
||||
Version=309
|
||||
|
||||
[Exposure]
|
||||
Auto=false
|
||||
@ -80,7 +80,8 @@ Uniformity=50
|
||||
[White Balance]
|
||||
Setting=Camera
|
||||
Temperature=4670
|
||||
Green=1.1000000000000001
|
||||
Green=1.1
|
||||
Equal=1.0
|
||||
|
||||
[Color appearance]
|
||||
Enabled=false
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include <stdlib.h>
|
||||
#include "mytime.h"
|
||||
#include "sleef.c"
|
||||
#include "../rtgui/options.h"
|
||||
|
||||
#undef CLIPD
|
||||
#define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0)
|
||||
#define CLIPQQ(a) ((a)>0?((a)<250?(a):250):0)
|
||||
@ -34,7 +36,7 @@
|
||||
namespace rtengine {
|
||||
using namespace procparams;
|
||||
|
||||
extern const Settings* settings;
|
||||
extern const Settings* settings;
|
||||
|
||||
static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis observer 2°
|
||||
{0.0000000,0.000000,0.000000}, {0.0000000,0.000000,0.000000}, {0.0001299,0.0003917,0.0006061},
|
||||
@ -72,9 +74,9 @@ extern const Settings* settings;
|
||||
{0.000001251141,0.00000045181,0.000000}
|
||||
};
|
||||
|
||||
ColorTemp::ColorTemp (double t, double g, Glib::ustring m) : temp(t), green(g), method(m) {
|
||||
ColorTemp::ColorTemp (double t, double g, double e, Glib::ustring m) : temp(t), green(g), equal(e), method(m) {
|
||||
|
||||
clip (temp, green);
|
||||
clip (temp, green, equal);
|
||||
}
|
||||
|
||||
void ColorTemp::clip (double &temp, double &green) {
|
||||
@ -90,19 +92,37 @@ void ColorTemp::clip (double &temp, double &green) {
|
||||
green = MAXGREEN;
|
||||
}
|
||||
|
||||
ColorTemp::ColorTemp (double mulr, double mulg, double mulb) {
|
||||
method = "Custom";
|
||||
mul2temp (mulr, mulg, mulb, temp, green);
|
||||
void ColorTemp::clip (double &temp, double &green, double &equal) {
|
||||
|
||||
if (temp < MINTEMP)
|
||||
temp = MINTEMP;
|
||||
else if (temp > MAXTEMP)
|
||||
temp = MAXTEMP;
|
||||
|
||||
if (green < MINGREEN)
|
||||
green = MINGREEN;
|
||||
else if (green > MAXGREEN)
|
||||
green = MAXGREEN;
|
||||
|
||||
if(equal < MINEQUAL)
|
||||
equal = MINEQUAL;
|
||||
else if(equal > MAXEQUAL)
|
||||
equal = MAXEQUAL;
|
||||
}
|
||||
|
||||
void ColorTemp::mul2temp (double rmul, double gmul, double bmul, double& temp, double& green) {
|
||||
ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e) {
|
||||
method = "Custom";
|
||||
mul2temp (mulr, mulg, mulb, equal, temp, green);
|
||||
}
|
||||
|
||||
double maxtemp=(double)MAXTEMP, mintemp=(double)MINTEMP;
|
||||
void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) {
|
||||
|
||||
double maxtemp=double(MAXTEMP), mintemp=double(MINTEMP);
|
||||
double tmpr, tmpg, tmpb;
|
||||
temp=(maxtemp+mintemp)/2;
|
||||
|
||||
while (maxtemp-mintemp>1) {
|
||||
temp2mul (temp, 1.0, tmpr, tmpg, tmpb);
|
||||
temp2mul (temp, 1.0, equal, tmpr, tmpg, tmpb);
|
||||
if (tmpb/tmpr > bmul/rmul)
|
||||
maxtemp = temp;
|
||||
else
|
||||
@ -114,7 +134,7 @@ void ColorTemp::mul2temp (double rmul, double gmul, double bmul, double& temp, d
|
||||
}
|
||||
|
||||
|
||||
// spectral data for Daylight direct Sun: I have choose 5300K beacuse Nikon=5200K, Olympus=5300K, Panasonic=5500K, Leica=5400K, Minolta=5100K
|
||||
// spectral data for Daylight direct Sun: I have choose 5300K because Nikon=5200K, Olympus=5300K, Panasonic=5500K, Leica=5400K, Minolta=5100K
|
||||
const double ColorTemp::Daylight5300_spect[97] = {
|
||||
24.82,26.27,27.72,28.97,30.22,29.71,29.19,31.95,34.71,45.49,56.26,59.97,63.68,65.30,66.92,65.39,63.86,72.59,81.32,87.53,93.73,95.15,96.56,96.55,96.54,98.13,99.73,97.70,95.66,97.19,98.72,
|
||||
98.90,99.08,98.98,98.87,101.13,103.39,102.48,101.57,102.14,102.71,101.36,100.00,98.71,97.42,97.81,98.21,95.20,92.20,93.92,95.63,96.15,96.67,96.34,96.01,94.21,92.41,93.58,94.74,93.05,91.36,92.29,
|
||||
@ -122,7 +142,7 @@ const double ColorTemp::Daylight5300_spect[97] = {
|
||||
63.88,67.13,68.85,70.57
|
||||
};
|
||||
|
||||
//spectral data for Daylight Cloudy: I have choose 6200K beacuse Nikon=6000K, Olympus=6000K, Panasonic=6200K, Leica=6400K, Minolta=6500K
|
||||
//spectral data for Daylight Cloudy: I have choose 6200K because Nikon=6000K, Olympus=6000K, Panasonic=6200K, Leica=6400K, Minolta=6500K
|
||||
const double ColorTemp::Cloudy6200_spect[97] = {
|
||||
39.50,40.57,41.63,43.85,46.08,45.38,44.69,47.20,49.71,63.06,76.41,80.59,84.77,85.91,87.05,84.14,81.23,90.29,99.35,105.47,111.58,112.23,112.87,111.74,110.62,111.41,112.20,108.98,105.76,106.32,
|
||||
106.89,106.34,105.79,104.62,103.45,105.09,106.72,105.24,103.76,103.75,103.75,101.87,100.00,98.29,96.58,96.46,96.34,92.85,89.37,90.25,91.12,91.06,90.99,90.17,89.35,87.22,85.10,85.48,85.85,
|
||||
@ -130,7 +150,7 @@ const double ColorTemp::Cloudy6200_spect[97] = {
|
||||
53.63,56.47,59.31,60.80,62.29
|
||||
};
|
||||
|
||||
//spectral data for Daylight Shade: I have choose 7600K beacuse Nikon=8000K, Olympus=7500K, Panasonic=7500K, Leica=7500K, Minolta=7500K
|
||||
//spectral data for Daylight Shade: I have choose 7600K because Nikon=8000K, Olympus=7500K, Panasonic=7500K, Leica=7500K, Minolta=7500K
|
||||
const double ColorTemp::Shade7600_spect[97] = {
|
||||
64.42,64.46,64.51,68.35,72.20,70.22,68.24,69.79,71.35,87.49,103.64,108.68,113.72,114.12,114.53,109.54,104.55,113.59,122.63,128.52,134.41,134.02,133.63,131.02,128.41,128.08,127.75,123.16,
|
||||
118.57,117.89,117.22,115.72,114.22,111.60,108.99,109.84,110.68,108.57,106.45,105.71,104.98,102.49,100.00,97.78,95.55,94.82,94.08,90.47,86.87,86.94,87.01,86.45,85.88,84.57,83.27,80.83,78.40,78.21,
|
||||
@ -1229,8 +1249,10 @@ void ColorTemp::temp2mulxyz (double tem, double gree, Glib::ustring method ,doub
|
||||
double m1, m2;
|
||||
if (tem<=7000)
|
||||
x_D = -4.6070e9/(tem*tem*tem) + 2.9678e6/(tem*tem) + 0.09911e3/tem + 0.244063;
|
||||
else
|
||||
else if (tem <=25000)
|
||||
x_D = -2.0064e9/(tem*tem*tem) + 1.9018e6/(tem*tem) + 0.24748e3/tem + 0.237040;
|
||||
else if (tem >25000)
|
||||
x_D = -2.0064e9/(tem*tem*tem) + 1.9018e6/(tem*tem) + 0.24748e3/tem + 0.237040 - ((tem-25000)/25000)*0.025;//Jacques empirical adjustemnt for very high temp (underwater !)
|
||||
|
||||
y_D = -3.0*x_D*x_D + 2.87*x_D - 0.275;
|
||||
//calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D
|
||||
@ -1253,9 +1275,12 @@ void ColorTemp::temp2mulxyz (double tem, double gree, Glib::ustring method ,doub
|
||||
//printf("Xxyz=%f Zxyz=%f\n",Xxyz,Zxyz);
|
||||
}
|
||||
|
||||
void ColorTemp::temp2mul (double temp, double green, double& rmul, double& gmul, double& bmul) {
|
||||
void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) {
|
||||
|
||||
clip (temp, green, equal);
|
||||
|
||||
//printf("temp=%d green=%.3f equal=%.3f\n", (int)temp, (float) green, (float) equal);
|
||||
|
||||
clip (temp, green);
|
||||
//variables for CRI and display Lab, and palette
|
||||
bool CRI_type=false;
|
||||
double xD, yD, x_D, y_D, interm;
|
||||
@ -1281,10 +1306,6 @@ void ColorTemp::temp2mul (double temp, double green, double& rmul, double& gmul,
|
||||
double Lbb[50],abb[50],bbb[50];
|
||||
double Lpal[50],apal[50],bpal[50];
|
||||
|
||||
float DeltaE[50], DeltaEs[8];
|
||||
float quadCRI=0.0f,quadCRIs=0.0f;
|
||||
float CRI_RT=0.0, CRI[50];
|
||||
float CRI_RTs=0.0, CRIs[8];
|
||||
int palet=-1;
|
||||
bool palette=true;
|
||||
// double tempalet; // correlated temperature
|
||||
@ -1330,10 +1351,12 @@ void ColorTemp::temp2mul (double temp, double green, double& rmul, double& gmul,
|
||||
palet=29;
|
||||
if (temp<=7000)
|
||||
x_D = -4.6070e9/(temp*temp*temp) + 2.9678e6/(temp*temp) + 0.09911e3/temp + 0.244063;
|
||||
else
|
||||
else if (temp <=25000)
|
||||
x_D = -2.0064e9/(temp*temp*temp) + 1.9018e6/(temp*temp) + 0.24748e3/temp + 0.237040;
|
||||
else if (temp >25000) // above 25000 it's unknown..then I have modified to adjust for underwater
|
||||
x_D = -2.0064e9/(temp*temp*temp) + 1.9018e6/(temp*temp) + 0.24748e3/temp + 0.237040 - ((temp-25000)/25000)*0.025;//Jacques empirical adjustemnt for very high temp (underwater !)
|
||||
|
||||
y_D = -3.0*x_D*x_D + 2.87*x_D - 0.275;
|
||||
y_D = (-3.0*x_D*x_D + 2.87*x_D - 0.275);//modify blue / red action
|
||||
//calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D
|
||||
//S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda)
|
||||
interm=(0.0241+0.2562*x_D-0.734*y_D);
|
||||
@ -1345,6 +1368,11 @@ void ColorTemp::temp2mul (double temp, double green, double& rmul, double& gmul,
|
||||
}
|
||||
|
||||
xD=x; yD=y;
|
||||
float adj=1.f;
|
||||
if(equal < 0.9999 || equal > 1.0001 ){
|
||||
adj=(100.f+( 1000.f-(1000.f*(float)equal) )/20.f)/100.f;
|
||||
}
|
||||
//printf("adj=%f\n",adj);
|
||||
double Xwb = xD/yD;
|
||||
double Ywb = 1.0;
|
||||
double Zwb = (1.0-xD-yD)/yD;
|
||||
@ -1365,12 +1393,12 @@ void ColorTemp::temp2mul (double temp, double green, double& rmul, double& gmul,
|
||||
bmul = sRGB_xyz[2][0]*X + sRGB_xyz[2][1]*Y + sRGB_xyz[2][2]*Z;
|
||||
} else {*/
|
||||
//recalculate channels multipliers with new values of XYZ tue to whitebalance
|
||||
rmul = sRGBd65_xyz[0][0]*Xwb + sRGBd65_xyz[0][1]*Ywb + sRGBd65_xyz[0][2]*Zwb;
|
||||
rmul = sRGBd65_xyz[0][0]*Xwb*adj + sRGBd65_xyz[0][1]*Ywb + sRGBd65_xyz[0][2]*Zwb/adj; // Jacques' empirical modification 5/2013
|
||||
gmul = sRGBd65_xyz[1][0]*Xwb + sRGBd65_xyz[1][1]*Ywb + sRGBd65_xyz[1][2]*Zwb;
|
||||
bmul = sRGBd65_xyz[2][0]*Xwb + sRGBd65_xyz[2][1]*Ywb + sRGBd65_xyz[2][2]*Zwb;
|
||||
bmul = sRGBd65_xyz[2][0]*Xwb*adj + sRGBd65_xyz[2][1]*Ywb + sRGBd65_xyz[2][2]*Zwb/adj;
|
||||
//};
|
||||
gmul /= green;
|
||||
|
||||
//printf("rmul=%f gmul=%f bmul=%f\n",rmul, gmul, bmul);
|
||||
double max = rmul;
|
||||
if (gmul>max) max = gmul;
|
||||
if (bmul>max) max = bmul;
|
||||
@ -1526,6 +1554,11 @@ void ColorTemp::temp2mul (double temp, double green, double& rmul, double& gmul,
|
||||
else {CRI_type=false;}
|
||||
|
||||
if (CRI_type) {
|
||||
float DeltaE[50], DeltaEs[8];
|
||||
float quadCRI=0.0f,quadCRIs=0.0f;
|
||||
float CRI_RT=0.0, CRI[50];
|
||||
float CRI_RTs=0.0, CRIs[8];
|
||||
|
||||
for(int i=0;i<N_c;i++) {
|
||||
spectrum_to_color_xyz_preset(spec_color[i],spect_illum[illum+3], xx,yy,zz);
|
||||
XchkLamp[i]=xx;YchkLamp[i]=yy;ZchkLamp[i]=zz;
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
#ifndef _COLORTEMP_
|
||||
#define _COLORTEMP_
|
||||
#include "procparams.h"
|
||||
|
||||
#include <gtkmm.h>
|
||||
#include <cmath>
|
||||
@ -28,35 +29,47 @@
|
||||
|
||||
|
||||
namespace rtengine {
|
||||
using namespace procparams;
|
||||
|
||||
#define MINTEMP 2000
|
||||
#define MAXTEMP 25000
|
||||
|
||||
#define MINTEMP 1500
|
||||
#define MAXTEMP 60000
|
||||
#define MINGREEN 0.02
|
||||
#define MAXGREEN 5.0
|
||||
#define MINEQUAL 0.8
|
||||
#define MAXEQUAL 1.5
|
||||
|
||||
#define INITIALBLACKBODY 4000
|
||||
|
||||
|
||||
class ColorTemp {
|
||||
|
||||
private:
|
||||
double temp;
|
||||
double green;
|
||||
double equal;
|
||||
Glib::ustring method;
|
||||
|
||||
static void clip (double &temp, double &green);
|
||||
static void clip (double &temp, double &green, double &equal);
|
||||
|
||||
public:
|
||||
|
||||
ColorTemp () : temp(-1), green(-1), method("Custom") {}
|
||||
ColorTemp (double t, double g, Glib::ustring m);
|
||||
ColorTemp (double mulr, double mulg, double mulb);
|
||||
ColorTemp () : temp(-1.), green(-1.), equal (1.), method("Custom") {}
|
||||
ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {}
|
||||
ColorTemp (double t, double g, double e, Glib::ustring m);
|
||||
ColorTemp (double mulr, double mulg, double mulb, double e);
|
||||
|
||||
void update (const double rmul, const double gmul, const double bmul, const double equal) { this->equal = equal; mul2temp (rmul, gmul, bmul, this->equal, temp, green); }
|
||||
void useDefaults (const double equal) { temp = 6504; green = 1.0; this->equal = equal; } // Values copied from procparams.cc
|
||||
|
||||
inline double getTemp () { return temp; }
|
||||
inline double getGreen () { return green; }
|
||||
inline double getEqual () { return equal; }
|
||||
|
||||
void getMultipliers (double &mulr, double &mulg, double &mulb) { temp2mul (temp, green, mulr, mulg, mulb); }
|
||||
void getMultipliers (double &mulr, double &mulg, double &mulb) { temp2mul (temp, green, equal, mulr, mulg, mulb); }
|
||||
|
||||
void mul2temp (double rmul, double gmul, double bmul, double& temp, double& green);
|
||||
void temp2mul (double temp, double green, double& rmul, double& gmul, double& bmul);
|
||||
void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green);
|
||||
void temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul);
|
||||
static void temp2mulxyz (double tem, double gree, Glib::ustring method, double &Xxyz, double &Zxyz);
|
||||
|
||||
int XYZtoCorColorTemp(double x0,double y0 ,double z0, double &temp);
|
||||
|
@ -6880,7 +6880,8 @@ void CLASS adobe_coeff (const char *make, const char *model)
|
||||
{ "Panasonic DMC-GH1", 15, 0xf92, /* RT - Colin Walker */
|
||||
{ 6360,-1557,-375,-4201,11504,3086,-1378,2518,5843 } },
|
||||
{ "Panasonic DMC-GH2", 15, 0xf95, /* RT - Colin Walker */
|
||||
{ 6855,-1765,-456,-4223,11600,2996,-1450,2602,5761 } },
|
||||
// { 6855,-1765,-456,-4223,11600,2996,-1450,2602,5761 } },
|
||||
{ 7780,-2410,-806,-3913,11724,2484,-1018,2390,5298 } },
|
||||
{ "Panasonic DMC-GH3", 144, 0,
|
||||
{ 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 } },
|
||||
{ "Panasonic DMC-GX1", 143, 0,
|
||||
|
@ -1066,8 +1066,6 @@
|
||||
- { 7780,-2410,-806,-3913,11724,2484,-1018,2390,5298 } },
|
||||
+ { "Panasonic DMC-GH1", 15, 0xf92, /* RT - Colin Walker */
|
||||
+ { 6360,-1557,-375,-4201,11504,3086,-1378,2518,5843 } },
|
||||
+ { "Panasonic DMC-GH2", 15, 0xf95, /* RT - Colin Walker */
|
||||
+ { 6855,-1765,-456,-4223,11600,2996,-1450,2602,5761 } },
|
||||
{ "Panasonic DMC-GH3", 144, 0,
|
||||
{ 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 } },
|
||||
{ "Panasonic DMC-GX1", 143, 0,
|
||||
|
@ -84,7 +84,7 @@ namespace rtengine {
|
||||
virtual void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn,
|
||||
std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue,
|
||||
int tran) {}
|
||||
virtual ColorTemp getAutoWB () { return ColorTemp(); }
|
||||
virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) { rm=1.0; bm=1.0; gm=1.0; }
|
||||
virtual const char* getType () const { return "unknown"; }
|
||||
|
||||
};
|
||||
@ -476,7 +476,7 @@ namespace rtengine {
|
||||
}
|
||||
}
|
||||
|
||||
ColorTemp getAutoWB () {
|
||||
void getAutoWBMultipliers (double &rm, double &gm, double &bm) {
|
||||
|
||||
double avg_r = 0.;
|
||||
double avg_g = 0.;
|
||||
@ -500,8 +500,9 @@ namespace rtengine {
|
||||
avg_b += intpow( (double)b(i, j), p);*/
|
||||
n++;
|
||||
}
|
||||
return ColorTemp (avg_r/double(n), avg_g/double(n), avg_b/double(n));
|
||||
//return ColorTemp (pow(avg_r/n, 1.0/p), pow(avg_g/n, 1.0/p), pow(avg_b/n, 1.0/p));
|
||||
rm = avg_r/double(n);
|
||||
gm = avg_g/double(n);
|
||||
bm = avg_b/double(n);
|
||||
}
|
||||
|
||||
void transformPixel (int x, int y, int tran, int& tx, int& ty) {
|
||||
@ -905,7 +906,7 @@ namespace rtengine {
|
||||
}
|
||||
}
|
||||
|
||||
ColorTemp getAutoWB () {
|
||||
void getAutoWBMultipliers (double &rm, double &gm, double &bm) {
|
||||
|
||||
double avg_r = 0.;
|
||||
double avg_g = 0.;
|
||||
@ -929,8 +930,9 @@ namespace rtengine {
|
||||
avg_b += intpow( (double)b(i, j), p);*/
|
||||
n++;
|
||||
}
|
||||
return ColorTemp (avg_r/double(n), avg_g/double(n), avg_b/double(n));
|
||||
//return ColorTemp (pow(avg_r/n, 1.0/p), pow(avg_g/n, 1.0/p), pow(avg_b/n, 1.0/p));
|
||||
rm = avg_r/double(n);
|
||||
gm = avg_g/double(n);
|
||||
bm = avg_b/double(n);
|
||||
}
|
||||
|
||||
void transformPixel (int x, int y, int tran, int& tx, int& ty) {
|
||||
|
@ -50,6 +50,7 @@ class ImageSource : public InitialImage {
|
||||
int references;
|
||||
|
||||
protected:
|
||||
double redAWBMul, greenAWBMul, blueAWBMul; // local copy of the multipliers, to avoid recomputing the values
|
||||
cmsHPROFILE embProfile;
|
||||
Glib::ustring fileName;
|
||||
ImageData* idata;
|
||||
@ -57,7 +58,8 @@ class ImageSource : public InitialImage {
|
||||
double dirpyrdenoiseExpComp;
|
||||
|
||||
public:
|
||||
ImageSource () : references (1), embProfile(NULL), idata(NULL), dirpyrdenoiseExpComp(INFINITY) {}
|
||||
ImageSource () : references (1), redAWBMul(-1.), greenAWBMul(-1.), blueAWBMul(-1.),
|
||||
embProfile(NULL), idata(NULL), dirpyrdenoiseExpComp(INFINITY) {}
|
||||
|
||||
virtual ~ImageSource () {}
|
||||
virtual int load (Glib::ustring fname, bool batch = false) =0;
|
||||
@ -75,10 +77,10 @@ class ImageSource : public InitialImage {
|
||||
// true is ready to provide the AutoWB, i.e. when the image has been demosaiced for RawImageSource
|
||||
virtual bool isWBProviderReady () =0;
|
||||
|
||||
virtual void convertColorSpace(Imagefloat* image, ColorManagementParams cmp, RAWParams raw) =0;// DIRTY HACK: this method is derived in rawimagesource and strimagesource, but (...,RAWParams raw) will be used ONLY for raw images
|
||||
virtual void convertColorSpace (Imagefloat* image, ColorManagementParams cmp, RAWParams raw) =0;// DIRTY HACK: this method is derived in rawimagesource and strimagesource, but (...,RAWParams raw) will be used ONLY for raw images
|
||||
virtual void getAutoWBMultipliers (double &rm, double &bm, double &gm) =0;
|
||||
virtual ColorTemp getWB () =0;
|
||||
virtual ColorTemp getAutoWB () =0;
|
||||
virtual ColorTemp getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran) =0;
|
||||
virtual ColorTemp getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran, double equal) =0;
|
||||
|
||||
virtual double getDefGain () { return 1.0; }
|
||||
|
||||
|
@ -29,7 +29,7 @@ namespace rtengine {
|
||||
extern const Settings* settings;
|
||||
|
||||
ImProcCoordinator::ImProcCoordinator ()
|
||||
: workimg(NULL), awbComputed(false), ipf(¶ms, true), scale(10), highDetailPreprocessComputed(false),
|
||||
: workimg(NULL), lastAwbEqual(0.), ipf(¶ms, true), scale(10), highDetailPreprocessComputed(false),
|
||||
highDetailRawComputed(false), allocated(false),
|
||||
|
||||
hltonecurve(65536,0),
|
||||
@ -182,13 +182,23 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) {
|
||||
imgsrc->HLRecovery_Global( params.hlrecovery ); // this handles Color HLRecovery
|
||||
|
||||
if (settings->verbose) printf ("Applying white balance, color correction & sRBG conversion...\n");
|
||||
currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.method);
|
||||
currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method);
|
||||
if (params.wb.method=="Camera")
|
||||
currWB = imgsrc->getWB ();
|
||||
else if (params.wb.method=="Auto") {
|
||||
if (!awbComputed) {
|
||||
autoWB = imgsrc->getAutoWB ();
|
||||
awbComputed = true;
|
||||
if (lastAwbEqual != params.wb.equal) {
|
||||
double rm, gm, bm;
|
||||
imgsrc->getAutoWBMultipliers(rm, gm, bm);
|
||||
if (rm != -1.) {
|
||||
autoWB.update(rm, bm, gm, params.wb.equal);
|
||||
lastAwbEqual = params.wb.equal;
|
||||
}
|
||||
else {
|
||||
lastAwbEqual = -1.;
|
||||
autoWB.useDefaults(params.wb.equal);
|
||||
}
|
||||
//double rr,gg,bb;
|
||||
//autoWB.getMultipliers(rr,gg,bb);
|
||||
}
|
||||
currWB = autoWB;
|
||||
}
|
||||
@ -609,20 +619,28 @@ void ImProcCoordinator::progress (Glib::ustring str, int pr) {
|
||||
}*/
|
||||
}
|
||||
|
||||
bool ImProcCoordinator::getAutoWB (double& temp, double& green) {
|
||||
bool ImProcCoordinator::getAutoWB (double& temp, double& green, double equal) {
|
||||
|
||||
if (imgsrc && imgsrc->isWBProviderReady()) {
|
||||
if (!awbComputed) {
|
||||
minit.lock ();
|
||||
autoWB = imgsrc->getAutoWB ();
|
||||
minit.unlock ();
|
||||
awbComputed = true;
|
||||
if (imgsrc) {
|
||||
if (lastAwbEqual != equal) {
|
||||
Glib::Mutex::Lock lock(minit); // Also used in crop window
|
||||
double rm, gm, bm;
|
||||
imgsrc->getAutoWBMultipliers(rm, gm, bm);
|
||||
if (rm != -1) {
|
||||
autoWB.update(rm, bm, gm, equal);
|
||||
lastAwbEqual = equal;
|
||||
}
|
||||
else {
|
||||
lastAwbEqual = -1.;
|
||||
autoWB.useDefaults(equal);
|
||||
}
|
||||
}
|
||||
temp = autoWB.getTemp ();
|
||||
green = autoWB.getGreen ();
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
//temp = autoWB.getTemp();
|
||||
temp = -1.0;
|
||||
green = -1.0;
|
||||
return false;
|
||||
@ -652,9 +670,11 @@ void ImProcCoordinator::getSpotWB (int x, int y, int rect, double& temp, double&
|
||||
if (params.coarse.rotate==270) tr |= TR_R270;
|
||||
if (params.coarse.hflip) tr |= TR_HFLIP;
|
||||
if (params.coarse.vflip) tr |= TR_VFLIP;
|
||||
ColorTemp ret = imgsrc->getSpotWB (red, green, blue, tr, params.wb.equal);
|
||||
currWB = ColorTemp (params.wb.temperature, params.wb.green,params.wb.equal, params.wb.method);
|
||||
//double rr,gg,bb;
|
||||
//currWB.getMultipliers(rr,gg,bb);
|
||||
|
||||
ColorTemp ret = imgsrc->getSpotWB (red, green, blue, tr);
|
||||
currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.method);
|
||||
mProcessing.unlock ();
|
||||
|
||||
if (ret.getTemp() > 0) {
|
||||
@ -711,13 +731,21 @@ void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname) {
|
||||
imgsrc->preprocess( ppar.raw, ppar.lensProf, ppar.coarse );
|
||||
imgsrc->demosaic(ppar.raw );
|
||||
//imgsrc->getImage (imgsrc->getWB(), 0, im, pp, ppar.hlrecovery, ppar.icm, ppar.raw);
|
||||
ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.method);
|
||||
ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method);
|
||||
if (params.wb.method=="Camera")
|
||||
currWB = imgsrc->getWB ();
|
||||
else if (params.wb.method=="Auto") {
|
||||
if (!awbComputed) {
|
||||
autoWB = imgsrc->getAutoWB ();
|
||||
awbComputed = true;
|
||||
if (lastAwbEqual != params.wb.equal) {
|
||||
double rm, gm, bm;
|
||||
imgsrc->getAutoWBMultipliers(rm, gm, bm);
|
||||
if (rm != -1.) {
|
||||
autoWB.update(rm, bm, gm, params.wb.equal);
|
||||
lastAwbEqual = params.wb.equal;
|
||||
}
|
||||
else {
|
||||
lastAwbEqual = -1.;
|
||||
autoWB.useDefaults(params.wb.equal);
|
||||
}
|
||||
}
|
||||
currWB = autoWB;
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ class ImProcCoordinator : public StagedImageProcessor {
|
||||
ColorTemp currWB;
|
||||
ColorTemp autoWB;
|
||||
|
||||
bool awbComputed;
|
||||
double lastAwbEqual;
|
||||
|
||||
ImProcFunctions ipf;
|
||||
|
||||
@ -174,7 +174,7 @@ class ImProcCoordinator : public StagedImageProcessor {
|
||||
|
||||
DetailedCrop* createCrop ();
|
||||
|
||||
bool getAutoWB (double& temp, double& green);
|
||||
bool getAutoWB (double& temp, double& green, double equal);
|
||||
void getCamWB (double& temp, double& green);
|
||||
void getSpotWB (int x, int y, int rectSize, double& temp, double& green);
|
||||
void getAutoCrop (double ratio, int &x, int &y, int &w, int &h);
|
||||
|
@ -3286,7 +3286,7 @@ fclose(f);*/
|
||||
if (thumb == NULL)
|
||||
return 0.0;
|
||||
|
||||
Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, w_raw, h_raw, 1, FALSE);
|
||||
Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, w_raw, h_raw, 1, 1.0, FALSE);
|
||||
if (raw == NULL) {
|
||||
delete thumb;
|
||||
return 0.0;
|
||||
|
@ -230,7 +230,9 @@ enum ProcEvent {
|
||||
EvCATbadpix=204,
|
||||
EvCATAutoAdap=205,
|
||||
EvPFCurve=206,
|
||||
NUMOFEVENTS=207
|
||||
EvWBequal=207,
|
||||
EvWBequalbo=208,
|
||||
NUMOFEVENTS=209
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
@ -49,38 +49,40 @@ std::vector<WBEntry*> WBParams::wbEntries;
|
||||
|
||||
void WBParams::init() {
|
||||
// Creation of the different methods and its associated temperature value
|
||||
wbEntries.push_back(new WBEntry("Camera" ,WBT_CAMERA, M("TP_WBALANCE_CAMERA"), 0));
|
||||
wbEntries.push_back(new WBEntry("Auto" ,WBT_AUTO, M("TP_WBALANCE_AUTO"), 0));
|
||||
wbEntries.push_back(new WBEntry("Daylight" ,WBT_DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300));
|
||||
wbEntries.push_back(new WBEntry("Cloudy" ,WBT_CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200));
|
||||
wbEntries.push_back(new WBEntry("Shade" ,WBT_SHADE, M("TP_WBALANCE_SHADE"), 7600));
|
||||
wbEntries.push_back(new WBEntry("Tungsten" ,WBT_TUNGSTEN, M("TP_WBALANCE_TUNGSTEN"), 2856));
|
||||
wbEntries.push_back(new WBEntry("Fluo F1" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO1"), 6430));
|
||||
wbEntries.push_back(new WBEntry("Fluo F2" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO2"), 4230));
|
||||
wbEntries.push_back(new WBEntry("Fluo F3" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO3"), 3450));
|
||||
wbEntries.push_back(new WBEntry("Fluo F4" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO4"), 2940));
|
||||
wbEntries.push_back(new WBEntry("Fluo F5" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO5"), 6350));
|
||||
wbEntries.push_back(new WBEntry("Fluo F6" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO6"), 4150));
|
||||
wbEntries.push_back(new WBEntry("Fluo F7" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO7"), 6500));
|
||||
wbEntries.push_back(new WBEntry("Fluo F8" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO8"), 5020));
|
||||
wbEntries.push_back(new WBEntry("Fluo F9" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO9"), 4330));
|
||||
wbEntries.push_back(new WBEntry("Fluo F10" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO10"), 5300));
|
||||
wbEntries.push_back(new WBEntry("Fluo F11" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO11"), 4000));
|
||||
wbEntries.push_back(new WBEntry("Fluo F12" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO12"), 3000));
|
||||
wbEntries.push_back(new WBEntry("HMI Lamp" ,WBT_LAMP, M("TP_WBALANCE_HMI"), 4800));
|
||||
wbEntries.push_back(new WBEntry("GTI Lamp" ,WBT_LAMP, M("TP_WBALANCE_GTI"), 5000));
|
||||
wbEntries.push_back(new WBEntry("JudgeIII Lamp" ,WBT_LAMP, M("TP_WBALANCE_JUDGEIII"), 5100));
|
||||
wbEntries.push_back(new WBEntry("Solux Lamp 3500K" ,WBT_LAMP, M("TP_WBALANCE_SOLUX35"), 3480));
|
||||
wbEntries.push_back(new WBEntry("Solux Lamp 4100K" ,WBT_LAMP, M("TP_WBALANCE_SOLUX41"), 3930));
|
||||
wbEntries.push_back(new WBEntry("Solux Lamp 4700K" ,WBT_LAMP, M("TP_WBALANCE_SOLUX47"), 4700));
|
||||
wbEntries.push_back(new WBEntry("NG Solux Lamp 4700K" ,WBT_LAMP, M("TP_WBALANCE_SOLUX47_NG"), 4480));
|
||||
wbEntries.push_back(new WBEntry("LED LSI Lumelex 2040",WBT_LED, M("TP_WBALANCE_LED_LSI"), 2970));
|
||||
wbEntries.push_back(new WBEntry("LED CRS SP12 WWMR16" ,WBT_LED, M("TP_WBALANCE_LED_CRS"), 3050));
|
||||
wbEntries.push_back(new WBEntry("Flash 5500K" ,WBT_FLASH, M("TP_WBALANCE_FLASH55"), 5500));
|
||||
wbEntries.push_back(new WBEntry("Flash 6000K" ,WBT_FLASH, M("TP_WBALANCE_FLASH60"), 6000));
|
||||
wbEntries.push_back(new WBEntry("Flash 6500K" ,WBT_FLASH, M("TP_WBALANCE_FLASH65"), 6500));
|
||||
wbEntries.push_back(new WBEntry("Camera" ,WBT_CAMERA, M("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Auto" ,WBT_AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Daylight" ,WBT_DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Cloudy" ,WBT_CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Shade" ,WBT_SHADE, M("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Water 1" ,WBT_WATER, M("TP_WBALANCE_WATER1"), 35000, 0.3f, 1.1f));
|
||||
wbEntries.push_back(new WBEntry("Water 2" ,WBT_WATER, M("TP_WBALANCE_WATER2"), 48000, 0.63f, 1.38f));
|
||||
wbEntries.push_back(new WBEntry("Tungsten" ,WBT_TUNGSTEN, M("TP_WBALANCE_TUNGSTEN"), 2856, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F1" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO1"), 6430, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F2" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO2"), 4230, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F3" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO3"), 3450, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F4" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO4"), 2940, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F5" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO5"), 6350, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F6" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO6"), 4150, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F7" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO7"), 6500, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F8" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO8"), 5020, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F9" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO9"), 4330, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F10" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO10"), 5300, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F11" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO11"), 4000, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Fluo F12" ,WBT_FLUORESCENT, M("TP_WBALANCE_FLUO12"), 3000, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("HMI Lamp" ,WBT_LAMP, M("TP_WBALANCE_HMI"), 4800, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("GTI Lamp" ,WBT_LAMP, M("TP_WBALANCE_GTI"), 5000, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("JudgeIII Lamp" ,WBT_LAMP, M("TP_WBALANCE_JUDGEIII"), 5100, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Solux Lamp 3500K" ,WBT_LAMP, M("TP_WBALANCE_SOLUX35"), 3480, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Solux Lamp 4100K" ,WBT_LAMP, M("TP_WBALANCE_SOLUX41"), 3930, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Solux Lamp 4700K" ,WBT_LAMP, M("TP_WBALANCE_SOLUX47"), 4700, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("NG Solux Lamp 4700K" ,WBT_LAMP, M("TP_WBALANCE_SOLUX47_NG"), 4480, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("LED LSI Lumelex 2040",WBT_LED, M("TP_WBALANCE_LED_LSI"), 2970, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("LED CRS SP12 WWMR16" ,WBT_LED, M("TP_WBALANCE_LED_CRS"), 3050, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Flash 5500K" ,WBT_FLASH, M("TP_WBALANCE_FLASH55"), 5500, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Flash 6000K" ,WBT_FLASH, M("TP_WBALANCE_FLASH60"), 6000, 1.f, 1.f));
|
||||
wbEntries.push_back(new WBEntry("Flash 6500K" ,WBT_FLASH, M("TP_WBALANCE_FLASH65"), 6500, 1.f, 1.f));
|
||||
// Should remain the last one
|
||||
wbEntries.push_back(new WBEntry("Custom" ,WBT_CUSTOM, M("TP_WBALANCE_CUSTOM"), 0));
|
||||
wbEntries.push_back(new WBEntry("Custom" ,WBT_CUSTOM, M("TP_WBALANCE_CUSTOM"), 0, 1.f, 1.f));
|
||||
}
|
||||
|
||||
void WBParams::cleanup() {
|
||||
@ -212,7 +214,7 @@ void ProcParams::setDefaults () {
|
||||
wb.method = "Camera";
|
||||
wb.temperature = 6504;
|
||||
wb.green = 1.0;
|
||||
|
||||
wb.equal = 1.0;
|
||||
colorappearance.enabled = false;
|
||||
colorappearance.degree = 90;
|
||||
colorappearance.autodegree = true;
|
||||
@ -601,6 +603,7 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, ParamsEdited* p
|
||||
if (!pedited || pedited->wb.method) keyFile.set_string ("White Balance", "Setting", wb.method);
|
||||
if (!pedited || pedited->wb.temperature) keyFile.set_integer ("White Balance", "Temperature", wb.temperature);
|
||||
if (!pedited || pedited->wb.green) keyFile.set_double ("White Balance", "Green", wb.green);
|
||||
if (!pedited || pedited->wb.equal) keyFile.set_double ("White Balance", "Equal", wb.equal);
|
||||
|
||||
/*
|
||||
// save colorShift
|
||||
@ -1135,6 +1138,7 @@ if (keyFile.has_group ("White Balance")) {
|
||||
if (keyFile.has_key ("White Balance", "Setting")) { wb.method = keyFile.get_string ("White Balance", "Setting"); if (pedited) pedited->wb.method = true; }
|
||||
if (keyFile.has_key ("White Balance", "Temperature")) { wb.temperature = keyFile.get_integer ("White Balance", "Temperature"); if (pedited) pedited->wb.temperature = true; }
|
||||
if (keyFile.has_key ("White Balance", "Green")) { wb.green = keyFile.get_double ("White Balance", "Green"); if (pedited) pedited->wb.green = true; }
|
||||
if (keyFile.has_key ("White Balance", "Equal")) { wb.equal = keyFile.get_double ("White Balance", "Equal"); if (pedited) pedited->wb.equal = true; }
|
||||
}
|
||||
|
||||
// load colorShift
|
||||
@ -1572,6 +1576,7 @@ bool ProcParams::operator== (const ProcParams& other) {
|
||||
&& wb.method == other.wb.method
|
||||
&& wb.green == other.wb.green
|
||||
&& wb.temperature == other.wb.temperature
|
||||
&& wb.equal == other.wb.equal
|
||||
//&& colorShift.a == other.colorShift.a
|
||||
//&& colorShift.b == other.colorShift.b
|
||||
&& colorappearance.enabled == other.colorappearance.enabled
|
||||
|
@ -315,6 +315,7 @@ enum WBTypes {
|
||||
WBT_DAYLIGHT,
|
||||
WBT_CLOUDY,
|
||||
WBT_SHADE,
|
||||
WBT_WATER,
|
||||
WBT_TUNGSTEN,
|
||||
WBT_FLUORESCENT,
|
||||
WBT_LAMP,
|
||||
@ -330,8 +331,10 @@ public:
|
||||
enum WBTypes type;
|
||||
Glib::ustring GUILabel;
|
||||
int temperature;
|
||||
double green;
|
||||
double equal;
|
||||
|
||||
WBEntry(Glib::ustring p, enum WBTypes t, Glib::ustring l, int temp) : ppLabel(p), type(t), GUILabel(l), temperature(temp) {};
|
||||
WBEntry(Glib::ustring p, enum WBTypes t, Glib::ustring l, int temp, double green, double equal) : ppLabel(p), type(t), GUILabel(l), temperature(temp), green(green), equal(equal) {};
|
||||
};
|
||||
|
||||
class WBParams {
|
||||
@ -341,6 +344,7 @@ class WBParams {
|
||||
Glib::ustring method;
|
||||
int temperature;
|
||||
double green;
|
||||
double equal;
|
||||
|
||||
static void init();
|
||||
static void cleanup();
|
||||
|
@ -891,7 +891,7 @@ int RawImageSource::load (Glib::ustring fname, bool batch) {
|
||||
double cam_g = imatrices.rgb_cam[1][0]*camwb_red + imatrices.rgb_cam[1][1]*camwb_green + imatrices.rgb_cam[1][2]*camwb_blue;
|
||||
double cam_b = imatrices.rgb_cam[2][0]*camwb_red + imatrices.rgb_cam[2][1]*camwb_green + imatrices.rgb_cam[2][2]*camwb_blue;
|
||||
|
||||
wb = ColorTemp (cam_r, cam_g, cam_b);
|
||||
wb = ColorTemp (cam_r, cam_g, cam_b, 1.);
|
||||
|
||||
ri->set_prefilters();
|
||||
|
||||
@ -2265,7 +2265,21 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) {
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
ColorTemp RawImageSource::getAutoWB () {
|
||||
void RawImageSource::getAutoWBMultipliers (double &rm, double &bm, double &gm) {
|
||||
|
||||
if (redAWBMul != -1.) {
|
||||
rm = redAWBMul;
|
||||
gm = greenAWBMul;
|
||||
bm = blueAWBMul;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isWBProviderReady()) {
|
||||
rm = -1.0;
|
||||
gm = -1.0;
|
||||
bm = -1.0;
|
||||
return;
|
||||
}
|
||||
|
||||
double avg_r = 0;
|
||||
double avg_g = 0;
|
||||
@ -2369,17 +2383,15 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) {
|
||||
double greens = avg_g/gn * camwb_green;
|
||||
double blues = avg_b/bn * camwb_blue;
|
||||
|
||||
double rm = imatrices.rgb_cam[0][0]*reds + imatrices.rgb_cam[0][1]*greens + imatrices.rgb_cam[0][2]*blues;
|
||||
double gm = imatrices.rgb_cam[1][0]*reds + imatrices.rgb_cam[1][1]*greens + imatrices.rgb_cam[1][2]*blues;
|
||||
double bm = imatrices.rgb_cam[2][0]*reds + imatrices.rgb_cam[2][1]*greens + imatrices.rgb_cam[2][2]*blues;
|
||||
|
||||
return ColorTemp (rm, gm, bm);
|
||||
redAWBMul = rm = imatrices.rgb_cam[0][0]*reds + imatrices.rgb_cam[0][1]*greens + imatrices.rgb_cam[0][2]*blues;
|
||||
greenAWBMul = gm = imatrices.rgb_cam[1][0]*reds + imatrices.rgb_cam[1][1]*greens + imatrices.rgb_cam[1][2]*blues;
|
||||
blueAWBMul = bm = imatrices.rgb_cam[2][0]*reds + imatrices.rgb_cam[2][1]*greens + imatrices.rgb_cam[2][2]*blues;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
|
||||
ColorTemp RawImageSource::getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran) {
|
||||
ColorTemp RawImageSource::getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran, double equal) {
|
||||
|
||||
int x; int y;
|
||||
double reds = 0, greens = 0, blues = 0;
|
||||
@ -2410,7 +2422,8 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) {
|
||||
} else {
|
||||
|
||||
int d[9][2] = {{0,0}, {-1,-1}, {-1,0}, {-1,1}, {0,-1}, {0,1}, {1,-1}, {1,0}, {1,1}};
|
||||
int rloc, gloc, bloc, rnbrs, gnbrs, bnbrs;
|
||||
double rloc, gloc, bloc;
|
||||
int rnbrs, gnbrs, bnbrs;
|
||||
for (size_t i=0; i<red.size(); i++) {
|
||||
transformPosition (red[i].x, red[i].y, tran, x, y);
|
||||
rloc=gloc=bloc=rnbrs=gnbrs=bnbrs=0;
|
||||
@ -2431,19 +2444,66 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) {
|
||||
gnbrs++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
rloc /= rnbrs; gloc /= gnbrs; bloc /= bnbrs;
|
||||
if (rloc*initialGain<64000. && gloc*initialGain<64000. && bloc*initialGain<64000.) {
|
||||
reds += rloc; greens += gloc; blues += bloc; rn++;
|
||||
}
|
||||
transformPosition (green[i].x, green[i].y, tran, x, y);//these are redundant now ??? if not, repeat for these blocks same as for red[]
|
||||
rloc=gloc=bloc=rnbrs=gnbrs=bnbrs=0;
|
||||
for (int k=0; k<9; k++) {
|
||||
int xv = x + d[k][0];
|
||||
int yv = y + d[k][1];
|
||||
int c = FC(yv,xv);
|
||||
if (c==0 && xv>=0 && yv>=0 && xv<W && yv<H) { //RED
|
||||
rloc += (rawData[yv][xv]);
|
||||
rnbrs++;
|
||||
continue;
|
||||
}else if (c==2 && xv>=0 && yv>=0 && xv<W && yv<H) { //BLUE
|
||||
bloc += (rawData[yv][xv]);
|
||||
bnbrs++;
|
||||
continue;
|
||||
} else { // GREEN
|
||||
gloc += (rawData[yv][xv]);
|
||||
gnbrs++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
rloc /= rnbrs; gloc /= gnbrs; bloc /= bnbrs;
|
||||
if (rloc*initialGain<64000. && gloc*initialGain<64000. && bloc*initialGain<64000.) {
|
||||
reds += rloc; greens += gloc; blues += bloc; rn++;
|
||||
}
|
||||
|
||||
transformPosition (blue[i].x, blue[i].y, tran, x, y);
|
||||
rloc=gloc=bloc=rnbrs=gnbrs=bnbrs=0;
|
||||
for (int k=0; k<9; k++) {
|
||||
int xv = x + d[k][0];
|
||||
int yv = y + d[k][1];
|
||||
int c = FC(yv,xv);
|
||||
if (c==0 && xv>=0 && yv>=0 && xv<W && yv<H) { //RED
|
||||
rloc += (rawData[yv][xv]);
|
||||
rnbrs++;
|
||||
continue;
|
||||
} else if (c==2 && xv>=0 && yv>=0 && xv<W && yv<H) { //BLUE
|
||||
bloc += (rawData[yv][xv]);
|
||||
bnbrs++;
|
||||
continue;
|
||||
} else { // GREEN
|
||||
gloc += (rawData[yv][xv]);
|
||||
gnbrs++;
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
rloc /= rnbrs; gloc /= gnbrs; bloc /= bnbrs;
|
||||
if (rloc*initialGain<64000 && gloc*initialGain<64000 && bloc*initialGain<64000) {
|
||||
if (rloc*initialGain<64000. && gloc*initialGain<64000. && bloc*initialGain<64000.) {
|
||||
reds += rloc; greens += gloc; blues += bloc; rn++;
|
||||
}
|
||||
//transformPosition (green[i].x, green[i].y, tran, x, y);//these are redundant now ??? if not, repeat for these blocks same as for red[]
|
||||
//transformPosition (blue[i].x, blue[i].y, tran, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
if (2*rn < red.size()) {
|
||||
return ColorTemp ();
|
||||
return ColorTemp (equal);
|
||||
}
|
||||
else {
|
||||
reds = reds/rn * camwb_red;
|
||||
@ -2454,7 +2514,7 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) {
|
||||
double gm = imatrices.rgb_cam[1][0]*reds + imatrices.rgb_cam[1][1]*greens + imatrices.rgb_cam[1][2]*blues;
|
||||
double bm = imatrices.rgb_cam[2][0]*reds + imatrices.rgb_cam[2][1]*greens + imatrices.rgb_cam[2][2]*blues;
|
||||
|
||||
return ColorTemp (rm, gm, bm);
|
||||
return ColorTemp (rm, gm, bm, equal);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -153,8 +153,8 @@ class RawImageSource : public ImageSource {
|
||||
|
||||
void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, HRecParams hrp, ColorManagementParams cmp, RAWParams raw);
|
||||
ColorTemp getWB () { return wb; }
|
||||
ColorTemp getAutoWB ();
|
||||
ColorTemp getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran);
|
||||
void getAutoWBMultipliers (double &rm, double &bm, double &gm);
|
||||
ColorTemp getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran, double equal);
|
||||
bool isWBProviderReady () { return rawData; }
|
||||
|
||||
double getDefGain () { return defGain; }
|
||||
|
@ -222,11 +222,13 @@ LUMINANCECURVE, // EvCATdatacie
|
||||
LUMINANCECURVE, // EvCATtonecie
|
||||
ALLNORAW, // EvDPDNbluechro
|
||||
ALLNORAW, // EvDPDNperform
|
||||
ALLNORAW, //EvDPDNmet
|
||||
ALLNORAW, // EvDPDNmet
|
||||
DEMOSAIC, // EvDemosaicLMMSEIter
|
||||
LUMINANCECURVE, // EvCATbadpix
|
||||
LUMINANCECURVE, // EvCATAutoadap
|
||||
DEFRINGE // EvPFCurve,
|
||||
DEFRINGE, // EvPFCurve,
|
||||
WHITEBALANCE, // EvWBequal,
|
||||
WHITEBALANCE // EvWBequalbo,
|
||||
|
||||
//LUMINANCECURVE // EvCATsharpcie
|
||||
|
||||
|
@ -321,7 +321,7 @@ namespace rtengine {
|
||||
/** Creates and returns a Crop instance that acts as a window on the image */
|
||||
virtual DetailedCrop* createCrop () =0;
|
||||
|
||||
virtual bool getAutoWB (double& temp, double& green) =0;
|
||||
virtual bool getAutoWB (double& temp, double& green, double equal) =0;
|
||||
virtual void getCamWB (double& temp, double& green) =0;
|
||||
virtual void getSpotWB (int x, int y, int rectSize, double& temp, double& green) =0;
|
||||
virtual void getAutoCrop (double ratio, int &x, int &y, int &w, int &h) =0;
|
||||
|
@ -40,7 +40,7 @@
|
||||
|
||||
namespace rtengine {
|
||||
|
||||
Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh) {
|
||||
Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq) {
|
||||
|
||||
StdImageSource imgSrc;
|
||||
if (imgSrc.load(fname)) {
|
||||
@ -51,25 +51,12 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h,
|
||||
|
||||
Thumbnail* tpp = new Thumbnail ();
|
||||
|
||||
tpp->camwbRed = 1.0;
|
||||
tpp->camwbGreen = 1.0;
|
||||
tpp->camwbBlue = 1.0;
|
||||
|
||||
tpp->embProfileLength = 0;
|
||||
unsigned char* data;
|
||||
img->getEmbeddedProfileData (tpp->embProfileLength, data);
|
||||
if (data && tpp->embProfileLength) {
|
||||
tpp->embProfileData = new unsigned char [tpp->embProfileLength];
|
||||
memcpy (tpp->embProfileData, data, tpp->embProfileLength);
|
||||
}
|
||||
else {
|
||||
tpp->embProfileLength = 0;
|
||||
tpp->embProfileData = NULL;
|
||||
}
|
||||
|
||||
tpp->redMultiplier = 1.0;
|
||||
tpp->greenMultiplier = 1.0;
|
||||
tpp->blueMultiplier = 1.0;
|
||||
|
||||
tpp->scaleForSave = 8192;
|
||||
tpp->defGain = 1.0;
|
||||
@ -120,7 +107,13 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h,
|
||||
|
||||
if (n>0) {
|
||||
ColorTemp cTemp;
|
||||
cTemp.mul2temp (avg_r/double(n), avg_g/double(n), avg_b/double(n), tpp->autowbTemp, tpp->autowbGreen);
|
||||
|
||||
tpp->redAWBMul = avg_r/double(n);
|
||||
tpp->greenAWBMul = avg_g/double(n);
|
||||
tpp->blueAWBMul = avg_b/double(n);
|
||||
tpp->wbEqual = wbEq;
|
||||
|
||||
cTemp.mul2temp (tpp->redAWBMul, tpp->greenAWBMul, tpp->blueAWBMul, tpp->wbEqual, tpp->autoWBTemp, tpp->autoWBGreen);
|
||||
}
|
||||
|
||||
tpp->init ();
|
||||
@ -174,21 +167,6 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL
|
||||
|
||||
Thumbnail* tpp = new Thumbnail ();
|
||||
|
||||
tpp->camwbRed = 1.0;
|
||||
tpp->camwbGreen = 1.0;
|
||||
tpp->camwbBlue = 1.0;
|
||||
|
||||
tpp->embProfileLength = 0;
|
||||
tpp->embProfile = NULL;
|
||||
tpp->embProfileData = NULL;
|
||||
|
||||
tpp->redMultiplier = 1.0;
|
||||
tpp->greenMultiplier = 1.0;
|
||||
tpp->blueMultiplier = 1.0;
|
||||
|
||||
tpp->scaleForSave = 8192;
|
||||
tpp->defGain = 1.0;
|
||||
tpp->gammaCorrected = false;
|
||||
tpp->isRaw = 1;
|
||||
memset (tpp->colorMatrix, 0, sizeof(tpp->colorMatrix));
|
||||
tpp->colorMatrix[0][0] = 1.0;
|
||||
@ -208,9 +186,6 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL
|
||||
tpp->thumbImg = resizeTo<Image8>(w, h, TI_Nearest, img);
|
||||
delete img;
|
||||
|
||||
tpp->autowbTemp=2700;
|
||||
tpp->autowbGreen=1.0;
|
||||
|
||||
if (rotate && ri->get_rotateDegree() > 0) {
|
||||
// Leaf .mos, Mamiya .mef and Phase One files have thumbnails already rotated.
|
||||
if (ri->get_maker() != "Leaf" && ri->get_maker() != "Mamiya" && ri->get_maker() != "Phase One") {
|
||||
@ -231,7 +206,7 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL
|
||||
#define FISBLUE(filter,row,col) \
|
||||
((filter >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3)==2 || !filter)
|
||||
|
||||
Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate)
|
||||
Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate)
|
||||
{
|
||||
RawImage *ri= new RawImage (fname);
|
||||
int r = ri->loadRaw(1,0);
|
||||
@ -459,12 +434,13 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati
|
||||
double greens = avg_g / gn * tpp->camwbGreen;
|
||||
double blues = avg_b / bn * tpp->camwbBlue;
|
||||
|
||||
double rm = ri->get_rgb_cam(0, 0) * reds + ri->get_rgb_cam(0, 1) * greens + ri->get_rgb_cam(0, 2) * blues;
|
||||
double gm = ri->get_rgb_cam(1, 0) * reds + ri->get_rgb_cam(1, 1) * greens + ri->get_rgb_cam(1, 2) * blues;
|
||||
double bm = ri->get_rgb_cam(2, 0) * reds + ri->get_rgb_cam(2, 1) * greens + ri->get_rgb_cam(2, 2) * blues;
|
||||
tpp->redAWBMul = ri->get_rgb_cam(0, 0) * reds + ri->get_rgb_cam(0, 1) * greens + ri->get_rgb_cam(0, 2) * blues;
|
||||
tpp->greenAWBMul = ri->get_rgb_cam(1, 0) * reds + ri->get_rgb_cam(1, 1) * greens + ri->get_rgb_cam(1, 2) * blues;
|
||||
tpp->blueAWBMul = ri->get_rgb_cam(2, 0) * reds + ri->get_rgb_cam(2, 1) * greens + ri->get_rgb_cam(2, 2) * blues;
|
||||
tpp->wbEqual = wbEq;
|
||||
|
||||
ColorTemp cTemp;
|
||||
cTemp.mul2temp(rm, gm, bm, tpp->autowbTemp, tpp->autowbGreen);
|
||||
cTemp.mul2temp(tpp->redAWBMul, tpp->greenAWBMul, tpp->blueAWBMul, tpp->wbEqual, tpp->autoWBTemp, tpp->autoWBGreen);
|
||||
|
||||
if (rotate && ri->get_rotateDegree() > 0) {
|
||||
tpp->thumbImg->rotate(ri->get_rotateDegree());
|
||||
@ -513,7 +489,15 @@ void Thumbnail::init () {
|
||||
}
|
||||
|
||||
Thumbnail::Thumbnail () :
|
||||
camProfile(NULL), thumbImg(NULL), embProfileData(NULL), embProfile(NULL) {
|
||||
camProfile(NULL), thumbImg(NULL),
|
||||
camwbRed(1.0), camwbGreen(1.0), camwbBlue(1.0),
|
||||
redAWBMul(-1.0), greenAWBMul(-1.0), blueAWBMul(-1.0),
|
||||
autoWBTemp(2700), autoWBGreen(1.0), wbEqual(-1.0),
|
||||
embProfileLength(0), embProfileData(NULL), embProfile(NULL),
|
||||
redMultiplier(1.0), greenMultiplier(1.0), blueMultiplier(1.0),
|
||||
defGain(1.0),
|
||||
scaleForSave(8192),
|
||||
gammaCorrected(false) {
|
||||
}
|
||||
|
||||
Thumbnail::~Thumbnail () {
|
||||
@ -555,17 +539,25 @@ IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int
|
||||
IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rheight, TypeInterpolation interp, std::string camName,
|
||||
double focalLen, double focalLen35mm, float focusDist, float shutter, float fnumber, float iso,std::string expcomp_, double& myscale) {
|
||||
|
||||
// check if the WB's equalizer value has changed
|
||||
if (wbEqual < (params.wb.equal-5e-4) || wbEqual > (params.wb.equal+5e-4)) {
|
||||
wbEqual = params.wb.equal;
|
||||
// recompute the autoWB
|
||||
ColorTemp cTemp;
|
||||
cTemp.mul2temp (redAWBMul, greenAWBMul, blueAWBMul, wbEqual, autoWBTemp, autoWBGreen);
|
||||
}
|
||||
|
||||
// compute WB multipliers
|
||||
ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.method);
|
||||
ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal,params.wb.method);
|
||||
if (params.wb.method=="Camera") {
|
||||
//recall colorMatrix is rgb_cam
|
||||
double cam_r = colorMatrix[0][0]*camwbRed + colorMatrix[0][1]*camwbGreen + colorMatrix[0][2]*camwbBlue;
|
||||
double cam_g = colorMatrix[1][0]*camwbRed + colorMatrix[1][1]*camwbGreen + colorMatrix[1][2]*camwbBlue;
|
||||
double cam_b = colorMatrix[2][0]*camwbRed + colorMatrix[2][1]*camwbGreen + colorMatrix[2][2]*camwbBlue;
|
||||
currWB = ColorTemp (cam_r, cam_g, cam_b);
|
||||
currWB = ColorTemp (cam_r, cam_g, cam_b, params.wb.equal);
|
||||
}
|
||||
else if (params.wb.method=="Auto")
|
||||
currWB = ColorTemp (autowbTemp, autowbGreen, "Custom");
|
||||
currWB = ColorTemp (autoWBTemp, autoWBGreen, wbEqual, "Custom");
|
||||
double r, g, b;
|
||||
currWB.getMultipliers (r, g, b);
|
||||
//iColorMatrix is cam_rgb
|
||||
@ -884,15 +876,28 @@ void Thumbnail::getCamWB (double& temp, double& green) {
|
||||
double cam_r = colorMatrix[0][0]*camwbRed + colorMatrix[0][1]*camwbGreen + colorMatrix[0][2]*camwbBlue;
|
||||
double cam_g = colorMatrix[1][0]*camwbRed + colorMatrix[1][1]*camwbGreen + colorMatrix[1][2]*camwbBlue;
|
||||
double cam_b = colorMatrix[2][0]*camwbRed + colorMatrix[2][1]*camwbGreen + colorMatrix[2][2]*camwbBlue;
|
||||
ColorTemp currWB = ColorTemp (cam_r, cam_g, cam_b);
|
||||
ColorTemp currWB = ColorTemp (cam_r, cam_g, cam_b, 1.0); // we do not take the equalizer into account here, because we want camera's WB
|
||||
temp = currWB.getTemp ();
|
||||
green = currWB.getGreen ();
|
||||
}
|
||||
|
||||
void Thumbnail::getAutoWB (double& temp, double& green) {
|
||||
void Thumbnail::getAutoWB (double& temp, double& green, double equal) {
|
||||
|
||||
temp = autowbTemp;
|
||||
green = autowbGreen;
|
||||
if (equal != wbEqual) {
|
||||
// compute the values depending on equal
|
||||
ColorTemp cTemp;
|
||||
wbEqual = equal;
|
||||
// compute autoWBTemp and autoWBGreen
|
||||
cTemp.mul2temp(redAWBMul, greenAWBMul, blueAWBMul, wbEqual, autoWBTemp, autoWBGreen);
|
||||
}
|
||||
temp = autoWBTemp;
|
||||
green = autoWBGreen;
|
||||
}
|
||||
|
||||
void Thumbnail::getAutoWBMultipliers (double& rm, double& gm, double& bm) {
|
||||
rm = redAWBMul;
|
||||
gm = greenAWBMul;
|
||||
bm = blueAWBMul;
|
||||
}
|
||||
|
||||
void Thumbnail::applyAutoExp (procparams::ProcParams& params) {
|
||||
@ -937,7 +942,7 @@ void Thumbnail::getSpotWB (const procparams::ProcParams& params, int xp, int yp,
|
||||
double gm = colorMatrix[1][0]*reds + colorMatrix[1][1]*greens + colorMatrix[1][2]*blues;
|
||||
double bm = colorMatrix[2][0]*reds + colorMatrix[2][1]*greens + colorMatrix[2][2]*blues;
|
||||
|
||||
ColorTemp ct (rm, gm, bm);
|
||||
ColorTemp ct (rm, gm, bm, params.wb.equal);
|
||||
rtemp = ct.getTemp ();
|
||||
rgreen = ct.getGreen ();
|
||||
}
|
||||
@ -1283,8 +1288,9 @@ bool Thumbnail::readData (const Glib::ustring& fname) {
|
||||
if (keyFile.has_key ("LiveThumbData", "CamWBRed")) camwbRed = keyFile.get_double ("LiveThumbData", "CamWBRed");
|
||||
if (keyFile.has_key ("LiveThumbData", "CamWBGreen")) camwbGreen = keyFile.get_double ("LiveThumbData", "CamWBGreen");
|
||||
if (keyFile.has_key ("LiveThumbData", "CamWBBlue")) camwbBlue = keyFile.get_double ("LiveThumbData", "CamWBBlue");
|
||||
if (keyFile.has_key ("LiveThumbData", "AutoWBTemp")) autowbTemp = keyFile.get_double ("LiveThumbData", "AutoWBTemp");
|
||||
if (keyFile.has_key ("LiveThumbData", "AutoWBGreen")) autowbGreen = keyFile.get_double ("LiveThumbData", "AutoWBGreen");
|
||||
if (keyFile.has_key ("LiveThumbData", "RedAWBMul")) redAWBMul = keyFile.get_double ("LiveThumbData", "RedAWBMul");
|
||||
if (keyFile.has_key ("LiveThumbData", "GreenAWBMul")) greenAWBMul = keyFile.get_double ("LiveThumbData", "GreenAWBMul");
|
||||
if (keyFile.has_key ("LiveThumbData", "BlueAWBMul")) blueAWBMul = keyFile.get_double ("LiveThumbData", "BlueAWBMul");
|
||||
if (keyFile.has_key ("LiveThumbData", "AEHistCompression")) aeHistCompression = keyFile.get_integer ("LiveThumbData", "AEHistCompression");
|
||||
if (keyFile.has_key ("LiveThumbData", "RedMultiplier")) redMultiplier = keyFile.get_double ("LiveThumbData", "RedMultiplier");
|
||||
if (keyFile.has_key ("LiveThumbData", "GreenMultiplier")) greenMultiplier = keyFile.get_double ("LiveThumbData", "GreenMultiplier");
|
||||
@ -1301,12 +1307,11 @@ bool Thumbnail::readData (const Glib::ustring& fname) {
|
||||
colorMatrix[i][j] = cm[ix++];
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Glib::Error &err) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Glib::Error &err) {}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Thumbnail::writeData (const Glib::ustring& fname) {
|
||||
@ -1323,8 +1328,9 @@ bool Thumbnail::writeData (const Glib::ustring& fname) {
|
||||
keyFile.set_double ("LiveThumbData", "CamWBRed", camwbRed);
|
||||
keyFile.set_double ("LiveThumbData", "CamWBGreen", camwbGreen);
|
||||
keyFile.set_double ("LiveThumbData", "CamWBBlue", camwbBlue);
|
||||
keyFile.set_double ("LiveThumbData", "AutoWBTemp", autowbTemp);
|
||||
keyFile.set_double ("LiveThumbData", "AutoWBGreen", autowbGreen);
|
||||
keyFile.set_double ("LiveThumbData", "RedAWBMul", redAWBMul);
|
||||
keyFile.set_double ("LiveThumbData", "GreenAWBMul", greenAWBMul);
|
||||
keyFile.set_double ("LiveThumbData", "BlueAWBMul", blueAWBMul);
|
||||
keyFile.set_integer ("LiveThumbData", "AEHistCompression", aeHistCompression);
|
||||
keyFile.set_double ("LiveThumbData", "RedMultiplier", redMultiplier);
|
||||
keyFile.set_double ("LiveThumbData", "GreenMultiplier", greenMultiplier);
|
||||
|
@ -46,8 +46,8 @@ namespace rtengine {
|
||||
double camwbRed;
|
||||
double camwbGreen;
|
||||
double camwbBlue;
|
||||
double autowbTemp;
|
||||
double autowbGreen;
|
||||
double redAWBMul, greenAWBMul, blueAWBMul; // multipliers for auto WB
|
||||
double autoWBTemp, autoWBGreen, wbEqual; // autoWBTemp and autoWBGreen are updated each time autoWB is requested and if wbEqual has been modified
|
||||
LUTu aeHistogram;
|
||||
int aeHistCompression;
|
||||
int embProfileLength;
|
||||
@ -80,11 +80,12 @@ namespace rtengine {
|
||||
void getDimensions (int& w, int& h, double& scaleFac);
|
||||
|
||||
static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate);
|
||||
static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate);
|
||||
static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh);
|
||||
static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate);
|
||||
static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq);
|
||||
|
||||
void getCamWB (double& temp, double& green);
|
||||
void getAutoWB (double& temp, double& green);
|
||||
void getAutoWB (double& temp, double& green, double equal);
|
||||
void getAutoWBMultipliers (double& rm, double& gm, double& bm);
|
||||
void getSpotWB (const procparams::ProcParams& params, int x, int y, int rect, double& temp, double& green);
|
||||
void applyAutoExp (procparams::ProcParams& pparams);
|
||||
|
||||
|
@ -105,11 +105,14 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
|
||||
imgsrc->HLRecovery_Global( params.hlrecovery );
|
||||
if (pl) pl->setProgress (0.40);
|
||||
// set the color temperature
|
||||
ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.method);
|
||||
ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method);
|
||||
if (params.wb.method=="Camera")
|
||||
currWB = imgsrc->getWB ();
|
||||
else if (params.wb.method=="Auto")
|
||||
currWB = imgsrc->getAutoWB ();
|
||||
else if (params.wb.method=="Auto") {
|
||||
double rm, bm, gm;
|
||||
imgsrc->getAutoWBMultipliers(rm, bm, gm);
|
||||
currWB.update(rm, bm, gm, params.wb.equal);
|
||||
}
|
||||
Imagefloat* baseImg = new Imagefloat (fw, fh);
|
||||
imgsrc->getImage (currWB, tr, baseImg, pp, params.hlrecovery, params.icm, params.raw);
|
||||
if (pl) pl->setProgress (0.45);
|
||||
|
@ -188,7 +188,7 @@ int StdImageSource::load (Glib::ustring fname, bool batch) {
|
||||
plistener->setProgress (1.0);
|
||||
}
|
||||
|
||||
wb = ColorTemp (1.0,1.0,1.0);
|
||||
wb = ColorTemp (1.0,1.0,1.0,1.0);
|
||||
//this is probably a mistake if embedded profile is not D65
|
||||
|
||||
return 0;
|
||||
@ -292,11 +292,22 @@ void StdImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) {
|
||||
}
|
||||
}
|
||||
|
||||
ColorTemp StdImageSource::getAutoWB () {
|
||||
return img->getAutoWB();
|
||||
void StdImageSource::getAutoWBMultipliers (double &rm, double &bm, double &gm) {
|
||||
if (redAWBMul != -1.) {
|
||||
rm = redAWBMul;
|
||||
gm = greenAWBMul;
|
||||
bm = blueAWBMul;
|
||||
return;
|
||||
}
|
||||
|
||||
img->getAutoWBMultipliers(rm, gm, bm);
|
||||
|
||||
redAWBMul = rm;
|
||||
greenAWBMul = gm;
|
||||
blueAWBMul = bm;
|
||||
}
|
||||
|
||||
ColorTemp StdImageSource::getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D>& blue, int tran) {
|
||||
ColorTemp StdImageSource::getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D>& blue, int tran, double equal) {
|
||||
int rn, gn, bn;
|
||||
double reds, greens, blues;
|
||||
img->getSpotWBData(reds, greens, blues, rn, gn, bn, red, green, blue, tran);
|
||||
@ -305,7 +316,7 @@ ColorTemp StdImageSource::getSpotWB (std::vector<Coord2D> &red, std::vector<Coor
|
||||
if( settings->verbose )
|
||||
printf ("AVG: %g %g %g\n", reds/rn, greens/gn, blues/bn);
|
||||
|
||||
return ColorTemp (reds/rn*img_r, greens/gn*img_g, blues/bn*img_b);
|
||||
return ColorTemp (reds/rn*img_r, greens/gn*img_g, blues/bn*img_b, equal);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -45,8 +45,8 @@ class StdImageSource : public ImageSource {
|
||||
int load (Glib::ustring fname, bool batch = false);
|
||||
void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, HRecParams hrp, ColorManagementParams cmp, RAWParams raw);
|
||||
ColorTemp getWB () { return wb; }
|
||||
ColorTemp getAutoWB ();
|
||||
ColorTemp getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran);
|
||||
void getAutoWBMultipliers (double &rm, double &bm, double &gm);
|
||||
ColorTemp getSpotWB (std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, int tran, double equal);
|
||||
|
||||
bool isWBProviderReady () { return true; };
|
||||
|
||||
|
@ -65,8 +65,9 @@
|
||||
#define ADDSET_CAT_CHROMA_M 57
|
||||
#define ADDSET_CAT_HUE 58
|
||||
#define ADDSET_CAT_BADPIX 59
|
||||
#define ADDSET_WB_EQUAL 60
|
||||
|
||||
// When adding items, make sure to update ADDSET_PARAM_NUM
|
||||
#define ADDSET_PARAM_NUM 60 // THIS IS USED AS A DELIMITER!!
|
||||
#define ADDSET_PARAM_NUM 61 // THIS IS USED AS A DELIMITER!!
|
||||
|
||||
#endif
|
||||
|
@ -126,7 +126,7 @@ void BatchToolPanelCoordinator::initSession () {
|
||||
|
||||
toneCurve->setAdjusterBehavior (false, false, false, false, false, false, false, false);
|
||||
lcurve->setAdjusterBehavior (false, false, false);
|
||||
whitebalance->setAdjusterBehavior (false, false);
|
||||
whitebalance->setAdjusterBehavior (false, false, false);
|
||||
vibrance->setAdjusterBehavior (false, false, false);
|
||||
vignetting->setAdjusterBehavior (false, false, false, false);
|
||||
colorappearance->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false);
|
||||
@ -154,7 +154,7 @@ void BatchToolPanelCoordinator::initSession () {
|
||||
|
||||
toneCurve->setAdjusterBehavior (options.baBehav[ADDSET_TC_EXPCOMP], options.baBehav[ADDSET_TC_HLCOMPAMOUNT],options.baBehav[ADDSET_TC_HLCOMPTHRESH], options.baBehav[ADDSET_TC_BRIGHTNESS], options.baBehav[ADDSET_TC_BLACKLEVEL],options.baBehav[ADDSET_TC_SHCOMP], options.baBehav[ADDSET_TC_CONTRAST], options.baBehav[ADDSET_TC_SATURATION]);
|
||||
lcurve->setAdjusterBehavior (options.baBehav[ADDSET_LC_BRIGHTNESS], options.baBehav[ADDSET_LC_CONTRAST], options.baBehav[ADDSET_LC_CHROMATICITY]);
|
||||
whitebalance->setAdjusterBehavior (options.baBehav[ADDSET_WB_TEMPERATURE], options.baBehav[ADDSET_WB_GREEN]);
|
||||
whitebalance->setAdjusterBehavior (options.baBehav[ADDSET_WB_TEMPERATURE], options.baBehav[ADDSET_WB_GREEN], options.baBehav[ADDSET_WB_EQUAL]);
|
||||
vignetting->setAdjusterBehavior (options.baBehav[ADDSET_VIGN_AMOUNT], options.baBehav[ADDSET_VIGN_RADIUS], options.baBehav[ADDSET_VIGN_STRENGTH], options.baBehav[ADDSET_VIGN_CENTER]);
|
||||
colorappearance->setAdjusterBehavior (options.baBehav[ADDSET_CAT_DEGREE], options.baBehav[ADDSET_CAT_ADAPTSCENE], options.baBehav[ADDSET_CAT_ADAPTVIEWING],options.baBehav[ADDSET_CAT_BADPIX], options.baBehav[ADDSET_CAT_LIGHT], options.baBehav[ADDSET_CAT_CHROMA],options.baBehav[ADDSET_CAT_CONTRAST],options.baBehav[ADDSET_CAT_RSTPRO],options.baBehav[ADDSET_CAT_BRIGHT],options.baBehav[ADDSET_CAT_CONTRAST_Q],options.baBehav[ADDSET_CAT_CHROMA_S],options.baBehav[ADDSET_CAT_CHROMA_M],options.baBehav[ADDSET_CAT_HUE]);
|
||||
rotate->setAdjusterBehavior (options.baBehav[ADDSET_ROTATE_DEGREE]);
|
||||
@ -201,6 +201,7 @@ void BatchToolPanelCoordinator::initSession () {
|
||||
|
||||
if (options.baBehav[ADDSET_WB_TEMPERATURE]) pparams.wb.temperature = 0;
|
||||
if (options.baBehav[ADDSET_WB_GREEN]) pparams.wb.green = 0;
|
||||
if (options.baBehav[ADDSET_WB_EQUAL]) pparams.wb.equal = 0;
|
||||
|
||||
if (options.baBehav[ADDSET_VIBRANCE_PASTELS]) pparams.vibrance.pastels = 0;
|
||||
if (options.baBehav[ADDSET_VIBRANCE_SATURATED]) pparams.vibrance.saturated = 0;
|
||||
@ -314,10 +315,10 @@ void BatchToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const G
|
||||
paramcListeners[i]->procParamsChanged (&pparams, event, descr, &pparamsEdited);
|
||||
}
|
||||
|
||||
void BatchToolPanelCoordinator::getAutoWB (double& temp, double& green) {
|
||||
void BatchToolPanelCoordinator::getAutoWB (double& temp, double& green, double equal) {
|
||||
|
||||
if (!selected.empty())
|
||||
selected[0]->getAutoWB (temp, green);
|
||||
selected[0]->getAutoWB (temp, green, equal);
|
||||
}
|
||||
|
||||
void BatchToolPanelCoordinator::getCamWB (double& temp, double& green) {
|
||||
|
@ -60,7 +60,7 @@ class BatchToolPanelCoordinator :
|
||||
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);
|
||||
void getAutoWB (double& temp, double& green, double equal);
|
||||
void getCamWB (double& temp, double& green);
|
||||
|
||||
// thumbnaillistener interface
|
||||
|
@ -25,9 +25,12 @@
|
||||
|
||||
CacheImageData::CacheImageData ()
|
||||
: md5(""), supported(false), format(FT_Invalid), rankOld(-1), inTrashOld(false), recentlySaved(false),
|
||||
timeValid(false), exifValid(false), thumbImgType(0) {
|
||||
timeValid(false), exifValid(false), redAWBMul(-1.0), greenAWBMul(-1.0), blueAWBMul(-1.0), thumbImgType(0) {
|
||||
}
|
||||
|
||||
/*
|
||||
* Load the General, DateTime, ExifInfo, File info and ExtraRawInfo sections of the image data file
|
||||
*/
|
||||
int CacheImageData::load (const Glib::ustring& fname) {
|
||||
|
||||
rtengine::SafeKeyFile keyFile;
|
||||
@ -104,6 +107,9 @@ int CacheImageData::load (const Glib::ustring& fname) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save the General, DateTime, ExifInfo, File info and ExtraRawInfo sections of the image data file
|
||||
*/
|
||||
int CacheImageData::save (const Glib::ustring& fname) {
|
||||
|
||||
rtengine::SafeKeyFile keyFile;
|
||||
|
@ -56,6 +56,11 @@ class CacheImageData {
|
||||
Glib::ustring filetype;
|
||||
Glib::ustring expcomp;
|
||||
|
||||
// store a copy of the autoWB's multipliers computed in Thumbnail::_generateThumbnailImage
|
||||
// they are not stored in the cache file by this class, but by rtengine::Thumbnail
|
||||
// -1 = Unknown
|
||||
double redAWBMul, greenAWBMul, blueAWBMul;
|
||||
|
||||
// additional info on raw images
|
||||
int rotate;
|
||||
int thumbImgType;
|
||||
|
@ -423,6 +423,7 @@ void Options::setDefaults () {
|
||||
0, // ADDSET_CAT_JLIGHT
|
||||
0, // ADDSET_CAT_CHROMA
|
||||
0, // ADDSET_CAT_CONTRAST
|
||||
0, // ADDSET_WB_EQUAL
|
||||
|
||||
};
|
||||
baBehav = std::vector<int> (babehav, babehav+ADDSET_PARAM_NUM);
|
||||
@ -679,7 +680,6 @@ if (keyFile.has_group ("Color Management")) {
|
||||
if (keyFile.has_key ("Color Management", "MonitorProfile")) rtSettings.monitorProfile = keyFile.get_string ("Color Management", "MonitorProfile");
|
||||
if (keyFile.has_key ("Color Management", "AutoMonitorProfile")) rtSettings.autoMonitorProfile = keyFile.get_boolean ("Color Management", "AutoMonitorProfile");
|
||||
if (keyFile.has_key ("Color Management", "Autocielab")) rtSettings.autocielab = keyFile.get_boolean ("Color Management", "Autocielab");
|
||||
if (keyFile.has_key ("Color Management", "Ciencamfloat")) rtSettings.ciecamfloat = keyFile.get_boolean ("Color Management", "Ciecamfloat");
|
||||
if (keyFile.has_key ("Color Management", "RGBcurvesLumamode_Gamut")) rtSettings.rgbcurveslumamode_gamut = keyFile.get_boolean ("Color Management", "RGBcurvesLumamode_Gamut");
|
||||
|
||||
if (keyFile.has_key ("Color Management", "Intent")) rtSettings.colorimetricIntent = keyFile.get_integer("Color Management", "Intent");
|
||||
|
@ -133,6 +133,7 @@ void ParamsEdited::set (bool v) {
|
||||
wb.method = v;
|
||||
wb.green = v;
|
||||
wb.temperature = v;
|
||||
wb.equal = v;
|
||||
//colorShift.a = v;
|
||||
//colorShift.b = v;
|
||||
//lumaDenoise.enabled = v;
|
||||
@ -375,6 +376,7 @@ void ParamsEdited::initFrom (const std::vector<rtengine::procparams::ProcParams>
|
||||
//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.equal = wb.equal && p.wb.equal == other.wb.equal;
|
||||
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;
|
||||
@ -593,6 +595,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
|
||||
//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.equal) toEdit.wb.equal = dontforceSet && options.baBehav[ADDSET_WB_EQUAL] ? toEdit.wb.equal + mods.wb.equal : mods.wb.equal;
|
||||
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;
|
||||
|
@ -143,6 +143,7 @@ class WBParamsEdited {
|
||||
bool method;
|
||||
bool temperature;
|
||||
bool green;
|
||||
bool equal;
|
||||
};
|
||||
|
||||
/*class ColorShiftParamsEdited {
|
||||
|
@ -2,7 +2,7 @@
|
||||
#define _PPVERSION_
|
||||
|
||||
// This number have to be incremented whenever the PP3 file format is modified
|
||||
#define PPVERSION 308
|
||||
#define PPVERSION 309
|
||||
#define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified
|
||||
|
||||
/* Log of version changes
|
||||
|
@ -201,6 +201,7 @@ Gtk::Widget* Preferences::getBatchProcPanel () {
|
||||
mi->set_value (behavColumns.label, M("TP_WBALANCE_LABEL"));
|
||||
appendBehavList (mi, M("TP_WBALANCE_TEMPERATURE"), ADDSET_WB_TEMPERATURE, true);
|
||||
appendBehavList (mi, M("TP_WBALANCE_GREEN"), ADDSET_WB_GREEN, true);
|
||||
appendBehavList (mi, M("TP_WBALANCE_EQREDBLUE"), ADDSET_WB_EQUAL, true);
|
||||
|
||||
mi = behModel->append ();
|
||||
mi->set_value (behavColumns.label, M("TP_COLORAPP_LABEL"));
|
||||
|
@ -72,13 +72,13 @@ Thumbnail::Thumbnail (CacheManager* cm, const Glib::ustring& fname, const std::s
|
||||
|
||||
|
||||
cfs.md5 = md5;
|
||||
_generateThumbnailImage ();
|
||||
if (pparams) {
|
||||
this->pparams = *pparams;
|
||||
pparamsValid = true;
|
||||
}
|
||||
else
|
||||
loadProcParams ();
|
||||
_generateThumbnailImage ();
|
||||
cfs.recentlySaved = false;
|
||||
|
||||
initial_ = false;
|
||||
@ -107,17 +107,17 @@ void Thumbnail::_generateThumbnailImage () {
|
||||
cfs.timeValid = false;
|
||||
|
||||
if (ext.lowercase()=="jpg" || ext.lowercase()=="jpeg") {
|
||||
tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1);
|
||||
tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams.wb.equal);
|
||||
if (tpp)
|
||||
cfs.format = FT_Jpeg;
|
||||
}
|
||||
else if (ext.lowercase()=="png") {
|
||||
tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1);
|
||||
tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams.wb.equal);
|
||||
if (tpp)
|
||||
cfs.format = FT_Png;
|
||||
}
|
||||
else if (ext.lowercase()=="tif" || ext.lowercase()=="tiff") {
|
||||
tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1);
|
||||
tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams.wb.equal);
|
||||
if (tpp)
|
||||
cfs.format = FT_Tiff;
|
||||
}
|
||||
@ -136,7 +136,7 @@ void Thumbnail::_generateThumbnailImage () {
|
||||
if ( tpp == NULL )
|
||||
{
|
||||
quick = false;
|
||||
tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, tw, th, 1, TRUE);
|
||||
tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, tw, th, 1, pparams.wb.equal, TRUE);
|
||||
}
|
||||
if (tpp) {
|
||||
cfs.format = FT_Raw;
|
||||
@ -147,6 +147,7 @@ void Thumbnail::_generateThumbnailImage () {
|
||||
|
||||
if (tpp)
|
||||
{
|
||||
tpp->getAutoWBMultipliers(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul);
|
||||
_saveThumbnail ();
|
||||
cfs.supported = true;
|
||||
needsReProcessing = true;
|
||||
@ -178,7 +179,7 @@ const ProcParams& Thumbnail::getProcParams () {
|
||||
}
|
||||
else if (pparams.wb.method=="Auto") {
|
||||
double ct;
|
||||
getAutoWB (ct, pparams.wb.green);
|
||||
getAutoWB (ct, pparams.wb.green, pparams.wb.equal);
|
||||
pparams.wb.temperature = ct;
|
||||
}
|
||||
}
|
||||
@ -558,6 +559,17 @@ const Glib::ustring& Thumbnail::getDateTimeString () {
|
||||
return dateTimeString;
|
||||
}
|
||||
|
||||
void Thumbnail::getAutoWB (double& temp, double& green, double equal) {
|
||||
if (cfs.redAWBMul != -1.0) {
|
||||
rtengine::ColorTemp ct(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul, equal);
|
||||
temp = ct.getTemp();
|
||||
green = ct.getGreen();
|
||||
}
|
||||
else
|
||||
temp = green = -1.0;
|
||||
}
|
||||
|
||||
|
||||
ThFileType Thumbnail::getType () {
|
||||
|
||||
return (ThFileType) cfs.format;
|
||||
@ -615,6 +627,14 @@ int Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataL
|
||||
return deg;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read all thumbnail's data from the cache; build and save them if doesn't exist - NON PROTECTED
|
||||
* This includes:
|
||||
* - image's bitmap (*.rtti)
|
||||
* - auto exposure's histogram (full thumbnail only)
|
||||
* - embedded profile (full thumbnail only)
|
||||
* - LiveThumbData section of the data file
|
||||
*/
|
||||
void Thumbnail::_loadThumbnail(bool firstTrial) {
|
||||
|
||||
needsReProcessing = true;
|
||||
@ -627,6 +647,9 @@ void Thumbnail::_loadThumbnail(bool firstTrial) {
|
||||
// load supplementary data
|
||||
bool succ = tpp->readData (getCacheFileName ("data")+".txt");
|
||||
|
||||
if (succ)
|
||||
tpp->getAutoWBMultipliers(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul);
|
||||
|
||||
// thumbnail image
|
||||
succ = succ && tpp->readImage (getCacheFileName ("images"));
|
||||
|
||||
@ -656,11 +679,27 @@ void Thumbnail::_loadThumbnail(bool firstTrial) {
|
||||
if (!initial_ && tpp) tw = tpp->getImageWidth (getProcParams(), th, imgRatio); // this might return 0 if image was just building
|
||||
}
|
||||
|
||||
/*
|
||||
* Read all thumbnail's data from the cache; build and save them if doesn't exist - MUTEX PROTECTED
|
||||
* This includes:
|
||||
* - image's bitmap (*.rtti)
|
||||
* - auto exposure's histogram (full thumbnail only)
|
||||
* - embedded profile (full thumbnail only)
|
||||
* - LiveThumbData section of the data file
|
||||
*/
|
||||
void Thumbnail::loadThumbnail (bool firstTrial) {
|
||||
Glib::Mutex::Lock lock(mutex);
|
||||
_loadThumbnail(firstTrial);
|
||||
}
|
||||
|
||||
/*
|
||||
* Save thumbnail's data to the cache - NON PROTECTED
|
||||
* This includes:
|
||||
* - image's bitmap (*.rtti)
|
||||
* - auto exposure's histogram (full thumbnail only)
|
||||
* - embedded profile (full thumbnail only)
|
||||
* - LiveThumbData section of the data file
|
||||
*/
|
||||
void Thumbnail::_saveThumbnail () {
|
||||
|
||||
if (!tpp)
|
||||
@ -686,12 +725,26 @@ void Thumbnail::_saveThumbnail () {
|
||||
tpp->writeData (getCacheFileName ("data")+".txt");
|
||||
}
|
||||
|
||||
/*
|
||||
* Save thumbnail's data to the cache - MUTEX PROTECTED
|
||||
* This includes:
|
||||
* - image's bitmap (*.rtti)
|
||||
* - auto exposure's histogram (full thumbnail only)
|
||||
* - embedded profile (full thumbnail only)
|
||||
* - LiveThumbData section of the data file
|
||||
*/
|
||||
void Thumbnail::saveThumbnail ()
|
||||
{
|
||||
Glib::Mutex::Lock lock(mutex);
|
||||
_saveThumbnail();
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the cached files
|
||||
* - updatePParams==true (default) : write the procparams file (sidecar or cache, depending on the options)
|
||||
* - updateCacheImageData==true (default) : write the CacheImageData values in the cache folder,
|
||||
* i.e. some General, DateTime, ExifInfo, File info and ExtraRawInfo,
|
||||
*/
|
||||
void Thumbnail::updateCache (bool updatePParams, bool updateCacheImageData) {
|
||||
|
||||
if (updatePParams && pparamsValid) {
|
||||
|
@ -109,7 +109,7 @@ class Thumbnail {
|
||||
const Glib::ustring& getExifString ();
|
||||
const Glib::ustring& getDateTimeString ();
|
||||
void getCamWB (double& temp, double& green) { if (tpp) tpp->getCamWB (temp, green); else temp = green = -1.0; }
|
||||
void getAutoWB (double& temp, double& green) { if (tpp) tpp->getAutoWB (temp, green); else temp = green = -1.0; }
|
||||
void getAutoWB (double& temp, double& green, double equal);
|
||||
void getSpotWB (int x, int y, int rect, double& temp, double& green) { if (tpp) tpp->getSpotWB (getProcParams(), x, y, rect, temp, green); else temp = green = -1.0; }
|
||||
void applyAutoExp (rtengine::procparams::ProcParams& pparams) { if (tpp) tpp->applyAutoExp (pparams); }
|
||||
|
||||
|
@ -204,7 +204,10 @@ class ToolPanelCoordinator : public ToolPanelListener,
|
||||
void writeOptions ();
|
||||
|
||||
// wbprovider interface
|
||||
void getAutoWB (double& temp, double& green) { if (ipc) ipc->getAutoWB (temp, green); }
|
||||
void getAutoWB (double& temp, double& green, double equal) {
|
||||
if (ipc)
|
||||
ipc->getAutoWB (temp, green, equal);
|
||||
}
|
||||
void getCamWB (double& temp, double& green) { if (ipc) ipc->getCamWB (temp, green); }
|
||||
|
||||
//DFProvider interface
|
||||
|
@ -23,7 +23,8 @@
|
||||
class WBProvider {
|
||||
|
||||
public:
|
||||
virtual void getAutoWB (double& temp, double& green) {}
|
||||
virtual ~WBProvider() {}
|
||||
virtual void getAutoWB (double& temp, double& green, double equal) {}
|
||||
virtual void getCamWB (double& temp, double& green) {}
|
||||
virtual void spotWBRequested (int size) {}
|
||||
};
|
||||
|
@ -22,12 +22,12 @@
|
||||
#include "options.h"
|
||||
#include "../rtengine/safegtk.h"
|
||||
|
||||
#define MINTEMP 2000 //1200
|
||||
#define MAXTEMP 25000 //12000
|
||||
#define MINTEMP 1500 //1200
|
||||
#define MAXTEMP 60000 //12000
|
||||
#define MINGREEN 0.02
|
||||
#define MAXGREEN 5.0
|
||||
|
||||
extern Glib::ustring argv0;
|
||||
#define MINEQUAL 0.8
|
||||
#define MAXEQUAL 1.5
|
||||
|
||||
using namespace rtengine;
|
||||
using namespace rtengine::procparams;
|
||||
@ -45,6 +45,8 @@ void WhiteBalance::init () {
|
||||
wbPixbufs[WBT_DAYLIGHT] = safe_create_from_file("wb-sun.png");
|
||||
wbPixbufs[WBT_CLOUDY] = safe_create_from_file("wb-cloudy.png");
|
||||
wbPixbufs[WBT_SHADE] = safe_create_from_file("wb-shade.png");
|
||||
wbPixbufs[WBT_WATER] = safe_create_from_file("wb-water.png");
|
||||
// wbPixbufs[WBT_WATER2] = safe_create_from_file("wb-water.png");
|
||||
wbPixbufs[WBT_TUNGSTEN] = safe_create_from_file("wb-tungsten.png");
|
||||
wbPixbufs[WBT_FLUORESCENT] = safe_create_from_file("wb-fluorescent.png");
|
||||
wbPixbufs[WBT_LAMP] = safe_create_from_file("wb-lamp.png");
|
||||
@ -75,7 +77,6 @@ WhiteBalance::WhiteBalance () : Gtk::VBox(), FoldableToolPanel(this), wbp(NULL),
|
||||
// Assign the model to the Combobox
|
||||
method->set_model(refTreeModel);
|
||||
|
||||
custom_green = new double[WBParams::wbEntries.size()];
|
||||
enum WBTypes oldType = WBParams::wbEntries[0]->type;
|
||||
enum WBTypes currType;
|
||||
Gtk::TreeModel::Row row, childrow;
|
||||
@ -89,6 +90,13 @@ WhiteBalance::WhiteBalance () : Gtk::VBox(), FoldableToolPanel(this), wbp(NULL),
|
||||
row[methodColumns.colLabel] = M("TP_WBALANCE_FLUO_HEADER");
|
||||
row[methodColumns.colId] = i+100;
|
||||
}
|
||||
if (currType == WBT_WATER) {
|
||||
// Creating the under water subcategory header
|
||||
row = *(refTreeModel->append());
|
||||
row[methodColumns.colIcon] = wbPixbufs[currType];
|
||||
row[methodColumns.colLabel] = M("TP_WBALANCE_WATER_HEADER");
|
||||
row[methodColumns.colId] = i+100;
|
||||
}
|
||||
if (currType == WBT_LAMP) {
|
||||
// Creating the Lamp subcategory header
|
||||
row = *(refTreeModel->append());
|
||||
@ -113,6 +121,7 @@ WhiteBalance::WhiteBalance () : Gtk::VBox(), FoldableToolPanel(this), wbp(NULL),
|
||||
}
|
||||
if (currType == WBT_FLUORESCENT
|
||||
|| currType == WBT_LAMP
|
||||
|| currType == WBT_WATER
|
||||
|| currType == WBT_FLASH
|
||||
|| currType == WBT_LED
|
||||
) {
|
||||
@ -129,7 +138,8 @@ WhiteBalance::WhiteBalance () : Gtk::VBox(), FoldableToolPanel(this), wbp(NULL),
|
||||
}
|
||||
oldType = currType;
|
||||
|
||||
custom_green[i] = 1.0;
|
||||
custom_green = 1.0;
|
||||
custom_equal = 1.0;
|
||||
}
|
||||
|
||||
//Add the model columns to the Combo (which is a kind of view),
|
||||
@ -173,29 +183,30 @@ WhiteBalance::WhiteBalance () : Gtk::VBox(), FoldableToolPanel(this), wbp(NULL),
|
||||
|
||||
temp = Gtk::manage (new Adjuster (M("TP_WBALANCE_TEMPERATURE"), MINTEMP, MAXTEMP, 5, 4750));
|
||||
green = Gtk::manage (new Adjuster (M("TP_WBALANCE_GREEN"), MINGREEN, MAXGREEN, 0.001, 1.0));
|
||||
equal = Gtk::manage (new Adjuster (M("TP_WBALANCE_EQBLUERED"), MINEQUAL, MAXEQUAL, 0.001, 1.0));
|
||||
equal->set_tooltip_markup (M("TP_WBALANCE_EQBLUERED_TOOLTIP"));
|
||||
temp->show ();
|
||||
green->show ();
|
||||
equal->show ();
|
||||
|
||||
pack_start (*temp);
|
||||
pack_start (*green);
|
||||
pack_start (*equal);
|
||||
|
||||
temp->setAdjusterListener (this);
|
||||
green->setAdjusterListener (this);
|
||||
equal->setAdjusterListener (this);
|
||||
|
||||
spotbutton->signal_pressed().connect( sigc::mem_fun(*this, &WhiteBalance::spotPressed) );
|
||||
methconn = method->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::optChanged) );
|
||||
spotsize->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::spotSizeChanged) );
|
||||
}
|
||||
|
||||
WhiteBalance::~WhiteBalance () {
|
||||
delete[] custom_green;
|
||||
}
|
||||
|
||||
void WhiteBalance::adjusterChanged (Adjuster* a, double newval) {
|
||||
|
||||
int tVal = (int)temp->getValue();
|
||||
double gVal = green->getValue();
|
||||
|
||||
double eVal = equal->getValue();
|
||||
Gtk::TreeModel::Row row = getActiveMethod();
|
||||
if (row == refTreeModel->children().end()) return;
|
||||
|
||||
@ -203,25 +214,42 @@ void WhiteBalance::adjusterChanged (Adjuster* a, double newval) {
|
||||
WBEntry* ppMethod = findWBEntry (row[methodColumns.colLabel], WBLT_GUI);
|
||||
WBEntry* wbCustom = findWBEntry ("Custom", WBLT_PP);
|
||||
|
||||
if (!ppMethod || ppMethod->ppLabel != wbCustom->ppLabel) {
|
||||
if (!ppMethod || a==temp || (ppMethod->type==WBT_CAMERA || ppMethod->type==WBT_AUTO) ) {
|
||||
if (!ppMethod || (ppMethod->ppLabel!=wbCustom->ppLabel && !(a==equal && ppMethod->type==WBT_AUTO)) ) {
|
||||
methconn.block(true);
|
||||
opt = setActiveMethod(wbCustom->GUILabel);
|
||||
cache_customWB (tVal, gVal);
|
||||
cache_customEqual(eVal);
|
||||
methconn.block(false);
|
||||
}
|
||||
}
|
||||
|
||||
//cache custom WB setting to allow its recall
|
||||
if (a==temp)
|
||||
cache_customTemp (tVal);
|
||||
else
|
||||
else if (a==green)
|
||||
cache_customGreen (gVal);
|
||||
else if (a==equal) {
|
||||
cache_customEqual (eVal);
|
||||
// Recomputing AutoWB if it's the current method
|
||||
if (wbp && ppMethod->type==WBT_AUTO) {
|
||||
double ctemp=-1.0; double cgreen=-1.0;
|
||||
wbp->getAutoWB (ctemp, cgreen, eVal);
|
||||
|
||||
if (ctemp != -1.0) {
|
||||
// Set the automatics temperature value only if in SET mode
|
||||
if (temp->getEditedState() && !temp->getAddMode() ) temp->setValue (ctemp);
|
||||
// Set the automatics green value only if in SET mode
|
||||
if (green->getEditedState() && !green->getAddMode()) green->setValue (cgreen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (listener) {
|
||||
if (a==temp)
|
||||
listener->panelChanged (EvWBTemp, Glib::ustring::format ((int)a->getValue()));
|
||||
else if (a==green)
|
||||
listener->panelChanged (EvWBGreen, Glib::ustring::format (std::setw(4), std::fixed, std::setprecision(3), a->getValue()));
|
||||
else if (a==equal)
|
||||
listener->panelChanged (EvWBequal, Glib::ustring::format (std::setw(4), std::fixed, std::setprecision(3), a->getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -244,6 +272,7 @@ void WhiteBalance::optChanged () {
|
||||
if (row[methodColumns.colLabel] == M("GENERAL_UNCHANGED")) {
|
||||
temp->setEditedState (UnEdited);
|
||||
green->setEditedState (UnEdited);
|
||||
equal->setEditedState (UnEdited);
|
||||
}
|
||||
else {
|
||||
int methodId = findWBEntryId (row[methodColumns.colLabel], WBLT_GUI);
|
||||
@ -256,23 +285,28 @@ void WhiteBalance::optChanged () {
|
||||
wbp->getCamWB (ctemp, cgreen);
|
||||
temp->setValue (temp->getAddMode() ? 0.0 : (int)ctemp);
|
||||
green->setValue (green->getAddMode() ? 0.0 : cgreen);
|
||||
equal->setValue (equal->getAddMode() ? 0.0 : 1.0);
|
||||
if (batchMode) {
|
||||
temp->setEditedState (UnEdited);
|
||||
green->setEditedState (UnEdited);
|
||||
equal->setEditedState (UnEdited);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WBT_AUTO:
|
||||
if (wbp) {
|
||||
if (batchMode) {
|
||||
temp->setEditedState (UnEdited);
|
||||
green->setEditedState (UnEdited);
|
||||
// equal remain as is
|
||||
}
|
||||
if (!batchMode || equal->getEditedState()) {
|
||||
double ctemp, cgreen;
|
||||
wbp->getAutoWB (ctemp, cgreen);
|
||||
wbp->getAutoWB (ctemp, cgreen, equal->getValue());
|
||||
if (ctemp != -1.0) {
|
||||
temp->setValue (temp->getAddMode() ? 0.0 : (int)ctemp);
|
||||
green->setValue (green->getAddMode() ? 0.0 : cgreen);
|
||||
}
|
||||
if (batchMode) {
|
||||
temp->setEditedState (UnEdited);
|
||||
green->setEditedState (UnEdited);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -280,10 +314,12 @@ void WhiteBalance::optChanged () {
|
||||
if (custom_temp>0){
|
||||
temp->setValue (temp->getAddMode() ? 0.0 : custom_temp);
|
||||
}
|
||||
green->setValue (green->getAddMode() ? 0.0 : custom_green[methodId]);
|
||||
green->setValue (green->getAddMode() ? 0.0 : custom_green);
|
||||
equal->setValue (equal->getAddMode() ? 0.0 : custom_equal);
|
||||
if (batchMode) {
|
||||
temp->setEditedState (Edited);
|
||||
green->setEditedState (Edited);
|
||||
equal->setEditedState (Edited);
|
||||
}
|
||||
break;
|
||||
/* All other solution are the default cases
|
||||
@ -297,11 +333,13 @@ void WhiteBalance::optChanged () {
|
||||
case WBT_LED:*/
|
||||
default:
|
||||
// recall custom WB settings if it exists, set to 1.0 otherwise
|
||||
temp->setValue (temp->getAddMode() ? 0.0 : (double)(currMethod->temperature));
|
||||
green->setValue (green->getAddMode() ? 0.0 : custom_green[methodId]);
|
||||
temp->setValue ( temp->getAddMode() ? 0.0 : (double)(currMethod->temperature));
|
||||
green->setValue (green->getAddMode() ? 0.0 : (double)(currMethod->green));
|
||||
equal->setValue (equal->getAddMode() ? 0.0 : (double)(currMethod->equal));
|
||||
if (batchMode) {
|
||||
temp->setEditedState (Edited);
|
||||
green->setEditedState (Edited);
|
||||
equal->setEditedState (Edited);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -326,13 +364,16 @@ void WhiteBalance::spotSizeChanged () {
|
||||
}
|
||||
|
||||
void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) {
|
||||
disableListener ();
|
||||
|
||||
methconn.block (true);
|
||||
equal->setValue (pp->wb.equal);
|
||||
|
||||
if (pedited) {
|
||||
// By default, temperature and green are said "UnEdited", but it may change later
|
||||
temp->setEditedState (UnEdited);
|
||||
green->setEditedState (UnEdited);
|
||||
equal->setEditedState (pedited->wb.equal ? Edited : UnEdited);
|
||||
}
|
||||
|
||||
if (pedited && !pedited->wb.method) {
|
||||
@ -350,12 +391,12 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) {
|
||||
case WBT_CUSTOM:
|
||||
temp->setValue (pp->wb.temperature);
|
||||
green->setValue (pp->wb.green);
|
||||
equal->setValue (pp->wb.equal);
|
||||
if (pedited) {
|
||||
// The user may have changed the temperature and green value
|
||||
temp->setEditedState (pedited->wb.temperature ? Edited : UnEdited);
|
||||
green->setEditedState (pedited->wb.green ? Edited : UnEdited);
|
||||
}
|
||||
//cache_customWB (pp->wb.temperature, pp->wb.green);
|
||||
break;
|
||||
case WBT_CAMERA:
|
||||
if (wbp) {
|
||||
@ -366,23 +407,34 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) {
|
||||
temp->setValue (temp->getAddMode() ? 0.0 : ctemp);
|
||||
// Set the camera's green value, or 0.0 if in ADD mode
|
||||
green->setValue (green->getAddMode() ? 0.0 : cgreen);
|
||||
|
||||
//cache_customWB ((int)ctemp, cgreen); // this will be used to set initial Custom WB setting
|
||||
equal->setValue (equal->getAddMode() ? 0.0 : 1.);
|
||||
}
|
||||
break;
|
||||
case WBT_AUTO:
|
||||
// the equalizer's value is restored for the AutoWB
|
||||
equal->setValue (equal->getAddMode() ? 0.0 : pp->wb.equal);
|
||||
|
||||
// set default values first if in ADD mode, otherwise keep the current ones
|
||||
if (temp->getAddMode() ) temp->setValue (0.0);
|
||||
if (green->getAddMode()) green->setValue (0.0);
|
||||
|
||||
// then check for the correct ones, if possible
|
||||
if (wbp) {
|
||||
double ctemp; double cgreen;
|
||||
wbp->getAutoWB (ctemp, cgreen);
|
||||
double ctemp=-1.0; double cgreen=-1.0;
|
||||
wbp->getAutoWB (ctemp, cgreen, pp->wb.equal);
|
||||
|
||||
if (ctemp != -1.0) {
|
||||
// Set the automatics temperature value, or 0.0 if in ADD mode
|
||||
temp->setValue (temp->getAddMode() ? 0.0 : ctemp);
|
||||
// Set the automatics green value, or 0.0 if in ADD mode
|
||||
green->setValue (green->getAddMode() ? 0.0 : cgreen);
|
||||
// Set the automatics temperature if in SET mode
|
||||
if (!pedited || (pedited->wb.temperature && !temp->getAddMode()) ) {
|
||||
temp->setValue (ctemp);
|
||||
if (pedited) temp->setEditedState (Edited);
|
||||
}
|
||||
// Set the automatics green value if in SET mode
|
||||
if (!pedited || (pedited->wb.green && !green->getAddMode())) {
|
||||
green->setValue (cgreen);
|
||||
if (pedited) green->setEditedState (Edited);
|
||||
}
|
||||
}
|
||||
|
||||
//cache_customWB ((int)ctemp, cgreen); // this will be used to set initial Custom WB setting
|
||||
}
|
||||
break;
|
||||
/*
|
||||
@ -401,16 +453,19 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) {
|
||||
temp->setValue(temp->getAddMode() ? 0.0 : (double)wbValues->temperature);
|
||||
// Set the stored temperature, or 0.0 if in ADD mode
|
||||
green->setValue(green->getAddMode() ? 0.0 : pp->wb.green);
|
||||
equal->setValue(equal->getAddMode() ? 0.0 : pp->wb.equal);
|
||||
|
||||
// The user may have changed the green value even for predefined WB values
|
||||
if (pedited) {
|
||||
green->setEditedState (pedited->wb.green ? Edited : UnEdited);
|
||||
equal->setEditedState (pedited->wb.equal ? Edited : UnEdited);
|
||||
}
|
||||
//cache_customGreen (pp->wb.green);
|
||||
break;
|
||||
}
|
||||
}
|
||||
methconn.block (false);
|
||||
enableListener ();
|
||||
}
|
||||
|
||||
void WhiteBalance::write (ProcParams* pp, ParamsEdited* pedited) {
|
||||
@ -420,6 +475,7 @@ void WhiteBalance::write (ProcParams* pp, ParamsEdited* pedited) {
|
||||
if (pedited) {
|
||||
pedited->wb.temperature = temp->getEditedState ();
|
||||
pedited->wb.green = green->getEditedState ();
|
||||
pedited->wb.equal = equal->getEditedState ();
|
||||
pedited->wb.method = row[methodColumns.colLabel]!=M("GENERAL_UNCHANGED");
|
||||
}
|
||||
|
||||
@ -429,10 +485,11 @@ void WhiteBalance::write (ProcParams* pp, ParamsEdited* pedited) {
|
||||
pp->wb.method = ppMethod->ppLabel;
|
||||
pp->wb.temperature = temp->getIntValue ();
|
||||
pp->wb.green = green->getValue ();
|
||||
|
||||
pp->wb.equal = equal->getValue ();
|
||||
}
|
||||
|
||||
void WhiteBalance::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) {
|
||||
equal->setDefault (defParams->wb.equal);
|
||||
|
||||
if (wbp && defParams->wb.method == "Camera") {
|
||||
double ctemp; double cgreen;
|
||||
@ -444,7 +501,7 @@ void WhiteBalance::setDefaults (const ProcParams* defParams, const ParamsEdited*
|
||||
// this setDefaults method is called too early ; the wbp has been set,
|
||||
// but wbp is not ready to provide!
|
||||
double ctemp; double cgreen;
|
||||
wbp->getAutoWB (ctemp, cgreen);
|
||||
wbp->getAutoWB (ctemp, cgreen, defParams->wb.equal);
|
||||
if (ctemp != -1.0) {
|
||||
temp->setDefault (temp->getAddMode() ? 0 : (int)ctemp);
|
||||
green->setDefault (green->getAddMode() ? 0 : cgreen);
|
||||
@ -462,10 +519,12 @@ void WhiteBalance::setDefaults (const ProcParams* defParams, const ParamsEdited*
|
||||
if (pedited) {
|
||||
temp->setDefaultEditedState (pedited->wb.temperature ? Edited : UnEdited);
|
||||
green->setDefaultEditedState (pedited->wb.green ? Edited : UnEdited);
|
||||
equal->setDefaultEditedState (pedited->wb.equal ? Edited : UnEdited);
|
||||
}
|
||||
else {
|
||||
temp->setDefaultEditedState (Irrelevant);
|
||||
green->setDefaultEditedState (Irrelevant);
|
||||
equal->setDefaultEditedState (Irrelevant);
|
||||
}
|
||||
}
|
||||
|
||||
@ -474,6 +533,7 @@ void WhiteBalance::setBatchMode (bool batchMode) {
|
||||
ToolPanel::setBatchMode (batchMode);
|
||||
temp->showEditedCB ();
|
||||
green->showEditedCB ();
|
||||
equal->showEditedCB ();
|
||||
Gtk::TreeModel::Row row = *(refTreeModel->append());
|
||||
row[methodColumns.colId] = WBParams::wbEntries.size();
|
||||
row[methodColumns.colLabel] = M("GENERAL_UNCHANGED");
|
||||
@ -493,6 +553,7 @@ void WhiteBalance::setWB (int vtemp, double vgreen) {
|
||||
green->setValue (vgreen);
|
||||
opt = setActiveMethod(wbValues->GUILabel);
|
||||
cache_customWB (vtemp,vgreen); // sequence in which this call is made is important; must be before "method->set_active (2);"
|
||||
cache_customEqual(equal->getValue());
|
||||
temp->setEditedState (Edited);
|
||||
green->setEditedState (Edited);
|
||||
methconn.block(false);
|
||||
@ -501,16 +562,18 @@ void WhiteBalance::setWB (int vtemp, double vgreen) {
|
||||
listener->panelChanged (EvWBTemp, Glib::ustring::compose("%1, %2", (int)temp->getValue(), Glib::ustring::format (std::setw(4), std::fixed, std::setprecision(3), green->getValue())));
|
||||
}
|
||||
|
||||
void WhiteBalance::setAdjusterBehavior (bool tempadd, bool greenadd) {
|
||||
void WhiteBalance::setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd) {
|
||||
|
||||
temp->setAddMode(tempadd);
|
||||
green->setAddMode(greenadd);
|
||||
equal->setAddMode(equaladd);
|
||||
}
|
||||
|
||||
void WhiteBalance::trimValues (rtengine::procparams::ProcParams* pp) {
|
||||
|
||||
temp->trimValue(pp->wb.temperature);
|
||||
green->trimValue(pp->wb.green);
|
||||
equal->trimValue(pp->wb.equal);
|
||||
}
|
||||
|
||||
inline void WhiteBalance::cache_customTemp(int temp) {
|
||||
@ -518,11 +581,10 @@ inline void WhiteBalance::cache_customTemp(int temp) {
|
||||
}
|
||||
|
||||
void WhiteBalance::cache_customGreen(double green) {
|
||||
Gtk::TreeModel::Row row = getActiveMethod();
|
||||
if (row == refTreeModel->children().end()) return;
|
||||
|
||||
custom_green[row[methodColumns.colId]] = green;
|
||||
//printf("WhiteBalance::cache_customWB(%d, %f): the \"green\" value of \"%s\" has been set to: %f\n", temp, green, row[methodColumns.colLabel], custom_green[row[methodColumns.colId]]);
|
||||
custom_green = green;
|
||||
}
|
||||
void WhiteBalance::cache_customEqual(double equal) {
|
||||
custom_equal = equal;
|
||||
}
|
||||
|
||||
void WhiteBalance::cache_customWB(int temp, double green) {
|
||||
|
@ -55,18 +55,23 @@ class WhiteBalance : public Gtk::VBox, public AdjusterListener, public FoldableT
|
||||
MyComboBoxText* spotsize;
|
||||
Adjuster* temp;
|
||||
Adjuster* green;
|
||||
Adjuster* equal;
|
||||
|
||||
Gtk::Button* spotbutton;
|
||||
int opt;
|
||||
double nextTemp;
|
||||
double nextGreen;
|
||||
WBProvider *wbp;
|
||||
WBProvider *wbp; // pointer to a ToolPanelCoordinator object, or its subclass BatchToolPanelCoordinator
|
||||
SpotWBListener* wblistener;
|
||||
sigc::connection methconn;
|
||||
int custom_temp;
|
||||
double* custom_green;
|
||||
double custom_green;
|
||||
double custom_equal;
|
||||
void cache_customWB (int temp, double green); //cache custom WB setting to allow its recall
|
||||
void cache_customTemp (int temp); //cache Temperature only to allow its recall
|
||||
void cache_customGreen (double green); //cache Green only to allow its recall
|
||||
void cache_customEqual (double equal); //cache Equal only to allow its recall
|
||||
|
||||
int setActiveMethod (Glib::ustring label);
|
||||
int _setActiveMethod (Glib::ustring &label, Gtk::TreeModel::Children &children);
|
||||
|
||||
@ -77,7 +82,7 @@ class WhiteBalance : public Gtk::VBox, public AdjusterListener, public FoldableT
|
||||
public:
|
||||
|
||||
WhiteBalance ();
|
||||
~WhiteBalance ();
|
||||
~WhiteBalance () {};
|
||||
|
||||
static void init ();
|
||||
static void cleanup ();
|
||||
@ -86,7 +91,6 @@ class WhiteBalance : public Gtk::VBox, public AdjusterListener, public FoldableT
|
||||
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL);
|
||||
void setBatchMode (bool batchMode);
|
||||
|
||||
|
||||
void optChanged ();
|
||||
void spotPressed ();
|
||||
void spotSizeChanged ();
|
||||
@ -96,7 +100,7 @@ class WhiteBalance : public Gtk::VBox, public AdjusterListener, public FoldableT
|
||||
void setSpotWBListener (SpotWBListener* l) { wblistener = l; }
|
||||
void setWB (int temp, double green);
|
||||
|
||||
void setAdjusterBehavior (bool tempadd, bool greenadd);
|
||||
void setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd);
|
||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||
};
|
||||
|
||||
|
1
tools/source_icons/scalable/wb-water.file
Normal file
1
tools/source_icons/scalable/wb-water.file
Normal file
@ -0,0 +1 @@
|
||||
wb-water.png,w22,actions
|
642
tools/source_icons/scalable/wb-water.svg
Normal file
642
tools/source_icons/scalable/wb-water.svg
Normal file
@ -0,0 +1,642 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1000"
|
||||
height="1000"
|
||||
id="svg2"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.3.1 r9886"
|
||||
sodipodi:docname="wb-water.svg"
|
||||
inkscape:export-filename="/home/philippe/devel/rawtherapee/icons/NewIcons/undo.png"
|
||||
inkscape:export-xdpi="1.98"
|
||||
inkscape:export-ydpi="1.98"
|
||||
version="1.1"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<defs
|
||||
id="defs4">
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect3985"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect3004"
|
||||
is_visible="true" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 36 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="72 : 36 : 1"
|
||||
inkscape:persp3d-origin="36 : 24 : 1"
|
||||
id="perspective21" />
|
||||
<inkscape:perspective
|
||||
id="perspective3614"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3636"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3658"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680-0"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3680-8"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3720"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-2"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-26"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-0"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3742-1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3836"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2861"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2871"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2906"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2883"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2953"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2896"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2918"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2940"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2962"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2988"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3015"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3037"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3059"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2898"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3891"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3925"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3947"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3969"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3999"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4021"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4043"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4065"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4087"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4109"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4145"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4167"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4196"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4234"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4315"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4349"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4377"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4428"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4450"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4489"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4511"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4542"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4567"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective6780"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
y2="24.514456"
|
||||
x2="253.59492"
|
||||
y1="24.514456"
|
||||
x1="-213.56367"
|
||||
gradientTransform="matrix(0,1,-1,0,44.530081,4.498828)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient8562"
|
||||
xlink:href="#linearGradient3641"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3641">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3643" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3645" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="24.514456"
|
||||
x2="253.59492"
|
||||
y1="24.514456"
|
||||
x1="-213.56367"
|
||||
gradientTransform="matrix(0,1,-1,0,44.530081,4.498828)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient6791"
|
||||
xlink:href="#linearGradient3641"
|
||||
inkscape:collect="always" />
|
||||
<inkscape:perspective
|
||||
id="perspective6824"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641"
|
||||
id="linearGradient7354"
|
||||
x1="-1.8872025"
|
||||
y1="-163.78828"
|
||||
x2="323.8822"
|
||||
y2="-163.78828"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-294.13778,123.54099)" />
|
||||
<inkscape:perspective
|
||||
id="perspective2897"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2971"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3048"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective3829"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641-8"
|
||||
id="linearGradient6901"
|
||||
x1="-203.3125"
|
||||
y1="30.71875"
|
||||
x2="263.34375"
|
||||
y2="30.71875"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3641-8">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3643-7" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3645-1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="30.71875"
|
||||
x2="263.34375"
|
||||
y1="30.71875"
|
||||
x1="-203.3125"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient3843"
|
||||
xlink:href="#linearGradient3641-8"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641-8"
|
||||
id="linearGradient3875"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-203.3125"
|
||||
y1="30.71875"
|
||||
x2="263.34375"
|
||||
y2="30.71875"
|
||||
gradientTransform="translate(-708.90407,-377.00114)" />
|
||||
<inkscape:perspective
|
||||
id="perspective3890"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective4696"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641"
|
||||
id="linearGradient4760"
|
||||
x1="-1013.6239"
|
||||
y1="-111.86127"
|
||||
x2="-820.68811"
|
||||
y2="-111.86127"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641"
|
||||
id="linearGradient4774"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-1013.6239"
|
||||
y1="-111.86127"
|
||||
x2="-820.68811"
|
||||
y2="-111.86127" />
|
||||
<inkscape:perspective
|
||||
id="perspective2828"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective5789"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641"
|
||||
id="linearGradient6343"
|
||||
x1="-234.53125"
|
||||
y1="-27.459608"
|
||||
x2="294.99518"
|
||||
y2="-27.459608"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641"
|
||||
id="linearGradient10531"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-234.53125"
|
||||
y1="-27.459608"
|
||||
x2="294.99518"
|
||||
y2="-27.459608" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3641"
|
||||
id="linearGradient10536"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-1013.6239"
|
||||
y1="-111.86127"
|
||||
x2="-820.68811"
|
||||
y2="-111.86127" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.16"
|
||||
inkscape:cx="628.96572"
|
||||
inkscape:cy="798.91319"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1018"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
showgrid="true"
|
||||
showborder="true"
|
||||
inkscape:showpageshadow="true"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Fond"
|
||||
style="display:inline" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(464.16179,464.03236)"
|
||||
style="opacity:1;display:inline">
|
||||
<path
|
||||
style="opacity:0.7;fill:#2a7fff;fill-opacity:1;stroke:none"
|
||||
d="M 262.15941,239.59156 C 162.24771,155.40271 92.003396,186.80714 0,254.0625 L 0,1000 l 1000,0 0,-709.8125 C 878.52924,337.68769 909.97864,210.8708 789.9662,200.12051 708.67062,192.83834 635.54791,259.33371 483.90589,314.0108 311.12683,376.3092 345.17325,309.54173 262.15941,239.59156 z M 128.46875,474.96875 c 76.97828,18.9384 127.65131,90.27078 195.81135,166.58987 78.0589,-94.59916 186.09972,-139.4563 283.25355,-140.25593 101.30694,-0.83383 227.51155,23.2664 308.2476,145.59667 C 839.46802,751.25673 734.85686,795.58412 607.53365,795.12531 414.20986,789.35412 384.96423,722.90024 324.68681,653.34932 255.77208,736.85174 214.50963,796.10596 128.46875,824.78694 c 18.349,-52.19426 39.18463,-95.64245 50.65362,-170.12298 -12.47738,-87.26225 -37.44233,-127.50097 -50.65362,-179.69521 z m 196.21806,178.38057 c 1.62981,-1.97479 3.18176,-3.91399 4.84352,-5.91589 -1.77793,-1.96978 -3.49624,-3.91087 -5.25023,-5.87481 -1.60877,1.94967 -3.2236,3.8828 -4.80654,5.87481 1.75768,1.96947 3.50953,3.95005 5.21325,5.91589 z"
|
||||
transform="translate(-464.16179,-464.03236)"
|
||||
id="path5961"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sccccsssccsccccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 22 KiB |
Loading…
x
Reference in New Issue
Block a user