From 4332b7edebfdedad8ebc07a43395ba626c9f20e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 10 Apr 2018 20:33:54 +0200 Subject: [PATCH 1/6] Implement `dcpprofiles/camera_model_aliases.json` (#4500) --- rtdata/dcpprofiles/camera_model_aliases.json | 4 ++ rtdata/dcpprofiles/camera_model_aliases.txt | 3 - rtengine/dcp.cc | 75 +++++++++++++++++--- 3 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 rtdata/dcpprofiles/camera_model_aliases.json delete mode 100644 rtdata/dcpprofiles/camera_model_aliases.txt diff --git a/rtdata/dcpprofiles/camera_model_aliases.json b/rtdata/dcpprofiles/camera_model_aliases.json new file mode 100644 index 000000000..339680d48 --- /dev/null +++ b/rtdata/dcpprofiles/camera_model_aliases.json @@ -0,0 +1,4 @@ +{ + "Canon EOS 600D": ["Canon EOS Kiss X5", "Canon EOS Rebel T3i"], + "Canon EOS 1300D": ["Canon EOS Kiss X80", "Canon EOS Rebel T6"] +} diff --git a/rtdata/dcpprofiles/camera_model_aliases.txt b/rtdata/dcpprofiles/camera_model_aliases.txt deleted file mode 100644 index 4dea42628..000000000 --- a/rtdata/dcpprofiles/camera_model_aliases.txt +++ /dev/null @@ -1,3 +0,0 @@ -Canon EOS 600D;Canon EOS Kiss X5;Canon EOS Rebel T3i -Canon EOS 1300D;Canon EOS Kiss X80;Canon EOS Rebel T6 -MINOLTA DYNAX 7D;MINOLTA MAXXUM 7D;MINOLTA ALPHA 7D;MINOLTA ALPHA SWEET diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index fe798cb99..20c86ca9f 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -18,13 +18,17 @@ */ #include +#include #include +#include #include "dcp.h" + +#include "cJSON.h" #include "iccmatrices.h" #include "iccstore.h" -#include "rawimagesource.h" #include "improcfun.h" +#include "rawimagesource.h" #include "rt_math.h" using namespace rtengine; @@ -42,7 +46,7 @@ DCPProfile::Matrix invert3x3(const DCPProfile::Matrix& a) std::cerr << "DCP matrix cannot be inverted! Expect weird output." << std::endl; } return res; - + // const double res00 = a[1][1] * a[2][2] - a[2][1] * a[1][2]; // const double res10 = a[2][0] * a[1][2] - a[1][0] * a[2][2]; // const double res20 = a[1][0] * a[2][1] - a[2][0] * a[1][1]; @@ -382,6 +386,53 @@ double xyCoordToTemperature(const std::array& white_xy) return res; } +std::map getAliases(const Glib::ustring& profile_dir) +{ + const std::unique_ptr> file( + g_fopen(Glib::build_filename(profile_dir, "camera_model_aliases.json").c_str(), "rb"), + [](std::FILE* file) + { + std::fclose(file); + } + ); + + if (!file) { + return {}; + } + + std::fseek(file.get(), 0, SEEK_END); + const long length = std::ftell(file.get()); + if (length <= 0) { + return {}; + } + + std::unique_ptr buffer(new char[length + 1]); + std::fseek(file.get(), 0, SEEK_SET); + std::fread(buffer.get(), 1, length, file.get()); + buffer[length] = 0; + + std::unique_ptr root(cJSON_Parse(buffer.get())); + if (!root || !root->child) { + return {}; + } + + std::map res; + + for (cJSON* camera = root->child; camera; camera = camera->next) { + if (cJSON_IsArray(camera)) { + const std::size_t array_size = cJSON_GetArraySize(camera); + for (std::size_t index = 0; index < array_size; ++index) { + const cJSON* const alias = cJSON_GetArrayItem(camera, index); + if (cJSON_IsString(alias)) { + res[alias->valuestring] = camera->string; + } + } + } + } + + return res; +} + } struct DCPProfile::ApplyState::Data { @@ -953,9 +1004,7 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : valid = true; } -DCPProfile::~DCPProfile() -{ -} +DCPProfile::~DCPProfile() = default; DCPProfile::operator bool() const { @@ -1203,7 +1252,7 @@ void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int float cnewr = FCLIP(newr); float cnewg = FCLIP(newg); float cnewb = FCLIP(newb); - + float h, s, v; Color::rgb2hsvdcp(cnewr, cnewg, cnewb, h, s, v); @@ -1721,7 +1770,6 @@ DCPStore* DCPStore::getInstance() return &instance; } - DCPStore::~DCPStore() { for (auto &p : profile_cache) { @@ -1729,7 +1777,6 @@ DCPStore::~DCPStore() } } - void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll) { MyMutex::MyLock lock(mutex); @@ -1748,7 +1795,7 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll) while (!dirs.empty()) { // Process directory - Glib::ustring dirname = dirs.back(); + const Glib::ustring dirname = dirs.back(); dirs.pop_back(); std::unique_ptr dir; @@ -1784,6 +1831,16 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll) } } } + + for (const auto& alias : getAliases(rt_profile_dir)) { + const Glib::ustring alias_name = Glib::ustring(alias.first).uppercase(); + const Glib::ustring real_name = Glib::ustring(alias.second).uppercase(); + const std::map::const_iterator real = file_std_profiles.find(real_name); + + if (real != file_std_profiles.end()) { + file_std_profiles[alias_name] = real->second; + } + } } } From 1f5281483c2bb8e859ce63831e9b9ab515f614c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 10 Apr 2018 20:36:32 +0200 Subject: [PATCH 2/6] Fill `camera_model_aliases.json` with known aliases (#4500) --- rtdata/dcpprofiles/camera_model_aliases.json | 47 +++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/rtdata/dcpprofiles/camera_model_aliases.json b/rtdata/dcpprofiles/camera_model_aliases.json index 339680d48..eec678aeb 100644 --- a/rtdata/dcpprofiles/camera_model_aliases.json +++ b/rtdata/dcpprofiles/camera_model_aliases.json @@ -1,4 +1,49 @@ +// This file is part of RawTherapee. +// +// Copyright (C) 2018 Flössie +// +// 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 . + +// Source: http://rawspeed.org/CameraSupport.html + { + "Canon EOS 1000D": ["Canon EOS Kiss Digital F", "Canon EOS Digital Rebel XS"], + "Canon EOS 100D": ["Canon EOS Kiss X7", "Canon EOS Rebel SL1"], + "Canon EOS 1200D": ["Canon EOS Kiss X70", "Canon EOS Rebel T5"], + "Canon EOS 1300D": ["Canon EOS Kiss X80", "Canon EOS Rebel T6"], + "Canon EOS 200D": ["Canon EOS Kiss X9", "Canon EOS Rebel SL2"], + "Canon EOS 300D": ["Canon EOS Kiss Digital", "Canon EOS Digital Rebel"], + "Canon EOS 350D": ["Canon EOS Kiss Digital N", "Canon EOS Digital Rebel XT"], + "Canon EOS 400D": ["Canon EOS Kiss Digital X", "Canon EOS Digital Rebel XTi"], + "Canon EOS 450D": ["Canon EOS Kiss Digital X2", "Canon EOS Kiss X2", "Canon EOS Digital Rebel XSi"], + "Canon EOS 500D": ["Canon EOS Kiss X3", "Canon EOS Rebel T1i"], + "Canon EOS 550D": ["Canon EOS Kiss X4", "Canon EOS Rebel T2i"], "Canon EOS 600D": ["Canon EOS Kiss X5", "Canon EOS Rebel T3i"], - "Canon EOS 1300D": ["Canon EOS Kiss X80", "Canon EOS Rebel T6"] + "Canon EOS 650D": ["Canon EOS Kiss X6i", "Canon EOS Rebel T4i"], + "Canon EOS 700D": ["Canon EOS Kiss X7i", "Canon EOS Rebel T5i"], + "Canon EOS 750D": ["Canon EOS Kiss X8i", "Canon EOS Rebel T6i"], + "Canon EOS 760D": ["Canon EOS 8000D", "Canon EOS Rebel T6s"], + "Canon EOS 800D": ["Canon EOS Kiss X9i", "Canon EOS Rebel T7i"], + + "Minolta Dynax 5D": ["Minolta Maxxum 5D", "Minolta Alpha 5D"], + "Minolta Dynax 7D": ["Minolta Maxxum 7D", "Minolta Alpha 7D"], + + "Panasonic DC-FZ82": ["Panasonic DMC-FZ80", "Panasonic DMC-FZ85"], + "Panasonic DC-TZ90": ["Panasonic DC-ZS70", "Panasonic DC-FZ91", "Panasonic DC-FZ92", "Panasonic DC-FZ93"], + "Panasonic DMC-G8": ["Panasonic DMC-G80", "Panasonic DMC-G81", "Panasonic DMC-G85"], + "Panasonic DMC-LX15": ["Panasonic DMC-LX9", "Panasonic DMC-LX10"], + "Panasonic DC-TZ100": ["Panasonic DC-ZS100", "Panasonic DC-ZS110", "Panasonic DC-TZ101", "Panasonic DC-TZ110"], + "Panasonic DMC-TZ71": ["Panasonic DMC-TZ70", "Panasonic DMC-ZS50"], + "Panasonic DMC-TZ81": ["Panasonic DMC-TZ80", "Panasonic DMC-TZ85", "Panasonic DMC-ZS60"] } From df5c3851359c6f087e9ff638092ac0cd4d3140e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 11 Apr 2018 20:16:35 +0200 Subject: [PATCH 3/6] Use `cJSON_Minify()` and fix missed `const` opportunities --- rtengine/dcp.cc | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 20c86ca9f..164c7680e 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -31,6 +31,13 @@ #include "rawimagesource.h" #include "rt_math.h" +namespace rtengine +{ + +extern const Settings* settings; + +} + using namespace rtengine; using namespace rtexif; @@ -408,17 +415,21 @@ std::map getAliases(const Glib::ustring& profile_dir) std::unique_ptr buffer(new char[length + 1]); std::fseek(file.get(), 0, SEEK_SET); - std::fread(buffer.get(), 1, length, file.get()); - buffer[length] = 0; + const std::size_t read = std::fread(buffer.get(), 1, length, file.get()); + buffer[read] = 0; - std::unique_ptr root(cJSON_Parse(buffer.get())); + cJSON_Minify(buffer.get()); + const std::unique_ptr root(cJSON_Parse(buffer.get())); if (!root || !root->child) { + if (settings->verbose) { + std::cout << "Could not parse 'camera_model_aliases.json' file." << std::endl; + } return {}; } std::map res; - for (cJSON* camera = root->child; camera; camera = camera->next) { + for (const cJSON* camera = root->child; camera; camera = camera->next) { if (cJSON_IsArray(camera)) { const std::size_t array_size = cJSON_GetArraySize(camera); for (std::size_t index = 0; index < array_size; ++index) { From fed60b8d55126b0130d695d637eb2a1780baeec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 11 Apr 2018 20:29:54 +0200 Subject: [PATCH 4/6] Remove comments from `camera_model_aliases.json` and add Minolta alias --- rtdata/dcpprofiles/camera_model_aliases.json | 21 +------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/rtdata/dcpprofiles/camera_model_aliases.json b/rtdata/dcpprofiles/camera_model_aliases.json index eec678aeb..bc07e3af1 100644 --- a/rtdata/dcpprofiles/camera_model_aliases.json +++ b/rtdata/dcpprofiles/camera_model_aliases.json @@ -1,22 +1,3 @@ -// This file is part of RawTherapee. -// -// Copyright (C) 2018 Flössie -// -// 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 . - -// Source: http://rawspeed.org/CameraSupport.html - { "Canon EOS 1000D": ["Canon EOS Kiss Digital F", "Canon EOS Digital Rebel XS"], "Canon EOS 100D": ["Canon EOS Kiss X7", "Canon EOS Rebel SL1"], @@ -36,7 +17,7 @@ "Canon EOS 760D": ["Canon EOS 8000D", "Canon EOS Rebel T6s"], "Canon EOS 800D": ["Canon EOS Kiss X9i", "Canon EOS Rebel T7i"], - "Minolta Dynax 5D": ["Minolta Maxxum 5D", "Minolta Alpha 5D"], + "Minolta Dynax 5D": ["Minolta Maxxum 5D", "Minolta Alpha 5D", "Minolta Alpha Sweet"], "Minolta Dynax 7D": ["Minolta Maxxum 7D", "Minolta Alpha 7D"], "Panasonic DC-FZ82": ["Panasonic DMC-FZ80", "Panasonic DMC-FZ85"], From 68fc4367b82c0133e4d1d6aa38bf320cb8971c38 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 12 Apr 2018 10:11:44 +0200 Subject: [PATCH 5/6] Updated camera model aliases, #4502 --- rtdata/dcpprofiles/camera_model_aliases.json | 30 ++++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/rtdata/dcpprofiles/camera_model_aliases.json b/rtdata/dcpprofiles/camera_model_aliases.json index bc07e3af1..34931541a 100644 --- a/rtdata/dcpprofiles/camera_model_aliases.json +++ b/rtdata/dcpprofiles/camera_model_aliases.json @@ -1,24 +1,24 @@ { - "Canon EOS 1000D": ["Canon EOS Kiss Digital F", "Canon EOS Digital Rebel XS"], - "Canon EOS 100D": ["Canon EOS Kiss X7", "Canon EOS Rebel SL1"], - "Canon EOS 1200D": ["Canon EOS Kiss X70", "Canon EOS Rebel T5"], - "Canon EOS 1300D": ["Canon EOS Kiss X80", "Canon EOS Rebel T6"], + "Canon EOS 100D": ["Canon EOS Kiss X7", "Canon EOS REBEL SL1"], "Canon EOS 200D": ["Canon EOS Kiss X9", "Canon EOS Rebel SL2"], "Canon EOS 300D": ["Canon EOS Kiss Digital", "Canon EOS Digital Rebel"], - "Canon EOS 350D": ["Canon EOS Kiss Digital N", "Canon EOS Digital Rebel XT"], - "Canon EOS 400D": ["Canon EOS Kiss Digital X", "Canon EOS Digital Rebel XTi"], - "Canon EOS 450D": ["Canon EOS Kiss Digital X2", "Canon EOS Kiss X2", "Canon EOS Digital Rebel XSi"], - "Canon EOS 500D": ["Canon EOS Kiss X3", "Canon EOS Rebel T1i"], - "Canon EOS 550D": ["Canon EOS Kiss X4", "Canon EOS Rebel T2i"], - "Canon EOS 600D": ["Canon EOS Kiss X5", "Canon EOS Rebel T3i"], - "Canon EOS 650D": ["Canon EOS Kiss X6i", "Canon EOS Rebel T4i"], - "Canon EOS 700D": ["Canon EOS Kiss X7i", "Canon EOS Rebel T5i"], + "Canon EOS 350D": ["Canon EOS 350D DIGITAL", "Canon EOS Kiss Digital N", "Canon EOS DIGITAL REBEL XT"], + "Canon EOS 400D": ["Canon EOS 400D DIGITAL", "Canon EOS Kiss Digital X", "Canon EOS DIGITAL REBEL XTi"], + "Canon EOS 450D": ["Canon EOS Kiss Digital X2", "Canon EOS Kiss X2", "Canon EOS DIGITAL REBEL XSi"], + "Canon EOS 500D": ["Canon EOS Kiss X3", "Canon EOS REBEL T1i"], + "Canon EOS 550D": ["Canon EOS Kiss X4", "Canon EOS REBEL T2i"], + "Canon EOS 600D": ["Canon EOS Kiss X5", "Canon EOS REBEL T3i"], + "Canon EOS 650D": ["Canon EOS Kiss X6i", "Canon EOS REBEL T4i"], + "Canon EOS 700D": ["Canon EOS Kiss X7i", "Canon EOS REBEL T5i"], "Canon EOS 750D": ["Canon EOS Kiss X8i", "Canon EOS Rebel T6i"], "Canon EOS 760D": ["Canon EOS 8000D", "Canon EOS Rebel T6s"], "Canon EOS 800D": ["Canon EOS Kiss X9i", "Canon EOS Rebel T7i"], + "Canon EOS 1000D": ["Canon EOS Kiss Digital F", "Canon EOS DIGITAL REBEL XS"], + "Canon EOS 1200D": ["Canon EOS Kiss X70", "Canon EOS REBEL T5"], + "Canon EOS 1300D": ["Canon EOS Kiss X80", "Canon EOS Rebel T6"], - "Minolta Dynax 5D": ["Minolta Maxxum 5D", "Minolta Alpha 5D", "Minolta Alpha Sweet"], - "Minolta Dynax 7D": ["Minolta Maxxum 7D", "Minolta Alpha 7D"], + "MINOLTA DYNAX 5D": ["Minolta Maxxum 5D", "Minolta Alpha 5D", "Minolta Alpha Sweet"], + "MINOLTA DYNAX 7D": ["Minolta Maxxum 7D", "Minolta Alpha 7D"], "Panasonic DC-FZ82": ["Panasonic DMC-FZ80", "Panasonic DMC-FZ85"], "Panasonic DC-TZ90": ["Panasonic DC-ZS70", "Panasonic DC-FZ91", "Panasonic DC-FZ92", "Panasonic DC-FZ93"], @@ -27,4 +27,4 @@ "Panasonic DC-TZ100": ["Panasonic DC-ZS100", "Panasonic DC-ZS110", "Panasonic DC-TZ101", "Panasonic DC-TZ110"], "Panasonic DMC-TZ71": ["Panasonic DMC-TZ70", "Panasonic DMC-ZS50"], "Panasonic DMC-TZ81": ["Panasonic DMC-TZ80", "Panasonic DMC-TZ85", "Panasonic DMC-ZS60"] -} +} \ No newline at end of file From e494aafa747c6a334b382b7894d0aa5ccf841f9c Mon Sep 17 00:00:00 2001 From: Floessie Date: Thu, 12 Apr 2018 11:25:01 +0200 Subject: [PATCH 6/6] Add newline at EOF --- rtdata/dcpprofiles/camera_model_aliases.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/dcpprofiles/camera_model_aliases.json b/rtdata/dcpprofiles/camera_model_aliases.json index 34931541a..66297a853 100644 --- a/rtdata/dcpprofiles/camera_model_aliases.json +++ b/rtdata/dcpprofiles/camera_model_aliases.json @@ -27,4 +27,4 @@ "Panasonic DC-TZ100": ["Panasonic DC-ZS100", "Panasonic DC-ZS110", "Panasonic DC-TZ101", "Panasonic DC-TZ110"], "Panasonic DMC-TZ71": ["Panasonic DMC-TZ70", "Panasonic DMC-ZS50"], "Panasonic DMC-TZ81": ["Panasonic DMC-TZ80", "Panasonic DMC-TZ85", "Panasonic DMC-ZS60"] -} \ No newline at end of file +}