merge with dev
This commit is contained in:
commit
e7448bd084
BIN
rtdata/dcpprofiles/FUJIFILM X-T10.dcp
Normal file
BIN
rtdata/dcpprofiles/FUJIFILM X-T10.dcp
Normal file
Binary file not shown.
Binary file not shown.
BIN
rtdata/dcpprofiles/Panasonic DC-G9.dcp
Normal file
BIN
rtdata/dcpprofiles/Panasonic DC-G9.dcp
Normal file
Binary file not shown.
BIN
rtdata/dcpprofiles/Panasonic DMC-FZ1000.dcp
Normal file
BIN
rtdata/dcpprofiles/Panasonic DMC-FZ1000.dcp
Normal file
Binary file not shown.
@ -70,6 +70,7 @@
|
|||||||
#69 25.07.2018 Erweiterung (TooWaBoo) RT 5.4
|
#69 25.07.2018 Erweiterung (TooWaBoo) RT 5.4
|
||||||
#70 25.07.2018 Korrekturen (TooWaBoo) RT 5.4
|
#70 25.07.2018 Korrekturen (TooWaBoo) RT 5.4
|
||||||
#71 28.09.2018 Korrekturen (TooWaBoo) RT 5.5
|
#71 28.09.2018 Korrekturen (TooWaBoo) RT 5.5
|
||||||
|
#72 05.10.2018 Korrekturen (TooWaBoo) RT 5.5
|
||||||
|
|
||||||
ABOUT_TAB_BUILD;Version
|
ABOUT_TAB_BUILD;Version
|
||||||
ABOUT_TAB_CREDITS;Danksagungen
|
ABOUT_TAB_CREDITS;Danksagungen
|
||||||
@ -181,7 +182,7 @@ FILEBROWSER_APPLYPROFILE;Profil anwenden
|
|||||||
FILEBROWSER_APPLYPROFILE_PARTIAL;Profil selektiv anwenden
|
FILEBROWSER_APPLYPROFILE_PARTIAL;Profil selektiv anwenden
|
||||||
FILEBROWSER_AUTODARKFRAME;Automatisches Dunkelbild
|
FILEBROWSER_AUTODARKFRAME;Automatisches Dunkelbild
|
||||||
FILEBROWSER_AUTOFLATFIELD;Automatisches Weißbild
|
FILEBROWSER_AUTOFLATFIELD;Automatisches Weißbild
|
||||||
FILEBROWSER_BROWSEPATHBUTTONHINT;Ausgewählter Pfad öffnen
|
FILEBROWSER_BROWSEPATHBUTTONHINT;Ausgewählten Pfad öffnen.
|
||||||
FILEBROWSER_BROWSEPATHHINT;Einen Pfad eingeben:\nTaste:\n<b>Strg</b> + <b>o</b> Setzt den Cursor in das Eingabefeld\n<b>Enter</b> Öffnet den Pfad\n<b>Esc</b> Änderungen verwerfen\n<b>Umschalt</b> + <b>Esc</b> Eingabefeld verlassen\n\nSchnellnavigation:\nTaste:\n<b>~</b> “Home“-Verzeichnis des Benutzers\n<b>!</b> Bilder-Verzeichnis des Benutzers
|
FILEBROWSER_BROWSEPATHHINT;Einen Pfad eingeben:\nTaste:\n<b>Strg</b> + <b>o</b> Setzt den Cursor in das Eingabefeld\n<b>Enter</b> Öffnet den Pfad\n<b>Esc</b> Änderungen verwerfen\n<b>Umschalt</b> + <b>Esc</b> Eingabefeld verlassen\n\nSchnellnavigation:\nTaste:\n<b>~</b> “Home“-Verzeichnis des Benutzers\n<b>!</b> Bilder-Verzeichnis des Benutzers
|
||||||
FILEBROWSER_CACHE;Festplatten-Cache
|
FILEBROWSER_CACHE;Festplatten-Cache
|
||||||
FILEBROWSER_CACHECLEARFROMFULL;Aus dem Festplatten-Cache entfernen (vollständig)
|
FILEBROWSER_CACHECLEARFROMFULL;Aus dem Festplatten-Cache entfernen (vollständig)
|
||||||
@ -236,7 +237,7 @@ FILEBROWSER_POPUPSELECTALL;Alle auswählen
|
|||||||
FILEBROWSER_POPUPTRASH;In den Papierkorb verschieben
|
FILEBROWSER_POPUPTRASH;In den Papierkorb verschieben
|
||||||
FILEBROWSER_POPUPUNRANK;Bewertung entfernen
|
FILEBROWSER_POPUPUNRANK;Bewertung entfernen
|
||||||
FILEBROWSER_POPUPUNTRASH;Aus dem Papierkorb wiederherstellen
|
FILEBROWSER_POPUPUNTRASH;Aus dem Papierkorb wiederherstellen
|
||||||
FILEBROWSER_QUERYBUTTONHINT;Suchfilter zurücksetzen
|
FILEBROWSER_QUERYBUTTONHINT;Suchfilter zurücksetzen.
|
||||||
FILEBROWSER_QUERYHINT;Nur Dateien anzeigen, deren Namen die angegebene Zeichenkette beinhalten.\n\nTaste:\n<b>Strg</b> + <b>f</b> Setzt den Cursor in das Suchfeld\n<b>Enter</b> Suche starten\n<b>Esc</b> Suchfeld löschen\n<b>Umschalt</b> + <b>Esc</b> Suchfeldfeld verlassen
|
FILEBROWSER_QUERYHINT;Nur Dateien anzeigen, deren Namen die angegebene Zeichenkette beinhalten.\n\nTaste:\n<b>Strg</b> + <b>f</b> Setzt den Cursor in das Suchfeld\n<b>Enter</b> Suche starten\n<b>Esc</b> Suchfeld löschen\n<b>Umschalt</b> + <b>Esc</b> Suchfeldfeld verlassen
|
||||||
FILEBROWSER_QUERYLABEL; Suche:
|
FILEBROWSER_QUERYLABEL; Suche:
|
||||||
FILEBROWSER_RANK1_TOOLTIP;Bewertung 1 *\nTaste: <b>Umschalt</b> + <b>1</b>
|
FILEBROWSER_RANK1_TOOLTIP;Bewertung 1 *\nTaste: <b>Umschalt</b> + <b>1</b>
|
||||||
@ -248,31 +249,31 @@ FILEBROWSER_RENAMEDLGLABEL;Datei umbenennen
|
|||||||
FILEBROWSER_RESETDEFAULTPROFILE;Profil auf Vorgabe zurücksetzen
|
FILEBROWSER_RESETDEFAULTPROFILE;Profil auf Vorgabe zurücksetzen
|
||||||
FILEBROWSER_SELECTDARKFRAME;Dunkelbild wählen...
|
FILEBROWSER_SELECTDARKFRAME;Dunkelbild wählen...
|
||||||
FILEBROWSER_SELECTFLATFIELD;Weißbild wählen...
|
FILEBROWSER_SELECTFLATFIELD;Weißbild wählen...
|
||||||
FILEBROWSER_SHOWCOLORLABEL1HINT;Nur rot markierte Bilder anzeigen\nTaste: <b>Alt</b> + <b>1</b>
|
FILEBROWSER_SHOWCOLORLABEL1HINT;Nur rot markierte Bilder anzeigen.\nTaste: <b>Alt</b> + <b>1</b>
|
||||||
FILEBROWSER_SHOWCOLORLABEL2HINT;Nur gelb markierte Bilder anzeigen\nTaste: <b>Alt</b> + <b>2</b>
|
FILEBROWSER_SHOWCOLORLABEL2HINT;Nur gelb markierte Bilder anzeigen.\nTaste: <b>Alt</b> + <b>2</b>
|
||||||
FILEBROWSER_SHOWCOLORLABEL3HINT;Nur grün markierte Bilder anzeigen\nTaste: <b>Alt</b> + <b>3</b>
|
FILEBROWSER_SHOWCOLORLABEL3HINT;Nur grün markierte Bilder anzeigen.\nTaste: <b>Alt</b> + <b>3</b>
|
||||||
FILEBROWSER_SHOWCOLORLABEL4HINT;Nur blau markierte Bilder anzeigen\nTaste: <b>Alt</b> + <b>4</b>
|
FILEBROWSER_SHOWCOLORLABEL4HINT;Nur blau markierte Bilder anzeigen.\nTaste: <b>Alt</b> + <b>4</b>
|
||||||
FILEBROWSER_SHOWCOLORLABEL5HINT;Nur violett markierte Bilder anzeigen\nTaste: <b>Alt</b> + <b>5</b>
|
FILEBROWSER_SHOWCOLORLABEL5HINT;Nur violett markierte Bilder anzeigen.\nTaste: <b>Alt</b> + <b>5</b>
|
||||||
FILEBROWSER_SHOWDIRHINT;Alle Filter zurücksetzen\nTaste: <b>d</b>
|
FILEBROWSER_SHOWDIRHINT;Alle Filter zurücksetzen.\nTaste: <b>d</b>
|
||||||
FILEBROWSER_SHOWEDITEDHINT;Nur bearbeitete Bilder anzeigen\nTaste: <b>7</b>
|
FILEBROWSER_SHOWEDITEDHINT;Nur bearbeitete Bilder anzeigen.\nTaste: <b>7</b>
|
||||||
FILEBROWSER_SHOWEDITEDNOTHINT;Nur unbearbeitete Bilder anzeigen\nTaste: <b>6</b>
|
FILEBROWSER_SHOWEDITEDNOTHINT;Nur unbearbeitete Bilder anzeigen.\nTaste: <b>6</b>
|
||||||
FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden.\n\nIm Multi-Reitermodus:\nTaste: <b>i</b>\nIm Ein-Reitermodus:\nTaste: <b>Alt</b> + <b>i</b>
|
FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden.\n\nIm Multi-Reitermodus:\nTaste: <b>i</b>\nIm Ein-Reitermodus:\nTaste: <b>Alt</b> + <b>i</b>
|
||||||
FILEBROWSER_SHOWNOTTRASHHINT;Nur nicht gelöschte Bilder anzeigen
|
FILEBROWSER_SHOWNOTTRASHHINT;Nur nicht gelöschte Bilder anzeigen.
|
||||||
FILEBROWSER_SHOWORIGINALHINT;Zeige nur das Originalbild.\n\nWenn mehrere Bilder mit dem gleichen Dateinamen und unterschiedlichen Dateitypen existieren, ist das Originalbild das Bild, welches in der Liste "Dateitypen anzeigen" unter Einstellungen > Dateiverwaltung als erstes gefunden wird.
|
FILEBROWSER_SHOWORIGINALHINT;Zeige nur das Originalbild.\n\nWenn mehrere Bilder mit dem gleichen Dateinamen und unterschiedlichen Dateitypen existieren, ist das Originalbild das Bild, welches in der Liste "Dateitypen anzeigen" unter Einstellungen > Dateiverwaltung als erstes gefunden wird.
|
||||||
FILEBROWSER_SHOWRANK1HINT;Nur mit 1 Stern bewertete Bilder anzeigen\nTaste: <b>1</b>
|
FILEBROWSER_SHOWRANK1HINT;Nur mit 1 Stern bewertete Bilder anzeigen.\nTaste: <b>1</b>
|
||||||
FILEBROWSER_SHOWRANK2HINT;Nur mit 2 Sternen bewertete Bilder anzeigen\nTaste: <b>2</b>
|
FILEBROWSER_SHOWRANK2HINT;Nur mit 2 Sternen bewertete Bilder anzeigen.\nTaste: <b>2</b>
|
||||||
FILEBROWSER_SHOWRANK3HINT;Nur mit 3 Sternen bewertete Bilder anzeigen\nTaste: <b>3</b>
|
FILEBROWSER_SHOWRANK3HINT;Nur mit 3 Sternen bewertete Bilder anzeigen.\nTaste: <b>3</b>
|
||||||
FILEBROWSER_SHOWRANK4HINT;Nur mit 4 Sternen bewertete Bilder anzeigen\nTaste: <b>4</b>
|
FILEBROWSER_SHOWRANK4HINT;Nur mit 4 Sternen bewertete Bilder anzeigen.\nTaste: <b>4</b>
|
||||||
FILEBROWSER_SHOWRANK5HINT;Nur mit 5 Sternen bewertete Bilder anzeigen\nTaste: <b>5</b>
|
FILEBROWSER_SHOWRANK5HINT;Nur mit 5 Sternen bewertete Bilder anzeigen.\nTaste: <b>5</b>
|
||||||
FILEBROWSER_SHOWRECENTLYSAVEDHINT;Nur gespeicherte Bilder anzeigen\nTaste: <b>Alt</b> + <b>7</b>
|
FILEBROWSER_SHOWRECENTLYSAVEDHINT;Nur gespeicherte Bilder anzeigen.\nTaste: <b>Alt</b> + <b>7</b>
|
||||||
FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Nur nicht gespeicherte Bilder anzeigen\nTaste: <b>Alt</b> + <b>6</b>
|
FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Nur nicht gespeicherte Bilder anzeigen.\nTaste: <b>Alt</b> + <b>6</b>
|
||||||
FILEBROWSER_SHOWTRASHHINT;Inhalt des Papierkorbs anzeigen\nTaste: <b>Strg</b> + <b>t</b>
|
FILEBROWSER_SHOWTRASHHINT;Inhalt des Papierkorbs anzeigen.\nTaste: <b>Strg</b> + <b>t</b>
|
||||||
FILEBROWSER_SHOWUNCOLORHINT;Nur unmarkierte Bilder anzeigen\nTaste: <b>Alt</b> + <b>0</b>
|
FILEBROWSER_SHOWUNCOLORHINT;Nur unmarkierte Bilder anzeigen.\nTaste: <b>Alt</b> + <b>0</b>
|
||||||
FILEBROWSER_SHOWUNRANKHINT;Nur unbewertete Bilder anzeigen\nTaste: <b>0</b>
|
FILEBROWSER_SHOWUNRANKHINT;Nur unbewertete Bilder anzeigen.\nTaste: <b>0</b>
|
||||||
FILEBROWSER_THUMBSIZE;Miniaturbildgröße
|
FILEBROWSER_THUMBSIZE;Miniaturbildgröße
|
||||||
FILEBROWSER_UNRANK_TOOLTIP;Bewertung entfernen\nTaste: <b>Umschalt</b> + <b>0</b>
|
FILEBROWSER_UNRANK_TOOLTIP;Bewertung entfernen.\nTaste: <b>Umschalt</b> + <b>0</b>
|
||||||
FILEBROWSER_ZOOMINHINT;Miniaturbilder vergrößern\n\nIm Multi-Reitermodus:\nTaste: <b>+</b>\nIm Ein-Reitermodus:\nTaste: <b>Alt</b> <b>+</b>
|
FILEBROWSER_ZOOMINHINT;Miniaturbilder vergrößern.\n\nIm Multi-Reitermodus:\nTaste: <b>+</b>\nIm Ein-Reitermodus:\nTaste: <b>Alt</b> <b>+</b>
|
||||||
FILEBROWSER_ZOOMOUTHINT;Miniaturbilder verkleinern\n\nIm Multi-Reitermodus:\nTaste: <b>-</b>\nIm Ein-Reitermodus:\nTaste: <b>Alt</b> <b>-</b>
|
FILEBROWSER_ZOOMOUTHINT;Miniaturbilder verkleinern.\n\nIm Multi-Reitermodus:\nTaste: <b>-</b>\nIm Ein-Reitermodus:\nTaste: <b>Alt</b> <b>-</b>
|
||||||
FILECHOOSER_FILTER_ANY;Alle Dateien
|
FILECHOOSER_FILTER_ANY;Alle Dateien
|
||||||
FILECHOOSER_FILTER_COLPROF;Farbprofile
|
FILECHOOSER_FILTER_COLPROF;Farbprofile
|
||||||
FILECHOOSER_FILTER_CURVE;Kurvendateien
|
FILECHOOSER_FILTER_CURVE;Kurvendateien
|
||||||
@ -917,14 +918,14 @@ LENSPROFILE_CORRECTION_LCPFILE;LCP-Datei
|
|||||||
LENSPROFILE_CORRECTION_MANUAL;Benutzerdefiniert (Lensfun)
|
LENSPROFILE_CORRECTION_MANUAL;Benutzerdefiniert (Lensfun)
|
||||||
LENSPROFILE_LENS_WARNING;Warnung: Der Cropfaktor des Profils entspricht nicht dem des Objektivs.\nDies kann zu einem fehlerhaften Ergebnis führen.
|
LENSPROFILE_LENS_WARNING;Warnung: Der Cropfaktor des Profils entspricht nicht dem des Objektivs.\nDies kann zu einem fehlerhaften Ergebnis führen.
|
||||||
MAIN_BUTTON_FULLSCREEN;Vollbild\nTaste: <b>F11</b>
|
MAIN_BUTTON_FULLSCREEN;Vollbild\nTaste: <b>F11</b>
|
||||||
MAIN_BUTTON_ICCPROFCREATOR;ICC-Profil erstellen
|
MAIN_BUTTON_ICCPROFCREATOR;ICC-Profil erstellen.
|
||||||
MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigiert zum nächsten Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf das ausgewählte Miniaturbild.\nTaste: <b>F4</b>\n\nNavigiert zum nächsten Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf auf das im Editor geöffnete Bild.\nTaste: <b>Umschalt</b> + <b>F4 </b>
|
MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigiert zum nächsten Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf das ausgewählte Miniaturbild.\nTaste: <b>F4</b>\n\nNavigiert zum nächsten Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf auf das im Editor geöffnete Bild.\nTaste: <b>Umschalt</b> + <b>F4 </b>
|
||||||
MAIN_BUTTON_NAVPREV_TOOLTIP;Navigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf das ausgewählte Miniaturbild.\nTaste: <b>F3</b>\n\nNavigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf auf das im Editor geöffnete Bild.\nTaste: <b>Umschalt</b> + <b>F3 </b>
|
MAIN_BUTTON_NAVPREV_TOOLTIP;Navigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf das ausgewählte Miniaturbild.\nTaste: <b>F3</b>\n\nNavigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf auf das im Editor geöffnete Bild.\nTaste: <b>Umschalt</b> + <b>F3 </b>
|
||||||
MAIN_BUTTON_NAVSYNC_TOOLTIP;Selektiert das Miniaturbild des aktuell geöffneten\nBildes in der Dateiverwaltung und des Filmstreifens.\nEs werden alle aktiven Filter gelöscht.\nTaste: <b>x</b>\n\nWie oben, jedoch ohne Löschung aktiver Filter. Das\nMiniaturbild des geöffneten Bildes wird nicht angezeigt,\nwenn es herausgefiltert wurde.\nTaste: <b>y</b>
|
MAIN_BUTTON_NAVSYNC_TOOLTIP;Selektiert das Miniaturbild des aktuell geöffneten\nBildes in der Dateiverwaltung und des Filmstreifens.\nEs werden alle aktiven Filter gelöscht.\nTaste: <b>x</b>\n\nWie oben, jedoch ohne Löschung aktiver Filter. Das\nMiniaturbild des geöffneten Bildes wird nicht angezeigt,\nwenn es herausgefiltert wurde.\nTaste: <b>y</b>
|
||||||
MAIN_BUTTON_PREFERENCES;Einstellungen
|
MAIN_BUTTON_PREFERENCES;Einstellungen
|
||||||
MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen.\nTaste: <b>Strg</b> + <b>b</b>
|
MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen.\nTaste: <b>Strg</b> + <b>b</b>
|
||||||
MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern.\nTaste: <b>Strg</b> + <b>s</b>\nProfil (.pp3) speichern.\nTaste: <b>Strg</b> + <b>Umschalt</b> + <b>s</b>
|
MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern.\nTaste: <b>Strg</b> + <b>s</b>\nProfil (.pp3) speichern.\nTaste: <b>Strg</b> + <b>Umschalt</b> + <b>s</b>
|
||||||
MAIN_BUTTON_SENDTOEDITOR;Bild im externen Editor öffnen
|
MAIN_BUTTON_SENDTOEDITOR;Bild im externen Editor öffnen.
|
||||||
MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen.\nTaste: <b>Strg</b> + <b>e</b>
|
MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen.\nTaste: <b>Strg</b> + <b>e</b>
|
||||||
MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden.\nTaste: <b>m</b>
|
MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden.\nTaste: <b>m</b>
|
||||||
MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden.\nTaste: <b>F11</b>
|
MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden.\nTaste: <b>F11</b>
|
||||||
@ -939,8 +940,8 @@ MAIN_FRAME_PLACES_ADD;Hinzufügen
|
|||||||
MAIN_FRAME_PLACES_DEL;Entfernen
|
MAIN_FRAME_PLACES_DEL;Entfernen
|
||||||
MAIN_FRAME_RECENT;Verzeichnishistorie
|
MAIN_FRAME_RECENT;Verzeichnishistorie
|
||||||
MAIN_MSG_ALREADYEXISTS;Diese Datei existiert bereits.
|
MAIN_MSG_ALREADYEXISTS;Diese Datei existiert bereits.
|
||||||
MAIN_MSG_CANNOTLOAD;Bild kann nicht geladen werden
|
MAIN_MSG_CANNOTLOAD;Bild kann nicht geladen werden.
|
||||||
MAIN_MSG_CANNOTSAVE;Fehler beim Speichern
|
MAIN_MSG_CANNOTSAVE;Fehler beim Speichern.
|
||||||
MAIN_MSG_CANNOTSTARTEDITOR;Der externe Editor kann nicht gestartet werden.
|
MAIN_MSG_CANNOTSTARTEDITOR;Der externe Editor kann nicht gestartet werden.
|
||||||
MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Setzen Sie bitte den richtigen Pfad in den Einstellungen.
|
MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Setzen Sie bitte den richtigen Pfad in den Einstellungen.
|
||||||
MAIN_MSG_EMPTYFILENAME;Dateiname fehlt!
|
MAIN_MSG_EMPTYFILENAME;Dateiname fehlt!
|
||||||
@ -1182,7 +1183,7 @@ PREFERENCES_GREYSC18;Yb = 18 CIE L#49
|
|||||||
PREFERENCES_GREYSCA;Automatisch
|
PREFERENCES_GREYSCA;Automatisch
|
||||||
PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogramm linksseitig
|
PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogramm linksseitig
|
||||||
PREFERENCES_HISTOGRAMWORKING;Das Arbeitsprofil zur Darstellung des Haupthistogramms verwenden
|
PREFERENCES_HISTOGRAMWORKING;Das Arbeitsprofil zur Darstellung des Haupthistogramms verwenden
|
||||||
PREFERENCES_HISTOGRAM_TOOLTIP;Wenn aktiviert wird das Arbeitsprofil für die Darstellung\ndes Haupthistogramms verwendet, andernfalls das des\ngammakorrigierten Ausgangsprofil.
|
PREFERENCES_HISTOGRAM_TOOLTIP;Wenn aktiviert, wird das Arbeitsprofil für die Darstellung\ndes Haupthistogramms verwendet, andernfalls das des\ngammakorrigierten Ausgangsprofils.
|
||||||
PREFERENCES_HLTHRESHOLD;Lichter - Schwelle
|
PREFERENCES_HLTHRESHOLD;Lichter - Schwelle
|
||||||
PREFERENCES_ICCDIR;ICC-Profile-Verzeichnis
|
PREFERENCES_ICCDIR;ICC-Profile-Verzeichnis
|
||||||
PREFERENCES_IMG_RELOAD_NEEDED;Änderungen werden nur auf neu geöffnete Bilder angewendet
|
PREFERENCES_IMG_RELOAD_NEEDED;Änderungen werden nur auf neu geöffnete Bilder angewendet
|
||||||
@ -1214,7 +1215,7 @@ PREFERENCES_MULTITABDUALMON;Multi-Reitermodus (auf zweitem Monitor, wenn verfüg
|
|||||||
PREFERENCES_NAVGUIDEBRUSH;Farbe der Navigationshilfe
|
PREFERENCES_NAVGUIDEBRUSH;Farbe der Navigationshilfe
|
||||||
PREFERENCES_NAVIGATIONFRAME;Navigation
|
PREFERENCES_NAVIGATIONFRAME;Navigation
|
||||||
PREFERENCES_OUTDIR;Ausgabeverzeichnis
|
PREFERENCES_OUTDIR;Ausgabeverzeichnis
|
||||||
PREFERENCES_OUTDIRFOLDER;In dieses Verzeichnis speichern.
|
PREFERENCES_OUTDIRFOLDER;In dieses Verzeichnis speichern
|
||||||
PREFERENCES_OUTDIRFOLDERHINT;Alle Dateien im ausgewählten Verzeichnis speichern.
|
PREFERENCES_OUTDIRFOLDERHINT;Alle Dateien im ausgewählten Verzeichnis speichern.
|
||||||
PREFERENCES_OUTDIRTEMPLATE;Dynamisches Verzeichnis verwenden
|
PREFERENCES_OUTDIRTEMPLATE;Dynamisches Verzeichnis verwenden
|
||||||
PREFERENCES_OUTDIRTEMPLATEHINT;Die folgenden Variablen können verwendet werden:\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\nDiese Variablen beinhalten bestimmte Teile des Verzeichnispfades, in welchem sich das Bild befindet, oder Attribute des Bildes.\n\nWenn zum Beispiel <b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b> geöffnet wurde, dann haben die Variablen den folgenden Inhalt:\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\nWenn Sie die Ausgabedatei in dasselbe Verzeichnis wie das Originalbild speichern wollen, dann wählen Sie:\n<b>%p1/%f</b>\n\nWenn Sie die Ausgabedatei in ein Unterverzeichnis mit dem Namen "<i>converted</i>" schreiben wollen, dann wählen Sie:\n<b>%p1/converted/%f</b>\n\nWenn Sie die Ausgabedatei im Verzeichnispfad "<i>/home/tom/photos/converted</i>" speichern wollen, dort jedoch in einem mit dem Namen des Ursprungsverzeichnisses betitelten Unterverzeichnis, dann wählen Sie:\n<b>%p2/converted/%d1/%f</b>\n\nDie Variable <b>%r</b> enthält die Bewertung des Bildes.
|
PREFERENCES_OUTDIRTEMPLATEHINT;Die folgenden Variablen können verwendet werden:\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\nDiese Variablen beinhalten bestimmte Teile des Verzeichnispfades, in welchem sich das Bild befindet, oder Attribute des Bildes.\n\nWenn zum Beispiel <b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b> geöffnet wurde, dann haben die Variablen den folgenden Inhalt:\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\nWenn Sie die Ausgabedatei in dasselbe Verzeichnis wie das Originalbild speichern wollen, dann wählen Sie:\n<b>%p1/%f</b>\n\nWenn Sie die Ausgabedatei in ein Unterverzeichnis mit dem Namen "<i>converted</i>" schreiben wollen, dann wählen Sie:\n<b>%p1/converted/%f</b>\n\nWenn Sie die Ausgabedatei im Verzeichnispfad "<i>/home/tom/photos/converted</i>" speichern wollen, dort jedoch in einem mit dem Namen des Ursprungsverzeichnisses betitelten Unterverzeichnis, dann wählen Sie:\n<b>%p2/converted/%d1/%f</b>\n\nDie Variable <b>%r</b> enthält die Bewertung des Bildes.
|
||||||
@ -1251,10 +1252,10 @@ PREFERENCES_PSPATH;Adobe Photoshop Installationsverzeichnis
|
|||||||
PREFERENCES_REMEMBERZOOMPAN;Zoom und Bildposition merken
|
PREFERENCES_REMEMBERZOOMPAN;Zoom und Bildposition merken
|
||||||
PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Öffnen eines neuen Bildes mit den Zoom- und Positionswerten\ndes vorangegangenen Bildes.\n\nFunktioniert nur unter folgenden Bedingungen:\nEin-Reitermodus aktiv\n“Demosaikmethode für 100%-Ansicht“ muss auf “Wie im Bild-\nverarbeitungsprofil vorgegeben“ eingestellt sein.
|
PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Öffnen eines neuen Bildes mit den Zoom- und Positionswerten\ndes vorangegangenen Bildes.\n\nFunktioniert nur unter folgenden Bedingungen:\nEin-Reitermodus aktiv\n“Demosaikmethode für 100%-Ansicht“ muss auf “Wie im Bild-\nverarbeitungsprofil vorgegeben“ eingestellt sein.
|
||||||
PREFERENCES_SAVE_TP_OPEN_NOW;Werkzeugstatus jetzt speichern
|
PREFERENCES_SAVE_TP_OPEN_NOW;Werkzeugstatus jetzt speichern
|
||||||
PREFERENCES_SELECTFONT;Schriftart
|
PREFERENCES_SELECTFONT;Schriftart:
|
||||||
PREFERENCES_SELECTFONT_COLPICKER;Schriftart für die Farbwähler
|
PREFERENCES_SELECTFONT_COLPICKER;Schriftart Farbwähler
|
||||||
PREFERENCES_SELECTLANG;Sprache
|
PREFERENCES_SELECTLANG;Sprache
|
||||||
PREFERENCES_SELECTTHEME;Oberflächendesign (erfordert Neustart)
|
PREFERENCES_SELECTTHEME;Oberflächendesign
|
||||||
PREFERENCES_SERIALIZE_TIFF_READ;TIFF-Bilder
|
PREFERENCES_SERIALIZE_TIFF_READ;TIFF-Bilder
|
||||||
PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialisiertes Lesen von TIFF-Bildern verwenden
|
PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialisiertes Lesen von TIFF-Bildern verwenden
|
||||||
PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Beim Arbeiten mit Ordnern voll unkomprimierter TIFF-Bilder, kann diese Einstellung das Generieren von Miniaturbildern deutlich beschleunigen.
|
PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Beim Arbeiten mit Ordnern voll unkomprimierter TIFF-Bilder, kann diese Einstellung das Generieren von Miniaturbildern deutlich beschleunigen.
|
||||||
@ -1278,7 +1279,7 @@ PREFERENCES_TAB_GENERAL;Allgemein
|
|||||||
PREFERENCES_TAB_IMPROC;Bildbearbeitung
|
PREFERENCES_TAB_IMPROC;Bildbearbeitung
|
||||||
PREFERENCES_TAB_PERFORMANCE;Performance
|
PREFERENCES_TAB_PERFORMANCE;Performance
|
||||||
PREFERENCES_TAB_SOUND;Klänge
|
PREFERENCES_TAB_SOUND;Klänge
|
||||||
PREFERENCES_THEME;Oberflächendesign
|
PREFERENCES_THEME;Oberflächendesign (erfordert Neustart)
|
||||||
PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Eingebundenes JPEG
|
PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Eingebundenes JPEG
|
||||||
PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Bildanzeige
|
PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Bildanzeige
|
||||||
PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrales RAW-Bild
|
PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrales RAW-Bild
|
||||||
@ -1541,7 +1542,7 @@ TP_COLORTONING_METHOD;Methode
|
|||||||
TP_COLORTONING_METHOD_TOOLTIP;L*a*b*-Überlagerung, RGB-Regler und RGB-Kurven\nverwenden eine interpolierte Farbüberlagerung.\n\nFarbausgleich (Schatten/Mitten/Lichter) und Sättigung\n(2-Farben) verwenden direkte Farben.
|
TP_COLORTONING_METHOD_TOOLTIP;L*a*b*-Überlagerung, RGB-Regler und RGB-Kurven\nverwenden eine interpolierte Farbüberlagerung.\n\nFarbausgleich (Schatten/Mitten/Lichter) und Sättigung\n(2-Farben) verwenden direkte Farben.
|
||||||
TP_COLORTONING_MIDTONES;Mitten
|
TP_COLORTONING_MIDTONES;Mitten
|
||||||
TP_COLORTONING_NEUTRAL;Regler zurücksetzen
|
TP_COLORTONING_NEUTRAL;Regler zurücksetzen
|
||||||
TP_COLORTONING_NEUTRAL_TIP;Alle Werte auf Standard zurücksetzen\n(Schatten, Mitten, Lichter)
|
TP_COLORTONING_NEUTRAL_TIP;Alle Werte auf Standard zurücksetzen.\n(Schatten, Mitten, Lichter)
|
||||||
TP_COLORTONING_OPACITY;Deckkraft
|
TP_COLORTONING_OPACITY;Deckkraft
|
||||||
TP_COLORTONING_RGBCURVES;RGB-Kurven
|
TP_COLORTONING_RGBCURVES;RGB-Kurven
|
||||||
TP_COLORTONING_RGBSLIDERS;RGB-Regler
|
TP_COLORTONING_RGBSLIDERS;RGB-Regler
|
||||||
@ -1573,7 +1574,7 @@ TP_CROP_GUIDETYPE;Hilfslinien:
|
|||||||
TP_CROP_H;Höhe
|
TP_CROP_H;Höhe
|
||||||
TP_CROP_LABEL;Ausschnitt
|
TP_CROP_LABEL;Ausschnitt
|
||||||
TP_CROP_PPI;PPI=
|
TP_CROP_PPI;PPI=
|
||||||
TP_CROP_SELECTCROP;Ausschnitt wählen.
|
TP_CROP_SELECTCROP;Ausschnitt wählen
|
||||||
TP_CROP_W;Breite
|
TP_CROP_W;Breite
|
||||||
TP_CROP_X;x
|
TP_CROP_X;x
|
||||||
TP_CROP_Y;y
|
TP_CROP_Y;y
|
||||||
@ -2073,7 +2074,7 @@ TP_RGBCURVES_LUMAMODE_TOOLTIP;Der <b>Helligkeitsmodus</b> ändert die Helligkeit
|
|||||||
TP_RGBCURVES_RED;R
|
TP_RGBCURVES_RED;R
|
||||||
TP_ROTATE_DEGREE;Winkel
|
TP_ROTATE_DEGREE;Winkel
|
||||||
TP_ROTATE_LABEL;Drehen
|
TP_ROTATE_LABEL;Drehen
|
||||||
TP_ROTATE_SELECTLINE;Leitlinie wählen.
|
TP_ROTATE_SELECTLINE;Leitlinie wählen
|
||||||
TP_SAVEDIALOG_OK_TIP;Taste: <b>Strg</b> + <b>Enter</b>
|
TP_SAVEDIALOG_OK_TIP;Taste: <b>Strg</b> + <b>Enter</b>
|
||||||
TP_SHADOWSHLIGHTS_HIGHLIGHTS;Lichter
|
TP_SHADOWSHLIGHTS_HIGHLIGHTS;Lichter
|
||||||
TP_SHADOWSHLIGHTS_HLTONALW;Tonwertbreite Lichter
|
TP_SHADOWSHLIGHTS_HLTONALW;Tonwertbreite Lichter
|
||||||
@ -2350,10 +2351,9 @@ TP_WBALANCE_WATER1;Unterwasser 1
|
|||||||
TP_WBALANCE_WATER2;Unterwasser 2
|
TP_WBALANCE_WATER2;Unterwasser 2
|
||||||
TP_WBALANCE_WATER_HEADER;Unterwasser
|
TP_WBALANCE_WATER_HEADER;Unterwasser
|
||||||
ZOOMPANEL_100;(100%)
|
ZOOMPANEL_100;(100%)
|
||||||
ZOOMPANEL_NEWCROPWINDOW;Neues Detailfenster öffnen
|
ZOOMPANEL_NEWCROPWINDOW;Neues Detailfenster öffnen.
|
||||||
ZOOMPANEL_ZOOM100;Zoom 100%\nTaste: <b>z</b>
|
ZOOMPANEL_ZOOM100;Zoom 100%\nTaste: <b>z</b>
|
||||||
ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen\nTaste: <b>f</b>
|
ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen.\nTaste: <b>f</b>
|
||||||
ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: <b>Alt</b> + <b>f</b>
|
ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: <b>Alt</b> + <b>f</b>
|
||||||
ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: <b>+</b>
|
ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: <b>+</b>
|
||||||
ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: <b>-</b>
|
ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: <b>-</b>
|
||||||
|
|
||||||
|
@ -865,6 +865,7 @@ HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations
|
|||||||
HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift
|
HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift
|
||||||
HISTORY_MSG_RAW_BORDER;Raw border
|
HISTORY_MSG_RAW_BORDER;Raw border
|
||||||
HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
|
HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
|
||||||
|
HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace
|
||||||
HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
|
HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
|
||||||
HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
|
HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
|
||||||
HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
|
HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
|
||||||
|
@ -36,6 +36,18 @@ scrollbar:not(.overlay-indicator):hover {
|
|||||||
min-width: 1px;
|
min-width: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Toolbar stuck workaround */
|
||||||
|
.scrollableToolbar > scrollbar:not(.dummy),
|
||||||
|
.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy),
|
||||||
|
.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy) > trough:not(.dummy),
|
||||||
|
.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy) > trough:not(.dummy) > slider:not(.dummy) {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
min-height: 0;
|
||||||
|
min-width: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
.view:selected:not(check):not(radio) {
|
.view:selected:not(check):not(radio) {
|
||||||
color: #262626;
|
color: #262626;
|
||||||
background-color: #AAAAAA
|
background-color: #AAAAAA
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
This file is part of RawTherapee.
|
This file is part of RawTherapee.
|
||||||
|
|
||||||
Copyright (c) 2016-2018 TooWaBoo
|
Copyright (c) 2016-2018 TooWaBoo
|
||||||
Version 2.80
|
Version 2.82
|
||||||
|
|
||||||
RawTherapee is free software: you can redistribute it and/or modify
|
RawTherapee is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -80,7 +80,6 @@
|
|||||||
min-height: 0;
|
min-height: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
opacity: 1;
|
|
||||||
border: none;
|
border: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
@ -145,6 +144,10 @@ arrow {
|
|||||||
min-width: 1.333333333333333333em;
|
min-width: 1.333333333333333333em;
|
||||||
min-height: 1.333333333333333333em;
|
min-height: 1.333333333333333333em;
|
||||||
}
|
}
|
||||||
|
/* combobox cellview to high for font size 8@96dpi*/
|
||||||
|
cellview {
|
||||||
|
margin: -1px 0;
|
||||||
|
}
|
||||||
|
|
||||||
text {
|
text {
|
||||||
background-color: @bg-dark-grey;
|
background-color: @bg-dark-grey;
|
||||||
@ -290,7 +293,7 @@ textview:selected, treeview:selected {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#Snapshots > border {
|
#Snapshots > border {
|
||||||
min-height: calc(6.5em + 36px);
|
min-height: calc(6em + 36px);
|
||||||
}
|
}
|
||||||
#Snapshots > label {
|
#Snapshots > label {
|
||||||
margin-bottom: -4px;
|
margin-bottom: -4px;
|
||||||
@ -315,6 +318,7 @@ textview:selected, treeview:selected {
|
|||||||
border: 0.083333333333333333em solid @bg-dark-grey;
|
border: 0.083333333333333333em solid @bg-dark-grey;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
min-height: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
#Snapshots button:hover,
|
#Snapshots button:hover,
|
||||||
@ -326,8 +330,9 @@ background-color: @bg-list-hover;
|
|||||||
background-color: shade(@bg-list-hover, 1.15);
|
background-color: shade(@bg-list-hover, 1.15);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fontchooser scrolledwindow,
|
||||||
#PlacesPaned scrolledwindow,
|
#PlacesPaned scrolledwindow,
|
||||||
#HistoryPanel > border,
|
#HistoryPanel scrolledwindow,
|
||||||
#Snapshots scrolledwindow {
|
#Snapshots scrolledwindow {
|
||||||
background-color: @bg-dark-grey;
|
background-color: @bg-dark-grey;
|
||||||
border: 0.083333333333333333em solid @bg-dark-grey;
|
border: 0.083333333333333333em solid @bg-dark-grey;
|
||||||
@ -686,7 +691,18 @@ scrollbar.hovering slider:hover {
|
|||||||
scrollbar:not(.overlay-indicator):hover {
|
scrollbar:not(.overlay-indicator):hover {
|
||||||
min-width: 1px;
|
min-width: 1px;
|
||||||
}
|
}
|
||||||
/**/
|
|
||||||
|
/* Toolbar stuck workaround */
|
||||||
|
.scrollableToolbar > scrollbar:not(.dummy),
|
||||||
|
.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy),
|
||||||
|
.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy) > trough:not(.dummy),
|
||||||
|
.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy) > trough:not(.dummy) > slider:not(.dummy) {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
min-height: 0;
|
||||||
|
min-width: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
/*** end ***************************************************************************************/
|
/*** end ***************************************************************************************/
|
||||||
|
|
||||||
@ -1477,6 +1493,10 @@ button.text-button label {
|
|||||||
margin: 0 0.5em;/* x */
|
margin: 0 0.5em;/* x */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button image + label {
|
||||||
|
margin-left: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
#PrefNotebook > stack > :nth-child(5) combobox {
|
#PrefNotebook > stack > :nth-child(5) combobox {
|
||||||
/* margin: 0.166666666666666666em 0; */
|
/* margin: 0.166666666666666666em 0; */
|
||||||
margin: 2px 0;
|
margin: 2px 0;
|
||||||
@ -1583,12 +1603,9 @@ button.MiddleH {
|
|||||||
margin-left: -2px;
|
margin-left: -2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#PlacesPaned button.Left,
|
|
||||||
#PlacesPaned button.Right {
|
|
||||||
margin-top: 3px;
|
|
||||||
}
|
|
||||||
#PlacesPaned combobox {
|
#PlacesPaned combobox {
|
||||||
margin-bottom: -3px;
|
margin-bottom: -8px;
|
||||||
|
padding-bottom: 0.416666666666666666em;
|
||||||
}
|
}
|
||||||
/**/
|
/**/
|
||||||
|
|
||||||
@ -1699,8 +1716,16 @@ buttonbox:not(.dialog-action-area) button{
|
|||||||
|
|
||||||
button.color {
|
button.color {
|
||||||
min-height: 1.166666666666666666em;
|
min-height: 1.166666666666666666em;
|
||||||
|
min-width: 2.75em;
|
||||||
padding: 0.25em;
|
padding: 0.25em;
|
||||||
}
|
}
|
||||||
|
button.color colorswatch,
|
||||||
|
colorchooser colorswatch {
|
||||||
|
border: 1px solid @bg-button-border;
|
||||||
|
}
|
||||||
|
colorchooser colorswatch#add-color-button:first-child {
|
||||||
|
border-radius: 5.5px 0 0 5.5px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Save, Cancel, OK ... buttons */
|
/* Save, Cancel, OK ... buttons */
|
||||||
.dialog-action-area button {
|
.dialog-action-area button {
|
||||||
@ -2132,21 +2157,10 @@ headerbar .title:backdrop {
|
|||||||
color: alpha(@winTitle,.60);
|
color: alpha(@winTitle,.60);
|
||||||
}
|
}
|
||||||
/*** end ***************************************************************************************/
|
/*** end ***************************************************************************************/
|
||||||
/* Toolbar stuck workaround */
|
|
||||||
|
|
||||||
/* .scrollableToolbar scrollbar:not(.overlay-indicator) slider:not(.dummy) {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
min-height: 0;
|
|
||||||
min-width: 0;
|
|
||||||
border: none;
|
|
||||||
} */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* .view:not(check):not(radio), image:not(check):not(radio), spinbutton button, cellview {
|
/* .view:not(check):not(radio), image:not(check):not(radio), spinbutton button, cellview {
|
||||||
-gtk-icon-transform: scale(1.5);
|
-gtk-icon-transform: scale(calc(( 96 / 96 ) * ( 8 / 9 )));
|
||||||
}
|
} */
|
||||||
* {-gtk-dpi: 144;} */
|
/* * {-gtk-dpi: 144;} */
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
@define-color bg-image rgb(120,120,120); /*** Image area & File Browser background * Default: rgb(70,70,70) ***/
|
@define-color bg-image rgb(120,120,120); /*** Image area & File Browser background * Default: rgb(70,70,70) ***/
|
||||||
|
|
||||||
@define-color accent-color2 rgb(49,132,220); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(35,99,166) ***/
|
@define-color accent-color2 rgb(175,175,175); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(35,99,166) ***/
|
||||||
@define-color accent-color4 rgb(155,155,155); /*** Slider knob * Default: rgb(115,115,115) ***/
|
@define-color accent-color4 rgb(155,155,155); /*** Slider knob * Default: rgb(115,115,115) ***/
|
||||||
|
|
||||||
@define-color accent-color3 rgb(85,85,85); /*** Selected thumbnail background color * Default: rgb(35,99,166) ***/
|
@define-color accent-color3 rgb(85,85,85); /*** Selected thumbnail background color * Default: rgb(35,99,166) ***/
|
||||||
@ -43,10 +43,10 @@
|
|||||||
|
|
||||||
@define-color bg-light-grey rgb(135,135,135);
|
@define-color bg-light-grey rgb(135,135,135);
|
||||||
@define-color bg-grey rgb(120,120,120);
|
@define-color bg-grey rgb(120,120,120);
|
||||||
@define-color bg-dark-grey rgb(85,85,85);
|
@define-color bg-dark-grey rgb(90,90,90);
|
||||||
|
|
||||||
@define-color bg-button-hover rgba(0,0,0,.15);
|
@define-color bg-button-hover rgba(40,40,40,.16);
|
||||||
@define-color bg-button-active rgba(0,0,0,.5);
|
@define-color bg-button-active rgba(40,40,40,.4);
|
||||||
|
|
||||||
@define-color winHeaderbar rgb(75,75,75);
|
@define-color winHeaderbar rgb(75,75,75);
|
||||||
@define-color winTitle rgb(210,210,210);
|
@define-color winTitle rgb(210,210,210);
|
||||||
@ -55,7 +55,7 @@
|
|||||||
@define-color border-tooltip rgb(50,50,50);
|
@define-color border-tooltip rgb(50,50,50);
|
||||||
@define-color text-tooltip rgb(50,50,50);
|
@define-color text-tooltip rgb(50,50,50);
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
@define-color text-color rgb(230,230,230);
|
@define-color text-color rgb(220,220,220);
|
||||||
@define-color text-tbEntry rgb(245,245,245);
|
@define-color text-tbEntry rgb(245,245,245);
|
||||||
@define-color border-color rgba(255,255,255,.35);
|
@define-color border-color rgba(255,255,255,.35);
|
||||||
@define-color bg-list-hover rgb(95,95,95);
|
@define-color bg-list-hover rgb(95,95,95);
|
||||||
|
@ -128,6 +128,7 @@ set(RTENGINESOURCEFILES
|
|||||||
xtrans_demosaic.cc
|
xtrans_demosaic.cc
|
||||||
vng4_demosaic_RT.cc
|
vng4_demosaic_RT.cc
|
||||||
ipsoftlight.cc
|
ipsoftlight.cc
|
||||||
|
guidedfilter.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
if(LENSFUN_HAS_LOAD_DIRECTORY)
|
if(LENSFUN_HAS_LOAD_DIRECTORY)
|
||||||
|
@ -805,8 +805,15 @@ BENCHFUN
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
float *LbloxArray[denoiseNestedLevels * numthreads] = {};
|
const std::size_t blox_array_size = denoiseNestedLevels * numthreads;
|
||||||
float *fLbloxArray[denoiseNestedLevels * numthreads] = {};
|
|
||||||
|
float *LbloxArray[blox_array_size];
|
||||||
|
float *fLbloxArray[blox_array_size];
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < blox_array_size; ++i) {
|
||||||
|
LbloxArray[i] = nullptr;
|
||||||
|
fLbloxArray[i] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
if (numtiles > 1 && denoiseLuminance) {
|
if (numtiles > 1 && denoiseLuminance) {
|
||||||
for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) {
|
for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) {
|
||||||
|
@ -89,8 +89,7 @@ using LUTd = LUT<double>;
|
|||||||
using LUTuc = LUT<uint8_t>;
|
using LUTuc = LUT<uint8_t>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class LUT :
|
class LUT
|
||||||
public rtengine::NonCopyable
|
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
// list of variables ordered to improve cache speed
|
// list of variables ordered to improve cache speed
|
||||||
@ -198,6 +197,8 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
explicit LUT(const LUT&) = delete;
|
||||||
|
|
||||||
void setClip(int flags)
|
void setClip(int flags)
|
||||||
{
|
{
|
||||||
clip = flags;
|
clip = flags;
|
||||||
@ -225,7 +226,7 @@ public:
|
|||||||
return size > 0 ? upperBound : 0;
|
return size > 0 ? upperBound : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LUT<T> & operator=(LUT<T> &rhs)
|
LUT<T> & operator=(const LUT<T>& rhs)
|
||||||
{
|
{
|
||||||
if (this != &rhs) {
|
if (this != &rhs) {
|
||||||
if (rhs.size > this->size) {
|
if (rhs.size > this->size) {
|
||||||
@ -257,7 +258,7 @@ public:
|
|||||||
|
|
||||||
// handy to sum up per thread histograms. #pragma omp simd speeds up the loop by about factor 3 for LUTu (uint32_t).
|
// handy to sum up per thread histograms. #pragma omp simd speeds up the loop by about factor 3 for LUTu (uint32_t).
|
||||||
template<typename U = T, typename = typename std::enable_if<std::is_same<U, std::uint32_t>::value>::type>
|
template<typename U = T, typename = typename std::enable_if<std::is_same<U, std::uint32_t>::value>::type>
|
||||||
LUT<T> & operator+=(LUT<T> &rhs)
|
LUT<T> & operator+=(const LUT<T>& rhs)
|
||||||
{
|
{
|
||||||
if (rhs.size == this->size) {
|
if (rhs.size == this->size) {
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
|
@ -267,11 +267,11 @@ public:
|
|||||||
ar_realloc(w, h);
|
ar_realloc(w, h);
|
||||||
memcpy(data, copy, w * h * sizeof(T));
|
memcpy(data, copy, w * h * sizeof(T));
|
||||||
}
|
}
|
||||||
int width()
|
int width() const
|
||||||
{
|
{
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
int height()
|
int height() const
|
||||||
{
|
{
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,8 @@ namespace rtengine
|
|||||||
template<class T, class A> void boxblur (T** src, A** dst, int radx, int rady, int W, int H)
|
template<class T, class A> void boxblur (T** src, A** dst, int radx, int rady, int W, int H)
|
||||||
{
|
{
|
||||||
//box blur image; box range = (radx,rady)
|
//box blur image; box range = (radx,rady)
|
||||||
|
assert(2*radx+1 < W);
|
||||||
|
assert(2*rady+1 < H);
|
||||||
|
|
||||||
AlignedBuffer<float>* buffer = new AlignedBuffer<float> (W * H);
|
AlignedBuffer<float>* buffer = new AlignedBuffer<float> (W * H);
|
||||||
float* temp = buffer->data;
|
float* temp = buffer->data;
|
||||||
|
@ -148,10 +148,10 @@ void Crop::update(int todo)
|
|||||||
|
|
||||||
// give possibility to the listener to modify crop window (as the full image dimensions are already known at this point)
|
// give possibility to the listener to modify crop window (as the full image dimensions are already known at this point)
|
||||||
int wx, wy, ww, wh, ws;
|
int wx, wy, ww, wh, ws;
|
||||||
bool overrideWindow = false;
|
const bool overrideWindow = cropImageListener;
|
||||||
|
|
||||||
if (cropImageListener) {
|
if (overrideWindow) {
|
||||||
overrideWindow = cropImageListener->getWindow(wx, wy, ww, wh, ws);
|
cropImageListener->getWindow(wx, wy, ww, wh, ws);
|
||||||
}
|
}
|
||||||
|
|
||||||
// re-allocate sub-images and arrays if their dimensions changed
|
// re-allocate sub-images and arrays if their dimensions changed
|
||||||
|
@ -21,11 +21,11 @@
|
|||||||
//#include <giomm.h>
|
//#include <giomm.h>
|
||||||
#include <helpers.h>
|
#include <helpers.h>
|
||||||
|
|
||||||
class PListener : public rtengine::ProgressListener
|
class PListener :
|
||||||
|
public rtengine::ProgressListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void setProgressStr (Glib::ustring str)
|
void setProgressStr(const Glib::ustring& str)
|
||||||
{
|
{
|
||||||
std::cout << str << std::endl;
|
std::cout << str << std::endl;
|
||||||
}
|
}
|
||||||
@ -33,11 +33,16 @@ public:
|
|||||||
{
|
{
|
||||||
std::cout << p << std::endl;
|
std::cout << p << std::endl;
|
||||||
}
|
}
|
||||||
|
void setProgressState(bool inProcessing)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void error(const Glib::ustring& descr)
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
int main (int argc, char* argv[])
|
int main (int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
|
||||||
if (argc < 4) {
|
if (argc < 4) {
|
||||||
std::cout << "Usage: rtcmd <infile> <paramfile> <outfile>" << std::endl;
|
std::cout << "Usage: rtcmd <infile> <paramfile> <outfile>" << std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
|
195
rtengine/guidedfilter.cc
Normal file
195
rtengine/guidedfilter.cc
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
/* -*- C++ -*-
|
||||||
|
*
|
||||||
|
* This file is part of RawTherapee.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2018 Alberto Griggio <alberto.griggio@gmail.com>
|
||||||
|
*
|
||||||
|
* RawTherapee is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* RawTherapee is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a Fast Guided Filter implementation, derived directly from the
|
||||||
|
* pseudo-code of the paper:
|
||||||
|
*
|
||||||
|
* Fast Guided Filter
|
||||||
|
* by Kaiming He, Jian Sun
|
||||||
|
*
|
||||||
|
* available at https://arxiv.org/abs/1505.00996
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "guidedfilter.h"
|
||||||
|
#include "boxblur.h"
|
||||||
|
#include "rescale.h"
|
||||||
|
#include "imagefloat.h"
|
||||||
|
|
||||||
|
namespace rtengine {
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
# define DEBUG_DUMP(arr) \
|
||||||
|
do { \
|
||||||
|
Imagefloat im(arr.width(), arr.height()); \
|
||||||
|
const char *out = "/tmp/" #arr ".tif"; \
|
||||||
|
for (int y = 0; y < im.getHeight(); ++y) { \
|
||||||
|
for (int x = 0; x < im.getWidth(); ++x) { \
|
||||||
|
im.r(y, x) = im.g(y, x) = im.b(y, x) = arr[y][x] * 65535.f; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
im.saveTIFF(out, 16); \
|
||||||
|
} while (false)
|
||||||
|
#else
|
||||||
|
# define DEBUG_DUMP(arr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2D<float> &dst, int r, float epsilon, bool multithread, int subsampling)
|
||||||
|
{
|
||||||
|
const int W = src.width();
|
||||||
|
const int H = src.height();
|
||||||
|
|
||||||
|
enum Op { MUL, DIVEPSILON, ADD, SUB, ADDMUL, SUBMUL };
|
||||||
|
|
||||||
|
const auto apply =
|
||||||
|
[=](Op op, array2D<float> &res, const array2D<float> &a, const array2D<float> &b, const array2D<float> &c=array2D<float>()) -> void
|
||||||
|
{
|
||||||
|
const int w = res.width();
|
||||||
|
const int h = res.height();
|
||||||
|
|
||||||
|
#ifdef _OPENMP
|
||||||
|
#pragma omp parallel for if (multithread)
|
||||||
|
#endif
|
||||||
|
for (int y = 0; y < h; ++y) {
|
||||||
|
for (int x = 0; x < w; ++x) {
|
||||||
|
float r;
|
||||||
|
float aa = a[y][x];
|
||||||
|
float bb = b[y][x];
|
||||||
|
switch (op) {
|
||||||
|
case MUL:
|
||||||
|
r = aa * bb;
|
||||||
|
break;
|
||||||
|
case DIVEPSILON:
|
||||||
|
r = aa / (bb + epsilon);
|
||||||
|
break;
|
||||||
|
case ADD:
|
||||||
|
r = aa + bb;
|
||||||
|
break;
|
||||||
|
case SUB:
|
||||||
|
r = aa - bb;
|
||||||
|
break;
|
||||||
|
case ADDMUL:
|
||||||
|
r = aa * bb + c[y][x];
|
||||||
|
break;
|
||||||
|
case SUBMUL:
|
||||||
|
r = c[y][x] - (aa * bb);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
r = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
res[y][x] = r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// use the terminology of the paper (Algorithm 2)
|
||||||
|
const array2D<float> &I = guide;
|
||||||
|
const array2D<float> &p = src;
|
||||||
|
array2D<float> &q = dst;
|
||||||
|
|
||||||
|
const auto f_mean =
|
||||||
|
[](array2D<float> &d, array2D<float> &s, int rad) -> void
|
||||||
|
{
|
||||||
|
rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1);
|
||||||
|
boxblur<float, float>(s, d, rad, rad, s.width(), s.height());
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto f_subsample =
|
||||||
|
[=](array2D<float> &d, const array2D<float> &s) -> void
|
||||||
|
{
|
||||||
|
rescaleBilinear(s, d, multithread);
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto f_upsample = f_subsample;
|
||||||
|
|
||||||
|
const int w = W / subsampling;
|
||||||
|
const int h = H / subsampling;
|
||||||
|
|
||||||
|
array2D<float> I1(w, h);
|
||||||
|
array2D<float> p1(w, h);
|
||||||
|
|
||||||
|
f_subsample(I1, I);
|
||||||
|
f_subsample(p1, p);
|
||||||
|
|
||||||
|
DEBUG_DUMP(I);
|
||||||
|
DEBUG_DUMP(p);
|
||||||
|
DEBUG_DUMP(I1);
|
||||||
|
DEBUG_DUMP(p1);
|
||||||
|
|
||||||
|
float r1 = float(r) / subsampling;
|
||||||
|
|
||||||
|
array2D<float> meanI(w, h);
|
||||||
|
f_mean(meanI, I1, r1);
|
||||||
|
DEBUG_DUMP(meanI);
|
||||||
|
|
||||||
|
array2D<float> meanp(w, h);
|
||||||
|
f_mean(meanp, p1, r1);
|
||||||
|
DEBUG_DUMP(meanp);
|
||||||
|
|
||||||
|
array2D<float> &corrIp = p1;
|
||||||
|
apply(MUL, corrIp, I1, p1);
|
||||||
|
f_mean(corrIp, corrIp, r1);
|
||||||
|
DEBUG_DUMP(corrIp);
|
||||||
|
|
||||||
|
array2D<float> &corrI = I1;
|
||||||
|
apply(MUL, corrI, I1, I1);
|
||||||
|
f_mean(corrI, corrI, r1);
|
||||||
|
DEBUG_DUMP(corrI);
|
||||||
|
|
||||||
|
array2D<float> &varI = corrI;
|
||||||
|
apply(SUBMUL, varI, meanI, meanI, corrI);
|
||||||
|
DEBUG_DUMP(varI);
|
||||||
|
|
||||||
|
array2D<float> &covIp = corrIp;
|
||||||
|
apply(SUBMUL, covIp, meanI, meanp, corrIp);
|
||||||
|
DEBUG_DUMP(covIp);
|
||||||
|
|
||||||
|
array2D<float> &a = varI;
|
||||||
|
apply(DIVEPSILON, a, covIp, varI);
|
||||||
|
DEBUG_DUMP(a);
|
||||||
|
|
||||||
|
array2D<float> &b = covIp;
|
||||||
|
apply(SUBMUL, b, a, meanI, meanp);
|
||||||
|
DEBUG_DUMP(b);
|
||||||
|
|
||||||
|
array2D<float> &meana = a;
|
||||||
|
f_mean(meana, a, r1);
|
||||||
|
DEBUG_DUMP(meana);
|
||||||
|
|
||||||
|
array2D<float> &meanb = b;
|
||||||
|
f_mean(meanb, b, r1);
|
||||||
|
DEBUG_DUMP(meanb);
|
||||||
|
|
||||||
|
array2D<float> meanA(W, H);
|
||||||
|
f_upsample(meanA, meana);
|
||||||
|
DEBUG_DUMP(meanA);
|
||||||
|
|
||||||
|
array2D<float> &meanB = q;
|
||||||
|
f_upsample(meanB, meanb);
|
||||||
|
DEBUG_DUMP(meanB);
|
||||||
|
|
||||||
|
apply(ADDMUL, q, meanA, I, meanB);
|
||||||
|
DEBUG_DUMP(q);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace rtengine
|
@ -1,7 +1,8 @@
|
|||||||
/*
|
/* -*- C++ -*-
|
||||||
|
*
|
||||||
* This file is part of RawTherapee.
|
* This file is part of RawTherapee.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
|
* Copyright (c) 2018 Alberto Griggio <alberto.griggio@gmail.com>
|
||||||
*
|
*
|
||||||
* RawTherapee is free software: you can redistribute it and/or modify
|
* RawTherapee is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -16,16 +17,13 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#ifndef _MOUNTSELECTIONLISTENER_
|
|
||||||
#define _MOUNTSELECTIONLISTENER_
|
|
||||||
|
|
||||||
#include <glibmm.h>
|
#pragma once
|
||||||
|
|
||||||
class MountSelectionListener
|
#include "array2D.h"
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
namespace rtengine {
|
||||||
virtual void mountSelectionChanged (Glib::ustring mountRoot) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
void guidedFilter(const array2D<float> &guide, const array2D<float> &src, array2D<float> &dst, int r, float epsilon, bool multithread, int subsampling=4);
|
||||||
|
|
||||||
|
} // namespace rtengine
|
@ -29,7 +29,6 @@ typedef enum IIO_Sample_Format {
|
|||||||
//IIOSF_SIGNED_INT , // Not yet supported
|
//IIOSF_SIGNED_INT , // Not yet supported
|
||||||
IIOSF_UNSIGNED_CHAR = 1 << 0,
|
IIOSF_UNSIGNED_CHAR = 1 << 0,
|
||||||
IIOSF_UNSIGNED_SHORT = 1 << 1,
|
IIOSF_UNSIGNED_SHORT = 1 << 1,
|
||||||
//IIOSF_HALF , // OpenEXR & NVidia's Half Float, not yet supported
|
|
||||||
IIOSF_LOGLUV24 = 1 << 2,
|
IIOSF_LOGLUV24 = 1 << 2,
|
||||||
IIOSF_LOGLUV32 = 1 << 3,
|
IIOSF_LOGLUV32 = 1 << 3,
|
||||||
IIOSF_FLOAT16 = 1 << 4,
|
IIOSF_FLOAT16 = 1 << 4,
|
||||||
|
@ -704,7 +704,7 @@ int ImageIO::getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat,
|
|||||||
sFormat = IIOSF_UNSIGNED_SHORT;
|
sFormat = IIOSF_UNSIGNED_SHORT;
|
||||||
return IMIO_SUCCESS;
|
return IMIO_SUCCESS;
|
||||||
}
|
}
|
||||||
} else if (samplesperpixel == 3 && sampleformat == SAMPLEFORMAT_IEEEFP) {
|
} else if ((samplesperpixel == 3 || samplesperpixel == 4) && sampleformat == SAMPLEFORMAT_IEEEFP) {
|
||||||
if (bitspersample==16) {
|
if (bitspersample==16) {
|
||||||
sFormat = IIOSF_FLOAT16;
|
sFormat = IIOSF_FLOAT16;
|
||||||
return IMIO_SUCCESS;
|
return IMIO_SUCCESS;
|
||||||
@ -718,7 +718,7 @@ int ImageIO::getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat,
|
|||||||
return IMIO_SUCCESS;
|
return IMIO_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (samplesperpixel == 3 && photometric == PHOTOMETRIC_LOGLUV) {
|
} else if ((samplesperpixel == 3 || samplesperpixel == 4) && photometric == PHOTOMETRIC_LOGLUV) {
|
||||||
if (compression == COMPRESSION_SGILOG24) {
|
if (compression == COMPRESSION_SGILOG24) {
|
||||||
sFormat = IIOSF_LOGLUV24;
|
sFormat = IIOSF_LOGLUV24;
|
||||||
return IMIO_SUCCESS;
|
return IMIO_SUCCESS;
|
||||||
|
@ -1022,7 +1022,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
|
|||||||
|
|
||||||
// process crop, if needed
|
// process crop, if needed
|
||||||
for (size_t i = 0; i < crops.size(); i++)
|
for (size_t i = 0; i < crops.size(); i++)
|
||||||
if (crops[i]->hasListener() && (panningRelatedChange || (todo & M_MONITOR) || crops[i]->get_skip() == 1)) {
|
if (crops[i]->hasListener() && (panningRelatedChange || (todo & (M_MONITOR | M_RGBCURVE | M_LUMACURVE)) || crops[i]->get_skip() == 1)) {
|
||||||
crops[i]->update(todo); // may call ourselves
|
crops[i]->update(todo); // may call ourselves
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "gauss.h"
|
#include "gauss.h"
|
||||||
#include "sleef.c"
|
#include "sleef.c"
|
||||||
#include "opthelper.h"
|
#include "opthelper.h"
|
||||||
|
#include "guidedfilter.h"
|
||||||
|
|
||||||
namespace rtengine {
|
namespace rtengine {
|
||||||
|
|
||||||
@ -33,10 +34,31 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
|||||||
|
|
||||||
const int width = lab->W;
|
const int width = lab->W;
|
||||||
const int height = lab->H;
|
const int height = lab->H;
|
||||||
|
const bool lab_mode = params->sh.lab;
|
||||||
|
|
||||||
array2D<float> mask(width, height);
|
array2D<float> mask(width, height);
|
||||||
const float sigma = params->sh.radius * 5.f / scale;
|
array2D<float> L(width, height);
|
||||||
LUTf f(32768);
|
const float radius = float(params->sh.radius) * 10 / scale;
|
||||||
|
LUTf f(lab_mode ? 32768 : 65536);
|
||||||
|
|
||||||
|
TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile);
|
||||||
|
TMatrix iws = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile);
|
||||||
|
|
||||||
|
const auto rgb2lab =
|
||||||
|
[&](float R, float G, float B, float &l, float &a, float &b) -> void
|
||||||
|
{
|
||||||
|
float x, y, z;
|
||||||
|
Color::rgbxyz(R, G, B, x, y, z, ws);
|
||||||
|
Color::XYZ2Lab(x, y, z, l, a, b);
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto lab2rgb =
|
||||||
|
[&](float l, float a, float b, float &R, float &G, float &B) -> void
|
||||||
|
{
|
||||||
|
float x, y, z;
|
||||||
|
Color::Lab2XYZ(l, a, b, x, y, z);
|
||||||
|
Color::xyz2rgb(x, y, z, R, G, B, iws);
|
||||||
|
};
|
||||||
|
|
||||||
const auto apply =
|
const auto apply =
|
||||||
[&](int amount, int tonalwidth, bool hl) -> void
|
[&](int amount, int tonalwidth, bool hl) -> void
|
||||||
@ -45,26 +67,23 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
|||||||
const float scale = hl ? (thresh > 0.f ? 0.9f / thresh : 1.f) : thresh * 0.9f;
|
const float scale = hl ? (thresh > 0.f ? 0.9f / thresh : 1.f) : thresh * 0.9f;
|
||||||
|
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
#pragma omp parallel if (multiThread)
|
#pragma omp parallel for if (multiThread)
|
||||||
#endif
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp for
|
|
||||||
#endif
|
#endif
|
||||||
for (int y = 0; y < height; ++y) {
|
for (int y = 0; y < height; ++y) {
|
||||||
for (int x = 0; x < width; ++x) {
|
for (int x = 0; x < width; ++x) {
|
||||||
float l = lab->L[y][x];
|
float l = lab->L[y][x];
|
||||||
|
float l1 = l / 32768.f;
|
||||||
if (hl) {
|
if (hl) {
|
||||||
mask[y][x] = (l > thresh) ? 1.f : pow4(l * scale);
|
mask[y][x] = (l > thresh) ? 1.f : pow4(l * scale);
|
||||||
|
L[y][x] = 1.f - l1;
|
||||||
} else {
|
} else {
|
||||||
mask[y][x] = l <= thresh ? 1.f : pow4(scale / l);
|
mask[y][x] = l <= thresh ? 1.f : pow4(scale / l);
|
||||||
|
L[y][x] = l1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gaussianBlur(mask, mask, width, height, sigma);
|
guidedFilter(L, mask, mask, radius, 0.075, multiThread, 4);
|
||||||
}
|
|
||||||
|
|
||||||
const float base = std::pow(4.f, float(amount)/100.f);
|
const float base = std::pow(4.f, float(amount)/100.f);
|
||||||
const float gamma = hl ? base : 1.f / base;
|
const float gamma = hl ? base : 1.f / base;
|
||||||
@ -80,6 +99,7 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
|||||||
});
|
});
|
||||||
|
|
||||||
if(!hl) {
|
if(!hl) {
|
||||||
|
if (lab_mode) {
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
#pragma omp parallel for if (multiThread)
|
#pragma omp parallel for if (multiThread)
|
||||||
#endif
|
#endif
|
||||||
@ -90,17 +110,23 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
|||||||
f[l] = base * 32768.f;
|
f[l] = base * 32768.f;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifdef __SSE2__
|
#ifdef _OPENMP
|
||||||
vfloat c32768v = F2V(32768.f);
|
#pragma omp parallel for if (multiThread)
|
||||||
vfloat lv = _mm_setr_ps(0,1,2,3);
|
#endif
|
||||||
vfloat fourv = F2V(4.f);
|
for (int c = 0; c < 65536; ++c) {
|
||||||
vfloat gammav = F2V(gamma);
|
float l, a, b;
|
||||||
for (int l = 0; l < 32768; l += 4) {
|
float R = c, G = c, B = c;
|
||||||
vfloat basev = pow_F(lv / c32768v, gammav);
|
rgb2lab(R, G, B, l, a, b);
|
||||||
STVFU(f[l], basev * c32768v);
|
auto base = pow_F(l / 32768.f, gamma);
|
||||||
lv += fourv;
|
// get a bit more contrast in the shadows
|
||||||
|
base = sh_contrast.getVal(base);
|
||||||
|
l = base * 32768.f;
|
||||||
|
lab2rgb(l, a, b, R, G, B);
|
||||||
|
f[c] = G;
|
||||||
}
|
}
|
||||||
#else
|
}
|
||||||
|
} else {
|
||||||
|
if (lab_mode) {
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
#pragma omp parallel for if (multiThread)
|
#pragma omp parallel for if (multiThread)
|
||||||
#endif
|
#endif
|
||||||
@ -108,7 +134,20 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
|||||||
auto base = pow_F(l / 32768.f, gamma);
|
auto base = pow_F(l / 32768.f, gamma);
|
||||||
f[l] = base * 32768.f;
|
f[l] = base * 32768.f;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
#ifdef _OPENMP
|
||||||
|
#pragma omp parallel for if (multiThread)
|
||||||
#endif
|
#endif
|
||||||
|
for (int c = 0; c < 65536; ++c) {
|
||||||
|
float l, a, b;
|
||||||
|
float R = c, G = c, B = c;
|
||||||
|
rgb2lab(R, G, B, l, a, b);
|
||||||
|
auto base = pow_F(l / 32768.f, gamma);
|
||||||
|
l = base * 32768.f;
|
||||||
|
lab2rgb(l, a, b, R, G, B);
|
||||||
|
f[c] = G;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
@ -117,9 +156,10 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
|||||||
for (int y = 0; y < height; ++y) {
|
for (int y = 0; y < height; ++y) {
|
||||||
for (int x = 0; x < width; ++x) {
|
for (int x = 0; x < width; ++x) {
|
||||||
float l = lab->L[y][x];
|
float l = lab->L[y][x];
|
||||||
float blend = mask[y][x];
|
float blend = LIM01(mask[y][x]);
|
||||||
float orig = 1.f - blend;
|
float orig = 1.f - blend;
|
||||||
if (l >= 0.f && l < 32768.f) {
|
if (l >= 0.f && l < 32768.f) {
|
||||||
|
if (lab_mode) {
|
||||||
lab->L[y][x] = f[l] * blend + l * orig;
|
lab->L[y][x] = f[l] * blend + l * orig;
|
||||||
if (!hl && l > 1.f) {
|
if (!hl && l > 1.f) {
|
||||||
// when pushing shadows, scale also the chromaticity
|
// when pushing shadows, scale also the chromaticity
|
||||||
@ -129,17 +169,25 @@ void ImProcFunctions::shadowsHighlights(LabImage *lab)
|
|||||||
lab->a[y][x] = a * s + a * orig;
|
lab->a[y][x] = a * s + a * orig;
|
||||||
lab->b[y][x] = b * s + b * orig;
|
lab->b[y][x] = b * s + b * orig;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
float rgb[3];
|
||||||
|
lab2rgb(l, lab->a[y][x], lab->b[y][x], rgb[0], rgb[1], rgb[2]);
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
rgb[i] = f[rgb[i]] * blend + rgb[i] * orig;
|
||||||
|
}
|
||||||
|
rgb2lab(rgb[0], rgb[1], rgb[2], lab->L[y][x], lab->a[y][x], lab->b[y][x]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (params->sh.highlights > 0) {
|
if (params->sh.highlights > 0) {
|
||||||
apply(params->sh.highlights, params->sh.htonalwidth, true);
|
apply(params->sh.highlights * 0.7, params->sh.htonalwidth, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params->sh.shadows > 0) {
|
if (params->sh.shadows > 0) {
|
||||||
apply(params->sh.shadows, params->sh.stonalwidth, false);
|
apply(params->sh.shadows * 0.6, params->sh.stonalwidth, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1501,7 +1501,8 @@ SHParams::SHParams() :
|
|||||||
htonalwidth(70),
|
htonalwidth(70),
|
||||||
shadows(0),
|
shadows(0),
|
||||||
stonalwidth(30),
|
stonalwidth(30),
|
||||||
radius(40)
|
radius(40),
|
||||||
|
lab(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1513,7 +1514,8 @@ bool SHParams::operator ==(const SHParams& other) const
|
|||||||
&& htonalwidth == other.htonalwidth
|
&& htonalwidth == other.htonalwidth
|
||||||
&& shadows == other.shadows
|
&& shadows == other.shadows
|
||||||
&& stonalwidth == other.stonalwidth
|
&& stonalwidth == other.stonalwidth
|
||||||
&& radius == other.radius;
|
&& radius == other.radius
|
||||||
|
&& lab == other.lab;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHParams::operator !=(const SHParams& other) const
|
bool SHParams::operator !=(const SHParams& other) const
|
||||||
@ -3337,6 +3339,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
|
|||||||
saveToKeyfile(!pedited || pedited->sh.shadows, "Shadows & Highlights", "Shadows", sh.shadows, keyFile);
|
saveToKeyfile(!pedited || pedited->sh.shadows, "Shadows & Highlights", "Shadows", sh.shadows, keyFile);
|
||||||
saveToKeyfile(!pedited || pedited->sh.stonalwidth, "Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth, keyFile);
|
saveToKeyfile(!pedited || pedited->sh.stonalwidth, "Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth, keyFile);
|
||||||
saveToKeyfile(!pedited || pedited->sh.radius, "Shadows & Highlights", "Radius", sh.radius, keyFile);
|
saveToKeyfile(!pedited || pedited->sh.radius, "Shadows & Highlights", "Radius", sh.radius, keyFile);
|
||||||
|
saveToKeyfile(!pedited || pedited->sh.lab, "Shadows & Highlights", "Lab", sh.lab, keyFile);
|
||||||
|
|
||||||
// Crop
|
// Crop
|
||||||
saveToKeyfile(!pedited || pedited->crop.enabled, "Crop", "Enabled", crop.enabled, keyFile);
|
saveToKeyfile(!pedited || pedited->crop.enabled, "Crop", "Enabled", crop.enabled, keyFile);
|
||||||
@ -4389,6 +4392,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
|
|||||||
assignFromKeyfile(keyFile, "Shadows & Highlights", "Shadows", pedited, sh.shadows, pedited->sh.shadows);
|
assignFromKeyfile(keyFile, "Shadows & Highlights", "Shadows", pedited, sh.shadows, pedited->sh.shadows);
|
||||||
assignFromKeyfile(keyFile, "Shadows & Highlights", "ShadowTonalWidth", pedited, sh.stonalwidth, pedited->sh.stonalwidth);
|
assignFromKeyfile(keyFile, "Shadows & Highlights", "ShadowTonalWidth", pedited, sh.stonalwidth, pedited->sh.stonalwidth);
|
||||||
assignFromKeyfile(keyFile, "Shadows & Highlights", "Radius", pedited, sh.radius, pedited->sh.radius);
|
assignFromKeyfile(keyFile, "Shadows & Highlights", "Radius", pedited, sh.radius, pedited->sh.radius);
|
||||||
|
if (ppVersion >= 344) {
|
||||||
|
assignFromKeyfile(keyFile, "Shadows & Highlights", "Lab", pedited, sh.lab, pedited->sh.lab);
|
||||||
|
} else {
|
||||||
|
sh.lab = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (keyFile.has_key("Shadows & Highlights", "LocalContrast") && ppVersion < 329) {
|
if (keyFile.has_key("Shadows & Highlights", "LocalContrast") && ppVersion < 329) {
|
||||||
int lc = keyFile.get_integer("Shadows & Highlights", "LocalContrast");
|
int lc = keyFile.get_integer("Shadows & Highlights", "LocalContrast");
|
||||||
|
@ -756,6 +756,7 @@ struct SHParams {
|
|||||||
int shadows;
|
int shadows;
|
||||||
int stonalwidth;
|
int stonalwidth;
|
||||||
int radius;
|
int radius;
|
||||||
|
bool lab;
|
||||||
|
|
||||||
SHParams();
|
SHParams();
|
||||||
|
|
||||||
|
@ -39,14 +39,14 @@ class ProfileStoreListener
|
|||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~ProfileStoreListener() {}
|
virtual ~ProfileStoreListener() = default;
|
||||||
|
|
||||||
/** @brief Called whenever the current value has to be stored before update. */
|
/** @brief Called whenever the current value has to be stored before update. */
|
||||||
virtual void storeCurrentValue() {}
|
virtual void storeCurrentValue() = 0;
|
||||||
/** @brief Called whenever the file list has been updated and the content of the listener has to be updated. */
|
/** @brief Called whenever the file list has been updated and the content of the listener has to be updated. */
|
||||||
virtual void updateProfileList() = 0;
|
virtual void updateProfileList() = 0;
|
||||||
/** @brief Called whenever the profile list has changed and the old value have to be restored (if possible). */
|
/** @brief Called whenever the profile list has changed and the old value have to be restored (if possible). */
|
||||||
virtual void restoreValue() {}
|
virtual void restoreValue() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @brief ProfileStoreEntry type (folder or file)
|
/// @brief ProfileStoreEntry type (folder or file)
|
||||||
|
99
rtengine/rescale.h
Normal file
99
rtengine/rescale.h
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/* -*- C++ -*-
|
||||||
|
*
|
||||||
|
* This file is part of RawTherapee.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2018 Alberto Griggio <alberto.griggio@gmail.com>
|
||||||
|
*
|
||||||
|
* RawTherapee is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* RawTherapee is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "array2D.h"
|
||||||
|
|
||||||
|
namespace rtengine {
|
||||||
|
|
||||||
|
inline float getBilinearValue(const array2D<float> &src, float x, float y)
|
||||||
|
{
|
||||||
|
const int W = src.width();
|
||||||
|
const int H = src.height();
|
||||||
|
|
||||||
|
// Get integer and fractional parts of numbers
|
||||||
|
int xi = x;
|
||||||
|
int yi = y;
|
||||||
|
float xf = x - xi;
|
||||||
|
float yf = y - yi;
|
||||||
|
int xi1 = std::min(xi + 1, W - 1);
|
||||||
|
int yi1 = std::min(yi + 1, H - 1);
|
||||||
|
|
||||||
|
float bl = src[yi][xi];
|
||||||
|
float br = src[yi][xi1];
|
||||||
|
float tl = src[yi1][xi];
|
||||||
|
float tr = src[yi1][xi1];
|
||||||
|
|
||||||
|
// interpolate
|
||||||
|
float b = xf * br + (1.f - xf) * bl;
|
||||||
|
float t = xf * tr + (1.f - xf) * tl;
|
||||||
|
float pxf = yf * t + (1.f - yf) * b;
|
||||||
|
return pxf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void rescaleBilinear(const array2D<float> &src, array2D<float> &dst, bool multithread)
|
||||||
|
{
|
||||||
|
const int Ws = src.width();
|
||||||
|
const int Hs = src.height();
|
||||||
|
const int Wd = dst.width();
|
||||||
|
const int Hd = dst.height();
|
||||||
|
|
||||||
|
float col_scale = float (Ws) / float (Wd);
|
||||||
|
float row_scale = float (Hs) / float (Hd);
|
||||||
|
|
||||||
|
#ifdef _OPENMP
|
||||||
|
#pragma omp parallel for if (multithread)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (int y = 0; y < Hd; ++y) {
|
||||||
|
float ymrs = y * row_scale;
|
||||||
|
|
||||||
|
for (int x = 0; x < Wd; ++x) {
|
||||||
|
dst[y][x] = getBilinearValue(src, x * col_scale, ymrs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void rescaleNearest(const array2D<float> &src, array2D<float> &dst, bool multithread)
|
||||||
|
{
|
||||||
|
const int width = src.width();
|
||||||
|
const int height = src.height();
|
||||||
|
const int nw = dst.width();
|
||||||
|
const int nh = dst.height();
|
||||||
|
|
||||||
|
#ifdef _OPENMP
|
||||||
|
#pragma omp parallel for if (multithread)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (int y = 0; y < nh; ++y) {
|
||||||
|
int sy = y * height / nh;
|
||||||
|
|
||||||
|
for (int x = 0; x < nw; ++x) {
|
||||||
|
int sx = x * width / nw;
|
||||||
|
dst[y][x] = src[sy][sx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace rtengine
|
@ -155,21 +155,20 @@ public:
|
|||||||
/** This listener interface is used to indicate the progress of time consuming operations */
|
/** This listener interface is used to indicate the progress of time consuming operations */
|
||||||
class ProgressListener
|
class ProgressListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~ProgressListener() {}
|
virtual ~ProgressListener() = default;
|
||||||
/** This member function is called when the percentage of the progress has been changed.
|
/** This member function is called when the percentage of the progress has been changed.
|
||||||
* @param p is a number between 0 and 1 */
|
* @param p is a number between 0 and 1 */
|
||||||
virtual void setProgress (double p) {}
|
virtual void setProgress(double p) = 0;
|
||||||
/** This member function is called when a textual information corresponding to the progress has been changed.
|
/** This member function is called when a textual information corresponding to the progress has been changed.
|
||||||
* @param str is the textual information corresponding to the progress */
|
* @param str is the textual information corresponding to the progress */
|
||||||
virtual void setProgressStr (Glib::ustring str) {}
|
virtual void setProgressStr(const Glib::ustring& str) = 0;
|
||||||
/** This member function is called when the state of the processing has been changed.
|
/** This member function is called when the state of the processing has been changed.
|
||||||
* @param inProcessing =true if the processing has been started, =false if it has been stopped */
|
* @param inProcessing =true if the processing has been started, =false if it has been stopped */
|
||||||
virtual void setProgressState (bool inProcessing) {}
|
virtual void setProgressState(bool inProcessing) = 0;
|
||||||
/** This member function is called when an error occurs during the operation.
|
/** This member function is called when an error occurs during the operation.
|
||||||
* @param descr is the error message */
|
* @param descr is the error message */
|
||||||
virtual void error (Glib::ustring descr) {}
|
virtual void error(const Glib::ustring& descr) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ImageSource;
|
class ImageSource;
|
||||||
@ -220,20 +219,20 @@ public:
|
|||||||
class PreviewImageListener
|
class PreviewImageListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~PreviewImageListener() {}
|
virtual ~PreviewImageListener() = default;
|
||||||
/** With this member function the staged processor notifies the listener that it allocated a new
|
/** With this member function the staged processor notifies the listener that it allocated a new
|
||||||
* image to store the end result of the processing. It can be used in a shared manner.
|
* image to store the end result of the processing. It can be used in a shared manner.
|
||||||
* @param img is a pointer to the image
|
* @param img is a pointer to the image
|
||||||
* @param scale describes the current scaling applied compared to the 100% size (preview scale)
|
* @param scale describes the current scaling applied compared to the 100% size (preview scale)
|
||||||
* @param cp holds the coordinates of the current crop rectangle */
|
* @param cp holds the coordinates of the current crop rectangle */
|
||||||
virtual void setImage (IImage8* img, double scale, procparams::CropParams cp) {}
|
virtual void setImage(IImage8* img, double scale, const procparams::CropParams& cp) = 0;
|
||||||
/** With this member function the staged processor notifies the listener that the image passed as parameter
|
/** With this member function the staged processor notifies the listener that the image passed as parameter
|
||||||
* will be deleted, and no longer used to store the preview image.
|
* will be deleted, and no longer used to store the preview image.
|
||||||
* @param img the pointer to the image to be destroyed. The listener has to free the image! */
|
* @param img the pointer to the image to be destroyed. The listener has to free the image! */
|
||||||
virtual void delImage (IImage8* img) {}
|
virtual void delImage(IImage8* img) = 0;
|
||||||
/** With this member function the staged processor notifies the listener that the preview image has been updated.
|
/** With this member function the staged processor notifies the listener that the preview image has been updated.
|
||||||
* @param cp holds the coordinates of the current crop rectangle */
|
* @param cp holds the coordinates of the current crop rectangle */
|
||||||
virtual void imageReady (procparams::CropParams cp) {}
|
virtual void imageReady(const procparams::CropParams& cp) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** When the detailed crop image is ready for display during staged processing (thus the changes have been updated),
|
/** When the detailed crop image is ready for display during staged processing (thus the changes have been updated),
|
||||||
@ -243,52 +242,70 @@ public:
|
|||||||
class DetailedCropListener
|
class DetailedCropListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~DetailedCropListener() {}
|
virtual ~DetailedCropListener() = default;
|
||||||
/** With this member function the staged processor notifies the listener that the detailed crop image has been updated.
|
/** With this member function the staged processor notifies the listener that the detailed crop image has been updated.
|
||||||
* @param img is a pointer to the detailed crop image */
|
* @param img is a pointer to the detailed crop image */
|
||||||
virtual void setDetailedCrop (IImage8* img, IImage8* imgtrue, procparams::ColorManagementParams cmp,
|
virtual void setDetailedCrop(
|
||||||
procparams::CropParams cp, int cx, int cy, int cw, int ch, int skip) {}
|
IImage8* img,
|
||||||
virtual bool getWindow (int& cx, int& cy, int& cw, int& ch, int& skip)
|
IImage8* imgtrue,
|
||||||
{
|
const procparams::ColorManagementParams& cmp,
|
||||||
return false;
|
const procparams::CropParams& cp,
|
||||||
}
|
int cx,
|
||||||
// virtual void setPosition (int x, int y, bool update=true) {}
|
int cy,
|
||||||
|
int cw,
|
||||||
|
int ch,
|
||||||
|
int skip
|
||||||
|
) = 0;
|
||||||
|
virtual void getWindow(int& cx, int& cy, int& cw, int& ch, int& skip) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** This listener is used when the full size of the final image has been changed (e.g. rotated by 90 deg.) */
|
/** This listener is used when the full size of the final image has been changed (e.g. rotated by 90 deg.) */
|
||||||
class SizeListener
|
class SizeListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~SizeListener() {}
|
virtual ~SizeListener() = default;
|
||||||
/** This member function is called when the size of the final image has been changed
|
/** This member function is called when the size of the final image has been changed
|
||||||
* @param w is the width of the final image (without cropping)
|
* @param w is the width of the final image (without cropping)
|
||||||
* @param h is the height of the final image (without cropping)
|
* @param h is the height of the final image (without cropping)
|
||||||
* @param ow is the width of the final image (without resizing and cropping)
|
* @param ow is the width of the final image (without resizing and cropping)
|
||||||
* @param oh is the height of the final image (without resizing and cropping) */
|
* @param oh is the height of the final image (without resizing and cropping) */
|
||||||
virtual void sizeChanged (int w, int h, int ow, int oh) {}
|
virtual void sizeChanged(int w, int h, int ow, int oh) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** This listener is used when the histogram of the final image has changed. */
|
/** This listener is used when the histogram of the final image has changed. */
|
||||||
class HistogramListener
|
class HistogramListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~HistogramListener() {}
|
virtual ~HistogramListener() = default;
|
||||||
/** This member function is called when the histogram of the final image has changed.
|
/** This member function is called when the histogram of the final image has changed.
|
||||||
* @param histRed is the array of size 256 containing the histogram of the red channel
|
* @param histRed is the array of size 256 containing the histogram of the red channel
|
||||||
* @param histGreen is the array of size 256 containing the histogram of the green channel
|
* @param histGreen is the array of size 256 containing the histogram of the green channel
|
||||||
* @param histBlue is the array of size 256 containing the histogram of the blue channel
|
* @param histBlue is the array of size 256 containing the histogram of the blue channel
|
||||||
* @param histLuma is the array of size 256 containing the histogram of the luminance channel
|
* @param histLuma is the array of size 256 containing the histogram of the luminance channel
|
||||||
* other for curves backgrounds, histRAW is RAW without colors */
|
* other for curves backgrounds, histRAW is RAW without colors */
|
||||||
virtual void histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve,LUTu & histLLCurve, */LUTu & histLCAM, LUTu & histCCAM,
|
virtual void histogramChanged(
|
||||||
LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI) {}
|
const LUTu& histRed,
|
||||||
|
const LUTu& histGreen,
|
||||||
|
const LUTu& histBlue,
|
||||||
|
const LUTu& histLuma,
|
||||||
|
const LUTu& histToneCurve,
|
||||||
|
const LUTu& histLCurve,
|
||||||
|
const LUTu& histCCurve,
|
||||||
|
const LUTu& histLCAM,
|
||||||
|
const LUTu& histCCAM,
|
||||||
|
const LUTu& histRedRaw,
|
||||||
|
const LUTu& histGreenRaw,
|
||||||
|
const LUTu& histBlueRaw,
|
||||||
|
const LUTu& histChroma,
|
||||||
|
const LUTu& histLRETI
|
||||||
|
) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** This listener is used when the auto exposure has been recomputed (e.g. when the clipping ratio changed). */
|
/** This listener is used when the auto exposure has been recomputed (e.g. when the clipping ratio changed). */
|
||||||
class AutoExpListener
|
class AutoExpListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~AutoExpListener() {}
|
virtual ~AutoExpListener() = default;
|
||||||
/** This member function is called when the auto exposure has been recomputed.
|
/** This member function is called when the auto exposure has been recomputed.
|
||||||
* @param brightness is the new brightness value (in logarithmic scale)
|
* @param brightness is the new brightness value (in logarithmic scale)
|
||||||
* @param bright is the new ...
|
* @param bright is the new ...
|
||||||
@ -297,52 +314,48 @@ public:
|
|||||||
* @param hlcompr is the new highlight recovery amount
|
* @param hlcompr is the new highlight recovery amount
|
||||||
* @param hlcomprthresh is the new threshold for hlcompr
|
* @param hlcomprthresh is the new threshold for hlcompr
|
||||||
* @param hlrecons set to true if HighLight Reconstruction is enabled */
|
* @param hlrecons set to true if HighLight Reconstruction is enabled */
|
||||||
virtual void autoExpChanged (double brightness, int bright, int contrast, int black, int hlcompr, int hlcomprthresh, bool hlrecons) {}
|
virtual void autoExpChanged(double brightness, int bright, int contrast, int black, int hlcompr, int hlcomprthresh, bool hlrecons) = 0;
|
||||||
|
|
||||||
virtual void autoMatchedToneCurveChanged(procparams::ToneCurveParams::TcMode curveMode, const std::vector<double> &curve) {}
|
virtual void autoMatchedToneCurveChanged(procparams::ToneCurveParams::TcMode curveMode, const std::vector<double>& curve) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AutoCamListener
|
class AutoCamListener
|
||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
virtual ~AutoCamListener() {}
|
virtual ~AutoCamListener() = default;
|
||||||
virtual void autoCamChanged (double ccam, double ccamout) {}
|
virtual void autoCamChanged(double ccam, double ccamout) = 0;
|
||||||
virtual void adapCamChanged (double cadap) {}
|
virtual void adapCamChanged(double cadap) = 0;
|
||||||
virtual void ybCamChanged (int yb) {}
|
virtual void ybCamChanged(int yb) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class AutoChromaListener
|
class AutoChromaListener
|
||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
virtual ~AutoChromaListener() {}
|
virtual ~AutoChromaListener() = default;
|
||||||
virtual void chromaChanged (double autchroma, double autred, double autblue) {}
|
virtual void chromaChanged(double autchroma, double autred, double autblue) = 0;
|
||||||
virtual void noiseChanged (double nresid, double highresid) {}
|
virtual void noiseChanged(double nresid, double highresid) = 0;
|
||||||
virtual void noiseTilePrev (int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP) {}
|
virtual void noiseTilePrev(int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class RetinexListener
|
class RetinexListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~RetinexListener() {}
|
virtual ~RetinexListener() = default;
|
||||||
virtual void minmaxChanged (double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax) {}
|
virtual void minmaxChanged(double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class AutoColorTonListener
|
class AutoColorTonListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~AutoColorTonListener() {}
|
virtual ~AutoColorTonListener() = default;
|
||||||
virtual void autoColorTonChanged (int bwct, int satthres, int satprot) {}
|
virtual void autoColorTonChanged(int bwct, int satthres, int satprot) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AutoBWListener
|
class AutoBWListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~AutoBWListener() {}
|
virtual ~AutoBWListener() = default;
|
||||||
virtual void BWChanged (double redbw, double greenbw, double bluebw) {}
|
virtual void BWChanged(double redbw, double greenbw, double bluebw) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class AutoWBListener
|
class AutoWBListener
|
||||||
@ -369,12 +382,11 @@ public :
|
|||||||
class WaveletListener
|
class WaveletListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~WaveletListener() {}
|
virtual ~WaveletListener() = default;
|
||||||
virtual void wavChanged (double nlevel) {}
|
virtual void wavChanged(double nlevel) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/** This class represents a detailed part of the image (looking through a kind of window).
|
/** This class represents a detailed part of the image (looking through a kind of window).
|
||||||
* It can be created and destroyed with the appropriate members of StagedImageProcessor.
|
* It can be created and destroyed with the appropriate members of StagedImageProcessor.
|
||||||
* Several crops can be assigned to the same image. */
|
* Several crops can be assigned to the same image. */
|
||||||
@ -556,7 +568,6 @@ public:
|
|||||||
* @param img is the result of the last ProcessingJob
|
* @param img is the result of the last ProcessingJob
|
||||||
* @return the next ProcessingJob to process */
|
* @return the next ProcessingJob to process */
|
||||||
virtual ProcessingJob* imageReady(IImagefloat* img) = 0;
|
virtual ProcessingJob* imageReady(IImagefloat* img) = 0;
|
||||||
virtual void error (Glib::ustring message) = 0;
|
|
||||||
};
|
};
|
||||||
/** This function performs all the image processing steps corresponding to the given ProcessingJob. It runs in the background, thus it returns immediately,
|
/** This function performs all the image processing steps corresponding to the given ProcessingJob. It runs in the background, thus it returns immediately,
|
||||||
* When it finishes, it calls the BatchProcessingListener with the resulting image and asks for the next job. It the listener gives a new job, it goes on
|
* When it finishes, it calls the BatchProcessingListener with the resulting image and asks for the next job. It the listener gives a new job, it goes on
|
||||||
|
@ -21,11 +21,11 @@
|
|||||||
//#include <giomm.h>
|
//#include <giomm.h>
|
||||||
#include <helpers.h>
|
#include <helpers.h>
|
||||||
|
|
||||||
class PListener : public rtengine::ProgressListener
|
class PListener :
|
||||||
|
public rtengine::ProgressListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void setProgressStr (Glib::ustring str)
|
void setProgressStr(const Glib::ustring& str)
|
||||||
{
|
{
|
||||||
std::cout << str << std::endl;
|
std::cout << str << std::endl;
|
||||||
}
|
}
|
||||||
@ -33,11 +33,16 @@ public:
|
|||||||
{
|
{
|
||||||
std::cout << p << std::endl;
|
std::cout << p << std::endl;
|
||||||
}
|
}
|
||||||
|
void setProgressState(bool inProcessing)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void error(const Glib::ustring& descr)
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
int main (int argc, char* argv[])
|
int main (int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
|
||||||
if (argc < 4) {
|
if (argc < 4) {
|
||||||
std::cout << "Usage: rtcmd <infile> <paramfile> <outfile>" << std::endl;
|
std::cout << "Usage: rtcmd <infile> <paramfile> <outfile>" << std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -73,6 +73,7 @@
|
|||||||
#include "sleef.c"
|
#include "sleef.c"
|
||||||
#include "opthelper.h"
|
#include "opthelper.h"
|
||||||
#include "rt_algo.h"
|
#include "rt_algo.h"
|
||||||
|
#include "rescale.h"
|
||||||
|
|
||||||
namespace rtengine
|
namespace rtengine
|
||||||
{
|
{
|
||||||
@ -938,66 +939,14 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/*
|
|||||||
* RT code from here on
|
* RT code from here on
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
inline float get_bilinear_value (const Array2Df &src, float x, float y)
|
inline void rescale_bilinear (const Array2Df &src, Array2Df &dst, bool multithread)
|
||||||
{
|
{
|
||||||
// Get integer and fractional parts of numbers
|
rescaleBilinear(src, dst, multithread);
|
||||||
int xi = x;
|
|
||||||
int yi = y;
|
|
||||||
float xf = x - xi;
|
|
||||||
float yf = y - yi;
|
|
||||||
int xi1 = std::min (xi + 1, src.getCols() - 1);
|
|
||||||
int yi1 = std::min (yi + 1, src.getRows() - 1);
|
|
||||||
|
|
||||||
float bl = src (xi, yi);
|
|
||||||
float br = src (xi1, yi);
|
|
||||||
float tl = src (xi, yi1);
|
|
||||||
float tr = src (xi1, yi1);
|
|
||||||
|
|
||||||
// interpolate
|
|
||||||
float b = xf * br + (1.f - xf) * bl;
|
|
||||||
float t = xf * tr + (1.f - xf) * tl;
|
|
||||||
float pxf = yf * t + (1.f - yf) * b;
|
|
||||||
return pxf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void rescale_nearest (const Array2Df &src, Array2Df &dst, bool multithread)
|
||||||
void rescale_bilinear (const Array2Df &src, Array2Df &dst, bool multithread)
|
|
||||||
{
|
{
|
||||||
float col_scale = float (src.getCols()) / float (dst.getCols());
|
rescaleNearest(src, dst, multithread);
|
||||||
float row_scale = float (src.getRows()) / float (dst.getRows());
|
|
||||||
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for if (multithread)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < dst.getRows(); ++y) {
|
|
||||||
float ymrs = y * row_scale;
|
|
||||||
|
|
||||||
for (int x = 0; x < dst.getCols(); ++x) {
|
|
||||||
dst (x, y) = get_bilinear_value (src, x * col_scale, ymrs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rescale_nearest (const Array2Df &src, Array2Df &dst, bool multithread)
|
|
||||||
{
|
|
||||||
const int width = src.getCols();
|
|
||||||
const int height = src.getRows();
|
|
||||||
const int nw = dst.getCols();
|
|
||||||
const int nh = dst.getRows();
|
|
||||||
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#pragma omp parallel for if (multithread)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < nh; ++y) {
|
|
||||||
int sy = y * height / nh;
|
|
||||||
|
|
||||||
for (int x = 0; x < nw; ++x) {
|
|
||||||
int sx = x * width / nw;
|
|
||||||
dst (x, y) = src (sx, sy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3043,7 +3043,7 @@ void ExifManager::parse (bool isRaw, bool skipIgnored)
|
|||||||
if (!sftTagList.empty()) {
|
if (!sftTagList.empty()) {
|
||||||
for (auto sft : sftTagList) {
|
for (auto sft : sftTagList) {
|
||||||
int sftVal = sft->toInt();
|
int sftVal = sft->toInt();
|
||||||
if (sftVal == (isRaw ? 0 : 2)) {
|
if (sftVal == 0 || (!isRaw && sftVal == 2)) {
|
||||||
frames.push_back(sft->getParent());
|
frames.push_back(sft->getParent());
|
||||||
frameRootDetected = true;
|
frameRootDetected = true;
|
||||||
|
|
||||||
|
@ -24,13 +24,13 @@
|
|||||||
#include "guiutils.h"
|
#include "guiutils.h"
|
||||||
|
|
||||||
class Adjuster;
|
class Adjuster;
|
||||||
|
|
||||||
class AdjusterListener
|
class AdjusterListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~AdjusterListener() {};
|
virtual ~AdjusterListener() = default;
|
||||||
virtual void adjusterChanged (Adjuster* a, double newval) {}
|
virtual void adjusterChanged (Adjuster* a, double newval) = 0;
|
||||||
virtual void adjusterAutoToggled (Adjuster* a, bool newval) {}
|
virtual void adjusterAutoToggled (Adjuster* a, bool newval) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef double(*double2double_fun)(double val);
|
typedef double(*double2double_fun)(double val);
|
||||||
|
@ -39,6 +39,27 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace rtengine;
|
using namespace rtengine;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
struct NLParams {
|
||||||
|
BatchQueueListener* listener;
|
||||||
|
int qsize;
|
||||||
|
bool queueEmptied;
|
||||||
|
bool queueError;
|
||||||
|
Glib::ustring queueErrorMessage;
|
||||||
|
};
|
||||||
|
|
||||||
|
int bqnotifylistenerUI (void* data)
|
||||||
|
{
|
||||||
|
NLParams* params = static_cast<NLParams*>(data);
|
||||||
|
params->listener->queueSizeChanged (params->qsize, params->queueEmptied, params->queueError, params->queueErrorMessage);
|
||||||
|
delete params;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(nullptr), fileCatalog(aFileCatalog), sequence(0), listener(nullptr)
|
BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(nullptr), fileCatalog(aFileCatalog), sequence(0), listener(nullptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -580,9 +601,54 @@ void BatchQueue::startProcessing ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BatchQueue::setProgress(double p)
|
||||||
|
{
|
||||||
|
if (processing) {
|
||||||
|
processing->progress = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No need to acquire the GUI, setProgressUI will do it
|
||||||
|
const auto func = [](gpointer data) -> gboolean {
|
||||||
|
static_cast<BatchQueue*>(data)->redraw();
|
||||||
|
return FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
idle_register.add(func, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BatchQueue::setProgressStr(const Glib::ustring& str)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void BatchQueue::setProgressState(bool inProcessing)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void BatchQueue::error(const Glib::ustring& descr)
|
||||||
|
{
|
||||||
|
if (processing && processing->processing) {
|
||||||
|
// restore failed thumb
|
||||||
|
BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (processing);
|
||||||
|
bqbs->setButtonListener (this);
|
||||||
|
processing->addButtonSet (bqbs);
|
||||||
|
processing->processing = false;
|
||||||
|
processing->job = rtengine::ProcessingJob::create(processing->filename, processing->thumbnail->getType() == FT_Raw, processing->params);
|
||||||
|
processing = nullptr;
|
||||||
|
redraw ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (listener) {
|
||||||
|
NLParams* params = new NLParams;
|
||||||
|
params->listener = listener;
|
||||||
|
params->queueEmptied = false;
|
||||||
|
params->queueError = true;
|
||||||
|
params->queueErrorMessage = descr;
|
||||||
|
idle_register.add(bqnotifylistenerUI, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img)
|
rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img)
|
||||||
{
|
{
|
||||||
|
|
||||||
// save image img
|
// save image img
|
||||||
Glib::ustring fname;
|
Glib::ustring fname;
|
||||||
SaveFormat saveFormat;
|
SaveFormat saveFormat;
|
||||||
@ -892,22 +958,6 @@ Glib::ustring BatchQueue::autoCompleteFileName (const Glib::ustring& fileName, c
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchQueue::setProgress (double p)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (processing) {
|
|
||||||
processing->progress = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No need to acquire the GUI, setProgressUI will do it
|
|
||||||
const auto func = [](gpointer data) -> gboolean {
|
|
||||||
static_cast<BatchQueue*>(data)->redraw();
|
|
||||||
return FALSE;
|
|
||||||
};
|
|
||||||
|
|
||||||
idle_register.add(func, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionData)
|
void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionData)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -923,22 +973,6 @@ void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionDa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NLParams {
|
|
||||||
BatchQueueListener* listener;
|
|
||||||
int qsize;
|
|
||||||
bool queueEmptied;
|
|
||||||
bool queueError;
|
|
||||||
Glib::ustring queueErrorMessage;
|
|
||||||
};
|
|
||||||
|
|
||||||
int bqnotifylistenerUI (void* data)
|
|
||||||
{
|
|
||||||
NLParams* params = static_cast<NLParams*>(data);
|
|
||||||
params->listener->queueSizeChanged (params->qsize, params->queueEmptied, params->queueError, params->queueErrorMessage);
|
|
||||||
delete params;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BatchQueue::notifyListener (bool queueEmptied)
|
void BatchQueue::notifyListener (bool queueEmptied)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -960,27 +994,3 @@ void BatchQueue::redrawNeeded (LWButton* button)
|
|||||||
GThreadLock lock;
|
GThreadLock lock;
|
||||||
queue_draw ();
|
queue_draw ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchQueue::error (Glib::ustring msg)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (processing && processing->processing) {
|
|
||||||
// restore failed thumb
|
|
||||||
BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (processing);
|
|
||||||
bqbs->setButtonListener (this);
|
|
||||||
processing->addButtonSet (bqbs);
|
|
||||||
processing->processing = false;
|
|
||||||
processing->job = rtengine::ProcessingJob::create(processing->filename, processing->thumbnail->getType() == FT_Raw, processing->params);
|
|
||||||
processing = nullptr;
|
|
||||||
redraw ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (listener) {
|
|
||||||
NLParams* params = new NLParams;
|
|
||||||
params->listener = listener;
|
|
||||||
params->queueEmptied = false;
|
|
||||||
params->queueError = true;
|
|
||||||
params->queueErrorMessage = msg;
|
|
||||||
idle_register.add(bqnotifylistenerUI, params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -30,8 +30,8 @@ class BatchQueueListener
|
|||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~BatchQueueListener () {}
|
virtual ~BatchQueueListener() = default;
|
||||||
virtual void queueSizeChanged (int qsize, bool queueEmptied, bool queueError, Glib::ustring queueErrorMessage) = 0;
|
virtual void queueSizeChanged(int qsize, bool queueEmptied, bool queueError, const Glib::ustring& queueErrorMessage) = 0;
|
||||||
virtual bool canStartNext() = 0;
|
virtual bool canStartNext() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -62,9 +62,12 @@ public:
|
|||||||
return (!fd.empty());
|
return (!fd.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
rtengine::ProcessingJob* imageReady (rtengine::IImagefloat* img);
|
|
||||||
void error (Glib::ustring msg);
|
|
||||||
void setProgress(double p);
|
void setProgress(double p);
|
||||||
|
void setProgressStr(const Glib::ustring& str);
|
||||||
|
void setProgressState(bool inProcessing);
|
||||||
|
void error(const Glib::ustring& descr);
|
||||||
|
rtengine::ProcessingJob* imageReady(rtengine::IImagefloat* img);
|
||||||
|
|
||||||
void rightClicked (ThumbBrowserEntryBase* entry);
|
void rightClicked (ThumbBrowserEntryBase* entry);
|
||||||
void doubleClicked (ThumbBrowserEntryBase* entry);
|
void doubleClicked (ThumbBrowserEntryBase* entry);
|
||||||
bool keyPressed (GdkEventKey* event);
|
bool keyPressed (GdkEventKey* event);
|
||||||
|
@ -245,7 +245,7 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchQueuePanel::queueSizeChanged (int qsize, bool queueEmptied, bool queueError, Glib::ustring queueErrorMessage)
|
void BatchQueuePanel::queueSizeChanged(int qsize, bool queueEmptied, bool queueError, const Glib::ustring& queueErrorMessage)
|
||||||
{
|
{
|
||||||
updateTab (qsize);
|
updateTab (qsize);
|
||||||
|
|
||||||
@ -311,9 +311,8 @@ void BatchQueuePanel::stopBatchProc ()
|
|||||||
updateTab (batchQueue->getEntries().size());
|
updateTab (batchQueue->getEntries().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchQueuePanel::addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries, bool head)
|
void BatchQueuePanel::addBatchQueueJobs(const std::vector<BatchQueueEntry*>& entries, bool head)
|
||||||
{
|
{
|
||||||
|
|
||||||
batchQueue->addEntries(entries, head);
|
batchQueue->addEntries(entries, head);
|
||||||
|
|
||||||
if (!qStartStop->get_active() && qAutoStart->get_active()) {
|
if (!qStartStop->get_active() && qAutoStart->get_active()) {
|
||||||
|
@ -59,10 +59,10 @@ public:
|
|||||||
|
|
||||||
void init (RTWindow* parent);
|
void init (RTWindow* parent);
|
||||||
|
|
||||||
void addBatchQueueJobs (std::vector<BatchQueueEntry*> &entries , bool head = false);
|
void addBatchQueueJobs(const std::vector<BatchQueueEntry*>& entries , bool head = false);
|
||||||
|
|
||||||
// batchqueuelistener interface
|
// batchqueuelistener interface
|
||||||
void queueSizeChanged (int qsize, bool queueEmptied, bool queueError, Glib::ustring queueErrorMessage);
|
void queueSizeChanged(int qsize, bool queueEmptied, bool queueError, const Glib::ustring& queueErrorMessage);
|
||||||
bool canStartNext();
|
bool canStartNext();
|
||||||
|
|
||||||
void startBatchProc ();
|
void startBatchProc ();
|
||||||
|
@ -134,6 +134,10 @@ void BayerPreProcess::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BayerPreProcess::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void BayerPreProcess::setBatchMode(bool batchMode)
|
void BayerPreProcess::setBatchMode(bool batchMode)
|
||||||
{
|
{
|
||||||
ToolPanel::setBatchMode (batchMode);
|
ToolPanel::setBatchMode (batchMode);
|
||||||
|
@ -47,6 +47,8 @@ public:
|
|||||||
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
|
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
|
||||||
|
|
||||||
void adjusterChanged(Adjuster* a, double newval);
|
void adjusterChanged(Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
|
|
||||||
void hotDeadPixelChanged();
|
void hotDeadPixelChanged();
|
||||||
void setAdjusterBehavior (bool linedenoiseadd, bool greenequiladd);
|
void setAdjusterBehavior (bool linedenoiseadd, bool greenequiladd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
|
@ -539,6 +539,10 @@ void BayerProcess::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BayerProcess::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void BayerProcess::methodChanged ()
|
void BayerProcess::methodChanged ()
|
||||||
{
|
{
|
||||||
const int currentSelection = method->get_active_row_number();
|
const int currentSelection = method->get_active_row_number();
|
||||||
|
@ -80,6 +80,7 @@ public:
|
|||||||
void methodChanged();
|
void methodChanged();
|
||||||
void imageNumberChanged();
|
void imageNumberChanged();
|
||||||
void adjusterChanged(Adjuster* a, double newval);
|
void adjusterChanged(Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled (Adjuster* a, bool newval);
|
||||||
void checkBoxToggled(CheckBox* c, CheckValue newval);
|
void checkBoxToggled(CheckBox* c, CheckValue newval);
|
||||||
void pixelShiftMotionMethodChanged();
|
void pixelShiftMotionMethodChanged();
|
||||||
void pixelShiftDemosaicMethodChanged();
|
void pixelShiftDemosaicMethodChanged();
|
||||||
|
@ -148,6 +148,10 @@ void BayerRAWExposure::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BayerRAWExposure::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void BayerRAWExposure::checkBoxToggled (CheckBox* c, CheckValue newval)
|
void BayerRAWExposure::checkBoxToggled (CheckBox* c, CheckValue newval)
|
||||||
{
|
{
|
||||||
if (c == PextwoGreen) {
|
if (c == PextwoGreen) {
|
||||||
|
@ -43,6 +43,7 @@ public:
|
|||||||
void setBatchMode (bool batchMode);
|
void setBatchMode (bool batchMode);
|
||||||
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
|
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled (Adjuster* a, bool newval);
|
||||||
void checkBoxToggled (CheckBox* c, CheckValue newval);
|
void checkBoxToggled (CheckBox* c, CheckValue newval);
|
||||||
void setAdjusterBehavior (bool pexblackadd);
|
void setAdjusterBehavior (bool pexblackadd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
|
@ -1096,7 +1096,6 @@ void BlackWhite::autoch_toggled ()
|
|||||||
|
|
||||||
void BlackWhite::adjusterChanged(Adjuster* a, double newval)
|
void BlackWhite::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Checking "listener" to avoid "autoch" getting toggled off because it has to change the sliders when toggling on
|
// Checking "listener" to avoid "autoch" getting toggled off because it has to change the sliders when toggling on
|
||||||
if (listener && (a == mixerRed || a == mixerGreen || a == mixerBlue || a == mixerOrange || a == mixerYellow || a == mixerMagenta || a == mixerPurple || a == mixerCyan) ) {
|
if (listener && (a == mixerRed || a == mixerGreen || a == mixerBlue || a == mixerOrange || a == mixerYellow || a == mixerMagenta || a == mixerPurple || a == mixerCyan) ) {
|
||||||
if (multiImage && autoch->get_inconsistent()) {
|
if (multiImage && autoch->get_inconsistent()) {
|
||||||
@ -1147,6 +1146,10 @@ void BlackWhite::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlackWhite::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void BlackWhite::updateRGBLabel ()
|
void BlackWhite::updateRGBLabel ()
|
||||||
{
|
{
|
||||||
if (!batchMode) {
|
if (!batchMode) {
|
||||||
|
@ -53,6 +53,7 @@ public:
|
|||||||
|
|
||||||
void updateRGBLabel ();
|
void updateRGBLabel ();
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled (Adjuster* a, bool newval);
|
||||||
void setAdjusterBehavior (bool bwadd, bool bwgadd);
|
void setAdjusterBehavior (bool bwadd, bool bwgadd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
void enabledcc_toggled ();
|
void enabledcc_toggled ();
|
||||||
|
@ -28,8 +28,8 @@ class BQEntryUpdateListener
|
|||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~BQEntryUpdateListener () {}
|
virtual ~BQEntryUpdateListener() = default;
|
||||||
virtual void updateImage (guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) {}
|
virtual void updateImage(guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BatchQueueEntryUpdater
|
class BatchQueueEntryUpdater
|
||||||
|
@ -97,6 +97,10 @@ void CACorrection::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CACorrection::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void CACorrection::setAdjusterBehavior (bool badd)
|
void CACorrection::setAdjusterBehavior (bool badd)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ public:
|
|||||||
void setBatchMode (bool batchMode);
|
void setBatchMode (bool batchMode);
|
||||||
|
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void setAdjusterBehavior (bool badd);
|
void setAdjusterBehavior (bool badd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
};
|
};
|
||||||
|
@ -33,10 +33,9 @@ enum class CheckValue {
|
|||||||
|
|
||||||
class CheckBoxListener
|
class CheckBoxListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~CheckBoxListener() {};
|
virtual ~CheckBoxListener() = default;
|
||||||
virtual void checkBoxToggled (CheckBox* c, CheckValue newval) {}
|
virtual void checkBoxToggled(CheckBox* c, CheckValue newval) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -179,6 +179,9 @@ void ChMixer::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChMixer::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void ChMixer::enabledChanged()
|
void ChMixer::enabledChanged()
|
||||||
{
|
{
|
||||||
|
@ -42,6 +42,7 @@ public:
|
|||||||
void setBatchMode (bool batchMode);
|
void setBatchMode (bool batchMode);
|
||||||
|
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void setAdjusterBehavior (bool rgbadd);
|
void setAdjusterBehavior (bool rgbadd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
void enabledChanged();
|
void enabledChanged();
|
||||||
|
@ -1546,7 +1546,6 @@ void ColorAppearance::colorForValue (double valX, double valY, enum ColorCaller:
|
|||||||
|
|
||||||
void ColorAppearance::adjusterChanged(Adjuster* a, double newval)
|
void ColorAppearance::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (listener && (multiImage || getEnabled()) ) {
|
if (listener && (multiImage || getEnabled()) ) {
|
||||||
if (a == degree) {
|
if (a == degree) {
|
||||||
listener->panelChanged (EvCATDegree, a->getTextValue());
|
listener->panelChanged (EvCATDegree, a->getTextValue());
|
||||||
@ -1596,7 +1595,6 @@ void ColorAppearance::adjusterChanged (Adjuster* a, double newval)
|
|||||||
|
|
||||||
void ColorAppearance::adjusterAutoToggled(Adjuster* a, bool newval)
|
void ColorAppearance::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (multiImage) {
|
if (multiImage) {
|
||||||
if (degree->getAutoInconsistent()) {
|
if (degree->getAutoInconsistent()) {
|
||||||
degree->setAutoInconsistent (false);
|
degree->setAutoInconsistent (false);
|
||||||
@ -1844,9 +1842,19 @@ void ColorAppearance::setBatchMode (bool batchMode)
|
|||||||
curveEditorG3->setBatchMode (batchMode);
|
curveEditorG3->setBatchMode (batchMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorAppearance::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI)
|
void ColorAppearance::updateCurveBackgroundHistogram(
|
||||||
|
const LUTu& histToneCurve,
|
||||||
|
const LUTu& histLCurve,
|
||||||
|
const LUTu& histCCurve,
|
||||||
|
const LUTu& histLCAM,
|
||||||
|
const LUTu& histCCAM,
|
||||||
|
const LUTu& histRed,
|
||||||
|
const LUTu& histGreen,
|
||||||
|
const LUTu& histBlue,
|
||||||
|
const LUTu& histLuma,
|
||||||
|
const LUTu& histLRETI
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
shape->updateBackgroundHistogram(histLCAM);
|
shape->updateBackgroundHistogram(histLCAM);
|
||||||
shape3->updateBackgroundHistogram(histCCAM);
|
shape3->updateBackgroundHistogram(histCCAM);
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,18 @@ public:
|
|||||||
|
|
||||||
void setAdjusterBehavior (bool degreeadd, bool adapscenadd, bool adaplumadd, bool badpixsladd, bool jlightadd, bool chromaadd, bool contrastadd, bool rstprotectionadd, bool qbrightadd, bool qcontrastadd, bool schromaadd, bool mchromaadd, bool colorhadd);
|
void setAdjusterBehavior (bool degreeadd, bool adapscenadd, bool adaplumadd, bool badpixsladd, bool jlightadd, bool chromaadd, bool contrastadd, bool rstprotectionadd, bool qbrightadd, bool qcontrastadd, bool schromaadd, bool mchromaadd, bool colorhadd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI);
|
void updateCurveBackgroundHistogram(
|
||||||
|
const LUTu& histToneCurve,
|
||||||
|
const LUTu& histLCurve,
|
||||||
|
const LUTu& histCCurve,
|
||||||
|
const LUTu& histLCAM,
|
||||||
|
const LUTu& histCCAM,
|
||||||
|
const LUTu& histRed,
|
||||||
|
const LUTu& histGreen,
|
||||||
|
const LUTu& histBlue,
|
||||||
|
const LUTu& histLuma,
|
||||||
|
const LUTu& histLRETI
|
||||||
|
);
|
||||||
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller);
|
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller);
|
||||||
void updateToolState (std::vector<int> &tpOpen);
|
void updateToolState (std::vector<int> &tpOpen);
|
||||||
void writeOptions (std::vector<int> &tpOpen);
|
void writeOptions (std::vector<int> &tpOpen);
|
||||||
|
@ -688,13 +688,6 @@ void ColorToning::setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorToning::adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop)
|
|
||||||
{
|
|
||||||
if (listener && getEnabled())
|
|
||||||
listener->panelChanged (a == hlColSat ? EvColorToningHighights : EvColorToningShadows,
|
|
||||||
Glib::ustring::compose(Glib::ustring(M("TP_COLORTONING_HUE") + ": %1" + "\n" + M("TP_COLORTONING_STRENGTH") + ": %2"), int(newTop), int(newBottom)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ColorToning::autoColorTonChanged(int bwct, int satthres, int satprot)
|
void ColorToning::autoColorTonChanged(int bwct, int satthres, int satprot)
|
||||||
{
|
{
|
||||||
nextbw = bwct;
|
nextbw = bwct;
|
||||||
@ -731,40 +724,32 @@ bool ColorToning::CTComp_ ()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorToning::adjusterChanged (Adjuster* a, double newval)
|
void ColorToning::adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop)
|
||||||
{
|
{
|
||||||
|
if (listener && getEnabled()) {
|
||||||
if (!listener || !getEnabled()) {
|
listener->panelChanged(
|
||||||
return;
|
a == hlColSat
|
||||||
|
? EvColorToningHighights
|
||||||
|
: EvColorToningShadows,
|
||||||
|
Glib::ustring::compose(Glib::ustring(M("TP_COLORTONING_HUE") + ": %1" + "\n" + M("TP_COLORTONING_STRENGTH") + ": %2"), int(newTop), int(newBottom))
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a == redlow) {
|
void ColorToning::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight)
|
||||||
listener->panelChanged (EvColorToningredlow, redlow->getTextValue());
|
{
|
||||||
} else if (a == greenlow) {
|
|
||||||
listener->panelChanged (EvColorToninggreenlow, greenlow->getTextValue());
|
|
||||||
} else if (a == bluelow) {
|
|
||||||
listener->panelChanged (EvColorToningbluelow, bluelow->getTextValue());
|
|
||||||
} else if (a == redmed) {
|
|
||||||
listener->panelChanged (EvColorToningredmed, redmed->getTextValue());
|
|
||||||
} else if (a == greenmed) {
|
|
||||||
listener->panelChanged (EvColorToninggreenmed, greenmed->getTextValue());
|
|
||||||
} else if (a == bluemed) {
|
|
||||||
listener->panelChanged (EvColorToningbluemed, bluemed->getTextValue());
|
|
||||||
} else if (a == redhigh) {
|
|
||||||
listener->panelChanged (EvColorToningredhigh, redhigh->getTextValue());
|
|
||||||
} else if (a == greenhigh) {
|
|
||||||
listener->panelChanged (EvColorToninggreenhigh, greenhigh->getTextValue());
|
|
||||||
} else if (a == bluehigh) {
|
|
||||||
listener->panelChanged (EvColorToningbluehigh, bluehigh->getTextValue());
|
|
||||||
} else if (a == balance) {
|
|
||||||
listener->panelChanged (EvColorToningbalance, balance->getTextValue());
|
|
||||||
} else if (a == satProtectionThreshold) {
|
|
||||||
listener->panelChanged (EvColorToningSatThreshold, a->getTextValue());
|
|
||||||
} else if (a == saturatedOpacity) {
|
|
||||||
listener->panelChanged (EvColorToningSatProtection, a->getTextValue());
|
|
||||||
} else if (a == strength) {
|
|
||||||
listener->panelChanged (EvColorToningStrength, a->getTextValue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ColorToning::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorToning::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorToning::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
//Two Color changed
|
//Two Color changed
|
||||||
@ -1141,6 +1126,45 @@ void ColorToning::trimValues (rtengine::procparams::ProcParams* pp)
|
|||||||
bluehigh->trimValue(pp->colorToning.bluehigh);
|
bluehigh->trimValue(pp->colorToning.bluehigh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ColorToning::adjusterChanged(Adjuster* a, double newval)
|
||||||
|
{
|
||||||
|
if (!listener || !getEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a == redlow) {
|
||||||
|
listener->panelChanged (EvColorToningredlow, redlow->getTextValue());
|
||||||
|
} else if (a == greenlow) {
|
||||||
|
listener->panelChanged (EvColorToninggreenlow, greenlow->getTextValue());
|
||||||
|
} else if (a == bluelow) {
|
||||||
|
listener->panelChanged (EvColorToningbluelow, bluelow->getTextValue());
|
||||||
|
} else if (a == redmed) {
|
||||||
|
listener->panelChanged (EvColorToningredmed, redmed->getTextValue());
|
||||||
|
} else if (a == greenmed) {
|
||||||
|
listener->panelChanged (EvColorToninggreenmed, greenmed->getTextValue());
|
||||||
|
} else if (a == bluemed) {
|
||||||
|
listener->panelChanged (EvColorToningbluemed, bluemed->getTextValue());
|
||||||
|
} else if (a == redhigh) {
|
||||||
|
listener->panelChanged (EvColorToningredhigh, redhigh->getTextValue());
|
||||||
|
} else if (a == greenhigh) {
|
||||||
|
listener->panelChanged (EvColorToninggreenhigh, greenhigh->getTextValue());
|
||||||
|
} else if (a == bluehigh) {
|
||||||
|
listener->panelChanged (EvColorToningbluehigh, bluehigh->getTextValue());
|
||||||
|
} else if (a == balance) {
|
||||||
|
listener->panelChanged (EvColorToningbalance, balance->getTextValue());
|
||||||
|
} else if (a == satProtectionThreshold) {
|
||||||
|
listener->panelChanged (EvColorToningSatThreshold, a->getTextValue());
|
||||||
|
} else if (a == saturatedOpacity) {
|
||||||
|
listener->panelChanged (EvColorToningSatProtection, a->getTextValue());
|
||||||
|
} else if (a == strength) {
|
||||||
|
listener->panelChanged (EvColorToningStrength, a->getTextValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorToning::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void ColorToning::setBatchMode (bool batchMode)
|
void ColorToning::setBatchMode (bool batchMode)
|
||||||
{
|
{
|
||||||
ToolPanel::setBatchMode (batchMode);
|
ToolPanel::setBatchMode (batchMode);
|
||||||
|
@ -32,13 +32,19 @@ public:
|
|||||||
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
|
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
void adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop);
|
void adjusterAutoToggled (Adjuster* a, bool newval);
|
||||||
void setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool satOpacityAdd, bool strprotectAdd, bool balanceAdd);
|
void setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool satOpacityAdd, bool strprotectAdd, bool balanceAdd);
|
||||||
void neutral_pressed ();
|
void neutral_pressed ();
|
||||||
//void neutralCurves_pressed ();
|
//void neutralCurves_pressed ();
|
||||||
void autoColorTonChanged (int bwct, int satthres, int satprot);
|
void autoColorTonChanged (int bwct, int satthres, int satprot);
|
||||||
bool CTComp_ ();
|
bool CTComp_ ();
|
||||||
|
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight);
|
||||||
|
void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR);
|
||||||
|
|
||||||
void enabledChanged ();
|
void enabledChanged ();
|
||||||
void curveChanged (CurveEditor* ce);
|
void curveChanged (CurveEditor* ce);
|
||||||
void autosatChanged ();
|
void autosatChanged ();
|
||||||
|
@ -522,6 +522,26 @@ void ControlSpotPanel::updateParamVisibility()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ControlSpotPanel::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void ControlSpotPanel::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void ControlSpotPanel::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void ControlSpotPanel::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void ControlSpotPanel::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void ControlSpotPanel::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
|
void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
printf("adjusterChanged\n");
|
printf("adjusterChanged\n");
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "toolpanel.h"
|
#include "toolpanel.h"
|
||||||
#include <gtkmm.h>
|
#include <gtkmm.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "thresholdadjuster.h"
|
||||||
|
|
||||||
class ControlSpotPanel:
|
class ControlSpotPanel:
|
||||||
public ToolParamBlock,
|
public ToolParamBlock,
|
||||||
@ -197,6 +198,13 @@ private:
|
|||||||
void qualityMethodChanged();
|
void qualityMethodChanged();
|
||||||
void updateParamVisibility();
|
void updateParamVisibility();
|
||||||
void adjusterChanged(Adjuster* a, double newval);
|
void adjusterChanged(Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight);
|
||||||
|
void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR);
|
||||||
|
|
||||||
void disableParamlistener(bool cond);
|
void disableParamlistener(bool cond);
|
||||||
void setParamEditable(bool cond);
|
void setParamEditable(bool cond);
|
||||||
|
|
||||||
|
@ -1261,9 +1261,8 @@ void Crop::cropManipReady ()
|
|||||||
idle_register.add(notifyListenerUI, this);
|
idle_register.add(notifyListenerUI, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
double Crop::getRatio ()
|
double Crop::getRatio () const
|
||||||
{
|
{
|
||||||
|
|
||||||
double r = -1.0;
|
double r = -1.0;
|
||||||
|
|
||||||
if (!fixr->get_active()) {
|
if (!fixr->get_active()) {
|
||||||
|
@ -76,7 +76,7 @@ public:
|
|||||||
void cropResized (int &x, int &y, int& x2, int& y2);
|
void cropResized (int &x, int &y, int& x2, int& y2);
|
||||||
void cropManipReady ();
|
void cropManipReady ();
|
||||||
bool inImageArea (int x, int y);
|
bool inImageArea (int x, int y);
|
||||||
double getRatio ();
|
double getRatio () const;
|
||||||
|
|
||||||
void setCropPanelListener (CropPanelListener* cl)
|
void setCropPanelListener (CropPanelListener* cl)
|
||||||
{
|
{
|
||||||
|
@ -23,7 +23,7 @@ class CropGUIListener
|
|||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~CropGUIListener() {}
|
virtual ~CropGUIListener() = default;
|
||||||
virtual void cropMoved(int &x, int &y, int &w, int &h) = 0;
|
virtual void cropMoved(int &x, int &y, int &w, int &h) = 0;
|
||||||
virtual void cropWidth1Resized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0;
|
virtual void cropWidth1Resized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0;
|
||||||
virtual void cropWidth2Resized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0;
|
virtual void cropWidth2Resized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0;
|
||||||
@ -37,7 +37,7 @@ public:
|
|||||||
virtual void cropResized(int &x, int &y, int& x2, int& y2) = 0;
|
virtual void cropResized(int &x, int &y, int& x2, int& y2) = 0;
|
||||||
virtual void cropManipReady() = 0;
|
virtual void cropManipReady() = 0;
|
||||||
virtual bool inImageArea(int x, int y) = 0;
|
virtual bool inImageArea(int x, int y) = 0;
|
||||||
virtual double getRatio () = 0;
|
virtual double getRatio() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -108,13 +108,7 @@ void CropHandler::newImage (StagedImageProcessor* ipc_, bool isDetailWindow)
|
|||||||
|
|
||||||
void CropHandler::sizeChanged(int x, int y, int ow, int oh) // the ipc notifies it to keep track size changes like rotation
|
void CropHandler::sizeChanged(int x, int y, int ow, int oh) // the ipc notifies it to keep track size changes like rotation
|
||||||
{
|
{
|
||||||
|
|
||||||
compDim ();
|
compDim ();
|
||||||
|
|
||||||
// this should be put into an idle source!!!
|
|
||||||
/* if (listener)
|
|
||||||
listener->cropWindowChanged ();
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CropHandler::isFullDisplay ()
|
bool CropHandler::isFullDisplay ()
|
||||||
@ -300,10 +294,18 @@ void CropHandler::getPosition (int& x, int& y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CropHandler::setDetailedCrop (IImage8* im, IImage8* imtrue, rtengine::procparams::ColorManagementParams cmp,
|
void CropHandler::setDetailedCrop(
|
||||||
rtengine::procparams::CropParams cp, int ax, int ay, int aw, int ah, int askip)
|
IImage8* im,
|
||||||
|
IImage8* imtrue,
|
||||||
|
const rtengine::procparams::ColorManagementParams& cmp,
|
||||||
|
const rtengine::procparams::CropParams& cp,
|
||||||
|
int ax,
|
||||||
|
int ay,
|
||||||
|
int aw,
|
||||||
|
int ah,
|
||||||
|
int askip
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!enabled) {
|
if (!enabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -406,9 +408,8 @@ void CropHandler::setDetailedCrop (IImage8* im, IImage8* imtrue, rtengine::procp
|
|||||||
cimg.unlock ();
|
cimg.unlock ();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CropHandler::getWindow (int& cwx, int& cwy, int& cww, int& cwh, int& cskip)
|
void CropHandler::getWindow(int& cwx, int& cwy, int& cww, int& cwh, int& cskip)
|
||||||
{
|
{
|
||||||
|
|
||||||
cwx = cropX;
|
cwx = cropX;
|
||||||
cwy = cropY;
|
cwy = cropY;
|
||||||
cww = cropW;
|
cww = cropW;
|
||||||
@ -424,8 +425,6 @@ bool CropHandler::getWindow (int& cwx, int& cwy, int& cww, int& cwh, int& cskip)
|
|||||||
}
|
}
|
||||||
|
|
||||||
cskip = zoom >= 1000 ? 1 : zoom/10;
|
cskip = zoom >= 1000 ? 1 : zoom/10;
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CropHandler::update ()
|
void CropHandler::update ()
|
||||||
|
@ -86,9 +86,19 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DetailedCropListener interface
|
// DetailedCropListener interface
|
||||||
void setDetailedCrop (rtengine::IImage8* im, rtengine::IImage8* imworking, rtengine::procparams::ColorManagementParams cmp,
|
void setDetailedCrop(
|
||||||
rtengine::procparams::CropParams cp, int cx, int cy, int cw, int ch, int skip);
|
rtengine::IImage8* im,
|
||||||
bool getWindow (int& cwx, int& cwy, int& cww, int& cwh, int& cskip);
|
rtengine::IImage8* imworking,
|
||||||
|
const rtengine::procparams::ColorManagementParams& cmp,
|
||||||
|
const rtengine::procparams::CropParams& cp,
|
||||||
|
int cx,
|
||||||
|
int cy,
|
||||||
|
int cw,
|
||||||
|
int ch,
|
||||||
|
int skip
|
||||||
|
);
|
||||||
|
void getWindow(int& cwx, int& cwy, int& cww, int& cwh, int& cskip);
|
||||||
|
|
||||||
// SizeListener interface
|
// SizeListener interface
|
||||||
void sizeChanged (int w, int h, int ow, int oh);
|
void sizeChanged (int w, int h, int ow, int oh);
|
||||||
|
|
||||||
|
@ -32,15 +32,15 @@
|
|||||||
#include "edit.h"
|
#include "edit.h"
|
||||||
|
|
||||||
class CropWindow;
|
class CropWindow;
|
||||||
|
|
||||||
class CropWindowListener
|
class CropWindowListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~CropWindowListener() {}
|
virtual ~CropWindowListener() = default;
|
||||||
virtual void cropPositionChanged (CropWindow*) {}
|
virtual void cropPositionChanged(CropWindow*) = 0;
|
||||||
virtual void cropWindowSizeChanged (CropWindow*) {}
|
virtual void cropWindowSizeChanged(CropWindow*) = 0;
|
||||||
virtual void cropZoomChanged (CropWindow*) {}
|
virtual void cropZoomChanged(CropWindow*) = 0;
|
||||||
virtual void initialImageArrived () {}
|
virtual void initialImageArrived() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ImageArea;
|
class ImageArea;
|
||||||
|
@ -254,7 +254,7 @@ void CurveEditor::setUnChanged (bool uc)
|
|||||||
/*
|
/*
|
||||||
* Update the backgrounds histograms
|
* Update the backgrounds histograms
|
||||||
*/
|
*/
|
||||||
void CurveEditor::updateBackgroundHistogram (LUTu & hist)
|
void CurveEditor::updateBackgroundHistogram(const LUTu& hist)
|
||||||
{
|
{
|
||||||
// Copy the histogram in the curve editor cache
|
// Copy the histogram in the curve editor cache
|
||||||
if (hist) {
|
if (hist) {
|
||||||
|
@ -93,7 +93,7 @@ public:
|
|||||||
void curveTypeToggled();
|
void curveTypeToggled();
|
||||||
bool isUnChanged ();
|
bool isUnChanged ();
|
||||||
void setUnChanged (bool uc);
|
void setUnChanged (bool uc);
|
||||||
void updateBackgroundHistogram (LUTu & hist);
|
void updateBackgroundHistogram(const LUTu& hist);
|
||||||
|
|
||||||
void setLeftBarColorProvider(ColorProvider* cp, int callerId);
|
void setLeftBarColorProvider(ColorProvider* cp, int callerId);
|
||||||
void setBottomBarColorProvider(ColorProvider* cp, int callerId);
|
void setBottomBarColorProvider(ColorProvider* cp, int callerId);
|
||||||
|
@ -151,7 +151,6 @@ void Defringe::curveChanged ()
|
|||||||
|
|
||||||
void Defringe::adjusterChanged(Adjuster* a, double newval)
|
void Defringe::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (listener && getEnabled()) {
|
if (listener && getEnabled()) {
|
||||||
|
|
||||||
if (a == radius) {
|
if (a == radius) {
|
||||||
@ -162,6 +161,10 @@ void Defringe::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Defringe::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void Defringe::enabledChanged ()
|
void Defringe::enabledChanged ()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ public:
|
|||||||
void curveChanged ();
|
void curveChanged ();
|
||||||
|
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void enabledChanged ();
|
void enabledChanged ();
|
||||||
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
|
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
|
||||||
|
|
||||||
|
@ -1156,12 +1156,15 @@ void DiagonalCurveEditorSubGroup::shcChanged ()
|
|||||||
*/
|
*/
|
||||||
void DiagonalCurveEditorSubGroup::adjusterChanged(Adjuster* a, double newval)
|
void DiagonalCurveEditorSubGroup::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
paramCurve->setPoints (getCurveFromGUI(DCT_Parametric));
|
paramCurve->setPoints (getCurveFromGUI(DCT_Parametric));
|
||||||
storeDisplayedCurve();
|
storeDisplayedCurve();
|
||||||
parent->curveChanged ();
|
parent->curveChanged ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DiagonalCurveEditorSubGroup::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Listener called when the mouse is over a parametric curve's slider
|
* Listener called when the mouse is over a parametric curve's slider
|
||||||
*/
|
*/
|
||||||
|
@ -105,6 +105,7 @@ protected:
|
|||||||
const std::vector<double> getCurveFromGUI (int type);
|
const std::vector<double> getCurveFromGUI (int type);
|
||||||
void shcChanged ();
|
void shcChanged ();
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
bool adjusterEntered (GdkEventCrossing* ev, int ac);
|
bool adjusterEntered (GdkEventCrossing* ev, int ac);
|
||||||
bool adjusterLeft (GdkEventCrossing* ev, int ac);
|
bool adjusterLeft (GdkEventCrossing* ev, int ac);
|
||||||
void setSubGroupRangeLabels(Glib::ustring r1, Glib::ustring r2, Glib::ustring r3, Glib::ustring r4);
|
void setSubGroupRangeLabels(Glib::ustring r1, Glib::ustring r2, Glib::ustring r3, Glib::ustring r4);
|
||||||
|
@ -1011,9 +1011,7 @@ void DirPyrDenoise::setDefaults (const ProcParams* defParams, const ParamsEdited
|
|||||||
|
|
||||||
void DirPyrDenoise::adjusterChanged(Adjuster* a, double newval)
|
void DirPyrDenoise::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
|
const Glib::ustring costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue());
|
||||||
Glib::ustring costr;
|
|
||||||
costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue());
|
|
||||||
|
|
||||||
if (listener && getEnabled()) {
|
if (listener && getEnabled()) {
|
||||||
if (a == Ldetail) {
|
if (a == Ldetail) {
|
||||||
@ -1034,6 +1032,10 @@ void DirPyrDenoise::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DirPyrDenoise::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void DirPyrDenoise::enabledChanged ()
|
void DirPyrDenoise::enabledChanged ()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ public:
|
|||||||
void autoOpenCurve ();
|
void autoOpenCurve ();
|
||||||
|
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void enabledChanged ();
|
void enabledChanged ();
|
||||||
void medianChanged ();
|
void medianChanged ();
|
||||||
void chromaChanged (double autchroma, double autred, double autblue);
|
void chromaChanged (double autchroma, double autred, double autblue);
|
||||||
|
@ -297,6 +297,18 @@ void DirPyrEqualizer::setDefaults (const ProcParams* defParams, const ParamsEdit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight)
|
void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight)
|
||||||
{
|
{
|
||||||
if (listener && (multiImage || getEnabled()) ) {
|
if (listener && (multiImage || getEnabled()) ) {
|
||||||
@ -304,6 +316,9 @@ void DirPyrEqualizer::adjusterChanged (ThresholdAdjuster* a, int newBottomLeft,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DirPyrEqualizer::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void DirPyrEqualizer::setBatchMode (bool batchMode)
|
void DirPyrEqualizer::setBatchMode (bool batchMode)
|
||||||
{
|
{
|
||||||
@ -332,7 +347,6 @@ void DirPyrEqualizer::cbdlMethodChanged()
|
|||||||
|
|
||||||
void DirPyrEqualizer::adjusterChanged(Adjuster* a, double newval)
|
void DirPyrEqualizer::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (listener && getEnabled()) {
|
if (listener && getEnabled()) {
|
||||||
if (a == threshold) {
|
if (a == threshold) {
|
||||||
listener->panelChanged (EvDirPyrEqualizerThreshold,
|
listener->panelChanged (EvDirPyrEqualizerThreshold,
|
||||||
@ -359,6 +373,10 @@ void DirPyrEqualizer::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DirPyrEqualizer::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void DirPyrEqualizer::enabledChanged ()
|
void DirPyrEqualizer::enabledChanged ()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -63,15 +63,20 @@ public:
|
|||||||
void setBatchMode (bool batchMode);
|
void setBatchMode (bool batchMode);
|
||||||
void setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool skinadd);
|
void setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool skinadd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
void adjusterChanged (ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight);
|
|
||||||
// void algoChanged ();
|
|
||||||
void cbdlMethodChanged();
|
void cbdlMethodChanged();
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void enabledChanged();
|
void enabledChanged();
|
||||||
void gamutlabToggled ();
|
void gamutlabToggled ();
|
||||||
void lumaneutralPressed ();
|
void lumaneutralPressed ();
|
||||||
void lumacontrastPlusPressed ();
|
void lumacontrastPlusPressed ();
|
||||||
void lumacontrastMinusPressed ();
|
void lumacontrastMinusPressed ();
|
||||||
|
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop);
|
||||||
|
void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight);
|
||||||
|
void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -86,12 +86,15 @@ void Distortion::setDefaults (const ProcParams* defParams, const ParamsEdited* p
|
|||||||
|
|
||||||
void Distortion::adjusterChanged(Adjuster* a, double newval)
|
void Distortion::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (listener) {
|
if (listener) {
|
||||||
listener->panelChanged (EvDISTAmount, Glib::ustring::format (std::setw(4), std::fixed, std::setprecision(3), a->getValue()));
|
listener->panelChanged (EvDISTAmount, Glib::ustring::format (std::setw(4), std::fixed, std::setprecision(3), a->getValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Distortion::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void Distortion::setBatchMode (bool batchMode)
|
void Distortion::setBatchMode (bool batchMode)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ public:
|
|||||||
void setBatchMode (bool batchMode);
|
void setBatchMode (bool batchMode);
|
||||||
|
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled (Adjuster* a, bool newval);
|
||||||
void setAdjusterBehavior (bool vadd);
|
void setAdjusterBehavior (bool vadd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
void idPressed ();
|
void idPressed ();
|
||||||
|
@ -1159,7 +1159,12 @@ Glib::ustring EditorPanel::getFileName ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO!!!
|
// TODO!!!
|
||||||
void EditorPanel::procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited)
|
void EditorPanel::procParamsChanged(
|
||||||
|
const rtengine::procparams::ProcParams* params,
|
||||||
|
const rtengine::ProcEvent& ev,
|
||||||
|
const Glib::ustring& descr,
|
||||||
|
const ParamsEdited* paramsEdited
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
// if (ev!=EvPhotoLoaded)
|
// if (ev!=EvPhotoLoaded)
|
||||||
@ -1178,6 +1183,27 @@ void EditorPanel::procParamsChanged (rtengine::procparams::ProcParams* params, r
|
|||||||
info_toggled();
|
info_toggled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorPanel::clearParamChanges()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorPanel::setProgress(double p)
|
||||||
|
{
|
||||||
|
spparams *s = new spparams;
|
||||||
|
s->val = p;
|
||||||
|
s->pProgress = progressLabel;
|
||||||
|
idle_register.add(setprogressStrUI, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorPanel::setProgressStr(const Glib::ustring& str)
|
||||||
|
{
|
||||||
|
spparams *s = new spparams;
|
||||||
|
s->str = str;
|
||||||
|
s->val = -1;
|
||||||
|
s->pProgress = progressLabel;
|
||||||
|
idle_register.add(setprogressStrUI, s);
|
||||||
|
}
|
||||||
|
|
||||||
void EditorPanel::setProgressState(bool inProcessing)
|
void EditorPanel::setProgressState(bool inProcessing)
|
||||||
{
|
{
|
||||||
struct spsparams {
|
struct spsparams {
|
||||||
@ -1217,21 +1243,63 @@ void EditorPanel::setProgressState (bool inProcessing)
|
|||||||
idle_register.add (func, p);
|
idle_register.add (func, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPanel::setProgress (double p)
|
void EditorPanel::error(const Glib::ustring& descr)
|
||||||
{
|
{
|
||||||
spparams *s = new spparams;
|
|
||||||
s->val = p;
|
|
||||||
s->pProgress = progressLabel;
|
|
||||||
idle_register.add (setprogressStrUI, s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPanel::setProgressStr (Glib::ustring str)
|
void EditorPanel::error(const Glib::ustring& title, const Glib::ustring& descr)
|
||||||
{
|
{
|
||||||
spparams *s = new spparams;
|
struct errparams {
|
||||||
s->str = str;
|
Glib::ustring descr;
|
||||||
s->val = -1;
|
Glib::ustring title;
|
||||||
s->pProgress = progressLabel;
|
EditorPanelIdleHelper* epih;
|
||||||
idle_register.add (setprogressStrUI, s);
|
};
|
||||||
|
|
||||||
|
epih->pending++;
|
||||||
|
errparams* const p = new errparams;
|
||||||
|
p->descr = descr;
|
||||||
|
p->title = title;
|
||||||
|
p->epih = epih;
|
||||||
|
|
||||||
|
const auto func = [] (gpointer data) -> gboolean {
|
||||||
|
errparams* const p = static_cast<errparams*> (data);
|
||||||
|
|
||||||
|
if (p->epih->destroyed)
|
||||||
|
{
|
||||||
|
if (p->epih->pending == 1) {
|
||||||
|
delete p->epih;
|
||||||
|
} else {
|
||||||
|
p->epih->pending--;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete p;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p->epih->epanel->displayError (p->title, p->descr);
|
||||||
|
p->epih->pending--;
|
||||||
|
delete p;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
idle_register.add (func, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorPanel::displayError(const Glib::ustring& title, const Glib::ustring& descr)
|
||||||
|
{
|
||||||
|
GtkWidget* msgd = gtk_message_dialog_new_with_markup (nullptr,
|
||||||
|
GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||||
|
GTK_MESSAGE_ERROR,
|
||||||
|
GTK_BUTTONS_OK,
|
||||||
|
"<b>%s</b>",
|
||||||
|
descr.data());
|
||||||
|
gtk_window_set_title ((GtkWindow*)msgd, title.data());
|
||||||
|
g_signal_connect_swapped (msgd, "response",
|
||||||
|
G_CALLBACK (gtk_widget_destroy),
|
||||||
|
msgd);
|
||||||
|
gtk_widget_show_all (msgd);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is only called from the ThreadUI, so within the gtk thread
|
// This is only called from the ThreadUI, so within the gtk thread
|
||||||
@ -1286,61 +1354,6 @@ void EditorPanel::refreshProcessingState (bool inProcessingP)
|
|||||||
setprogressStrUI (s);
|
setprogressStrUI (s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPanel::displayError (Glib::ustring title, Glib::ustring descr)
|
|
||||||
{
|
|
||||||
GtkWidget* msgd = gtk_message_dialog_new_with_markup (nullptr,
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
GTK_MESSAGE_ERROR,
|
|
||||||
GTK_BUTTONS_OK,
|
|
||||||
"<b>%s</b>",
|
|
||||||
descr.data());
|
|
||||||
gtk_window_set_title ((GtkWindow*)msgd, title.data());
|
|
||||||
g_signal_connect_swapped (msgd, "response",
|
|
||||||
G_CALLBACK (gtk_widget_destroy),
|
|
||||||
msgd);
|
|
||||||
gtk_widget_show_all (msgd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditorPanel::error (Glib::ustring title, Glib::ustring descr)
|
|
||||||
{
|
|
||||||
struct errparams {
|
|
||||||
Glib::ustring descr;
|
|
||||||
Glib::ustring title;
|
|
||||||
EditorPanelIdleHelper* epih;
|
|
||||||
};
|
|
||||||
|
|
||||||
epih->pending++;
|
|
||||||
errparams* const p = new errparams;
|
|
||||||
p->descr = descr;
|
|
||||||
p->title = title;
|
|
||||||
p->epih = epih;
|
|
||||||
|
|
||||||
const auto func = [] (gpointer data) -> gboolean {
|
|
||||||
errparams* const p = static_cast<errparams*> (data);
|
|
||||||
|
|
||||||
if (p->epih->destroyed)
|
|
||||||
{
|
|
||||||
if (p->epih->pending == 1) {
|
|
||||||
delete p->epih;
|
|
||||||
} else {
|
|
||||||
p->epih->pending--;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete p;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
p->epih->epanel->displayError (p->title, p->descr);
|
|
||||||
p->epih->pending--;
|
|
||||||
delete p;
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
};
|
|
||||||
|
|
||||||
idle_register.add (func, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditorPanel::info_toggled ()
|
void EditorPanel::info_toggled ()
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -2249,15 +2262,28 @@ void EditorPanel::tbBeforeLock_toggled ()
|
|||||||
tbBeforeLock->get_active() ? tbBeforeLock->set_image (*iBeforeLockON) : tbBeforeLock->set_image (*iBeforeLockOFF);
|
tbBeforeLock->get_active() ? tbBeforeLock->set_image (*iBeforeLockON) : tbBeforeLock->set_image (*iBeforeLockOFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPanel::histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, /*LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM,
|
void EditorPanel::histogramChanged(
|
||||||
LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI)
|
const LUTu& histRed,
|
||||||
|
const LUTu& histGreen,
|
||||||
|
const LUTu& histBlue,
|
||||||
|
const LUTu& histLuma,
|
||||||
|
const LUTu& histToneCurve,
|
||||||
|
const LUTu& histLCurve,
|
||||||
|
const LUTu& histCCurve,
|
||||||
|
const LUTu& histLCAM,
|
||||||
|
const LUTu& histCCAM,
|
||||||
|
const LUTu& histRedRaw,
|
||||||
|
const LUTu& histGreenRaw,
|
||||||
|
const LUTu& histBlueRaw,
|
||||||
|
const LUTu& histChroma,
|
||||||
|
const LUTu& histLRETI
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (histogramPanel) {
|
if (histogramPanel) {
|
||||||
histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw);
|
histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw);
|
||||||
}
|
}
|
||||||
|
|
||||||
tpc->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI);
|
tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EditorPanel::CheckSidePanelsVisibility()
|
bool EditorPanel::CheckSidePanelsVisibility()
|
||||||
|
@ -45,6 +45,7 @@ struct EditorPanelIdleHelper {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class RTWindow;
|
class RTWindow;
|
||||||
|
|
||||||
class EditorPanel final :
|
class EditorPanel final :
|
||||||
public Gtk::VBox,
|
public Gtk::VBox,
|
||||||
public PParamsChangeListener,
|
public PParamsChangeListener,
|
||||||
@ -81,16 +82,24 @@ public:
|
|||||||
{
|
{
|
||||||
return realized;
|
return realized;
|
||||||
}
|
}
|
||||||
// progresslistener interface
|
// ProgressListener interface
|
||||||
void setProgress(double p);
|
void setProgress(double p);
|
||||||
void setProgressStr (Glib::ustring str);
|
void setProgressStr(const Glib::ustring& str);
|
||||||
void setProgressState(bool inProcessing);
|
void setProgressState(bool inProcessing);
|
||||||
void error (Glib::ustring title, Glib::ustring descr);
|
void error(const Glib::ustring& descr);
|
||||||
void displayError (Glib::ustring title, Glib::ustring descr); // this is called by error in the gtk thread
|
|
||||||
|
void error(const Glib::ustring& title, const Glib::ustring& descr);
|
||||||
|
void displayError(const Glib::ustring& title, const Glib::ustring& descr); // this is called by error in the gtk thread
|
||||||
void refreshProcessingState (bool inProcessing); // this is called by setProcessingState in the gtk thread
|
void refreshProcessingState (bool inProcessing); // this is called by setProcessingState in the gtk thread
|
||||||
|
|
||||||
// PParamsChangeListener interface
|
// PParamsChangeListener interface
|
||||||
void procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited = nullptr);
|
void procParamsChanged(
|
||||||
|
const rtengine::procparams::ProcParams* params,
|
||||||
|
const rtengine::ProcEvent& ev,
|
||||||
|
const Glib::ustring& descr,
|
||||||
|
const ParamsEdited* paramsEdited = nullptr
|
||||||
|
);
|
||||||
|
void clearParamChanges();
|
||||||
|
|
||||||
// thumbnaillistener interface
|
// thumbnaillistener interface
|
||||||
void procParamsChanged (Thumbnail* thm, int whoChangedIt);
|
void procParamsChanged (Thumbnail* thm, int whoChangedIt);
|
||||||
@ -99,8 +108,22 @@ public:
|
|||||||
void historyBeforeLineChanged (const rtengine::procparams::ProcParams& params);
|
void historyBeforeLineChanged (const rtengine::procparams::ProcParams& params);
|
||||||
|
|
||||||
// HistogramListener
|
// HistogramListener
|
||||||
void histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM,
|
void histogramChanged(
|
||||||
LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI);
|
const LUTu& histRed,
|
||||||
|
const LUTu& histGreen,
|
||||||
|
const LUTu& histBlue,
|
||||||
|
const LUTu& histLuma,
|
||||||
|
const LUTu& histToneCurve,
|
||||||
|
const LUTu& histLCurve,
|
||||||
|
const LUTu& histCCurve,
|
||||||
|
const LUTu& histLCAM,
|
||||||
|
const LUTu& histCCAM,
|
||||||
|
const LUTu& histRedRaw,
|
||||||
|
const LUTu& histGreenRaw,
|
||||||
|
const LUTu& histBlueRaw,
|
||||||
|
const LUTu& histChroma,
|
||||||
|
const LUTu& histLRETI
|
||||||
|
);
|
||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
void info_toggled ();
|
void info_toggled ();
|
||||||
|
@ -158,6 +158,10 @@ void EdgePreservingDecompositionUI::adjusterChanged(Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EdgePreservingDecompositionUI::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void EdgePreservingDecompositionUI::enabledChanged ()
|
void EdgePreservingDecompositionUI::enabledChanged ()
|
||||||
{
|
{
|
||||||
if (listener) {
|
if (listener) {
|
||||||
|
@ -42,6 +42,7 @@ public:
|
|||||||
void setBatchMode (bool batchMode);
|
void setBatchMode (bool batchMode);
|
||||||
|
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void enabledChanged ();
|
void enabledChanged ();
|
||||||
void setAdjusterBehavior (bool stAdd, bool gAdd, bool esAdd, bool scAdd, bool rAdd);
|
void setAdjusterBehavior (bool stAdd, bool gAdd, bool esAdd, bool scAdd, bool rAdd);
|
||||||
};
|
};
|
||||||
|
@ -26,9 +26,10 @@
|
|||||||
|
|
||||||
class ExportPanelListener
|
class ExportPanelListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void exportRequested () {}
|
virtual ~ExportPanelListener() = default;
|
||||||
|
|
||||||
|
virtual void exportRequested() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ExportPanel : public Gtk::VBox
|
class ExportPanel : public Gtk::VBox
|
||||||
|
@ -113,6 +113,10 @@ void FattalToneMapping::adjusterChanged(Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FattalToneMapping::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void FattalToneMapping::enabledChanged ()
|
void FattalToneMapping::enabledChanged ()
|
||||||
{
|
{
|
||||||
if (listener) {
|
if (listener) {
|
||||||
|
@ -42,6 +42,7 @@ public:
|
|||||||
void setBatchMode (bool batchMode);
|
void setBatchMode (bool batchMode);
|
||||||
|
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void enabledChanged ();
|
void enabledChanged ();
|
||||||
void setAdjusterBehavior(bool amountAdd, bool thresholdAdd, bool anchorAdd);
|
void setAdjusterBehavior(bool amountAdd, bool thresholdAdd, bool anchorAdd);
|
||||||
};
|
};
|
||||||
|
@ -981,7 +981,7 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m)
|
|||||||
|
|
||||||
// Empty run to update the thumb
|
// Empty run to update the thumb
|
||||||
rtengine::procparams::ProcParams params = mselected[i]->thumbnail->getProcParams ();
|
rtengine::procparams::ProcParams params = mselected[i]->thumbnail->getProcParams ();
|
||||||
mselected[i]->thumbnail->setProcParams (params, nullptr, FILEBROWSER);
|
mselected[i]->thumbnail->setProcParams (params, nullptr, FILEBROWSER, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mselected.empty() && bppcl) {
|
if (!mselected.empty() && bppcl) {
|
||||||
@ -1991,6 +1991,10 @@ void FileBrowser::setExportPanel (ExportPanel* expanel)
|
|||||||
exportPanel->setExportPanelListener (this);
|
exportPanel->setExportPanelListener (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileBrowser::storeCurrentValue()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void FileBrowser::updateProfileList()
|
void FileBrowser::updateProfileList()
|
||||||
{
|
{
|
||||||
// submenu applmenu
|
// submenu applmenu
|
||||||
@ -2085,6 +2089,10 @@ void FileBrowser::updateProfileList ()
|
|||||||
subMenuList.clear();
|
subMenuList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileBrowser::restoreValue()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void FileBrowser::openRequested( std::vector<FileBrowserEntry*> mselected)
|
void FileBrowser::openRequested( std::vector<FileBrowserEntry*> mselected)
|
||||||
{
|
{
|
||||||
std::vector<Thumbnail*> entries;
|
std::vector<Thumbnail*> entries;
|
||||||
|
@ -34,23 +34,20 @@
|
|||||||
class ProfileStoreLabel;
|
class ProfileStoreLabel;
|
||||||
class FileBrowser;
|
class FileBrowser;
|
||||||
class FileBrowserEntry;
|
class FileBrowserEntry;
|
||||||
|
|
||||||
class FileBrowserListener
|
class FileBrowserListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~FileBrowserListener () {}
|
virtual ~FileBrowserListener() = default;
|
||||||
virtual void filterApplied () {}
|
virtual void filterApplied() = 0;
|
||||||
virtual void openRequested (std::vector<Thumbnail*> tbe) {}
|
virtual void openRequested(const std::vector<Thumbnail*>& tbe) = 0;
|
||||||
virtual void developRequested (std::vector<FileBrowserEntry*> tbe, bool fastmode) {}
|
virtual void developRequested(const std::vector<FileBrowserEntry*>& tbe, bool fastmode) = 0;
|
||||||
virtual void renameRequested (std::vector<FileBrowserEntry*> tbe) {}
|
virtual void renameRequested(const std::vector<FileBrowserEntry*>& tbe) = 0;
|
||||||
virtual void deleteRequested (std::vector<FileBrowserEntry*> tbe, bool inclBatchProcessed) {}
|
virtual void deleteRequested(const std::vector<FileBrowserEntry*>& tbe, bool inclBatchProcessed) = 0;
|
||||||
virtual void copyMoveRequested (std::vector<FileBrowserEntry*> tbe, bool moveRequested) {}
|
virtual void copyMoveRequested(const std::vector<FileBrowserEntry*>& tbe, bool moveRequested) = 0;
|
||||||
virtual void selectionChanged (std::vector<Thumbnail*> tbe) {}
|
virtual void selectionChanged(const std::vector<Thumbnail*>& tbe) = 0;
|
||||||
virtual void clearFromCacheRequested(std::vector<FileBrowserEntry*> tbe, bool leavenotrace) {}
|
virtual void clearFromCacheRequested(const std::vector<FileBrowserEntry*>& tbe, bool leavenotrace) = 0;
|
||||||
virtual bool isInTabMode ()
|
virtual bool isInTabMode() const = 0;
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -203,7 +200,9 @@ public:
|
|||||||
// exportpanel interface
|
// exportpanel interface
|
||||||
void exportRequested();
|
void exportRequested();
|
||||||
|
|
||||||
|
void storeCurrentValue();
|
||||||
void updateProfileList();
|
void updateProfileList();
|
||||||
|
void restoreValue();
|
||||||
|
|
||||||
type_trash_changed trash_changed();
|
type_trash_changed trash_changed();
|
||||||
};
|
};
|
||||||
|
@ -209,7 +209,7 @@ void FileBrowserEntry::procParamsChanged (Thumbnail* thm, int whoChangedIt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileBrowserEntry::updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams)
|
void FileBrowserEntry::updateImage(rtengine::IImage8* img, double scale, const rtengine::procparams::CropParams& cropParams)
|
||||||
{
|
{
|
||||||
if (!feih) {
|
if (!feih) {
|
||||||
return;
|
return;
|
||||||
@ -260,7 +260,7 @@ void FileBrowserEntry::updateImage (rtengine::IImage8* img, double scale, rtengi
|
|||||||
idle_register.add(func, param, priority);
|
idle_register.add(func, param, priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileBrowserEntry::_updateImage (rtengine::IImage8* img, double s, rtengine::procparams::CropParams cropParams)
|
void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rtengine::procparams::CropParams& cropParams)
|
||||||
{
|
{
|
||||||
MYWRITERLOCK(l, lockRW);
|
MYWRITERLOCK(l, lockRW);
|
||||||
|
|
||||||
|
@ -99,8 +99,8 @@ public:
|
|||||||
// thumbnaillistener interface
|
// thumbnaillistener interface
|
||||||
void procParamsChanged (Thumbnail* thm, int whoChangedIt);
|
void procParamsChanged (Thumbnail* thm, int whoChangedIt);
|
||||||
// thumbimageupdatelistener interface
|
// thumbimageupdatelistener interface
|
||||||
void updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams);
|
void updateImage(rtengine::IImage8* img, double scale, const rtengine::procparams::CropParams& cropParams);
|
||||||
void _updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams); // inside gtk thread
|
void _updateImage(rtengine::IImage8* img, double scale, const rtengine::procparams::CropParams& cropParams); // inside gtk thread
|
||||||
|
|
||||||
virtual bool motionNotify (int x, int y);
|
virtual bool motionNotify (int x, int y);
|
||||||
virtual bool pressNotify (int button, int type, int bstate, int x, int y);
|
virtual bool pressNotify (int button, int type, int bstate, int x, int y);
|
||||||
|
@ -749,18 +749,6 @@ void FileCatalog::_refreshProgressBar ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileCatalog::filterApplied()
|
|
||||||
{
|
|
||||||
const auto func = [](gpointer data) -> gboolean {
|
|
||||||
static_cast<FileCatalog*>(data)->_refreshProgressBar();
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
};
|
|
||||||
|
|
||||||
idle_register.add(func, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FileCatalog::previewReady (int dir_id, FileBrowserEntry* fdn)
|
void FileCatalog::previewReady (int dir_id, FileBrowserEntry* fdn)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -962,9 +950,19 @@ int openRequestedUI (void* p)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileCatalog::openRequested (std::vector<Thumbnail*> tmb)
|
void FileCatalog::filterApplied()
|
||||||
{
|
{
|
||||||
|
const auto func = [](gpointer data) -> gboolean {
|
||||||
|
static_cast<FileCatalog*>(data)->_refreshProgressBar();
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
idle_register.add(func, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileCatalog::openRequested(const std::vector<Thumbnail*>& tmb)
|
||||||
|
{
|
||||||
FCOIParams* params = new FCOIParams;
|
FCOIParams* params = new FCOIParams;
|
||||||
params->catalog = this;
|
params->catalog = this;
|
||||||
params->tmb = tmb;
|
params->tmb = tmb;
|
||||||
@ -976,9 +974,8 @@ void FileCatalog::openRequested (std::vector<Thumbnail*> tmb)
|
|||||||
idle_register.add(openRequestedUI, params);
|
idle_register.add(openRequestedUI, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileCatalog::deleteRequested (std::vector<FileBrowserEntry*> tbe, bool inclBatchProcessed)
|
void FileCatalog::deleteRequested(const std::vector<FileBrowserEntry*>& tbe, bool inclBatchProcessed)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (tbe.empty()) {
|
if (tbe.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1017,15 +1014,12 @@ void FileCatalog::deleteRequested (std::vector<FileBrowserEntry*> tbe, bool inc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileCatalog::copyMoveRequested(const std::vector<FileBrowserEntry*>& tbe, bool moveRequested)
|
||||||
void FileCatalog::copyMoveRequested (std::vector<FileBrowserEntry*> tbe, bool moveRequested)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
if (tbe.empty()) {
|
if (tbe.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Glib::ustring fc_title;
|
Glib::ustring fc_title;
|
||||||
|
|
||||||
if (moveRequested) {
|
if (moveRequested) {
|
||||||
@ -1129,9 +1123,9 @@ void FileCatalog::copyMoveRequested (std::vector<FileBrowserEntry*> tbe, bool m
|
|||||||
_refreshProgressBar();
|
_refreshProgressBar();
|
||||||
} // Gtk::RESPONSE_OK
|
} // Gtk::RESPONSE_OK
|
||||||
}
|
}
|
||||||
void FileCatalog::developRequested (std::vector<FileBrowserEntry*> tbe, bool fastmode)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
void FileCatalog::developRequested(const std::vector<FileBrowserEntry*>& tbe, bool fastmode)
|
||||||
|
{
|
||||||
if (listener) {
|
if (listener) {
|
||||||
std::vector<BatchQueueEntry*> entries;
|
std::vector<BatchQueueEntry*> entries;
|
||||||
|
|
||||||
@ -1262,23 +1256,8 @@ void FileCatalog::developRequested (std::vector<FileBrowserEntry*> tbe, bool fas
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileCatalog::exportRequested ()
|
void FileCatalog::renameRequested(const std::vector<FileBrowserEntry*>& tbe)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileCatalog::setExportPanel (ExportPanel* expanel)
|
|
||||||
{
|
|
||||||
|
|
||||||
exportPanel = expanel;
|
|
||||||
exportPanel->set_sensitive (false);
|
|
||||||
exportPanel->setExportPanelListener (this);
|
|
||||||
fileBrowser->setExportPanel(expanel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileCatalog::renameRequested (std::vector<FileBrowserEntry*> tbe)
|
|
||||||
{
|
|
||||||
|
|
||||||
RenameDialog* renameDlg = new RenameDialog ((Gtk::Window*)get_toplevel());
|
RenameDialog* renameDlg = new RenameDialog ((Gtk::Window*)get_toplevel());
|
||||||
|
|
||||||
for (size_t i = 0; i < tbe.size(); i++) {
|
for (size_t i = 0; i < tbe.size(); i++) {
|
||||||
@ -1333,9 +1312,15 @@ void FileCatalog::renameRequested (std::vector<FileBrowserEntry*> tbe)
|
|||||||
delete renameDlg;
|
delete renameDlg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileCatalog::clearFromCacheRequested (std::vector<FileBrowserEntry*> tbe, bool leavenotrace)
|
void FileCatalog::selectionChanged(const std::vector<Thumbnail*>& tbe)
|
||||||
{
|
{
|
||||||
|
if (fslistener) {
|
||||||
|
fslistener->selectionChanged (tbe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileCatalog::clearFromCacheRequested(const std::vector<FileBrowserEntry*>& tbe, bool leavenotrace)
|
||||||
|
{
|
||||||
if (tbe.empty()) {
|
if (tbe.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1347,6 +1332,11 @@ void FileCatalog::clearFromCacheRequested (std::vector<FileBrowserEntry*> tbe,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FileCatalog::isInTabMode() const
|
||||||
|
{
|
||||||
|
return inTabMode;
|
||||||
|
}
|
||||||
|
|
||||||
void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick)
|
void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -1966,12 +1956,8 @@ void FileCatalog::refreshEditedState (const std::set<Glib::ustring>& efiles)
|
|||||||
fileBrowser->refreshEditedState (efiles);
|
fileBrowser->refreshEditedState (efiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileCatalog::selectionChanged (std::vector<Thumbnail*> tbe)
|
void FileCatalog::exportRequested()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (fslistener) {
|
|
||||||
fslistener->selectionChanged (tbe);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called within GTK UI thread
|
// Called within GTK UI thread
|
||||||
@ -1991,6 +1977,15 @@ void FileCatalog::setFilterPanel (FilterPanel* fpanel)
|
|||||||
filterPanel->set_sensitive (false);
|
filterPanel->set_sensitive (false);
|
||||||
filterPanel->setFilterPanelListener (this);
|
filterPanel->setFilterPanelListener (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileCatalog::setExportPanel(ExportPanel* expanel)
|
||||||
|
{
|
||||||
|
exportPanel = expanel;
|
||||||
|
exportPanel->set_sensitive (false);
|
||||||
|
exportPanel->setExportPanelListener (this);
|
||||||
|
fileBrowser->setExportPanel(expanel);
|
||||||
|
}
|
||||||
|
|
||||||
void FileCatalog::trashChanged ()
|
void FileCatalog::trashChanged ()
|
||||||
{
|
{
|
||||||
if (trashIsEmpty()) {
|
if (trashIsEmpty()) {
|
||||||
|
@ -212,13 +212,16 @@ public:
|
|||||||
void refreshThumbImages ();
|
void refreshThumbImages ();
|
||||||
void refreshHeight ();
|
void refreshHeight ();
|
||||||
|
|
||||||
void openRequested (std::vector<Thumbnail*> tbe);
|
void filterApplied();
|
||||||
void deleteRequested (std::vector<FileBrowserEntry*> tbe, bool inclBatchProcessed);
|
void openRequested(const std::vector<Thumbnail*>& tbe);
|
||||||
void copyMoveRequested (std::vector<FileBrowserEntry*> tbe, bool moveRequested);
|
void deleteRequested(const std::vector<FileBrowserEntry*>& tbe, bool inclBatchProcessed);
|
||||||
void developRequested (std::vector<FileBrowserEntry*> tbe, bool fastmode);
|
void copyMoveRequested(const std::vector<FileBrowserEntry*>& tbe, bool moveRequested);
|
||||||
void renameRequested (std::vector<FileBrowserEntry*> tbe);
|
void developRequested(const std::vector<FileBrowserEntry*>& tbe, bool fastmode);
|
||||||
void clearFromCacheRequested(std::vector<FileBrowserEntry*> tbe, bool leavenotrace);
|
void renameRequested(const std::vector<FileBrowserEntry*>& tbe);
|
||||||
void selectionChanged (std::vector<Thumbnail*> tbe);
|
void selectionChanged(const std::vector<Thumbnail*>& tbe);
|
||||||
|
void clearFromCacheRequested(const std::vector<FileBrowserEntry*>& tbe, bool leavenotrace);
|
||||||
|
bool isInTabMode() const;
|
||||||
|
|
||||||
void emptyTrash ();
|
void emptyTrash ();
|
||||||
bool trashIsEmpty ();
|
bool trashIsEmpty ();
|
||||||
|
|
||||||
@ -277,11 +280,6 @@ public:
|
|||||||
|
|
||||||
bool handleShortcutKey (GdkEventKey* event);
|
bool handleShortcutKey (GdkEventKey* event);
|
||||||
|
|
||||||
bool isInTabMode()
|
|
||||||
{
|
|
||||||
return inTabMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CheckSidePanelsVisibility();
|
bool CheckSidePanelsVisibility();
|
||||||
void toggleSidePanels();
|
void toggleSidePanels();
|
||||||
void toggleLeftPanel();
|
void toggleLeftPanel();
|
||||||
@ -289,7 +287,6 @@ public:
|
|||||||
|
|
||||||
void showToolBar();
|
void showToolBar();
|
||||||
void hideToolBar();
|
void hideToolBar();
|
||||||
void filterApplied();
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
void on_dir_changed (const Glib::RefPtr<Gio::File>& file, const Glib::RefPtr<Gio::File>& other_file, Gio::FileMonitorEvent event_type, bool internal);
|
void on_dir_changed (const Glib::RefPtr<Gio::File>& file, const Glib::RefPtr<Gio::File>& other_file, Gio::FileMonitorEvent event_type, bool internal);
|
||||||
|
@ -228,7 +228,6 @@ void FilePanel::on_NB_switch_page(Gtk::Widget* page, guint page_num)
|
|||||||
|
|
||||||
bool FilePanel::fileSelected (Thumbnail* thm)
|
bool FilePanel::fileSelected (Thumbnail* thm)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -258,6 +257,16 @@ bool FilePanel::fileSelected (Thumbnail* thm)
|
|||||||
sigc::bind(sigc::mem_fun(*this, &FilePanel::imageLoaded), thm, ld) );
|
sigc::bind(sigc::mem_fun(*this, &FilePanel::imageLoaded), thm, ld) );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FilePanel::addBatchQueueJobs(const std::vector<BatchQueueEntry*>& entries)
|
||||||
|
{
|
||||||
|
if (parent) {
|
||||||
|
parent->addBatchQueueJobs (entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector<rtengine::InitialImage*> *pc )
|
bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector<rtengine::InitialImage*> *pc )
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -365,16 +374,6 @@ void FilePanel::open (const Glib::ustring& d)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FilePanel::addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries )
|
|
||||||
{
|
|
||||||
|
|
||||||
if (parent) {
|
|
||||||
parent->addBatchQueueJobs (entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FilePanel::optionsChanged ()
|
void FilePanel::optionsChanged ()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -36,8 +36,7 @@ class RTWindow;
|
|||||||
|
|
||||||
class FilePanel final :
|
class FilePanel final :
|
||||||
public Gtk::HPaned,
|
public Gtk::HPaned,
|
||||||
public FileSelectionListener,
|
public FileSelectionListener
|
||||||
public PParamsChangeListener
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FilePanel ();
|
FilePanel ();
|
||||||
@ -73,7 +72,7 @@ public:
|
|||||||
|
|
||||||
// interface fileselectionlistener
|
// interface fileselectionlistener
|
||||||
bool fileSelected(Thumbnail* thm);
|
bool fileSelected(Thumbnail* thm);
|
||||||
bool addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries );
|
bool addBatchQueueJobs(const std::vector<BatchQueueEntry*>& entries);
|
||||||
|
|
||||||
void optionsChanged ();
|
void optionsChanged ();
|
||||||
bool imageLoaded( Thumbnail* thm, ProgressConnector<rtengine::InitialImage*> * );
|
bool imageLoaded( Thumbnail* thm, ProgressConnector<rtengine::InitialImage*> * );
|
||||||
|
@ -19,13 +19,13 @@
|
|||||||
#ifndef _FILESELECTIONCHANGELISTENER_
|
#ifndef _FILESELECTIONCHANGELISTENER_
|
||||||
#define _FILESELECTIONCHANGELISTENER_
|
#define _FILESELECTIONCHANGELISTENER_
|
||||||
|
|
||||||
#include "thumbnail.h"
|
class Thumbnail;
|
||||||
|
|
||||||
class FileSelectionChangeListener
|
class FileSelectionChangeListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void selectionChanged (const std::vector<Thumbnail*>& selected) {}
|
virtual ~FileSelectionChangeListener() = default;
|
||||||
|
virtual void selectionChanged(const std::vector<Thumbnail*>& selected) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,15 +19,15 @@
|
|||||||
#ifndef _FILESELECTIONLISTENER_
|
#ifndef _FILESELECTIONLISTENER_
|
||||||
#define _FILESELECTIONLISTENER_
|
#define _FILESELECTIONLISTENER_
|
||||||
|
|
||||||
#include "thumbnail.h"
|
class Thumbnail;
|
||||||
#include "batchqueueentry.h"
|
class BatchQueueEntry;
|
||||||
|
|
||||||
class FileSelectionListener
|
class FileSelectionListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
virtual ~FileSelectionListener() = default;
|
||||||
virtual bool fileSelected(Thumbnail* thm) = 0;
|
virtual bool fileSelected(Thumbnail* thm) = 0;
|
||||||
virtual bool addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries ) = 0;
|
virtual bool addBatchQueueJobs(const std::vector<BatchQueueEntry*>& entries) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -109,11 +109,15 @@ void FilmSimulation::enabledChanged ()
|
|||||||
void FilmSimulation::adjusterChanged(Adjuster* a, double newval)
|
void FilmSimulation::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
if (listener && (multiImage || getEnabled())) {
|
if (listener && (multiImage || getEnabled())) {
|
||||||
Glib::ustring value = a->getTextValue();
|
const Glib::ustring value = a->getTextValue();
|
||||||
listener->panelChanged(EvFilmSimulationStrength, value);
|
listener->panelChanged(EvFilmSimulationStrength, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FilmSimulation::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void FilmSimulation::setBatchMode( bool batchMode )
|
void FilmSimulation::setBatchMode( bool batchMode )
|
||||||
{
|
{
|
||||||
ToolPanel::setBatchMode( batchMode );
|
ToolPanel::setBatchMode( batchMode );
|
||||||
|
@ -54,6 +54,7 @@ public:
|
|||||||
FilmSimulation();
|
FilmSimulation();
|
||||||
|
|
||||||
void adjusterChanged(Adjuster* a, double newval);
|
void adjusterChanged(Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void setBatchMode(bool batchMode);
|
void setBatchMode(bool batchMode);
|
||||||
void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
|
void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
|
||||||
void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
|
void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
|
||||||
|
@ -35,7 +35,9 @@ FilterPanel::FilterPanel () : listener (nullptr)
|
|||||||
Gtk::HBox* fnhb = Gtk::manage(new Gtk::HBox ());
|
Gtk::HBox* fnhb = Gtk::manage(new Gtk::HBox ());
|
||||||
fnvb->pack_start (*enaFNumber, Gtk::PACK_SHRINK, 0);
|
fnvb->pack_start (*enaFNumber, Gtk::PACK_SHRINK, 0);
|
||||||
fnumberFrom = Gtk::manage(new Gtk::Entry ());
|
fnumberFrom = Gtk::manage(new Gtk::Entry ());
|
||||||
|
fnumberFrom->set_width_chars(1);
|
||||||
fnumberTo = Gtk::manage(new Gtk::Entry ());
|
fnumberTo = Gtk::manage(new Gtk::Entry ());
|
||||||
|
fnumberTo->set_width_chars(1);
|
||||||
fnhb->pack_start (*fnumberFrom, true, true, 2);
|
fnhb->pack_start (*fnumberFrom, true, true, 2);
|
||||||
fnhb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
|
fnhb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
|
||||||
fnhb->pack_start (*fnumberTo, true, true, 2);
|
fnhb->pack_start (*fnumberTo, true, true, 2);
|
||||||
@ -47,7 +49,9 @@ FilterPanel::FilterPanel () : listener (nullptr)
|
|||||||
Gtk::HBox* shb = Gtk::manage(new Gtk::HBox ());
|
Gtk::HBox* shb = Gtk::manage(new Gtk::HBox ());
|
||||||
svb->pack_start (*enaShutter, Gtk::PACK_SHRINK, 0);
|
svb->pack_start (*enaShutter, Gtk::PACK_SHRINK, 0);
|
||||||
shutterFrom = Gtk::manage(new Gtk::Entry ());
|
shutterFrom = Gtk::manage(new Gtk::Entry ());
|
||||||
|
shutterFrom->set_width_chars(1);
|
||||||
shutterTo = Gtk::manage(new Gtk::Entry ());
|
shutterTo = Gtk::manage(new Gtk::Entry ());
|
||||||
|
shutterTo->set_width_chars(1);
|
||||||
shb->pack_start (*shutterFrom, true, true, 2);
|
shb->pack_start (*shutterFrom, true, true, 2);
|
||||||
shb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
|
shb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
|
||||||
shb->pack_start (*shutterTo, true, true, 2);
|
shb->pack_start (*shutterTo, true, true, 2);
|
||||||
@ -59,7 +63,9 @@ FilterPanel::FilterPanel () : listener (nullptr)
|
|||||||
Gtk::HBox* ihb = Gtk::manage(new Gtk::HBox ());
|
Gtk::HBox* ihb = Gtk::manage(new Gtk::HBox ());
|
||||||
ivb->pack_start (*enaISO, Gtk::PACK_SHRINK, 0);
|
ivb->pack_start (*enaISO, Gtk::PACK_SHRINK, 0);
|
||||||
isoFrom = Gtk::manage(new Gtk::Entry ());
|
isoFrom = Gtk::manage(new Gtk::Entry ());
|
||||||
|
isoFrom->set_width_chars(1);
|
||||||
isoTo = Gtk::manage(new Gtk::Entry ());
|
isoTo = Gtk::manage(new Gtk::Entry ());
|
||||||
|
isoTo->set_width_chars(1);
|
||||||
ihb->pack_start (*isoFrom, true, true, 2);
|
ihb->pack_start (*isoFrom, true, true, 2);
|
||||||
ihb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
|
ihb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
|
||||||
ihb->pack_start (*isoTo, true, true, 2);
|
ihb->pack_start (*isoTo, true, true, 2);
|
||||||
@ -71,7 +77,9 @@ FilterPanel::FilterPanel () : listener (nullptr)
|
|||||||
Gtk::HBox* fhb = Gtk::manage(new Gtk::HBox ());
|
Gtk::HBox* fhb = Gtk::manage(new Gtk::HBox ());
|
||||||
fvb->pack_start (*enaFocalLen, Gtk::PACK_SHRINK, 0);
|
fvb->pack_start (*enaFocalLen, Gtk::PACK_SHRINK, 0);
|
||||||
focalFrom = Gtk::manage(new Gtk::Entry ());
|
focalFrom = Gtk::manage(new Gtk::Entry ());
|
||||||
|
focalFrom->set_width_chars(1);
|
||||||
focalTo = Gtk::manage(new Gtk::Entry ());
|
focalTo = Gtk::manage(new Gtk::Entry ());
|
||||||
|
focalTo->set_width_chars(1);
|
||||||
fhb->pack_start (*focalFrom, true, true, 2);
|
fhb->pack_start (*focalFrom, true, true, 2);
|
||||||
fhb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
|
fhb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
|
||||||
fhb->pack_start (*focalTo, true, true, 2);
|
fhb->pack_start (*focalTo, true, true, 2);
|
||||||
|
@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
class FilterPanelListener
|
class FilterPanelListener
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void exifFilterChanged () {}
|
virtual ~FilterPanelListener() = default;
|
||||||
|
virtual void exifFilterChanged () = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class FilterPanel : public Gtk::VBox
|
class FilterPanel : public Gtk::VBox
|
||||||
|
@ -235,8 +235,7 @@ void FlatField::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedit
|
|||||||
void FlatField::adjusterChanged(Adjuster* a, double newval)
|
void FlatField::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
if (listener) {
|
if (listener) {
|
||||||
|
const Glib::ustring value = a->getTextValue();
|
||||||
Glib::ustring value = a->getTextValue();
|
|
||||||
|
|
||||||
if (a == flatFieldBlurRadius) {
|
if (a == flatFieldBlurRadius) {
|
||||||
listener->panelChanged (EvFlatFieldBlurRadius, value);
|
listener->panelChanged (EvFlatFieldBlurRadius, value);
|
||||||
@ -248,7 +247,6 @@ void FlatField::adjusterChanged (Adjuster* a, double newval)
|
|||||||
|
|
||||||
void FlatField::adjusterAutoToggled (Adjuster* a, bool newval)
|
void FlatField::adjusterAutoToggled (Adjuster* a, bool newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (multiImage) {
|
if (multiImage) {
|
||||||
if (flatFieldClipControl->getAutoInconsistent()) {
|
if (flatFieldClipControl->getAutoInconsistent()) {
|
||||||
flatFieldClipControl->setAutoInconsistent(false);
|
flatFieldClipControl->setAutoInconsistent(false);
|
||||||
|
@ -251,7 +251,6 @@ void Gradient::setDefaults (const ProcParams* defParams, const ParamsEdited* ped
|
|||||||
|
|
||||||
void Gradient::adjusterChanged(Adjuster* a, double newval)
|
void Gradient::adjusterChanged(Adjuster* a, double newval)
|
||||||
{
|
{
|
||||||
|
|
||||||
updateGeometry(int(centerX->getValue()), int(centerY->getValue()), feather->getValue(), degree->getValue());
|
updateGeometry(int(centerX->getValue()), int(centerY->getValue()), feather->getValue(), degree->getValue());
|
||||||
|
|
||||||
if (listener && getEnabled()) {
|
if (listener && getEnabled()) {
|
||||||
@ -268,6 +267,10 @@ void Gradient::adjusterChanged (Adjuster* a, double newval)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Gradient::adjusterAutoToggled(Adjuster* a, bool newval)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void Gradient::enabledChanged ()
|
void Gradient::enabledChanged ()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ public:
|
|||||||
void setBatchMode (bool batchMode);
|
void setBatchMode (bool batchMode);
|
||||||
|
|
||||||
void adjusterChanged (Adjuster* a, double newval);
|
void adjusterChanged (Adjuster* a, double newval);
|
||||||
|
void adjusterAutoToggled(Adjuster* a, bool newval);
|
||||||
void enabledChanged ();
|
void enabledChanged ();
|
||||||
void setAdjusterBehavior (bool degreeadd, bool featheradd, bool strengthadd, bool centeradd);
|
void setAdjusterBehavior (bool degreeadd, bool featheradd, bool strengthadd, bool centeradd);
|
||||||
void trimValues (rtengine::procparams::ProcParams* pp);
|
void trimValues (rtengine::procparams::ProcParams* pp);
|
||||||
|
@ -945,8 +945,8 @@ bool MyScrolledWindow::on_scroll_event (GdkEventScroll* event)
|
|||||||
double step = adjust->get_step_increment();
|
double step = adjust->get_step_increment();
|
||||||
double value2 = 0.;
|
double value2 = 0.;
|
||||||
|
|
||||||
printf("MyScrolledwindow::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n",
|
// printf("MyScrolledwindow::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n",
|
||||||
event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event);
|
// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event);
|
||||||
|
|
||||||
if (event->direction == GDK_SCROLL_DOWN) {
|
if (event->direction == GDK_SCROLL_DOWN) {
|
||||||
value2 = value + step;
|
value2 = value + step;
|
||||||
@ -1020,8 +1020,8 @@ bool MyScrolledToolbar::on_scroll_event (GdkEventScroll* event)
|
|||||||
double step = adjust->get_step_increment() * 2;
|
double step = adjust->get_step_increment() * 2;
|
||||||
double value2 = 0.;
|
double value2 = 0.;
|
||||||
|
|
||||||
printf("MyScrolledToolbar::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n",
|
// printf("MyScrolledToolbar::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n",
|
||||||
event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event);
|
// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event);
|
||||||
|
|
||||||
if (event->direction == GDK_SCROLL_DOWN) {
|
if (event->direction == GDK_SCROLL_DOWN) {
|
||||||
value2 = rtengine::min<double>(value + step, upper);
|
value2 = rtengine::min<double>(value + step, upper);
|
||||||
@ -1076,8 +1076,8 @@ MyComboBoxText::MyComboBoxText (bool has_entry) : Gtk::ComboBoxText(has_entry)
|
|||||||
bool MyComboBoxText::on_scroll_event (GdkEventScroll* event)
|
bool MyComboBoxText::on_scroll_event (GdkEventScroll* event)
|
||||||
{
|
{
|
||||||
|
|
||||||
printf("MyComboboxText::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n",
|
// printf("MyComboboxText::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n",
|
||||||
event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event);
|
// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event);
|
||||||
// If Shift is pressed, the widget is modified
|
// If Shift is pressed, the widget is modified
|
||||||
if (event->state & GDK_SHIFT_MASK) {
|
if (event->state & GDK_SHIFT_MASK) {
|
||||||
Gtk::ComboBoxText::on_scroll_event(event);
|
Gtk::ComboBoxText::on_scroll_event(event);
|
||||||
@ -1235,8 +1235,8 @@ bool MySpinButton::on_scroll_event (GdkEventScroll* event)
|
|||||||
bool MyHScale::on_scroll_event (GdkEventScroll* event)
|
bool MyHScale::on_scroll_event (GdkEventScroll* event)
|
||||||
{
|
{
|
||||||
|
|
||||||
printf("MyHScale::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n",
|
// printf("MyHScale::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n",
|
||||||
event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event);
|
// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event);
|
||||||
// If Shift is pressed, the widget is modified
|
// If Shift is pressed, the widget is modified
|
||||||
if (event->state & GDK_SHIFT_MASK) {
|
if (event->state & GDK_SHIFT_MASK) {
|
||||||
Gtk::HScale::on_scroll_event(event);
|
Gtk::HScale::on_scroll_event(event);
|
||||||
|
@ -345,7 +345,7 @@ void HistogramPanel::reorder (Gtk::PositionType align)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DrawModeListener interface:
|
// DrawModeListener interface:
|
||||||
void HistogramPanel::toggle_button_mode ()
|
void HistogramPanel::toggleButtonMode ()
|
||||||
{
|
{
|
||||||
if (options.histogramDrawMode == 0)
|
if (options.histogramDrawMode == 0)
|
||||||
showMode->set_image(*mode0Image);
|
showMode->set_image(*mode0Image);
|
||||||
@ -734,7 +734,16 @@ void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool
|
|||||||
updateBackBuffer ();
|
updateBackBuffer ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistogramArea::update (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu &histLuma, LUTu &histChroma, LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw)
|
void HistogramArea::update(
|
||||||
|
const LUTu& histRed,
|
||||||
|
const LUTu& histGreen,
|
||||||
|
const LUTu& histBlue,
|
||||||
|
const LUTu& histLuma,
|
||||||
|
const LUTu& histChroma,
|
||||||
|
const LUTu& histRedRaw,
|
||||||
|
const LUTu& histGreenRaw,
|
||||||
|
const LUTu& histBlueRaw
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if (histRed) {
|
if (histRed) {
|
||||||
rhist = histRed;
|
rhist = histRed;
|
||||||
@ -1042,7 +1051,7 @@ bool HistogramArea::on_button_press_event (GdkEventButton* event)
|
|||||||
options.histogramDrawMode = (options.histogramDrawMode + 1) % 3;
|
options.histogramDrawMode = (options.histogramDrawMode + 1) % 3;
|
||||||
|
|
||||||
if (myDrawModeListener) {
|
if (myDrawModeListener) {
|
||||||
myDrawModeListener->toggle_button_mode ();
|
myDrawModeListener->toggleButtonMode ();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateBackBuffer ();
|
updateBackBuffer ();
|
||||||
|
@ -110,8 +110,8 @@ private:
|
|||||||
class DrawModeListener
|
class DrawModeListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~DrawModeListener() {}
|
virtual ~DrawModeListener() = default;
|
||||||
virtual void toggle_button_mode () {}
|
virtual void toggleButtonMode() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HistogramArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling
|
class HistogramArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling
|
||||||
@ -144,7 +144,16 @@ public:
|
|||||||
~HistogramArea();
|
~HistogramArea();
|
||||||
|
|
||||||
void updateBackBuffer ();
|
void updateBackBuffer ();
|
||||||
void update (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu &histLuma, LUTu &histChroma, LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw);
|
void update(
|
||||||
|
const LUTu& histRed,
|
||||||
|
const LUTu& histGreen,
|
||||||
|
const LUTu& histBlue,
|
||||||
|
const LUTu& histLuma,
|
||||||
|
const LUTu& histChroma,
|
||||||
|
const LUTu& histRedRaw,
|
||||||
|
const LUTu& histGreenRaw,
|
||||||
|
const LUTu& histBlueRaw
|
||||||
|
);
|
||||||
void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode);
|
void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode);
|
||||||
void on_realize();
|
void on_realize();
|
||||||
bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr);
|
bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr);
|
||||||
@ -209,7 +218,15 @@ public:
|
|||||||
HistogramPanel ();
|
HistogramPanel ();
|
||||||
~HistogramPanel ();
|
~HistogramPanel ();
|
||||||
|
|
||||||
void histogramChanged (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu &histLuma, LUTu &histChroma, LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw)
|
void histogramChanged(
|
||||||
|
const LUTu& histRed,
|
||||||
|
const LUTu& histGreen,
|
||||||
|
const LUTu& histBlue,
|
||||||
|
const LUTu& histLuma,
|
||||||
|
const LUTu& histChroma,
|
||||||
|
const LUTu& histRedRaw,
|
||||||
|
const LUTu& histGreenRaw,
|
||||||
|
const LUTu& histBlueRaw)
|
||||||
{
|
{
|
||||||
histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw);
|
histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw);
|
||||||
}
|
}
|
||||||
@ -232,7 +249,7 @@ public:
|
|||||||
void resized (Gtk::Allocation& req);
|
void resized (Gtk::Allocation& req);
|
||||||
|
|
||||||
// drawModeListener interface
|
// drawModeListener interface
|
||||||
void toggle_button_mode ();
|
void toggleButtonMode ();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user